Mục đích của Đánh giá mã là gì


76

Tôi đang trong quá trình cố gắng bán tổ chức của mình dựa trên giá trị của các đánh giá mã. Tôi đã làm việc tại một số nơi mà họ đã được tuyển dụng. Tôi đã thấy chúng được sử dụng để lựa chọn kiểu dáng, và các quyết định chức năng, và tôi đã thấy chúng được sử dụng như là một kiểm tra ruột để đảm bảo không có gì nguy hiểm được thực hiện. Cảm giác ruột của tôi là mục đích hiệu quả nhất nằm ở đâu đó giữa hai lựa chọn.

Vì vậy, mục đích của Đánh giá mã là gì?


16
Liên quan (trên Stack Overflow): Mục đích của đánh giá mã
yannis

16
- Làm thế nào bạn biết nếu bạn đã viết mã dễ đọc và dễ bảo trì? - Đồng nghiệp của bạn cho bạn biết sau khi xem lại mã. 'Cơ sở lý luận: Bạn không thể tự xác định điều này vì bạn biết nhiều hơn với tư cách là tác giả. Một máy tính không thể cho bạn biết, vì những lý do tương tự mà nó không thể biết liệu một bức tranh có phải là nghệ thuật hay không. Do đó, bạn cần một người khác - có khả năng duy trì phần mềm - để xem xét những gì bạn đã viết và đưa ra ý kiến ​​của người đó. Tên chính thức của quy trình nói trên là "Đánh giá ngang hàng" . '
gnat

3
"Mục đích của đánh giá mã là gì?" để ngăn chặn các nhà phát triển viết mã terribad và điều khiển họ đi đúng hướng.
zzzzBov

7
Có vẻ như Đánh giá mã có thể có câu trả lời gián tiếp cho câu hỏi này .. chỉ cần duyệt qua các câu hỏi và câu trả lời ở đó, mục đích của việc đánh giá mã trở nên khá rõ ràng :)
Mathieu Guindon

3
Tôi tự hỏi có bao nhiêu lần lập trình viên đã phát hiện ra các lỗi trong mã của riêng họ chỉ thông qua quá trình đơn giản để giải thích mã của họ trong quá trình xem xét?
hatchet-inactive

Câu trả lời:


75

Có nhiều lý do tại sao bạn muốn tiến hành đánh giá mã:

  • Giáo dục của các nhà phát triển khác. Đảm bảo rằng mọi người đều thấy sửa đổi liên quan đến sửa lỗi hoặc cải tiến lỗi để họ có thể hiểu phần còn lại của phần mềm. Điều này đặc biệt hữu ích khi mọi người đang làm việc trên các thành phần cần được tích hợp hoặc trên các hệ thống phức tạp, nơi một người có thể đi trong thời gian dài mà không cần nhìn vào các mô-đun nhất định.
  • Tìm kiếm khuyết điểm hoặc cơ hội để cải thiện. Cả mã có thể phân phối cũng như mã kiểm tra và dữ liệu đều có thể được kiểm tra để tìm ra điểm yếu. Điều này đảm bảo rằng mã kiểm tra là mạnh mẽ và hợp lệ và thiết kế và triển khai phù hợp trên toàn ứng dụng. Nếu cần phải có những thay đổi bổ sung được thực hiện, nó sẽ nắm bắt cơ hội gần hơn với điểm vào.

Có một số trường hợp kinh doanh để tiến hành đánh giá:

  • Tìm ra khuyết điểm hoặc các vấn đề cần được làm lại gần với tiêm của họ. Cái này rẻ hơn.
  • Hiểu biết chung về hệ thống và đào tạo chéo. Ít thời gian hơn cho một nhà phát triển để tăng tốc để thực hiện các thay đổi.
  • Xác định các cải tiến có thể cho hệ thống.
  • Mở ra việc thực hiện để đảm bảo rằng người kiểm tra đang cung cấp bảo hiểm đầy đủ. Biến một hộp đen thành một hộp màu xám hoặc hộp trắng từ góc độ thử nghiệm.

Nếu bạn đang tìm kiếm một cuộc thảo luận toàn diện về lợi ích và chiến lược thực hiện cho các đánh giá ngang hàng, tôi khuyên bạn nên kiểm tra Đánh giá ngang hàng trong Phần mềm: Hướng dẫn thực hành của Karl Wiegers .


7
+1, tôi nghĩ rằng bạn đã phát hiện ra những điểm chính tốt, với các ưu tiên chính xác. Giữ cho thiết kế phù hợp khi giao dịch với đồng nghiệp, những người liên tục tìm thấy các giải pháp "WTF" rất sáng tạo chỉ có thể đạt được bằng các đánh giá mã thông thường.
Doc Brown

Chúng tôi thực hiện đánh giá mã trong mã JavaScript của mình, chủ yếu để đảm bảo các nhà phát triển tuân thủ các tiêu chuẩn được phác thảo, sử dụng mẫu đã đặt ra khi thiết kế mô-đun, sử dụng các thành phần được cung cấp và không bắt đầu thực hiện mã hóa ninja (cố ý hay không) xung quanh các vấn đề chúng tôi đã có giải pháp cho Họ cũng rất tuyệt khi phát hiện ra ai đó vô tình viết quá nhiều thisngữ cảnh, không sử dụng .hasOwnPropertyở những nơi cần có, v.v. - Vì vậy, chủ yếu là cho các tiêu chuẩn. Trong một ngôn ngữ được quản lý như C #, khóa học của bạn có ít lý do hơn đối với các ngôn ngữ động.
Không,

1
Cho đến nay câu trả lời của bạn chỉ ám chỉ đến việc cải thiện tính chính xác của mã. Nó không giải quyết được khả năng đọc / khả năng bảo trì của mã, điều này hiếm khi có thể được định lượng chính xác bởi nhà phát triển đang phát triển.
ArTs

51

Nhận xét mã là một công cụ để chuyển giao kiến ​​thức .

  • Khi các nhà phát triển xem xét mã của nhau, họ có được sự quen thuộc trên tất cả các lĩnh vực của hệ thống. Điều này làm giảm yếu tố xe buýt của dự án và giúp các nhà phát triển hiệu quả hơn khi phải bảo trì một phần của hệ thống mà họ không viết.

  • Khi một lập trình viên cơ sở xem xét mã của một cấp cao, lập trình viên cơ sở có thể nhận các thủ thuật nếu không chỉ học qua kinh nghiệm. Điều này cũng có thể làm việc như là một sửa chữa chống lại mã quá phức tạp.

    Việc xem xét mã kỹ lưỡng sẽ yêu cầu kiểm tra thường xuyên đối với các tài liệu khác nhau. Đó là một cách tuyệt vời để học một ngôn ngữ hoặc API.

  • Khi một lập trình viên cao cấp xem xét mã của một thiếu niên, đây là cơ hội để giải quyết các vấn đề trước khi họ chuyển thành nợ kỹ thuật. Một đánh giá mã có thể là một thiết lập tốt để tư vấn cho các lập trình viên cơ sở.

Mã đánh giá không phải là về:

  • Lỗi tìm kiếm lỗi. Đó là những gì kiểm tra dành cho. Nó vẫn sẽ thường xuyên xảy ra rằng một đánh giá mã tìm thấy một số vấn đề.

  • Nỗ lực nitpicking về các vấn đề phong cách - giải quyết cho một phong cách, và sử dụng các trình định dạng tự động để thực thi nó. Nhưng có nhiều thứ mà một công cụ tự động không thể kiểm tra. Đánh giá mã là một nơi tốt để đảm bảo mã được ghi chép đầy đủ hoặc tự viết tài liệu.


2
Điểm cuối cùng của bạn về các vấn đề về phong cách nitpicking tôi hoàn toàn không đồng ý - chúng tôi vừa có kinh nghiệm bừa bãi khi xem xét mã của một nhà phát triển cơ sở và khiếu nại rõ ràng nhất thực sự là về phong cách, nhưng không phải là vấn đề về phong cách dễ lập trình thi hành .... waaaaaay quá nhiều nếu báo cáo cho edgecase vv; các vấn đề mà bạn có thể làm cho máy tính tìm thấy trong một số trường hợp, nhưng hầu hết không phải là vấn đề đáng để tìm kiếm theo kịch bản. Mất 30 giây để chúng tôi bắt đầu nhìn thấy nó, 30 giây nữa để giải thích cho nhà phát triển và hy vọng sẽ giải quyết vấn đề. Vẫn còn sốc về nó: /
người theo chủ nghĩa hòa bình

7
@pacifist Đó không phải là phong cách mà người trả lời đang mô tả. Phong cách là về vị trí của niềng răng, thụt và như vậy. Nếu nhà phát triển cơ sở của bạn đang sử dụng quá nhiều nếu tuyên bố bạn có một vấn đề hoàn toàn khác với phong cách; một thuộc tính chung của mã STYLE là nó không ảnh hưởng đến hiệu suất. Và tôi nghĩ rằng một lượng đáng kể các câu lệnh if sẽ ảnh hưởng đến hiệu suất.
Pimgd

12
Khi thực hiện đánh giá, tôi thường phát hiện ra những điều mà tôi nghĩ rằng "điều này trông giống như một lỗi", sau đó tôi viết một trường hợp thử nghiệm cụ thể để chứng minh đó là một lỗi. Vì vậy, một trong nhiều mục tiêu của đánh giá mã là tìm lỗi. Đó là lý do tại sao tôi nghĩ rằng quan điểm "hoặc xem xét mã hoặc kiểm tra" là một chút quá đơn sắc.
Doc Brown

2
Ngoài @DocBrown, có những trường hợp không thể kiểm chứng dễ dàng - các cuộc đua dữ liệu, một số loại bế tắc, livelocks, hành vi / giá trị không xác định (chủ yếu là trong C / C ++ nhưng thứ tự các phần tử trong bảng băm không xác định) (mở tệp trong một vòng lặp có thể là một ý tưởng tồi ngay cả với GC). Một số trong những điều đó có thể được phát hiện bằng cách phân tích tĩnh-trình biên dịch tĩnh đủ thông minh .
Maciej Piechotka

2
@pacifist ví dụ cụ thể của bạn sẽ hoàn toàn bị phá hủy trong đánh giá mã. Nó cũng sẽ là một lá cờ đỏ cho bất kỳ bộ phân tích mã tĩnh nào (Độ phức tạp theo chu kỳ 17!). Đánh giá mã sẽ nhanh chóng xác định chức năng này là một vấn đề theo kiểu ngữ nghĩa (hoặc thậm chí là thuật toán!). Tuy nhiên. Loại vấn đề này không chỉ là vấn đề "phong cách". Nếu bạn coi nó như vậy thì bạn sẽ sớm có một số mã thực sự khó chịu trong kho lưu trữ của mình; Rốt cuộc, đó chỉ là "phong cách".
Pimgd

12

Điều có giá trị nhất mà cá nhân tôi nhận được từ đánh giá mã là sự tự tin rằng mã này rõ ràng với người khác. Các biến được đặt tên rõ ràng? Là mục đích của mỗi đoạn mã hợp lý rõ ràng? Có bất cứ điều gì mơ hồ được làm rõ với một bình luận? Các trường hợp cạnh và giá trị hợp lệ cho các tham số được nêu trong các nhận xét và kiểm tra trong mã?


2
điều này dường như không cung cấp bất cứ điều gì đáng kể so với 4 câu trả lời trước
gnat

2
@gnat: Các câu trả lời khác giải quyết vấn đề chuyển giao kiến ​​thức và phát hiện lỗi. Đây là những điều quan trọng, nhưng có nhiều hơn để xem xét mã.

1
theo như tôi có thể nói, có nhiều phần được giải quyết hợp lý trong câu trả lời này : "Nếu bạn đang tìm kiếm một cuộc thảo luận toàn diện về lợi ích và chiến lược thực hiện cho đánh giá ngang hàng, tôi khuyên bạn nên kiểm tra Đánh giá ngang hàng trong Phần mềm: Hướng dẫn thực hành của Karl Wiegers. " Câu trả lời này cũng bao gồm: "một sửa chữa chống lại mã quá phức tạp"
gnat

2
@gnat Nó nhấn mạnh một khía cạnh khác nhau của các điểm nêu trong các câu trả lời khác. Bạn đã bao giờ bị bối rối bởi mã của riêng bạn mà bạn đã viết sáu tháng trước? Đánh giá mã cho phép bạn đẩy nhanh quá trình đó. Nếu đồng nghiệp của bạn bối rối bởi mã của bạn, bạn vẫn có thể làm rõ nó trong khi vấn đề vẫn còn mới mẻ trong bộ nhớ của bạn.
200_success

1
@ 200_success có thể. Nhưng điểm này, nếu nó thực sự, trông thực sự kém. Ngay cả bình luận của bạn quản lý để truyền đạt nó tốt hơn "câu trả lời" này. Không phải đề cập đến việc nó chỉ lặp lại những gì được chỉ ra trong một bình luận trước đó đề cập đến câu trả lời kinh điển giải thích điều này trong một câu hỏi liên quan
gnat

7

Tôi muốn thêm hai khu vực không có trong các câu trả lời tuyệt vời khác:

Một lý do tuyệt vời để đánh giá mã là hiệu ứng Hawthorne mà trong trường hợp của chúng tôi có nghĩa là: Nếu bạn biết ai đó sẽ xem mã của bạn sau đó thì bạn có nhiều khả năng viết nó tốt hơn ngay từ đầu.

Một lý do tuyệt vời khác là để thực hành phát triển an toàn tốt hơn. Người ta chỉ cần nhìn vào goto của Apple (một dòng mã trùng lặp ngẫu nhiên) hoặc lỗi Heartbleed (một lỗi cơ bản trong xác thực đầu vào) để hiểu tầm quan trọng của việc đánh giá mã phù hợp trong vòng đời phát triển an toà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.