Làm thế nào để từ chối đánh giá mã mà bạn tin là không cần thiết?


89

Tôi đang ở một vị trí mà tôi đã được yêu cầu xem xét một số mã khắc phục sự cố mà tôi không tin là có tồn tại.

Người sửa lỗi, người cao cấp hơn tôi, khẳng định việc sửa lỗi của anh ta là cần thiết nhưng dường như nó không hơn C ++ ngụy biện đối với tôi. Một phần của quy trình triển khai của chúng tôi là đánh giá mã và là kỹ sư cao thứ 2 trong một công ty nhỏ, tôi dự kiến ​​sẽ xem xét các thay đổi.

Tôi tin rằng những người đánh giá cũng chịu trách nhiệm về những thay đổi mã như người viết mã gốc và tôi không sẵn sàng chịu trách nhiệm cho sự thay đổi này. Làm thế nào bạn sẽ đi về từ chối đánh giá này?


113
Có vẻ rõ ràng với tôi. Bạn chỉ ra trong bài đánh giá rằng mã là một thủ dâm trí tuệ C ++ với mục đích là khắc phục một vấn đề không tồn tại. Và sau đó, như một phần của quy trình xem xét, bạn từ chối mã.
dùng16764

86
Đừng sử dụng từ "thủ dâm trí tuệ" khi bạn từ chối nó. Nếu bạn sử dụng từ ngữ đó, bạn sẽ đối kháng với anh ta và anh ta sẽ không thấy những gì bạn nói là một lời chỉ trích kỹ thuật có khả năng chính xác, anh ta sẽ coi đó là một cuộc tấn công cá nhân. Nó có thể chính xác là thủ dâm trí tuệ, nhưng bạn có thể hoàn toàn chắc chắn rằng anh ta không nhìn thấy nó theo cách đó.
Michael Shaw

15
James - Tôi lấy cảm xúc ra khỏi câu hỏi của bạn để cho phép cộng đồng tập trung vào câu hỏi cốt lõi của bạn. Như những người khác đang chỉ ra, sử dụng thuật ngữ được tải trong đánh giá của bạn sẽ chỉ làm nặng thêm những gì rõ ràng là một tình huống tế nhị.

8
C và C ++ có đầy đủ những thứ có vẻ hoạt động nhưng thực sự là hành vi không xác định. UB là một khiếm khuyết thực sự, ngay cả khi bạn không thể viết một bài kiểm tra cho thấy nó không hoạt động như bình thường. Ví dụ, nhiều trình biên dịch sử dụng UB như một cơ hội tối ưu hóa, bằng cách giả sử rằng trường hợp không xác định đó không bao giờ xảy ra. Ví dụ: nếu bạn đã sử dụng size > size+1để kiểm tra tràn trên một số nguyên đã ký, trình biên dịch có thể chỉ cần thay thế biểu thức này bằng false, vì tràn các số nguyên đã ký không được xác định. Xem blog.llvm.org/2011/05/ Từ
CodeInChaos

5
@MichaelShaw "anh ấy sẽ xem đó là một cuộc tấn công cá nhân." Điều mà từ ngữ của câu hỏi nghe có vẻ như với tôi, một cuộc tấn công cá nhân vào một nhà phát triển cấp cao hơn mà OP có sự khác biệt về quan điểm mà giờ đây anh ta có thể "chiến thắng" vì anh ta được đặt vào vị trí quyền lực.
jwenting

Câu trả lời:


274

Yêu cầu một trường hợp thử nghiệm thất bại mà không có sự thay đổi thành công với sự thay đổi.

Nếu anh ta không thể sản xuất một, bạn sử dụng nó như là biện minh.

Nếu anh ta có thể sản xuất một thì bạn cần phải giải thích tại sao bài kiểm tra không hợp lệ.


245
Hoặc có thể nếu anh ta có thể sản xuất một, bạn xem xét lại các giả định của bạn và xem xét rằng anh ta có thể đã đúng sau tất cả. Có lẽ, quan điểm của bài tập là cải thiện mã, không giành chiến thắng trong cuộc tranh luận.
Caleb

99
Chỉ vì bạn không thể viết một bài kiểm tra không có nghĩa là nó không bị hỏng. Hành vi không xác định thường xảy ra để hoạt động như mong đợi (C và C ++ có đầy đủ điều đó), điều kiện chủng tộc, sắp xếp lại tiềm năng do mô hình bộ nhớ yếu ...
CodeInChaos

29
Ngoài ra, những gì về tái cấu trúc tiêu chuẩn? Làm thế nào để bạn viết một bài kiểm tra thất bại cho một phần của công việc tái cấu trúc?
Mike Weller

62
"Yêu cầu anh ấy chứng minh tại sao cần thiết ..." Có thể yêu cầu anh ấy dạy bạn tại sao cần thiết.
Mike Sherrill 'Nhớ lại mèo'

8
@RhysW: Giả định sai. Mã hiện tại, với điều kiện cuộc đua, cũng không thể được kiểm tra về mặt đó. Vì vậy, mã mới về mặt lý thuyết tốt hơn và tương đương theo kinh nghiệm. Giả định của bạn chỉ giữ vững nếu mã cũ tốt hơn về mặt thực nghiệm.
MSalters

152

Người phản biện nên khách quan.

Rõ ràng là bạn đã hình thành ý kiến ​​về mã được đề cập trước khi bạn thậm chí xem xét nó và có vẻ như bạn và người sửa lỗi đã đặt ra các vị trí. Nếu đó là như vậy, thì bạn sẽ có một thời gian khó khăn xuất hiện mục tiêu, và một thời gian thậm chí còn khó khăn hơn khách quan. Không có điều nào giúp ích cho quá trình, và có thể đó là điều tốt nhất, khách quan nhất bạn có thể làm là cúi đầu với lý do bạn quá gần với vấn đề.

Hãy xem xét một cách tiếp cận nhóm.

Nếu không thể tự xóa, có lẽ bạn có thể yêu cầu một số kỹ sư khác xem lại mã cùng một lúc. Họ sẽ đồng ý với bạn rằng mã sẽ bị từ chối hoặc họ sẽ không từ chối. Nếu họ đồng ý với bạn, thì đó sẽ không còn là bạn so với người sửa lỗi, và bạn sẽ có thể đưa ra một trường hợp mạnh mẽ hơn mà nhóm nhìn vào bản sửa lỗi một cách khách quan và quyết định không chấp nhận nó. Mặt khác, nếu họ quyết định chấp nhận sửa chữa thì đó cũng sẽ là một quyết định của đội. Không nên nói rằng bạn nên tham gia với tư duy cởi mở như bạn có thể quản lý và bạn không nên cố gắng gây ảnh hưởng đến ý kiến ​​của các thành viên khác trong nhóm bằng bất cứ điều gì khác ngoài thảo luận hợp lý. Quan trọng: nếu sau này có kết quả xấu, đừng ném đội xuống xe buýt bằng cách nói "Vâng, tôi luôn nói rằng đó là mã xấu, nhưng tôi đã bị các thành viên khác trong nhóm vượt trội. "

Từ chối là một phần tự nhiên của quy trình xem xét mã.

Quy trình xem xét mã không có sửa chữa tem cao su từ những người cao cấp hơn; nó ở đó để bảo vệ và cải thiện chất lượng của mã. Không có gì sai khi từ chối một bản sửa lỗi miễn là bạn làm điều đó vì lý do chính đáng, nghĩa là bản sửa lỗi không cải thiện mã. Nếu, sau khi xem xét mã mở, bạn vẫn cảm thấy rằng bản sửa lỗi không làm giảm rủi ro và / hoặc mức độ nghiêm trọng của một vấn đề sai lệch, thì bạn nên từ chối nó. Đó không phải là cá nhân, chỉ là ý kiến ​​trung thực của bạn. Nếu người sửa lỗi không đồng ý, điều đó cũng không sao, và tại thời điểm đó, nó trở thành một vấn đề để ban quản lý tìm ra. Chỉ cần chắc chắn để vẫn trung thực, cởi mở và chuyên nghiệp.

Trách nhiệm cắt giảm cả hai cách.

Bạn nói rằng bạn không muốn chịu trách nhiệm cho sự thay đổi này, rõ ràng vì bạn không tin rằng có vấn đề. Tuy nhiên, bạn cần phải nhận ra rằng nếu bạn đang sai lầm và có một vấn đề, sau đó bạn có thể sẽ chịu trách nhiệm từ chối mã mà có thể tránh được vấn đề.

Ghi chép.

Giữ một bản ghi của quá trình xem xét sẽ giúp bạn giữ cho sự thật của bạn thẳng. Viết ra những suy nghĩ và mối quan tâm của bạn trong khi xem xét, mô tả và kết quả của bất kỳ bài kiểm tra nào bạn có thể chạy để đo lường sự cố bị cáo buộc và cách khắc phục, v.v ... Nếu sự cố leo thang, bạn sẽ có một bản ghi về những gì bạn đã làm để hỗ trợ Chức vụ. Nếu vấn đề xuất hiện trở lại trong tương lai (có thể sẽ xảy ra nếu người sửa chữa được gắn với quan điểm của riêng anh ta), bạn sẽ có thứ gì đó để chạy bộ nhớ của bạn.


24
+1 đây là cách hữu ích hơn câu trả lời được chấp nhận
Simon Bergot

2
Chắc chắn rồi. Câu trả lời được chấp nhận là cụ thể cho một trường hợp, rõ ràng không phải là chung chung và suy nghĩ tốt như trường hợp này.
Florian Margaine

40

Viết ra lý do của bạn để từ chối và bảo vệ cho các đối số có khả năng phản biện. Sau đó thảo luận hợp lý với người sửa chữa và nếu cần thiết leo thang lên quản lý.

Nếu bạn có đủ tài liệu (bao gồm danh sách mã, kết quả kiểm tra và đối số khách quan ), bạn sẽ được bảo vệ tốt.

Bạn sẽ gây ra một số ý chí xấu với người sửa lỗi, vì vậy hãy chắc chắn rằng vấn đề đó đáng giá (nghĩa là việc không khắc phục có gây hại không?)

Ngoài ra, nếu người sửa chữa có bất kỳ cách nào liên quan đến chủ sở hữu, hãy quên câu trả lời này.


9
Tôi sẽ bỏ phiếu hai lần cho phần cuối cùng của câu trả lời của bạn. Câu trả lời rất chắc chắn.

31

Gần đây trên LinkedIn, có một bài viết về giải quyết xung đột tại nơi làm việc và khiêm tốn, thay vì tỏ ra kiêu ngạo. Đáng buồn thay, tôi không thể tìm thấy liên kết bây giờ, nhưng ý chính chung là cố gắng hình thành các câu hỏi theo cách không đối đầu. Xin đừng lấy điều này vì tôi ngụ ý rằng bạn kiêu ngạo, đó chỉ là cách mà bài báo được viết.

Nhưng dù sao, khi nói với lập trình viên cao cấp rằng anh ta sai trong giả định của mình sẽ chỉ dẫn đến việc anh ta thực hiện một phương pháp phòng thủ và tấn công bạn trở lại trong phản ứng của anh ta. Tuy nhiên, nếu bạn đặt ra câu hỏi tại sao anh ấy tin rằng vấn đề tồn tại, từ quan điểm về sự thiếu hiểu biết của bạn, thì anh ấy có thể sẽ cởi mở hơn để thảo luận về vấn đề này.

Vì vậy, thay vì nói "Vấn đề không tồn tại, vì vậy tôi không nên xem lại vấn đề này", có lẽ hãy hỏi điều gì đó như "Để xem xét vấn đề này một cách chính xác, tôi cần hiểu vấn đề. Bạn có thể giải thích vấn đề từ quan điểm?"

Lấy ví dụ, bài báo đã mô tả một bài kiểm tra dành cho trẻ em, nơi một người lớn giơ một khối lập phương có tất cả các mặt có một màu, ngoại trừ một mặt đối diện với người lớn. Khi những đứa trẻ được hỏi người lớn đang nhìn thấy màu gì, những đứa trẻ dưới 5 tuổi hầu như sẽ luôn nói màu mà chúng có thể nhìn thấy, vì chúng không thể hiểu rằng người lớn có thể có cái nhìn khác với chính mình.


8
Điểm tuyệt vời, nhưng tôi không hiểu ví dụ ở phía dưới có liên quan như thế nào (tôi không cho rằng nó không liên quan, tất nhiên, chỉ ra sự thiếu hiểu biết của tôi về mối quan hệ).
ugoren

8
@ugoren Ha ha, tôi thích những gì bạn đã làm ở đó!
TheDarkKnight

1
@ugoren mối quan hệ là 'trừ khi bạn có thể nhìn thấy toàn bộ bức tranh, đừng hình thành ý kiến ​​cụ thể'
RhysW

2
Tôi luôn thích cách tiếp cận khiêm tốn, tôi sẽ từ chối sự thay đổi trên cơ sở mà tôi không hiểu và do đó, tôi không đủ điều kiện để cho nó ổn.
PhilDin

2
@PhilDin Có khiêm tốn và sau đó sẽ đi xung quanh nói rằng bạn không đủ điều kiện cho công việc. Nếu anh ấy ở vị trí để xem xét mã, tôi nghĩ rằng những người đặt anh ấy vào vị trí đó mong rằng anh ấy đủ trình độ để làm điều đó.
Andy

9

C / C ++ có thể chứa đầy các hành vi không xác định. Một mặt nó là xấu vì nó có thể dẫn đến những hành vi bất ngờ. Mặt khác, nó cho phép tối ưu hóa mạnh mẽ và thông thường khi bạn đang sử dụng C / C ++, bạn quan tâm đến tốc độ.

Viết trường hợp kiểm tra mà có thể khó khăn - nó có thể liên quan đến kiến ​​trúc hoặc trình biên dịch lạ không còn tồn tại nữa. Ngoài ra, nó có vẻ giống như trên bất kỳ kiến ​​trúc hợp lý nào "nó không gây ra bất kỳ vấn đề nào".

Tuy nhiên, tại một thời điểm nào đó, bạn sẽ thay đổi nền tảng (giả sử - bạn muốn di động để chuyển sang ARM hoặc bạn muốn tăng tốc mọi thứ và sử dụng GPU). Tại thời điểm này mọi thứ có thể bắt đầu bị phá vỡ và bạn sẽ cần gỡ lỗi nó. Nó có thể tầm thường như cập nhật trình biên dịch lên phiên bản mới hơn (và bạn có thể muốn nó / cần nó).

Mã có vấn đề là:

int d[16];

int SATD (void)
{
   int satd = 0, dd, k;
   for (dd=d[k=0]; k<16; dd=d[++k]) {
     satd += (dd < 0 ? -dd : dd);
   }
   return satd;
 }

Trong lần lặp cuối cùng d[++k] => d[++15] => d[16]được truy cập. Vì thông thường phần tử tiếp theo là bộ nhớ hợp pháp (về mặt phân trang không phải mô hình bộ nhớ C), ngay cả các trình biên dịch tầm thường cũng không tạo ra bất kỳ thực thi nào với hành vi lạ. Cách duy nhất để viết trường hợp thử nghiệm là tìm nền tảng với mô hình bộ nhớ chính xác giống như C (có thể là VM).

Tuy nhiên gcc 4.8 prerelase thấy rằng d[++k]được thực thi trong mỗi vòng lặp. Vì vậy, k < 16nếu không thì việc truy cập sẽ là bất hợp pháp và tính hợp pháp của chương trình được cung cấp cho trình biên dịch là một phần của hợp đồng. Vì vậy, điều kiện vòng lặp luôn luôn đúng với các giả định để nó là vòng lặp vô hạn. Điều này nghe có vẻ lạ nhưng đó là tối ưu hóa hoàn toàn hợp pháp - phát ra system("dd if=/dev/zero of=/dev/sda"); system("format c:")cũng sẽ là sự thay thế chính xác cho vòng lặp. Có nhiều cách tinh tế hơn bạn có thể chọn để thể hiện các hành vi. Ví dụ trong bài giảng về Bộ nhớ giao dịch, tôi nhớ rằng người thuyết trình đã thử nhiều lần để nhận giá trị sai khi 2 luồng tăng cùng một giá trị.

Tuy nhiên, C / C ++, trái ngược với một số ngôn ngữ, được tiêu chuẩn hóa để tranh chấp như vậy có thể được thực hiện với tham chiếu đến nguồn khách quan:

  • Nếu bạn nghĩ rằng đây không phải là vấn đề, hãy thử chứng minh bằng cách sử dụng tiêu chuẩn C / C ++ (nghĩa là nó dẫn đến giá trị và hành vi được xác định)
  • Nếu anh ta nghĩ rằng đây là một vấn đề, hãy yêu cầu anh ta chứng minh bằng cách sử dụng tiêu chuẩn C / C ++ (nghĩa là nó dẫn đến giá trị hoặc hành vi không xác định)

Nói chung, nếu nhóm của bạn viết bằng C / C ++, thật hữu ích khi có tiêu chuẩn trong tay - ngay cả các chuyên gia trong nhóm cũng có thể tìm thấy thứ gì đó kỳ lạ ở đó một lần.


4

Điều này nghe có vẻ giống như một vấn đề với chính sách nhóm của bạn hơn là với đánh giá cụ thể này. Khi tôi làm việc tại một cửa hàng phần mềm lớn trong nhóm 9 người, một người đánh giá thẳng thừng có quyền phủ quyết đối với mã và đây là một tiêu chuẩn mà tất cả chúng ta đều tôn trọng. Chúng tôi là một người đủ tài năng và hiểu biết - viz. "trưởng thành", nhưng theo nghĩa "không trẻ con" hơn là "dày dạn" - rằng nhóm trưởng của chúng tôi có thể mong đợi một cách hợp lý chúng tôi luôn có thể đi đến một thỏa thuận mà không cần phải tranh luận trong một khoảng thời gian thận trọng.

Chỉ đơn giản dựa trên ngôn ngữ của bạn trong bài đăng của bạn, tôi có thể cảnh báo bạn rằng có vẻ như bạn sẽ tiếp cận tình huống này theo cách có thể dẫn đến một cuộc tranh cãi. Có lẽ đó là "thủ dâm trí tuệ", nhưng có lẽ có một lý do anh ấy hoặc cô ấy đã làm điều đó, và gánh nặng cho bạn sẽ là đưa ra một cách đơn giản hơn để giải quyết vấn đề đó - và nếu không có cách nào như vậy, hãy bình luận tại sao trên thực tế, mã thủ dâm là cần thiết.


1
"... nhưng có lẽ có một lý do anh ấy hoặc cô ấy đã làm điều đó ..." - Đó là một giả định lớn mà bạn đang thực hiện. Và bạn cũng đang thiếu điểm mà Câu hỏi nói rằng (theo ý kiến ​​của OP) không có vấn đề gì tồn tại. Chắc chắn, trách nhiệm phải thuộc về người đang đề xuất "sửa chữa" để chứng minh rằng có một vấn đề thực sự cần được khắc phục. Việc đề xuất một "giải pháp đơn giản hơn" cho một vấn đề không tồn tại là vô nghĩa.
Stephen C

4
@StephenC có, và tôi đứng trước ý kiến ​​rằng OP nên đưa ra lợi ích của sự nghi ngờ trong trường hợp này. Nếu không, nó sẽ là một đánh giá thực sự đối đầu.
djechlin

3

Làm cho người nộp chứng tỏ bằng chứng rằng mã của anh ấy đã khắc phục vấn đề của anh ấy. Nếu anh ta có thể kiểm tra, và cho bạn thấy bằng chứng, thì bạn là người sai và chỉ nên bỏ khiếu nại của bạn và giải quyết nó. Nếu anh ta không thể đưa ra bằng chứng để hỗ trợ cho yêu cầu của mình thì có vấn đề và đưa ra bằng chứng rằng bản vá của anh ta đã khắc phục được vấn đề, sau đó tôi sẽ gửi anh ta trở lại bảng vẽ.

Tất nhiên có thể có sự nhạy cảm chính trị nội bộ xung quanh điều này. Nhưng đây là con đường tôi sẽ đi (một cách ngon lành).

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.