Tóm lại: nó phụ thuộc
Chi tiết
Bạn sẽ cần những thứ sạch sẽ, sáng bóng?
Có những điều cần thận trọng ở đây, và bạn cần xác định giới hạn giữa mức tăng thực, mức có thể đo được và đâu là sở thích cá nhân của bạn và thói quen xấu tiềm ẩn khi chạm vào mã không nên có.
Cụ thể hơn, biết điều này:
Đó là một mô hình chống, và nó đi kèm với các vấn đề tích hợp:
- nó có thể mở rộng hơn , nhưng có thể không dễ dàng mở rộng hơn,
- nó có thể không đơn giản để hiểu ,
- cuối cùng, nhưng chắc chắn không kém phần quan trọng ở đây: bạn có thể làm chậm toàn bộ mã.
Một số người cũng có thể đề cập đến nguyên tắc KISS như một tài liệu tham khảo, nhưng ở đây nó phản trực giác: cách tối ưu hóa theo cách đơn giản hay cách kiến trúc sạch sẽ? Câu trả lời không nhất thiết là tuyệt đối, như được giải thích trong phần còn lại dưới đây.
Các nguyên tắc YAGNI là không hoàn toàn trực giao với các vấn đề khác, nhưng nó giúp để tự hỏi mình câu hỏi: Bạn sẽ cần đến nó?
Liệu kiến trúc phức tạp hơn có thực sự mang lại lợi ích cho bạn, ngoài việc mang lại vẻ ngoài dễ bảo trì hơn?
Viết cái này lên một tấm áp phích lớn và treo nó bên cạnh màn hình của bạn hoặc trong khu vực nhà bếp tại nơi làm việc, hoặc trong phòng họp của nhà phát triển. Tất nhiên có rất nhiều câu thần chú khác đáng để bạn lặp lại, nhưng câu thần chú này rất quan trọng mỗi khi bạn cố gắng thực hiện "công việc bảo trì" và cảm thấy thôi thúc "cải thiện" nó.
Thật tự nhiên khi chúng ta muốn "cải thiện" mã hoặc thậm chí chỉ cần chạm vào nó, thậm chí vô thức, khi chúng ta đọc qua nó để cố gắng hiểu nó. Đó là một điều tốt, vì điều đó có nghĩa là chúng tôi quan tâm và cố gắng hiểu sâu hơn về nội bộ, nhưng nó cũng bị ràng buộc với trình độ kỹ năng, kiến thức của chúng tôi (làm thế nào để bạn quyết định điều gì tốt hơn hay không? ...) và tất cả các giả định chúng tôi đưa ra về những gì chúng tôi nghĩ rằng chúng tôi biết phần mềm ...:
- thực sự làm
- thực sự cần phải làm
- cuối cùng sẽ cần phải làm,
- và nó làm tốt như thế nào
Có thực sự cần phải được tối ưu hóa?
Tất cả điều này nói, tại sao nó được "tối ưu hóa" ngay từ đầu? Họ nói rằng tối ưu hóa sớm là gốc rễ của mọi tội lỗi và nếu bạn thấy mã không có giấy tờ và dường như được tối ưu hóa, thông thường bạn có thể cho rằng nó có thể không tuân theo Quy tắc Tối ưu hóa không cần nỗ lực tối ưu hóa và đó chỉ là Sự kiêu ngạo của nhà phát triển thông thường đang khởi động. Một lần nữa, có lẽ bây giờ chỉ là của bạn.
Nếu có, trong giới hạn nào nó trở nên chấp nhận được? Nếu có nhu cầu về nó, giới hạn này tồn tại và cung cấp cho bạn cơ hội để cải thiện mọi thứ hoặc khó khăn để quyết định để nó đi.
Ngoài ra, hãy cẩn thận với các đặc điểm vô hình. Rất có thể, phiên bản "có thể mở rộng" của mã này sẽ giúp bạn tăng thêm bộ nhớ trong thời gian chạy, và thậm chí còn hiển thị cả bộ nhớ tĩnh lớn hơn cho tệp thực thi. Các tính năng OO sáng bóng đi kèm với chi phí không trực quan như thế này và chúng có thể quan trọng đối với chương trình của bạn và môi trường mà nó phải chạy.
Đo lường, đo lường, đo lường
Như Google hiện tại, tất cả là về dữ liệu! Nếu bạn có thể sao lưu dữ liệu, thì cần thiết.
Có một câu chuyện không quá cũ đến nỗi cứ 1 đô la chi cho phát triển, nó sẽ được theo sau ít nhất 1 đô la để thử nghiệm và ít nhất là 1 đô la hỗ trợ (nhưng thực sự, nó còn nhiều hơn thế).
Thay đổi tác động rất nhiều thứ:
- bạn có thể cần phải tạo một bản dựng mới;
- bạn nên viết các bài kiểm tra đơn vị mới (chắc chắn nếu không có bài kiểm tra nào, và kiến trúc mở rộng hơn của bạn có thể còn nhiều chỗ hơn, vì bạn có nhiều bề mặt hơn cho các lỗi);
- bạn nên viết các bài kiểm tra hiệu suất mới (để đảm bảo rằng điều này sẽ ổn định trong tương lai và để xem các nút thắt cổ chai ở đâu), và những điều này rất khó thực hiện ;
- bạn sẽ cần ghi lại nó (và mở rộng hơn có nghĩa là có nhiều chỗ hơn để biết chi tiết);
- bạn (hoặc người khác) sẽ cần kiểm tra lại rộng rãi trong QA;
- mã (hầu như) không bao giờ không có lỗi và bạn sẽ cần hỗ trợ nó.
Vì vậy, nó không chỉ tiêu thụ tài nguyên phần cứng (tốc độ thực hiện hoặc dấu chân bộ nhớ) mà bạn cần đo ở đây, mà còn là mức tiêu thụ tài nguyên nhóm . Cả hai cần phải được dự đoán để xác định mục tiêu mục tiêu, được đo lường, tính toán và điều chỉnh dựa trên sự phát triển.
Và đối với người quản lý của bạn, điều đó có nghĩa là phù hợp với kế hoạch phát triển hiện tại, do đó, hãy liên lạc về nó và đừng tham gia vào mã hóa con bò / tàu ngầm / tàu ngầm đen.
Nói chung...
Đúng nhưng...
Nói chung, đừng hiểu sai ý tôi, tôi muốn ủng hộ lý do tại sao bạn đề xuất và tôi thường ủng hộ điều đó. Nhưng bạn cần lưu ý về chi phí dài hạn.
Trong một thế giới hoàn hảo, đó là giải pháp phù hợp:
- phần cứng máy tính trở nên tốt hơn theo thời gian,
- trình biên dịch và nền tảng thời gian chạy trở nên tốt hơn theo thời gian,
- bạn có được mã gần hoàn hảo, sạch sẽ, có thể bảo trì và dễ đọc.
Trong thực tế:
bạn có thể làm cho nó tồi tệ hơn
Bạn cần nhiều nhãn cầu hơn để nhìn vào nó, và bạn càng phức tạp hóa nó, bạn càng cần nhiều nhãn cầu hơn.
bạn không thể dự đoán tương lai
Bạn không thể biết chắc chắn tuyệt đối nếu bạn cần nó và ngay cả khi "tiện ích mở rộng" bạn cần sẽ dễ dàng và nhanh chóng hơn để thực hiện ở dạng cũ và nếu bản thân chúng cần phải được tối ưu hóa siêu hạng .
nó đại diện, từ quan điểm của quản lý, một chi phí lớn cho không có lợi ích trực tiếp.
Biến nó thành một phần của quá trình
Bạn đề cập ở đây rằng đó là một thay đổi khá nhỏ và bạn có một số vấn đề cụ thể trong đầu. Tôi muốn nói rằng nó thường ổn trong trường hợp này, nhưng hầu hết chúng ta cũng có những câu chuyện cá nhân về những thay đổi nhỏ, những chỉnh sửa gần như phẫu thuật, cuối cùng biến thành cơn ác mộng bảo trì và thời hạn gần như bị bỏ lỡ hoặc bùng nổ vì Joe Lập trình viên không thấy về những lý do đằng sau mã và chạm vào thứ gì đó không nên có.
Nếu bạn có một quy trình để xử lý các quyết định đó, bạn loại bỏ các khía cạnh cá nhân của chúng:
- Nếu bạn kiểm tra mọi thứ một cách chính xác, bạn sẽ biết nhanh hơn nếu mọi thứ bị hỏng,
- Nếu bạn đo lường chúng, bạn sẽ biết nếu chúng được cải thiện,
- Nếu bạn xem xét nó, bạn sẽ biết nếu nó ném mọi người đi.
Kiểm tra phạm vi, hồ sơ và thu thập dữ liệu là khó khăn
Nhưng, tất nhiên, mã kiểm tra và số liệu của bạn có thể gặp phải cùng một vấn đề mà bạn đang cố tránh cho mã thực tế của mình: bạn có kiểm tra đúng thứ không và chúng có phải là thứ phù hợp cho tương lai không và bạn có đo lường đúng không nhiều thứ?
Tuy nhiên, nói chung, bạn càng kiểm tra (cho đến một giới hạn nhất định) và đo lường, bạn càng thu thập được nhiều dữ liệu và bạn càng an toàn. Thời gian tương tự tồi tệ: nghĩ về nó như lái xe (hoặc cuộc sống nói chung): bạn có thể là người lái xe tốt nhất trên thế giới, nếu chiếc xe bị hỏng hoặc bạn quyết định tự sát bằng xe của mình ngay hôm nay, kỹ năng có thể không đủ. Có cả những thứ môi trường có thể đánh vào bạn, và lỗi của con người cũng có vấn đề.
Nhận xét mã là thử nghiệm hành lang của nhóm phát triển
Và tôi nghĩ phần cuối cùng là chìa khóa ở đây: đánh giá mã. Bạn sẽ không biết giá trị của những cải tiến nếu bạn thực hiện chúng một mình. Đánh giá mã là "thử nghiệm hành lang" của chúng tôi: tuân theo phiên bản Luật Linus của Raymond để phát hiện lỗi và phát hiện kỹ thuật quá mức và các mô hình chống khác, và để đảm bảo rằng mã phù hợp với khả năng của nhóm bạn. Không có điểm nào có mã "tốt nhất" nếu không ai khác ngoài bạn có thể hiểu và duy trì nó, và điều đó phù hợp với cả tối ưu hóa mật mã và thiết kế kiến trúc sâu 6 lớp.
Khi kết thúc, hãy nhớ:
Mọi người đều biết rằng gỡ lỗi khó gấp đôi so với viết chương trình ở nơi đầu tiên. Vì vậy, nếu bạn thông minh như bạn có thể khi bạn viết nó, làm thế nào bạn sẽ gỡ lỗi nó? - Brian Kernighan