Làm thế nào để tôi vượt qua tê liệt bằng cách phân tích khi mã hóa?


37

Khi tôi bắt đầu một dự án mới, tôi thường lập tức bắt đầu nghĩ về các chi tiết thực hiện. "Tôi sẽ đặt DataBaseHandler ở đâu? Tôi nên sử dụng nó như thế nào? Các lớp muốn sử dụng nó có mở rộng từ một số siêu lớp trừu tượng không ..? Tôi có nên sử dụng giao diện không? Tôi sẽ sử dụng mức độ trừu tượng nào trong lớp của mình phương pháp gửi yêu cầu và phân tích dữ liệu? "

Tôi đã bị đình trệ trong một thời gian dài bởi vì tôi muốn viết mã cho khả năng mở rộng và tái sử dụng. Nhưng tôi cảm thấy gần như không thể có được suy nghĩ về cách thực hiện hoàn hảo.

Và sau đó, nếu tôi cố gắng chỉ nói "vít nó, chỉ cần hoàn thành nó!", Tôi đã va vào một bức tường gạch khá nhanh bởi vì mã của tôi không được tổ chức, tôi đã trộn lẫn các mức độ trừu tượng, v.v.

Một số kỹ thuật / phương pháp bạn có để khởi chạy vào một dự án mới đồng thời thiết lập cấu trúc logic / mô đun sẽ có quy mô tốt là gì?

- - CHỈNH SỬA -

Chà, đây đã là loại câu hỏi khó chấp nhận câu trả lời, nhưng muốn nhận thêm một số phản hồi, hãy xem liệu có sự đồng thuận nào không. TDD nghe có vẻ rất hay và thật lòng mà nói, tôi đã có ý định tăng tốc độ sử dụng JUnit, v.v. Đồng thời, những người hâm mộ TDD nghĩ gì về thực tế rằng một điểm hợp pháp liên quan đến TDD giải quyết cho tôi vấn đề cụ thể là TDD dường như không thực sự giải quyết được câu hỏi về thiết kế. Chắc chắn, tôi đồng ý TDD sẽ giúp tôi xác định những gì tôi muốn làm và sau đó tôi có thể dần dần làm việc bằng cách nào, nhưng có nhiều mẫu / cấu trúc thiết kế tổng thể khác nhau có thể vượt qua thử nghiệm đơn vị. Đó chỉ là nó: nó kiểm tra ĐƠN VỊ duy nhất. Tôi đoán tôi hơi bối rối ... Tôi không biết. Có lẽ tôi'

Cảm ơn!


2
Bước lại, lấy một cây bút và tờ giấy, phác thảo bức tranh lớn hơn. điều này sẽ giúp bạn sau đó thiết kế việc thực hiện theo cách có cấu trúc hơn thay vì đánh mất bản thân của bạn trong các chi tiết ...
Darknight

Đâ là một câu hỏi tuyệt vời. Đây là một cái bẫy tôi cũng đã phạm tội rơi vào.
Corv1nus

Câu trả lời:


16

Tôi khuyến nghị sử dụng Test-Driven-Development , phải mất một số thời gian để làm quen, đặc biệt là khi làm việc với một IDE tốt như nhật thực, nhưng những lợi thế là rất lớn.

Về cơ bản những gì bạn làm là viết các bài kiểm tra vào mã của bạn trước khi bạn tự viết mã. Vì vậy, bạn buộc phải xem xét mã của mình từ quan điểm về cách nó sẽ được sử dụng, điều đó có nghĩa là các giao diện của bạn phát triển theo nhiều kịch bản bạn thực hiện.

Một đặc điểm khác là bạn thực hiện trong các phần rất nhỏ (chúng càng lớn thì bạn càng có nhiều kinh nghiệm về kỹ thuật và lập trình), do đó, nó buộc bạn phải tập trung vào một vấn đề rất nhỏ và được xác định rõ ràng mỗi lần.

Và cũng vì lần đầu tiên bạn viết một bài kiểm tra và chỉ sau đó thực hiện, bạn có một bài kiểm tra thất bại trước mặt bạn. Vì vậy, nếu bạn giống như hầu hết các lập trình viên, bạn sẽ không bị cuốn theo phân tích điên rồ bởi vì bạn sẽ nghĩ: "Tôi cần làm cho bài kiểm tra này hoạt động".

Một ví dụ java ngắn:
Giả sử tôi muốn phát triển một chương trình đọc và viết tin nhắn từ db.

Vì vậy, tôi bắt đầu với hành động được xác định rõ đầu tiên, tôi cần một DB:

@Test
public void testDB() {
  DB db = DbConnector.getDB(address);
  assertNotNull(db);
}

ok, vì vậy ở đây tôi thấy rằng tôi cần triển khai lớp DbConnector.getDB để nó trả về DB, cho đến khi thử nghiệm này thất bại. Tôi đi và làm điều đó ...

Không phải tôi thêm điều tiếp theo tôi muốn làm, tải tin nhắn từ DB:

@Test
public void testDB() {
  DB db = DbConnector.getDB(address);
  assertNotNull(db);
  String message = db.fetchMessage(key);
  assertEquals("hello world", message);
}

Bây giờ tôi đã thêm một tính năng nhỏ khác vào DB đó là tìm nạp một tin nhắn, tôi đi và thực hiện điều đó, sau khi hoàn thành, tôi tiếp tục thực hiện một tính năng tại một thời điểm cho đến khi tôi đạt được điều gì đó như sau:

@Test
public void testDB() {
  DB db = DbConnector.getDB(address);
  assertNotNull(db);
  String message = db.fetchMessage(key);
  assertEquals("hello world", message);
  message = "foo bar";
  db.storeMessage(message);
  message = db.fetchMessage();
  assertEquals("foo bar", message);
}

Nó có vẻ như là một ví dụ rất đơn giản, nhưng điều này cũng hoạt động cho các nhiệm vụ phức tạp hơn. Tôi biết lúc đầu rất tốn thời gian nhưng khi bạn quen với nó, bạn sẽ thấy rằng trên thực tế nó hiệu quả hơn nhiều. Đối với một người bạn tránh sự tê liệt bằng cách phân tích và đối với người khác, bạn nhận được mã mạnh mẽ hơn nhiều, thường có ít lỗi hơn và trải qua ít lần lặp hơn.


4
Và TDD buộc bạn phải cấu trúc lại rất nhiều, vì vậy bạn đang tham gia vào một chế độ làm việc tái cấu trúc liên tục, điều này sẽ giúp vượt qua bức tường gạch mã bị rối, như lập trình viên.stackexchange.com / questions / 86364 / đề cập đến.
co rúm

Tôi thực sự thấy khía cạnh thử nghiệm đầu tiên của TDD là một trở ngại trong các loại trường hợp này. Nếu tôi gặp khó khăn trong việc thiết kế giao diện, thì việc thiết kế các bài kiểm tra sẽ trở nên dễ dàng hay rõ ràng hơn như thế nào? Điều đó và gánh nặng tái cấu trúc ngay từ đầu khi cố gắng thiết kế một cái gì đó là quá cao. Tôi tự hỏi làm thế nào những người khác đối phó với điều đó.
Steven Evers

1
@SnOrfus, phải. TDD hoạt động tốt khi bạn có các mô-đun của mình và muốn tập trung vào những gì so với làm thế nào. Nhưng những mô-đun đó có thể được tổ chức theo bất kỳ cách nào. Cách chúng được nhóm lại với nhau, loại cấu trúc bạn sẽ sử dụng không thực sự được làm rõ thông qua TDD.
LuxuryMode

5
Hmmmm điều này nghe giống như một fanboy TDD ..... Điều gì đã xảy ra khi sử dụng bút và giấy để phác thảo một kiến ​​trúc? hoặc tôi là thời trang cũ và không đủ "hông" ....
Darknight

1
Bút và giấy (hoặc bảng trắng) là tốt. Phác thảo kế hoạch tổng thể, bức tranh lớn. Nếu nó không vừa trên một tờ giấy thì quá phức tạp. Khi bạn đã có kế hoạch hình ảnh lớn, bạn có thể bận rộn với BDD, chế giễu, v.v.
Donal Fellows

10

Điều này xảy ra với tôi, vì vậy tôi đã có thói quen chấp nhận (và nắm lấy) một tư duy tái cấu trúc liên tục. Tôi làm điều đơn giản nhất có thể làm việc, sau đó tôi dọn dẹp, sắp xếp nó, tách nó ra, kiểm tra nó và tiếp tục.

Điều đó không có nghĩa là không có nhiều kế hoạch đang diễn ra, nhưng nó xảy ra rất nhanh và thường xuyên hơn - như những hình vẽ nguệch ngoạc trên đầu hoặc trong đầu tôi. Nói chung, đôi khi tôi gọi quá trình lặp vi mô nhỏ này bởi vì chúng mất 5-20 phút mỗi lần và từ kinh nghiệm phải mất 2-3 để hoàn thành những gì tôi đang làm (rõ ràng phụ thuộc vào những gì tôi đang làm, rõ ràng).

Một lưu ý phụ: Tôi đã dạy cho một số người ở các hình thức viết khác nhau (báo cáo, tiểu luận và viết kỹ thuật nói chung) và đây cũng giống như cách tôi khiến họ viết những điều để vượt qua khối nhà văn. "Chỉ cần làm sáng tỏ bất cứ điều gì về chủ đề của bạn xuất hiện trên trang. Sau đó, chúng tôi sẽ hiểu ý nghĩa của nó và tách tất cả thành các đoạn văn và kiểm tra dòng chảy. Nếu cần, chúng tôi thậm chí sẽ viết lại nó."


1
+1 để đề cập đến văn bản. Gần đây tôi mới áp dụng phương pháp tái cấu trúc thường xuyên từ mã hóa và áp dụng nó vào viết; Hoạt động rất tốt đối với tôi.
Zsolt Török

2

Một vài điều có thể làm việc:

  • Xác định vấn đề cốt lõi mà bạn đang cố gắng giải quyết - cốt lõi của việc bạn muốn làm là gì? Thực hiện chỉ như vậy và tối thiểu trần mã hỗ trợ để làm cho nó chạy. Một khi nó hoạt động theo sự hài lòng của bạn, xây dựng lặp đi lặp lại, tái cấu trúc không thương tiếc ở mỗi bước.
  • Xem nếu các mô hình lập trình khác làm việc cho bạn. Bất chấp tất cả các giá trị của nó, lập trình hướng đối tượng không phải là câu trả lời cho tất cả các vấn đề và không phải bộ não của các lập trình viên đều hoạt động theo cách đó. Chọn một ngôn ngữ chức năng (thuần túy); viết một số mã thủ tục; lặn xuống cấp độ phần cứng và làm một số C hoặc thậm chí có thể lắp ráp; v.v. Smalltalk, Javascript (nếu bạn từ bỏ việc cố gắng làm cho nó hoạt động như Java và thay vào đó nắm lấy bản chất đóng của nó), C, Pascal, awk, và có lẽ là hơn một chục. Đặc điểm chính là chúng cần phải rất khác so với những gì bạn sử dụng bây giờ. Đây không phải là điều bạn muốn làm trong một dự án lớn với nhiều lợi ích,
  • Sử dụng một phương pháp thiết kế hoàn toàn khác nhau. Xem nếu bạn có thể nhận thiết kế từ một góc độ khác. Tôi giả sử bạn thường bắt đầu thiết kế bằng cách bố trí các lớp học của bạn; Làm thế nào về bạn bắt đầu với cấu trúc dữ liệu cho một sự thay đổi? Hoặc làm thế nào về việc bạn thiết kế giao diện người dùng trước, thực sự vẽ các biểu mẫu đầu vào trước khi thiết kế bất kỳ chức năng nào?

1

Đối với nhiều quyết định thiết kế, nó có thể giúp thực hiện một "đột biến", đó là một nỗ lực nghiên cứu trong thời gian ngắn, trong đó bạn có thể khám phá một số tùy chọn kiến ​​trúc hoặc thiết kế bằng cách mã hóa thành một nguyên mẫu vứt đi. Ví dụ, bạn có thể khám phá việc sử dụng một số thư viện nguồn mở hoặc cách bạn sẽ tổ chức các lớp và giao diện của mình. Chìa khóa của họ là giữ cho nó ngắn gọn để bạn có thể thử một cách tiếp cận khác nếu cách đầu tiên không thỏa đáng và hy vọng bạn sẽ có đủ kiến ​​thức trong bài tập để đưa ra quyết định kiến ​​trúc tốt hơn hoặc chứng minh khái niệm. Bài tập này liên quan đến mã hóa ngay lập tức giúp thoát khỏi "khối nhà văn" mà không nhất thiết phải cam kết với "git 'er xong" quá sớm.

Sau đó, có lợi khi sử dụng phương pháp TDD hoặc BDD mà Asaf đã đề cập để tiếp tục triển khai dự án.


Tôi đồng ý. Kế hoạch để vứt bỏ những nỗ lực đầu tiên. Coi nó như một kinh nghiệm học tập Tôi đã vứt đi khoảng sáu, trước khi tôi nghĩ rằng tôi muốn gắn bó với người thứ bảy.
Mike Dunlavey

1

Bạn sẽ không cần nó , vì vậy đừng nghĩ quá nhiều vào lúc đầu.

Đầu tư nhiều thời gian hơn để xác định, để hiểu mục tiêu và vấn đề.

"Khả năng mở rộng và tái sử dụng" là kết quả tự nhiên của vòng đời của các chương trình phần mềm được viết tốt.


0

Tôi sẽ cho rằng chúng tôi đang xem xét một dự án kích thước trung bình.
Tôi sẽ bắt đầu bằng cách đi lên bảng vẽ. Bạn nên chuẩn bị sẵn sàng các yêu cầu chức năng và phi chức năng trước khi bạn làm điều này. Trước tiên bạn sẽ đưa ra kiến ​​trúc phần mềm, tức là xem xét bất kỳ mẫu kiến ​​trúc nào phù hợp với yêu cầu của bạn
Một khi bạn quyết định xem kiến ​​trúc của bạn trông như thế nào, bạn nên tìm hiểu về thiết kế cấp thấp i, e nhìn vào tất cả các thực thể, lớp và chức năng . Tại đây, bạn sẽ lại thử và xác định các mẫu thiết kế phù hợp. Trong quá trình đó, bạn sẽ biết các lớp cơ sở của mình là gì và các giao diện mà bạn sẽ cần
Sau đó, bạn có thể xây dựng khung và chạy một số thử nghiệm nhanh để xem nếu điều này đáp ứng tất cả các yêu cầu phi chức năng của bạn
Sau đó tôi sẽ đi với Phát triển hướng thử nghiệm như @Asaf đã đề xuất.

Hãy nhớ rằng, mặc dù dành thời gian tốt cho thiết kế và kiến ​​trúc, luôn sẵn sàng xem xét lại kiến ​​trúc nếu có nhu cầu.


0

Tôi nghĩ rằng đây là một câu hỏi tuyệt vời, và không có gì sẽ làm việc cho tất cả mọi người. Tôi nghĩ rằng sự tê liệt như vậy là một sản phẩm phụ tự nhiên của việc ngày càng trở nên có năng lực hơn trong lĩnh vực của bạn. Điều đó nói rằng, đây là một vài điều tôi làm giúp, nhưng không giải quyết được vấn đề:

  • Đặt dự án nguyên sơ của bạn sang một bên và làm việc trên phiên bản chạy trốn. Đây là phiên bản mà bạn tự nói với mình: a. Các mã không phải là đẹp. Trong thực tế, hãy nói với chính mình, tái cấu trúc và định dạng lại lớn không được phép. Hãy để nó hoàn toàn không có tổ chức và giải phóng bản thân khỏi sự ràng buộc của tiền mã hóa tốt. b. Nó chỉ phải làm việc. c. Tôi luôn ngạc nhiên về những gì tôi học được về không gian vấn đề khi tôi loại bỏ tất cả các mối quan tâm khác. Tôi cũng kết thúc với những mẩu tin nhỏ thường giúp tôi đi đến thiết kế phù hợp theo cách giác ngộ hơn.

  • Dành một khối thời gian có kích thước phù hợp nơi bạn đang ở trong dự án, chỉ cần không có máy tính. Cố gắng khái niệm hóa những gì bạn đang thực sự cố gắng thực hiện và tìm kiếm zen ma thuật vượt qua sự điên rồ của OO / Design Pattern.


0

Đưa ra một biểu hiện cụ thể cho những suy nghĩ của bạn: viết / gõ chúng xuống, rút ​​chúng ra hoặc bất cứ điều gì. Điều này sẽ giúp bạn trong việc xem xét lại suy nghĩ của bạn khi cần thiết; nó sẽ ngăn bạn đi theo vòng tròn; giúp bạn suy nghĩ rõ ràng hơn.

Bất cứ khi nào tôi thấy mình đi đâu và mọi nơi nghĩ về điều gì đó, tôi gõ chúng ra và nó giúp tôi suy nghĩ rõ ràng.


0

Tôi thường bắt đầu từ đầu, tạo ra nguyên mẫu đơn giản nhất có thể và chạy một cái gì đó. Sử dụng nguyên mẫu để thiết kế đảo ngược các trường hợp kiểm tra đường dẫn hạnh phúc, các trường hợp kiểm thử để điều khiển các giao diện và sau đó suy nghĩ về các hợp đồng trước / sau để giúp xây dựng phạm vi kiểm tra.

Đừng lo lắng về sự trừu tượng, tối ưu hóa hoặc xác minh cho đến khi vấn đề được hiểu đầy đủ.

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.