Do lập trình viên đôi khi cố tình làm phức tạp mã? [đóng cửa]


26

Dường như rất nhiều lần trên stackoverflow, rằng mọi người (đặc biệt là các lập trình viên) có xu hướng phức tạp hóa quá mức một giải pháp cho một vấn đề mà giải pháp phức tạp hơn nhiều thì vấn đề ban đầu là gì? Tôi không phải là một chuyên gia bằng mọi cách, nhưng rất nhiều lần tôi cố gắng thực hiện giải pháp đơn giản nhất có hiệu quả (và rõ ràng điều này không hiệu quả MỌI NƠI) nhưng tôi đã thành công khá tốt với việc đề xuất các giải pháp đơn giản cho công việc mà mọi người dường như để bỏ qua cho NHIỀU giải pháp phức tạp hơn?

Đây có phải là một điều bình thường cho các lập trình viên ..... hay tôi chỉ không suy nghĩ theo quan điểm chính xác.


5
1. Vâng, đôi khi tôi nghĩ. 2. Có, ít nhất một số lập trình viên ít nhất là quá phức tạp mã của họ, ít nhất là một số lần cố ý. 3. Các trường hợp đóng cửa.
Công việc

3
Bạn đã bao giờ có ai đó mắng bạn, "Bạn nên nghĩ về điều đó!" khi bạn bỏ lỡ một số yêu cầu không được nêu trong thu thập yêu cầu ban đầu? Đó là những gì có thể dẫn đến một số làm cho mọi thứ phức tạp hơn mức cần thiết.
JB King

Câu trả lời:


18

Rõ ràng, một số lập trình viên rất mong muốn cho thấy họ thông minh như thế nào bằng cách tạo ra một số mã phức tạp cực kỳ phức tạp mà không ai có thể hiểu được. Các lập trình viên khác đang bắn ở mức cao như vậy, sự phức tạp trong các giải pháp là một sự tiến hóa tự nhiên.

Một số mã tồi tệ nhất tôi từng thấy là một phương thức có hơn 2000 dòng mã trong đó. Không có nghi ngờ mã này là phức tạp, nhưng nó cũng rất nghèo.

Tôi nghĩ rằng một lập trình viên giỏi sẽ tránh được mã quá phức tạp. Điều này bao gồm việc tránh sự cám dỗ buộc một mẫu thiết kế phải phù hợp với một giải pháp không thực sự đòi hỏi nó. Nó cũng bao gồm việc tránh các vật thể của Chúa, các nút ma thuật, tối ưu hóa sớm, khái quát hóa sớm và các mô hình chống khác.

Tôi liên tục tái cấu trúc và tìm kiếm cơ hội để đơn giản hóa các giải pháp của mình bởi vì sự tăng trưởng phức tạp là một điều hữu cơ. Giống như nhiều thứ hữu cơ khác, nó phải được cắt tỉa và cắt tỉa nếu chúng ta muốn nó tiếp tục có thể sử dụng được. Tôi ghét phải tương tác với các giải pháp quá phức tạp vì với độ phức tạp tăng lên sẽ làm tăng khả năng phá mã.

Tôi nghĩ rằng khả năng đọc là yếu tố quan trọng nhất của bảo trì mã và các giải pháp quá phức tạp hầu như luôn làm giảm khả năng đọc và tăng chi phí bảo trì.


32

Tôi đã thấy rất nhiều mã phức tạp hơn mức cần thiết và gần như luôn luôn vì ba lý do sau:

1) Thiết kế quá mức vì khái quát hóa sớm hoặc cố gắng dự đoán các nhu cầu trong tương lai không bao giờ phát sinh

2) Nhà phát triển muốn tìm hiểu / thử nghiệm một mẫu thiết kế hoặc công nghệ mới mà họ chưa từng sử dụng trước đây và đã sử dụng nó ngay cả khi nó quá mức cần thiết. Họ làm điều đó bởi vì nó làm cho công việc của họ thú vị hơn và họ được học một cái gì đó mới.

3) Các tính năng và sửa lỗi đã được thêm vào, nhưng mã hiện tại không được tái cấu trúc chính xác tại thời điểm đó cùng với nó. Nó chỉ có thể là một phần nhỏ của sự trùng lặp hoặc xử lý một đối số cờ khác trên một phương thức nhưng tất cả đều cộng lại. Thực tế, các bản hack được thêm vào và không mất nhiều thời gian để mọi thứ trở nên quá phức tạp do tất cả các mã đều có mùi. Đây là phổ biến nhất và thường chỉ do không biết tốt hơn hoặc áp lực thời gian.


Tôi có tội # 2, tôi sợ. Với kinh nghiệm (và sự trưởng thành?) Bây giờ tôi có xu hướng kiềm chế bản thân mặc dù ... và thử nghiệm ở nhà thay vào đó :)
Matthieu M.

Tôi thấy mọi người làm 1 lần, cuối cùng họ tạo ra công việc gấp 5 lần cho mình
Ally

11

Đó hoàn toàn là một điều phổ biến. Như hầu hết các cuốn sách nói, một nhà phát triển giỏi biết cách giữ cho nó đơn giản. Thật quá dễ dàng để làm phức tạp một cái gì đó với một công nghệ mới hoặc một khung "tuyệt vời" mà bạn vừa tìm thấy, vì vậy bạn bắt đầu tìm cách sử dụng nó, thay vì suy nghĩ từ góc độ vấn đề.

Như Martin Fowler đã nói, những người tìm hiểu một công nghệ mới có một vấn đề ngắn hạn trong đó các giải pháp thúc đẩy "công nghệ" của nó.


4
-1: Như hầu hết các cuốn sách nói, một nhà phát triển giỏi biết cách giữ cho nó đơn giản. - Bạn hoàn toàn đúng về điều này. Nhưng sau đó, bạn ngụ ý rằng lạm dụng công nghệ mới là nguyên nhân lớn nhất của việc áp dụng quá nhiều mã. Bạn đã sai về điều đó. Tin tôi đi, có rất nhiều mã quá phức tạp ngoài kia không liên quan gì đến việc lạm dụng công nghệ mới.
Jim G.

Chính xác thì tôi đã ngụ ý rằng "nguyên nhân lớn nhất của mã quá mức" là ở đâu? Đó chắc chắn là một vấn đề, "Này, tôi vừa học được mẫu X, nơi tôi có thể áp dụng nó" - Patternitus. Bạn thực sự đặt lời nói vào miệng tôi Jim.
Martin Blore

4
"Tôi đã làm cho bức thư này dài hơn bình thường, chỉ vì tôi không có thời gian để làm cho nó ngắn hơn." - Blaise Pascal Rất áp dụng ở đây là tốt. "Complicated" thường là một dấu hiệu của mã hóa vội vàng, lười biếng hoặc không đủ năng lực.
Hóa đơn

@ Bill ngay lần đầu tiên (ai có thể?) về cơ bản có một hình phạt cho việc làm cho mã đã làm việc của bạn bớt phức tạp hơn.
Michael

10

Tôi không nghĩ nó là bình thường cho tất cả các lập trình viên, nhưng tôi chắc chắn đã thấy nhiều lập trình viên làm điều này.

Tôi nghĩ rằng một số người tin rằng một số người thấy việc tạo ra một thứ gì đó thực sự đơn giản 'quá dễ dàng' và đó không phải là một cách thể hiện tốt các kỹ năng của họ. Do đó, họ phải tạo ra một giải pháp lớn, phức tạp, có cách nói "hãy nhìn xem tôi có thể làm gì!", Mặc dù đó có thể không phải là giải pháp tốt nhất cho vấn đề trong tay.


1
Đó là cách tôi nhìn vào nó. IE nếu nó quá dễ thì không đáng để sử dụng?

@Mercfh Tôi không hiểu quan điểm. Sự dễ dàng của một giải pháp có liên quan gì đến hiệu quả của nó?
GSto

Tôi đã bình luận về bình luận của anh ấy nói rằng "Có, tôi đồng ý" rằng đôi khi các lập trình viên nghĩ rằng "Ồ nếu nó quá đơn giản, nó không tốt lắm".

7

Tôi đã thấy các lập trình viên thường viết một vài dòng mã để hoàn thành một nhiệm vụ mà họ không biết đã được tích hợp vào ngôn ngữ. Điều này không chính xác có chủ ý nhưng chắc chắn có thể được ngăn chặn.


Tôi đã thấy các lập trình viên đã viết một vòng lặp cho mỗi bản sao chuỗi. Không bao giờ sử dụng một cuộc gọi đến một chức năng thư viện tiêu chuẩn. (Điều tồi tệ hơn là các bản sao nền tảng đã được tối ưu hóa để đọc một từ tại một thời điểm.)
BillThor

7

Nó phụ thuộc vào những gì bạn gọi là "đơn giản". Một số người thấy mã được tái cấu trúc cao là "phức tạp" hơn vì có nhiều mã hơn và nhiều biểu đồ cuộc gọi. Tuy nhiên, mã này "đơn giản" hơn ở chỗ dễ thực hiện thay đổi hơn nhiều.

Tôi thường thấy rằng một hàm lớn trông "đơn giản" cho đến khi bạn cần thực hiện thay đổi, sau đó nó sẽ trở nên phức tạp nhanh chóng.

Nói cách khác, đơn giản là trong mắt của kẻ si tình trong nhiều trường hợp.


2
+1: quá nhiều lập trình viên không nghĩ về điều đó
Luca

5

Vấn đề là nếu bạn không thể nhìn thấy các giải pháp đơn giản một cách rõ ràng (đây là lúc các cuộc thảo luận với các đồng nghiệp diễn ra) hoặc nếu bạn quá khái quát quá sớm.

Nói cách khác, bạn tạo các vòng lặp đơn giản thành các chức năng thư viện nâng cao bởi vì bạn nghĩ rằng bạn sẽ cần nó cho dự án tiếp theo của bạn (ngoại trừ việc bạn sẽ không ở dạng chính xác này). Làm điều này quá lâu và bạn có một ứng dụng vô cùng phức tạp với lõi rất đơn giản.

Bạn cũng có thể thấy rằng bạn cần phải có mã rất mạnh và tất cả sự mạnh mẽ làm cho nó phức tạp theo mặc định. Tôi không nghĩ rằng mặc dù đây là vấn đề của bạn.


4

Trong một số trường hợp, đó có thể chỉ là sự phức tạp khi đưa ra một giải pháp sạch / đơn giản.

Có một câu trích dẫn mà tôi không thể nhớ hoặc tìm thấy một mình một dòng nào đó "Dòng mã chưa hoàn thành một khi bạn đã viết tất cả những gì bạn cần viết nhưng chỉ hoàn thành một khi bạn không còn gì để xóa"

Sự thiếu rõ ràng sẽ cản trở mọi người khả năng loại bỏ tất cả những gì dư thừa.


4
Một câu nói liên quan khác là "Tôi đã viết một lá thư ngắn hơn nhưng không có thời gian."
user16764

3
Một trong những thứ khác không có gì hơn để loại bỏ “) -. phi công người Pháp, nhà thơ và kỹ sư Antoine Marie Roger Vicomte de Saint-Exupéry, 1939 (từ cuốn sách Terre des Hommes ( gió, cát và Stars )).
Jörg W Mittag

Cảm ơn, có vẻ như tôi chưa bao giờ biết nguồn gốc thực sự :-) Nice.
Stephen Bailey

3

Các kỹ sư giỏi nhất là những người có thể đưa ra những vấn đề thực sự phức tạp và biến chúng thành những giải pháp dễ thực hiện và dễ hiểu. Nghe có vẻ đơn giản, nhưng không có nhiều kỹ sư / nhà phát triển như thế tồn tại. Trong thực tế không có nhiều người như thế tồn tại. Trong thực tế, phần lớn những người ngoài kia làm điều ngược lại. Họ có những vấn đề đơn giản và làm phức tạp chúng ngoài sự công nhận. Chỉ cần nhìn vào các chính trị gia của chúng tôi cho một ví dụ về những người quản lý để có những vấn đề đơn giản và biến chúng thành hỗn loạn hoàn toàn. Các lập trình viên không khác nhau về vấn đề này.


3
Ôi! Tôi chỉ định cho bạn +1, nhưng sau đó tôi thấy sự tương đồng của bạn với chính trị, và điều đó rất yếu. // Đó là sự thật - Có rất nhiều sự xáo trộn, chuyển động lãng phí, vẫy tay và những lợi ích đặc biệt gắn liền với chính trị, và kết quả là, các dự luật có thể trở nên quá phức tạp. Nhưng sự phức tạp là một sản phẩm phụ của sự xáo trộn, chuyển động lãng phí, vẫy tay và những lợi ích đặc biệt. Không phải là một nguyên nhân gốc rễ.
Jim G.

Dù lý do là gì đi nữa, có những giải pháp rất đơn giản cho nhiều vấn đề của đất nước, nhưng các chính trị gia chọn cách làm cho chúng khó hơn họ cần. Chúng tôi cho rằng điều này là vì tiền, quyền lực hoặc phiếu bầu nhưng tôi cũng tin rằng phần lớn là về khả năng. Trong trường hợp tương tự của tôi là trên nền tảng vững chắc.
Dunk

1
@JimG. Vâng, tôi đồng ý với bạn ... đối với tôi, nhiều vấn đề với các giải pháp chính trị là các chính trị gia cho rằng có một giải pháp dễ dàng (của họ!) Cho một vấn đề thực sự phức tạp mà thực sự không có giải pháp dễ dàng.
Michael

2

Cá nhân, tôi chưa bao giờ cố tình làm cho một phần mềm phức tạp hơn. Tuy nhiên, tôi đã hoàn thành một cái gì đó và nghĩ "wow, điều đó quá phức tạp" và quay lại với nó và tái cấu trúc. Một số người có thể thấy điều này và chỉ nghĩ rằng nó hoạt động và nó đủ tốt và không tái cấu trúc nó.


1

Một người đàn ông khôn ngoan được cho là đã nói rằng bạn nên giữ mọi thứ đơn giản nhất có thể, nhưng không đơn giản hơn. Điều tương tự có thể áp dụng cho mã. Đôi khi bạn phải sử dụng một kỹ thuật mà một số người coi là phức tạp (đệ quy có thể là một ví dụ tốt, nó thường làm các lập trình viên cơ sở sợ hãi).

Tuy nhiên, nói chung tôi nghĩ rằng mã phức tạp thường phát sinh hữu cơ. Một vấn đề đơn giản được giải quyết với mã đơn giản, sau đó mở rộng phạm vi và mã được sửa đổi mà không cần suy nghĩ quá nhiều, và theo thời gian, bạn nhận được mã cố gắng khắc phục vấn đề mới nhưng thực sự được thiết kế để giải quyết vấn đề khác. Nó trở thành một tấm chăn chắp vá của các mảnh logic khác nhau. Mã như vậy sau đó thường có vẻ phức tạp hơn so với vấn đề yêu cầu, nhưng nó có được theo cách đó bởi vì mỗi thay đổi nhỏ dường như là cách dễ nhất để làm cho mã hoạt động.

Tôi không nghĩ rằng hầu hết các nhà phát triển cố tình đặt ra để làm cho mã phức tạp (mặc dù bạn có thể phô trương kỳ lạ ai sẽ sử dụng một số kỹ thuật để chứng minh kỹ năng của riêng họ), tôi nghĩ rằng mã chỉ đạt được như vậy nếu nó không được duy trì và tái cấu trúc một cách mạnh mẽ .


Thật đáng ngạc nhiên khi có nhiều hệ thống khởi động với lõi thực sự đơn giản, gần như phù hợp với yêu cầu nhưng lại thiếu nhiều cách khác nhau, và cuối cùng lại thêm nhiều sự phức tạp để xử lý nhiều lỗ hổng có thể tránh được với thiết kế phức tạp hơn một chút. Hãy xem xét thiết kế đơn giản của các loại số nguyên của C và một số quy tắc phức tạp đi kèm với chúng. Nếu với mỗi loại đã có tùy chọn "nên có thể quảng bá được", thì điều đó sẽ tăng gấp đôi số lượng loại (mặc dù không thực sự khác với vòng loại như volatile, v.v.) nhưng ...
supercat

... nó sẽ giảm bớt rất nhiều các quy tắc thăng tiến / cân bằng. Một unsigned short phi promotable thêm vào một int promotable sẽ mang lại một đoạn ngắn unsigned phi promotable, hay không shortlà lớn như int. Một quảng cáo unsigned shortđược thêm vào một quảng cáo intsẽ mang lại một int. Thêm những thứ được ký và không dấu có cùng kích thước, hoặc thêm những thứ không thể quảng bá có kích thước khác nhau, sẽ là một lỗi. Thêm một chút phức tạp lên phía trước, và các trường hợp góc kỳ lạ ở phía dưới biến mất.
supercat

1

Một lý do khác chưa được nêu ra là mọi người có thể áp dụng quá mức các giải pháp được cung cấp để đảm bảo rằng bạn sẽ cần dịch vụ của họ sau này để hỗ trợ các giải pháp này. Nói cách khác: để bảo đảm công việc.


Không chắc tại sao điều này bị hạ thấp, tôi đã bắt gặp những dự án cực kỳ lớn được mã hóa bởi một người đàn ông, người đã tạo ra khuôn khổ của riêng mình và được trả tiền hàng giờ chỉ làm việc trong dự án này. Nếu chủ nhân chọc giận anh ta, toàn bộ dòng sản phẩm sẽ bị vặn. Phải mất vài tháng để một nhà phát triển khác hiểu kỹ về mã, trong khi phải mất vài phút để lập trình viên "hiểu biết tất cả" cập nhật mớ hỗn độn spaghetti của mình.
SSH này

0

Có lẽ một vấn đề của một sai lầm cổ điển?

30. Nhà phát triển mạ vàng.

Các nhà phát triển bị mê hoặc bởi công nghệ mới và đôi khi lo lắng để thử các tính năng mới của ngôn ngữ hoặc môi trường của họ hoặc tự tạo ra một tính năng khéo léo mà họ thấy trong một sản phẩm khác - cho dù đó có phải là sản phẩm của họ hay không. Nỗ lực cần thiết để thiết kế, thực hiện, kiểm tra, tài liệu và các tính năng hỗ trợ không được yêu cầu kéo dài lịch trình.

  • Steve McConnell, Phát triển nhanh chóng.

0

Có đôi khi chúng ta quá phức tạp mã để giải trí. Hầu hết mặc dù nhận thức rằng mã đang quá phức tạp đến từ một người không biết gì hoặc người tham gia Junior trong dự án.


1
-1 Các nhà phát triển cấp cao, những người đổ lỗi cho các vấn đề về các nhà phát triển cơ sở có thể không hiểu động cơ thúc đẩy công việc của họ hoặc công việc của người khác. Nếu các nhà phát triển cơ sở có một thời gian khó khăn theo mã của bạn, thì IT IS quá phức tạp.
Brandon

Tôi sẽ nói rằng nếu một nhà phát triển Jr thấy mã không thể hiểu được thì đó là mùi mã và thực tế có thể là mã quá phức tạp, tuy nhiên bạn đang sử dụng từ xa để mở rộng bàn chải ở đây. Trên thực tế, mùi mã này có thể chỉ tồn tại bởi vì nhà phát triển Jr cần trợ giúp để hiểu một kỹ thuật nâng cao, chứ không phải chính kỹ thuật đó là đáng trách.
P. Roe

-1

CÓ ... và tôi đã trả giá quá nhiều lần.

Bảng trắng của tôi bây giờ có một tuyên bố bằng dấu hoa thị ở đầu trang mà đọc

"Nếu nó không đơn giản, thì nó không đúng"

... Và mỗi lần tôi tạo mẫu một cái gì đó trên bảng trắng, nó luôn thu hút sự chú ý của tôi.

Nó thực sự làm việc cho tôi vì các thiết kế phức tạp của tôi trở nên đơn giản hơn nhiều, chuyển thành mã sạch hơ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.