Có một nguyên tắc bao trùm chi phối nhu cầu tái cấu trúc và tối ưu hóa, cả trong thác nước và Agile: YAGNI (You Ain't Gonna Need It). Một nguyên tắc thứ hai là hệ quả của thứ nhất: "Tối ưu hóa sớm là gốc rễ của mọi tội lỗi", tương đương mã hóa của câu tục ngữ chung "kẻ thù của sự xuất sắc là sự hoàn hảo".
Hãy dự đoán và áp dụng chúng. Bạn có yêu cầu xây dựng thuật toán ETL lấy một tệp thuộc loại cụ thể, trích xuất thông tin của nó, sau đó đưa thông tin đó vào cơ sở dữ liệu. Mục tiêu của bạn trong tuần này (vì mục đích của chúng tôi, không quan trọng bạn đang ở trong cửa hàng Agile hay SDLC) là để hoàn thành nó.
Bạn là một người thông minh, và bạn đã được nhìn thoáng qua bức tranh lớn. Bạn biết rằng đây không phải là loại tệp duy nhất mà dự án sẽ cần một ETL. Vì vậy, bạn xem xét việc triển khai thuật toán ETL này cũng hoạt động trên một loại tệp khác, chỉ có những khác biệt nhỏ. Làm điều này sẽ vi phạm YAGNI. Công việc của bạn không phải là phát triển thuật toán cho tập tin khác đó; đó là phát triển thuật toán cho một tệp cần thiết vào cuối tuần. Để đáp ứng mục tiêu đó và vượt qua các bài kiểm tra chấp nhận, bạn cần phát triển thuật toán đó và làm cho nó hoạt động chính xác. Bạn "không cần" mã bổ sung để làm cho nó hoạt động với tệp khác. Bạn có thể nghĩ rằng nó sẽ giúp bạn tiết kiệm thời gian để kết hợp nó ngay bây giờ, và bạn có thể đúng, nhưng bạn cũng có thể sai lầm khủng khiếp; thuật toán cho tệp khác có thể cần được sử dụng trong một khu vực của hệ thống mà mã của bạn không thể được sử dụng hoặc các yêu cầu đối với tệp mới có thể khác với các cách bạn không biết (trong Agile, những cách đó yêu cầu có thể chưa tồn tại). Trong khi đó, bạn đã lãng phí thời gian và tăng độ phức tạp của thuật toán một cách không cần thiết.
Bây giờ, đó là tuần tới, và như một phần thưởng đáng ngờ cho công việc xuất sắc của bạn trên thuật toán đầu tiên, bạn đã được giao nhiệm vụ tạo thuật toán cho hai loại tệp mới. Bây giờ, bạn cần mã bổ sung để làm cho thuật toán của bạn hoạt động với nhiều tệp hơn. Bạn có thể mở rộng thuật toán hiện tại của mình bằng cách sử dụng mẫu phương thức mẫu sẽ sử dụng mẫu cơ bản với các bước riêng cho từng tệp hoặc bạn có thể chỉ cần lấy giao diện chung từ thuật toán hiện tại của mình, phát triển hai mẫu mới theo giao diện và cắm chúng vào một đối tượng có thể chọn sử dụng thuật toán nào.
Trong khi phát triển, bạn biết rằng bạn có một yêu cầu là hệ thống có thể xử lý 10KB dữ liệu thô mỗi giây. Bạn thực hiện kiểm tra tải và tìm thuật toán dự thảo ban đầu của bạn xử lý 8KB / s. Chà, điều đó sẽ không vượt qua AAT. Bạn hãy xem và thấy rằng có một số cấu trúc vòng lặp linh hoạt O (Chúa tôi) trong thuật toán của bạn; bạn hợp lý hóa nó và nhận được 12KB / s. "Khá tốt", bạn nghĩ, "nhưng nếu tôi có một vòng lặp kém trong mã, tôi có thể cạo cái gì khác?". buzz Bạn vừa vi phạm quy tắc "tối ưu hóa sớm". Mã của bạn hoạt động, và vượt qua tất cả các yêu cầu. Bạn đã "hoàn thành", cho đến khi các yêu cầu được cập nhật để yêu cầu 15KB / s. Nếu và khi điều đó xảy ra, THÌ bạn kéo mã trở lại và tìm kiếm những thứ cần cải thiện.
Thực hiện theo quy trình đơn giản này trong khi phát triển, cho dù ở Agile hay SDLC truyền thống: "Trên đường chuyền đầu tiên, hãy làm cho nó hoạt động. Ở đường chuyền thứ hai, hãy làm cho nó đẹp. Ở đường chuyền thứ ba, hãy làm cho nó RẮN." Điều này có nghĩa là gì, khi bạn lần đầu tiên tạo một dòng mã, hãy làm cho mã đó thực hiện công việc của nó một cách chính xác và không có lỗi, nhưng đừng quá chú ý đến các quy tắc thiết kế trong mã này, như tất cả những gì bạn biết ngay bây giờ bạn ' Sẽ không bao giờ chạm vào khu vực này một lần nữa. Lần sau khi bạn truy cập vào dòng mã đó, bạn đã chứng minh rằng mình đã sai; nó không còn là một phần của hệ thống. Tái cấu trúc nó để dễ đọc, đồng nhất mã và / hoặc nguyên tắc DRY (bạn có thể đã sao chép một số mã để thực hiện điều gì đó năm lần; tái cấu trúc mã đó thành một vòng lặp và / hoặc gọi phương thức). Lần thứ ba bạn đang làm việc trong hoặc xung quanh dòng mã đó,
O(my God)-complexity
nếu không có gì khác, làm tôi cười!