Bao nhiêu chi tiết để đưa vào lần lặp đầu tiên của dự án?


15

Tôi vừa mới bắt đầu một dự án cá nhân mới (Python) và đang viết số tiền cho một "bản nháp thô" của chương trình, mức tối thiểu cần thiết để làm những gì tôi muốn làm. Tôi vẫn chưa đưa vào xử lý lỗi / xử lý ngoại lệ hoặc các yếu tố UI thẩm mỹ mở rộng (ngay cả trong trường hợp tôi biết những điều này cuối cùng sẽ cần thiết), và tài liệu này chỉ đủ để giúp tôi thấy những gì tôi đang làm trong tương lai.

Có chống lại bất kỳ nguyên tắc thiết lập của thiết kế / quản lý dự án để bắt đầu quá thô bạo? Tôi là một nhà khoa học, không phải là một lập trình viên, vì vậy tôi không theo kịp những điều này. Vì vậy, câu hỏi chính là, có một sự đồng thuận về nơi mà một người nên nhắm đến giữa hai thái cực:

  1. Viết mã kỹ lưỡng, chất lượng cao ngay từ đầu, với tất cả các xử lý ngoại lệ và như vậy bạn biết rằng cuối cùng bạn sẽ cần.

  2. Viết một bản thảo thô tối thiểu làm việc ngay từ đầu, và đi vào để điền vào tất cả các chi tiết vụn vặt sau này.

Câu hỏi liên quan: Khi nào bạn có thể hy sinh "sự gọn gàng" của thiết kế để hoàn thành một dự án?


1
Lưu ý cho người trả lời tiềm năng: OP đặc biệt hỏi cách cân bằng chất lượng mã với tốc độ phát triển trong các chu kỳ lặp lại sớm (có lẽ là) của một dự án. Câu hỏi không phải là nếu sản phẩm cuối cùng phải là chất lượng cao (xử lý lỗi robus, v.v.) mà là khi nguyên mẫu nên bắt đầu bao gồm hoặc chuyển đổi sang mã chất lượng cao.
Lilienthal

Câu trả lời:


10

Không có câu trả lời duy nhất, vì điều này phụ thuộc hoàn toàn vào dự án. Chúng ta cần suy nghĩ về hai điều ở đây. Mục tiêu cuối cùng của bạn là gì? Làm thế nào để bạn mong đợi để đạt được điều đó?

Kết quả cuối cùng

Bạn đang viết phần mềm điều khiển Mars Orbiter? Sau đó, bạn nên chắc chắn rằng bạn đang viết mã mạnh mẽ nhất có thể, Tốt hơn hết bạn nên kiểm tra mọi ngoại lệ được xử lý trong một vấn đề lành mạnh.

Bạn có đang viết một chương trình mà chỉ có bạn sẽ chạy và thỉnh thoảng bạn sẽ chỉ chạy thủ công không? Sau đó, đừng bận tâm với ngoại lệ. Đừng bận tâm với kiến ​​trúc nặng nề. Làm cho nó hoạt động đến điểm mà nó làm việc cho bạn.

Làm thế nào để bạn mong đợi để đạt được điều đó?

Bạn đang thực hiện phát triển thác nước nặng, nơi bạn dành nhiều thời gian để tìm ra những gì cần thiết, và sau đó bạn sẽ đi trong nhiều tháng, phát triển? Nếu vậy, thì bạn muốn đạt được chất lượng mục tiêu được đề cập ở trên khá sớm. Nhận tất cả các lỗi kiểm tra cơ sở hạ tầng của bạn lên kế hoạch khi bắt đầu.

Bạn có đang phát triển nhanh nhẹn không, trong đó bạn sẽ đặt một thứ gì đó trong một hoặc hai tuần, sau đó sẽ được hiển thị cho các bên liên quan, những người có thể yêu cầu sửa đổi triệt để, và nơi bạn mong đợi có thể lặp lại qua nhiều lần chạy nước rút 1-2 Cho đến khi bạn đạt được mục tiêu? Sau đó, bạn có thể tốt hơn để có được một cái gì đó hoạt động, nhưng mong manh cùng nhau nhanh chóng, và chỉ thêm thắt lưng và treo khi các yêu cầu sản phẩm được củng cố.

Nếu bạn đang kiểm soát thác nước hoặc quyết định nhanh nhẹn (thực sự là một sự liên tục không phải là sự lựa chọn nhị phân) thì hãy đưa ra quyết định đó dựa trên sự thay đổi dự kiến. Nếu bạn chắc chắn rằng bạn biết chính xác kết quả cuối cùng sẽ như thế nào, thì thác nước là lựa chọn tốt nhất của bạn. Nếu bạn chỉ có một khái niệm mơ hồ về những gì bạn cần kết thúc, nhanh nhẹn là lựa chọn tốt nhất của bạn. (Agile phổ biến hơn những ngày này không phải vì nó vốn đã tốt hơn mà vì tình huống thứ hai phổ biến hơn nhiều.)

Bây giờ hãy tìm câu trả lời của riêng bạn

Đối với hầu hết, câu trả lời sẽ nằm ở đâu đó ở giữa. Trả lời cả hai câu hỏi về dự án của bạn, và nó sẽ dẫn bạn theo một hướng cơ bản.

Tôi có thể nói rằng đối với bản thân tôi, nếu tôi thường viết các kịch bản một lần được thiết kế rất nhiều và không có lỗi kiểm tra bất cứ điều gì. Tôi cũng xử lý mã sản xuất, nơi xử lý lỗi và kiến ​​trúc nhận được sự chú ý lớn. Tất cả phụ thuộc vào những gì bạn đang làm.

Một cảnh báo cuối cùng: Nếu bạn quyết định bạn đang thực hiện các kịch bản một lần có thể được thực hiện nhanh chóng và bẩn, hãy đảm bảo. Thật không may, điều thường xảy ra là các tập lệnh nhanh và bẩn làm điều gì đó thú vị sẽ được sử dụng rộng rãi khi người khác chú ý đến chúng. Hãy chắc chắn rằng khi điều này xảy ra, thời gian được dành cho việc làm cứng.


Thông tin rất hữu ích! Của tôi là một dự án nhỏ không quan trọng đối với sinh kế của bất kỳ ai và tôi muốn phản hồi sớm về một mô hình làm việc tối thiểu, để hiểu được cách mọi người cảm nhận về cấu trúc tổng thể. Vì vậy, tôi nghĩ rằng một bản nháp thô là ổn, nhưng điểm cuối cùng của bạn là tuyệt vời: một nỗi sợ khác là tôi hoàn thành một bản nháp, nhưng sau đó không bao giờ thực hiện những cải tiến mà tôi cần thực hiện để đưa nó lên cấp độ lập trình tốt (trái ngược với "nó hầu như không hoạt động "lập trình).
nơ ron 8/2/2015

1
@neuronet: Đôi khi sự mạnh mẽ "nó chỉ vừa đủ hoạt động" là đủ. Một cách để suy nghĩ về nó là so sánh sự thất vọng mà bạn nhận được khi làm việc với phần mềm với độ mạnh cần thiết. Các vấn đề với phần mềm càng bực bội thì điều quan trọng hơn là chúng phải được giải quyết.
Bart van Ingen Schenau

11

Tất cả các khái niệm và mẫu mã và thiết kế phần mềm phát sinh để đáp ứng với một số vấn đề. Các mô hình hoặc khái niệm là một giải pháp cho vấn đề đó. Theo thời gian, một số mẫu trở thành "nổi tiếng" là giải pháp thích hợp hơn vì chúng giải quyết vấn đề theo cách đáp ứng các yêu cầu nhất định về tính nhất quán, quen thuộc, hiệu suất, khả năng bảo trì, v.v.

Theo sau, nếu vấn đề mà mẫu phần mềm có nghĩa là giải quyết không tồn tại trong phần mềm cụ thể của bạn, thì bạn không cần mẫu đó. Hơn nữa, bất kỳ cuộc thảo luận nào về các mẫu mà phần mềm của bạn có thể cần cũng phải bao gồm các cuộc thảo luận chi tiết về phần mềm được đề xuất của bạn: nó phải làm gì? vấn đề gì nó giải quyết? Sẽ có bao nhiêu người dùng? Người dùng sẽ chia sẻ dữ liệu theo một cách nào đó? Và kể từ đó trở đi.

Vấn đề mà các ngoại lệ được cho là phải giải quyết là khi có điều gì đó xảy ra mà mã không thể làm gì được. Một ví dụ sẽ là thao tác Tệp / Mở trong đó tên tệp được chỉ định không tồn tại trên phương tiện lưu trữ. Các trường hợp ngoại lệ cung cấp cho mã một cách để nói với người gọi "Điều gì đó đã xảy ra ngăn cản tôi tiếp tục và tôi không thể làm gì về điều đó, vì vậy tôi đang từ bỏ." Nếu bạn không có bất kỳ vị trí nào trong mã của mình khi có các điều kiện như thế, thì bạn không cần ngoại lệ. Hoặc, bạn chỉ có thể trả lại mã lỗi và tránh ngoại lệ hoàn toàn.

Khi bạn có được kinh nghiệm, bạn sẽ tìm hiểu về các mẫu phần mềm và khi sử dụng chúng là phù hợp. Bạn cũng sẽ biết bạn cần bao nhiêu thiết kế phía trước; một lần nữa, điều đó hoàn toàn phụ thuộc vào ứng dụng bạn đang viết. Nói cách khác, các tiện ích nhỏ được viết theo cách khác về cơ bản với các ứng dụng doanh nghiệp lớn, nói cách khác.


Điểm hay: Tôi đã nói rõ hơn trong câu hỏi của mình rằng tôi đang đưa ra những điều tôi biết (dựa trên các dự án khác) cuối cùng tôi sẽ cần trong một dự án đã hoàn thành.
nơ ron 8/2/2015

Tôi hy vọng tôi đã nói rõ rằng, ngay cả khi bạn biết những điều này, nếu bạn không cần chúng, thì bạn cũng không cần chúng.
Robert Harvey

4

Có một cách tiếp cận rất đơn giản và thực tế cho vấn đề này, nó hoạt động cho một loạt các dự án quy mô vừa và nhỏ. Mặc dù nó có thể sẽ không hoạt động tốt cho Mars Explorers.

Trước tiên, hãy tìm ra những gì bạn muốn hệ thống làm và ghi lại từng tính năng riêng lẻ. Điều này có thể phức tạp như toàn bộ bảng câu chuyện của người dùng hoặc đơn giản như một vài gạch đầu dòng ghi trên một tờ giấy trước mặt bạn. Nhưng điều quan trọng là bạn biết những gì bạn muốn nó làm.

Dựa vào đó vẽ lên cấu trúc chung của hệ thống. Một lần nữa, đây thường chỉ là một bản vẽ nhanh của các lớp / mô-đun khác nhau và cách chúng liên quan với nhau, nhưng có thể phức tạp như toàn bộ tài liệu. Điều quan trọng là bạn có một số loại ý tưởng về cách bạn sẽ thực hiện hệ thống. Nhưng, điều này có thể sẽ được cải tiến khi bạn làm việc với nó, vì vậy đừng cố gắng đi đến phức tạp và chi tiết.

Trong số tất cả các tính năng này tìm ra những điều quan trọng mà chương trình cần làm - các tính năng cốt lõi.

Sau đó thực hiện từng cái một. Bây giờ điều quan trọng ở đây là để thực sự đảm bảo rằng một khi bạn đã triển khai một tính năng thì điều này được thực hiện và hoạt động đầy đủ - lý tưởng là điều này được đi kèm với một bài kiểm tra đơn vị để đảm bảo rằng nó tiếp tục hoạt động. Tôi thường giả định rằng tôi sẽ bận rộn đến mức tôi sẽ không bao giờ có thời gian để quay lại tính năng và sửa nó.

Khi các tính năng cốt lõi được triển khai, tôi thường cố gắng đưa hệ thống sử dụng càng gần môi trường sản xuất càng tốt. Điều này cung cấp cho bạn a) bất kỳ lỗi nào bạn có thể đã bỏ lỡ trước đó và b) bạn có ý tưởng tốt về mức độ ưu tiên của các tính năng tiếp theo.

Sau đó, bạn có thể tiếp tục thực hiện các tính năng còn lại khi cần thiết.

Mã chất lượng so với tính năng

Với suy nghĩ trên, tôi có xu hướng hy sinh các tính năng về chất lượng mã, nếu tôi phải thực hiện một thời hạn. Đơn giản là vì, ít nhất là trong công việc của tôi, khi tôi hoàn thành một việc gì đó, quản lý của tôi cho rằng nó đã được thực hiện. Và họ có thể giao cho tôi nhiệm vụ tiếp theo. Tôi không có nhiều thời gian để làm cho mã đẹp hơn sau khi thực tế.

Bây giờ, những gì về xử lý ngoại lệ?

Nếu bạn không muốn thực hiện điều đó, bạn có thể liệt kê đó là một tính năng khác trong danh sách. Và khi bạn nhận được nó, bạn có thể thực hiện điều đó. Nhưng rất có thể trong trường hợp của bạn có lẽ có nhiều thứ khác quan trọng hơn trước.

Tuy nhiên, có một yêu cầu tối thiểu cho các trường hợp ngoại lệ: Đảm bảo người dùng được thông báo nếu có sự cố xảy ra - bất kể đầu ra có thể xấu đến mức nào. Đừng nuốt ngoại lệ ở đâu đó.


1
"Tôi thường đưa ra giả định rằng tôi sẽ bận rộn đến mức tôi sẽ không bao giờ có thời gian để quay lại tính năng và sửa nó." đây là nỗi lo mà tôi nên đề cập. Vui mừng bạn đã đề cập đến nó, và cho bài viết hữu ích.
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.