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 đó.