Làm thế nào để bạn không phải là người Gonna cần nó, và bây giờ tốt hơn là không bao giờ chơi với nhau?


17

Tôi thường thấy mình ôm ấp "bây giờ tốt hơn bao giờ hết" khi tôi tiến bộ KHÔ của một thiết kế. Thông thường, tôi thấy rằng tôi cần trau dồi hiểu biết về Vị trí có thẩm quyền cho một phần kiến ​​thức trong bối cảnh hệ thống các phần kiến ​​thức khác. Vì vậy, tôi có xu hướng thiết kế hệ thống 'ngay bây giờ.'

Ngược lại, cách làm này khiến tôi xây dựng khá xa trước, mặc dù có cơ hội hợp lý rằng tôi không cần đến nó.

Làm thế nào để hai mô hình vuông lên?

Những thực hành nào bạn sử dụng để đảm bảo rằng họ chơi đẹp?

Làm thế nào để bạn dạy chúng cùng nhau mà không tạo ra sự nhầm lẫn?


2
Xem xét trước khi bạn bước nhảy vọt. Nhưng người do dự thì mất.
mmyer

Câu trả lời:


26

Tôi cố gắng nghĩ xa về phía trước quá, nhưng thường không trong mã. Tôi động não và ghi chép, hy vọng tổ chức mọi thứ đủ tốt để tôi có thể tham khảo lại chúng.

Tôi nghiêng nhiều hơn về "bạn sẽ không cần nó" đối với mã, nhưng "bây giờ tốt hơn là không bao giờ" với thiết kế.

Khi bắt đầu xây dựng một hệ thống mới, bạn muốn xây dựng mọi thứ ngay bây giờ, nhưng nó cũng có thể làm giảm động lực và tinh thần của bạn. Tôi có xu hướng suy nghĩ về thiết kế tổng thể và cố gắng vẽ một đường thẳng qua nó - đưa ra kiến ​​trúc khung xương từ đầu đến cuối và xây dựng nó trước, áp dụng các nguyên tắc thiết kế âm thanh để sau này tôi có thể phát triển nó và tái cấu trúc để mang lại trong các tính năng mới.

Xây dựng đại diện đầu cuối đơn giản nhất của hệ thống có thể hoạt động; làm điều đó trước, và sau đó bạn có một cái gì đó để suy nghĩ về. Điều đó có xu hướng giúp kết tinh tất cả những câu hỏi "nếu như" mơ hồ và giúp bạn tìm ra những gì bạn cần xây dựng tiếp theo.


3
+1 để lại một vị trí cho một cái gì đó trong thiết kế không có nghĩa là bạn phải xây dựng nhiều thứ ban đầu. CÁCH quá nhiều người nhận được một cú đá tuyệt đối rằng không nên xem xét gì trước khi yêu cầu và để bản thân rơi vào tình huống tồi tệ hơn nhiều so với việc họ đã xây dựng toàn bộ mọi thứ mà không có khách hàng nào nhập vào.
Hóa đơn

9

YAGNI có nghĩa là mọi thứ được hoàn thành khi họ cần hoàn thành và không phải trước đó. Điều đó không có nghĩa là họ không bao giờ hoàn thành, trừ khi họ không bao giờ cần thiết. Nó có nghĩa là bạn chỉ làm những gì mang lại cho khách hàng giá trị kinh doanh ngay lập tức . Giá trị kinh doanh ngay lập tức có nghĩa là chủ quan cho mọi khách hàng và mọi dự án.

Trong cả hai trường hợp, bạn không thể mất bất cứ điều gì với YAGNI.

Trong trường hợp khác, bạn mất thời gian viết mã không bao giờ được sử dụng và viết kiểm tra mã không bao giờ được sử dụng và viết tài liệu cho mã không bao giờ được sử dụng và bảo trì mã không bao giờ được sử dụng, mọi người tự hỏi mã này làm gì và nếu nó được sử dụng, quảng cáo sẽ được sử dụng.

Thí dụ

Nếu tôi đang làm việc trên một nguyên mẫu / bằng chứng về khái niệm hoặc phiên bản 1.0 của một ứng dụng thì tôi không cần một thiết kế để mở rộng theo cấp độ của Facebook. Địa ngục tôi không cần một thiết kế để mở rộng đến cấp độ của Facebook, cho đến khi tôi bắt đầu thấy rằng tôi loại lưu lượng truy cập đó.

Bạn có nghĩ rằng Zuckerberg đã thiết kế phiên bản đầu tiên của Facebook để mở rộng tới 500 triệu người dùng không? Không, ông đã thiết kế và xây dựng nó để làm chỉ muốn nó cần làm và không còn nữa. Nếu anh ta cố gắng thiết kế cho 500 triệu người dùng ngay từ ngày đầu tiên, Facebook có lẽ sẽ không bao giờ được phát hành.

Cách thực tế để làm mọi việc là cách anh ấy đã làm nó. Ông bắt đầu với PHP và MySQL, và được thiết kế lại và viết lại khi cần dựa trên giá trị doanh nghiệp , nhân rộng cho hàng triệu người dùng có giá trị kinh doanh rất lớn, nhưng không phải vào ngày 0. Vào ngày 0, chỉ cần tung ra thứ gì đó là giá trị kinh doanh to lớn.

Ông đã lên kế hoạch thiết kế lại và viết lại. Đó là một suy nghĩ khác với kế hoạch cho bồn rửa nhà bếp và không bao giờ thực sự phát triển hoặc cung cấp bất cứ điều gì hữu ích đã hoàn thành.

Lập kế hoạch cuối đời cho một cơ sở mã và viết lại là bằng chứng Agile và tương lai. Cố gắng đưa ra một số mục tiêu không xác định là "linh hoạt" chỉ kết thúc trong thất bại mỗi lần. Bạn đang thiết kế mà không cần bất kỳ nhu cầu nào và lãng phí thời gian, bạn có thể phát triển những gì có giá trị kinh doanh thay vì mơ ước về các tính năng sẽ không bao giờ được sử dụng.


2
Nếu thiết kế của bạn không tốt (ví dụ như không linh hoạt), bạn có thể mất rất nhiều với YAGNI.
EricSchaefer

1
@EricSchaefer - không phải nếu nó đáp ứng các mục tiêu và cung cấp giá trị cho doanh nghiệp và bạn không có nhiều thời gian đầu tư, bạn chỉ cần ném nó ra là mất ít hơn là không bao giờ cung cấp hệ thống linh hoạt vô cùng kỳ diệu của bạn sẽ không bao giờ hoàn thành và vận chuyển và nếu có, nó sẽ là một cơn ác mộng cấu hình.

6

Cách Zen của Python nói:

Bây giờ tốt hơn bao giờ hết. Mặc dù không bao giờ thường tốt hơn bây giờ.

Ý tưởng là không phải vì bạn có thể định nghĩa một cái gì đó mà bây giờ bạn nên làm. Bạn có cần nó bây giờ?

  • Có: làm ngay bây giờ!
  • Không: đừng làm điều đó! Chờ nhu cầu! YAGNI!

Các trường hợp điều này ít rõ ràng hơn là trong các trường hợp tái cấu trúc. Tôi có nên áp dụng DRY mỗi khi tôi có thể? Câu trả lời không rõ ràng vì có những lúc áp dụng DRY tốn nhiều chi phí (trong thời gian sử dụng) hơn là sao chép. Tuy nhiên, về lâu dài, áp dụng DRY cho đến khi bạn có lý do kỹ thuật / hiệu suất để không luôn luôn tốt.

Vì vậy, YAGNI cho đến khi bạn làm, sau đó LÀM NGAY. Đừng chờ đợi!


3

Tôi không nghĩ rằng họ chơi với nhau cả. Tôi nghĩ bạn nghiêng người theo cách này hay cách khác. Và tôi nghiêng về phía YAGNI.

Nhưng với những gì đáng giá, tôi không đồng ý với đề xuất thứ hai, rằng "Bây giờ tốt hơn là không bao giờ." Nếu một yêu cầu là quan trọng, nó sẽ phải được thực hiện. Vì vậy, "không bao giờ" không phải là một khả năng. Nếu nó không quan trọng, thì "bây giờ" không tốt hơn - "không bao giờ" là tốt hơn.

Chỉ hai xu của tôi.


Và bây giờ câu hỏi đáng giá triệu đô la: "quan trọng" nghĩa là gì?
Aaronaught

1
"Quan trọng" có nghĩa là nó là một bài kiểm tra chấp nhận.
loại

quan trọng có nghĩa là hollers khách hàng khi nó không ở đó.
Paul Nathan

2
Quan trọng có nghĩa là khách hàng không trả tiền nếu không có.
Christopher Mahan

@Christopher, điều đó có thể được hiểu là khuyến khích sự không chuyên nghiệp. Ví dụ: bảo vệ chống lại SQL SQL rất quan trọng ngay cả khi khách hàng không biết nó là gì và chắc chắn sẽ không kiểm tra trước khi trả tiền.
Peter Taylor

2

Làm thế nào để hai mô hình vuông lên?

Chúng trực giao và không liên quan gì đến nhau.

Những thực hành nào bạn sử dụng để đảm bảo rằng họ chơi đẹp?

Ừm. Làm cả hai? Những gì nhiều hơn có thể có?

Làm thế nào để bạn dạy chúng cùng nhau mà không tạo ra sự nhầm lẫn?

YAGNI mô tả các tính năng mà người dùng nhìn thấy. Bạn không cần ưa thích.

Bây giờ tốt hơn là không bao giờ mô tả quá trình. Viết bài kiểm tra ngay bây giờ. Viết mã ngay bây giờ. Đừng bỏ qua hàng giờ để suy nghĩ về các phương án thiết kế. Xây dựng một cái gì đó hơn là nói về việc xây dựng một cái gì đó.


2

Nếu "không bao giờ" là hàm ý của "không phải bây giờ", thì thiết kế của bạn là thiếu sót.

Các quyết định địa phương bạn đưa ra nên minh bạch với phần còn lại của hệ thống.
Ví dụ: nếu bạn có một thành phần CookieSource, yêu cầu CookieFactoryphải biến CookieRecipesnó thành một thành phần Cookies, dựa trên một số tham số đầu vào của bạn, thì CookieSourcekhông cần và do đó không phải phụ thuộc vào cách CookieFactorytriển khai và cách trình CookieRecipesbày.
Nếu CookieFactorylà trong thực tế, một Bakery, mà có thể dùng bất cứ Recipethành theo Pastrynên không quan trọng. Và trừ khi bạn cần chức năng đó, không cần phải thực hiện nó. Và không có lý do nào trên thế giới tại sao bạn không thể thêm nó sau đó, ngoại trừ nếu không có rào cản trừu tượng rõ ràng giữa CookieSourcevà các dịch vụ mà nó sử dụng.

Khi xây dựng phần mềm, hãy thêm chức năng khi cần thiết và cố gắng không tự khóa mình vào bất kỳ quyết định nào bạn đưa ra. Thay vào đó khóa quyết định vào một sự trừu tượng phù hợp .


1

Giải pháp đơn giản nhất mà tôi tìm thấy là mong đợi những thay đổi khi viết mã lên phía trước. Khi tôi chuyển một số bool cho một hàm, tôi thường thay đổi nó càng sớm càng tốt thành cờ / enums để nó dễ đọc hơn và b) dễ dàng mở rộng. Tương tự, nếu tôi nhận thấy rằng tôi đang truyền một loạt các tham số xung quanh nơi có mùi giống như tôi sẽ cần thêm một, tôi thường tạo ra một cấu trúc đặc biệt. Hy vọng là YAGNI, nhưng nếu bạn làm điều đó vào một lúc nào đó, nó sẽ không phá vỡ tất cả người dùng ngay lập tức và "công việc nặng nề" đã được thực hiện. Thông thường, bạn cũng có thể chỉ cần thêm một số nhận xét như / * bổ sung trong tương lai vào đây * / hoặc vì vậy rõ ràng là nó chưa được triển khai nhưng đây là nơi để thêm nó. Điều đó thường giúp ích nhiều nhất, vì tôi thấy việc tái cấu trúc giao diện sau này sẽ tốn nhiều thời gian nhất.


Về nguyên tắc, tôi thích triết lý này, nhưng trong thực tế, tôi thấy rằng việc di cư đủ đau đớn để khiến tôi phải suy nghĩ kỹ. Bạn có bao giờ thấy rằng việc di chuyển các mô hình của bạn cản trở những thay đổi không?
Justin Myles Holmes

Điều tốt về phương pháp này là những thay đổi ít gây đau đớn hơn; Vẫn còn nhiều việc phải làm. Tôi không chắc ý của bạn về các mô hình di chuyển - Tôi chắc chắn đứng về phía YAGNI, nhưng tôi chuẩn bị cho điều tồi tệ nhất :)
Anteru

0

Thiết kế với các tiện ích mở rộng trong tương lai, nhưng đừng triển khai các tiện ích mở rộng đó cho đến khi bạn cần chúng.

Ví dụ gây chú ý là khi Netflix lần đầu tiên bắt đầu, bạn chỉ có thể có một hàng đợi được liên kết với mỗi tài khoản. Sau đó, họ đã hack hỗ trợ cho nhiều hàng đợi. Bởi vì nó không được thiết kế theo cách đó ngay từ đầu, nên nó ngày càng khó bảo trì hơn, vì vậy họ quyết định ngừng tính năng đó. Sau khi một khách hàng náo động, họ cắn viên đạn và thiết kế lại để tích hợp nhiều hàng đợi đúng cách.

Nếu ai đó ngay từ đầu đã cho phép khả năng họ có thể muốn có nhiều hàng đợi sau đó, họ có thể đã tự cứu mình rất nhiều đau buồn dài hạn cho rất ít nỗ lực ngắn hạn. Họ không phải thực sự thực hiện nhiều hàng đợi ngay lập tức, chỉ cần đảm bảo rằng họ đã từng làm điều đó sẽ không yêu cầu một bản hack lớn hoặc không thể xóa được.

Nhìn bề ngoài, có vẻ như nó sẽ đòi hỏi một khả năng giống như thầy bói để dự đoán các yêu cầu trong tương lai, nhưng trong thực tế, những thứ như thế có xu hướng dính vào một lập trình viên giỏi khi anh ta nhận thấy anh ta đang mã hóa thứ gì đó, hoặc bảng cơ sở dữ liệu đang thu thập rất nhiều cột chỉ liên quan mơ hồ.

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.