Tôi có thể viết mã, nhưng không thể thiết kế tốt. Bất kỳ đề xuất? [đóng cửa]


83

Tôi cảm thấy rằng tôi giỏi viết mã theo bit và miếng, nhưng thiết kế của tôi thực sự hấp dẫn. Câu hỏi là, làm thế nào để tôi cải thiện thiết kế của mình - và lần lượt trở thành một nhà thiết kế tốt hơn?

Tôi nghĩ rằng các trường học và cao đẳng làm tốt công việc dạy mọi người cách trở nên giỏi giải quyết vấn đề toán học, nhưng hãy thừa nhận thực tế là hầu hết các ứng dụng được tạo ra ở trường thường dài khoảng 1000 - 2000 dòng, điều đó có nghĩa là nó chủ yếu là một bài tập học thuật không phản ánh sự phức tạp của phần mềm trong thế giới thực - theo thứ tự từ vài trăm nghìn đến hàng triệu dòng mã.

Đây là nơi tôi tin rằng ngay cả các dự án như topcoder / dự án euler cũng sẽ không giúp ích nhiều, chúng có thể làm sắc nét khả năng giải quyết vấn đề toán học của bạn - nhưng bạn có thể trở thành một lập trình viên học thuật; một người quan tâm nhiều hơn đến những thứ tốt đẹp, sạch sẽ, những người hoàn toàn không hứng thú với những thứ trần tục và nhiều lông mà hầu hết các lập trình viên ứng dụng phải đối phó.

Vì vậy, câu hỏi của tôi là làm thế nào để tôi cải thiện kỹ năng thiết kế của tôi? Đó là, khả năng thiết kế các ứng dụng quy mô nhỏ / vừa sẽ đi vào một vài ngàn dòng mã? Làm cách nào tôi có thể học các kỹ năng thiết kế sẽ giúp tôi xây dựng một bộ soạn thảo html tốt hơn hoặc một số chương trình đồ họa như gimp?


1
"hãy thừa nhận thực tế là hầu hết các ứng dụng được tạo ra ở trường thường dài khoảng 1000 - 2000 dòng, điều đó có nghĩa là nó chủ yếu là một bài tập học thuật không phản ánh sự phức tạp của phần mềm trong thế giới thực": Nơi tôi đang dạy chúng tôi có hai dự án phần mềm học kỳ trong đó một nhóm mười sinh viên đã phát triển một ứng dụng khá phức tạp trong khoảng thời gian từ 6 đến 8 tháng. Ngoài ra, nhiều công ty (ít nhất là ở Đức) cung cấp các hợp đồng ngắn cho những sinh viên muốn thực hành trước khi họ hoàn thành việc học.
Giorgio

Câu trả lời:


87

Cách duy nhất để trở nên thực sự giỏi một thứ gì đó là thử, thất bại một cách ngoạn mục, thử lại, thất bại ít hơn trước một chút và theo thời gian phát triển kinh nghiệm để nhận ra nguyên nhân thất bại của bạn để bạn có thể quản lý các tình huống thất bại tiềm ẩn sau này. Điều này đúng như việc học chơi một nhạc cụ, lái xe hoặc kiếm một số tuổi PWN nghiêm túc trong game bắn súng góc nhìn người thứ nhất yêu thích của bạn, vì nó là học bất kỳ khía cạnh nào của phát triển phần mềm.

Không có phím tắt thực sự, nhưng có những điều bạn có thể làm để tránh gặp sự cố ngoài tầm tay trong khi bạn đang tích lũy kinh nghiệm.

  • Xác định một người cố vấn tốt . Không có gì tốt hơn là có thể nói về các vấn đề của bạn với một người đã trả phí. Hướng dẫn là một cách tuyệt vời để giúp học tập nhanh chóng.
  • Đọc , đọc thêm, thực hành những gì bạn đã đọc và lặp lại trong suốt cuộc đời của sự nghiệp. Tôi đã làm công việc này hơn 20 năm và tôi vẫn không ngừng học hỏi điều gì đó mới mỗi ngày. Tìm hiểu không chỉ về thiết kế phía trước, mà còn thiết kế nổi bật, thử nghiệm, thực tiễn tốt nhất, quy trình và phương pháp luận. Tất cả đều có mức độ ảnh hưởng khác nhau đến cách thiết kế của bạn sẽ xuất hiện, hình thành và quan trọng hơn là cách chúng tồn tại theo thời gian.
  • Tìm thời gian để tinker . Hoặc tham gia vào một dự án skunkwork thông qua nơi làm việc của bạn, hoặc thực hành vào thời gian riêng của bạn. Điều này đi đôi với việc đọc của bạn, bằng cách đưa kiến ​​thức mới của bạn vào thực tế và xem những thứ như vậy sẽ hoạt động như thế nào. Đây cũng là thứ tạo nên một cuộc thảo luận tốt với người cố vấn của bạn.
  • Nhận tham gia với kỹ thuật một cái gì đó bên ngoài của môi trường làm việc của bạn. Đây có thể là một dự án, hoặc một diễn đàn. Một cái gì đó sẽ cho phép bạn kiểm tra các lý thuyết và ý tưởng của bạn bên ngoài vòng tròn ngay lập tức của bạn để duy trì một quan điểm mới mẻ về mọi thứ.
  • Hãy kiên nhẫn . Nhận ra rằng kinh nghiệm kiếm tiền cần có thời gian và học cách chấp nhận rằng bạn cần lùi lại một thời gian để tìm hiểu lý do tại sao và nơi bạn đã thất bại.
  • Giữ một cuốn nhật ký hoặc một blog về các nhiệm vụ của bạn, suy nghĩ của bạn, thất bại và thành công của bạn. Điều này không thực sự cần thiết, tuy nhiên tôi đã thấy rằng nó có thể mang lại lợi ích lớn cho bạn để xem bạn đã phát triển như thế nào theo thời gian, kỹ năng của bạn đã phát triển như thế nào và suy nghĩ của bạn đã thay đổi. Tôi trở lại các tạp chí của riêng tôi vài tháng một lần và nhìn vào những thứ tôi đã viết 4-5 năm trước. Đó là một cái mở mắt thực sự khám phá ra tôi đã học được bao nhiêu trong thời gian đó. Nó cũng là một lời nhắc nhở rằng thỉnh thoảng tôi đã gặp sự cố. Đó là một lời nhắc nhở lành mạnh giúp tôi cải thiện.

45
+1 để thử và thất bại. Bởi vì khi bạn không hiểu tại sao có một mẫu thiết kế, bạn không thể sử dụng mẫu đó một cách hiệu quả.
Mert Akcakaya

2
+1 câu trả lời tuyệt vời, nhưng tôi thấy rằng nó có phần chưa hoàn chỉnh. Tôi tin rằng sự đóng góp quan trọng nhất cho đến nay sẽ là có một sự thèm ăn rất tốt cho tái cấu trúc. Viết, nhìn vào những gì lý thuyết nói (bài báo, sách hoặc người cố vấn), refactor / viết lại, quay lại lý thuyết, refactor / viết lại - điều này sẽ cho bạn thời gian để tập trung vào cấu trúc, trong khi làm việc với mã quen thuộc. Hãy là nhà phê bình tồi tệ nhất của riêng bạn. Tôi cũng sẽ nói rằng điều rất quan trọng là bạn sẽ không bao giờ mất cảm giác ngon miệng này khi liên tục xem lại công việc của chính mình.
vski

1
@vski Có nhiều khái niệm tôi có thể đưa vào, nhưng câu hỏi đặt ra là liệu những khái niệm đó có tự cung cấp một con đường hợp lý để kiếm kinh nghiệm cần thiết cho OP để coi mình là một nhà thiết kế cải tiến hay không. Trong phạm vi câu trả lời của tôi, tôi thấy tái cấu trúc là một thông lệ (theo điểm thứ hai của tôi). Vì vậy, cũng đang thực hành Clean Code, Test First, BDD và nhiều khái niệm khác. Tôi đã áp dụng cách tiếp cận rằng có nhiều kỹ năng và kinh nghiệm cần thiết để phát triển đến mức các kỹ năng thiết kế sẽ xuất hiện và phát triển, với kinh nghiệm và kiến ​​thức thu được, theo thời gian. :)
S.Robins

2
+1 để có được một người cố vấn. Lý tưởng nhất là nhờ người cố vấn của bạn thực hiện đánh giá mã với bạn. Nhờ người khác đọc và phê bình mã của bạn thực sự có thể giúp bạn khi nói đến thiết kế tốt hơn và sạch hơn.
Leo

2
"Đã từng thử. Đã từng thất bại. Không thành vấn đề. Thử lại. Thất bại lần nữa. Thất bại tốt hơn." --- Samuel Beckett.
Peter K.

16

Chà, không có quả táo vàng nào cho loại câu hỏi này, và tôi cảm thấy có lẽ đây là bản thân mỗi lập trình viên tìm thấy những gì phù hợp với mình. Dù sao đây cũng là của tôi.

Bạn có thể đọc sách về chủ đề này. Những cuốn sách tuyệt vời. Cuốn sách tuyệt vời. Nhưng tôi thấy rằng những cuốn sách này chỉ giúp bạn một khi bạn đã cố gắng xây dựng và thiết kế một ứng dụng - và đã thất bại.

Đối với tôi, đó là tất cả về kinh nghiệm. Khi tôi bắt đầu là một tân binh, tôi đọc sách về cách thiết kế. Lúc đó tôi không hiểu nhiều về nội dung. Khi tôi bắt đầu làm việc và phải tự thiết kế các ứng dụng, tôi đã tạo ra các ứng dụng rất lộn xộn. Họ đã làm việc, nhưng họ là một nỗi đau để duy trì. Sau đó tôi đọc lại những cuốn sách đó - và lần này tôi hiểu rõ hơn về chúng.

Bây giờ, tôi tiếp tục phạm sai lầm mới và học hỏi từ những cái cũ.


10
Có một điểm tuyệt vời ở đây rất đáng để gọi: Tiếp tục phạm sai lầm mới ; đừng tiếp tục mắc sai lầm - học hỏi từ chúng và làm điều gì đó mới.
Bevan

11

Dừng thiết kế và học cách tái cấu trúc mã. Phát triển gia tăng với tái cấu trúc liên tục và tích cực sẽ dẫn đến một sản phẩm cuối sạch hơn nhiều so với bất kỳ thiết kế phía trước nào.


2
Thiết kế nổi dần là một điều tuyệt vời IMHO, nhưng không có kỷ luật bạn có nguy cơ tạo ra "spaghetti nổi lên". Vấn đề với thiết kế phía trước là mọi người coi đó là một đề xuất tất cả hoặc không có gì, khiến nó trở thành một đại diện xấu khi mọi thứ trở nên tồi tệ. Điều này nhắc nhở tôi về một trong những bài viết của Joel nơi anh ấy đề cập rằng thiết kế là quan trọng. Những gì cần thiết mặc dù đủ trước để một thiết kế tạo ra sự khác biệt mà không làm mất thời gian, tài nguyên và cơ hội của bạn để xem các thiết kế hỗ trợ đẹp xuất hiện hữu cơ thông qua mã sạch.
S.Robins

@ S.Robins: Tôi cảm thấy OP vẫn đang tấn công các dự án đủ nhỏ để hoàn thành rất tốt với TDD và tái cấu trúc liên tục. Do đó anh ta có thể học được kỷ luật cần thiết để biết cần bao nhiêu thiết kế cho các dự án phức tạp hơn.
kevin cline

Tôi nghĩ rằng đó có thể là trường hợp, tuy nhiên tôi cảm thấy có thể đáng để thêm một phản biện với hàm ý rằng "bất kỳ thiết kế phía trước" nào sẽ có khả năng tồi tệ hơn khi một thứ hoàn toàn xuất hiện. Tuy nhiên, tôi đồng ý rằng cách để xây dựng trải nghiệm cần thiết mà OP đang tìm kiếm là bớt lo lắng khi bắt đầu về thiết kế và tập trung thay vào đó là viết mã sạch và có mã. :-)
S.Robins

Tôi không đồng ý rằng tái cấu trúc luôn dẫn đến thiết kế tốt nhất. Tất nhiên, tái cấu trúc thường cho phép bạn khám phá và hiểu vấn đề, nhưng thiết kế tốt không phải lúc nào cũng xuất hiện tăng dần thông qua tái cấu trúc. Đôi khi bạn thấy một giải pháp tốt hơn nhiều và nhận ra rằng mã hiện tại của bạn ở rất xa so với việc viết lại nhanh hơn nhiều so với tái cấu trúc.
Giorgio

Tôi đã có trải nghiệm này gần đây: Tôi tiếp tục tái cấu trúc và tái cấu trúc và đi vào một vòng tròn có cùng một vấn đề lặp đi lặp lại: Tôi đang sử dụng các trình vòng lặp để mã hóa một cái gì đó và mã vẫn tiếp tục phức tạp. Sau đó, tôi quyết định quên đi các trình vòng lặp và tôi phải viết lại nhiều mã, nhưng logic trở nên rõ ràng và súc tích hơn nhiều so với trước đây. Tôi không biết liệu bạn có gọi đây là "tái cấu trúc tích cực" hay không: cấu trúc tổng thể của ứng dụng không bị thay đổi nhưng một số phần cơ bản chỉ bị vứt đi và viết lại từ đầu.
Giorgio

7

Đọc về các mẫu, chắc chắn, nhưng trước hết và đọc về các mẫu chống. Nhận biết các mô hình chống là rất quan trọng và dễ hiểu hơn tại sao không nên làm điều gì đó theo cách như vậy hơn là tại sao lại như vậy.

Xem http://sourcemaking.com/antipotypes/software-development-antipotypes chẳng hạn.

Viết mã để có thể điều chỉnh nhanh nếu yêu cầu thay đổi (điều này rất phổ biến trong môi trường sản xuất).

Hãy cực kỳ hoài nghi về việc thêm "chỉ một lần hack nữa." Một cái nữa ở đây, một cái nữa ở đó, và mã trở nên không thể thay đổi được.

Giá trị nguyên tắc mở / đóng .

Viết các bài kiểm tra (như trong TDD). Họ buộc bạn phải nghĩ đến thiết kế của mình ngay cả trước khi bạn thực sự thực hiện nó.

Duyệt mã của các dự án nguồn mở (nghĩa là các dự án có kích thước hợp lý). Tôi đã từng ngạc nhiên - thông thường - nhìn thấy rất nhiều mức độ trừu tượng. Bây giờ tôi hiểu đó không phải là nghệ thuật vì nghệ thuật, có một lý do tại sao nó được thực hiện theo cách này.


4

Một nguyên tắc mà tôi thấy rất quan trọng đối với thiết kế tốt là phân rã: nếu một lớp quá lớn (hơn, giả sử, 300-400 dòng mã) chia nó thành các lớp nhỏ hơn; nếu một phương thức quá lớn (giả sử, hơn 50 dòng mã) sẽ phân tách nó; nếu một dự án chứa hơn 50 lớp, hãy phân tách nó.

Điều quan trọng là ước tính kích thước của hệ thống của bạn và xây dựng một số lớp trừu tượng (ví dụ: hệ thống con, ứng dụng, dự án, mô-đun, lớp, phương thức) cho phép bạn phân tách mã của mình thành các đơn vị dễ hiểu với mối quan hệ rõ ràng giữa chúng và một vài phụ thuộc.


1
Mặc dù có một số giá trị trong đề xuất của bạn, các dòng mã không thực sự quan trọng, hành vi thì có. Nếu phương pháp của bạn đang làm nhiều hơn một điều, có lẽ đã đến lúc cấu trúc lại nó. Nếu một điều đó chỉ là gọi các phương thức tự thực hiện một việc và ghép chúng lại với nhau, thì tốt thôi.
giật

1
@jer: Đó là một quy tắc của ngón tay cái, tất nhiên. Một phương thức gọi 100 phương thức khác là, như bạn nói, chỉ cần ghép các thứ lại với nhau (nó đang gọi một danh sách các hàm phụ). Tôi suy nghĩ nhiều hơn về các phương thức có chứa một số logic thực tế: đó thường là một dấu hiệu xấu nếu bạn phải cuộn nhiều lần để hiểu phương thức đang làm gì. Điều tương tự nếu bạn nhìn vào một định nghĩa lớp có nhiều thành viên (và lớp không chỉ là một tập hợp lớn các thuộc tính).
Giorgio

"Dự án chứa hơn 50 lớp, phân hủy nó" không nghiêm trọng
năng động

@ yes123: Nó có nghĩa là để đưa ra một ý tưởng. Nó thực sự phụ thuộc vào những gì bạn đang phát triển, bằng ngôn ngữ nào, v.v.
Giorgio

Tôi nghĩ sẽ hợp lý khi lưu ý rằng điều này sẽ không giúp ích cho thiết kế phía trước (vì bạn đang tái cấu trúc) nhưng sẽ giúp tìm hiểu các mẫu và thực tiễn tốt nhất sẽ cải thiện các thiết kế trong tương lai của bạn.
Craig Bovis

0

Thật khó khăn, điều chúng ta thực sự nói đến là khả năng trừu tượng hơn là tạo mã tốt hơn, nhưng hai điều sẽ giúp bạn trở nên tốt hơn và một điều sẽ khiến bạn hạnh phúc hơn:

"Tốt hơn"

A) Tìm nhà thiết kế tốt nhất bạn có thể và ghép chương trình / thực hiện thiết kế cùng nhau. Yêu cầu họ giải thích những gì họ nghĩ khi họ giải quyết vấn đề, đừng giải quyết vì "nó cảm thấy đúng" và tiếp tục đào. Quá trình đó cũng sẽ giúp bên "cố vấn"

B) Tưởng tượng mọi thứ như các tác nhân riêng lẻ và các cuộc hội thoại giữa chúng. Mỗi diễn viên nên có một vai trò / trách nhiệm duy nhất và các nhóm trong số họ xử lý các hệ thống khác nhau. Nếu cuộc trò chuyện đó hoạt động và mỗi diễn viên cảm thấy mạch lạc và gắn kết thì bạn đang trên đường đến.

Và "Hạnh phúc hơn"

C) Nếu bạn đã cố gắng hết sức và điều đó vẫn không xảy ra thì không có gì sai khi chấp nhận rằng một số người không thể làm một số thứ. Bạn có thể viết mã chặt chẽ, xuất sắc, nhưng không bao giờ có thể thiết kế hoặc kiến ​​trúc sư. Vậy thì sao? Tôi không thể chơi các môn thể thao cho kẹo bơ cứng, tôi không ưa nhìn và lái xe của tôi sẽ không bao giờ tốt hơn mức trung bình. Mặc khải và tận dụng những gì bạn giỏi.


-1

Theo kinh nghiệm cá nhân của tôi, đọc mã khác là một nguồn "cảm hứng" tốt. Ý tôi là cố gắng hiểu người khác thiết kế và tự hỏi tại sao anh ấy / cô ấy làm mọi thứ theo cách đó?

bạn có thể tìm thấy rất nhiều dự án nguồn mở để nghiên cứu.

dù sao bạn cũng cần luyện tập.


-1

Đừng sống trong sợ hãi

Phấn đấu vì sự đơn giản

Lắng nghe người dùng của bạn

Thử nhiều ý tưởng

Tạo một cái gì đó, sau đó làm cho nó tốt hơn

Làm việc trên những thứ làm tăng giá trị, từ bỏ những thứ không


-1

Học cách đặt câu hỏi đúng. Thường xuyên hơn là bạn sẽ không cải thiện thiết kế của mình bằng cách nhìn vấn đề từ một góc độ khác. Đặc biệt, điều này sẽ giúp bạn tránh khỏi việc tập trung vào giải quyết vấn đề trong tay và tìm hiểu thêm về các giải pháp giải quyết nhiều vấn đề liên quan.

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.