Tại sao chú Bob đề nghị rằng các tiêu chuẩn mã hóa không nên được viết ra nếu bạn có thể tránh nó?


145

Trong khi tôi đang đọc câu hỏi này , câu trả lời được bình chọn hàng đầu đã trích dẫn chú Bob về các tiêu chuẩn mã hóa , nhưng tôi đã bị nhầm lẫn bởi mẹo này:

  1. Đừng viết chúng ra nếu bạn có thể tránh nó. Thay vào đó, hãy để mã là cách các tiêu chuẩn được nắm bắt.

Điều này nảy lên trong não tôi, nhưng tôi không thể tìm thấy một nơi nào để gắn bó. Nếu một người mới gia nhập nhóm, hoặc các tiêu chuẩn mã hóa thay đổi, không thể có sự nhầm lẫn về thông tin?

Tại sao tôi không nên viết ra một tiêu chuẩn mã hóa?


47
Hừm. Tôi đang cố gắng tưởng tượng làm thế nào điều này sẽ hoạt động trong một công ty đa quốc gia lớn với hàng trăm nhà phát triển và một cơ sở mã kéo dài hàng thập kỷ.
Matthew James Briggs

31
@MatthewJamesBriggs: nó hoạt động ít nhất là một tiêu chuẩn được viết ra mà hầu hết các nhà phát triển bỏ qua hoặc có một nội dung khác tại thời điểm mã được viết ban đầu.
Doc Brown

7
@MatthewJamesBriggs: đã đồng ý. Hướng dẫn về phong cách nên chứa đủ thông tin để nhận ra các quy ước trước đây hiện không được chấp nhận, nếu không, văn hóa "sao chép phong cách hiện tại" sẽ tìm thấy một nỗi kinh hoàng 10 năm để hồi sinh. Ngoài ra, khi các nhóm vô tình hình thành sử dụng các mẫu vật khác nhau và không tương thích để suy ra kiểu chính thức, hướng dẫn kiểu viết cho biết cái nào trong số chúng là đúng (hoặc lý tưởng nhất là ngăn chặn hình thành ở đầu tiên). Và nếu một vài trong số hàng trăm nhà phát triển của bạn không đọc tài liệu, trong một công ty lớn, bạn có thể sa thải họ để kiếm tiền.
Steve Jessop

14
Mặc dù công bằng mà nói, Bob cũng nói rằng bạn không nên có một tiêu chuẩn mã hóa toàn công ty ngay từ đầu, bằng văn bản hoặc không được cấp phép. Thay vào đó, mỗi nhóm / nhóm nên phát triển riêng của mình.
Steve Jessop

37
Thay vì viết một tài liệu mà không ai sẽ đọc, hãy sử dụng một kẻ nói dối thực thi mã theo một cách nhất định. Nếu đó là một phần của quá trình phát triển của bạn, điều đó là không thể tránh khỏi.
Seiyria

Câu trả lời:


256

Có một vài lý do.

  1. Không ai đọc tài liệu.
  2. Không ai làm theo tài liệu ngay cả khi họ đọc nó.
  3. Không ai cập nhật tài liệu ngay cả khi họ đọc nó và làm theo nó.
  4. Viết một danh sách thực hành ít hiệu quả hơn nhiều so với việc tạo ra một nền văn hóa.

Các tiêu chuẩn mã hóa không phải là về những gì mọi người nên làm, mà là về những gì họ thực sự làm. Khi mọi người đi chệch khỏi các tiêu chuẩn, điều này nên được chọn và thay đổi thông qua quy trình xem xét mã và / hoặc các công cụ tự động.

Hãy nhớ rằng, toàn bộ quan điểm của các tiêu chuẩn mã hóa là làm cho cuộc sống của chúng ta dễ dàng hơn. Chúng là lối tắt cho bộ não của chúng ta để chúng ta có thể lọc ra những thứ cần thiết từ những thứ quan trọng. Tốt hơn hết là tạo ra một văn hóa đánh giá để thực thi điều này hơn là chính thức hóa nó trong một tài liệu.


11
Và nếu bạn muốn thực thi mọi thứ, bạn nên có một bước quy trình xây dựng để thực thi nó, chứ không phải là một hướng dẫn kiểu.
Wayne Werner

31
Bạn có thực sự không có một tài liệu tiêu chuẩn, nhưng chỉ la mắng mọi người trong vài tuần đầu tiên ở mỗi lần xem xét mã? Điều này có vẻ như về cơ bản bạn mong đợi người mới bắt đầu thiết kế ngược hướng dẫn phong cách mã hóa của bạn. Hay đây là một giả thuyết "Tôi nghĩ đó là những gì anh ấy muốn nói"? Bây giờ nếu đây là về các công cụ tự động thực thi các quy tắc đó - đã đồng ý, đó là điều cần thiết. Nhưng tôi không muốn phải tìm ra các quy tắc.
Voo

13
@Voo, tại sao bạn cảm thấy cần phải hét lên trong quá trình xem xét mã nếu có vấn đề xảy ra?
Jaap

20
@Jaap Tôi nghĩ rằng hyperbole là rõ ràng .. rõ ràng là không. Không phải la mắng mọi người, nhưng nói với họ rằng họ phải quay lại và sửa chữa tất cả những điều họ vi phạm vì họ không thể biết rõ hơn.
Voo

5
@Voo: bạn không cần phải hướng dẫn phong cách mã hóa kỹ sư đảo ngược. Các quy ước nên rõ ràng khi nhìn vào mã hiện có. Tất cả mọi thứ không ngay lập tức nhảy vào mắt là, không phổ biến hoặc thậm chí không cố định. Trong trường hợp có các quy tắc thực sự quan trọng về điều gì đó hiếm khi xảy ra, có thể đáng để thảo luận với các nhà phát triển mới, khi họ là những người phải viết mã như vậy. Truyền thông không thể được đánh giá quá cao.
Holger

112

Có một cách giải thích khác. Tôi không tin đó là ý của chú Bob, nhưng nó đáng để xem xét.

Đừng nắm bắt các tiêu chuẩn mã hóa trong một tài liệu. Nắm bắt nó trong mã, bằng cách có một quy trình tự động xác minh các tiêu chuẩn đang được đáp ứng .

Đừng dựa vào những người tham khảo tài liệu, nhưng đồng thời, đừng dựa vào những người diễn giải mã đã tồn tại và xác định quy ước và sự trùng hợp là gì.

Kết hợp một cái gì đó như Checkstyle vào bản dựng cam kết của bạn. Điều này có thể thực thi các quy tắc cơ bản như định dạng và đặt tên tiêu chuẩn, và sau đó thay vì nỗ lực tinh thần trong việc xem xét phong cách, tất cả có thể được giảm tải cho một quy trình ngu ngốc ít nhất được đảm bảo là triệt để.

Nếu nó quan trọng, thì hãy xác định chính xác những gì bạn muốn và thất bại nếu nó sai.


6
Trên thực tế, tôi nghi ngờ rằng một cái gì đó như thế này ít nhất là một phần lý do của chú Bob cho lời đề nghị. Tự động hóa các tiêu chuẩn mã hóa đi cùng với kiểm tra tự động như một cách hữu ích để cải thiện chất lượng và tôi chắc chắn rằng Bob biết rằng ...
Jules

10
Có thể đáng nói đến quy tắc số 6: After the first few iterations, get the team together to decide.Chỉ với quy tắc số 3, có vẻ như anh ấy ủng hộ không có tiêu chuẩn mã hóa, nhưng khi xem xét tất cả các quy tắc cùng nhau, và hầu hết tất cả # 6, có vẻ như anh ấy thực sự nói: "Đừng ban đầu buộc phải có một tiêu chuẩn mã hóa. Hãy để nó phát triển một cách hữu cơ, và sau một lúc ngồi xuống với nhóm của bạn để tìm hiểu chi tiết. " Điều này rất khác với "Đừng chính thức hóa tiêu chuẩn mã hóa của bạn" (dường như là bản chất của rất nhiều câu trả lời).
Shaz

Nếu bạn đọc các mục tôi nghĩ bạn sẽ thấy rằng đây chắc chắn không phải là ý của anh ấy, ví dụ như điều này một mình sẽ cho bạn biết điều gì đó: 2. Hãy để chúng là nhóm cụ thể thay vì cụ thể của công ty.
Bill K

Lưu ý rằng tôi đang trả lời câu hỏi "Tại sao tôi không nên viết ra một tiêu chuẩn mã hóa" - chứ không phải "Chú Bob có ý gì". Điều đó có thể chạy ngược lại với tiêu đề của câu hỏi, nhưng không phải tinh thần của nó.
Tom Johnson

Lưu ý rằng một hệ thống định dạng mã hóa tự động không cung cấp mệnh đề thoát (nơi tôi có thể tắt nó cho một phần của mã) gần như chắc chắn sẽ là phần mềm độc hại tại một số điểm.
Yakk

66

Mọi người bỏ qua mục đích thực sự của một tài liệu tiêu chuẩn mã hóa, đó là giải quyết tranh chấp .

Hầu hết các quyết định trong tiêu chuẩn mã hóa sẽ chỉ có ảnh hưởng rất nhỏ đến khả năng đọc và năng suất. Đặc biệt nếu bạn áp dụng phong cách 'bình thường' cho ngôn ngữ và các nhà thiết kế ngôn ngữ bắt đầu nhận ra rằng đây phải là một phần của thông số kỹ thuật (ví dụ: Go).

Bởi vì chúng quá tầm thường, các cuộc tranh luận có thể trở nên thực sự nóng lên và chạy vô tận, gây thiệt hại thực sự cho năng suất và sự gắn kết của đội. Hoặc có thể che khuất lịch sử thay đổi của bạn bằng cách định dạng lại vô tận giữa hai hoặc nhiều kiểu ưa thích của mọi người.

Có một tiêu chuẩn bằng văn bản kết thúc cuộc tranh luận. Các nhà quản lý có thể chỉ vào nó và làm chệch hướng sự không hài lòng đối với tài liệu. Bạn có thể tranh luận với một mảnh giấy nhưng nó sẽ không lắng nghe bạn.

(Xem thêm Sự chuyên chế của vô cấu trúc )


19
Điều này là vô cùng quan trọng đối với các đội xử lý mã kế thừa. Đặc biệt là khi đi từ mã theo một bộ tiêu chuẩn (hoặc không tuân theo bất kỳ tiêu chuẩn nào) sang tiêu chuẩn khác. Nếu không có hướng dẫn để tham khảo, không thể biết kiểu mã nào sẽ tuân theo khi có nhiều kiểu đã có trong cơ sở mã. Tôi nghĩ rằng lời khuyên để không viết ra các tiêu chuẩn có nghĩa là cho các nhóm rất nhỏ làm việc trong các dự án sân xanh không có doanh thu rủi ro - một trường hợp rất hiếm, theo kinh nghiệm của tôi.
thomij

4
Điều quan trọng hơn nhiều là đồng ý với một tiêu chuẩn, hơn là nội dung thực tế của tiêu chuẩn. Bạn có thể quen với bất kỳ phong cách nào nếu bạn làm việc với nó đủ lâu.
Đánh dấu tiền chuộc

3
Tranh cãi về sự tầm thường là một dấu hiệu của sự bất tài, IMHO. Giải quyết tranh chấp cụ thể sẽ không khắc phục được vấn đề tiềm ẩn.
Jørgen Fogh

1
Có, giải quyết tranh chấp và giữ cho lịch sử thay đổi không bị ô nhiễm là rất lớn, đặc biệt là khi bạn có sự kết hợp giữa các nhà phát triển OCD và không phải OCD trong nhóm của bạn. Tuy nhiên, tôi đã thấy các tiêu chuẩn bằng văn bản là các trọng tài kém hiệu quả hơn nhiều so với các công cụ tự động như StyleCop, đưa ra luật mà không biến nó thành cá nhân hoặc lãng phí thời gian của người quản lý.
Eric Hirst

12
"Tranh cãi về sự tầm thường là một dấu hiệu của sự bất tài" - Tôi ước điều này là đúng trong công nghệ phần mềm ... Tôi sợ một số nhà phát triển rất, rất có năng lực (ít nhất là về mặt kỹ thuật) chính xác là những người thích tranh luận về sự tầm thường. Chết tiệt, đó là môn thể thao quốc gia của họ. "Infinite là những lập luận của những pháp sư" -Ursula Le Guin
Spike0xff

21

ý kiến ​​là dối trá .

Tiêu chuẩn mã hóa là một nhận xét lớn tuyệt vời về những gì mã nên được. Bản thân mã là nguồn gốc của sự thật. Sự thật trong trường hợp này không phải là hành vi mã, đó là phong cách mà nó thể hiện. Nếu tiêu chuẩn của bạn chưa được phản ánh trong mã của bạn, bạn có rất nhiều công việc trước mắt.

Chú Bob thấy một bình luận là thất bại cá nhân của lập trình viên, bởi vì nó chứng tỏ rằng anh ta đã không quản lý để thể hiện mục đích của đoạn mã với chính ngôn ngữ lập trình. Tương tự, một tài liệu tiêu chuẩn là một sự thất bại trong việc thể hiện một phong cách mạch lạc trong cơ sở mã.

Các lập trình viên mới nên dành thời gian xem mã, không mất nhiều ngày để đọc tài liệu tiêu chuẩn nhiều chương (tôi phải làm điều này, thở dài).

Một tài liệu tiêu chuẩn không phải là một ý tưởng tồi, nhưng tôi đã ở trong các cửa hàng lập trình nơi việc duy trì các tài liệu tiêu chuẩn là công việc toàn thời gian của ai đó. Xin vui lòng, nếu bạn phải giữ một tài liệu tiêu chuẩn, hãy giữ nó ở một trang. Nhưng nếu bạn đã có mã, không ai có thể kết hợp cùng một tài liệu trong vòng chưa đầy một ngày?

Có tiêu chuẩn mã là quan trọng. Có một tài liệu chỉ ra những gì họ không phải là.


22
Tôi thực sự đã trải nghiệm codebase nhiều thập kỷ với chính sách "không bình luận"; mặc dù nó khuyến khích các tên phương thức mô tả rất dài, nhưng nó hoàn toàn khủng khiếp trong việc nắm bắt ý định, lý do không thực hiện và chúng tôi chỉ thoát khỏi nó bằng cách có một trong những tác giả gốc vẫn ở bên chúng tôi.
pjc50

7
+1 "Có các tiêu chuẩn mã là quan trọng. Có một tài liệu chỉ ra những gì chúng không phải là." Vâng và ngắn gọn đặt.
David

4
@ pjc50 Tôi chưa bao giờ nghe chú Bob khuyến khích chính sách không bình luận. Anh ấy không dạy rằng bạn không bao giờ nên bình luận. Ông dạy rằng bạn nên cảm thấy tồi tệ khi bạn thấy bạn phải làm điều đó để được hiểu. Uncommented unreadable <bình luận không thể đọc được <mã có thể đọc mà không cần bình luận. Lưu ý rằng các ý kiến ​​bạn đề cập là những ý kiến ​​hoàn toàn tách rời với CÁCH mã hoạt động. Các tài liệu tiêu chuẩn có thể biến thành một danh sách kiểm tra chết não được đánh dấu trong một đánh giá mã. Điều quan trọng không phải là bạn có được tất cả các dấu vết của bạn. Đó là những người trong bàn hiểu mã của bạn.
candied_orange

3
"Các lập trình viên mới nên dành thời gian xem mã, không dành nhiều ngày để đọc tài liệu tiêu chuẩn nhiều chương". Không biết bạn hướng dẫn mã hóa nào, nhưng hướng dẫn về phong cách C ++ của Google có thể dễ dàng đọc được trong vòng một giờ và dễ dàng hơn nhiều so với việc phải đảo ngược phong cách ưa thích dựa trên mã hiện có (nghe có vẻ kinh khủng đối với tôi). Điều này cũng đúng với mọi hướng dẫn phong cách khác mà tôi từng đọc.
Voo

5
@CandiedOrange: Thông thường, những bình luận hữu ích nhất là những bình luận mô tả lý do một số điều không được thực hiện [vì nếu không có những bình luận đó, các lập trình viên trong tương lai có thể lãng phí thời gian để cố gắng thực hiện và sau đó rút lại những "cải tiến" dường như rõ ràng không thể làm việc được] Trừ khi một người thực sự phát điên với các tên biến, không có cách nào ngay cả mã dễ đọc nhất có thể nắm bắt thông tin đó.
supercat

16

Tại sao chú Bob đề nghị rằng các tiêu chuẩn mã hóa không nên được viết ra nếu bạn có thể tránh nó?

Nếu bạn đang hỏi lý do đằng sau ý kiến ​​của anh ấy thì bạn chỉ có thể có câu trả lời nếu anh ấy sẽ đăng câu trả lời ở đây ( ý kiến của chúng tôi chỉ là không liên quan), tuy nhiên ...

Tại sao tôi không nên viết ra một Tiêu chuẩn mã hóa?

Nếu bạn hỏi liệu anh ấy có đúng về điều đó không: hãy để tôi là người duy nhất không phổ biến (cho đến nay) nói rằng bạn không có lý do gì để tránh điều đó.

VIẾT NÓ XUỐNG . Tuy nhiên tôi sẽ cố gắng giải thích lý do của mình ...

David đề nghị trong một bình luận rằng điểm chính của câu trả lời của Stephen không phải là lý do tại sao bạn không nên viết tài liệu mà ở dạng chúng. Nếu hướng dẫn được chính thức hóa trong các công cụ (không chỉ đơn thuần là xem xét mã thủ công) thì tôi có thể đồng ý (khi luật pháp không yêu cầu điều gì khác). Xin lưu ý rằng các công cụ không may không thể kiểm tra tất cả mọi thứ (lý thuyết tính toán không phải là bạn của chúng tôi) vì chúng bị giới hạn trong một đơn vị hoặc gói dịch cụ thể hoặc bất kỳ ngôn ngữ yêu thích nào của bạn gọi là ranh giới .

Tuy nhiên, cách diễn đạt của chú Bob không khiến tôi nghĩ rằng ông đang nói về điều đó.

Tôi có thể không đồng ý với chuyên gia cao cấp như vậy? Tôi làm, cho hầu hết mọi điểm trong bài viết được trích dẫn (xem thêm phần thứ hai của câu trả lời này để biết chi tiết). Chúng ta hãy cố gắng hiểu lý do tại sao (giả sử bạn đã biết rằng các nguyên tắc mã hóa không chỉ là về các vấn đề định dạng nhỏ ).

  • Trong một số trường hợp, các tiêu chuẩn mã hóa được yêu cầu bởi luật pháp.
  • Tôi đã đọc tài liệu và tôi chắc chắn rằng tôi không cô đơn. Các thành viên trong nhóm có thể thay đổi theo thời gian, kiến ​​thức không thể có trong một cơ sở mã 5-10 năm tuổi hoặc trong tâm trí của các thành viên trong nhóm. Các tổ chức nên sa thải những người không tuân theo các hướng dẫn nội bộ.
  • Các tiêu chuẩn mã hóa, một khi chúng đã được phê duyệt , sẽ không thay đổi thường xuyên và nếu chúng muốn biết về nó. Nếu các tiêu chuẩn thay đổi thì tài liệu của bạn (trong mã) đã hết hạn vì tất cả mã của bạn không tuân theo tiêu chuẩn mới. Định dạng lại / tái cấu trúc có thể chậm nhưng bạn luôn có một hướng dẫn có thẩm quyền bằng văn bản để tuân theo.
  • Tốt hơn là đọc một tài liệu 5 trang hơn là kiểm tra 10 / 20K LỘC để ngoại suy một quy tắc (mà bạn có thể hiểu sai, BTW), không nghi ngờ gì về điều đó.
  • Thật trớ trêu khi ai đó đã viết nhiều cuốn sách về các nguyên tắc thiết kế và phong cách mã hóa đang gợi ý rằng bạn không nên viết hướng dẫn của riêng mình, sẽ không tốt hơn nếu anh ta bỏ rơi chúng tôi với một số ví dụ về mã? Không, bởi vì các hướng dẫn bằng văn bản không chỉ cho bạn biết phải làm gì mà còn hai điều khác mà mã thiếu: không nên làm gì và lý do để làm điều đó hay không.

"Lập trình tự tổ chức miễn phí" tốt cho một chàng trai 16 tuổi ninja nhưng các tổ chức có các yêu cầu khác :

  • Chất lượng mã phải được cấp (và được xác định) ở cấp công ty - đó không phải là điều mà một nhóm duy nhất có thể quyết định. Họ thậm chí có thể không có kỹ năng để quyết định điều gì tốt hơn (ví dụ, có bao nhiêu nhà phát triển có tất cả các kỹ năng cần thiết để xem xét MISRA hoặc thậm chí chỉ hiểu mỗi quy tắc?)
  • Các thành viên có thể được di chuyển qua các nhóm khác nhau: nếu mọi người tuân theo cùng một tiêu chuẩn mã hóa thì việc tích hợp diễn ra suôn sẻ và ít xảy ra lỗi hơn.
  • Nếu một nhóm tự tổ chức thì các tiêu chuẩn sẽ phát triển theo thời gian khi các thành viên trong nhóm thay đổi - khi đó bạn sẽ có một cơ sở mã lớn không tuân theo các tiêu chuẩn được chấp nhận hiện tại .

Nếu bạn đang nghĩ về mọi người trước khi xử lý thì tôi chỉ có thể đề nghị đọc về TPS: con người là một phần trung tâm của Lean nhưng các thủ tục được chính thức hóa cao.

Tất nhiên một tổ chức nhỏ chỉ có một nhóm có thể để nhóm quyết định các tiêu chuẩn để áp dụng nhưng sau đó nó phải được viết ra. Ở đây trên Lập trình viên. Bạn có thể đọc các bài đăng của Eric Lippert: Tôi cho rằng tất cả chúng ta đều đồng ý rằng anh ta là một nhà phát triển có kinh nghiệm, khi làm việc cho Microsoft, anh ta phải tuân thủ các nguyên tắc bằng văn bản của họ (ngay cả khi một số quy tắc có thể sai , không áp dụng hoặc vô dụng với anh ta.) Còn Jon Skeet thì sao? Các nguyên tắc của Google khá nghiêm ngặt (và nhiều người không đồng ý với chúng) nhưng anh ta phải tuân thủ các nguyên tắc đó. Có phải là thiếu tôn trọng họ? Không, có lẽ họ đã làm việc để xác định và cải thiện các hướng dẫn như vậy, một công ty không được tạo bởi một thành viên (hoặc một nhóm) và mỗi nhóm không phải là một hòn đảo .

Ví dụ

  • Bạn đã quyết định không sử dụng nhiều lớp kế thừa và các lớp lồng nhau trong C ++ vì các thành viên nhóm thực tế của bạn không hiểu rõ về nó . Sau này ai đó muốn sử dụng nhiều kế thừa phải duyệt toàn bộ LỘC 1M để xem nó đã từng được sử dụng chưa. Thật tệ vì nếu các quyết định thiết kế không được ghi nhận, bạn phải nghiên cứu toàn bộ cơ sở mã để hiểu chúng. Và thậm chí sau đó, nếu nó chưa được sử dụng, có phải vì nó trái với tiêu chuẩn mã hóa, hay nó được cho phép, nhưng không có bất kỳ tình huống nào trước đó mà nhiều sự thừa kế là phù hợp?
  • Trong C #, bạn đã quá tải các phương thức để cung cấp các tham số mặc định vì cơ sở mã của bạn bắt đầu khi các tham số tùy chọn không có sẵn trong C #. Sau đó, bạn thay đổi và bạn bắt đầu sử dụng chúng (tái cấu trúc mã cũ để sử dụng chúng mỗi khi bạn phải sửa đổi các chức năng đó). Thậm chí sau đó bạn đã quyết định rằng các tham số tùy chọn là xấu và bạn bắt đầu tránh sử dụng chúng. Là gì quy tắc mã của bạn sẽ cho bạn biết? Thật tệ vì tiêu chuẩn phát triển nhưng codebase phát triển chậm hơn và nếu đó là tài liệu của bạn thì bạn sẽ gặp rắc rối.
  • Jon chuyển từ đội A sang đội B. Jon phải học một tiêu chuẩn mới; Trong khi học, anh ta có thể sẽ giới thiệu các lỗi tinh vi hơn (hoặc, nếu may mắn, chỉ mất một thời gian dài để hiểu mã hiện có và làm cho mã xem lại lâu hơn).
  • Đội A chuyển sang một cơ sở mã được sở hữu trước đây bởi đội B. Nó có các tiêu chuẩn mã hóa hoàn toàn khác nhau. Viết lại? Phỏng theo? Pha trộn? Tất cả đều tệ như nhau.

Chú Bob

Hãy để chúng phát triển trong vài lần lặp đầu tiên.

Đúng, cho đến khi bạn không có một tiêu chuẩn và tổ chức của bạn đã giao cho bạn nhiệm vụ xây dựng một tiêu chuẩn .

Hãy để họ là nhóm cụ thể thay vì công ty cụ thể.

Không, vì tất cả các lý do đã giải thích ở trên. Ngay cả khi bạn nghĩ để chính thức hóa định dạng mã (điều ít hữu ích nhất bạn có thể muốn chính thức hóa) tôi vẫn có ký ức về những cuộc chiến vô tận (và vô dụng) về định dạng. Tôi không muốn sống chúng nhiều lần, hãy đặt nó một lần cho tất cả.

Đừng viết chúng ra nếu bạn có thể tránh nó. Thay vào đó, hãy để mã là cách các tiêu chuẩn được nắm bắt.

Không, vì tất cả các lý do đã giải thích ở trên (tất nhiên trừ khi bạn sẽ cấu trúc lại tất cả mã của mình trong một lần khi hướng dẫn thay đổi). Bạn có muốn để lại mã như hiện tại không? Làm thế nào để bạn kiểm tra codebase để hiểu các hướng dẫn hiện tại ? Tìm kiếm theo tuổi tệp và điều chỉnh kiểu mã hóa của bạn theo tuổi tệp nguồn?

Đừng quy định thiết kế tốt. (ví dụ: đừng nói với mọi người không sử dụng goto)

Đúng, hướng dẫn phải ngắn gọn hoặc không ai sẽ đọc chúng. Đừng lặp lại điều hiển nhiên.

Hãy chắc chắn rằng mọi người đều biết rằng tiêu chuẩn là về giao tiếp, và không có gì khác.

Không chỉ, một tiêu chuẩn tốt là về chất lượng trừ khi bạn muốn có một tiêu chuẩn chỉ về các chi tiết nhỏ .

Sau vài lần lặp đầu tiên, hãy cùng nhóm quyết định.

Xem điểm đầu tiên và đừng quên rằng một tiêu chuẩn mã hóa thường là một quá trình mất nhiều năm để được phát triển và hoàn thiện: vài lần lặp lại, có thể với các nhà phát triển cơ sở? Có thật không? Bạn có muốn dựa vào trí nhớ của một thành viên cao cấp (nếu có) không?

Ba lưu ý:

  • Theo tôi, nhược điểm là nghiêm trọng hơn với một số ngôn ngữ so với các ngôn ngữ khác, ví dụ như trong C ++, một tiêu chuẩn cấp công ty thậm chí còn cần thiết hơn so với Java.
  • Lý do này có thể không áp dụng hoàn toàn (và lý do của chú Bob có thể ít cực đoan hơn ) nếu bạn làm việc trong một công ty rất nhỏ nơi bạn chỉ có một nhóm nhỏ.
  • Bạn được tuyển dụng (theo nhóm) và bạn sẽ làm việc một mình với một dự án mới, sau đó bạn sẽ quên nó và tiếp tục. Trong trường hợp này, bạn có thể không quan tâm (nhưng chủ nhân của bạn nên ...)

5
Tôi đã đánh giá thấp điều này bởi vì tôi cảm thấy câu trả lời không đúng chủ đề cho câu hỏi, đó là lý do tại sao bạn (và cụ thể là chú Bob) sẽ viết một tiêu chuẩn mã hóa , chứ không phải tại sao bạn nên làm vậy. Tôi nghĩ mọi người đều hiểu những điểm cộng của việc có một tiêu chuẩn bằng văn bản, nhưng những nhược điểm khó xác định hơn và khi một nhân viên cấp cao trong ngành xuất hiện với một vị trí phản đối thực tiễn thông thường trong ngành, xem xét lý do tại sao chắc chắn là một việc đáng làm.
Jules

5
@gnat cảm ơn bạn, tôi không cần upvote cho các bài viết ngoài chủ đề, không phải là "Tại sao ông X lại làm Y?" lạc đề trong trường hợp này? Chúng tôi không biết lý do của anh ấy và anh ấy đã không giải thích chúng, không nên đặt câu hỏi ngoài chủ đề? Làm thế nào bạn sẽ trả lời cho câu hỏi này? Phát minh lý do ngẫu nhiên hoặc nói tiền đề là sai?
Adriano Repetti

1
@AdrianoRepetti - Chú Bob đã giải thích rất nhiều trong những năm qua, vì vậy thật hợp lý khi xem xét ai đó có thể có cái nhìn sâu sắc về cách suy nghĩ của anh ấy, nhưng bạn đã đúng nếu cần phải có sự giải thích trực tiếp của chú Bob.
JeffO

3
@jeff có, nếu câu hỏi là về "tại sao anh ấy nghĩ như vậy" thì câu trả lời chỉ là phỏng đoán. Nếu câu hỏi là "có đúng không?" sau đó câu trả lời cá nhân của tôi là d *** hoàn toàn không.
Adriano Repetti

1
"Khi anh ấy làm việc cho Microsoft, anh ấy phải tuân thủ các nguyên tắc bằng văn bản của họ" - bạn cá là tôi đã làm thế. Và tất nhiên, chúng tôi đã sử dụng FXCop và StyleCop để ngăn chặn một số mẫu xấu không được kiểm tra.
Eric Lippert

12
  1. Để có ích, một tiêu chuẩn mã hóa không được nói về các vấn đề thực chất; Chỉ vấn đề về phong cách. Nó chỉ nên chỉ định những điều đó là tùy tiện và mơ hồ. ví dụ: vị trí Brace, độ sâu thụt, khoảng trắng so với tab, quy ước đặt tên, v.v.
  2. Các vấn đề về phong cách là địa phương, không phải toàn cầu. Mỗi đội nên áp dụng phong cách đặc biệt của riêng mình, phù hợp với nhiệm vụ và tính cách của họ. Điều này giữ cho các tiêu chuẩn đơn giản và trọng lượng nhẹ. Các tiêu chuẩn của công ty trở nên quá tải với tất cả các cân nhắc, cấu hình và ngoại lệ có thể.
  3. Trong một nhóm, lý do duy nhất để viết một tài liệu kiểu mã hóa riêng là nếu mã do nhóm tạo ra không đáp ứng tiêu chuẩn. Trong trường hợp bạn không có tiêu chuẩn. Để có hiệu lực, tiêu chuẩn phải được thể hiện bằng chính mã. Và nếu đó là như vậy, không cần một tài liệu riêng.
  4. Trong các hệ thống kế thừa đội và phong cách thay đổi theo thời gian. Không có gì sai với điều đó. Mã cũ sẽ có kiểu cũ. Mã mới hơn sẽ có phong cách mới hơn. Nhóm nên nhận thức được các phong cách, và tuổi của họ. Bất cứ khi nào mã mới được viết, nó phải theo phong cách mới, bất kể nó nằm ở đâu trong mã.

Tôi có một vài điều lúng túng: 1) hữu ích, một tiêu chuẩn mã hóa không nên chỉ nói về định dạng (vấn đề chiến tranh thần thánh nhưng dễ đọc mã) nhưng xây dựng để tránh, mô hình mã hóa (để tránh những lỗi phổ biến, không dễ hiểu ngôn ngữ tính năng) và các vấn đề bảo mật. Đây là các hướng dẫn mã hóa (hữu ích hơn các vấn đề định dạng). 2) Với tiền đề của điểm 1 thì đó không phải là về tính cách (mà có thể là về các nhiệm vụ ), bạn có thể có một tiêu chuẩn công ty nhẹ, đó là nhiệm vụ của riêng bạn để làm cho nó nhẹ đi.
Adriano Repetti

3) Mã có thể cho bạn biết phải làm gì nhưng nó không thể truyền đạt những gì bạn không nên làm (trừ khi bạn muốn nghiên cứu toàn bộ cơ sở mã và ngay cả trong trường hợp đó ... chỉ là không phải sử dụng cấu trúc X hoặc nó một không-không?) Một điều quan trọng khác là lý do: tại sao không? tại sao có? Mọi thứ có thể thay đổi theo thời gian nhưng làm thế nào bạn biết nếu cơ sở ban đầu vẫn còn hiệu lực? 4) và khi bạn là thành viên nhóm mới và bạn viết mã mới ... bạn có học cơ sở mã với cùng độ tuổi để giữ kiểu mã hóa đó không? Một ngày sau khi bạn chuyển sang một thành phần mới hơn và bạn học lại codebase (lọc theo ngày tạo?)
Adriano Repetti

BTW, nếu, thay vào đó, bạn đề nghị không chỉ viết ra các kiểu định dạng mã thì tôi có thể đồng ý (tốt, thực tế là không nhưng với những lý do không quá mạnh mẽ bên cạnh những ký ức về những cuộc thảo luận vô tận và vô dụng sẽ xuất hiện mỗi lần - và đó là một hướng dẫn của công ty sẽ tránh một lần cho tất cả) tuy nhiên bạn nên làm rõ hoặc mọi người sẽ diễn giải từ của bạn theo nghĩa đen (xem hầu hết các câu trả lời + nhận xét tại đây). Ngoài ra, quan điểm về "goto" là một chút sai lệch theo nghĩa này (IMO)
Adriano Repetti

4

Tại sao tôi không nên viết ra một Tiêu chuẩn mã hóa?

Có nhiều lý do cho việc này. Dưới đây là một số cân nhắc:

  1. Mọi người dành bao nhiêu thời gian để "học" các tiêu chuẩn mã chỉ để có nhiều thời gian đi vào toàn bộ nhóm xem xét, thảo luận, ghi chép, sửa đổi ... vv các tiêu chuẩn mã. Điều này giống như liên tục thảo luận về "Sổ tay nhân viên" của bạn - mức độ thường xuyên làm cho nó trong chương trình họp của nhóm?

  2. Khi một dự án bị ô nhiễm / gác lại / vv. sau đó một số ít người thường không thể tiếp tục tuân thủ (hoặc thậm chí có thể không đọc) các tiêu chuẩn. Điều tiếp theo bạn biết, tất cả những nỗ lực để "giữ mã sạch" dù sao cũng đã bị lãng phí khá nhiều.

  3. Nếu quầy hàng của dự án hoặc một khách hàng tiềm năng mới được đưa vào, rất có thể người đó sẽ hoàn toàn bỏ qua các quy tắc trước đó và muốn thực hiện theo cách mới. Một lần nữa, những gì đã đạt được bằng cách mã hóa các tiêu chuẩn ??

Bạn nên chắc chắn đọc # 6:

Sau vài lần lặp đầu tiên, hãy cùng nhóm quyết định.

Nói cách khác, khi đến lúc bắt đầu một dự án, chỉ cần đi theo dòng chảy một lúc. Sau đó thảo luận về các quy tắc chung về tiêu chuẩn mã hóa mà nhóm hiện tại đang sử dụng - và về cơ bản tuân theo chúng. Bằng cách đó, bạn tối đa hóa nỗ lực cải thiện sản phẩm đồng thời giảm thiểu nỗ lực cần thiết để viết, xem xét và ghi lại "đường cú pháp" để có được mã thực thi.

Rất ít đội có được lợi ích lớn từ các tiêu chuẩn mã hóa. Thông thường, "khả năng đọc" quá mơ hồ - và hầu hết các nhà phát triển không được hưởng lợi nhiều từ các quy tắc chính xác về khoảng cách, dòng mới, v.v. nhưng bạn có thể tránh các nhà phát triển liên tục gây phiền nhiễu bằng cách có ít nhất một vài quy tắc.


4

Một câu trả lời khác mà tôi không nghĩ đã được nêu rõ ràng, đó là nó cũng có nghĩa là mọi người không tuân theo các quy tắc một cách mù quáng. Điều đó có nghĩa là mọi người phải đưa ra những biện minh thực tế cho các quyết định thiết kế và quy ước mã hóa của họ, thay vì chỉ phụ thuộc vào thực tế rằng nó đã được viết ra để biện minh cho nó.


4

Thứ nhất, theo như tôi biết, chú Bob là một người Java, điều này rất quan trọng để hiểu những gì ông nói.

Khi làm việc trong nhóm Java hoặc C #, nếu mã hiện tại đã được viết bởi các nhà phát triển có kinh nghiệm, tôi sẽ dễ dàng chọn phong cách mã hóa và theo kịp nó. Nếu tôi không sẵn lòng làm điều đó, có lẽ tôi không phải là người phù hợp với công việc ... Nếu không có đánh giá mã hoặc lập trình cặp để đón tôi khi tôi không giữ đúng phong cách, thì công ty có vấn đề lớn hơn so với cách tôi đặt tên các lĩnh vực thành viên!

Cả Java và C #, cùng với hầu hết các ngôn ngữ hiện đại, đã được xác định để có một số bẫy "đơn giản" để lập trình viên rơi vào.

Tuy nhiên khi tôi bắt đầu lập trình tôi đang sử dụng C (và sau này là C ++). Trong C bạn có thể viết mã như

if (a = 3);
{
   /* spend a long time debugging this */
}

Trình biên dịch sẽ không đưa ra lỗi và rất khó phát hiện khi đọc nhiều mã. Tuy nhiên, nếu bạn viết:

if (3 = a)
{
   /* looks odd, but makes sense */
}

Trình biên dịch đưa ra một lỗi và tôi dễ dàng thay đổi mã thành 3 == a. Tương tự, nếu tiêu chuẩn mã hóa không cho phép =được sử dụng trong một ifđiều kiện hoặc " ifcâu lệnh trống ", thì trình kiểm tra mã có thể được sử dụng như một phần của hệ thống xây dựng để theo dõi lỗi này.

Quan điểm của tôi về các tiêu chuẩn mã hóa đã thay đổi rất nhiều khi tôi rời khỏi C / C ++: Tôi đã từng thích các tiêu chuẩn mã hóa được thi hành nghiêm ngặt và dài nhiều trang. Bây giờ tôi nghĩ rằng bạn chỉ cần liệt kê các công cụ đang được sử dụng và có được thỏa thuận không chính thức giữa các thành viên trong nhóm ban đầu về một vài quy ước đặt tên. Chúng tôi không còn sống trong một thế giới gồm hơn 30 nhà phát triển viết ứng dụng bằng C / C ++ ...

Có một lý do tôi không bao giờ thích JScript và nghĩ rằng TypeScript là điều tốt nhất sẽ xảy ra để phát triển web trong nhiều năm. Tôi hy vọng rằng các nhà phát triển giao diện người dùng web vẫn cần các tiêu chuẩn mã hóa do các khiếm khuyết trong thiết kế HTML / CSS / JScript, v.v.


4
"Trình biên dịch sẽ không báo lỗi" hầu hết các trình biên dịch C và C ++ hiện đại đều hỗ trợ báo cáo hành vi đó với các cảnh báo hoặc, nếu muốn, các lỗi đầy đủ. gcc.gnu.org/onlinesocs/gcc/Warning-Options.html
JAB

2
"Đầu tiên theo như tôi biết chú Bob là một người Java, điều này rất quan trọng trong việc hiểu những gì ông nói", điều đó không đúng, chú Bob đã viết những bài báo tuyệt vời về C ++ và ông chắc chắn cũng đã làm việc với C vài năm.
Alessandro Teruzzi

@JAB, Rất may C / C ++ đã ngừng sử dụng cho các "ứng dụng kinh doanh" mới từ lâu, (ví dụ: trước trình biên dịch modem C / C ++), và hiện tại hầu như chỉ được sử dụng bởi các chuyên gia C / C ++, thay vào đó là những người là chuyên gia UI (MFC) chẳng hạn.
Ian

1
@AlessandroTeruzzi Một bài kiểm tra đơn vị sẽ cho bạn biết rằng một phương pháp đang thất bại. Tại sao nó thất bại lại là một vấn đề khác - ngay cả khi bạn đã kiểm tra đơn vị cho một phương thức với loại mã đó, bạn sẽ rất khó khăn để cố gắng tìm ra điều gì sai. C ++ là một trong những ngôn ngữ trừng phạt nhất để gỡ lỗi.
T. Sar

2
Tôi nghĩ rằng có một sự hiểu lầm ở đây, bạn không thể lấy một câu của chúBob và phân tích nó một cách cô lập. Nếu bạn có phần mềm RẮN với các lớp nhỏ, phương pháp ngắn và kiểm tra đơn vị chống đạn thì tiêu chuẩn mã hóa là không cần thiết. Nếu bạn có mã yếu, giao diện lớn, chức năng lớn và độ bao phủ ít, tiêu chuẩn mã hóa có thể mang lại cho bạn một số lợi ích. Nhưng, chúBob không đề xuất không có, mà là truyền bá nó bằng lời nói với sự hợp tác và tái cấu trúc (loại bỏ mã yếu khỏi cơ sở nguồn). Làm cho mã của bạn trở thành tiêu chuẩn mã hóa sống.
Alessandro Teruzzi

3

Có nguồn là tiêu chuẩn mã hóa tài liệu tự ngụ ý hai điều.

  1. Mọi người phải tham khảo cơ sở mã và xem xét nó để trở thành người đóng góp thành thạo. Điều này là vô cùng quan trọng. Đọc hướng dẫn mã hóa là một sự lãng phí thời gian so với việc đi sâu vào cơ sở mã.
  2. Nó thừa nhận rằng sự khác biệt nhỏ là không quan trọng. Điều quan trọng là phải đồng ý và hiểu các nguyên tắc cơ bản. Duy trì một phong cách nhất quán không được theo đuổi vì tôi sẽ đổ. Nó không cho phép những kẻ lừa đảo không sáng tạo làm phiền và đánh lạc hướng người khác. Đó là về việc tạo điều kiện giao tiếp thông qua mã trong một nhóm.

2

Một tài liệu tiêu chuẩn mã được cập nhật thường xuyên và được viết tốt có thể rất hữu ích, nhưng thường thì đây không phải là trường hợp. Tài liệu tiêu chuẩn không phản ánh các tiêu chuẩn mã hóa thực tế được sử dụng bởi công ty vì rất khó để tạo ra một tài liệu tiêu chuẩn tốt và thậm chí còn khó khăn hơn để giữ cho nó cập nhật.

Thay vì có một tài liệu tiêu chuẩn mã hóa kém và sai lệch, tốt hơn là không có và để cho chính mã đại diện cho các tiêu chuẩn đó. Dù bằng cách nào, phần quan trọng nhất là áp dụng các tiêu chuẩn trong mã và điều này đòi hỏi nhiều hơn là một tài liệu. Động lực, quy trình, đào tạo, công cụ, vv là quan trọng hơn nhiều.


2

Một điều rất quan trọng chưa được nêu rõ ràng là các tiêu chuẩn mã hóa giống như ngôn ngữ: chúng phát triển. Một tiêu chuẩn mã hóa bằng văn bản cản trở điều này, và nếu nó không liên tục lỗi thời và vô dụng.

Không có một tiêu chuẩn mã hóa đóng đinh không phải là xấu. Nếu bạn thực hiện đánh giá ngang hàng khi đăng ký, bất cứ khi nào điều gì đó không tuân thủ tiêu chuẩn mã hóa đi vào kho lưu trữ có nghĩa là 2 người nghĩ về nó * và quyết định lợi ích của biến thể này lớn hơn sự không nhất quán với phần còn lại của mã.

Không có một tiêu chuẩn được viết ra cũng loại bỏ băng đỏ sẽ ngăn một nhóm công ty thử một biến thể mới của tiêu chuẩn mã hóa cho một dự án mới, vì họ muốn thử một cái gì đó, hoặc có thể vì một tiêu chuẩn khác có các ứng dụng thực tế trên một số công cụ tự động họ sử dụng.

Viết ra một tiêu chuẩn có xu hướng loại bỏ tính linh hoạt hơn so với dự định ban đầu, trong khi cũng chiếm khá nhiều thời gian có thể được dành để làm những việc khác. Tôi không nói rằng bạn không nên viết tiêu chuẩn mã hóa, các tiêu chuẩn bằng văn bản chắc chắn có lợi ích của chúng, đặc biệt nếu các nhóm làm việc ở các vị trí khác nhau làm việc trên cùng một cơ sở mã.

Liên quan chặt chẽ: Sự phát triển trong các tiêu chuẩn mã hóa, làm thế nào để bạn đối phó với chúng?


* Nếu mọi người không nghĩ trong khi xem xét mã ngang hàng khi đăng ký, vấn đề của bạn lớn hơn nhiều so với chỉ tiêu chuẩn mã hóa.


1

Thay đổi chúng trở thành một trở ngại lớn, và mọi người sẽ tuân thủ một cách an toàn thư pháp luật thay vì tham gia vào bộ não và làm điều đúng đắn.

Sẽ đến một ngày khi một phần của tiêu chuẩn không có ích, và làm cho mã trở nên tồi tệ hơn. Một số người sẽ tuân thủ tiêu chuẩn, bởi vì nó được viết ra và chúng an toàn, và bởi vì các quy tắc phải được tuân theo. Những người muốn viết mã tốt hơn là mã tuân thủ tiêu chuẩn sẽ thất vọng và tức giận. Sẽ có những tranh luận và bất đồng, trong khi nếu tiêu chuẩn không được viết ra, sẽ có sự thăm dò và thảo luận.


0

Tôi nghĩ rằng nhiều bài viết ở đây là nhầm lẫn tiêu chuẩn mã hóa với hướng dẫn phong cách .

Đảm bảo rằng các mô-đun được phát triển bởi các nhóm khác nhau có cùng tùy chọn trình biên dịch và ABI là một loại khác với số lượng khoảng trống được thụt lề.

Những thứ như cách thích hợp để cấu trúc các tệp #incoide và không gây ô nhiễm không gian tên toàn cầu trong tệp tiêu đề phải được ghi lại để chúng có thể được sử dụng làm danh sách kiểm tra trong quá trình đánh giá mã và mã ban đầu.

Cụ thể là "không sử dụng XXX vì nó gây ra sự cố tương thích với YYY" không phải là thứ bạn sẽ thấy bằng ví dụ khi theo mã khác, vì nó không có ở đó. Vì vậy, hãy để mã là cách các tiêu chuẩn được nắm bắt có thể không rõ ràng hoặc thiếu hoàn toàn đối với một số loại tiêu chuẩn, và do đó đây không thể là một kế hoạch phổ quát.

Một cái gì đó có sức lan tỏa nghiêm trọng và quan trọng như không sử dụng ngoại lệ hoặc không sử dụng newtrong một số hệ thống nhúng nhất định thể chỉ đơn giản là kiến ​​thức văn hóa chung, vì "thông tin là văn hóa (chỉ)" mâu thuẫn với các nguyên tắc cơ bản của tiêu chuẩn sản xuất như ISO-9000, rằng nhà phát triển các hệ thống nhúng này đang sử dụng (ví dụ cho các ứng dụng ô tô). Những điều quan trọng này phải được ghi lại, ký tắt và nộp đi một cách chính thức.

Nhưng điều đó áp dụng cho mã hóa , không phải cho phong cách .

Các nhà phát minh của C và C ++ cho thấy, ví dụ, việc sử dụng tên viết thường và không phải CaMelCaSe. Vậy tại sao nhiều nhà phát triển không làm theo ví dụ ngầm từ fount? Không phải phong cách của thư viện tiêu chuẩn và các tài liệu giảng dạy kinh điển có phải là phong cách ngầm để tuân theo không?

Trong khi đó, mọi người làm theo ví dụ về các tiêu đề thư viện tiêu chuẩn cho những thứ không nên sao chép, như việc sử dụng __Uglytên cho các tham số macro và mẫu không lặp lại của tệp bao gồm.

Vì vậy, có những thứ thường không được xem là phong cách quan trọng, hoặc ngược lại có những ví dụ có thể không rõ ràng về những gì không nên tuân theo trong mã dự án. Cả hai đều là ví dụ cho luận điểm rằng "phong cách" (hay quy ước mã hóa) là tốt nhất để lại ẩ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.