Làm thế nào để bạn đọc mã của người khác? [đóng cửa]


23

Hầu hết mọi lập trình viên tiên tiến đều nói rằng việc đọc mã của các chuyên gia khác là rất hữu ích. Thông thường họ tư vấn nguồn mở.

Bạn có đọc nó hay không? Nếu bạn làm, tần suất và thủ tục đọc mã là gì? Ngoài ra, có một chút khó khăn cho người mới đối phó với SVN - một loạt các tệp. Giải pháp là gì?

Câu trả lời:


25

Bạn có đọc nó hay không?

Vâng.

Nếu bạn làm, tần suất

Hằng ngày. Không ngừng. Tôi làm việc với nhiều dự án nguồn mở (chủ yếu liên quan đến Python) và phải đọc nguồn vì đây là tài liệu chính xác nhất.

và thủ tục đọc mã là gì?

Ừm. Mở và đọc.

Ngoài ra, có một chút khó khăn cho người mới đối phó với SVN - một loạt các tệp. Giải pháp là gì?

Mở và đọc. Sau đó đọc thêm.

Nó không dẽ. Không có gì làm cho nó dễ dàng. Không có con đường Hoàng gia để hiểu. Nó làm việc


Cảm ơn bạn đã trả lời. Cách xác định liệu mã là tốt hay không? Bởi vì không phải mọi dự án nguồn mở đều được thực hiện bởi các chuyên gia thực sự?
Serge

1
@Sergey: "Cách xác định mã có tốt hay không?" Đọc mã. "Tốt" là chủ quan. Nếu nó hữu ích, và bạn có thể hiểu nó, nó tốt. Nếu nó khó hiểu, hoặc không thực sự hoạt động, nó không tốt. Có rất nhiều, nhiều thuộc tính chất lượng: có thể duy trì, bảo mật, có thể thích ứng, hiệu suất cao, v.v., v.v., v.v., mã có thể tốt ở cái này và kém hơn cái khác.
S.Lott

7
Tôi không thể cưỡng lại: osnews.com/images/comics/wtfm.jpg
Gary Willoughby

@Sergey - ngay cả khi đó là mã tuyệt vời nhất từng được viết, nếu bạn không thể đọc nó (vì mức độ kinh nghiệm của bạn), nó sẽ không giúp ích gì cho bạn. Mặc dù bạn có thể thấy nó không phải là cách sử dụng tốt nhất thời gian của bạn, nhưng bạn sẽ tiếp xúc với mã được viết kém, vì vậy bạn cũng có thể tìm hiểu sự khác biệt. Giống như S.Lott đã nói, nó cần có công việc và thời gian.
JeffO

Trong khi tôi ngưỡng mộ những người có thể ngồi lại và đọc mã như họ đọc một cuốn tiểu thuyết, đôi lúc tôi thấy nó hơi tẻ nhạt. Tôi đã nhận ra rằng đối với tôi, 'đọc mã' không thực sự mô tả các hoạt động mà tôi thực hiện - một cụm từ tốt hơn cho những gì tôi làm là 'hiểu mã' và nó liên quan đến việc đọc tài liệu, bước qua trình gỡ lỗi và thậm chí đọc các bài kiểm tra. Tôi đã viết một bài viết dài về đọc mã - technikhil.wordpress.com/2010/07/06/how-to-read-code-a-primer
Nikhil

9

Có một vài lớp cho câu hỏi hóc búa mà bạn có. Đầu tiên, bắt đầu ở cấp độ cao, một cái nhìn mắt chim để nói. Khi bạn kiểm tra một dự án, sẽ có một loạt các tệp trong cấu trúc thư mục. Điều đó giống nhau cho dù bạn đang xem nguồn mở hay nguồn đóng (mã nguồn là mã nguồn). Vì vậy, bắt đầu với điều này:

  • Các tập tin nguồn được tổ chức như thế nào? Bạn có thể nói tên của tập tin hoặc tên của thư mục chứa những gì bạn có thể tìm thấy bên trong không? Chúng tôi lập trình viên có xu hướng thích tên dự đoán và cấu trúc logic. Bạn sẽ có thể có được một ý tưởng sơ bộ về nơi để xem xét một vấn đề cụ thể.
  • Bản chất của ứng dụng là gì, nó dựa trên web, dòng lệnh, GUI? Lý do điều này rất quan trọng là bạn muốn biết nơi bắt đầu truy tìm dấu vết thực thi. Nếu đó là web dựa trên bạn muốn bắt đầu với nơi ứng dụng bắt đầu xử lý yêu cầu. Nếu nó được xây dựng trên một khung, tất cả tốt hơn. Một khi bạn biết khung công tác, bạn thường có thể hiểu rõ về mã đang ở đó. Nếu không, bạn sẽ bắt đầu với điểm vào tương ứng cho ứng dụng dòng lệnh / GUI.
  • Lấy một tờ giấy và một cây bút chì, hoặc nếu bạn may mắn có một bảng trắng và bút đánh dấu khô. Đặt tên thành phần (hoặc sử dụng tên được cung cấp trong mã) và vẽ các đường giữa các hộp bằng mũi tên để bạn có thể thấy mọi thứ được xử lý. Ngoài ra, nếu bạn đang xem một thuật toán, hãy phác thảo các cấu trúc dữ liệu theo cách bạn có thể hiểu và phác thảo cách nó được thao tác.

Nó cần thực hành, nhưng nó chắc chắn là có thể làm được. Bạn càng biết nhiều về các thư viện và khung mà ứng dụng đang sử dụng, bạn càng biết cách mã cần được tổ chức và nơi để tìm câu trả lời cho các câu hỏi cụ thể. Một số mã khó theo dõi hơn một chút, đặc biệt nếu nó khá gián tiếp. Đó là lý do tại sao bạn cần bút chì và giấy. Cuối cùng, một bóng đèn tắt trong đầu bạn và bạn nhận được nó. Đó là khi đọc phần còn lại của mã có ý nghĩa hơn rất nhiều.


Một khía cạnh của việc đọc mã là trừu tượng. Những việc như tìm hiểu cách các nguồn được tổ chức chắc chắn sẽ trừu tượng hóa quá trình đọc mã.
David Gao

5

Nó không đọc giống như bạn đọc một cuốn tiểu thuyết, mà giống như cách bạn đọc một cuốn sách tham khảo. Một cách tốt là chọn một lỗi đã được sửa gần đây từ một thông báo kiểm tra, làm khác với những gì đã thay đổi và đọc các phần có liên quan cho đến khi bạn hiểu cả vấn đề và giải pháp. Các lỗ hổng bảo mật được công bố tốt là những lỗi thú vị để chọn vì có rất nhiều cuộc thảo luận về chúng trên các diễn đàn. Sau đó chọn một trong những lỗi "quả treo thấp" từ trình theo dõi lỗi và đọc cho đến khi bạn hiểu cách tự khắc phục. Hầu hết các chuyên gia đọc mã làm là ngẫu nhiên trong quá trình sửa lỗi hoặc thêm tính năng.

Thông thường các mẫu mã tốt nhất hầu như không đáng chú ý. Bạn sẽ ngay lập tức hiểu chúng mà không cần đọc qua chúng nhiều lần. Chúng làm cho nó trông giống như nó cực kỳ dễ viết, mặc dù mã tốt thường đi qua nhiều bản nháp. Nó tạo ra cảm giác nghịch lý rằng tất nhiên mã đã cho là cách rõ ràng để làm điều đó, mặc dù đó không phải là cách đầu tiên bạn nghĩ đến.

Khi bạn gặp mã như vậy, hãy cố gắng hiểu cái nhìn sâu sắc khi viết nó và các nguyên tắc thiết kế có liên quan, vì vậy khi bạn thấy mình trong một tình huống tương tự trong tương lai, bạn có thể hy vọng áp dụng các nguyên tắc tương tự.


4

Một mẹo tôi sử dụng khá thường xuyên khi đọc một số chức năng phức tạp, phân đoạn mã là bắt đầu tái cấu trúc nó thành một thứ dễ đọc hơn mà không thay đổi logic.


1
+1: Tôi cũng vậy. // Tôi đã từng có một ông chủ chú ý đến việc tái cấu trúc và buộc tội tôi lãng phí thời gian. Anh không thể hiểu được. Đúng là một kẻ ngốc.
Jim G.

2

Làm thế nào là phải đối phó với "một loạt các tập tin" khó? Nó không khác với khi bạn viết mã của riêng mình, ngoại trừ bạn không có kiến ​​thức trước về tổ chức của nó trừ khi nó được ghi lại.

Nếu bạn, với tư cách là một lập trình viên được yêu cầu, không thể tìm ra cấu trúc dự án từ "một loạt các tệp" hoặc đó là một dự án được tổ chức cực kỳ kém hoặc bạn là một lập trình viên không chuyên nghiệp (hoặc, trong trường hợp cực đoan, cả hai).

Bắt đầu đọc, cố gắng tìm một số điểm vào hoặc các lớp / phương thức trục chính cần thiết và xây dựng sự hiểu biết về cách tất cả kết hợp với nhau từ đó. Sẽ không ngay lập tức, sẽ mất thời gian, nhưng có thể được thực hiện ngay cả khi không có tài liệu nào cả.


3
"Sẽ mất thời gian" để "xây dựng sự hiểu biết" gần như là định nghĩa của "khó". Chỉ vì đó là một khó khăn mà chúng tôi dự kiến ​​sẽ giải quyết mỗi ngày không làm cho nó bớt khó khăn hơn. "Tôi thực hiện thay đổi này ở đâu?" là một câu hỏi phổ biến ngay cả trong số các chuyên gia. Ngoài ra, kiểm soát nguồn và xử lý các cơ sở mã lớn là một trong những lỗ hổng lớn trong giáo dục đại học. Tôi nghĩ rằng tôi đã thực hiện một hoặc hai dự án ở trường đại học yêu cầu nhiều hơn một tệp nguồn và chúng chỉ có tối đa khoảng 10 tệp.
Karl Bielefeldt

0

Điều tốt nhất bạn có thể hy vọng khi đọc mã của dự án khác, đó là API hoặc phần mềm là các biến, hàm và tên macro không được viết tắt một cách mơ hồ hoặc được đặt tên để bạn có thể tìm ra ý định của chúng.

Nhưng khác với điều đó, cần một lượng kiến ​​thức phong phú trải đều trên ngôn ngữ, kỹ thuật lập trình và cả về mục đích của chính mã để có thể đi sâu vào mã phức tạp.

Hiện tại tôi đang cố gắng xem Lua thực hiện một số điều kỳ diệu như thế nào , nhưng tôi đang đi đến điểm phía trên nơi có rất nhiều số nhận dạng được đặt tên một cách mơ hồ và được viết tắt đến mức tôi không thể tìm ra dòng nào đang thử để thực hiện điều mà tôi biết phải được thực hiện tại một số điểm trong mã chức năng ... Các biến đơn lẻ thường gặp và các tên hàm / macro được viết tắt khá phổ biến đang làm tôi suy nghĩ.


0

Sau khi xem "Đầu tiên, hãy bắt đầu ở cấp độ cao, chế độ xem mắt chim" khi @Berin Loritsch có đường, bạn có thể tìm kiếm những điều không mong muốn và / hoặc integrationtests nếu có.

unittests là thú vị để xem làm thế nào (api-) chi tiết hoạt động.

integrationtest thường cung cấp một cái nhìn tổng quan tốt về các quy trình busines.

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.