Điểm phức tạp không có lợi nhuận. Bạn gọi nó là gì?


13

Là một nhà phát triển phần mềm, một trong những nhiệm vụ chính của tôi là kiểm soát sự phức tạp.

Tuy nhiên, trong một số dự án, có một thời điểm mức độ phức tạp tăng cao đến mức nó đạt đến một điểm nào đó "không quay trở lại". Quá thời điểm này, bạn không bao giờ có thể đưa dự án về mức độ phức tạp chấp nhận được trong thời gian ngắn hơn bạn sẽ cần phải viết lại mọi thứ từ đầu.

Có phải khoảnh khắc đặc biệt này có một tên trong phương ngữ lập trình viên (một cái gì đó tương tự như định luật troll của Godwin)?

--biên tập--

Xin lỗi nếu tôi không rõ ràng. Tôi không nghĩ rằng "khoảnh khắc" này có tên chính thức hoặc là một số liệu nghiêm túc. Tôi đã suy nghĩ về một cái gì đó theo tinh thần của "Đỉnh Ballmer" trong xkcd .


1
Tôi thấy một tranh cãi trong định nghĩa của bạn về vấn đề được đề cập: ... trong thời gian ngắn hơn bạn sẽ cần phải viết lại mọi thứ từ đầu , điều này ngụ ý những người sẽ viết lại dự án là đủ tốt, hoặc ít nhất là tốt hơn những người đã tạo ra mớ hỗn độn ở nơi đầu tiên;)
mojuba

1
Tôi nghĩ một lý do không có sự đồng ý về tên là nó phụ thuộc vào người đang xem mã. Những gì xuất hiện vô cùng phức tạp hoặc không thể nhầm lẫn đối với một nhà phát triển có thể xuất hiện khá hợp lý với người khác. Trong trường hợp nghiêm trọng, tôi chỉ biên dịch thành một DLL có tiền tố "ms" và nói rằng nó đến từ Microsoft.
Kevin Hsu

1
Có lẽ điều này sẽ làm: Sự kiện Nợ kỹ thuật
Chân

Câu trả lời:


20

Đây là một vấn đề về khả năng bảo trì hơn là sự phức tạp.

Hiện tượng này được gọi là "nợ kỹ thuật", và một khi nó đạt đến mức nghiêm trọng, dự án đang trên đường phá sản.

Đó có phải ý của bạn?


Cảm ơn câu trả lời của bạn. Tôi biết khái niệm "phòng kỹ thuật". Mỗi dự án có một số loại nợ kỹ thuật. Ý tôi là: làm thế nào để bạn gọi thời điểm mà khoản nợ này trở nên quá cao đến nỗi bạn muốn ném dự án vào thùng rác và bắt đầu lại?
Thibault J

3
Tôi thích thuật ngữ của bạn 'phá sản kỹ thuật'. Nó cho thấy rằng giống như trong một vụ phá sản thực sự, bạn phải xem xét kỹ những phần nào có thể cứu vãn được và phần nào nên để lại. Và có lẽ một số cơ cấu lại nợ là tất cả những gì thực sự cần thiết :)
Jaap

2
@Thibault J: Tôi không tin có một thuật ngữ cụ thể cho thời điểm đó. Đó là nhiều hơn về việc nhận ra nếu bạn vẫn vui vẻ trước thời điểm đó hoặc buồn bã vượt qua nó.

1
@ Nhà phát triển nghệ thuật: ... nhận ra nếu bạn vẫn vui vẻ trước thời điểm đó hoặc buồn bã vượt qua nó - Tôi nghĩ đó là chìa khóa trong việc đưa ra một định nghĩa tốt về quan điểm: một dự án vượt ra ngoài vấn đề là không có kỹ sư nào tiếp quản tự nguyện.
mojuba

3
Tôi sẽ dùng thuật ngữ "phá sản kỹ thuật", tôi thích nó. Và tôi cũng sẽ sử dụng định nghĩa của bạn.
Thibault J

16

"Điểm phức tạp quá mức" được gọi bằng tiếng Anh là:

OH MY THIÊN CHÚA LÀ GÌ NÀY.

Vấn đề là, điều này có thể áp dụng cho một cái gì đó thực sự đơn giản, nhưng được thực hiện theo cách khủng khiếp đến mức bạn có phản ứng tương tự.

Vì vậy, phân biệt một cái gì đó rất phức tạp từ một cái gì đó rất kinh khủng có thể khó khăn.

TUY NHIÊN: Điều thực sự có xu hướng xảy ra với tất cả các phần mềm là xử lý một chút như thế này:

Bước 1: Có một thông số kỹ thuật đẹp, làm một thiết kế đẹp, thực hiện những thứ tốt đẹp. Mọi người vui vẻ.

Ở cuối bước 1: các nhà phát triển tự chúc mừng cho sự thanh lịch tuyệt vời của thiết kế của họ và bỏ đi suy nghĩ hạnh phúc "Tôi có một di sản tuyệt vời ở đây để những người khác thêm vào trong tương lai, nó sẽ rất tuyệt vời và thế giới sẽ là một nơi tốt hơn."

Bước 2: Một số thay đổi được thực hiện, mọi thứ được thêm vào, các chức năng mới được bao gồm. Kiến trúc và cấu trúc từ Bước 1 đã khiến đây là một quá trình khá đau đớn. [Nhưng oops, "yếu tố cruft" chỉ tăng lên một chút.]

Ở cuối bước 2: các nhà phát triển tự chúc mừng cho sự thanh lịch tuyệt vời của thiết kế của họ và bỏ đi suy nghĩ hạnh phúc "Gee Tôi rất thông minh khi thực hiện tất cả các khoản trợ cấp đó trong Bước 1. Điều này rất tốt. Tôi có một di sản tuyệt vời. ở đây để những người khác thêm vào những thứ trong tương lai, nó sẽ rất tuyệt vời và thế giới sẽ là một nơi tốt đẹp hơn. "

Bước 3: Nhiều thay đổi được thực hiện, nhiều thứ được thêm vào, nhiều chức năng mới hơn, một loạt các công cụ được thay đổi, phản hồi của người dùng thực sự đang được lắng nghe.

Ở cuối bước 3: các nhà phát triển tự chúc mừng cho sự thanh lịch tuyệt vời của thiết kế của họ và nghĩ rằng "Kiến trúc này khá tốt khi cho phép rất nhiều thay đổi để chỉ vào vị trí một cách dễ dàng. Nhưng tôi hơi không vui về X và Y và Z. Bây giờ họ có thể được dọn dẹp một chút. Nhưng !!! Ahhh !!! Tôi thật thông minh khi thực hiện tất cả các khoản trợ cấp đó trong Bước 1. Điều này rất tốt. Tôi có một di sản tuyệt vời ở đây cho những thứ khác để thêm vào trong tương lai, nó sẽ rất tuyệt vời và thế giới sẽ là một nơi tốt đẹp hơn. "

Bước 4: giống như bước 3. Ngoại trừ:

Ở cuối bước 4: các nhà phát triển nghĩ: "Công cụ này rất tốt để duy trì UGLY. Nó thực sự cần một số thay đổi nghiêm trọng. Tôi không thực sự thích làm việc này. Nó cần tái cấu trúc. Tôi tự hỏi ông chủ là gì sẽ nói khi tôi nói với anh ta rằng nó cần 6 tuần và sẽ không có gì cho người dùng thấy ở cuối này ... nhưng tôi sẽ có thêm 5 năm phạm vi sửa đổi tương lai tốt bằng cách làm điều này .... hmmm .. thời gian để đến quán rượu để uống bia. "

Bước 5: Một loạt các thay đổi cần phải được thực hiện.

Và DURING bước 5, các nhà phát triển nói với nhau: "Mã này thật tệ. Ai đã viết cái này? Họ nên bị bắn. Thật kinh khủng. Chúng tôi PHẢI TẠO RA NÓ."

Bước 5 gây tử vong. Đây là nơi mà yếu tố cruft trở nên tồi tệ đến mức mã không thể có thêm một vài thay đổi, nó cần phải có một số thay đổi LỚN.

Rắc rối ở Bước 5 là mong muốn vứt nó đi và bắt đầu lại. Lý do này gây tử vong là "Yếu tố Netscape". Lên google nó. Các công ty DIE tại thời điểm này, bởi vì bắt đầu lại có nghĩa là bạn bắt đầu với khoảng 50% giả định thay vì sự thật, 150% nhiệt tình thay vì kiến ​​thức, 200% kiêu ngạo thay vì khiêm tốn ("Những kẻ đó quá khờ khạo!"). Và bạn giới thiệu một loạt các lỗi mới.

Điều tốt nhất để làm là tái cấu trúc. Thay đổi một chút tại một thời điểm. Nếu kiến ​​trúc đang hơi mệt, hãy sửa nó. Thêm, mở rộng, cải thiện. Dần dần. Tại mỗi bước trên đường đi, kiểm tra, thử nghiệm và kiểm tra thêm một số. Những thay đổi tăng dần như thế này có nghĩa là 10 năm sau, mã hiện tại và mã gốc giống như rìu của ông nội ("nó có 10 đầu mới và 3 tay cầm mới nhưng nó vẫn là rìu của ông nội"). Nói cách khác, không có nhiều điểm chung. Nhưng bạn đã chuyển từ cũ sang mới dần dần và cẩn thận. Điều này làm giảm rủi ro và đối với khách hàng, nó làm giảm yếu tố tức giận.


Tôi cá là bạn sẽ nhận được nhiều phiếu hơn nếu bạn rút ngắn các bước của mình.
Codism

Tôi phải nói thêm rằng hầu hết các doanh nghiệp không có ngân sách cho việc này, vì vậy việc tái cấu trúc luôn là quá ít quá muộn. Để quản lý entropy ngày càng tăng của các hệ thống là phải thiết lập, từ ngày 1, ngân sách (10% -20%) được phân bổ từ mọi công việc để dọn phòng. Đây không phải là ngân sách sửa lỗi. Chi tiêu ngân sách được quyết định bởi kỹ thuật, không phải quản lý hoặc tiếp thị hoặc bán hàng. Nó chỉ được sử dụng để xác định entropy được tạo ra bởi sự phát triển và chi tiêu giảm khi sản phẩm sắp hết tuổi thọ.
mattnz

Đã đồng ý. Quản lý luôn muốn cắt tỉa điều đó. Đôi khi bạn có thể thoát khỏi việc ẩn nó (Thêm khoảng 20% ​​vào ước tính phát triển để làm bất cứ điều gì và khi cần tái cấu trúc - LÀM NÓ).
quick_now

1
Có một điểm mà bạn thực sự không thể tái cấu trúc. Nếu bạn có một số ứng dụng kinh doanh khác nhau phụ thuộc vào cùng một giao diện hoặc cơ sở dữ liệu tệ hại, bạn không thể sửa chữa những thứ cơ bản rất tốt mà không phá vỡ tất cả các ứng dụng khác phụ thuộc vào nền tảng tào lao. Tại thời điểm này bạn thực sự bị vặn.
John Cromartie

2

Tôi đồng ý rằng khoảnh khắc này rất khó nhận ra và có thể tránh được bằng các quy trình thích hợp. Tuy nhiên, câu hỏi là về những gì để gọi nó. Trong kinh tế thực tế, có khái niệm "lợi nhuận giảm dần": điểm tăng đầu vào cho một tài nguyên trong một quy trình làm giảm lợi nhuận chung của bạn trên mỗi đơn vị. Điều này chắc chắn áp dụng cho mã hóa, và thậm chí những thứ tốt như trừu tượng hóa, tái sử dụng, v.v ... có một điểm giảm lợi nhuận như vậy. Thuật ngữ chung dành riêng cho lập trình là "đại diện". Đối với một người có xu hướng làm việc này, tôi thích thuật ngữ " phi hành gia kiến ​​trúc " của Joel .


1

Quá thường xuyên mã tốt bị loại bỏ dưới ấn tượng sai lầm rằng nhóm mới với các công cụ mới có thể làm điều đó rẻ hơn, nhanh hơn với độ tin cậy cao hơn, chỉ để thấy rằng

  • Sự phức tạp là trong các yêu cầu tài liệu
  • Các công cụ mới khó sử dụng hơn thì trang web flash đã hứa
  • Đội bóng mới không 'nóng' như họ nghĩ

Có thể thời gian bạn đã mô tả không đến với một số cơ sở mã (tôi đã từng nghĩ như vậy). Cá nhân tôi chưa bao giờ trải nghiệm một trường hợp mã cũ khiến dự án bị hỏng, hoặc viết lại mã lưu một dự án.

Tôi không bao gồm trong trường hợp này khi các số liệu đã được sử dụng để xác định các mô-đun hoặc thiết kế có vấn đề cụ thể, sau đó được loại bỏ và thay thế.


Chà, tôi đã thấy dự án rất rõ ràng rằng ngân sách bảo trì của họ gấp ba hoặc bốn lần ngân sách phát triển ban đầu. Dù sao, thuật ngữ tôi đang tìm kiếm không phải là một thứ "chính thức" và nghiêm túc, mà nhiều thứ như "đỉnh Ballmer" trong xkcd. Xin lỗi nếu tôi không rõ lắm.
Thibault J

Nhưng làm thế nào mà nó có được như vậy? Nếu vì yêu cầu phức tạp, quản lý tồi, kỹ sư lạc quan, tại sao một bản viết lại sẽ sửa chữa nó?
mattnz

Bởi vì nhóm viết lại nó không giống như tho người viết nó lúc đầu?
Thibault J

1

Vấn đề thực sự với "khoảnh khắc" lý thuyết này là nó chỉ được công nhận sau khi thực tế. Trừ khi các đồng nghiệp của bạn là những kẻ thái nhân cách, mọi cam kết vào cơ sở mã đều được thực hiện với niềm tin rằng đó là một cải tiến trên cơ sở mã đó. Chỉ nhìn lại mớ hỗn độn sau đó mà bạn có thể thấy bạn đã vượt qua "khoảnh khắc" đó.

Nhưng tôi thích điều đó chúng ta có thể đặt tên cho nó. "Gents", bạn có thể nói, kéo các nhà phát triển đồng nghiệp của bạn xung quanh bạn, "Chúng tôi đã vượt qua Hellespont Bảo trì. Nhắn tin cho vợ bạn và cho cô ấy biết rằng bạn sẽ không gặp cô ấy trong một thời gian."


"mọi cam kết vào codebase đều được thực hiện với niềm tin rằng đó là một cải tiến trên codebase đó." Có vẻ như chúng tôi chưa bao giờ làm việc trong cùng một công ty :)
Thibault J

@ThibaultJ - Có lẽ các đồng nghiệp của bạn đã bị tâm thần?
Dan Ray

@Thibault J: Tôi tin rằng mọi cam kết đều được thực hiện với niềm tin rằng đó là một cải tiến trên cơ sở mã đó. Tất nhiên, niềm tin được nghiên cứu kém và không có cơ sở.
David Thornley

Ở công việc cuối cùng của tôi, tôi không nghĩ có bất kỳ cam kết bảo trì nào mà bất kỳ ai từng làm với niềm tin rằng đó là một cải tiến cho cơ sở mã.
Bàn Bobby

Đôi khi các yêu cầu của dự án có thể thay đổi đủ để buộc thay thế bằng một thiết kế mới, nhưng dù sao cũng có thể cần phải thay đổi phiên bản cũ. Nếu hầu hết người dùng cũ của phiên bản cũ sẽ sử dụng hệ thống mới và sẽ không cần phiên bản cũ nữa, thì có thể hoàn toàn hợp lý để sản xuất một phiên bản đáp ứng yêu cầu của một số ít người mà hệ thống mới không phù hợp, ngay cả khi nó sẽ làm cho hệ thống ít sử dụng hơn cho những người không còn cần nó nữa.
supercat

-1

Tôi không biết có tên hay không nhưng nếu không có thì tôi sẽ đề xuất gọi nó là "điểm meltdown"


Hoặc để mượn một thuật ngữ hạt nhân khác: khối lượng quan trọng.
John Cromartie

-2

Đây không phải là một câu hỏi rất thú vị.

Quả thực đó là chuyện nhỏ.

Thật tầm thường khi chúng tôi đã phát triển nhiều cách để đối phó.

  1. Phương pháp thác nước. Rất nhiều người dành nhiều thời gian để xem xét các yêu cầu và tài liệu thiết kế để đảm bảo rằng sự phức tạp được quản lý.

  2. Phương pháp Agile. Ít người dành ít thời gian hơn để thảo luận về những gì có thể áp dụng ngay lập tức để giải quyết vấn đề của ai đó và phát hành phần mềm cho họ. Sự phức tạp được quản lý bởi vì tất cả mọi người tập trung vào việc phát hành một cái gì đó.

Lần duy nhất bất cứ ai vật lộn với "sự phức tạp" là do không tuân theo phương pháp và quản lý thời gian của họ đúng cách.

  • Không có giám sát chi tiết trong một phương pháp thác nước. Họ không bị buộc phải xem xét các sản phẩm công việc trung gian theo yêu cầu, kiến ​​trúc, thiết kế cấp cao hoặc đánh giá thiết kế chi tiết.

  • Không có thời hạn nước rút hoặc ưu tiên trường hợp sử dụng thích hợp trong phương pháp Agile. Họ không tập trung vào việc phát hành thứ gì đó cho người dùng càng nhanh càng tốt.

Sự phức tạp nên được giới hạn bằng cách thiết lập mục tiêu.

Đấu vật với sự phức tạp có nghĩa là các mục tiêu không được đặt ra hoặc không được khen thưởng xứng đáng.

Không có "bước ngoặt". Nếu quản lý phức tạp bằng cách nào đó là một vấn đề, một cái gì đó đã sai về mặt tổ chức.


1
Tôi không thấy vấn đề. Một dự án chạy tốt rất khó có thể đạt đến điểm không có lợi nhuận, nhưng không phải tất cả các dự án đều chạy tốt. Một số dự án chạy kém sẽ thành công dù sao, và phần còn lại sẽ thất bại vì nhiều lý do, đôi khi đánh vào điểm phức tạp không có lợi nhuận và đôi khi không.
David Thornley

@David Thornley: Đó là quan điểm của tôi. "Điểm phức tạp không thể quay lại" không tồn tại. Đó chỉ là quản lý tồi cũ. Không cần một cái tên tinh vi hay một quy tắc. Sự phức tạp chỉ là một triệu chứng của quản lý xấu. Không thực sự rất thú vị.
S.Lott

@ S.Lott: Tôi nghĩ rằng nó tồn tại, mặc dù không có trong các dự án được quản lý tốt. Có một loạt các dự án được quản lý tồi ở ngoài đó, và một số trong số chúng sẽ vào bên trong chân trời sự kiện phức tạp và một số thì không. Tôi thực sự không nghĩ rằng nó hữu ích để gộp tất cả quản lý xấu lại với nhau.
David Thornley

@David Thornley: Tôi nghĩ rằng rất khó để giải quyết vấn đề quản lý tồi (dẫn đến sự phức tạp khủng khiếp) từ quản lý tồi (dẫn đến việc mọi người bỏ việc). Tôi không thể thấy một cách để biết liệu một dự án sẽ trở nên quá phức tạp hay chỉ là muộn hoặc không đủ năng lực.
S.Lott

@ S.Lott: Tuy nhiên, có một sự khác biệt giữa một dự án nơi mọi người bỏ cuộc hoặc bị suy giảm sức khỏe nghiêm trọng và một dự án nơi sự phức tạp trở nên quá nhiều. Có nhiều cách khác nhau để thất bại, và nó có thể thú vị hoặc thậm chí hữu ích để phân loại chúng.
David Thornley

-2

Có các phương pháp để trực quan hóa và giám sát nguy cơ tăng độ phức tạp cho các dự án và mã (lớn). Khi chúng được áp dụng một cách hợp lý hy vọng một tên mới cho điểm không thể quay lại là không cần thiết. (Có một MOOC liên quan tại openHPI: https://open.hpi.de/cifts/softwareanalytics2015/ )

Cấu trúc phức tạp là một vấn đề thiết kế chung - không chỉ đối với thiết kế phần mềm trong các nhóm lớn. Hình dung là bước đầu tiên trong quản lý phức tạp cấu trúc. Ma trận và đồ thị có hướng cũng có thể được sử dụng cho mục đích này.

Một số phương pháp để giảm độ phức tạp của cấu trúc là http://www.buch.de/shop/home/suche/?fq=3540878890 :

  • mô đun hóa
  • tránh các vòng phản hồi
  • tam giác

Hơn nữa, có khái niệm về thiết kế tiên đề: https: \ en.wikipedia.org \ wiki \ Axiomatic_design \ Với khái niệm này có thể tránh được các vấn đề đáng tin cậy do sự phức tạp không cần thiết.

Do đó, có một loạt các phương pháp có sẵn. Cuối cùng, luôn luôn là về quyết định nghĩ về họ bởi vì một dự án đủ lớn.


Điều này không trả lời câu hỏi.
Hulk
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.