Tại sao sự thông minh được coi là có hại trong lập trình bởi một số người?


89

Gần đây tôi đã nhận thấy rất nhiều câu hỏi liên quan đến các kỹ thuật trừu tượng khác nhau và các câu trả lời về cơ bản là các kỹ thuật trong câu hỏi là "quá thông minh". Tôi nghĩ rằng một phần công việc của chúng tôi là lập trình viên là xác định các giải pháp tốt nhất cho các vấn đề chúng tôi đưa ra để giải quyết, và sự thông minh là hữu ích trong việc đó.

Vì vậy, câu hỏi của tôi là: những người nghĩ rằng các kỹ thuật trừu tượng nhất định là quá thông minh trái ngược với sự thông minh mỗi se , hoặc có một số lý do khác cho sự phản đối?

EDIT: Bộ kết hợp trình phân tích cú pháp này là một ví dụ về những gì tôi sẽ coi là mã thông minh. Tôi đã tải xuống cái này và xem nó trong khoảng nửa giờ. Sau đó tôi bước qua phần mở rộng vĩ mô trên giấy và thấy ánh sáng. Bây giờ tôi đã hiểu nó, nó có vẻ thanh lịch hơn nhiều so với trình kết hợp trình phân tích cú pháp Haskell.


116
Tôi nghĩ có lẽ bạn đang hiểu lầm - sự thông minh ở một người là một đức tính, nhưng sự thông minh trong một hệ thống là một điểm trừ. Hệ thống và mã không nên khéo léo, chúng phải rõ ràng như pha lê. Nó thường mất một cá nhân thông minh để tạo ra những thứ như vậy.
nlawalker


15
@nlawalker: Tôi nghĩ rằng tôi nhận được nó ngay bây giờ. Người ta dùng từ "thông minh" khi đề cập đến mã như một phản nghĩa cho "rõ ràng" hoặc "đơn giản" bởi vì họ thực sự có nghĩa là sử dụng một từ mà một phản nghĩa cho "rõ ràng" hoặc "đơn giản".
Larry Coleman

2
@Larry: Tôi không chắc điều đó có nghĩa gì. Khéo léo như trong sáng tạo, nguyên bản, khéo léo và bằng cách sử dụng những thứ theo cách bạn chưa từng thấy trước đây. Đôi khi nó thật tuyệt (rất nhiều mẫu thiết kế rất thông minh) nhưng tính ngoại lai của giải pháp cũng có thể gây khó khăn khi làm việc.
doppelgreener

2
Không ai bình luận mã nữa? Đó là nơi bạn giải thích sự thông minh, vì vậy những người theo dõi có thể hiểu. Giống như bạn trong thời gian 6 tháng.
Phil Lello

Câu trả lời:


207

Các giải pháp đơn giản là tốt hơn để bảo trì dài hạn. Và nó không chỉ luôn là về sự quen thuộc ngôn ngữ. Một dòng (hoặc dòng) phức tạp cần có thời gian để tìm hiểu ngay cả khi bạn là một chuyên gia về ngôn ngữ đã cho. Bạn mở một tập tin và bắt đầu đọc: "ok, đơn giản, đơn giản, hiểu rồi, vâng, WTF?!" Bộ não của bạn dừng lại ở tiếng rít và bây giờ bạn phải dừng lại và giải mã một dòng phức tạp. Trừ khi có một lý do cụ thể, có thể đo lường được cho việc thực hiện đó, đó là "quá thông minh".

Tìm hiểu những gì đang diễn ra ngày càng khó khăn hơn khi sự phức tạp tăng dần từ một phương pháp thông minh sang một lớp thông minh thành một mô hình thông minh. Bên cạnh những cách tiếp cận nổi tiếng, bạn phải tìm ra quá trình suy nghĩ để tạo ra một giải pháp "thông minh", có thể khá khó khăn.

Điều đó nói rằng, tôi ghét tránh một mô hình (khi việc sử dụng nó là hợp lý) chỉ vì ai đó có thể không hiểu nó. Chúng tôi tùy thuộc vào việc các nhà phát triển tiếp tục học hỏi và nếu chúng tôi không hiểu điều gì đó, đó là lý do để học nó, không phải để tránh nó.


7
+1 Độc đáo nói. Tôi nghĩ đó là một điều cân bằng. Nếu tôi có thể mong đợi một người có lượng kiến ​​thức kha khá để hiểu được mã với một chút suy nghĩ về bản thân, bạn có thể thông minh và có thể thêm một nhận xét. Nếu phải mất bốn lần thời gian để hiểu mã chỉ vì ai đó muốn chứng minh kỹ năng mã hóa của họ - nah! Nếu ai đó đủ thông minh để đưa ra giải pháp thông minh, họ nên đủ thông minh để quyết định liệu điều đó có dễ hiểu hay không. Nếu không, nó chỉ hiển thị.
Anne Schuessler

Đoạn cuối tôi thích. Phần còn lại là đúng, nhưng không may.
Orble

Có vẻ như bạn đã thấy mã nguồn của Zend PHP :)
Tim Post

+1 Một mẫu đơn giản có thể không thực hiện tốt như một mẫu thông minh , và như bạn đã nói, tùy thuộc vào chúng tôi, các nhà phát triển sẽ tiếp tục thúc đẩy phong bì "thông minh" bằng cách hiểu nó.
Stephen Furlani

3
Là một người phải biện minh cho việc làm một cái gì đó "thông minh" khi nó thực sự chỉ là "tối thiểu, chính xác trực quan", tôi muốn nói thêm rằng có một số chủ quan về câu hỏi chính xác là thông minh. Ví dụ, một số người sẽ luôn muốn viết ra if FuncX() then return true, else return falsevà sẽ không bao giờ muốn bạn chỉ viết return FuncX(). Tôi không đùa, tôi thực sự đã có cuộc trò chuyện đó. Bởi vì mọi người muốn một nơi nào đó để treo điểm dừng của họ, hoặc một cái gì đó. :-)
Warren P

102

Nguyên tắc KISS

Giữ cho nó đơn giản ngu ngốc. Giải pháp thông minh là tuyệt vời, nhưng thường thì giải pháp đơn giản nhất là tốt nhất.

Đầu tiên, gỡ lỗi khó gấp đôi so với viết mã ở vị trí đầu tiên. Do đó, nếu bạn viết mã một cách khéo léo nhất có thể, theo định nghĩa, bạn không đủ thông minh để gỡ lỗi nó.

Brian Kernighan


8
Mặt khác, nếu bạn viết mã một cách khéo léo nhất có thể, thì bạn phải học cách gỡ lỗi nó, và khi làm như vậy bạn sẽ trở nên thông minh hơn. Hoặc điều tương tự.
James McNellis

11
@James: Hoặc bạn thất bại. ;)
Josh K

10
@Josh K: Tôi đã luôn biết KISS là "Giữ nó đơn giản, ngu ngốc!" - en.wikipedia.org/wiki/KISS_principl
Orble

1
@ Đơn giản: Tôi nhớ lại nó khác đi, ồ, giờ thì tôi biết rồi.
Josh K

1
"Giữ nó đơn giản và ngu ngốc" , theo Wikipedia ? :) Điều này có nghĩa là giữ cho nó đơn giản là ngu ngốc hay để giữ cho nó đơn giản, bạn phải ngu ngốc ? : P
Mateen Ulhaq

83

Lừa bỏ qua sự phức tạp; những người thực dụng phải chịu đựng nó; các chuyên gia tránh nó; thiên tài loại bỏ nó. - Alan Perlis


5
+1 cho trích dẫn hay và là câu trả lời đầu tiên mà không có giả định ngầm định rằng một cái gì đó không thể vừa đơn giản vừa thông minh
Larry Coleman

15
Điều quan trọng là chính lập trình viên được cho là thông minh chứ không phải mã.
Kristopher Johnson

Cách tốt hơn trích dẫn sau đó một kẻ ngốc sử dụng từ thông minh một cách thông minh.
Derek Litz

30

Giải pháp tốt nhất không phải lúc nào cũng là giải pháp thông minh nhất. Đôi khi các giải pháp đơn giản cũng tốt như nhau.

Trong Phần mềm, bạn luôn cần suy nghĩ về khả năng bảo trì. Nếu một đoạn mã quá thông minh đối với người sẽ duy trì nó, tôi sẽ nói rằng sự thông minh đó không đáng.


3
Một giải pháp đơn giản cho một vấn đề phức tạp là thông minh như bất cứ ai có thể nhận được.
JeffO

mặc dù luôn có sự cảnh báo mà bạn không muốn đơn giản hóa quá mức chỉ vì người bảo trì không thể mã hóa (hoặc đọc nó).
Ken Henderson

@confuseGeek - nhưng nếu bạn biết lập trình viên bảo trì không thể xử lý nó, thì giải pháp thông minh sẽ trở thành một quả bom hẹn giờ. Cân bằng là chìa khóa ở đây - và điều này chỉ áp dụng nếu bạn tình cờ biết nhóm bảo trì. Nếu bạn không có ý tưởng, thì rõ ràng trong sự thông minh của bạn là điều tốt nhất bạn có thể làm.
Michael Kohne

1
@Michael, các ràng buộc về hiệu suất có thể yêu cầu mã của bạn phải thông minh. Sau đó, đó là công việc của người bảo trì để tìm hiểu và nếu họ không thể, hãy thuê những người bảo trì mới.
Stephen Furlani

@Stephen, nếu mã CẦN phải thông minh, lập trình viên cần hết sức cẩn thận để giải thích TẠI SAO cần phải có, vì vậy người bảo trì không phải bắt đầu từ đầu.

26

Để trích dẫn Brian Kernighan:

Đầu tiên, gỡ lỗi khó gấp đôi so với viết mã ở vị trí đầu tiên. Do đó, nếu bạn viết mã một cách khéo léo nhất có thể, theo định nghĩa, bạn không đủ thông minh để gỡ lỗi nó.


"... Trừ khi bạn sử dụng định nghĩa chính xác về thông minh và mã thực sự đơn giản để hiểu và gỡ lỗi."
Derek Litz

Tôi phụ thuộc vào từ điển whcich bạn ngón tay cái, tôi đoán. Theo kinh nghiệm của tôi, bất kỳ mã "thông minh" nào - dễ hiểu hay không - vẫn khai thác một sự kết hợp may mắn trong thông số kỹ thuật. Ngay cả khi nó rõ ràng, nó nên được đánh dấu nếu một giả định như vậy có thể thay đổi và không nên rò rỉ đến các phần khác nhau của mã.
peterchen

Bạn đã đúng, nhưng tôi muốn thêm lời cảnh báo rằng nó phụ thuộc vào việc ngôn ngữ và cách thực hiện dễ đọc và hiểu, và ý kiến ​​của bạn có thể chỉ là tiếng ồn mã thay vì một cái gì đó hữu ích. Và mặc dù thông thường sử dụng thông minh để có nghĩa ngược lại, chúng ta nên cố gắng rõ ràng hơn để những người khác không thể hiểu sai những điều cho lợi ích riêng của họ.
Derek Litz

Không phản đối điều đó :)
peterchen

22

thông minh là một công cụ; tự nó không có hại. Nó chỉ trở nên có hại trong bối cảnh không cần thiết.


16

"Thông minh", khi được áp dụng cho mã, hầu như luôn luôn chỉ là một uyển ngữ cho "phức tạp không cần thiết".

Đọc mã tốt, rõ ràng, đơn giản là đủ khó. Đọc mã "thông minh" giống như nghiên cứu thơ Latin một lần nữa.

Sự nhầm lẫn xuất hiện bởi vì "thông minh" như một thuộc tính của một người có một ý nghĩa hoàn toàn khác. Trường hợp này cũng có thể được xem là một ví dụ về lý do tại sao thiết kế phần mềm cho người thật là khó: Bởi vì chúng mơ hồ.

Và bởi vì một số lập trình viên đau khổ để hiểu các giao thức xã hội mà hầu hết mọi người tuân theo, điều đó cấm họ trực tiếp tố cáo mã là "phức tạp không cần thiết", họ có thể khó phân biệt giữa hai nghĩa của từ thông minh . Trái với những gì một số người có thể nghĩ, tôi nghĩ cuối cùng thì "người dân" tốt hơn (nghĩa là: những người có sự đồng cảm và hướng nội và kiên nhẫn) làm cho các nhà phát triển tốt hơn. Bởi vì họ biết viết cho ai.


5
Tôi đã khuyến khích điều này nếu bạn không nhận được sự giảng dạy về các giao thức xã hội và "người dân [sic]".
Jason Baker

2
Điều đó ổn - và cảm ơn vì đã nhắc nhở tôi. Tôi có xu hướng trở nên quá rao giảng. Nhưng tôi không hài lòng với một số (nhiều?) Lập trình viên không có khả năng và / hoặc không sẵn lòng đối phó với hành vi thông thường của con người, và sự thiếu đồng cảm và nội tâm chung mà tôi thấy trong lĩnh vực của chúng tôi. Có lẽ tôi nên đặt "người dân" trong dấu ngoặc kép thay vì chữ nghiêng. Tiếng Anh không phải là ngôn ngữ đầu tiên của tôi, tôi chỉ không biết làm thế nào để hiểu rõ hơn, để trở thành một nhà phát triển tuyệt vời, bạn phải hiểu không chỉ mã, mà cả mọi người nữa. IMHO.
fzwo

Chỉnh sửa câu trả lời của tôi. Rõ ràng hơn / ít gây khó chịu hơn bây giờ?
fzwo

+1 cho câu đầu tiên, mà tôi đã thực sự kết luận sau khi nhận được vài câu trả lời đầu tiên.
Larry Coleman

Vâng, cảm ơn bạn đã làm rõ sự thông minh đang được sử dụng bởi những người ngu ngốc trong bối cảnh này!
Derek Litz

9

Hầu hết mọi người đang tập trung vào sự thông minh từ khía cạnh "Mã yêu cầu giải mã quá nhiều để tìm ra những gì nó đang làm" và tất cả những điều tồi tệ đi cùng với điều đó như

  1. Không ai khác có thể tìm ra nó, hãy để một mình duy trì / gỡ lỗi nó.
  2. Người viết thậm chí không biết nó làm gì.
  3. Nó thực sự có thể không phải là tuyệt vời để bắt đầu với
  4. Vân vân....

Tất cả những điểm tốt, nhưng có một khía cạnh tiêu cực khác của sự thông minh và đó là vấn đề bản ngã cũ. Điều này gây ra vấn đề dọc theo dòng

  1. Một người quá "Thông minh" để sử dụng giải pháp của bất kỳ ai khác. Tại sao tìm kiếm những gì người khác đã làm khi bạn có thể phát minh ra cách lột da của chính con mèo đó?
  2. Một số người nghĩ rằng họ đã phát minh ra giải pháp tuyệt vời nhất cho một vấn đề thường sẽ từ chối nhận bất kỳ đầu vào nào.
  3. Không để ai sửa đổi mã "của họ" ngay cả khi có vấn đề rõ ràng hoặc cần thay đổi nhỏ.
  4. Ngược lại, họ nghĩ rằng họ thông minh và cần sử dụng kỹ thuật "mới nhất" để chứng minh họ thông minh như thế nào nhưng không xử lý tốt nó trong các dự án cá nhân hoặc mã không sản xuất trước khi đưa nó vào các phần quan trọng của hệ thống.

Đôi khi chúng ta đều có lỗi với quá nhiều bản ngã, nhưng khi nó cản trở đội bóng thì đó là một vấn đề.


8

Thông minh tốt - tỷ lệ cao giữa các dòng mã thông minh so với các dòng trong một thay thế không thông minh. 20 dòng mã giúp bạn tiết kiệm từ việc viết 20000 là Thông minh cực kỳ tốt. Thông minh tốt là về tiết kiệm công việc của bạn.

Thông minh xấu - tỷ lệ thấp giữa các dòng mã được viết so với các dòng mã được lưu. Một dòng mã thông minh giúp bạn không phải viết năm dòng mã là Bad Clever. Thông minh xấu là về "thủ dâm cú pháp".

Chỉ cần lưu ý: Thông minh xấu gần như không bao giờ được gọi là "Thông minh xấu"; nó sẽ thường đi du lịch dưới các bí danh "đẹp", "thanh lịch", "súc tích" hoặc "cô đọng".


Câu trả lời thú vị, nhưng mã mà bạn gọi là "Thông minh xấu" thực sự được gọi là "đẹp", v.v., bởi bất kỳ ai khác ngoài người đã viết mã trong câu hỏi?
Larry Coleman

2
Phụ thuộc. Trong Objective-C / C ++ / C, hiện tượng thường chỉ giới hạn ở một cá nhân. Trong Perl và Ruby, thường thì toàn bộ cộng đồng sẽ có một giá trị chung về Bad Clever là "đẹp", "thanh lịch", v.v.
user8865

1
@ user8865: đồng thời, mã "Thông minh tốt" cuối cùng dễ gỡ lỗi hơn nhiều so với bản gốc vì theo định nghĩa của bạn, 3 đơn hàng có độ lớn ít hơn.
Larry Coleman

2
À, vậy là các chương trình Perl - bây giờ gần như theo định nghĩa - Thông minh cực kỳ tốt :) Rất vui được biết!

7

Tôi phải tự hỏi về định nghĩa thông minh của mọi người.

Cá nhân, tôi cảm thấy như mình đã thông minh khi thực hiện một vấn đề khó khăn, phức tạp và thực hiện nó theo cách rất đơn giản và dễ dàng, trong khi vẫn duy trì mức hiệu quả chấp nhận được.

tl; dr tôi cảm thấy thông minh khi trong quá trình đánh giá mã, người đánh giá của tôi nói "wow, điều đó dễ hơn tôi nghĩ nó sẽ xảy ra", trái ngược với "wtf là tất cả những điều này .."


1
LOL về tl; dr, bạn nghĩ lập trình viên đọc chậm đến mức nào? Vâng, tôi hoàn toàn coi thường việc lạm dụng thông minh ở đây để có nghĩa ngược lại với những gì nó thực sự là. Các nhà phát triển và quản lý ngu ngốc / ngu dốt / xấu xa thực sự sử dụng điều này để biện minh cho việc không thuê một người mà họ nghĩ có thể "quá thông minh".
Derek Litz

6

Ngoài các câu trả lời lý thuyết được liệt kê, thường điều này được sử dụng trong bối cảnh quá thông minh cho những người khác.

Di chuyển giữa một nhóm chuyên sâu hiệu suất hàng đầu và một nhóm bảo trì tầng trung bình đôi khi để thấy sự khác biệt trong cuộc sống thực trong những gì "quá thông minh".

Bỏ qua các lập luận lý thuyết, quá thông minh thường dựa trên những gì các thành viên nhóm ít kỹ năng nhất có thể làm việc hợp lý, vì vậy nó rất liên quan đến môi trường.


Tuyệt vời: "quá thông minh thường dựa trên những gì mà các thành viên nhóm ít kỹ năng nhất có thể làm việc hợp lý"
Orbled

tùy thuộc vào vị trí của bạn, điều này có phần ít hơn "xuất sắc" vào các thời điểm :-)
Bill Bill

Ai quan tâm đến thành viên kém kỹ năng nhất trong đội? Hầu hết mọi đội (mặc dù tôi chắc chắn có một vài ngoại lệ) có ít nhất một thành viên hoàn toàn không có doanh nghiệp gọi anh ấy / cô ấy là lập trình viên.
dsimcha

1
Hy vọng rằng bạn sẽ khiến họ trở nên tốt hơn, nhưng ngay cả khi điều đó không thành công, bạn vẫn phải đối phó với họ như một thành viên trong nhóm và họ cần có thể tham gia vào một số công việc. Tôi hiện đang thấy điều này trong biểu thức lambda. Rất nhiều người tôi làm việc cùng chưa nhận được họ vì vậy họ thấy họ quá thông minh. Điều này thật đáng tiếc vì họ giải quyết rất nhiều vấn đề của chúng tôi khá hiệu quả và thanh lịch, nhưng nếu không ai trong số những người ở tầng lớp trung lưu nhận được thì họ sẽ chuyển sang quản lý cho phần mềm không được hỗ trợ.
Hóa đơn

@Bill: Hàm Lambda ??? Bất cứ ai không thể hiểu điều gì đó đơn giản, ngay cả sau khi được yêu cầu đi tìm hiểu về chúng, không có doanh nghiệp là một lập trình viên chuyên nghiệp.
dsimcha

6

Đôi khi tôi đã rất thông minh đến nỗi tôi đã sai.


1
Điều đó có thể xảy ra. Và đôi khi, một cái gì đó rất sai, nó đúng.
bobobobo

Họ gọi những lý thuyết đó là John. Các lý thuyết có thể và nên sai một lần và một lần nữa :), điều đó không có nghĩa là chúng ta nên ngừng thông minh và cố gắng trở nên thông minh nhất có thể. Làm thế nào khác chúng ta sẽ trở thành nhà lãnh đạo trong thế giới này! "À, nhưng tầm với của một người đàn ông nên vượt quá tầm hiểu biết của anh ta - hay thiên đường để làm gì?"
Derek Litz

4

Thực hiện, duy trì, kịp thời và giá rẻ là những cách tôi đo lường một giải pháp. Tôi đoán thông minh cũng có thể là một phần của giải pháp miễn là nó không ảnh hưởng tiêu cực đến những phẩm chất đó.


+1 cho việc sử dụng "giá rẻ" là tích cực liên quan đến phát triển
Gary Rowe

Tôi đã thấy quá nhiều mã 'thông minh' không hiệu quả!
HLGEM

Có nhiều số liệu có giá trị hơn, nhưng chúng có thể là những số liệu tốt tùy thuộc vào dự án và thường chúng có sự bất hòa với nhau, do đó bạn phải nhấn mạnh cái này để thành công.
Derek Litz

3

Nếu mã thông minh + số lượng bình luận cần thiết để làm cho mã dễ hiểu <= mã đơn giản, thì tôi nói hãy dùng mã thông minh. Mỗi lần.

Tôi nghĩ vấn đề nảy sinh khi những người viết "mã thông minh" cố tình không bình luận đúng, bởi vì chỉ khi ban đầu nó không thể hiểu được thì những thế hệ tương lai đi qua sẽ phải dành thời gian "đánh giá cao" sự thông minh của nó.


Chà, hoặc bởi vì họ không nghĩ về chàng trai tiếp theo, hoặc bất cứ điều gì. Tôi không chắc chắn tôi gán cho chủ nghĩa tự cao tự đại những gì có thể được giải thích thỏa đáng bằng cách không suy nghĩ lười biếng và thói quen xấu. Nhưng thực tế là, nếu mã của bạn không thể hiểu được ngay từ cái nhìn đầu tiên, nó cần bình luận và nếu mã + bình luận dài hơn (theo LỘC hoặc thời gian) so với cách khác, bạn đang làm việc chăm chỉ hơn bạn cần.
Dan Ray

Câu trả lời hay, (không thể +1, không còn lại, sẽ muộn hơn). Nếu mọi người không dành thời gian để viết mã thông minh và những người khác không dành thời gian để hiểu nó, thì thích mã đơn giản ít phức tạp hơn, ngay cả khi kém hiệu quả hơn. Sau đó, không có sự tiến bộ trong kỹ năng sẽ diễn ra.
Orble

Câu trả lời hay nhất. Câu thần chú: viết đường cơ sở đơn giản, mã khởi động nhanh và chậm khi tất cả thức dậy ... và sau đó đưa ra nhận xét khi bạn đun sôi nó xuống một lớp lót không thể đọc được. Đó là cách bạn học tất cả các mánh khóe bẩn thỉu trong ngôn ngữ của bạn!
Dropogans

Nếu tôi sử dụng thông minh của bạn để có nghĩa là phức tạp, cá nhân tôi đã viết một số mã phức tạp được thực hiện dễ hiểu thông qua việc đăng nhập. Mặc dù tôi không có kế hoạch viết mã phức tạp, vào thời điểm đó, nó đã tiết kiệm cho tôi một chút thời gian, nhưng tôi đã thêm một # TODO rằng nó có lẽ nên được viết lại để đơn giản nếu chúng ta cần sửa đổi đáng kể.
Derek Litz

3

Tôi nhớ về một câu trích dẫn mà tôi đã thấy được gán cho nhiều người khác nhau, vì những câu trích dẫn hay thường có.

Để diễn dải:

Bất kỳ người thông minh nào cũng có thể làm cho phức tạp đơn giản, phải mất một thiên tài để làm cho phức tạp trở nên đơn giản.

Lấy một ý tưởng phức tạp và đơn giản hóa nó để có thể hiểu được sự thông minh của nhà xây dựng nhưng lấy một ý tưởng đơn giản và làm cho nó phức tạp cho thấy nhà xây dựng muốn được coi là thông minh.


Vâng, đó là ý tưởng bình thường muốn thông minh khiến cơ sở mã của bạn bị rối loạn. Bạn có hoặc không thông minh. Đáng buồn thay, trong giai đoạn học tập ban đầu mọi người nghĩ rằng họ thông minh hơn họ. Sau đó, họ nhận ra rằng họ không thông minh như thế nào và thực sự sau đó viết mã thông minh một khi họ điền vào lỗ hổng kiến ​​thức.
Derek Litz

2

Nếu giải pháp 'thông minh' khó tìm ra thì không nên sử dụng nó. Chẳng hạn, nếu thông qua các tác dụng phụ, bạn có thể hợp đồng một phép tính phức tạp thành một dòng, thật thông minh. Nhưng nếu phải mất một giờ để người khác tìm ra những gì trên thế giới bạn đã làm, thì quá thông minh.


2
Đủ công bằng, nhưng câu trả lời của bạn có thay đổi không nếu người không thể tìm ra mã không quen thuộc với tất cả các tính năng của ngôn ngữ?
Larry Coleman

2
Điều đó khác biệt, ít nhất là IMO. Nếu một người không quen thuộc với các tính năng của ngôn ngữ, thì họ sẽ không ở vị trí để đánh giá điều gì thông minh hay không.
Joe D

@Larry: Không nhất thiết. Tôi cho rằng người đọc nó ở mức độ thành thạo cơ bản / thấp. Và nếu nó bắt đầu trở nên phức tạp không thể khắc phục được, thì đã đến lúc đưa vào một bình luận khối giải thích những gì mã phải làm, điều này sẽ giúp thiết lập một khung tham chiếu để hiểu những gì nó thực sự làm. Nhận xét phải ở mức độ cao, mặc dù - viết ra tính toán, giải thích quy trình; không lặp lại mã. Một người tại (lý tưởng) có thể hiểu mã khi anh ta đọc nó. Dù sao đó cũng là mục tiêu.
Michael K

2

Theo tôi, sự thông minh không phải là vấn đề. Thông thường chúng ta có thể nhầm lẫn về mã "thông minh" (không châm biếm) và mã "sâu sắc". Những gì tôi thấy là một vấn đề, là thực tế thường là mã "thông minh" (với sự châm biếm) chứa các yêu cầu ngầm không thể nhìn thấy, khiến cho việc gỡ lỗi và duy trì theo thời gian khó khăn hơn.

Có một số thuật toán được biết là thông minh. Quicksort là một, IMO.

Mã "Thông minh" (với sự mỉa mai) thường đưa ra các giả định về các biến được đặt và trạng thái của hệ thống hầu như bị ngắt kết nối với mã "thông minh" (như các tệp được mở trước đó, kết nối mạng, cơ sở dữ liệu, v.v.).

Lượng dữ liệu bạn phải tải lên não để duy trì chính xác mã "thông minh" thường là lớn để có tỷ lệ lợi ích chi phí tốt.


1

"Mã thông minh" là bất kỳ mã nào mà lập trình viên phải suy nghĩ thực sự khó khăn hoặc sử dụng một số kỹ năng nâng cao để viết nó. Vấn đề với nó là bỏ qua sự cần thiết phải có một "lề thông minh" nhất định, được thể hiện rõ nhất bởi Brian W. Kernighan:

"Gỡ lỗi khó gấp đôi so với viết mã ở vị trí đầu tiên. Do đó, nếu bạn viết mã càng khéo léo càng tốt, theo định nghĩa, bạn không đủ thông minh để gỡ lỗi."


1

Bởi vì những gì trông giống như minh để một nhà phát triển trong sự bùng nổ của sự sáng tạo chỉ có thể vượt qua như mớ hỗn độn và chỉ là một không đọc được , unmaintainable khối câu đố khó hiểu cho người khác.

Tuy nhiên, một khối câu đố hay, thông minh, hoạt động tốt, nhưng nếu bạn có kinh nghiệm, bạn sẽ thường nhận ra rằng nó sẽ khiến doanh nghiệp của bạn (không phải bạn, nhà phát triển) phải trả nhiều hơn để duy trì điều đó trên phương tiện hoặc lâu dài. Vì vậy, bạn thích làm dịu sự hăng hái của các nhà phát triển đồng nghiệp của bạn khi họ được thực hiện.

Tất nhiên, ngoại trừ, nếu có sự biện minh cho sự thông minh. Và nếu có một tài liệu tốt đi kèm với điều khó hiểu mà bạn vừa viết. Bạn đã nhận xét rằng đoạn mã thông minh, phải không? Giải thích ý định của nó, tại sao nó cần phải như thế nào, và nó hành xử như thế nào?

Nếu không có lý do nào, thì có lẽ đó chỉ là tối ưu hóa sớm, kỹ thuật quá mức hoặc một loại vấn đề YAGNI. Nếu phải mất 15 cấp độ gián tiếp để làm một cái gì đó đơn giản, thì rất có thể bạn cũng thuộc các loại trước đó. Và nếu nó không được ghi nhận, thì đó chỉ là rắc rối.

Mã tuyệt vời không nên yêu cầu người bảo trì luôn luôn ở mức 100% để hiểu nó. Mã tốt là thông minh. Mã tuyệt vời có thể gần như hiệu quả, nhưng tốt hơn trong nhiều khía cạnh khác. Mã tuyệt vời không nên yêu cầu IDE có 15 lượt xem để tuân theo thiết kế của ứng dụng của bạn.

Lưu ý: này, tôi đã viết một vài thứ tôi nghĩ là thông minh nhưng điều đó đã thu hút WTF? ngoài - nếu không phải là đồng phát triển của tôi - miệng của người quản lý của tôi. Phải nhìn nó từ quan điểm của họ.


Cảm ơn câu trả lời. Bạn dường như đồng ý với những người khác nói rằng "thông minh" không có nghĩa là những gì tôi nghĩ nó đã làm.
Larry Coleman

1

Tôi có xu hướng thông minh , nhưng tôi cố gắng để trở nên thanh lịch .

Phát triển mã ngay bây giờ mà những người khác sẽ không thử và tránh sau này .


1
Thôi nào ... thông minh là một từ đồng nghĩa với thanh lịch, bộ não của bạn đã được tiếp thị. Vâng, tôi đã thực hiện từ đó, nó có nghĩa là bộ não của bạn bị ảnh hưởng bởi tiếp thị thay vì sự thật.
Derek Litz

Thanh lịch: đơn giản khéo léo. @DerekLitz +1 cho mọi thứ.
kevpie

1

Đây là sự hiểu biết của tôi về vấn đề này, dựa trên kinh nghiệm của tôi và các câu trả lời khác:

  1. Mã đã thông minh để viết, nhưng đi ra có thể đọc và duy trì được không được coi là có hại. Tuy nhiên, hầu hết các nhà phát triển sẽ không gọi loại mã đó là "thông minh"; họ có thể sử dụng một thuật ngữ khác như "thanh lịch". Có thể có hoặc không có một số tranh luận về việc liệu mã đó có tồn tại hay không.
  2. Mã sản xuất đòi hỏi thời gian và nỗ lực đáng kể để hiểu ngay cả bởi một nhà phát triển dày dạn quen thuộc với ngôn ngữ này là "thông minh" và được mọi người coi là có hại.
  3. Mã sản xuất đòi hỏi thời gian và nỗ lực đáng kể của các nhà phát triển thiếu kinh nghiệm được coi là có hại đối với một số người. Dù sao, tôi cũng đã thấy câu trả lời và tôi đã làm việc với các nhà phát triển, những người đã nói rõ ràng rằng họ muốn giữ mọi thứ "mẫu số chung thấp nhất".

Toàn bộ văn hóa phương Tây hiện đại là LCD, tôi đoán điều đó có nghĩa là lập trình cũng phải như vậy; không tốt.
Orble

@ Tổ chức: Có, nhưng đừng quên sự hài lòng ngay lập tức.
Larry Coleman

Tôi thích điểm kinh nghiệm của bạn. Thật đáng buồn khi mọi người không phấn đấu để cải tiến lặp đi lặp lại và đầu tư vào nhau bằng cách chia sẻ kiến ​​thức và hiểu biết. Thay vào đó, họ muốn chúng ta trở thành một bánh xe để chúng ta có thể dễ dàng thay thế khi đến lúc. Bằng cách này, chúng tôi đang cản trở tiến độ. Chúng tôi cũng đang bán mình ngắn ...
Derek Litz

1

Tôi biết một anh chàng; anh ấy có lẽ là người thông minh nhất mà tôi từng gặp. Anh ấy chắc chắn là một lập trình viên không thể tin được, có lẽ tốt hơn tôi từng có trong toàn bộ cuộc đời tôi về các chương trình lập trình tuyệt đối. Anh ta viết mã như anh ta đang gõ một tài liệu từ và có thể đảo ngược một danh sách được liên kết như bạn không tin. Nếu bạn muốn nói về việc viết một số mã phức tạp nghiêm trọng, anh ấy là người đàn ông của bạn và nếu tôi gặp phải một vấn đề khó tin thì tôi luôn hướng về anh ấy. Tuy nhiên, làm việc trong một dự án với anh ta trong một thiết lập nhóm là rất lớn. Ông không thể trực tiếp nhắm mục tiêu vấn đề kinh doanh và cung cấp một giải pháp hợp lý, hiệu quả và ngắn gọn cho nó. Đối với anh ta, một danh sách mã gồm 1000 dòng sẽ tốt hơn 100. Thay vì sử dụng các công cụ được cung cấp cho anh ta thông qua IDE hoặc khung, anh ta sẽ tung ra công cụ siêu tối ưu của riêng mình.

Trong khi tôi ngưỡng mộ khả năng của anh ấy để làm những điều phức tạp này, điều tôi cần là một người có thể giải quyết vấn đề và tiếp tục. Thật không hay để nói, hoặc thừa nhận, nhưng đôi khi trong thời gian thiết lập kinh doanh là tất cả mọi thứ và bạn phải giải quyết vấn đề và tiếp tục cuộc sống của mình, bạn luôn có thể quay lại sau và cải tạo lại địa ngục để cải thiện ma cua ban. Có một ranh giới giữa việc thông minh và cũng là một nỗi đau ở mông. Phương châm của tôi cho đội của tôi là luôn luôn, điều đơn giản nhất có thể sẽ hoạt động trong tình huống này và sau đó đi từ đó. Đôi khi đơn giản hơn không phải lúc nào cũng là câu trả lời nhưng đó là một nơi tốt để bắt đầu.


Xin lỗi, mặc dù chất lượng của người này bạn đã gặp để có thể mã hóa những thứ phức tạp, anh ta thật ngu ngốc. Mọi người có thể và ngu ngốc bất kể những đặc điểm khác của họ. Những tuyên bố của bạn về những gì bạn thực sự muốn phát triển là rõ ràng đối với một người tài năng. Nếu anh ấy thực sự thông minh, bạn nên làm cho anh ấy một ân huệ và đối đầu với anh ấy thay vì để anh ấy làm những điều ngu ngốc với tài năng của mình. Bạn đang làm bất đồng với anh ấy và mọi người xung quanh bằng cách nhàn rỗi và phàn nàn sau lưng anh ấy. Nếu anh ta không thông minh, bạn nên sa thải anh ta, thì có lẽ anh ta sẽ nhận được nó.
Derek Litz

Tôi có một mối quan hệ với một nguồn tài nguyên chính đã đối phó với những người thông minh hàng ngày trong nhiều thập kỷ và một số trong số họ chỉ thiếu một vài kiến ​​thức để làm việc hiệu quả trong môi trường nhóm. Họ có thể tự mình tìm ra nếu bạn ít nhất cho họ biết về vấn đề này.
Derek Litz

1

"Thông minh" trong ngữ cảnh này có nghĩa là "quá thông minh vì lợi ích của chính nó", tức là thứ gì đó hoạt động ngay bây giờ nhưng sẽ là cơn ác mộng để hiểu và thay đổi sau này.

Đặc biệt nếu đó là một thủ thuật khai thác tính năng tối nghĩa của ngôn ngữ lập trình hoặc sử dụng các hiệu ứng phụ kỳ lạ hoặc là một cách thực sự kỳ lạ để giải quyết vấn đề trong ngôn ngữ đích.


0

Tôi thích các giải pháp đơn giản, tôi thực sự thích cách ruby. Khi bạn muốn ví dụ tổng hợp 2 yếu tố đầu tiên trong danh sách. đầu tiên bạn cắt danh sách để làm cho nó có kích thước = 2 và sau đó bạn tổng hợp nó.

Tôi nhớ rằng một khi tôi đã sử dụng 1 danh sách thay vì 3 và tạo một chức năng lớn rất khó để duy trì / thay đổi.

trong thế giới ngày nay, chúng ta không phải hy sinh mã rõ ràng để thực hiện (ngoại trừ c ++, họ không phải làm như vậy, nhưng họ sẽ làm).


0

Thông thường khi bạn cần phải 'thông minh' để giải quyết vấn đề về mã. Nếu một cách giải quyết và không đơn giản thì bạn sẽ nhận được rất nhiều khuôn mặt bối rối hoặc các tác dụng phụ kỳ lạ khác khi giả định một số điều kiện (có thể đúng 100% tại thời điểm viết mã)

Do đó, thông minh == khó hiểu == xấu :( Nhưng cũng thật tuyệt vời khi tôi sử dụng chúng cho các giải pháp thực tế cho các vấn đề hạn chế.


0

Trích dẫn lại cho bối cảnh và dễ hiểu hơn:

"Gỡ lỗi khó gấp đôi so với viết mã ở vị trí đầu tiên. Do đó, nếu bạn viết mã càng khéo léo càng tốt, theo định nghĩa, bạn không đủ thông minh để gỡ lỗi."

Những gì Brian Kernighan viết ở đây rõ ràng đề cập đến sự chập chững, và anh ta đã sử dụng nhầm từ thông minh.

"Gỡ lỗi khó gấp đôi so với viết mã ở vị trí đầu tiên. Do đó, nếu bạn viết mã càng [bị sai] càng tốt, theo định nghĩa, bạn không đủ thông minh để gỡ lỗi."

Phép nhân chập, tích chập; vòng cuộn:

A thing that is complex and difficult to follow.

Tài giỏi:

Showing intelligence or skill; ingenious

Các lập trình viên có giáo dục biết rằng mã đơn giản là khéo léo. Mã đó là thông minh nhất có thể nên đơn giản theo định nghĩa. Các lập trình viên có giáo dục cũng sẽ tránh làm việc với và viết mã phức tạp như bệnh dịch hạch. Họ cũng sẽ biến mã phức tạp thành mã thông minh bất cứ khi nào họ có cơ hội. Mã thường bắt đầu phức tạp và tiếp cận sự thông minh vì kiến ​​thức về miền và sự hiểu biết về khả năng nhận thức của con người trong lập trình được hiểu rõ hơn thông qua kinh nghiệm và kiến ​​thức được chia sẻ.

Vì sự phổ biến của trích dẫn này và Brian Kernighan khá nổi tiếng trong ngành, việc lạm dụng từ này có tác động xã hội tiêu cực và tôi thực sự muốn thấy điều đó được giải quyết bởi chính người đàn ông đó. Trước khi viết bài viết này, tôi đã cố gắng xem liệu tôi có thể đơn giản gửi e-mail cho anh ấy không, nhưng, tôi không thể tìm thấy bất kỳ thông tin liên hệ email nào mà tôi hiểu :(.

Tác động xã hội tiêu cực mà tôi đã thấy là các lập trình viên khác tẩy chay các đồng nghiệp thông minh hơn của họ, bởi vì bây giờ họ thấy sự thông minh là một vấn đề. Vấn đề thực sự là những đồng nghiệp ngu ngốc nghĩ rằng họ thông minh bằng cách làm mọi thứ theo một cách mới lạ và liên tục phát minh ra những điều mới khi không có lợi thế thay vì hiểu và hiểu về cộng đồng lớn hơn và tái sử dụng những ý tưởng thông minh nhất có thể.

Tôi cần phải làm rõ rằng mặc dù thường đạt được một sự hiểu biết là khó hơn phát minh của riêng bạn. Bởi vì vấn đề phổ biến trong ngành cho thời hạn không thực tế phát minh ra vấn đề của riêng bạn cho vấn đề thích hợp nhỏ hơn của bạn sẽ được sử dụng để tiết kiệm thời gian. Điều này dựa trên sự quan sát rằng những thứ hữu ích, có thể tái sử dụng thường nhắm vào một phân khúc lớn hơn hoặc cung cấp một sự trừu tượng hóa hữu ích cho sáng chế. Nó cũng dựa trên thực tế là mọi người nhắm vào các hốc lớn để kiếm nhiều tiền hơn, khi điều này thường khiến công cụ này cực kỳ khó sử dụng vì sự phức tạp liên quan đến việc tạo ra thứ gì đó có thể sử dụng được cho một phạm vi rộng các ứng dụng.

Tác động xã hội tiêu cực khác là điều này ngăn cản sự tiến bộ và mong muốn thấu hiểu bởi vì trong thế giới bình thường của chúng ta, chúng ta sẽ ngay lập tức phủ nhận sự thiếu hiểu biết của chính mình và viết ra mã bị coi là sai lầm ngay cả khi, một khi đã hiểu, ý tưởng thực sự là khá thông minh.

TODO Tôi muốn trích dẫn một số tài liệu tham khảo nhưng tôi cũng muốn thiếu tài liệu tham khảo để không cản trở khả năng chia sẻ thông tin của tôi vì vậy tôi sẽ nhanh chóng trích dẫn những gì tôi nhớ là nguồn thông tin của mình và có thể tôi sẽ tìm thấy thông tin thực tế ngày (hoặc bạn có thể tìm thấy nó cho tôi! :)

  • Guido Van Rossum nói về các vòng lặp sự kiện và cách anh ấy hiểu được chúng
  • Một nhân viên GitHub đã tuyên bố rằng họ tránh tuyển dụng những người thông minh trên Y-Combinator
  • Phần lớn các cuộc thảo luận và học hỏi diễn ra trong cộng đồng Python. Cộng đồng Python đặc biệt chỉ trích những ý tưởng mới, nhưng không loại bỏ những ý tưởng mới mà họ không hiểu được và bạn thường có thể thấy các tính năng ban đầu được xem là hỗn độn, coi ánh sáng ban ngày là một tính năng / gói ngôn ngữ cốt lõi.
  • Kinh nghiệm của riêng tôi và ý kiến ​​chuyên môn dựa trên 10000 quan sát chân của tôi. Tôi thực sự không thể nhìn thấy các chi tiết cụ thể để khai sáng từ mọi nơi trên đó :( Hy vọng kinh nghiệm và sự quan sát của bạn sẽ cho bạn biết điều tương tự và ai đó có thể nhận xét bên dưới để đưa ra câu trả lời này.

Hãy thêm trích dẫn của riêng bạn! Ngoài ra, hãy thoải mái thêm dấu phẩy vào văn bản của tôi. Tôi đã không làm mới kiến ​​thức của mình về việc sử dụng dấu phẩy bằng tiếng Anh trong một thời gian khá lâu ...


-1

Bởi vì mọi người thường không biết một ngôn ngữ, thành ngữ và mẫu. Họ có thể lấy một cuốn sách và học nó, nhưng họ không làm thế. Và vì những người đó bạn nên viết mã đơn giản.

Đó không phải là một sự thông minh. Đó là một kiến ​​thức.


2
Tôi chắc chắn không đồng ý với điều này (mặc dù không có giá trị -1). Theo lập luận này, bạn có thể nói rằng bạn sẽ không triển khai mẫu Lệnh để xử lý ngăn xếp giao dịch Hoàn tác / Làm lại vì các nhân viên bảo trì mới ra trường và không hiểu chuyện gì đang xảy ra. Tại một số điểm bạn phải nói rằng nếu họ không biết thì họ cần phải học nó.
Ken Henderson

@confusesGeek Hoàn toàn đúng, bạn vẽ đường về sự thiếu hiểu biết ở đâu?
Orble

@ Thành thật, đó là phần khó và ở một mức độ nào đó tùy thuộc vào tình huống. Hướng dẫn chung mà tôi có xu hướng sử dụng đó là nếu một nhà phát triển dày dạn kinh nghiệm (am hiểu về các công nghệ được sử dụng) có thể mò mẫm nó thì có lẽ nó ổn. Nếu họ không thể thì nó cần phải được tái cấu trúc (hoặc xem lại các hoạt động tuyển dụng).
Ken Henderson

@confuseGeek Aye, nghe có vẻ hợp lý. Thử nghiệm litmus có lẽ là, một nhà phát triển có cùng tầm cỡ như chính bạn có thể hiểu một cách dễ dàng những gì bạn đã làm đủ nhanh. Nếu không và có một cách dễ dàng hơn, thì nó cần thay đổi. Đôi khi không có cách nào dễ dàng hơn.
Orble

-1. Đừng viết mã cho mẫu số chung thấp nhất. Sự phức tạp không cần thiết là xấu, nhưng nếu một số thông minh làm cho mã đáng kể hơn DRY, vv nó có thể có giá trị nó.
dsimcha

-1

Tôi không thể tìm ra kỷ luật từ nhắc đến bất cứ nơi nào quanh đây, vì vậy tôi sẽ chip trong. Tôi không muốn gửi các câu trả lời, nhưng để chia sẻ một cái nhìn sâu sắc khác nhau về vấn đề này, có lẽ một trong những câu hỏi ban đầu đã không có trong tâm trí .

Một nhà phát triển thông minh là một điều tốt.

Tuy nhiên, trước khi sự thông minh đến những đặc điểm khác. Như bạn có thể nhận ra tôi sẽ nói về kỷ luật . Một nhà phát triển thông minh và vô kỷ luật có thể rất tệ cho khả năng bảo trì dài hạn của hệ thống.

Giả sử rằng một lỗi phát sinh hoặc một yêu cầu mới xuất hiện. Một nhà phát triển thông minh có thể sớm nhận ra rằng một vài sửa lỗi cục bộ sẽ hoàn thành công việc trong 2 phút. Nếu nhà phát triển đó bị kỷ luật, anh ta sẽ hạn chế áp dụng các bản sửa lỗi đó cho mã nguồn và thay vào đó, sẽ tìm một cách có ý nghĩa để soạn hành vi mong muốn cho hệ thống. Bằng cách này, lần sau khi có nhu cầu sẽ sửa đổi các đoạn mã cụ thể, người bảo trì sẽ có một thời gian dễ dàng để hiểu mã và thực hiện các thay đổi mới mà không vi phạm bất cứ điều gì. Nếu không, bạn cũng có được hình ảnh.


"Beatings sẽ tiếp tục cho đến khi tinh thần được cải thiện"
gnat

@gnat Ý nghĩa? Để làm sáng tỏ mọi thứ một chút; Tôi không coi kỷ luật là một cái gì đó bị ép buộc bởi các nhà phát triển. Đó là một đặc điểm tính cách tốt. Một thứ thường được phát triển bởi những người thông minh sau một thời gian bảo trì phần mềm. Vấn đề xảy ra với những người thông minh chưa ở vị trí bảo trì đủ và để lại những quả bom thông minh ở khắp mọi nơi để người khác tìm thấy.
dkateros
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.