Làm thế nào để đọc hàng ngàn dòng mã mà không cần bất kỳ tài liệu nào? [đóng cửa]


12

Trước đây tôi đã tìm kiếm một điều khiển TimeLine tốt cho một dự án WPF. Tôi đã tìm thấy một câu trả lời trong Đây hướng dẫn tôi đến dự án CodePlex này .

Bây giờ tôi muốn thay đổi mã để đáp ứng nhu cầu văn hóa của tôi. Nhưng có một số không phù hợp!

Câu hỏi của tôi là:

Làm thế nào bạn tương tác với hàng ngàn dòng mã như vậy?

BIÊN TẬP:

Bất kỳ phím tắt sẽ là tuyệt vời!


3
yêu cầu tăng lương. nó luôn luôn giúp (họ có thể tạo động lực cho việc này)
Tên hiển thị

2
đập đầu vào bàn làm việc cho đến khi tất cả trở nên rõ ràng.
sứa biển

19
Làm thế nào để bạn ăn một con voi? ... Một lần cắn.
Bill

1
@Jalal Đó là những gì họ muốn bạn nghĩ.
Mateen Ulhaq

2
@DisplayName, cách tiếp cận động lực của cà rốt và cây gậy đã được chứng minh là một giải pháp kém cho bất kỳ công việc nào đòi hỏi kỹ năng nhận thức thô sơ. Khoa học về động lực phức tạp hơn hệ thống khen thưởng. Hãy xem 'Drive: Sự thật đáng ngạc nhiên về những gì thúc đẩy chúng tôi' của Dan Pink, đó là một bài đọc đáng kinh ngạc. Hoặc xem video này bạn xem video cho phiên bản cô đọng. youtube.com/watch?v=u6XAPnuFjJc
Ryan Taylor

Câu trả lời:


37

Bạn thêm ý kiến ​​vào mã nguồn khi bạn đã hiểu nó đủ để có thể làm như vậy. Tái cấu trúc những bình luận này một cách mạnh mẽ khi bạn hiểu ngày càng nhiều.


3
+1 và một cách tốt là thực sự viết tài liệu khi bạn duyệt mã nguồn. Và tại sao để gửi đóng góp của bạn trở lại cho các điều phối viên op?

1
+1 Ngoài ra, nếu bạn sửa đổi mã, hãy chắc chắn rằng bạn cũng thay đổi nhận xét của mình để các tương lai không bị nhầm lẫn với những gì bạn đã làm. Hãy xấu hổ khi làm tất cả những tài liệu đó và khiến mọi người ghét nó vì nó sai!
Michael K

1
Nếu dự án ban đầu nằm trong một hệ thống kiểm soát nguồn phân tán (như git), sẽ có lợi cho việc phân nhánh nó, thực hiện các thay đổi của bạn dần dần và thực hiện theo cách để bạn có thể tùy ý hợp nhất các thay đổi của mình trở lại với bản gốc

8
  1. Bước qua mã
  2. Đổi tên khi cần
  3. Tái cấu trúc khi cần thiết
  4. Lặp lại cho đến khi bạn hoàn toàn hiểu

... Và mã sẽ cảm ơn bạn vì điều đó. ;-)


7
Thay đổi vị trí ngẫu nhiên trong mã sản xuất chỉ vì nó dễ dàng hơn, không phải là một ý tưởng hay. Chỉ các yêu cầu tính năng mới gây ra sửa đổi mã, bao thanh toán lại là một yêu cầu tính năng. Cho dù bạn giỏi đến đâu, phá vỡ mã, đôi khi tác dụng phụ ngu ngốc là điều khách hàng tin tưởng. Mã chỉ tái cấu trúc bạn rất chắc chắn. Và hãy nhớ rằng, ngay cả các bài kiểm tra đơn vị cũng không đảm bảo bất cứ điều gì.
Coder

Đồng ý, nhưng tái cấu trúc chỉ để thử một thiết kế có thể giúp bạn hiểu lý do tại sao mã được viết theo cách của nó (hoặc xác nhận rằng bạn đã đúng rằng nó được thực hiện kém / kỳ quặc). Bạn không cần phải giữ những thay đổi đó.
Ricky Clarkson

Mã hóa +1. Và câu trả lời này hiện tại thậm chí không đề cập đến các bài kiểm tra đơn vị. Đáng sợ.
MarkJ

Xin lỗi, không có nghĩa là tái cấu trúc lớn. Đã nói nhiều hơn về tái cấu trúc nhỏ, công cụ dọn dẹp. Vì vậy, cuối cùng, bạn đi đến điểm rằng mục đích của mã là rõ ràng.
John MacIntyre

5

Thực hiện một hành động, gỡ lỗi (lặp đi lặp lại) mã để tìm cách thực hiện hành động đó. Viết cùng một ngôn ngữ đơn giản để hiểu rõ hơn!


Tôi thường làm điều này cho đến khi tôi phải đối mặt với một dự án không thể chạy trong chế độ gỡ lỗi! Nó luôn luôn sụp đổ trong quá trình khởi động! :( Nhưng nó chạy tốt trong Chế độ phát hành: S
Afriza N. Arief

@afriza CÁI GÌ. Đó là một số mã xấu nghiêm trọng, kiểm tra những lỗi nó cung cấp cho bạn.
Daniel S

@afriza, điều đầu tiên cần sửa!

4

Một cái gì đó mà Joel Spolsky đã viết cách trở lại khi trên blog của anh ấy (không thể tìm thấy bài báo bây giờ) thực sự mắc kẹt với tôi về điều này:

Ông nói làm thế nào mã không phải là ngôn ngữ tự nhiên của con người, nhưng là lập trình viên, chúng ta dễ dàng nghĩ rằng đó là và chúng ta có thể đọc nó như vậy. Do đó, rất nhiều người trong chúng ta nhìn vào mã mới và mong đợi có thể chỉ "đọc nó" và hiểu nó ngay lập tức, như thể đó là một khối văn bản bằng tiếng Anh.

Vì vậy, tôi nghĩ rằng chìa khóa là về cơ bản chỉ là chậm, có phương pháp và khoa học. Và như những người khác đã nói - bình luận nó (và thậm chí là refactor) khi bạn đi. Đừng rơi vào suy nghĩ "Tôi chỉ nên nhìn vào nó và hiểu ngay lập tức".

Ồ, và vâng, đôi khi tôi vẫn rơi vào cái bẫy này. "Làm như tôi nói, không phải như tôi làm", và tất cả những thứ đó. :)


Thực tế là, văn bản tiếng Anh mà bạn có thể "chỉ đọc" thường là tuyến tính, lý do tại sao mã thường khó tiêu hóa lúc đầu thường là vì nó không tuyến tính và thủ thuật chỉ là phá vỡ nó. Rất nhiều thành ngữ triển khai khác nhau mà các nhà phát triển sử dụng thường không giúp được gì, nhưng giai đoạn đầu tiên thường là chạy mã thông qua trình gỡ lỗi và sử dụng các điểm dừng để xem những gì. Cố gắng chỉ đọc nó là một bài tập khá vô nghĩa. Nghiêm túc mà nói, lần cuối bạn đọc mã bạn đã viết là khi nào? (bắt đầu kết thúc đó là.)
ocodo

Trên thực tế, mã được viết tốt rất dễ đọc, nhưng không phải là một văn bản. Bạn chỉ cần quét qua để xem các khối xây dựng và hiểu cấu trúc cốt lõi, không cần phải đọc tất cả mọi thứ. Các cách tiếp cận mã hóa xấu, như mã skool cũ, hoặc lạm dụng RẮN và các mẫu có thể làm cho nhiệm vụ này rất khó khăn.
Coder

4

SE-Radio đã phỏng vấn Dave Thomas về chính chủ đề này

Tập podcast này có nhiều mẹo và kỹ thuật để vào "văn hóa" của dự án và hiểu cách cư dân ban đầu sống.


Phần thú vị về kinh nghiệm của Dave Thomas là tài liệu đó - vượt ra ngoài tổng quan cấp cao - là (gần như) không có ngoại lệ tồi tệ hơn không có tài liệu nào cả. (Theo kinh nghiệm của tôi đó là bởi vì hầu hết các tài liệu là soạn sẵn cho một sự hiểu biết bề mặt cấp của “cái gì” hoặc “làm thế nào”, mà lúc nào cũng được sau đó còn lại để trở thành trong ngày, đến mức bị lừa dối.)
Michael Kropat

2

Tôi đã phải làm điều này gần đây với một dự án hơn 100.000 LỘC. Ý tưởng đầu tiên của tôi là dễ dàng nhìn thấy các mẫu từ biểu đồ 100 hoặc thậm chí 1000 nút hơn từ 100.000 dòng văn bản.

Vì vậy, tôi đã dành 45 phút và viết một chương trình Python ngắn (<100LOC) để phân tích những gì tôi cần từ nó và vẽ các mối quan hệ đối tượng. Tôi đã tạo nguồn Graphviz , một ngôn ngữ thực sự dễ tạo. (Không có gì đặc biệt về Python ở đây: Ruby hoặc C # hoặc Common Lisp hoặc bất cứ điều gì cũng có thể làm điều đó.)

Trong các dự án khác, tôi đã thấy mọi người sử dụng Graphviz cho các phụ thuộc mô-đun, biểu đồ cuộc gọi, lịch sử phiên bản, tất cả các loại. Công cụ meta trực quan hóa chương trình lớn nhất từ ​​trước đến nay.

(Có thể đó là vì tôi mất biên dịch , nhưng tôi thấy nó lạ rằng khi một lập trình viên đang phải đối mặt với một vấn đề, câu trả lời dường như lúc nào cũng được, trừ khi vấn đề liên quan đến mã nguồn để một chương trình "viết một chương trình!". - )


1

Bước qua nó trong trình gỡ lỗi khi nó chạy, đây là cách duy nhất để hiểu một cơ sở mã mới, lớn.


2
Đó không phải là một lựa chọn thực tế khi bạn có hàng ngàn dòng mã (đặc biệt khi chúng ta đang nói về hàng chục hoặc hàng trăm KLOC) và / hoặc nếu một phần của mã đó nằm trong các mẫu. Để hiểu rõ hơn về một cơ sở mã mới (và tài liệu kém), người ta cũng phải tham gia vào doanh nghiệp và cố gắng hiểu bối cảnh mà mã được cho là chạy. Nếu bạn có thể đi qua các mã với một trình gỡ lỗi và nhận được một sự hiểu biết về nó, đó là cơ sở mã là không phải là lớn để bắt đầu với (làm cho việc sử dụng một trình gỡ lỗi chứ không phải không cần thiết trong hầu hết các trường hợp.)
luis.espinal

Khốn kiếp nếu cơ sở mã quá lớn để gỡ lỗi trong trình gỡ lỗi. Việc xem mã phản ứng với đầu vào và đầu ra đã biết sẽ giúp chuyển đổi kiến ​​thức về "cái gì" thành "làm thế nào". Câu hỏi "tại sao" không bao giờ là câu hỏi có thể được trả lời chỉ với trình gỡ lỗi, nhưng có thể có các nhận xét nguồn nội tuyến mà bạn có thể thấy trong IDE khi bạn gỡ lỗi.
grrussel

@grrussel Tôi phải không đồng ý vì đó không phải là điều tôi làm ... Tôi không biết liệu tôi có đại diện hay không! Tôi có thể sắp xếp sử dụng điểm dừng lẻ (nhưng vẫn không rõ ràng bước qua) và tôi sử dụng các tính năng IDE để cho phép tôi liên kết phần này với phần khác.
Murph

1

Hiểu rằng thực sự không có phím tắt để mò mẫm đầy đủ. (Và nếu bạn gặp rắc rối với cụm từ đó, giáo dục của bạn đã bị lãng quên. Đó là từ "Stranger In a Strange Land", của Robert A. Heinlein.)

Đọc nó, một trang tại một thời điểm, một thói quen tại một thời điểm. Thêm ý kiến. Vẽ hình ảnh của các cấu trúc dữ liệu chính. Nhận biết các thuật toán. Rút ra kiến ​​thức trước đó.

Chống lại sự cám dỗ để quây lại trình gỡ lỗi. Khung nhìn của trình gỡ lỗi quá nhỏ: bạn nhìn thấy một dòng tại một thời điểm, nhưng bạn thực sự không thấy nơi bạn đã đến hoặc nơi bạn sẽ đến.


Trình gỡ lỗi giải thích một số quy ước các quy ước của người viết mã gốc về những gì được mong đợi bên trong các biến (ví dụ: Họ có mong đợi Full-Path hoặc tên tệp hoặc đường dẫn tương đối không?) Và nhiều thứ khác vì vậy theo quan điểm của tôi
Afriza N. Arief

2
-1 vì nghĩ rằng bạn thật tuyệt vì bạn sử dụng từ "grok"
Carson63000

1

Bất cứ điều gì bạn làm hãy viết càng nhiều càng tốt khi bạn đi cùng để không ai có thể kết thúc ở cùng một vị trí như bạn có.


1

bạn cần sử dụng manh mối. có được manh mối về những gì bạn phải tìm kiếm và sử dụng rộng rãi chức năng tìm kiếm của môi trường hoặc IDE có thể đưa bạn đến phần mã mong muốn mà bạn cần thay đổi.

đọc 14 nghìn dòng mã java không có nghĩa gì cả. Chức năng tìm kiếm là cứu tinh của bạn


0

Những người khác nhau có cách học khác nhau, vì vậy YMMV. Điều đầu tiên tôi làm trong tình huống này là đọc toàn bộ cơ sở mã thông qua ít nhất một lần. Điều đó cho tôi một ý tưởng chung về mọi thứ ở đâu. Sau đó, tôi chọn một phần để kiểm tra chi tiết hơn. Cấu trúc dữ liệu sẽ là một nơi tốt để bắt đầu. Khi tôi có một ý tưởng chung về những gì đang diễn ra, tôi cũng làm tương tự với một phần khác của mã tương tác với phần đầu tiên. Sau khi lặp đủ, tôi có ý thức tốt về cách mã hoạt động.


0

Cách tốt nhất, như với tất cả các chương trình không chỉ là những đoạn mã lớn không bị lỗi, là chia nó thành nhiều phần. Đây là cả hai điều bạn nên làm trong đầu cũng như trực quan trong mã. Điều này có thể có nghĩa là thêm các bình luận táo bạo lớn hoặc ngắt nhiều dòng. Điều này giúp trong khi cuộn qua nó để xem các mảnh. Cố gắng tìm các đoạn logic của mã.

Tất nhiên, khi bạn hiểu các bit, hãy nhận xét chúng về những gì bạn biết vào thời điểm đó, có thể ghi chú về những điều bạn không hiểu.

Tôi cũng khuyên bạn không nên cố gắng hiểu toàn bộ tác phẩm ngay từ đầu. Thay vào đó hãy cố gắng hiểu những phần mà bạn cần biết ngay bây giờ và làm việc với phần còn lại sau.


0

Tôi sẽ bắt đầu bằng cách sử dụng Trình chỉnh sửa Leo trong chế độ @shadow với việc sử dụng tích cực các nút nhân bản . Điều này cho phép một người thêm ghi chú và nhận xét cho từng phần mã đang nghiên cứu mà không thay đổi mã và các chú thích sẽ luôn ở trong ngữ cảnh, bên cạnh mã mà nó đang nói đến. Dưới đây là một ví dụ về quy trình làm việc của các tài liệu:

Ví dụ: khi tôi sửa một lỗi trong Leo, tôi tạo một nút thông thường để thể hiện lỗi. Nút lỗi này là quan điểm của tôi về tất cả dữ liệu trong mã nguồn của Leo liên quan đến lỗi. Khi tôi phát hiện ra mã liên quan đến lỗi, tôi đã sao chép các nút của chúng và di chuyển chúng dưới nút lỗi. Tôi cũng sẽ thêm các nút thông thường như là con của nút lỗi. Các nút này chứa báo cáo lỗi ban đầu, mô tả về cách tôi sửa lỗi, dữ liệu kiểm tra hoặc bất kỳ ghi chú nào khác mà tôi có thể muốn giữ.

Khi tôi đã tạo nút lỗi, tôi chỉ tập trung vào nút đó và các con của nó. Tôi có thể kiểm tra nút lỗi và các con của nó mà không cần phải nhảy xung quanh phác thảo. Tất cả mọi thứ tôi cần là ở một nơi. Khi tôi đi xung quanh để thực sự sửa lỗi, tôi có thể làm như vậy bằng cách thay đổi bản sao. Một lần nữa, tôi không phải nhảy xung quanh phác thảo. Không quan trọng toàn bộ phác thảo lớn hay phức tạp như thế nào: Tôi chỉ đang xử lý nút lỗi và các con của nó. Trọng tâm cực kỳ hẹp này giúp việc sửa lỗi dễ dàng hơn nhiều.


0

Vẽ sơ đồ của nguồn: các mối quan hệ dữ liệu, các mối quan hệ chức năng, các mối quan hệ đối tượng. Xác định tổng hợp, luồng dữ liệu và luồng mã. Hình ảnh tốt hơn nhiều so với ý kiến ​​cho điều này, và có thể được tách biệt khỏi mã.


0

Trước khi bạn tái cấu trúc bất cứ điều gì viết bài kiểm tra. Rất nhiều bài kiểm tra. Các thử nghiệm rất cụ thể đối với các khối mã nhỏ ít nhất có thể gọi được, vì nó sẽ phụ thuộc vào cách viết lộn xộn được kế thừa của bạn.

Lợi thế của việc viết bài kiểm tra để bắt đầu là bạn cần có một số loại hiểu biết về mã trước khi bạn có thể kiểm tra nó, vì vậy mọi bài kiểm tra bạn viết sẽ hy vọng sẽ có một chút kiến ​​thức thu được. Bạn cũng có thể bình luận nặng nề các bài kiểm tra với các giả định của bạn bên cạnh các xác nhận.

Bằng cách thử nghiệm trước, bạn sẽ không gặp rủi ro khi thay đổi thứ gì đó trong mã có hiệu ứng kích thích mà bạn không thể biết. Bạn cũng sẽ có một mạng lưới an toàn khi bạn đến để cấu trúc lại mã.


0

Tôi sử dụng các công cụ như doxygen, để tạo ra một sơ đồ lớp tổng thể, hơn là tôi hiểu thêm về những gì mỗi lớp làm.

Sau đó, tôi nhận một số lỗi dễ dàng từ hàng đợi lỗi (trước khi người quản lý của tôi gán một lỗi khó cho tôi: P), sau đó chạy qua chức năng đó vào trình gỡ lỗi và cố gắng tạo ra một luồng dữ liệu thô hoặc mô hình dòng mã.

Ví dụ chức năng xuất trong một số phần mềm: vì vậy tôi cố gắng hiểu cách đọc dữ liệu nguồn, từ đâu trong mã (giao diện cơ sở) tôi có thể đánh giá dữ liệu được đọc chính xác bằng cách sử dụng sơ đồ dòng và mã của tôi, lớp nào chịu trách nhiệm loại xuất khẩu nào, v.v ... Tôi nghĩ rằng một nửa sự hiểu biết đã được thực hiện, một khi bạn có sơ đồ lớp và biểu đồ dòng chảy.


0

Tiếp cận một khiếm khuyết tầm thường, ví dụ, một NullPulumException. Tránh bất cứ điều gì liên quan đến đồng thời lúc đầu, bất cứ điều gì mà bản chất của nó sẽ liên quan đến việc hiểu rất nhiều mã cùng một lúc.

Khi bạn đã sửa một vài lỗi, có thể bạn sẽ có một ý tưởng khá hay. Làm việc cho tôi, ở mức nào.


-2

Về cơ bản hành động để viết một mã sạch sẽ bắt đầu ngay từ thiết kế. Nếu chúng ta đang mã hóa bằng ngôn ngữ OOP với một UML, hãy chia sẻ với các đồng nghiệp và tin chắc rằng thiết kế không mơ hồ. Trong mọi trường hợp, chúng tôi các nhà phát triển nên tin chắc rằng thiết kế sẽ giải quyết vấn đề chứ không phải ambiguos.

Khi nói đến mã hóa, chúng ta phải đảm bảo rằng thiết kế đang được chuyển đổi thành mã, tức là một Thực thể thành một lớp hoặc cấu trúc, một hoạt động để hoạt động, v.v.

Và tôi đã xem qua một tờ giấy trắng http://queue.acm.org/detail.cfm?id=2063168 nói về phong cách mã hóa hoặc cách chúng ta có thể sử dụng không gian, thụt lề, biến thể phông chữ như hầu hết các IDE chúng ta có thể sử dụng để viết MUCH Mã SẠCH nơi con người chúng ta có thể hiểu nhiều như máy móc. Nó nhấn mạnh nhiều hơn vào việc viết mã nhận xét miễn phí để mã của chúng tôi sẽ xuất hiện dưới dạng các đoạn văn.

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.