Bạn sẽ làm gì nếu bạn đạt đến mục đích thiết kế trong các phương pháp tiến hóa như Agile hoặc XP?


11

Khi tôi đang đọc bài viết nổi tiếng của Martin Fowler, Is Design Dead? , một trong những ấn tượng nổi bật mà tôi có được là do trong Phương pháp Agile và Lập trình cực đoan, thiết kế cũng như lập trình là tiến hóa, luôn có những điểm cần được tái cấu trúc.

Có thể là khi trình độ của lập trình viên tốt và họ hiểu được ý nghĩa thiết kế và không mắc lỗi nghiêm trọng, mã tiếp tục phát triển. Tuy nhiên, trong một bối cảnh bình thường, thực tế nền tảng trong bối cảnh này là gì?

Trong một ngày bình thường, một số phát triển quan trọng sẽ đi vào sản phẩm và khi thay đổi quan trọng xảy ra trong yêu cầu không phải là một hạn chế mà chúng ta mong muốn bao nhiêu, các khía cạnh thiết kế cơ bản không thể được sửa đổi? (không vứt bỏ phần chính của mã). Có phải nó không hoàn toàn có khả năng đi đến ngõ cụt về bất kỳ cải tiến nào có thể hơn về thiết kế và yêu cầu?

Tôi không ủng hộ bất kỳ thực hành phi Agile nào ở đây, nhưng tôi muốn biết từ những người thực hành các phương pháp phát triển nhanh hoặc lặp hoặc tiến hóa, như đối với kinh nghiệm thực tế của họ.

Bạn đã bao giờ đạt đến ngõ cụt như vậy ? Làm thế nào bạn có thể tránh được nó hoặc thoát khỏi nó? Hoặc có biện pháp nào để đảm bảo rằng thiết kế vẫn sạch sẽ và linh hoạt khi nó phát triển?

Câu trả lời:


17

Tôi vừa đọc liên kết bài viết mà bạn đã đăng, tôi phải nói rằng Fowler đã đưa ra một số điểm rất tốt và rất nhiều điều anh ấy nói, tôi đã ủng hộ với đội ngũ của chúng tôi trong nhiều năm.

IMO, nếu bạn thực hiện bất kỳ thiết kế tử tế nào, bạn không nên rơi vào tình huống được coi là tình huống chết chóc. Tôi đã luôn xem phần mềm được tạo thành từ các khối xây dựng . Tôi vẫn tin vào một số thiết kế phía trước, nhưng mục tiêu chính không phải là thiết kế toàn bộ sản phẩm, mà là cung cấp kiến ​​trúc / hướng tổng thể để nhóm của bạn có thể hình dung ra một bức tranh chung mà tất cả chúng ta đang hướng tới. Nếu bạn có một loạt các mảnh hình khối và hình tam giác, sẽ rất hữu ích khi phác thảo cách một lâu đài sẽ được ghép lại với nhau trước khi bạn đơn giản bắt đầu đập các mảnh lại với nhau.

Vì tôi đến từ vùng đất OO, nên đối với tôi, mỗi khối là một lớp và diện tích bề mặt của khối đó là giao diện chung (những gì có thể nhìn thấy bởi các lớp bên ngoài hoặc dẫn xuất). Nếu bạn tuân theo các nguyên tắc RẮN tốt, bạn sẽ đảm bảo rằng mỗi khối cực kỳ đơn giản và có giao diện chung trực quan. Quay trở lại với sự tương tự của tôi, bạn muốn chắc chắn rằng mã của bạn chỉ tạo ra các hình dạng đơn giản. Bất cứ khi nào bạn tạo các lớp quá phức tạp (nhiều hàm, nhiều biến), bạn tạo các hình dạng khó sử dụng lại khi yêu cầu thay đổi.

Tôi đồng ý với Fowler rằng rủi ro / thách thức lớn nhất đối với thiết kế tiến hóa là bạn để các quyết định thiết kế theo thời gian mã hóa và bạn mong muốn mỗi nhà phát triển riêng lẻ đưa ra các quyết định đó. Đây là nơi hệ thống có thể bị hỏng nếu bạn không có cơ chế phản hồi thích hợp. Bất cứ khi nào một tính năng mới được yêu cầu, sẽ cực kỳ hấp dẫn khi chỉ cần tìm hàm cần được mở rộng, đặt một số loại điều kiện bên trong nó và chỉ cần thêm một loạt mã ngay bên trong hàm đó. Và đôi khi, đây có thể là tất cả những gì cần thiết, nhưng đây cũng là (IMO) thực tiễn phổ biến nhất dẫn đến các thành phần cụ thể. Điều này không có gì để làm với thiết kế tiến hóa. Đây là những gì được gọi là "không thiết kế".

Miễn là bạn dành thời gian để lùi lại và nói, đợi một chút, lớp này đã có 15 biến thành viên, hãy để tôi trích xuất 6 biến này và đưa vào lớp khép kín của riêng chúng, phần mềm của bạn sẽ được tạo thành rất nhẹ khối xây dựng nặng, linh hoạt và có thể tái sử dụng. Chắc chắn nếu các PM xuất hiện và thay đổi một nửa yêu cầu sản phẩm đối với bạn, bạn có thể phải lấy một số khối của mình ra, đặt chúng trở lại trên kệ và vẽ một số khối mới (giống như khi xây lâu đài, bạn không thể sử dụng tất cả xi lanh của bạn). Nhưng tại thời điểm đó, đó chỉ là một phần của hoạt động kinh doanh. Yêu cầu thay đổi và bằng cách giữ cho mã của bạn linh hoạt và mô-đun, bạn sẽ có thể thay đổi sản phẩm của mình để phù hợp với hướng kinh doanh mới của bạn.

Tôi tin rằng phương pháp tiến hóa này để thiết kế hoạt động với mọi cấp độ kỹ năng của kỹ sư. Cá nhân tôi đã làm phần mềm trong một thời gian rất dài và trước khi nhóm của chúng tôi chuyển sang phương pháp nhanh, tôi chịu trách nhiệm vận chuyển một số thành phần chính từ máy tính dev của tôi gần như trực tiếp đến khách hàng mà hầu như không có QA. Đồng thời những thành phần đó luôn luôn linh hoạt và có thể bảo trì.

Tôi chỉ cố gắng nói rằng tôi cho rằng mình tương đối giỏi trong việc thiết kế phần mềm. Đồng thời, nếu bạn yêu cầu tôi viết một tài liệu thiết kế 100 trang, đưa nó cho một lập trình viên và mong đợi nó hoạt động, có lẽ tôi không thể tự thiết kế ra khỏi túi giấy. Khi bắt đầu công việc, đôi khi tôi sẽ phác thảo một vài sơ đồ giống như UML (rất đơn giản, không phải ngôn ngữ đầy đủ), nhưng khi tôi bắt đầu viết mã, tôi sẽ cấu trúc lại trên cơ sở khi cần và mã cuối cùng của tôi sẽ không giống như những gì tôi đã vẽ ban đầu. Ngay cả khi tôi dành một hoặc hai tháng để suy nghĩ về từng chi tiết nhỏ, tôi không thể chụp ảnh người khác có thể lấy sơ đồ của mình và đưa ra một phần mềm vững chắc mà không sửa đổi thiết kế khi họ đang mã hóa.

Ở phía bên kia của quang phổ, hiện tại trong nhóm của tôi (bây giờ nhanh nhẹn và tôi hoàn toàn ủng hộ điều đó) chúng tôi có một vài người tham gia với chúng tôi từ vùng đất nhúng nơi họ chỉ mới làm C trong 15 năm qua. Tôi rõ ràng đã giúp với một số kế hoạch ban đầu và sắp xếp các lớp học nhưng tôi cũng đảm bảo theo dõi các đánh giá mã thường xuyên và các phiên động não nơi chúng ta thảo luận về các ứng dụng của RẮN và các nguyên tắc thiết kế. Họ đã sản xuất một số mã spaghetti khiến tôi co rúm lại một chút, nhưng chỉ với một chút nũng nịu từ tôi, họ bắt đầu tái cấu trúc những gì đã được sản xuất và điều thú vị là một trong số họ đã quay lại với tôi vài ngày sau đó và nói, tôi ghét để nói điều đó nhưng sau khi chuyển mã đó ra, điều này có vẻ dễ đọc và dễ hiểu hơn nhiều. Ngõ cụt. Điểm tôi ' Tôi đang cố gắng thực hiện là ngay cả một người hoàn toàn mới với OO cũng có thể tạo ra một số mã khá, miễn là anh ta có một người cố vấn có nhiều kinh nghiệm hơn, để nhắc nhở anh ta rằng "thiết kế tiến hóa" không giống như "không thiết kế". Và ngay cả một số lớp "phức tạp" hơn của anh ta cũng không đáng sợ vì mỗi lớp không có nhiều trách nhiệm (nghĩa là không có nhiều mã), vì vậy điều tồi tệ nhất sẽ trở nên tồi tệ hơn, nếu một lớp đó "bế tắc", chúng ta tặc lưỡi và viết một lớp thay thế có cùng giao diện chung (cho đến nay tôi chưa bao giờ thấy cần phải có sự dự phòng này trong bất cứ điều gì chúng tôi đã viết và tôi đã thực hiện đánh giá mã hai lần một tuần).

Lưu ý cuối cùng, tôi cũng là một người tin tưởng vững chắc vào các tài liệu thiết kế (ít nhất là cho các điều kiện kinh doanh của nhóm hiện tại của tôi) nhưng mục tiêu chính cho các tài liệu thiết kế của chúng tôi là Bộ nhớ tổ chức , vì vậy các tài liệu thực tế được viết sau khi mã được sản xuất và tái cấu trúc. Trước khi mã hóa, chúng ta thường có giai đoạn thiết kế nhanh (đôi khi không nhanh) khi chúng ta phác thảo các lớp trên khăn ăn / mspaint / visio và tôi luôn nhắc nhở mọi người rằng giai đoạn này tạo ra một con đường để đi theo, không phải là kế hoạch chi tiết và khi họ bắt đầu viết mã, bất cứ điều gì không có ý nghĩa nên được thay đổi. Ngay cả với những lời nhắc nhở này, những kẻ mới hơn có xu hướng cố gắng sao lưu mã phù hợp vào thiết kế ban đầu cho dù nó có cảm giác không tự nhiên như thế nào ngay cả với họ. Điều này thường xuất hiện trong các đánh giá mã.

Dang, tôi đã viết rất nhiều. Xin lỗi vì điều đó.


1
+1 Nó đáng giá cho mỗi từ. Tôi tình cờ gặp những tình huống như bạn mô tả và sau khi thời hạn được đáp ứng, hãy yêu cầu họ dọn dẹp (đọc tái cấu trúc) nhiều hơn từ những gì tôi nghĩ là hợp lý của thiết kế. Nhưng mọi người thường tìm thấy cùng một câu hỏi lặp đi lặp lại - Tại sao tôi lại làm điều tương tự? Tôi đoán bây giờ tôi đã có câu trả lời - nếu bạn cần thời gian nhanh hơn để tiếp thị và cho phép thiết kế phát triển, tái cấu trúc không phải là một khoản bồi thường cho những tội lỗi cũ của bạn mà thực sự là một việc làm hợp pháp.
Dipan Mehta

Vâng, bạn đã viết rất nhiều, nhưng đó là một điều tốt. Thực sự rất thích đọc nó :).
Radu Murzea

11

Tôi muốn nói hiện tượng "thiết kế ngõ cụt" là trực giao với các phương thức nhanh. Ý tôi là có thể làm thác nước, dành nhiều thời gian trả trước cho một thiết kế (xấu). Sau đó dành rất nhiều thời gian để thực hiện nó chỉ để thấy mình ở một ngõ cụt.

Nếu bất cứ điều gì, các phương thức nhanh sẽ giúp bạn khám phá sớm hơn rằng bạn đã lựa chọn thiết kế xấu. Lý do cho điều này là vì hồ sơ tồn đọng của bạn nên có các mục giá trị khách hàng cao nhất được thực hiện trước tiên và bạn nên tập trung vào việc cung cấp các mức tăng hữu ích của phần mềm. Nếu thiết kế của bạn cho phép bạn cung cấp giá trị cao và hữu ích thì nó đã tốt cho một thứ gì đó :-) Ngược lại, bạn có thể có một thiết kế tồi trong tình huống thác nước mà bạn không thể phát hiện ra trong nhiều năm mà thiết kế này không thể cung cấp bất kỳ giá trị và bất kỳ sự hữu ích nào - tất cả những gì bạn có là ảo tưởng về nó là một thiết kế tốt. Như họ nói, bằng chứng là trong bánh pudding.

Mặt trái là ngay cả trong các phương thức nhanh, điều quan trọng là phải có một tầm nhìn khả thi cho thiết kế của hệ thống, điều khiển các quyết định từ lặp đi lặp lại đến lặp lại. Tôi nghĩ Ken Schwabber đã nói điều gì đó giống như nếu bạn có một nhóm các nhà phát triển khủng khiếp, họ sẽ tạo ra phần mềm xấu liên tục lặp đi lặp lại bằng cách lặp. Agile đơn giản có nghĩa là không dành nhiều thời gian trả trước vì bạn bị giới hạn trong những gì bạn có thể học hoặc tưởng tượng trước khi bắt đầu thực hiện ( các yêu cầu cũng thay đổi). Tuy nhiên, có một số tình huống bạn phải làm công việc trả trước (ví dụ như nghiên cứu) và sau đó bạn phải làm điều đó.

Làm thế nào để bạn tránh được ngõ cụt?

Tôi sẽ nói chủ yếu bằng cách dự đoán các yêu cầu trong tương lai. Đây là điều bạn có được với kinh nghiệm và sự quen thuộc với các dự án / sản phẩm tương tự. Dự đoán này là một phần giúp bạn đặt một thiết kế tốt vì bạn tự hỏi mình rất nhiều câu hỏi "nếu như" về hệ thống hiện tại của bạn. Đối với tôi đây là thành phần quan trọng. Các kỹ thuật như OO chỉ đơn giản là giúp bạn khi bạn đã biết những gì bạn đang làm.

Bạn sẽ làm gì nếu bạn có một ngõ cụt?

Một "ngõ cụt" không khác gì bất kỳ khối kỹ thuật nào khác mà bạn sẽ gặp trong quá trình phát triển bất cứ thứ gì mới lạ. Điều đầu tiên nhận ra là thực sự không có "ngõ cụt" thực sự buộc bạn phải hoàn toàn quay lại. Ít nhất thì việc học của bạn cho đến thời điểm này là điều cho phép bạn tiến lên để nỗ lực không bị lãng phí. Khi bạn đi vào ngõ cụt, bạn có một vấn đề . Vấn đề là những gì cần thay đổi để đáp ứng một số yêu cầu mới (hoặc cũ) và cách tối ưu hóa thực hiện thay đổi này. Tất cả bạn phải làm bây giờ là giải quyết vấn đề này. Hãy biết ơn vì đây là phần mềm và không, ví dụ như thiết kế máy bay, vì thay đổi dễ dàng hơn nhiều. Xác định các vấn đề, sửa chúng == refactor == kỹ thuật phần mềm. Đôi khi có rất nhiều công việc liên quan ...

Nếu bạn sử dụng Scrum, thay đổi này sẽ tự nhiên được điều khiển từ các câu chuyện của người dùng (người dùng nhận được gì từ thay đổi này?). Quá trình sẽ bắt đầu từ một câu chuyện không thể dễ dàng được chấp nhận bởi thiết kế hiện tại (rất tiếc) và một cuộc thảo luận sẽ xảy ra với chủ sở hữu sản phẩm về cách phá vỡ câu chuyện này. Bạn tiếp tục áp dụng các nguyên tắc nhanh nhẹn thông qua thay đổi này.

Một vài thay đổi yêu cầu lớn nổi tiếng từ thế giới HĐH xuất hiện trong đầu tôi:

Bất cứ cách nào bạn nhìn vào chúng đều rất nhiều công việc. Thiết kế ban đầu gần như chắc chắn đã không tính đến khả năng điều này xảy ra (tức là tính không phù hợp không phải là một yêu cầu lớn). Việc thiết kế có phải là OO hay không có lẽ cũng không phải là một yếu tố lớn. Trong một thiết kế tốt, các phần cụ thể của nền tảng sẽ hơi bị cô lập và công việc sẽ dễ dàng hơn.


Trên thực tế, các phiên bản đầu tiên của Windows NT đã triển khai "Lớp trích xuất phần cứng" và hỗ trợ DEC Apha cũng như x86. Vì không ai từng mua máy dựa trên DEC alpha nên điều này đã lặng lẽ giảm xuống. Tôi sẽ tưởng tượng rằng "tính độc lập máy" này vẫn tồn tại ở định dạng dấu tích trong bản phát hành hiện tại nên một cổng ARM có thể không quá khó.
James Anderson

3

Tôi cấu trúc lại các dự án của mình vĩnh viễn và cũng sử dụng các sơ đồ lớp UML. Ý tôi là tôi tạo một hoặc nhiều sơ đồ lớp theo gói. Mỗi sơ đồ được lưu ở thư mục gốc của gói. Mỗi trình phân loại UML có một Id riêng được ánh xạ tới Id Java liên quan. Điều đó có nghĩa là khi tôi mở sơ đồ của mình, nó sẽ tự động được cập nhật lên các thay đổi tái cấu trúc mã mới nhất. Tôi cũng có thể trực tiếp thay đổi sơ đồ lớp của mình ở cấp đồ họa và tất cả dự án của tôi ngay lập tức được tái cấu trúc. Nó hoạt động khá tốt nhưng nó sẽ không bao giờ thay thế con người. Sơ đồ lớp UML của tôi cũng chỉ là dạng xem đồ họa của mã của tôi. Điều rất quan trọng là không được trộn lẫn mã và mô hình như nhật thực EMF đang làm bởi vì ngay khi tái cấu trúc được thực hiện thì thông tin mô hình cũng bị mất. Tôi không bao giờ sử dụng trình tạo mã Model Driven Development vì điều này là vô ích. Tôi không

Phải nói rằng có hơn 100 sơ đồ lớp đại diện cho tất cả các chi tiết về cấu trúc dự án của tôi và đầy đủ các ghi chú ở khắp mọi nơi thực sự hữu ích. Tôi chỉ tạo sơ đồ lớp cho các dự án vì thông thường các nhà phát triển không có thời gian để tìm hiểu hoặc sử dụng các sơ đồ khác. Biểu đồ lớp cũng rất tốt vì tự động cập nhật. Các sơ đồ lớp có thể được tạo sau mã bằng cách chỉ đảo ngược một gói và thêm ghi chú. Nó nhanh và luôn chính xác và lặp lại 100%.

Xin đừng nhầm lẫn giữa phát triển theo mô hình là mã tạo mô hình và thường sử dụng UML làm trình bày đồ họa với sơ đồ lớp UML được cập nhật từ mã. Chỉ mã được đồng bộ hóa UML có giá trị thực cho tôi nếu nhiều lần lặp.

Xin lỗi vì quá dài nhưng tôi nghĩ chúng ta nên tạo cơ hội thứ hai cho các sơ đồ lớp UML nếu chỉ được sử dụng làm chế độ xem đồ họa cho dự án của chúng tôi. Điều đó có nghĩa là UML bao trùm toàn bộ dự án và có một mô hình duy nhất được tạo bởi các sơ đồ lớp lớn đại diện cho toàn bộ dự án. Sẽ thật nực cười khi có hàng trăm lượt xem nhỏ và một mô hình cho mỗi lượt xem trong một dự án có hàng trăm lượt xem :-)


1
+1 để hiển thị ý tưởng về mã bưu điện UML! Thật thú vị, chúng tôi không bao giờ quay lại tài liệu sơ đồ sau mã!
Dipan Mehta

Đúng, đây chính xác là vấn đề với sự phát triển theo mô hình liên quan đến UML. Bạn tạo tài liệu và sau đó không bao giờ sử dụng nó nếu có bất kỳ sửa đổi dự án. Hợp nhất mô hình và mã cho phép chúng tôi sử dụng UML và thay đổi nó nhiều lần chúng tôi cần.
UML_GURU

3

Tôi đã đi đến ngõ cụt mã của tôi và mã khác do thiết kế xấu, thay đổi hướng, v.v. Tôi cũng đã thấy nhiều người khác gặp phải vấn đề này. Sai lầm lớn (ít nhất có vẻ như là một lỗi với tôi) là mong muốn ngay lập tức vứt bỏ mã làm việc và thực hiện lại mọi thứ từ đầu.

Tôi đã tiếp cận từng trường hợp theo cùng một cách có vẻ hoạt động tốt:

  • xác định lý do tại sao thiết kế hiện tại không hoạt động
  • đưa ra một thiết kế mới một kế hoạch chuyển đổi
  • gắn thẻ mã sẽ không được sử dụng là không dùng nữa
  • chỉ thực hiện những gì tôi cần cho thiết kế mới để đáp ứng nhu cầu ngay lập tức
  • loại bỏ mã mà mã mới làm cho lỗi thời

Chi phí:

  • phức tạp hơn do 2 triển khai trong cơ sở mã cùng một lúc
  • tổng chi phí cho mỗi tính năng / sửa lỗi nhiều hơn so với thực hiện thiết kế lại / thực hiện lại toàn bộ giả định các trường hợp sử dụng và kiểm tra tốt

Những lợi ích:

  • ít nhất là một thứ tự cường độ ít rủi ro hơn bởi vì bạn vẫn có thiết kế / mã làm việc cũ
  • nhanh hơn để tiếp thị cho bất kỳ tính năng 1 đến n-1 nào không yêu cầu thiết kế lại hoàn toàn
  • nếu sản phẩm / mã kết thúc chết trước khi bạn hoàn thành thiết kế lại hoàn toàn, bạn sẽ tiết kiệm được chênh lệch thời gian phát triển
  • phương pháp lặp và tất cả những lợi ích trong đó

2

Khoảng một hoặc hai tháng trước, dự án hiện tại của chúng tôi đã gặp một chút khó khăn do một số quyết định thiết kế tồi (và thiếu nhiều thiết kế ở một nơi), với phong cách phát triển SCRUM.

Giải pháp của chúng tôi (và những gì tôi tin là tiêu chuẩn cho SCRUM) là dành toàn bộ nước rút (~ 2 tuần) cho không gì khác ngoài tái cấu trúc. Không có chức năng mới nào được thêm vào trong thời gian này, nhưng chúng tôi có thể nghĩ về cơ sở mã hiện tại và thiết kế một hệ thống tốt hơn nhiều cho những gì chúng tôi đang làm.

Bây giờ chúng ta đã vượt qua rào cản đó và đã được thêm các tính năng mới một lần nữa.


Đây là một ma sát lớn khác để tìm. Phải nói với khách hàng - rằng chúng tôi hiện đang xây dựng cùng một thứ - các tính năng không có gì mới, sau khi phiên bản đầu tiên được bàn giao! Bao lâu và thường xuyên (nếu có) bạn có thể đủ khả năng để nói điều này với khách hàng? hoặc làm thế nào để bạn thậm chí giải thích?
Dipan Mehta

Bạn có hai tùy chọn cơ bản, đầu tiên bạn chỉ cần nói sự thật đơn giản - rằng mặc dù những gì bạn đang làm là một mớ hỗn độn và nó cần được dọn dẹp để tiến lên hoặc thứ hai rằng bạn đang xây dựng cơ sở hạ tầng để hỗ trợ sự phát triển đang diễn ra ( Điều này không kém phần đúng nhưng được tạo ra để tích cực hơn một chút). Bạn có thể gói cả hai thứ này lên bằng cách nói rằng để cung cấp chức năng, chúng tôi phải gánh chịu một khoản nợ kỹ thuật hiện cần phải trả.
Murph

@Dipan Mehta: Chà, giả sử một khách hàng muốn có một ngôi nhà hai tầng. Bạn thiết kế và cung cấp nó. Sau đó, họ muốn có thêm bốn tầng. Bạn nói, tốt, tôi phải dành thời gian này chỉ để làm cho tòa nhà hiện tại mạnh mẽ hơn để nó sẽ chứa thêm bốn tầng nữa. Vì vậy, tôi không nghĩ rằng đây sẽ là một vấn đề cho khách hàng nếu kế hoạch ban đầu chỉ bao gồm hai tầng. Nếu sáu tầng được lên kế hoạch ngay từ đầu thì có, đó có thể là một vấn đề để nói với khách hàng.
Giorgio

@DipanMehta Chúng tôi cũng có một chút may mắn khi khách hàng không nhất thiết phải biết về dự án này. Đây là một bản nâng cấp cho sản phẩm họ hiện đang sử dụng, với ngày hoàn thành nửa mơ hồ vào khoảng cuối năm nay. Vì vậy, họ thậm chí không cần biết về sự chậm trễ trong việc tái cấu trúc;) (Người quản lý xử lý hầu hết các quyết định thiết kế là trong nhà)
Izkata

2

Chìa khóa để hạn chế chi phí thay đổi thiết kế là giữ mã càng DRY càng tốt. Điều này sẽ thúc đẩy hầu hết các mã ứng dụng đến một mức rất cao, trong đó hầu hết các mã trực tiếp thể hiện ý định và tương đối ít chỉ định cơ chế. Nếu bạn làm điều này, thì các quyết định thiết kế sẽ có biểu thức nhỏ nhất có thể có trong mã và các thay đổi thiết kế sẽ có chi phí ít nhất có thể.


2

Chìa khóa để tránh ngõ cụt thiết kế là nhận ra càng sớm càng tốt khi thiết kế của bạn cần thay đổi, và sau đó thay đổi nó. Vấn đề lớn nhất không phải là do liên tục phát triển thiết kế của bạn, mà là từ chối phát triển thiết kế của bạn cho đến khi nó là một vấn đề lớn.

Ví dụ, Netflix có một tính năng hồ sơ, nơi các thành viên gia đình khác nhau có thể lập hóa đơn cho cùng một gói, nhưng có hàng đợi riêng. Vài năm trước, họ tuyên bố họ sẽ phải hủy tính năng đó, bởi vì chỉ có khoảng 10% người dùng của họ sử dụng nó, nhưng do bị hack khi thực hiện, nó đã ăn quá nhiều công việc bảo trì. Sau một tiếng ồn ào, họ cắn viên đạn và thiết kế lại đắt tiền để giữ những khách hàng đó.

Tôi chắc chắn rằng có một số kỹ sư đã nhận ra một thiết kế tối ưu khi họ lần đầu tiên thêm tính năng đó. Nếu sau đó họ đã thay đổi nó, thì đó sẽ không phải là một thỏa thuận lớn.


1

Chẳng phải Fred Brooks đã nói điều gì đó như "Kế hoạch ném người đầu tiên đi" sao? Đừng cảm thấy quá lo lắng về nó, các thiết kế đã chết cũng xuất hiện trong các dự án cố gắng thực hiện tất cả các thiết kế trước. Thiết kế lại xảy ra trong tất cả các loại phát triển, cho dù đó là thiết kế không thể thực hiện được ngay từ đầu (20% cuối cùng bị che lấp - "ma quỷ nằm trong chi tiết") hoặc do khách hàng thay đổi trọng tâm. Không có nhu cầu thực sự cho chuông báo thức, đừng quá lo lắng.

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.