Quan niệm và thiết kế trước khi mã hóa: điều này đúng bao nhiêu? [đóng cửa]


14

Tôi đã học ở trường cũng như tôi đọc ở mọi nơi khác rằng một phương pháp phát triển tốt cần có quan niệm và thiết kế trước khi viết mã đúng.

Đó không phải là một thông tin mới ngay cả đối với một lập trình viên mới bắt đầu. Tuy nhiên, tôi tự hỏi liệu đây có phải là một lời khuyên tốt bởi vì tôi bắt đầu phát triển một số ngôn ngữ lập trình, tôi không bao giờ thành công trong việc thiết kế và hình thành mọi thứ kể từ khi bắt đầu.

Ý tôi là, tôi luôn làm tan chảy thiết kế, quan niệm và lập trình. Tôi có phải là nhà phát triển tồi tệ nhất trên thế giới, hay ý tưởng chúng ta học ở trường chỉ là một giáo điều tôn giáo vô nghĩa cũ ?

Làm thế nào chúng ta thậm chí có thể hình dung và thiết kế một thứ mà chúng ta chưa từng trải nghiệm và lập trình trước đó? Điều đó có vô lý không? Thay vào đó, việc lập trình không dẫn đến việc thụ thai và thiết kế?



@gnat liên kết bạn đã đưa ra ở đây có thể là một câu trả lời cho một khía cạnh của câu hỏi của tôi. Tôi không nghĩ rằng đây là một câu hỏi trùng lặp.


13
Không có kế hoạch nào từng tồn tại khi tiếp xúc với kẻ thù, nhưng điều đó không có nghĩa là bạn không nên có một kế hoạch. Bắt đầu với một kế hoạch nhưng đừng ngại sửa đổi nó sau
Richard Tingle

2
Lần duy nhất bạn thực sự và hiểu đầy đủ một vấn đề là sau khi bạn giải quyết nó, vì vậy điều đó chỉ có nghĩa là một khi bạn hiểu được vấn đề, bạn có thể giải quyết nó tốt hơn. Nhưng bạn cần trải qua bài tập khám phá để thực sự hiểu vấn đề.
Matt Klinker

Câu trả lời:


5

Tôi nghĩ rằng câu trả lời phải là: Lập kế hoạch càng nhiều càng tốt, nhưng không nhiều hơn thế.

Rất ít người sẽ nói chống lại những ưu điểm của kế hoạch, nhưng cuộc tranh luận chủ yếu bỏ qua một khía cạnh quan trọng. Lập kế hoạch chỉ hoạt động khi bạn có kỹ năng để lập một kế hoạch tốt, kỹ năng đó có xu hướng đi kèm với kinh nghiệm. Nếu bạn không có nhiều kinh nghiệm thì bất kỳ kế hoạch nào bạn lập ra đều có thể gặp vấn đề lớn, điều này có nghĩa là để tạo ra một sản phẩm không phải là thảm họa hoàn toàn, kế hoạch sẽ phải được sửa đổi nhiều trong quá trình phát triển, nếu kế hoạch được chi tiết thì điều này có thể sẽ làm mất hiệu lực rất nhiều chi tiết, hoặc tệ hơn, bạn sẽ cố gắng giữ các điều chỉnh ở mức tối thiểu để có thể thực hiện theo kế hoạch.

Một số điều chắc chắn cần lập kế hoạch và nếu bạn chưa có kỹ năng lập kế hoạch theo yêu cầu, thì cách duy nhất tôi có thể tưởng tượng là tạo mẫu, viết mã đơn giản để có kinh nghiệm với nhiệm vụ cần thiết để lập kế hoạch phù hợp .

Cho dù bạn có sẵn sàng viết mã sản xuất hay không, một khi bạn đã đạt đến mức lập kế hoạch tối đa thì không còn gì để làm ngoài việc viết mã. Có thể nó sẽ là một thảm họa, nhưng đó là những kinh nghiệm học tập tốt, và bạn sẽ được trang bị tốt hơn nhiều để thực hiện một kế hoạch sửa đổi.


30

Nó hoàn toàn đúng. Yêu cầu càng lớn và phức tạp thì điều này càng đúng.

Đối với một ứng dụng bảng điều khiển nhỏ để tính toán chuỗi Fibonacci, bạn có thể không cần nhiều hơn một vài phút suy nghĩ về cách cấu trúc thuật toán và giao diện người dùng (mà, vâng, có thể chỉ đơn giản là stdin và stdout).

Nhưng làm thế nào về một nền tảng giao dịch thời gian thực dự kiến ​​sẽ thực hiện hàng triệu giao dịch một giây, được phân phối trên toàn cầu và điều đó đòi hỏi 99.9999 thời gian hoạt động và 100% chính xác? Bạn có thể nhảy vào mã hóa không?

Có rất nhiều lựa chọn khác giữa hai thái cực này.

Hãy xem dự án Euler . Giải quyết một số vấn đề, trong trình tự trình bày. Bạn sẽ thấy rằng để giải quyết một số vấn đề trong thời gian hợp lý, bạn cần thực sự suy nghĩ trước khi nhảy vào mã.

Nếu bạn không cần dành thời gian để suy nghĩ và thiết kế chương trình của mình trước khi bắt đầu viết mã, bạn đang làm việc trên những thứ tầm thường hoặc thiếu thứ gì đó lớn hơn.


Tôi chưa bao giờ thành công trong việc thiết kế và hình thành mọi thứ kể từ khi bắt đầu

Không ai làm bất cứ điều gì ngoại trừ những vấn đề tầm thường nhất. Một lần nữa, dự án càng lớn và phức tạp, điều này càng đúng - thiết kế sẽ có những sai lầm, những thứ bị bỏ qua, v.v ...

Nghệ thuật là trong thiết kế ở cấp độ cao đầu tiên, xem nếu các mảnh lớn phù hợp. Sau đó, nhận được một danh sách các ưu tiên - bắt đầu làm việc trên cơ sở hạ tầng quan trọng nhất / đầu tiên. Sau đó, chúng tôi đi và chia các mảnh lớn hơn thành các mảnh nhỏ hơn, đảm bảo mỗi mảnh lớn hơn bao gồm các mảnh có ý nghĩa.

Điều này cần có thời gian và nỗ lực - và có thể không hoàn toàn hoặc hoàn toàn chính xác ngay từ đầu.

Nhưng đây là lý do tại sao nó được gọi là phần mềm mềm và không phải phần mềm cứng . Nó dễ uốn và có thể thay đổi.


4
Câu trả lời chính xác. Lưu ý rằng, mặc dù phần mềm có thể linh hoạt (thực sự, đây là một trong những điều tuyệt vời và độc đáo về nó), sửa đổi không miễn phí . Hệ thống phần mềm càng liên kết chặt chẽ và không mạch lạc thì việc sửa đổi nó sẽ càng khó khăn và tốn kém hơn. Kết quả cuối cùng là một phần của những gì đi vào thiết kế phần mềm sẽ là khả năng thay đổi trong tương lai , nếu một người muốn tận dụng tính linh hoạt của phần mềm.
voithos

9

Tôi đã học ở trường cũng như tôi đọc ở mọi nơi khác rằng một phương pháp phát triển tốt cần có quan niệm và thiết kế trước khi viết mã đúng.

Đây là sự thật.

Tuy nhiên, tôi tự hỏi liệu đây có phải là một lời khuyên tốt bởi vì tôi bắt đầu phát triển một số ngôn ngữ lập trình, tôi không bao giờ thành công trong việc thiết kế và hình thành mọi thứ kể từ khi bắt đầu.

Và có vấn đề của bạn.

Đối với hầu hết các vấn đề không tầm thường, bạn sẽ cần phải suy nghĩ một chút để tìm ra cách mọi thứ sẽ hoạt động - làm thế nào mọi thứ sẽ khớp với nhau. Nghịch lý thay, đối với hầu hết các vấn đề không tầm thường, không có cách nào bạn có thể lên kế hoạch cho mọi thứ . Có quá nhiều điều chưa biết để bạn giải thích, quá nhiều thay đổi sẽ xảy ra trong quá trình phát triển. Agile đã đạt được lực kéo vì nó chấp nhận nửa sau của thỏa thuận này: mọi người không phải là người toàn diện và thay đổi là không đổi.

Vì vậy, chắc chắn đúng là bạn cần thiết kế trước thời hạn, nhưng cũng đúng là không thể chỉ thiết kế trước thời hạn.


5

Bạn hoàn toàn phải có một số thiết kế trước khi mã hóa.

Lý do khá đơn giản - nếu bạn không có bất kỳ thiết kế nào, bạn không biết bạn đang làm gì .

Bạn hoàn toàn phải có một số mã trước khi thiết kế là cuối cùng.

Lý do khá đơn giản - thiết kế sẽ thay đổi, và việc phát triển các phần của thiết kế sẽ tiết lộ các câu hỏi, cơ hội và thách thức khó lường trước mà không bắt đầu thực hiện giải pháp.

Phát triển là lặp đi lặp lại.

Dù theo kế hoạch hay không, dù nhóm có nhận ra hay không, mọi dự án phần mềm đều được thực hiện lặp đi lặp lại - một phần của công việc được hoàn thành, sau đó được đánh giá và việc đánh giá dẫn đến những thay đổi trong cách thực hiện phần còn lại của công việc.

Hãy thử nhiều hơn một cách tiếp cận.

Cần thực hành và kinh nghiệm để biết cách tốt nhất để cân bằng thiết kế phía trước chống lại việc tạo mã. Đó là một kỹ năng mà hầu như không ai thành thạo và mỗi dự án sẽ có những lý tưởng khác nhau (xem xét việc thiết kế một công cụ nhỏ để sử dụng cho riêng bạn so với một nhóm tạo ra một sản phẩm phát hành lớn, đơn lẻ như một trò chơi video lớn).


1

Tôi đã thiết kế và phục tùng những người khác thiết kế nhiều hệ thống trong quá khứ và tôi đã thấy quá trình này diễn ra theo nhiều cách khác nhau, nhưng điều tôi thấy phổ biến là kiến ​​trúc ban đầu ít nhất phải lên kế hoạch cho sự tồn tại của hầu hết các tính năng chính.

Ví dụ, tôi đã thấy một hệ thống điều khiển HVAC không có khái niệm về các tòa nhà, tầng, phòng, v.v. được trang bị thêm với những thứ đó và kết quả là xấu xí như chúng đến. Hoặc một thiết bị âm nhạc di động được xây dựng từ các thành phần phù hợp hơn với đồng hồ bỏ túi (không thông minh) của bạn. Không cần phải nói các sản phẩm cuối cùng trong cả hai trường hợp không được khách hàng yêu thích.

Khi bạn nói "quan niệm" đó chỉ là một bước tiến lên từ "ý tưởng" và một khái niệm có thể rất mờ nhạt. Kinh doanh thường quan tâm đến các khái niệm. Khách hàng thường quan tâm đến UX - một khái niệm được đưa vào thực tế theo cách dễ sử dụng và dễ chịu và mang lại một số giá trị thông qua việc sử dụng nó.

Bạn phải thực hiện "khái niệm" trước khi lập trình, tôi không thể hình dung mình sẽ mở studio hình ảnh (hoặc IDE bạn chọn) và viết mã ngẫu nhiên, để xem nó đi đâu.

Bạn có thể không thực hiện một thiết kế hoàn chỉnh (và bạn không nên) trước khi mã hóa nhưng bạn nên có một bản phác thảo sơ bộ về quy trình làm việc của người dùng.

Thiết kế và mã hóa UX khá thường xuyên ăn nhập lẫn nhau, bạn có thể sẽ bị buộc sử dụng một số cách tiếp cận Agile cho bất kỳ thứ gì ngoại trừ các dự án nhỏ nhất như một cách để kết hợp thực tế này vào cách bạn tiếp cận công việc. Vì vậy, đừng nghĩ bạn là lập trình viên tồi tệ nhất nếu bạn không thể nhìn thấy tất cả cùng một lúc - không ai có thể và những người nghĩ rằng họ có thể là những người bỏ qua đủ vấn đề để họ có thể tuyên bố rằng họ đã hoàn thành hình ảnh.


Một ví dụ để đặt một kích thước cho một cái gì đó lớn. Khái niệm: "Tạo một công cụ dựa trên đám mây trực quan cho phép doanh nghiệp tích hợp nền tảng phần mềm của họ". Điều này nghe có vẻ tuyệt vời và người ta có thể bắt đầu viết lên tài liệu tiếp thị và bán nó trước cả khi nó ở đó. Bạn phải có điều này trước khi mã hóa.

Thiết kế trước: "Có hình dạng và mũi tên như trong Visio để mô tả logic; có khả năng bổ trợ để cho phép kết nối với các nền tảng khác nhau (SAP, SF, cơ sở dữ liệu ...); có bảng điều khiển giám sát nơi người ta có thể tìm kiếm dữ liệu đi qua hệ thống, có cách mô tả dữ liệu một cách trực quan và chuyển đổi định dạng này sang định dạng khác ". Một blob tiếp thị tuyệt vời. Nó cũng cung cấp cho bạn một số ý tưởng về những gì quan trọng, nên có một bản phác thảo thô như vậy trước khi viết mã.

Thiết kế / Mã: "Có trình duyệt lưu trữ trình thiết kế HTML với các tính năng tương tự và như vậy; mã hóa phần phụ trợ trong Java để nó có thể chạy trên bất kỳ máy chủ hiện có nào; xác định cấu trúc dữ liệu và UX để truy vấn hoặc sửa đổi chúng khi cần thiết; báo cáo, ghi nhật ký kiểm toán, kiểm soát phiên bản kế hoạch, kiểm soát truy cập kế hoạch; .... "- danh sách càng chính xác thì càng không thực tế để thấy trước tất cả.

... tuy nhiên, ít nhất mọi người nên nhận thức được mọi thứ có thể trông như thế nào hoặc sản phẩm cuối cùng của bạn có thể kết thúc bằng một số triển khai thực sự vô dụng, cuối cùng giết chết khái niệm nghe có vẻ tuyệt vời - nói rằng nhà thiết kế hình ảnh của bạn cần 40 " màn hình để hiển thị bất kỳ quy trình làm việc trong thế giới thực nào hoặc không có cách nào để tìm kiếm nhật ký ngoài một chuỗi khớp chính xác giới hạn ở một trong 20 trường trong nhật ký, v.v. Không có cách nào tốt để ngăn chặn điều này xảy ra ngoài việc thực hiện triển khai của bạn - một số sẽ thành công, một số khác sẽ thất bại.


0

Tôi luôn luôn phân bổ thời gian như sau:

  1. Thiết kế 1/3
  2. Phát triển 1/3
  3. Kiểm tra 1/3

Thiết kế: Không chỉ trực quan, mà còn về khái niệm. Chia nó thành nhiều phần, cả bằng trực quan và logic. Tìm kiếm sự tương đồng được sử dụng lại và là một mẫu thiết kế trong chính họ.

Phát triển: Một khi bạn biết các bộ phận của mình, hãy mã hóa chúng. Sau đó, bạn tích hợp chúng.

Kiểm tra: Không chỉ kiểm tra rằng mã được tích hợp và viết đúng, luôn luôn có những hiểu biết sâu sắc được phát hiện và bài học kinh nghiệm và nó sẽ tạo ra những cách mới để tương tác, những khả năng mới sẽ được hình thành và mong muốn. Cẩn thận với phạm vi creep.

Ngoài các khía cạnh này, hãy lưu ý rằng một dự án cũng có 3 giai đoạn trên đầu các giai đoạn này.

  1. Nỗ lực đầu tiên được thiết kế
  2. Nỗ lực thứ hai được thiết kế quá mức, từ những bài học rút ra từ lần thử thứ nhất.
  3. Nỗ lực thứ 3 đúng kỹ thuật.

Tôi đã thấy rằng bạn làm tốt hơn giai đoạn thiết kế, nó sẽ giảm thiểu các nỗ lực bổ sung. Thay vì làm lại toàn bộ, bạn có thể chỉ cần một hệ thống phụ được làm lại.

Tôi là một nhà phát triển phần mềm và quản lý phát triển phần mềm cho các dự án phát triển nội địa, thuê ngoài và ngoài khơi.


-1

Có một giả định cơ bản không chính xác ở đây. Bạn sẽ không bao giờ có thể đưa ra một thiết kế tốt mà không viết mã trước (trường sẽ không bao giờ dạy bạn điều này). Tuy nhiên, trường học đúng là bạn sẽ không nhận được mã tốt mà không cần thiết kế.

Giải pháp là:

  1. Viết một số mã mà bạn nghĩ có thể giải quyết vấn đề.
  2. Hãy đến với một thiết kế dựa trên những gì bạn học được từ mã.
  3. Vứt bỏ tất cả các mã và viết lại từ đầu theo thiết kế.
  4. Lặp lại khi cần thiết.

Ném đi tất cả các mãkhông một bước không bắt buộc trong quá trình này, nhưng đối với các dự án nhỏ chính thức bằng văn bản lên các thiết kế có thể được. Đối với các dự án lớn, bạn có nhiều khả năng lặp lại bước " vứt bỏ tất cả mã " - mặc dù nếu bạn có đủ tính mô đun thì điều này chỉ có thể áp dụng cho một phần của cơ sở mã.

Quá nhiều dự án giữ mã kế thừa vì họ không muốn thay đổi nó - hoặc vì nó quá phức tạp, vì nó không bao giờ được thiết kế để bị vứt bỏ. Thừa nhận thực tế rằng nỗ lực đầu tiên của bạn sẽ là một thất bại sẽ làm cho cuộc sống của bạn tốt hơn nhiều.


1
Có nhiều lý do hợp lệ để không vứt bỏ mã cũ. Bạn có thể vui lòng cung cấp một số tài liệu tham khảo để trở lại đoạn cuối.
mattnz

+1. Không biết tại sao điều này đã bị hạ cấp. "Xây dựng một để ném nó đi" là một lời khuyên kinh điển của Fred Brooks.
nikie

Tôi nghĩ trong trường hợp này, mã cũ là từ một nguyên mẫu và có nguy cơ các nguyên mẫu được coi là đủ tốt và được đưa vào sản xuất. Vứt nó đi liên quan đến dự án hiện tại và không theo nghĩa đen.
JeffO

-3

khái niệm là thiết kế chính luôn có thể thay đổi lập trình sẽ phải đáp ứng các yêu cầu của ứng dụng được hình thành đầy đủ.

Thứ nhất là điểm nào, thứ 2 cần truy cập như thế nào, thứ 3 người dùng là ai, thứ 4 đưa ra một phạm vi SOW đầy đủ của công việc xác định theo các thuật ngữ cụ thể mà tất cả ứng dụng này phải làm. và cách mỗi chức năng bạn thêm sẽ hoạt động.

trước khi có bất kỳ lựa chọn nào về kiến ​​trúc ứng dụng web của bạn, hãy lập kế hoạch và suy nghĩ hoàn toàn.

sau đó chọn ngăn xếp tốt nhất

Tôi là nhà phát triển LAMP

vì vậy tôi có xu hướng thu hẹp câu hỏi vào khung php nào tôi sẽ sử dụng. và các kịch bản giao diện người dùng tôi sẽ cần làm cho nó thực hiện tất cả những điều tôi cần nó để làm một cách lý tưởng

để thêm điều này, hãy học cách sử dụng các khung MVC, ZEND và CAKEPHP là các khung phát triển nhanh nhất (PHP)


7
" Chọn chồng tốt nhất ... Tôi là một nhà phát triển ĐÈN " - khi đó là hoàn toàn ok để dính vào đan của ai đó, rằng tuyên bố âm thanh như một mâu thuẫn nhỏ, đúng không?
JensG
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.