Làm thế nào để bạn mã hóa một cái gì đó khi bạn không biết làm thế nào nó thực sự hoạt động? [đóng cửa]


14

Gần đây tôi đã học C và muốn bắt đầu một dự án để củng cố kiến ​​thức của mình. Tôi đã quyết định làm một trình soạn thảo văn bản rất đơn giản, giống như vim. Vấn đề tôi gặp phải là tôi thực sự không biết làm thế nào một trình soạn thảo văn bản thậm chí hoạt động và tôi không biết phải tìm kiếm google để tìm hiểu về nó.

Googling về nó đã dẫn đến repo GitHub của vim, điều này là vô ích đối với tôi bởi vì cơ sở mã là rất lớn và mã đang làm tôi bối rối. Tôi cũng tìm thấy các hướng dẫn để tạo một trình soạn thảo văn bản trong C có chức năng giống như vim.

Mặc dù tôi nghĩ về việc làm theo các hướng dẫn, nó cảm thấy như gian lận. Làm thế nào mà các nhà phát triển vim tìm ra cách mã hóa vim mà không có hướng dẫn cụ thể? Hay họ đã bắt đầu từ các trình soạn thảo văn bản đơn giản hơn? Làm thế nào mà họ tìm ra điều đó chỉ từ kiến ​​thức về ngôn ngữ và tài liệu của họ?

Chính xác thì tôi cần gì để bắt đầu viết trình soạn thảo văn bản này mà không cần trực tiếp làm theo hướng dẫn? Một ví dụ khác tôi muốn nghĩ đến là: Dennis Ritchie và Ken Thompson đã mã hóa Unix như thế nào? Tôi có một ý tưởng về cách thức hoạt động của hệ điều hành, nhưng tôi không biết làm thế nào để đưa nó vào mã. Tôi đang thiếu cái gì vậy? Làm thế nào để tôi chuyển kiến ​​thức về ngôn ngữ này vào sử dụng thực tế, thực tế?


14
Bạn đang so sánh bản thân với các dự án có lịch sử lâu dài và những người đặc biệt. Unix bắt nguồn từ một nhóm nghiên cứu có nhiều năm kinh nghiệm về lập trình cấp hệ thống và được hưởng lợi từ kinh nghiệm với HĐH Multics phức tạp hơn. Vim dựa trên vi dựa trên ed. Những chương trình này không đột nhiên xuất hiện, chúng là một sự tiến hóa, được xây dựng bởi hàng trăm người. Vì vậy, đừng nản lòng khi bạn cảm thấy khó bỏ qua tất cả lịch sử đó. Không ai có thể. Thay vào đó, hãy cố gắng thực hiện các dự án nằm ngoài tầm hiểu biết của bạn - chỉ trong tầm tay bạn, nhưng vẫn đầy thách thức.
amon

8
Bạn vừa mới học chơi một số giai điệu trên xylophone, và bây giờ bạn muốn chơi trong một dàn nhạc quốc tế lớn? Thôi nào, bạn đang mong đợi quá nhiều. Lập trình giống như chơi một nhạc cụ - bạn bắt đầu với những giai điệu nhỏ, đơn giản và sau vài năm luyện tập, bạn học chơi một bản giao hưởng.
Doc Brown

3
Đã đồng ý. Hãy coi đó là cơ hội để bạn học được điều gì đó mà nhiều người mới bắt đầu học một cách khó khăn. Bắt đầu ít thôi . Và cũng đọc mã của vim. Bạn có thể học được rất nhiều đọc mã hiện có.
LAIV

17
Vấn đề cơ bản của bạn là thiếu rõ ràng trong suy nghĩ của bạn. Bạn nói "một trình soạn thảo văn bản nhỏ đơn giản như vim", và sau đó ngay lập tức theo dõi nó bằng cách lưu ý rằng cơ sở mã của nó rất lớn và khó hiểu. Đây sẽ là một tín hiệu mạnh mẽ cho bạn rằng không có gì giống với vim là đơn giản . Ngay cả các lập trình viên giàu kinh nghiệm cũng rơi vào cái bẫy tinh thần mà bạn đã rơi vào. Những điều bạn chưa hiểu là không đơn giản . Chúng phức tạp . Lập trình máy tính đang biến logic tinh thần thành hiện thực; bắt đầu bằng cách suy nghĩ rõ ràng hơn về lập trình.
Eric Lippert

4
Ngoài ra, ngừng lo lắng về "gian lận". Đây không phải là một trò chơi. Bạn có mục tiêu, và chúng là mục tiêu tốt. Làm những gì bạn cần làm để đạt được những mục tiêu đó . Bạn nghĩ rằng các lập trình viên máy tính chuyên nghiệp không nhìn vào nguồn khi họ muốn tìm hiểu cách thức hoạt động của một cái gì đó? Học cách học từ nguồn bạn không viết là một trong những kỹ năng lập trình quan trọng nhất, vì vậy hãy bắt đầu thực hành nó.
Eric Lippert

Câu trả lời:


17

Nếu đây là dự án lập trình đầu tiên của bạn, ngay cả một trình soạn thảo văn bản đơn giản cũng có thể quá phức tạp. Một cái gì đó như vim hoặc một hệ điều hành hoàn toàn không có vấn đề.

Tiếp cận vấn đề

Nhìn chung, cách để bắt đầu gần như tương tự đối với hầu hết các dự án, mặc dù:

  • Bạn thu thập yêu cầu của bạn. Có gì chính xác phần mềm sẽ làm gì?
  • Bạn bắt đầu với rất ít yêu cầu và sau đó thêm chức năng từng chút một.
  • Bạn phân tách các vấn đề được đặt ra bởi các yêu cầu hiện tại của bạn thành các vấn đề phụ.
  • Bạn tiếp tục phân tách các vấn đề phụ của mình cho đến khi bạn có điều gì đó bạn biết cách thực hiện.

Thí dụ

Hãy lấy ví dụ về trình soạn thảo văn bản.

  • Bạn muốn hiển thị một phần của tệp văn bản trên màn hình, chèn và xóa các ký tự và lưu phiên bản hiện tại.

  • Bắt đầu chỉ với việc đọc một tập tin và hiển thị nội dung của nó.

  • Bạn sẽ xác định (trong số những người khác) các vấn đề phụ sau:

    • Làm thế nào để tôi biết tên tập tin để hiển thị?
    • Cho một tên tệp, làm thế nào để tôi có được nội dung tập tin?
    • Đưa ra nội dung của tệp, làm cách nào để hiển thị chúng?

Khi bạn đạt đến điểm mà yêu cầu của bạn (tải tệp & hiển thị nó) được hoàn thành, bạn có thể bắt đầu xem xét cách chỉ hiển thị một phần sẽ phù hợp với màn hình, điều hướng trong tệp của bạn, v.v.

Bước tiếp theo

Theo thời gian, khi bạn tiếp nhận những vấn đề ngày càng phức tạp hơn, bạn sẽ nhận ra rằng ngày càng khó tìm ra những cách phù hợp để phân tách vấn đề của mình. Bạn cũng sẽ nhận thấy rằng việc thay đổi mã có thể trở nên tẻ nhạt theo thời gian.

Tại thời điểm đó, đã đến lúc tìm hiểu một số khái niệm thiết kế và kiến ​​trúc cơ bản.


Này người đàn ông cảm ơn vì lời khuyên! Tôi nghĩ rằng tôi sẽ thực hiện phương pháp này. Tôi hơi bướng bỉnh khi thay đổi suy nghĩ, nhưng từ những gì bạn đề xuất, tôi nghĩ tôi sẽ thử xem làm thế nào để xem trình xem. Cũng có thể thêm một cách để hiển thị siêu dữ liệu tệp một cách nào đó? Tôi có thể tự mình tìm ra điều đó. Cảm ơn rất nhiều!
Faithlesss

2
Để thêm vào điều này, "làm thế nào để tôi hiển thị chúng" có thể được chia nhỏ hơn nữa để viết một ký tự cụ thể đến một vị trí cụ thể trên màn hình (nếu chúng ta đang nói về một trình soạn thảo dòng lệnh), đó là điều mà một người có thể dễ dàng tìm thấy một câu trả lời cho trực tuyến.
Dukeling

2
"ngay cả một trình soạn thảo văn bản đơn giản cũng có thể quá phức tạp" các trình soạn thảo văn bản phức tạp một cách đáng ngạc nhiên. Hãy tưởng tượng chỉnh sửa một tệp 20 MB. Đủ lớn để yêu cầu bộ đệm, nhưng không đủ lớn để đánh thuế vào một máy tính hiện đại. Bạn cần có khả năng cuộn qua nó, chèn và xóa văn bản, để văn bản tự sắp xếp lại theo thời gian thực, cập nhật điểm đánh dấu thanh cuộn trong thời gian thực khi mô hình đằng sau nó thay đổi. Nếu bạn có bất kỳ loại định dạng, điều này thậm chí còn phức tạp hơn.

15

Bạn không.

Nếu bạn thậm chí không có một ý tưởng mơ hồ làm thế nào để làm một cái gì đó, đó là một dấu hiệu cho thấy nó vượt quá các kỹ năng hiện tại của bạn. Bởi vì nếu bạn không biết làm thế nào để bắt đầu, bạn chắc chắn sẽ không có ý tưởng nào khi nói đến phần khó nhất của ứng dụng.


Điều gì sẽ là một dự án tốt để bắt đầu sau đó? Tôi đã thực hiện trò chơi treo cổ của riêng mình (trong nhà ga), cũng như trò chơi tic tac toe. Tôi chỉ không thấy một cách để tiếp tục vì vậy tôi nghĩ rằng một trình soạn thảo văn bản sẽ là một ý tưởng tốt.
Vô tín

3
@faithlesss - một cái gì đó đọc và ghi tệp có vẻ như là một bước trung gian cơ bản.
Telastyn

9
Một tập tin xem có thể là một dự án tốt sau đó, ví dụ như một máy nhắn tin như less, morehoặc viewcác chương trình. Họ chia sẻ một số khía cạnh của các biên tập viên, mà không có sự phức tạp của các bộ đệm chỉnh sửa có thể thay đổi.
amon

@Telastyn Tôi có bạn. Sau đó, Gonna nhìn vào việc tạo một trình xem tệp, có lẽ là một trình đơn giản có thể đọc các định dạng văn bản cơ bản, sau đó chuyển sang tìm cách đọc một cái gì đó như, có thể là tệp json hoặc tệp csv? Không nên khó phân tích nó, chỉ cần thực sự nhìn vào tài liệu chuỗi.h tôi đoán. Cảm ơn vì lời khuyên!
Vô tín

2
@Faithlesss Cũng có một cái nhìn về các tính năng của trình chỉnh sửa dòng , tiền thân của các chương trình soạn thảo văn bản
Bergi

2

Bạn cần phải quyết định cách bạn muốn trình soạn thảo văn bản của bạn hoạt động.

Đây là một trong những kinh nghiệm bổ ích và bổ ích nhất trong việc phát triển các dự án của riêng bạn từ đầu đến cuối. Không ai gửi cho bạn yêu cầu để xây dựng từ. Bạn cần phát triển các yêu cầu của riêng bạn.

Điều này có nghĩa là bạn sẽ cần phải thực hiện rất nhiều công việc thiết kế trước khi bạn viết dòng mã đầu tiên. Bạn sẽ cần phải quyết định giao diện trông như thế nào. Bạn sẽ cần phải quyết định những chức năng bao gồm. Cả hai câu hỏi trên sẽ được hướng dẫn bởi những gì bạn cảm thấy có khả năng làm. Nếu bạn nghĩ đến tình huống "lý tưởng" (bạn muốn giao diện hoạt động như thế nào), nhưng bạn không cảm thấy có khả năng mã hóa nó, thì bạn cần bắt đầu xem xét các phương pháp thay thế: Làm thế nào tôi có thể làm cho nó hoạt động? Điều đó giúp tập trung bạn vào các phương pháp mã hóa mà bạn có thể muốn tìm hiểu thêm.

Như những người khác đã nói, cố gắng sao chép vim có thể không phải là cách tiếp cận tốt nhất vì nó là một cơ sở mã lớn và phức tạp. Bạn cũng đang từ chối chính mình công việc thiết kế, theo ý kiến ​​khiêm tốn của tôi, giúp làm tròn vai trò của bạn như một nhà phát triển.

Điều này không có nghĩa là bạn sẽ cần phải thiết kế toàn bộ ứng dụng từ đầu đến cuối trước khi bạn viết dòng mã đầu tiên. Bạn có thể yêu cầu thay đổi theo thời gian khi bạn tìm hiểu thêm. Bạn có thể thêm các tính năng mới mà bạn không nghĩ đến cho đến khi bạn thử nghiệm / sử dụng ứng dụng của riêng bạn và bạn nghĩ, "Sẽ không hay nếu ..." Bắt đầu đơn giản.


1

Viết một trình soạn thảo văn bản đầy đủ tính năng từ đầu mà không có kinh nghiệm lập trình là điều ngu ngốc: Bạn sẽ nản lòng và từ bỏ nó trước khi học hỏi nhiều.

Một số lựa chọn thay thế đến với tâm trí:

  • Nghiên cứu mã của một số sản phẩm bạn quen thuộc. Nếu bạn thành thạo vim, hãy xem qua và cố gắng hiểu một cái gì đó nhỏ và tách biệt, như cách nó thể hiện dữ liệu hoặc tìm kiếm một ký tự ( flệnh).
  • Nghiên cứu mã của một chương trình rất đơn giản và làm việc theo cách của bạn từ đó: catlệnh sau wcđó grepsau đó là sedví dụ.
  • Cố gắng viết một chương trình chỉ có một tính năng duy nhất của trình soạn thảo. Có thể xóa ký tự thứ hai trong mỗi dòng của tệp (không ghi lại) hoặc chỉ hiển thị các dòng từ 50 đến 70 của tệp.

1
Không biết một chút về các mô hình phổ biến, tôi nghĩ rằng việc hiểu ngay cả một phần nhỏ của một dự án lớn như vim sẽ là vô ích. Tuy nhiên, nhìn vào các dự án nguồn mở rất nhỏ là một ý tưởng tốt. Tôi sẽ nói thêm rằng cố gắng thực hiện một thay đổi được nhắm mục tiêu cho một chương trình như vậy sẽ là một cách tuyệt vời để học hỏi. Ưu điểm: bạn sẽ tìm hiểu một số mẫu được sử dụng trong các chương trình trong thế giới thực. Nhược điểm: bạn cũng có thể học một mô hình chống.
doubleYou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.