Nó có nghĩa gì khi viết mã tốt mã vùng Viking? [đóng cửa]


41

Trong câu hỏi này tôi đã hỏi liệu việc trở thành một nhà văn tồi có cản trở bạn viết mã tốt hay không. Nhiều câu trả lời bắt đầu với "nó phụ thuộc vào ý của bạn bởi mã tốt".

Có vẻ như thuật ngữ "mã tốt" và "mã xấu" rất chủ quan. Vì tôi có một quan điểm, nên có thể rất khác với quan điểm của người khác về họ.

Vậy viết "mã tốt" nghĩa là gì? "Mã tốt" là gì?


15
Mã tốt là nếu bạn nhìn vào nó sau hai năm và suy nghĩ đầu tiên của bạn không phải là "Dude, wtf".
Bobby

Câu trả lời:


91

Một lập trình viên giỏi giống như một người chơi bi-a giỏi.

Khi bạn nhìn thấy một người chơi bi-a chuyên nghiệp, ban đầu bạn có thể không ấn tượng: "Chắc chắn, họ có tất cả các quả bóng trong, nhưng họ chỉ có những cú đánh dễ dàng!" Đó là bởi vì, khi một người chơi bi-a đang thực hiện cú đánh của mình, cô ấy không nghĩ về quả bóng nào sẽ đi vào túi nào, cô ấy cũng đang nghĩ về việc quả bóng sẽ kết thúc ở đâu . Thiết lập cho lần chụp tiếp theo đòi hỏi kỹ năng và thực hành rất lớn, nhưng điều đó cũng có nghĩa là nó có vẻ dễ dàng.

Bây giờ, đưa phép ẩn dụ này vào mã, một lập trình viên giỏi viết mã có vẻ như nó rất dễ dàng và đơn giản để làm . Nhiều ví dụ của Brian Kernighan trong các cuốn sách của ông theo mô hình này. Một phần của "mánh khóe" là đưa ra một khái niệm đúng đắn về vấn đề và giải pháp của nó . Khi chúng ta không hiểu rõ vấn đề đủ, chúng ta có nhiều khả năng làm phức tạp hóa các giải pháp của mình và chúng ta sẽ không thấy các ý tưởng thống nhất.

Với một khái niệm đúng đắn của vấn đề, bạn sẽ có được mọi thứ khác: khả năng đọc, khả năng duy trì, hiệu quả và tính chính xác. Bởi vì giải pháp có vẻ rất đơn giản, có thể sẽ có ít bình luận hơn, bởi vì giải thích thêm là không cần thiết. Một lập trình viên giỏi cũng có thể nhìn thấy tầm nhìn dài hạn của sản phẩm và hình thành khái niệm của họ theo đó.


10
"một lập trình viên giỏi viết mã có vẻ như nó dễ dàng và đơn giản để làm." << CHÍNH XÁC! Tôi nghĩ điều này là bởi vì mọi người thường nghĩ rằng một lập trình viên giỏi là người có thể viết những bản hack rất "thông minh". Nếu mã sạch và không quá "thông minh", nó phải dễ dàng, phải không?
hasen

3
2 xu của tôi: khi bạn có một ngôn ngữ với các phép tái cấu trúc tự động EASY - Java và C # là hai ví dụ tôi biết rõ nhất - thật dễ dàng để chuyển sang mã tốt lặp đi lặp lại. Nếu không, bạn phải khái niệm tốt ngay từ đầu, nhưng có một loại vấn đề trứng gà ở đó.
Dan Rosenstark

3
Một số thuật toán về bản chất là phức tạp. Một lập trình viên giỏi sẽ không gặp vấn đề gì khi viết chúng khi chúng thực sự cần thiết - và giữ cho chúng dễ đọc nhất có thể.
J-16 SDiZ

2
@hasenj: vâng, điều này là do bổ đề này: những người ngu ngốc viết mã trình biên dịch hiểu. Người thông minh viết mã người ngu hiểu.
v.oddou

49

WTF mỗi phút

( bản gốc )


EDIT: Ý tưởng cơ bản là "Chất lượng mã" không thể được đưa vào quy tắc, giống như cách bạn không thể đặt "Nghệ thuật tốt" hoặc "Thơ hay" vào quy tắc để bạn có thể để máy tính xác định nói "Có, nghệ thuật tốt" hoặc "Không, thơ dở". Hiện tại cách duy nhất là xem mã dễ hiểu như thế nào đối với người khác.


1
Chúng tôi có điều này bị mắc kẹt trên bảng trắng của chúng tôi tại nơi làm việc :-)
Không ai vào

1
@Cape Cod Gunny cũng có trong một cuốn sách của chú Bob
mlvljr

2
Ngoài việc là một phim hoạt hình tuyệt vời, tôi nghĩ rằng nó thực sự đạt đến điểm - mã tốt là mã mà người khác thấy dễ chịu để đọc và duy trì.
FinnNk

1
Vì vậy, đúng, mã tốt là bất kỳ mã nào không xấu. Ví dụ, rất khó để xác định mã tốt, việc xác định mã xấu sẽ dễ dàng hơn.
Ernelli

5
Thông thường tôi tìm thấy những "WTF?" Trong cuộc họp mã tốt ngay sau đó là "Oooooh Được rồi ... Tôi thấy những gì bạn đã làm."
AndrewKS

7

Thực sự không có tiêu chí tốt nào ngoài việc bạn có thể hiểu mã nhanh như thế nào. Bạn làm cho mã của bạn trông tốt bằng cách tìm sự thỏa hiệp hoàn hảo giữa sự cô đọng và dễ đọc.

"WTF's per phút" (ở trên) là đúng nhưng đó chỉ là hệ quả của quy tắc chung hơn. WTF càng nhiều sự hiểu biết càng chậm.


1
@rmx: định nghĩa "làm tốt công việc"
mojuba

2
Vâng, đó là RemoveCustomerphương pháp thực sự loại bỏ các cutome mà không vặn lên. Bạn có thể dành hàng giờ để làm cho nó trông đẹp, nhưng điều đó không có nghĩa là nó thực sự hoạt động. 'Bạn có thể hiểu mã nhanh như thế nào' không phải là tiêu chí duy nhất cho 'mã tốt' là những gì tôi đang nói.
Không ai vào

2
@rmx: nhưng không có lỗi là ngụ ý, phải không? Nếu mã của bạn không thực hiện đúng công việc, thì đó không phải là mã (chưa).
mojuba

4
@rmx: trên thực tế, không. Nếu mã của bạn dễ hiểu, thì cuối cùng, thật dễ hiểu nếu nó hoạt động kém. OTOH, nếu khó hiểu, thật khó hiểu nếu nó hoàn toàn không hoạt động.
thuốc

2
@rmx: PS nói một cách đơn giản, phần giảm của bạn () là một WTF cổ điển và do đó nó làm chậm sự hiểu biết về các phần của mã nơi chức năng này được sử dụng
mojuba

5

Bạn biết bạn viết mã tốt khi ...

  1. Khách hàng rất vui
  2. Đồng nghiệp mượn mã của bạn làm điểm bắt đầu
  3. Anh chàng / cô gái hoàn toàn mới được yêu cầu sửa đổi hệ thống mà bạn đã xây dựng 6 tháng trước và anh ấy / cô ấy chưa bao giờ hỏi bạn một câu hỏi
  4. Sếp của bạn yêu cầu bạn phát triển các vật dụng mới để nhóm sử dụng
  5. Bạn nhìn vào mã bạn viết hôm nay và nói với chính mình "Tôi ước tôi đã viết mã như thế này hai năm trước"

Làm thế nào để bạn đo xem mã có tốt không ...

  • Thời gian đáp ứng là gì?
  • Nó thực hiện bao nhiêu chuyến đi khứ hồi đến máy chủ?
  • Cá nhân bạn sẽ sử dụng ứng dụng hay bạn nghĩ nó thật rắc rối?
  • Bạn sẽ xây dựng nó theo cách tương tự vào lần tới?

Mã tốt hoạt động khi nó được yêu cầu. Mã tốt có thể dễ dàng được sửa đổi khi cần. Mã tốt có thể được tái sử dụng để kiếm lợi nhuận.


2
"Khách hàng hài lòng" là trực giao với điều này.

1
@TRA - Nếu khách hàng hài lòng, điều đó có nghĩa là bạn đã hiểu các yêu cầu và cung cấp một giải pháp mà họ mong đợi.
Michael Riley - AKA Gunny

6
chắc chắn nhưng mã xấu có thể làm như vậy.

4

Một mã đó là

  1. không có lỗi

  2. tái sử dụng

  3. độc lập

  4. Ít phức tạp hơn

  5. tài liệu tốt

  6. dễ dàng trò chuyện

được gọi là mã tốt.

Một chương trình tốt hoạt động hoàn hảo và không có lỗi. Nhưng những phẩm chất bên trong tạo ra sự hoàn hảo như vậy?. Không có gì bí ẩn, chúng tôi chỉ cần thỉnh thoảng nhắc nhở. Cho dù bạn viết mã bằng C / C ++, C #, Java, Basic, Perl, COBOL hoặc ASM, tất cả các chương trình tốt đều thể hiện những phẩm chất được tôn vinh theo thời gian: đơn giản, dễ đọc, mô đun, xếp lớp, thiết kế, hiệu quả, thanh lịch và rõ ràng, thanh lịch và rõ ràng

Nguồn: MSDN


Đơn giản, dễ đọc, sang trọng và rõ ràng là tất cả cùng một điều. Modularity và layering chỉ là phương pháp làm cho mã của bạn rõ ràng và thanh lịch. Điều duy nhất còn lại trong danh sách sau đó là hiệu quả, đó là loại ngụ ý, và bên cạnh đó thường là vấn đề thỏa hiệp giữa hiệu quả và sự rõ ràng.
mojuba

Kiểm tra điều này: goo.gl/hdQt8
Chankey Pathak

2
Mã có thể không có lỗi?
Casey Patton

Không, nó không thể. (Thực tế)
Chankey Pathak

Hiệu quả nên được thêm vào danh sách của bạn. Tốc độ không nhất thiết là một chỉ số chính của mã tốt, nhưng mã tốt không nên chậm hoặc lãng phí một cách không cần thiết.
Caleb

3

Điều này có vẻ quen thuộc?

Philips đã cho tôi cơ hội để xem thiết kế của một sản phẩm mới. Khi nó phát triển, tôi ngày càng khó chịu và bắt đầu tâm sự những lo lắng của mình với người giám sát. Tôi đã nhiều lần nói với anh ấy rằng các thiết kế không phải là sạch, và đó phải là những người đẹp theo cách mà các thiết kế của Dijkstra rất đẹp. Ông không thấy đây là một bình luận hữu ích. Anh ấy nhắc nhở tôi rằng chúng tôi là kỹ sư, không phải nghệ sĩ. Trong tâm trí anh ấy, tôi chỉ đơn giản là bày tỏ sở thích của mình và anh ấy muốn biết tôi đang sử dụng tiêu chí nào để đưa ra đánh giá. Tôi đã không thể nói với anh ấy! Bởi vì tôi không thể giải thích những nguyên tắc nào đã bị vi phạm, những bình luận của tôi chỉ đơn giản là bị bỏ qua và công việc tiếp tục. Cảm thấy rằng phải có một cách để giải thích và cung cấp động lực cho vị giác của tôi, Tôi bắt đầu cố gắng tìm ra một nguyên tắc phân biệt các thiết kế tốt với các thiết kế xấu. Các kỹ sư rất thực dụng; họ có thể ngưỡng mộ vẻ đẹp, nhưng họ tìm kiếm tiện ích. Tôi đã cố gắng tìm một lời giải thích về lý do tại sao người đẹp Viking có ích.

Xin vui lòng xem phần còn lại ở đây .


1
Vì liên kết trong bài viết @ mlvljr của bị phá vỡ, đây là một liên kết đến trang Google Sách: books.google.co.in/...
balajeerc

@balajeerc Cảm ơn (Tôi cũng đã sửa liên kết, do đó, nó trỏ đến một phiên bản được lưu trữ trên Springer của cùng một pdf) :)
mlvljr

1

ngoài các tiêu chí chất lượng mã tự nhiên (sao chép / dán tối thiểu, không có spaghetti, v.v.), một mã công nghiệp tốt phải luôn trông hơi ngây thơ, hơi quá dài dòng, như

int key = i;
const bool do_not_create = false;
Record r = cache.get(key, do_not_create);
++i;

như trái ngược với

Record r = cache.get(i++, false);

Nhưng điều đó do_not_create = falsecó nghĩa là vượt qua falsenhư là do_not_createđối số để nó sẽ được tạo ra hay vượt qua falsenhư là do_createđối số để nó sẽ không được tạo ra? Trong một ngôn ngữ mà bạn có thể sử dụng tên đối số tôi muốn cache.get (key:i, create: false); i += 1;.
PJTraill

1

Có lẽ một câu trả lời bằng cách minh họa điều ngược lại sẽ có ích (cộng với đó là lý do để đưa XKCD vào đây).

văn bản thay thế

Mã tốt là

  • đơn giản để hiểu
  • dễ bảo trì,
  • không cố gắng giải quyết tất cả các vấn đề chỉ có một trong những
  • tồn tại trong một thời gian dài mà không khiến các nhà phát triển tìm kiếm các lựa chọn thay thế

Những ví dụ bao gồm

  • Cộng đồng Apache
  • Khung mùa xuân
  • Khung ngủ đông

1

Tôi chỉ đơn giản là đi với "duy trì"

Tất cả các mã phải được duy trì: không cần phải thực hiện nhiệm vụ đó khó khăn hơn mức cần thiết

Nếu bất kỳ người đọc nào không hiểu yêu cầu đơn giản này hoặc cần nó đánh vần, thì người đọc đó không nên viết mã ...


1

Mã tốt sẽ khác nhau đối với mỗi người và ngôn ngữ mà họ đang làm việc cũng có tác động đến những gì có thể được coi là mã tốt. Nói chung khi tôi tiếp cận một dự án tôi tìm kiếm những điều sau đây:

  • Dự án được tổ chức như thế nào? Các tệp nguồn được sắp xếp một cách sạch sẽ và tôi có thể tìm mã với quá nhiều nỗ lực không?
  • Mã được tổ chức như thế nào? Được ghi lại rõ ràng những gì mã trong tệp làm, chẳng hạn như thông qua việc sử dụng tiêu đề tệp hoặc thông qua việc sử dụng mỗi lớp nằm trong tệp riêng của mình? Có chức năng nào trong tệp không còn được sử dụng trong ứng dụng không?
  • Các chức năng được tổ chức như thế nào? Có một mẫu rõ ràng về nơi các biến được khai báo, hoặc nó là một mẫu khá ngẫu nhiên? Liệu mã có một luồng logic đến nó và tránh các cấu trúc điều khiển không cần thiết? Có phải mọi thứ đều được ghi lại rõ ràng với mã là tự ghi lại tài liệu khi cần và các bình luận thể hiện rõ ràng lý do tại sao và / hoặc làm thế nào những gì mã đang làm?

Ngoài tất cả những điều này, liệu thiết kế của ứng dụng có ý nghĩa như một tổng thể? Mã nằm trong ứng dụng có thể là tốt nhất trên thế giới, nhưng vẫn có thể gây khó khăn nếu thiết kế tổng thể của ứng dụng không có ý nghĩa.


1

Hãy để tôi vui lòng không đồng ý về khả năng đọc. Không, không hoàn toàn: Mã tốt nên có thể đọc được, và điều đó có thể dễ dàng đạt được với đủ ý kiến.

Nhưng tôi xem xét hai loại WTF: những nơi mà bạn tự hỏi liệu lập trình viên có tiến xa hơn lập trình 101 hay không, và những nơi bạn hoàn toàn không nắm bắt được tính nguyên bản của mã. Một số mã ban đầu có thể trông rất lạ, nhưng thực sự là một giải pháp rất sáng tạo cho một vấn đề khó khăn. Cái thứ hai không nên tính vào đồng hồ WTF và có thể tránh được bằng các bình luận.

Mã rất dễ đọc có thể rất, rất chậm. Một giải pháp ít đọc hơn có thể giúp cải thiện tốc độ gấp nhiều lần. R là một ví dụ tuyệt vời về ngôn ngữ thường là đúng. Một người thích tránh vòng lặp ở đó càng nhiều càng tốt. Nói chung, tôi coi mã nhanh nhất là mã tốt hơn mặc dù nó ít đọc hơn. Đó là, nếu sự cải tiến là không đáng kể, và đủ các bình luận được đưa vào để giải thích những gì mã làm.

Thậm chí, quản lý bộ nhớ có thể rất quan trọng trong nhiều ứng dụng khoa học. Mã rất dễ đọc, có xu hướng cẩu thả trong việc sử dụng bộ nhớ: chỉ có nhiều đối tượng được tạo. Trong một số trường hợp, việc sử dụng bộ nhớ thông minh làm cho mã trở nên ít đọc hơn. Nhưng nếu bạn tung hứng xung quanh hàng gigabyte chuỗi DNA chẳng hạn, bộ nhớ là một yếu tố rất quan trọng. Một lần nữa, tôi coi mã ít bộ nhớ hơn là mã tốt hơn, bất kể khả năng đọc.

Vì vậy, có, khả năng đọc là quan trọng cho mã tốt. Tôi biết adagium của Uwe Liggis: Suy nghĩ đau và máy tính là rẻ. Nhưng trong lĩnh vực của tôi (genomics thống kê), thời gian tính toán trong một tuần và việc sử dụng bộ nhớ trên 40 Gb không được coi là bất thường. Vì vậy, một sự cải thiện gấp đôi tốc độ và một nửa bộ nhớ đáng giá hơn rất nhiều so với mức độ dễ đọc thêm đó.


Không có quy tắc / quy tắc nào không có ngoại lệ
user2664856 18/03/2015

1
Hãy để tôi không đồng ý với sự bất đồng của bạn: bạn nói rằng trong lĩnh vực của bạn tốc độ rất quan trọng và nói rằng nó quan trọng hơn khả năng đọc. Tôi không đồng ý, bạn nên cố gắng sử dụng sự cân bằng phù hợp. Nếu tốc độ là không cần thiết, ví dụ đối với giao diện cấp cao, bạn có thể thích thứ gì đó dễ bảo trì, nếu cần tốc độ thì tôi đồng ý với bạn. Thay vì các quy tắc cứng, tốt hơn là sử dụng thông thường và bạn nên tránh tối ưu hóa sớm.
BlueTrin

@BlueTrin Tại sao không phải cả bộ não biên dịch mã nguồn hi-perf đó, và cũng ghi lại địa ngục của những gì đang diễn ra ở đó (ngay trong bình luận)?
mlvljr

1

Theo như tôi biết ... Tôi biết tôi đang viết mã tốt khi một đồng nghiệp làm việc trong dự án khác xuất hiện và có thể nhảy vào và hiểu những gì tôi đang làm mà không cần tôi đi qua từng khối mã và cho thấy những gì nó đang làm.
Thay vì anh ta nói, "Đợi một chút, cái gì?!" Anh ấy nói, "Ồ, ok, tôi thấy những gì bạn đã làm ở đó."

Mã tốt cũng không có nhiều cách giải quyết lén lút hoặc 'hack'. Dòng khi, trong khi bạn viết nó, bạn cũng tự nói với mình: "Tôi biết đây không phải là cách hay để làm, nhưng bây giờ tôi sẽ phải làm theo cách này. Tôi sẽ nhắc nhở bản thân tôi sẽ cải thiện nó sau ... "


1

Có rất nhiều tính năng của mã 'tốt', nhưng quan trọng nhất, IMHO, là khả năng đọc và bảo trì.

Mã của bạn sẽ chứa các lỗi, có thể sẽ được mở rộng và sử dụng lại và phải được cấp lại vào một lúc nào đó - ngay cả khi bạn đang truy cập lại nó, rất có thể bạn sẽ không biết gì về địa ngục bạn đã làm ngay từ đầu, để giúp đỡ bản thân và không đặt bất kỳ rào cản nào.

Chắc chắn, sử dụng thuật toán phức tạp nhưng hiệu quả cao này, nhưng hãy đảm bảo rằng bạn dành thêm một chút thời gian để ghi lại nó, nhưng nếu không thì làm cho mã của bạn rõ ràng và nhất quá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.