Là một mã xem xét chủ quan hay khách quan (định lượng)?


55

Tôi đang tập hợp một số hướng dẫn để đánh giá mã. Chúng tôi chưa có một quy trình chính thức nào và đang cố gắng chính thức hóa nó. Và nhóm của chúng tôi được phân phối theo địa lý.

Chúng tôi đang sử dụng TFS để kiểm soát nguồn (chúng tôi cũng đã sử dụng nó cho nhiệm vụ / theo dõi lỗi / quản lý dự án, nhưng chúng tôi đã chuyển nó sang JIRA ) với Visual Studio 2008 để phát triển.

Những điều bạn tìm kiếm khi thực hiện đánh giá mã là gì?

  • Đây là những điều tôi nghĩ ra
    1. Thực thi các quy tắc FxCop (chúng tôi là một cửa hàng của Microsoft)
    2. Kiểm tra hiệu năng (công cụ nào?) Và bảo mật (suy nghĩ về việc sử dụng OWASP - trình thu thập mã ) và an toàn luồng
    3. Tuân thủ quy ước đặt tên
    4. Mã phải bao gồm các trường hợp cạnh và điều kiện biên
    5. Nên xử lý ngoại lệ một cách chính xác (không nuốt ngoại lệ)
    6. Kiểm tra nếu chức năng được nhân đôi ở nơi khác
    7. Một thân phương thức phải nhỏ (20-30 dòng) và các phương thức chỉ nên làm một việc và một việc duy nhất (không có tác dụng phụ và tránh khớp nối tạm thời -)
    8. Không vượt qua / trả về null trong các phương thức
    9. Tránh mã chết
    10. Tài liệu phương thức công khai và được bảo vệ / thuộc tính / biến

Những thứ khác chúng ta thường nên tìm ra?

Tôi đang cố gắng xem liệu chúng ta có thể định lượng được quy trình xem xét hay không (nó sẽ tạo ra đầu ra giống hệt nhau khi được xem xét bởi những người khác nhau) Ví dụ: Nói "thân phương thức không được dài hơn 20-30 dòng mã" trái ngược với cách nói "phương thức cơ thể nên nhỏ ".

Hoặc là đánh giá mã rất chủ quan (và sẽ khác nhau từ người đánh giá này với người khác)?

Mục tiêu là có một hệ thống đánh dấu (giả sử -1 điểm cho mỗi vi phạm quy tắc FxCop, -2 điểm vì không tuân theo quy ước đặt tên, 2 điểm để tái cấu trúc, v.v.) để các nhà phát triển cẩn thận hơn khi kiểm tra mã của họ. Bằng cách này, chúng tôi có thể xác định các nhà phát triển luôn viết mã tốt / xấu. Mục tiêu là để người đánh giá dành tối đa khoảng 30 phút, để thực hiện đánh giá (tôi biết điều này là chủ quan, xem xét thực tế rằng các thay đổi / sửa đổi có thể bao gồm nhiều tệp / thay đổi lớn đối với kiến ​​trúc hiện tại, v.v., nhưng bạn nhận được ý tưởng chung, người đánh giá không nên dành nhiều ngày để xem lại mã của ai đó).

Bạn theo dõi hệ thống mục tiêu / định lượng nào khác để xác định mã tốt / xấu được viết bởi các nhà phát triển?

Sách tham khảo: Clean Code: Cẩm nang về kỹ năng phần mềm nhanh nhẹn của Robert Martin .


8
Điều gì được coi là có hại trong việc trả lại null? Tôi hiểu tại sao thường tốt hơn trong các ngôn ngữ cấp cao, chẳng hạn như C #, để trả về các mảng trống thay vì NULL (làm cho mã thanh lịch hơn nhiều và dễ tránh lỗi hơn). Đôi khi bạn cần phải trả về một tham chiếu NULL, phải không?

4
Nếu chúng tôi tránh trả về null, chúng tôi có thể bỏ qua việc kiểm tra null khi ứng dụng khách / thư viện / ứng dụng tiêu thụ gọi phương thức của chúng tôi. từ Clean Code của Robert Martin - Chương 7 (Xử lý lỗi) Trang: 110 "Khi chúng tôi trả về null, về cơ bản, chúng tôi đang tạo ra công việc cho chính mình và gây ra vấn đề cho người gọi của chúng tôi. kiểm soát. "

3
Bạn có thể giải thích nó cho một người không muốn mua cuốn sách để đọc một trang :)? Dường như đối với hầu hết các chương trình C #, việc tránh NULL sẽ khiến mã trở nên phức tạp hơn, đến lượt nó là một công thức cho nhiều lỗi hơn ...

2
Đây là một bài viết trên blog giải thích tại sao trả về null là một ý tưởng tồi. thehackerchickblog.com/2008/10/ . Và thêm một leedumond.com/blog/should-we-return-null-from-our-methods . Những gì Bob gợi ý trong cuốn sách của anh ấy là nếu chúng tôi muốn trả về null, chúng tôi có thể ném ngoại lệ tham chiếu Null hoặc trả lại một đối tượng SPECIAL_CASE. Hãy suy nghĩ về các cuộc gọi phương thức chuỗi this.Foo().FooBar().FooBarBar(); Nếu đối tượng được trả về ở đây từ Foo là null, bạn chắc chắn có thể tránh "Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng" khi gọi FooBar ()

@SoloBold: Và chỉ để chỉ ra, chúng chỉ là hướng dẫn. Nếu có một lý do rất thuyết phục để trả về null (có thể, trong một số trường hợp), thì việc trả về null sẽ có ý nghĩa hơn là trả lại một đối tượng SPECIAL_CASE

Câu trả lời:


25

Việc chấm điểm các cá nhân trong bài đánh giá là đối trọng với hầu hết các hệ thống thành công mà tôi đã làm việc cùng, có thể là tất cả. Nhưng mục tiêu tôi đã cố gắng đạt được trong hơn 20 năm là ít lỗi hơn và tăng năng suất mỗi giờ kỹ sư. Nếu chấm điểm các cá nhân là một mục tiêu, tôi cho rằng các đánh giá có thể được sử dụng. Tôi chưa bao giờ thấy một tình huống mà nó được yêu cầu, như một công nhân hoặc là một nhà lãnh đạo.

Một số nghiên cứu khách quan (Fagan, v.v.) và rất nhiều sự khôn ngoan phổ biến cho thấy các mối quan hệ ngang hàng tạo điều kiện cho các đánh giá mã nhằm giảm lỗi và tăng năng suất. Người quản lý làm việc có thể tham gia với tư cách là người lao động, nhưng không phải là người quản lý. Điểm thảo luận được lưu ý, những thay đổi để làm hài lòng người đánh giá nói chung là một điều tốt nhưng không bắt buộc. Do đó mối quan hệ ngang hàng.

Bất kỳ công cụ tự động nào có thể được chấp nhận mà không cần phân tích hoặc đánh giá thêm là tốt - lint trong C, C ++, Java. Biên soạn thường xuyên. Trình biên dịch thực sự tốt trong các lỗi biên dịch findng. Tài liệu sai lệch trong kiểm tra tự động nghe có vẻ như một bản cáo trạng tinh tế của kiểm tra tự động. Các chỉ thị mã (giống như Java) cho phép độ lệch khá nguy hiểm, IMHO. Tuyệt vời để gỡ lỗi, để cho phép bạn có được trung tâm của vấn đề, nhanh chóng. Không tốt để tìm thấy trong một khối mã 50.000 tài liệu không bình luận mà bạn trở nên chịu trách nhiệm.

Một số quy tắc là ngu ngốc nhưng dễ thực thi; mặc định cho mọi câu lệnh chuyển đổi ngay cả khi chúng không thể truy cập được. Sau đó, nó chỉ là một hộp kiểm và bạn không phải mất thời gian và tiền bạc để kiểm tra các giá trị không khớp với bất cứ thứ gì. Nếu bạn có quy tắc , bạn sẽ có sự dại dột , chúng gắn bó chặt chẽ với nhau . Bất kỳ lợi ích của quy tắc nào cũng phải có giá trị cho sự dại dột mà nó phải trả, và mối quan hệ đó nên được kiểm tra định kỳ.

Mặt khác, "Nó chạy" là không có đức tính trước khi xem xét, hoặc bảo vệ trong đánh giá. Nếu quá trình phát triển tuân theo mô hình thác nước , bạn muốn thực hiện đánh giá khi mã hóa hoàn thành 85%, trước khi các lỗi phức tạp được tìm thấy và xử lý, vì đánh giá là cách rẻ hơn để tìm ra chúng. Vì cuộc sống thực không phải là mô hình thác nước, nên khi xem lại là một phần của nghệ thuật và đạt đến một chuẩn mực xã hội. Những người thực sự sẽ đọc mã của bạn và tìm kiếm các vấn đề trong đó là vàng nguyên khối. Quản lý hỗ trợ điều này theo cách đang diễn ra là một viên ngọc trên giá. Đánh giá nên giống như đăng ký- sớm và thường xuyên .

Tôi đã tìm thấy những điều có lợi:

1) Không có chiến tranh kiểu . Trường hợp niềng răng mở đi chỉ nên chịu sự kiểm tra tính nhất quán trong một tệp nhất định. Tất cả đều giống nhau. Được thôi. Độ sâu thụt lề Ditto ** s và ** chiều rộng tab . Hầu hết các tổ chức phát hiện ra họ cần một tiêu chuẩn chung cho tab, được sử dụng như một không gian rộng.

2)

   looking

văn bản không

   line up is hard to read 

cho nội dung.

BTW, K & R thụt vào năm không gian (FIVE), do đó, kháng cáo lên chính quyền là vô giá trị. Chỉ cần kiên định.

3) Một bản sao được đánh số dòng, không thay đổi, có sẵn công khai của tệp cần xem xét phải được chỉ ra trong 72 giờ trở lên trước khi xem xét.

4) Không thiết kế khi đang bay. Nếu có vấn đề hoặc sự cố, hãy lưu ý vị trí của nó và tiếp tục di chuyển.

5) Thử nghiệm đi qua tất cả các con đường trong môi trường phát triển là một ý tưởng rất, rất, rất, rất tốt. Thử nghiệm yêu cầu dữ liệu lớn bên ngoài, tài nguyên phần cứng, sử dụng trang web của khách hàng, v.v., là thử nghiệm gây tốn kém và sẽ không triệt để.

6) Định dạng tệp không phải ASCII được chấp nhận nếu tạo, hiển thị, chỉnh sửa, v.v., các công cụ tồn tại hoặc được tạo sớm trong quá trình phát triển. Đây là thành kiến ​​cá nhân của tôi, nhưng trong một thế giới mà hệ điều hành thống trị không thể tự thoát ra được với RAM dưới 1 gigabyte, tôi không thể hiểu tại sao các tệp ít hơn, giả sử, 10 megabyte nên là bất cứ điều gì khác với ASCII hoặc một số định dạng được hỗ trợ thương mại khác. Có các tiêu chuẩn cho đồ họa, âm thanh, phim ảnh, thực thi và các công cụ đi kèm với chúng. Không có lý do gì cho một tệp chứa biểu diễn nhị phân của một số đối tượng.

Để bảo trì, tái cấu trúc hoặc phát triển mã được phát hành, một nhóm đồng nghiệp mà tôi đã sử dụng xem xét bởi một người khác, ngồi tại một màn hình và nhìn vào một sự khác biệt của cũ và mới , như một cửa ngõ để đăng ký chi nhánh. Tôi thích nó, nó rẻ, nhanh, tương đối dễ làm. Hướng dẫn cho những người chưa đọc mã trước có thể mang tính giáo dục cho tất cả nhưng hiếm khi cải thiện mã của nhà phát triển.

Nếu bạn được phân phối theo địa lý, việc nhìn vào các khác biệt trên màn hình trong khi nói chuyện với người khác nhìn tương tự sẽ tương đối dễ dàng. Điều đó bao gồm hai người nhìn vào sự thay đổi. Đối với một nhóm lớn hơn đã đọc mã được đề cập, nhiều trang web không khó hơn nhiều so với tất cả trong một phòng. Nhiều phòng được liên kết bởi màn hình máy tính dùng chung và hộp squak hoạt động rất tốt, IMHO. Càng nhiều trang web, càng cần nhiều quản lý cuộc họp. Một người quản lý như người hướng dẫn có thể kiếm tiền của họ ở đây. Hãy nhớ tiếp tục bỏ phiếu các trang web bạn không ở.

Tại một thời điểm, cùng một tổ chức đã kiểm tra đơn vị tự động được sử dụng làm kiểm tra hồi quy. Điều đó thực sự tốt đẹp. Tất nhiên sau đó chúng tôi đã thay đổi nền tảng và kiểm tra tự động bị bỏ lại phía sau. Đánh giá là tốt hơn, vì ghi chú của Tuyên ngôn Agile , các mối quan hệ quan trọng hơn quy trình hoặc công cụ . Nhưng một khi bạn đã xem xét, kiểm tra đơn vị tự động / kiểm tra hồi quy là trợ giúp quan trọng nhất tiếp theo trong việc tạo ra phần mềm tốt.

Nếu bạn có thể căn cứ các bài kiểm tra theo yêu cầu , thì, như người phụ nữ nói trong "Khi Harry Met Sally" , tôi sẽ có những gì cô ấy đang có!

Tất cả các đánh giá cần phải có một bãi đậu xe để nắm bắt các yêu cầu và các vấn đề thiết kế ở cấp độ trên mã hóa. Khi một cái gì đó được công nhận là thuộc về bãi đậu xe, thảo luận nên dừng lại trong đánh giá.

Đôi khi tôi nghĩ rằng đánh giá mã nên giống như các đánh giá sơ đồ trong thiết kế phần cứng - hoàn toàn công khai, kỹ lưỡng, hướng dẫn, kết thúc một quy trình, một cổng sau đó nó được xây dựng và thử nghiệm. Nhưng đánh giá sơ đồ là nặng vì thay đổi đối tượng vật lý là tốn kém. Kiến trúc, giao diện và tài liệu đánh giá cho phần mềm có lẽ nên nặng. Mã là chất lỏng hơn. Mã xem xét nên có trọng lượng nhẹ hơn.

Theo nhiều cách, tôi nghĩ rằng công nghệ cũng giống như văn hóa và kỳ vọng cũng như về một công cụ cụ thể. Hãy nghĩ về tất cả những trò chơi ngẫu hứng của " Swiss Family Robinson " / Flintstones / McGyver khiến trái tim thích thú và thách thức tâm trí. Chúng tôi muốn công cụ của chúng tôi để làm việc . Không có một con đường nào dẫn đến điều đó, bất kỳ thứ gì khác ngoài "trí thông minh" có thể được trừu tượng hóa và tự động hóa bằng các chương trình AI của thập niên 1960 .


Đó là một câu trả lời tốt, đặc biệt liên quan đến việc chấm điểm mọi người - đây không phải là điểm đánh giá mã.
Lúa

25

Hầu hết các điểm bạn mô tả chỉ là vấn đề hình thành mã hoặc "bề mặt":

  • Tuân thủ quy ước đặt tên
  • Tránh mã chết
  • Tài liệu
  • ...

Tất cả điều này có thể được kiểm tra bằng một số công cụ tự động : không cần phải có một nhà phát triển có kinh nghiệm dành thời gian để xem mã để theo dõi điều đó.

Tôi hoàn toàn không biết về .NET , nhưng, đối với PHP , chúng tôi có các công cụ để kiểm tra loại công cụ đó; xem xét .NET thường được cho là "công nghiệp" hơn PHP, tôi sẽ ngạc nhiên khi biết rằng không có công cụ nào để kiểm tra loại công cụ đó.


Công cụ tự động có thể cả hai:

  • Được tích hợp trong một số quy trình xây dựng tự động , chạy mỗi đêm
  • Gửi báo cáo email
    • cảnh báo (ví dụ: một phương thức dài hơn 20 dòng)
    • lỗi (ví dụ: một phương thức dài hơn 50 dòng)

Thư có thể được gửi cho tất cả nhóm hoặc anh chàng đã cam kết mã không vượt qua kiểm tra - hoặc bạn có thể sử dụng một số giao diện web báo cáo (cùng lưu ý về .NET và PHP)


Tôi cũng sẽ thêm rằng kiểm tra tự động có thể giúp rất nhiều, để phát hiện một số lỗi nhất định trước khi mã được sử dụng trong sản xuất. Và các thử nghiệm tự động cũng có thể giúp với một số số liệu, tôi cho rằng.


Đánh giá mã được thực hiện bởi một nhà phát triểnkinh nghiệm cũng có một lợi thế lớn khác mà bạn không nói đến:

  • Một nhà phát triển có kinh nghiệm thường có thể phát hiện rất nhiều lỗi bằng cách chỉ nhìn vào mã nguồn (tôi khá thường xuyên tìm thấy các lỗi khi tôi đánh giá mã)
  • Đánh giá mã được thực hiện bởi một nhà phát triển có kinh nghiệm sẽ cho phép anh ta đưa ra nhận xét và đề xuất cho nhóm :
    • Anh ta sẽ cố gắng hiểu các thuật toán được sử dụng trong mã và có thể đề xuất các giải pháp betters.
    • Chỉ cần đọc mã, thường có những thứ bạn có thể thấy rằng một công cụ tự động sẽ không phát hiện ra.

Nhưng để đánh giá mã đi sâu hơn định dạng mã, bạn sẽ cần hơn nửa giờ ...


Công cụ này cho .Net (chỉ có C # ngay bây giờ) là StyleCop. code.msdn.microsoft.com/sourceanalysis
Bryan Anderson

15

Kinh nghiệm của tôi khi xem xét mã là nó phải là một nỗ lực kết hợp để cải thiện mã, chứ không phải là "biện pháp" để quyết định ai tốt hay xấu trong công việc của họ. Khi không có vấn đề gì nếu bạn nhận được nhiều nhận xét trong quá trình xem xét mã của mình, người đánh giá sẽ nghiêm ngặt hơn, do đó đưa ra đề xuất để cải thiện mã.

Để cải thiện chất lượng mã được kiểm tra, thực thi các nhận xét đánh giá được xử lý (để người đánh giá phê duyệt các nhận xét đã xử lý) và cũng sử dụng các công cụ kiểm tra mã tĩnh để buộc mức chất lượng cho cam kết ban đầu.


2
+1 cho nhận xét của bạn về việc không để điều này trở thành so sánh ai là người giỏi hơn trong công việc của họ. Điều này sẽ không tốt cho tinh thần!

2
@KarstenF: Đúng. Ngoài ra DeveloperA có thể đang làm việc với một nhiệm vụ phức tạp hơn (nhiều dòng mã hơn) trong khi DeveloperB có thể làm việc trong một nhiệm vụ đơn giản và có thể ghi được ít điểm hơn (theo thang điểm). Sẽ là không công bằng khi nói rằng DevA đã làm một công việc tồi tệ khi không có cách nào để bình thường hóa cả công việc / nhiệm vụ của họ

2
Ngoài ra một số nhà phát triển có thể cố gắng làm mất uy tín của các đồng nghiệp của họ.

điểm này là đúng. Các khái niệm nhỏ nhặt (như chấm điểm) dẫn đến sự nũng nịu.
Dan Rosenstark

+1 về điểm rất quan trọng này. Ngay khi quy trình của bạn bắt đầu tạo ra một số, mọi người sẽ chơi trò chơi mã của họ để tăng số của họ. Ví dụ, họ viết rất nhiều dòng mã đơn giản, do đó mức phạt / phương pháp đánh giá của họ rất thấp. Hoặc, họ dành tất cả thời gian để tìm tên biến hoàn hảo. Và sau đó nó trở thành một vấn đề chính trị bởi vì không ai sẽ muốn chỉ ra những lỗi nhỏ trong mã của bạn bè của họ bởi vì điều đó sẽ THẤP HƠN ĐIỂM CỦA CHÚNG TÔI và LÀM THẾ NÀO ĐỂ XEM! Ôi không! Nói tóm lại, trái tim của bạn đang ở đúng nơi, nhưng ý tưởng tồi. Lập trình viên không cho thấy chó.
leoger

5

Tôi nghĩ rằng hệ thống chấm điểm của bạn là một ý tưởng tồi. Điểm là gì? Để xác định lập trình viên tốt và xấu? Mọi người trong đánh giá mã đó có thể hình thành một đánh giá về một lập trình viên cụ thể dựa trên mã được trình bày trong đánh giá mã tốt hơn so với việc gán các giá trị tùy ý cho một tập hợp các đặc điểm có phần tùy ý. Nếu bạn muốn xác định các lập trình viên tốt và xấu ... hãy hỏi các lập trình viên. Tôi đảm bảo con người có thể thực hiện đánh giá này tốt hơn so với heuristic ngớ ngẩn của bạn.

Đề nghị của tôi sẽ là thử và cải thiện các đánh giá mã để mọi người chia sẻ ý tưởng và ý kiến ​​một cách cởi mở trong một môi trường không phán xét và không thù địch. Nếu bạn có thể làm điều đó, bạn sẽ tốt hơn gấp 100 lần so với việc đưa ra phán xét cho các lập trình viên dựa trên danh sách kiểm tra ngớ ngẩn của bạn để làm tốt công việc đánh giá lập trình viên. Tôi nghĩ rằng rất nhiều lập trình viên đã tự hào và khó khăn với chính họ nếu họ làm kém trong việc đánh giá mã; Tôi nghi ngờ liệu 'hình phạt' hơn nữa cho hiệu suất kém nói chung có hữu ích không.


4

Lời khuyên duy nhất của tôi là tránh làm cho quá trình xem xét mã của bạn quá nghiêm ngặt - điều quan trọng nhất là việc xem xét mã thực sự xảy ra và nó được thực hiện nghiêm túc .

Quá trình này càng mệt mỏi đối với người đánh giá thì càng ít có khả năng các đánh giá mã sẽ xảy ra và chúng sẽ được thực hiện nghiêm túc thay vì chỉ xem là một sự phiền toái. Ngoài ra, giá trị thực của các đánh giá mã nằm ở khả năng người đánh giá sử dụng các công cụ tự động phán đoán của riêng họ có thể được sử dụng để kiểm tra những thứ như liệu các quy tắc của FXCop có vượt qua hay không.


+100! Ý tôi là, +1, nhưng thực sự, đây không phải là toàn bộ vấn đề: đối với đánh giá mã và kiểm tra đơn vị (và các công cụ khác), ít hơn là nhiều hơn. Điều này chỉ đúng bởi vì nhiều hơn chỉ là cho đến khi nó trở thành số không :)
Dan Rosenstark

4

Theo nguyên tắc thông thường, tránh dành bất kỳ thời gian nào trong đánh giá mã để làm một việc gì đó có thể được thực hiện bằng máy. Ví dụ, mục đầu tiên của bạn là "thực thi các quy tắc FxCop", nhưng có lẽ điều đó có thể được thực hiện bởi FxCop mà không cần con người cũng phải làm điều đó.


3

Nếu bạn có thể đo lường nó, nếu nó khách quan, có thể định lượng được, thì hãy thử để có một công cụ làm điều đó. Nơi bạn cần một người đánh giá có kinh nghiệm là cho những thứ chủ quan mờ nhạt.


100 giờ để tạo ra công cụ, 1000 lưu bằng cách sử dụng nó.
Dan Rosenstark

3

Rất nhiều ý kiến ​​tốt đã được đưa ra về các vấn đề về phong cách, đó là điều quan trọng. Trong một dự án nhóm, nó có giá trị cho tất cả các mã trông giống như nó được viết bởi một tác giả duy nhất. Điều này giúp các thành viên khác trong nhóm dễ dàng thả vào và khắc phục sự cố khi chúng xảy ra. Những biện pháp định lượng bạn chọn để đảm bảo mục tiêu rộng lớn này ít quan trọng hơn.

Một mục bổ sung là đảm bảo rằng mã phù hợp với kiến ​​trúc tổng thể đã được thỏa thuận cho phần còn lại của hệ thống. Các vấn đề tương tự nên được giải quyết theo cùng một cách. Nếu logic ứng dụng đã được phân chia thành các lớp, liệu mã được xem xét có phá vỡ chức năng của nó theo cách mà phần còn lại của hệ thống thực hiện không? Ngoài ra, mã được xem xét có dạy một cái gì đó mới nên được kéo lại trên phần còn lại của hệ thống không? Giống như các kiểm tra kiểu đảm bảo tất cả các mã trông giống nhau, đánh giá kiến ​​trúc phải đảm bảo rằng tất cả các mã đều hoạt động theo cùng một cách. Sự nhấn mạnh ở đây một lần nữa là về khả năng bảo trì. Bất cứ ai trong nhóm cũng có thể thả vào mã này và nắm bắt được những gì đang xảy ra ngay lập tức.

Ý tưởng chấm điểm có vẻ như là một thảm họa trong quá trình thực hiện, nhưng bạn hiểu rõ nhất về đội của mình. Có thể họ sẽ được thúc đẩy bởi một hệ thống như vậy, nhưng tôi nghĩ nhiều khả năng mọi người sẽ bắt đầu lo lắng về điểm số của họ hơn là giải quyết vấn đề. Một trong những tác dụng phụ thực sự có giá trị của đánh giá mã là các cơ hội cố vấn mà họ cung cấp. Người đánh giá nên coi người đã viết mã là người mà họ đang cố vấn. Mỗi vấn đề được tìm thấy không phải là một vấn đề, mà là một cơ hội để tạo ra một thành viên nhóm hiểu biết và tinh vi hơn và một nhóm tổng thể chặt chẽ hơn.


2

Tôi thực sự quan tâm đến những thứ "chủ quan" hơn bất cứ điều gì khác, thẳng thắn. Những gì tôi muốn từ một đánh giá mã tốt là ai đó kiểm tra logic của tôi, không phải gõ của tôi. Và đó là những gì tôi tập trung vào khi tôi đưa ra đánh giá mã.

Định dạng chung tôi muốn dùng là:

  1. Chúng ta đang sửa cái gì?
  2. Điều gì đã gây ra nó? (nhìn vào mã)
  3. Làm thế nào chúng ta sửa nó?
  4. Cho tôi xem mã mới
  5. Cho tôi xem mã làm việc

Không có điều đó, chỉ nhìn vào diffs có xu hướng đưa ra đầu vào về các vấn đề nhỏ hoặc điểm phong cách. Tôi quan tâm nhiều hơn đến việc logic có đúng hay không, cách tiếp cận được sử dụng tổng thể là tốt và liệu giải pháp sẽ được duy trì.

Một ví dụ, gần đây tôi đã xem một số mã bởi một đồng nghiệp. Vấn đề ban đầu là vi phạm FxCop. Nhưng những gì đã được thực hiện là cố gắng xác định sự hiện diện hay vắng mặt của một tính năng Windows bằng cách kiểm tra số phiên bản. Đầu vào chính của tôi là đây là một cách dễ dàng để làm như vậy và chúng tôi nên truy vấn trực tiếp dịch vụ, vì ánh xạ giữa sự tồn tại của tính năng và Windows sku có thể thay đổi trong tương lai và hoàn toàn không phải là bằng chứng trong tương lai.


Không rõ ràng từ câu trả lời của bạn: FxCop có bắt được sự mong manh đó không, hay bạn?
Dan Rosenstark

2

Độ phức tạp theo chu kỳ (CC) là một cách để đánh giá mã "không tệ".

Trong mã thực tế có CC cao, tôi có yếu tố "chuyện gì đang xảy ra ở đây, tôi không nhớ". Mã CC thấp hơn là dễ dàng để tìm ra.

Rõ ràng, hãy cẩn thận thông thường áp dụng cho các số liệu.


1
@AfermeraInfo: hả?
Paul Nathan

1

Đánh giá mã là cả chủ quan và khách quan. Các quy tắc như "phần thân phương thức phải là 20-30 dòng" là chủ quan (một số người có thể nghĩ 100 dòng là OK) nhưng nếu công ty của bạn đã quyết định rằng 20-30 dòng là giới hạn, điều đó tốt và bạn có thể đo lường điều đó. Tôi nghĩ rằng hệ thống điểm bạn nghĩ ra là một ý tưởng tuyệt vời. Bạn sẽ cần phải đánh giá lại định kỳ khi bạn thấy rằng các quy tắc nhất định cần có trọng số nhiều hơn hoặc ít hơn trong việc tính điểm nhưng miễn là mọi người đều biết các quy tắc, nó trông giống như một hệ thống tốt.

Những thứ khác tôi sẽ tìm kiếm:

  • sự rõ ràng của mã - đôi khi một đoạn mã có thể được viết trong một dòng hoặc một vài dòng. Các lập trình viên trung bình không nên mất vài phút để cố gắng tìm ra một dòng mã làm gì. Nếu anh ta làm như vậy, có lẽ mã nên được viết lại theo cách đơn giản hơn. Điều này là chủ quan nhưng điểm mấu chốt là mã phải được hiểu ngay lập tức bởi hầu hết các lập trình viên trong công ty của bạn.
  • kiểm tra các tham số đầu vào chức năng - cần có một số mã để kiểm tra xem các tham số đầu vào có nằm trong phạm vi chấp nhận được không. Điều này cũng phải phù hợp với các tài liệu chức năng.
  • tên biến mô tả - ngoại trừ trong một vài trường hợp đặc biệt (chỉ số vòng lặp, v.v.), tên biến nên được mô tả. Một tài nguyên bạn có thể muốn xem qua để đặt tên cho các quy ước, v.v. là Code Complete

1

Có vẻ như bạn đang nhận được quá chi tiết quá nhanh. Bạn nên phá vỡ nó nhiều hơn. Bạn nên quan sát mã cho chất lượng mã của nó và tuân thủ tính năng của nó. Bạn nên tách ra cả hai và đó thậm chí không phải là kết thúc của câu chuyện ... vì vậy đây là gợi ý của tôi:

Mã chất lượng:

  • Kiểm tra tự động:
    • Hình dạng của phong cách: là quy ước đặt tên chính xác, tất cả các mã được thụt lề đúng cách, v.v.
    • Tiêu chuẩn hiệu quả: kiểm tra rò rỉ bộ nhớ, kiểm tra độ phức tạp, các biến dự phòng, v.v.
  • Đánh giá ngang hàng thực tế:
    • Một bước đi đơn giản của thiết kế
    • giải thích về sai lệch so với kiểm tra tự động
    • Dễ bảo trì, nói về cách bạn có thể duy trì nó và tất cả
    • Khả năng kiểm tra: làm thế nào dễ dàng để kiểm tra mã này? Có kế hoạch gì không?

Tuân thủ tính năng:

  1. Đánh giá các yêu cầu tính năng và mọi thay đổi kể từ khi yêu cầu và / hoặc đánh giá thiết kế
  2. Demo các chức năng liên quan đến các yêu cầu và kiểm tra từng cái một
  3. Thảo luận về bất kỳ yêu cầu bổ sung nào trong các khía cạnh khác của phần mềm gặp phải trong quá trình triển khai (như kế hoạch triển khai, cơ sở hạ tầng, v.v.)
  4. Giải thích về bất kỳ sai lệch so với yêu cầu, nếu có vào thời điểm đó.

Nếu bạn có thể bao quát bản thân về hai khía cạnh của đánh giá mã, bạn thật tuyệt vời.



1

Nó phụ thuộc.

Một số phần của đánh giá có thể định lượng dễ dàng (không có sự cố FxCop, không có lỗi StyleCop , không có lỗi CAT.NET , v.v.)

Tuy nhiên, phong cách có thể mang tính chủ quan - nhưng như bạn nói, một khi bạn bắt đầu cụ thể hơn (không có phương pháp> 20 dòng) thì bạn có thể đo nó và các công cụ như NDepend có thể tự động làm điều đó. Một số thứ sẽ không bao giờ tự động mặc dù - kiểm tra xử lý trường hợp cạnh sẽ yêu cầu kiểm tra để làm như vậy, điều này mang lại phạm vi bảo hiểm mã và 100% là lý tưởng không thể truy cập trong nhiều trường hợp. Kiểm tra trùng lặp là khó để làm tự động. Không kiểm tra, cũng không chắc chắn tôi đồng ý với bạn, nhưng bạn có thể viết các quy tắc NDepend hoặc quy tắc FxCop cho quy tắc đó.

Càng nhiều công cụ càng tốt và nếu các công cụ cho phép các nhà phát triển kiểm tra công việc của họ trước khi thực hiện các thay đổi và để kiểm tra được thực hiện như một phần của quy trình CI thì bạn sẽ giảm thiểu nhu cầu đánh giá.


0

Một hệ thống đánh dấu nghe có vẻ khó khăn để làm đúng, nhưng đáng để có như một công cụ đo lường: bạn không thể cải thiện những gì bạn không thể đo lường. Nhưng có lẽ bạn nên chấp nhận rằng một số điều sẽ khó / không thể định lượng chính xác. Điều khó khăn sẽ là tìm ra mỗi điểm chất lượng nên ghi bao nhiêu điểm: ví dụ: nếu tuân thủ các quy ước đặt tên sẽ ghi được 2 điểm, thì có bao nhiêu điểm để giữ cho các phương pháp nhỏ?

Có thể một cái gì đó giống như một danh sách kiểm tra đơn giản sẽ tốt hơn, để mã có thể được đánh dấu là tuân thủ, tuân thủ một phần hoặc không tuân thủ một chất lượng cụ thể. Sau đó, bạn có thể thêm tính năng ghi điểm vào danh sách kiểm tra khi bạn thấy vấn đề chất lượng nào xuất hiện thường xuyên nhất hoặc gây ra nhiều vấn đề nhất.

Quá trình xem xét cũng phải đủ linh hoạt để cho phép mã không thành công trong các phần của đánh giá, miễn là điều này có thể được chứng minh và ghi lại. Mù quáng bám vào một số tiêu chuẩn chất lượng mã khiến một thành phần trở nên phức tạp / không thể quản lý một cách không cần thiết là một ý tưởng tồi!


những điều hoàn hảo đang xảy ra

0

Nếu bạn muốn mã của mọi người được chuẩn hóa hơn, mà không khiến họ "lãng phí thời gian vào định dạng", vì một số nhà phát triển sẽ phàn nàn. Đầu tư vào một công cụ như ReSharper vì nó giúp sửa lỗi định dạng và các tác vụ tái bao thanh toán khác thành một quy trình gần như tự động.


0
  • Nếu một máy có thể kiểm tra nó, mọi người không nên.
  • Chỉ có một mục danh sách kiểm tra: Có phải mọi trường hợp lỗi được xử lý chính xác ở mọi nơi không?
  • Sử dụng đánh giá mã để nâng cao chất lượng và chuyển giao kiến ​​thức.
  • Không sử dụng đánh giá mã để xác định nhà phát triển "xấu".
  • Bản ngã bản ngã có hiệu quả hơn điểm rõ ràng.
  • Giữ nó ngắn gọn - 90 phút và 500 dòng là LỚ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.