Làm thế nào tôi có thể tránh luôn cảm thấy như thế nào nếu tôi xây dựng lại hoàn toàn chương trình của mình từ đầu Tôi sẽ làm điều đó tốt hơn nhiều? [đóng cửa]


91

Tôi đã học được một lượng mã hóa đáng kể, tuy nhiên, nó luôn ở trong một môi trường khoa học (không phải khoa học máy tính), hoàn toàn tự học mà không có ai hướng dẫn tôi đi đúng hướng. Do đó, hành trình mã hóa của tôi đã ... lộn xộn. Bây giờ tôi đã nhận thấy rằng bất cứ khi nào tôi xây dựng một loại chương trình nào đó, cuối cùng, tôi nhận ra làm thế nào tôi có thể thực hiện nó một cách thanh lịch hơn, hiệu quả hơn và theo cách linh hoạt hơn và dễ quản lý hơn về phía trước. Trong một số trường hợp, tôi thực sự đã quay trở lại và xây dựng lại mọi thứ từ đầu, nhưng thường thì điều này không thực tế khả thi. Mặc dù hầu hết các chương trình của tôi cho đến nay đều tương đối nhỏ, nhưng có vẻ khá khó để viết lại hoàn toàn các chương trình lớn mỗi khi bạn tạo một cái gì đó.

Tôi chỉ tự hỏi, đây có phải là một kinh nghiệm bình thường? Nếu không, làm thế nào để bạn ngăn chặn điều này xảy ra? Tôi đã thử lên kế hoạch trước, nhưng dường như tôi không thể thấy trước mọi thứ cho đến khi tôi bắt đầu thực hiện một số mã.


87
bình thường, chương trình nhiều hơn
Ewan



43
Chào mừng bạn đến với lập trình. Nếu bạn không nhìn vào mã cũ và nghĩ "urgh" thì bạn nên bắt đầu lo lắng vì điều đó có nghĩa là bạn đã ngừng học.
Caltor

9
Thành thật khi tôi thấy câu hỏi này, tôi đã cười - bởi vì theo nghĩa đen, mọi lập trình viên tôi từng nói, kể cả bản thân tôi, luôn có cảm giác này, liên tục, mọi lúc. Nếu bạn muốn đi vào một lĩnh vực mà bạn cảm thấy như sản phẩm cuối cùng bạn tạo ra không có sai sót - lập trình là lĩnh vực sai lầm để lựa chọn.
Zibbobz

Câu trả lời:


4

Cảm giác này là hoàn toàn bình thường, và mong đợi. Nó có nghĩa là bạn đang học. Hầu như mỗi khi tôi bắt đầu một dự án mới, tôi bắt đầu theo một hướng, và cuối cùng thiết kế nó theo cách khác nhau.

Đó là thực tế phổ biến để đầu tiên phát triển một nguyên mẫu trước khi bắt đầu thực tế. Nó cũng phổ biến để xem lại mã cũ và cấu trúc lại nó. Điều này dễ dàng hơn nếu thiết kế của bạn là mô-đun - bạn có thể dễ dàng thiết kế lại các bit và miếng tại một thời điểm mà không phải bỏ hoàn toàn thiết kế cũ của mình.

Đối với một số người, nó giúp viết mã giả trước tiên. Những người khác thấy hữu ích khi bắt đầu bằng cách viết bình luận mô tả những gì mã sẽ làm, sau đó viết mã khi cấu trúc chung ở đó. Hai điều này sẽ giúp bạn lên kế hoạch thiết kế tốt hơn và có thể tránh sự cần thiết phải viết lại.

Nếu bạn là thành viên của một nhóm, có một quy trình xem xét là rất quan trọng đối với quy trình thiết kế. Có ai đó xem lại mã của bạn để bạn có thể học cách cải thiện thiết kế của mình.


100

Đây là một kinh nghiệm rất phổ biến

Hầu hết những người tôi tương tác, và bản thân tôi cũng vậy, cảm thấy như thế này. Từ những gì tôi có thể nói một lý do cho điều này là bạn tìm hiểu thêm về tên miền và các công cụ bạn sử dụng khi viết mã, điều này dẫn đến bạn nhận ra nhiều cơ hội để cải thiện sau khi bạn đã viết chương trình của mình.

Lý do khác là bạn có thể có một ý tưởng trong đầu về giải pháp mã sạch lý tưởng và thế giới thực và những hạn chế lộn xộn của nó cản trở bạn, buộc bạn phải viết những công việc không hoàn hảo và những vụ hack có thể khiến bạn không hài lòng.

"Mọi người đều có kế hoạch cho đến khi bị đấm vào mặt."

Phải làm gì về nó

Ở một mức độ nào đó, bạn sẽ phải học cách chấp nhận rằng mã của bạn sẽ không bao giờ hoàn hảo. Một điều giúp tôi với điều đó là suy nghĩ "Nếu tôi ghét mã tôi đã viết cách đây một tháng, điều đó có nghĩa là tôi đã học và trở thành một lập trình viên giỏi hơn".

Một cách để giảm bớt vấn đề là liên tục tìm kiếm những cải tiến tiềm năng khi bạn làm việc và tái cấu trúc liên tục. Đảm bảo đạt được sự cân bằng tốt giữa tái cấu trúc và thêm các tính năng mới / sửa lỗi. Điều này sẽ không giúp ích cho các vấn đề thiết kế lớn, nhưng nó thường sẽ để lại cho bạn một cơ sở mã được đánh bóng hơn mà bạn có thể tự hào.


18
Điều duy nhất tôi muốn thêm vào câu trả lời này là, tìm hiểu và làm theo các nguyên tắc TDD khi viết mã. Các thử nghiệm đó sau đó cung cấp một môi trường an toàn để tái cấu trúc và viết lại khi bạn tiếp tục cải thiện với tư cách là nhà phát triển và muốn thay đổi mã hiện có.
David Arno

10
@DavidArno điểm tái cấu trúc với các bài kiểm tra là gì? Nó giống như nâng cấp hệ thống và thực hiện sao lưu trước ... 0 niềm vui.
Džuris

3
@ Džuris, :) Đúng, nếu bạn thích thử thách, đừng viết bài kiểm tra
David Arno

6
@ Džuris Nó giống như nhảy ra khỏi máy bay mặc dù!
JollyJoker

3
.... Họ không thể nói với bạn rằng mô hình của bạn thực sự hữu ích. Điều đó đúng trong môi trường khoa học như ở bất kỳ nơi nào khác.
Ant P

46

Tìm hiểu tái cấu trúc - nghệ thuật cải thiện dần mã. Tất cả chúng ta đều học mọi lúc, vì vậy rất phổ biến để nhận ra rằng mã bạn tự viết có thể được viết theo cách tốt hơn.

Nhưng bạn sẽ có thể chuyển đổi mã hiện có để áp dụng các cải tiến này mà không phải bắt đầu lại từ đầu.


4
Thực hành này cũng sẽ giúp bạn học cách viết mã theo mô-đun và có thể được cấu trúc lại dễ dàng hơn. Tất cả các bài giảng trên thế giới đã không dạy tôi thói quen này nhiều như việc phải chia các chức năng lớn cũ thành các phần có thể quản lý được để tôi không phải viết lại từ đầu. Mỗi dự án mới, tôi làm tốt hơn ở đó.
JKreft

Điểm khởi đầu tốt nhất theo quan điểm của tôi để tìm hiểu về tái cấu trúc là: Tái
Wildcard

9

Nếu bạn có yêu cầu tĩnh tuyệt vời và hiểu rõ về chúng và có thời gian để phân tích chi tiết, bạn có cơ hội có thể đưa ra một thiết kế tốt mà bạn vẫn sẽ hài lòng khi hoàn thành.

Ngay cả trong trường hợp hạnh phúc đó, bạn có thể tìm hiểu các tính năng ngôn ngữ mới có thể giúp tạo ra một thiết kế tốt hơn.

Tuy nhiên, thông thường, bạn sẽ không may mắn như vậy: các yêu cầu sẽ ít hơn sao và không đầy đủ và mặc dù bạn nghĩ rằng bạn hiểu chúng, nhưng hóa ra có những lĩnh vực mà bạn đưa ra các giả định không hợp lệ.

Sau đó, các yêu cầu sẽ thay đổi khi người dùng nhìn vào các sản phẩm ban đầu của bạn. Sau đó, một cái gì đó mà người dùng không kiểm soát sẽ thay đổi, ví dụ luật thuế.

Tất cả những gì bạn có thể làm là thiết kế, giả định rằng mọi thứ sẽ thay đổi. Tái cấu trúc khi bạn có thể, nhưng nhận ra rằng thời gian và ngân sách thường có nghĩa là khả năng giao hàng cuối cùng của bạn sẽ không thanh lịch như trước đây nếu bạn biết ngay từ đầu những gì bạn biết bây giờ.

Theo thời gian, bạn sẽ trở nên tốt hơn trong việc đào sâu vào các yêu cầu bạn nhận được và nhận được phần nào trong thiết kế của bạn có khả năng cần linh hoạt để hấp thụ thay đổi.

Cuối cùng, chấp nhận sự thay đổi đó là không đổi và bỏ qua những khúc mắc có nội dung "Tôi có thể đã làm nó tốt hơn". Hãy tự hào và hạnh phúc vì bạn đã đưa ra một giải pháp.


Hoặc, đặt một cách khác: Học cách thiết kế cho linh hoạt ngay từ đầu, mà không đưa ra các chi phí không cần thiết. Lý tưởng nhất, sự linh hoạt bắt nguồn từ sự đơn giản. Sau đó, thiết kế của bạn có cơ hội để vượt qua bài kiểm tra thay đổi yêu cầu.
cmaster

3

Làm thế nào tôi có thể tránh luôn cảm thấy như thế nào nếu tôi xây dựng lại hoàn toàn chương trình của mình từ đầu Tôi sẽ làm điều đó tốt hơn nhiều?

Những gì bạn có thể làm là tạo ra một nguyên mẫu bỏ đi, trước khi bắt đầu thực hiện dự án "thực sự". Nhanh chóng và hèn hạ. Sau đó, khi bạn có được một nguyên mẫu để chứng minh một khái niệm, bạn sẽ làm quen với hệ thống và làm thế nào để thực hiện mọi thứ đúng cách.

Nhưng đừng ngạc nhiên, nếu sau N năm bạn quay lại mã này và nghĩ "thật là bừa bộn".


3
Hoặc, bạn đưa ra nguyên mẫu cho sếp của mình, anh ta nói là 'Rực rỡ, điều đó sẽ làm được.' chuyển bạn vào một dự án khác và nguyên mẫu của bạn trở thành sản xuất.
RyanfaeScotland

2
Lời khuyên này phổ biến đến mức có một câu nói về nó. "Xây dựng một để ném đi". Và lời khuyên đó bị lạm dụng đến mức có một câu nói về nó: "Nếu bạn xây dựng một để vứt đi, có lẽ bạn sẽ vứt bỏ hai."
Eric Lippert

2
@EricLippert Trải nghiệm của tôi thật tồi tệ theo hướng ngược lại - nếu chúng ta xây dựng một thứ để vứt đi, chắc chắn nó sẽ được chuyển đến khách hàng.
Jon

2
@Jon: Vâng, điều đó có thể xảy ra, đặc biệt là khi quản lý mắc lỗi "giao diện người dùng trông giống như nó hoạt động" với thực tế có bất kỳ mã nào ở đó. Điều đó nói rằng, kinh nghiệm của tôi luôn là như vậy, vì một trong những đồng nghiệp của tôi đã từng nói rằng "chúng ta có đủ thời gian để xây dựng nó sai hai lần nhưng không đủ thời gian để xây dựng nó đúng một lần". :-)
Eric Lippert

@EricLippert Đó chính xác là lý do để xây dựng GUI cuối cùng và KHÔNG xây dựng GUI cho một nguyên mẫu;)
BЈовић

3

Hãy nhớ câu thần chú này:

Sự hoàn hảo là kẻ thù của những điều tốt đẹp .

Các hoàn hảo giải pháp không phải là lúc nào cũng là lý tưởng giải pháp. Các lý tưởng giải pháp là một trong đó đạt được tình trạng "đủ tốt" với số tiền ít nhất của công việc.

  • Liệu nó có đáp ứng tất cả các yêu cầu liên quan đến chức năng và hiệu suất?
  • Có miễn phí các lỗi nghiêm trọng mà bạn không thể sửa trong kiến ​​trúc hiện tại không?
  • Ước tính số tiền bạn sẽ đầu tư để duy trì ứng dụng này trong tương lai. Nỗ lực viết lại sẽ nhiều hơn nỗ lực lâu dài mà nó sẽ tiết kiệm?
  • Có khả năng thiết kế mới của bạn thực sự có thể làm cho mọi thứ tồi tệ hơn?

Nếu bạn trả lời có cho tất cả những câu hỏi này, thì phần mềm của bạn "đủ tốt" và không có lý do chính đáng để viết lại từ đầu. Thay vào đó, áp dụng các bài học thiết kế bạn đã học cho dự án tiếp theo của bạn.

Việc mọi lập trình viên có một vài chương trình lộn xộn trong quá khứ là điều hoàn toàn bình thường. Nó đã xảy ra nhiều lần trong sự nghiệp là một nhà phát triển phần mềm mà tôi đã xem một số mã, tự hỏi "Kẻ ngốc nào đã viết mớ hỗn độn này?", Kiểm tra lịch sử phiên bản và nhận thấy rằng đó là tôi từ nhiều năm trước.


3

Tôi đã thử lên kế hoạch trước, nhưng dường như tôi không thể thấy trước mọi thứ cho đến khi tôi bắt đầu thực hiện một số mã.

Thật hấp dẫn khi nghĩ rằng lập kế hoạch hoàn hảo sẽ cung cấp cho bạn thiết kế / kiến ​​trúc phần mềm hoàn hảo, tuy nhiên, hóa ra đó là sai về mặt phân loại. Có hai vấn đề lớn với điều này. Thứ nhất, "trên giấy" và "mã" hiếm khi khớp nhau, và lý do là bởi vì thật dễ dàng để nói nó nên được thực hiện như thế nào trái ngược với thực tế làm nó . Thứ hai, những thay đổi không lường trước trong các yêu cầu trở nên rõ ràng vào cuối quá trình phát triển mà không thể có lý do từ khi bắt đầu.

Bạn đã nghe nói về phong trào Agile? Đó là một cách suy nghĩ nơi chúng ta coi trọng "phản ứng với thay đổi" trái ngược với "theo một kế hoạch" (trong số những thứ khác). Đây là bản tuyên ngôn (đây là một bản đọc nhanh). Bạn cũng có thể đọc về Big Design Up Front (BDUF) và những cạm bẫy là gì.

Thật không may, phiên bản công ty của "Agile" là một nhóm không có thật (thạc sĩ scrum được chứng nhận, quy trình nặng nề dưới tên "Agile", buộc scrum, buộc bảo hiểm mã 100%, v.v.), và thường dẫn đến thay đổi quy trình asinine vì người quản lý nghĩ rằng Agile là một quá trình và một viên đạn bạc (trong đó không phải là một viên đạn). Đọc bản tuyên ngôn nhanh nhẹn, lắng nghe những người bắt đầu phong trào này như chú Bob và Martin Fowler, và đừng bị cuốn hút vào phiên bản vô nghĩa của "Agile công ty".

Đặc biệt, bạn thường có thể thoát khỏi việc chỉ thực hiện TDD (Phát triển dựa trên thử nghiệm) trên mã khoa học và rất có thể dự án phần mềm của bạn sẽ trở nên khá tốt. Điều này là do mã khoa học thành công hầu hết có giao diện cực kỳ hữu dụng, với hiệu suất là mối quan tâm thứ yếu (và đôi khi cạnh tranh), và vì vậy bạn có thể thoát khỏi một thiết kế "tham lam" hơn. TDD loại buộc phần mềm của bạn phải cực kỳ có thể sử dụng được , bởi vì bạn viết như thế nào bạn muốn mọi thứ được gọi (lý tưởng) trước khi bạn thực sự thực hiện chúng. Nó cũng buộc các hàm nhỏ với các giao diện nhỏ có thể nhanh chóng được gọi theo kiểu "đầu vào" / "đầu ra" đơn giản và nó đặt bạn vào vị trí tốt để tái cấu trúc trong trường hợp yêu cầu thay đổi.

Tôi nghĩ rằng tất cả chúng ta có thể đồng ý rằng đó numpylà phần mềm máy tính khoa học thành công. Giao diện của chúng nhỏ, siêu tiện dụng và mọi thứ chơi độc đáo với nhau. Lưu ý rằng numpyhướng dẫn tham khảo rõ ràng đề xuất TDD: https://docs.scipy.org/doc/numpy-1.15.1/reference/testing.html . Trước đây tôi đã sử dụng TDD cho phần mềm chụp ảnh SAR (Radar A Nhiệt độ Tổng hợp): và tôi cũng có thể khẳng định rằng nó hoạt động rất tốt cho miền cụ thể đó.

Hãy cẩn thận: Phần thiết kế của TDD hoạt động kém hơn trong các hệ thống trong đó việc tái cấu trúc cơ bản (như quyết định rằng bạn cần phần mềm của mình đồng thời cao) sẽ khó, như trong một hệ thống phân tán. Chẳng hạn, nếu bạn phải thiết kế một cái gì đó như Facebook nơi bạn có hàng triệu người dùng đồng thời, thực hiện TDD (để thúc đẩy thiết kế của bạn) sẽ là một sai lầm (vẫn sử dụng được sau khi bạn có thiết kế sơ bộ và chỉ cần "thử nghiệm phát triển đầu tiên "). Điều quan trọng là phải suy nghĩ về các tài nguyên và cấu trúc của ứng dụng của bạn trước khi nhảy vào mã. TDD sẽ không bao giờ dẫn bạn đến một hệ thống phân tán, có sẵn cao.

Làm thế nào tôi có thể tránh luôn cảm thấy như thế nào nếu tôi xây dựng lại hoàn toàn chương trình của mình từ đầu Tôi sẽ làm điều đó tốt hơn nhiều?

Với những điều trên, có thể thấy rõ rằng một thiết kế hoàn hảo thực sự là không thể đạt được, vì vậy, theo đuổi một thiết kế hoàn hảo là một trò chơi ngu ngốc. Bạn thực sự chỉ có thể đến gần. Ngay cả khi bạn nghĩ rằng bạn có thể thiết kế lại từ đầu, có thể vẫn còn những yêu cầu tiềm ẩn chưa được thể hiện. Hơn nữa, việc viết lại mất ít nhất chừng nào nó cần để phát triển mã gốc. Nó gần như chắc chắn sẽ không ngắn hơn, vì có khả năng thiết kế mới sẽ giải quyết được các vấn đề của chính nó, cộng với việc bạn phải triển khai lại tất cả các tính năng của hệ thống cũ.

Một điều khác cần xem xét là thiết kế của bạn chỉ thực sự quan trọng khi yêu cầu thay đổi .Không quan trọng là thiết kế tệ đến mức nào nếu không có gì thay đổi (giả sử nó có đầy đủ chức năng cho các trường hợp sử dụng hiện tại). Tôi đã làm việc trên một đường cơ sở có câu lệnh chuyển đổi dòng 22.000 (chức năng thậm chí còn dài hơn). Đó có phải là thiết kế khủng khiếp? Heck yea, nó là khủng khiếp. Chúng tôi đã sửa nó chưa? Không. Nó hoạt động tốt như nó vốn có, và một phần của hệ thống không bao giờ thực sự gây ra sự cố hoặc lỗi. Nó chỉ được chạm vào một lần trong hai năm tôi tham gia dự án, và ai đó, bạn đoán nó, đã chèn một trường hợp khác vào công tắc. Nhưng nó không đáng để dành thời gian để sửa một cái gì đó không thường xuyên, nó chỉ là không. Hãy để thiết kế không hoàn hảo như hiện tại và nếu nó không bị hỏng (hoặc liên tục bị hỏng) thì đừng sửa nó. Vì vậy, có lẽ bạn có thể làm tốt hơn ... Nhưng nó có đáng để viết lại không? Bạn sẽ đạt được gì?

HTH.


2

Tôi hoàn toàn đồng ý với câu trả lời do Andreas Kammerloher cung cấp nhưng tôi ngạc nhiên không ai đã đề nghị học và áp dụng một số thực tiễn tốt nhất về mã hóa. Tất nhiên đây không phải là viên đạn bạc, nhưng sử dụng phương pháp tiếp cận mở, thiết kế mẫu, hiểu khi mã của bạn có mùi và sẽ giúp bạn trở thành một lập trình viên tốt hơn. Nghiên cứu cách sử dụng tốt nhất của các thư viện, khung công tác, v.v ... Chắc chắn nhiều hơn, tôi chỉ đang gãi trên bề mặt.

Điều đó không có nghĩa là bạn sẽ không xem mã cũ của mình như một thứ rác rưởi (bạn thực sự sẽ thấy các chương trình cũ nhất thậm chí còn nhiều rác hơn bạn không có kiến ​​thức này) nhưng với mỗi phần mềm mới bạn viết bạn sẽ thấy bạn cải thiện Cũng lưu ý rằng số lượng thực hành mã hóa tốt nhất tăng theo thời gian, một số chỉ đơn giản là thay đổi để bạn thực sự sẽ không bao giờ đạt được sự hoàn hảo. Chấp nhận điều này hoặc khá đường dẫn.

Một điều tốt hơn là có một sửa đổi mã. Khi bạn làm việc một mình, thật dễ dàng để cắt góc. Nếu bạn có người thứ hai xem xét mã của mình, họ sẽ có thể chỉ ra nơi bạn không tuân theo các thực tiễn tốt nhất đó. Bằng cách này, bạn sẽ tạo ra mã tốt hơn và bạn sẽ học được điều gì đó.


1

Để thêm vào các câu trả lời tuyệt vời khác ở đây, một điều tôi thấy hữu ích là biết nơi bạn muốn đến .

Thật hiếm khi được đưa ra phía trước cho một chút chính của tái cấu trúc. Nhưng bạn thường có thể thực hiện các thao tác tái cấu trúc nhỏ hơn khi bạn thực hiện, 'dưới radar', khi bạn làm việc trên từng khu vực của cơ sở mã. Và nếu bạn có một mục tiêu trong tâm trí, bạn có thể tận dụng những cơ hội này để di chuyển, từng bước một, đi đúng hướng.

Có thể mất nhiều thời gian, nhưng hầu hết các bước sẽ cải thiện mã và kết quả cuối cùng sẽ có giá trị.

Ngoài ra, cảm giác như bạn có thể làm tốt hơn là một dấu hiệu tốt ! Điều đó cho thấy rằng bạn quan tâm đến chất lượng công việc của mình và bạn đang đánh giá nó một cách nghiêm túc; vì vậy bạn có thể học hỏi và cải thiện. Đừng để những điều này làm bạn lo lắng - nhưng đừng ngừng làm chúng!


1

Bạn đã vô tình vấp phải một trong những thử thách lớn nhất của nhân loại (cuộc phiêu lưu), cầu nối giữa con người và máy móc. Cầu nối giữa con người và cấu trúc vật lý, Kỹ thuật Xây dựng chẳng hạn, đã được tiến hành trong khoảng 200 năm trở lên.

Vì phát triển phần mềm thực sự chỉ trở thành xu hướng trong những năm 90, nên nó đã gần 30 tuổi. Chúng tôi đã học được rằng nó không phải là một ngành kỹ thuật như là một khoa học xã hội, và chúng tôi chỉ mới bắt đầu.

Có, bạn sẽ thử TDD, Tái cấu trúc, Lập trình hàm, Mẫu lưu trữ, Tìm nguồn sự kiện, MV gì đó, Java Script (<- Làm điều này, thật điên rồ), Binding Model, No Sql, Container, Agile, SQL (<- làm điều này nó mạnh mẽ).

Không có ai sửa. Ngay cả các chuyên gia vẫn đang nắm bắt ống hút.

Chào mừng, và được cảnh báo, đó là một nơi cô đơn; nhưng hoàn toàn hấp dẫn.


1

Tôi sẽ đi một chút so với hạt. Điều này là vô cùng phổ biến , nhưng nó không được chấp nhận . Điều này cho thấy rằng bạn không nhận ra các cách tổ chức mã tốt khi bạn viết mã. Cảm giác đến từ mã của bạn không đơn giản .

Trải nghiệm của bạn cũng là của tôi trong một thời gian dài, nhưng gần đây (vài năm qua), tôi đã sản xuất nhiều mã hơn mà không khiến tôi cảm thấy mình cần phải vứt bỏ mọi thứ. Đây là những gì tôi đã làm:

  1. Hãy rõ ràng về những giả định mà bất kỳ khối mã cụ thể nào đang thực hiện. Ném lỗi nếu chúng không được đáp ứng. Hãy suy nghĩ về điều này một cách cô lập , mà không phụ thuộc vào chi tiết về những gì phần còn lại của phần mềm đang làm. (Phần còn lại của phần mềm đang làm gì ảnh hưởng đến những giả định bạn thi hành và những trường hợp sử dụng nào bạn hỗ trợ, nhưng nó không ảnh hưởng đến việc bạn có đưa ra lỗi khi giả định bị vi phạm hay không.)
  2. Ngừng tin vào các quy tắc và mô hình và thực tiễn sau đây sẽ tạo ra mã tốt. Vứt bỏ những suy nghĩ và thực hành không rõ ràng và đơn giản. Cái này rất lớn OO và TDD thường được dạy theo cách không căn cứ vào những cân nhắc thực tế, như một tập hợp các nguyên tắc trừu tượng bạn nên tuân theo khi viết mã. Nhưng điều này là hoàn toàn không có ích cho việc thực sự phát triển mã tốt. Nếu bạn sử dụng OO hoặc TDD, thì nó nên được sử dụng làm giải pháp cho các vấn đề bạn hiểu là bạn có . Nói cách khác, chúng chỉ nên được sử dụng khi bạn nhìn vào một vấn đề và nghĩ, "Được rồi, điều này hoàn toàn có ý nghĩa và cực kỳ rõ ràng là một giải pháp tốt." Không phải trước đây.
  3. Khi tôi viết mã, hãy tập trung vào hai câu hỏi:
    • Tôi có đang sử dụng các tính năng và thư viện theo cách chúng được thiết kế để sử dụng không? Điều này bao gồm sử dụng nó cho các loại vấn đề mà nó dự định giải quyết, hoặc ít nhất là những vấn đề rất giống nhau.
    • đơn giản không? Liệu đồng nghiệp và bản thân tôi có thể theo logic dễ dàng sau này không? Có những thứ không rõ ràng ngay lập tức từ mã?

Mã của tôi bây giờ "mang tính thủ tục" hơn, theo ý tôi là nó được tổ chức bởi những hành động mà nó thực hiện thay vì cấu trúc dữ liệu mà nó sử dụng. Tôi sử dụng các đối tượng trong các ngôn ngữ mà các hàm độc lập không thể thay thế nhanh chóng (C # và Java không thể thay thế các hàm khi đang di chuyển, Python có thể). Bây giờ tôi có xu hướng tạo ra nhiều chức năng tiện ích hơn , chỉ cần loại bỏ một số bản tóm tắt gây phiền nhiễu để tôi thực sự có thể đọc logic của mã của mình. (Ví dụ: khi tôi cần xử lý tất cả các kết hợp của các mục trong danh sách, tôi đã đẩy chỉ mục lặp ra một phương thức mở rộng trả vềTupleVì vậy, chức năng ban đầu sẽ không bị lộn xộn với các chi tiết triển khai đó.) Tôi chuyển nhiều thứ hơn làm tham số cho các hàm bây giờ, thay vì có một hàm tiếp cận với một số đối tượng khác để tìm nạp nó. (Người gọi tìm nạp hoặc tạo nó thay vào đó và chuyển nó vào.) Bây giờ tôi để lại nhiều bình luận giải thích những điều không rõ ràng chỉ bằng cách nhìn vào mã , điều này làm cho logic của phương thức dễ dàng hơn. Tôi chỉ viết bài kiểm tra trong những trường hợp giới hạn mà tôi lo ngại về logic của thứ tôi vừa làm và tôi tránh sử dụng giả. (Tôi thực hiện nhiều thử nghiệm đầu vào / đầu ra trên các đoạn logic bị cô lập.) Kết quả là mã không hoàn hảo , nhưng điều đó thực sự có vẻ ổn, thậm chí 2 hoặc 3 năm sau. Đó là mã đáp ứng khá tốt để thay đổi; những thứ nhỏ có thể được thêm hoặc xóa hoặc thay đổi xung quanh mà không làm toàn bộ hệ thống sụp đổ.

Ở một mức độ nào đó, bạn phải trải qua giai đoạn mà mọi thứ là một mớ hỗn độn để bạn có một số kinh nghiệm để giải quyết. Nhưng nếu mọi thứ vẫn còn rối tung đến mức bạn muốn vứt bỏ tất cả và bắt đầu lại, thì có gì đó không ổn; bạn không học


0

Bằng cách nhớ rằng thời gian của bạn là có hạn. Và thời gian trong tương lai của bạn cũng bị hạn chế. Cho dù cho công việc hay trường học hoặc các dự án cá nhân, khi nói đến mã làm việc , bạn phải tự hỏi mình "đang viết lại đây là cách sử dụng tốt nhất thời gian hạn chế và quý giá của tôi?". Hoặc có thể, "đây có phải là cách sử dụng có trách nhiệm nhất trong thời gian giới hạn của tôi"?

Đôi khi câu trả lời sẽ là dứt khoát . Thường thì không. Đôi khi nó sẽ ở trên hàng rào và bạn sẽ phải sử dụng theo ý của mình. Đôi khi, đó là cách sử dụng tốt thời gian của bạn chỉ đơn giản vì những điều bạn sẽ học được bằng cách thực hiện nó.

Tôi có rất nhiều dự án, cả công việc và cá nhân, sẽ được hưởng lợi từ một cổng / viết lại. Tôi cũng có những thứ khác để làm.


0

Đó là một phần hoàn toàn bình thường của việc học. Bạn nhận ra sai lầm khi bạn đi.

Đó là cách bạn trở nên tốt hơn và đó không phải là điều bạn nên tránh.


0

Bạn có thể cho mình kinh nghiệm để biết rằng sự thôi thúc quyến rũ để viết lại thường không hiệu quả. Tìm một số dự án nguồn mở cũ, nhiều lông, không phức tạp với độ phức tạp vừa phải. Hãy thử viết lại từ đầu và xem cách bạn làm.

  • Thiết kế từ đầu của bạn có thanh lịch như bạn mong muốn không?
  • Là giải pháp của bạn thực sự cho cùng một vấn đề chính xác? Những tính năng bạn đã bỏ đi? Những trường hợp cạnh bạn đã bỏ lỡ?
  • Những bài học khó kiếm được trong dự án ban đầu mà bạn đã xóa trong việc theo đuổi sự thanh lịch?
  • Sau khi bạn thêm những phần còn thiếu trở lại vào thiết kế của mình, nó có sạch như không có chúng không?

Cuối cùng, bản năng của bạn sẽ chuyển từ suy nghĩ "Tôi có thể viết lại hệ thống này tốt hơn nhiều" sang suy nghĩ "tính du lịch của hệ thống này có thể là biểu hiện của một sự phức tạp không rõ ràng ngay lập tức."

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.