Dành quá nhiều thời gian để gỡ lỗi


24

Hôm qua, tôi đã phát hành bản phát hành v1.0 của một dự án Web mà tôi đã dành khoảng 6 tuần để làm việc (bật và tắt, đó là). Tôi chưa tạo ra bất kỳ hồ sơ chính xác nào về thời gian của mình, nhưng theo kinh nghiệm của tôi, tôi sẽ ước tính rằng trong tất cả thời gian tôi dành cho lập trình, một nửa trong số đó đã được sử dụng để gỡ lỗi. Tôi ước tính rằng để dành khoảng 15-20 giờ để gỡ lỗi, với tôi đó là thời gian quý giá có thể tốt hơn dành cho việc viết mã mới hoặc hoàn thành dự án trước đó. Điều này cũng đặc biệt không giúp tôi trở thành sinh viên năm nhất đại học trong 5 tuần.

Điều này là, tôi cảm thấy tồi tệ vì đã dành tất cả thời gian để gỡ lỗi. Tất cả thời gian dành cho việc gỡ lỗi khiến tôi nhận ra rằng tôi đã mắc một số lỗi khá ngu ngốc khi tôi đang phát triển dự án của mình, những sai lầm khiến tôi mất một khoảng thời gian tốt để sửa chữa.

Làm thế nào tôi có thể ngăn chặn điều này xảy ra trong tương lai? Tôi không muốn dành 50% thời gian để gỡ lỗi, tôi muốn dành 10% để gỡ lỗi và phần còn lại viết mã mới. Một số kỹ thuật tôi có thể cố gắng để giúp tôi đạt được mục tiêu này là gì?


22
Khi tôi là sinh viên năm nhất, tôi cũng là một lập trình viên chậm chạp. Chỉ cần cho nó 20 năm.
Công việc

27
uhh yea, chúc may mắn với điều đó. "Nếu gỡ lỗi là quá trình loại bỏ lỗi. Lập trình phải là quá trình đưa chúng vào." -Edsger Dijkstra
Matt

7
Bạn có học được gì từ những sai lầm đó không? Nếu bạn đã làm, bạn sẽ không tạo ra chúng lần sau và điều này sẽ giảm thời gian gỡ lỗi của bạn.
Craig T

5
Điều này được gọi là "kinh nghiệm" và sẽ giúp bạn trong dự án tiếp theo của bạn .

4
Nói về cuối những năm 1940, Maurice Wilkes đã viết: "Ngay khi chúng tôi bắt đầu lập trình, chúng tôi đã ngạc nhiên rằng không dễ để có được các chương trình đúng như chúng tôi nghĩ. Việc gỡ lỗi phải được phát hiện. Đó là một trong những hành trình của tôi giữa phòng EDSAC và thiết bị đục lỗ 'do dự ở các góc của cầu thang' đã nhận ra tôi với toàn bộ sức mạnh rằng phần còn lại của cuộc đời tôi sẽ được dành để tìm lỗi trong các chương trình của riêng tôi. "
Trevor Powell

Câu trả lời:


35

Bạn đang yêu cầu Chén Thánh của công nghệ phần mềm và chưa có ai có "câu trả lời" cho câu hỏi này.

Điều cần thiết là bạn theo dõi các loại lỗi mà bạn đang mắc phải và sau đó phân tích các lỗi đó để xác định xem có xu hướng chung hay không. Phân tích nguyên nhân gốc là tên chính thức của loại hướng nội này, và có rất nhiều tài liệu trên web liên quan đến nó.

Các chuyên gia sử dụng một hệ thống theo dõi lỗi để họ có thể (1) biết những gì cần khắc phục, nhưng cũng (2) phân tích những gì phải được sửa chữa sau thực tế. Bạn không cần phải quá trang trọng - chỉ cần giữ một kiểm đếm trong một cuốn sổ có thể tốt cho bạn.

Khiếm khuyết giai đoạn thiết kế

Nếu bạn thấy rằng hầu hết các lỗi của bạn xuất phát từ sự hiểu lầm về tuyên bố vấn đề hoặc nếu bạn tiếp tục tìm thấy bạn đã chọn sai thuật toán hoặc đường dẫn để giải quyết vấn đề của mình, bạn sẽ gặp vấn đề trong giai đoạn thiết kế.

Nó sẽ khiến bạn mất nhiều thời gian hơn khi bắt đầu dự án và viết ra chính xác những gì cần phải làm và làm thế nào để thực hiện nó. Xem xét công việc này một cách cẩn thận và xem xét lại vấn đề ban đầu và xác định xem bạn có thực sự giải quyết nó đúng cách hay không. Thêm một hoặc ba giờ khi bắt đầu có thể giúp bạn tiết kiệm nhiều giờ trên đường.

Lỗi mã hóa

Nếu thiết kế của bạn chắc chắn, nhưng bạn liên tục chiến đấu với ngôn ngữ mà bạn đang mã hóa, hãy lấy cho mình một số công cụ sẽ phân tích mã cho bạn và cảnh báo bạn sớm và thường xuyên rằng bạn đang mắc lỗi.

Nếu bạn đang lập trình bằng C, hãy bật tất cả các cảnh báo của trình biên dịch, sử dụng trình kiểm tra ngữ nghĩa như lintvà sử dụng một công cụ như valgrindđể nắm bắt các vấn đề liên quan đến bộ nhớ động phổ biến.

Nếu bạn đang lập trình Perl, bật strictwarningsvà chú ý những gì nó nói.

Cho dù bạn đang sử dụng ngôn ngữ nào, có lẽ vẫn tồn tại nhiều công cụ để giúp nắm bắt các lỗi phổ biến từ lâu trước khi bạn đến giai đoạn gỡ lỗi.

Khiếm khuyết giai đoạn tích hợp

Khi bạn phát triển mã của mình theo các thực tiễn mô đun hóa tốt, bạn phải bắt đầu dán các phần riêng biệt lại với nhau. Ví dụ, các phần khác nhau trong mã của bạn có thể phải thực hiện với đầu vào của người dùng, tương tác cơ sở dữ liệu, hiển thị dữ liệu, thuật toán / logic và mỗi phần này được xây dựng tương đối độc lập với nhau (nghĩa là bạn có xu hướng tập trung vào phần đó trong tay thay vì lo lắng về việc tích hợp với mọi thứ khác).

Đây là nơi phát triển theo hướng kiểm tra (TDD) rất tiện dụng. Mỗi mô-đun mã của bạn có thể có các kiểm tra xác minh rằng chúng hoạt động theo cách chúng được thiết kế. Các bài kiểm tra này nên được viết trước hoặc rất sớm trong quy trình để bạn có thể có một bộ "người trợ giúp" để giữ cho bạn trung thực. Khi bạn bắt đầu làm mọi thứ hoạt động cùng nhau và bạn thấy rằng bạn phải thay đổi cách thực hiện hoặc tương tác với một hệ thống phụ khác, bạn có thể quay lại các bài kiểm tra của mình để đảm bảo rằng bạn đã làm gì để thực hiện tất cả đều hoạt động cùng nhau không phá vỡ tính chính xác của mã.

Và cứ thế ...

Chọn một số cuốn sách về công nghệ phần mềm và kỹ thuật mã hóa thực tế, và bạn sẽ học được nhiều cách khác nhau để làm cho sự phát triển bớt hỗn loạn và đáng tin cậy hơn. Bạn cũng sẽ thấy rằng chỉ cần kinh nghiệm cũ đơn giản - kiếm được một tấm bằng từ trường học của những cú va chạm mạnh - cũng sẽ giúp bạn trở nên cân đối.

Điều mà hầu hết mọi thứ sôi sục là một chút thời gian và công việc trả trước bằng cổ tức lớn sau này trong quá trình phát triển / phát hành.

Thực tế là bạn đã nhận thấy những vấn đề này từ rất sớm trong sự nghiệp nói lên điều tốt cho tương lai của bạn và tôi chúc bạn may mắn nhất.


1
Đây là một câu trả lời tuyệt vời nhưng IMHO cho một câu hỏi khác biệt. OP đang nói rằng tôi đã dành 6 tuần để tắt / viết một cái gì đó và tôi đã phải mất rất nhiều thời gian để gỡ lỗi. Chúng tôi chưa biết gì về chất lượng, khả năng bảo trì, khả năng mở rộng của sản phẩm. Nếu chúng ta giả sử TDD, thiết kế tốt, theo dõi lỗi, vẫn còn câu hỏi làm thế nào để chúng ta viết mã (bao gồm cả mã kiểm tra cũng cần được gỡ lỗi) với ít lỗi hơn. Bật cảnh báo, sử dụng xơ vải, vv là những gợi ý tốt. Thêm những người từ trường học của gõ cứng? :-)
Guy Sirton

1
@Guy - Vâng ... câu hỏi của OP hơi mơ hồ, đó là lý do tại sao tôi tập trung vào phân tích nguyên nhân gốc rễ. Bạn không biết điều gì sai cho đến khi bạn biết điều gì sai. Lý do tôi đưa ra khảo sát về các khu vực có vấn đề là vì tôi muốn anh ấy nhận thức được nhiều cạm bẫy tiềm ẩn và mỗi giai đoạn của quá trình này đều xứng đáng được kiểm tra. Đối với tất cả những gì tôi biết, anh ta có thể là Tony Hoare tiếp theo, nhưng một người có kỹ năng đánh máy của một con voi mù - cách khắc phục khác nhau cho các nguyên nhân khác nhau.
unpythonic

37

Viết bài kiểm tra đơn vị

Viết các bài kiểm tra đơn vị cho mã của bạn sẽ buộc bạn phải suy nghĩ về kiến ​​trúc của mình và khuyến khích bạn viết mã của mình thành các phần nhỏ, được kiểm soát cẩn thận. Điều này sẽ làm giảm đáng kể nỗ lực sửa lỗi của bạn và số lượng nhỏ gỡ lỗi bạn thực hiện sẽ bị giới hạn trong các đoạn mã nhỏ, tập trung chặt chẽ.

Ngoài ra, các bài kiểm tra bạn viết sẽ "bao gồm" mã của bạn; bạn sẽ có thể biết khi nào một thay đổi bạn thực hiện đối với mã phá vỡ điều gì đó, bởi vì một hoặc nhiều thử nghiệm hiện tại của bạn sẽ thất bại. Điều này làm giảm độ phức tạp chung của nỗ lực sửa lỗi của bạn và tăng sự tự tin của bạn rằng mã hoạt động.

Tất nhiên, điều hấp dẫn là thời gian gỡ lỗi của bạn giờ đã dành cho việc viết bài kiểm tra. Nhưng bạn chỉ phải viết chúng một lần và chúng có thể được thực thi nhiều lần nếu cần sau khi viết chúng.


+1 cho các thử nghiệm đơn vị - càng sớm trong quá trình phát triển, các lỗi được phát hiện càng rẻ và dễ sửa hơn.
Paul R

26

50% cho gỡ lỗi (theo nghĩa rộng) không phải là quá tệ. Mọi người thường dành nhiều thời gian hơn để thiết kế, kiểm tra, sửa lỗi, tái cấu trúc và viết các bài kiểm tra đơn vị so với việc bạn viết mã thực tế. Đó là một phần của công việc.

Và thành thật mà nói, nó tệ hơn nhiều trong lập trình bảo trì - khá thường xuyên, tôi đã dành một giờ để tìm ra chính xác những gì sai, sau đó năm phút viết mã để sửa nó, và sau đó nửa giờ để kiểm tra toàn bộ. Đó chỉ là hơn 5% mã hóa so với gần 95% không mã hóa.

Có một số điều bạn có thể làm để giảm thời gian gỡ lỗi:

  • Viết mã gỡ lỗi . Điều này có nghĩa là: xử lý lỗi thích hợp (với một số suy nghĩ được đưa vào), cấu trúc mã của bạn để dễ theo dõi, sử dụng các xác nhận, dấu vết và bất cứ điều gì khác có thể làm cho cuộc sống của trình gỡ lỗi dễ dàng hơn. Tránh các dòng phức tạp; một dòng làm nhiều hơn một thứ nên được tách ra để bạn bước qua chúng một cách riêng lẻ.
  • Viết mã kiểm tra . Chia mã của bạn thành các hàm đơn giản (hoặc bất cứ thứ gì khác mà ngôn ngữ bạn chọn hỗ trợ); tránh các tác dụng phụ, vì chúng khó có thể nắm bắt trong các bài kiểm tra đơn vị. Thiết kế các chức năng của bạn để chúng có thể được chạy một cách cô lập. Tránh các chức năng đa mục đích. Tránh các trường hợp cạnh. Tài liệu những gì chức năng của bạn phải làm.
  • Viết bài kiểm tra . Có các bài kiểm tra đơn vị có nghĩa là bạn biết rằng các chức năng của bạn hoạt động cho ít nhất một tập hợp con của đầu vào; điều đó cũng có nghĩa là bạn phải kiểm tra sự tỉnh táo để xác nhận những thay đổi của bạn không phá vỡ bất cứ điều gì. Hãy chắc chắn rằng bạn hiểu các khái niệm về phạm vi bảo hiểm mã và phạm vi bảo hiểm đầu vào, cũng như các hạn chế của kiểm tra đơn vị.
  • Thiết lập một 'bàn làm việc' . Làm thế nào chính xác bạn làm điều này phụ thuộc vào ngôn ngữ trong câu hỏi. Một số ngôn ngữ, như Python hoặc Haskell, đi kèm với trình thông dịch tương tác và bạn có thể tải mã hiện có của mình vào đó để chơi với nó. Điều này là hoàn hảo, vì bạn có thể gọi các chức năng của mình trong bất kỳ bối cảnh nào bạn muốn, với nỗ lực tối thiểu - một công cụ vô giá để tìm và cách ly các lỗi. Các ngôn ngữ khác không có sự xa xỉ này và bạn sẽ phải dùng đến việc viết các chương trình thử nghiệm tương tác nhỏ.
  • Viết mã có thể đọc được . Tạo thói quen viết mã của bạn để thể hiện ý định của bạn rõ ràng nhất có thể. Tài liệu mọi thứ không hoàn toàn rõ ràng.
  • Viết mã đơn giản . Nếu bộ não của bạn gặp khó khăn trong việc hiểu toàn bộ cơ sở mã, thì điều đó không đơn giản và rất khó có người khác có thể hiểu đầy đủ về nó. Bạn không thể gỡ lỗi mã một cách hiệu quả trừ khi bạn hiểu nó phải làm gì.
  • Hãy dễ dàng trên nút 'Xóa' . Bất kỳ mã nào bạn không cần ngay bây giờ đều thuộc về thùng rác. Nếu bạn cần nó sau này, hãy khôi phục nó từ kiểm soát nguồn (kinh nghiệm cho thấy điều này là cực kỳ hiếm). Bạn loại bỏ càng nhiều mã, bề mặt gỡ lỗi của bạn càng nhỏ.
  • Tái cấu trúc sớm và thường xuyên. Nếu không tái cấu trúc, bạn không thể giữ mã của mình ở trạng thái có thể sửa lỗi trong khi thêm các tính năng mới.

1
Ngoài ra thế giới có thể hành xử khác với bạn mong đợi trong trường hợp có vấn đề. Điều này có thể gây ra lỗi rất tinh tế.

2
+1. Tôi sẽ nói rằng chỉ chi 50% cho các nỗ lực gỡ lỗi là khá thấp, đặc biệt nhưng không chỉ trong một cơ sở mã được thiết lập. Nếu tôi được chỉ định một lỗi, trừ khi nó yêu cầu viết lại hoàn toàn các phần có liên quan của mã (không chắc), tôi có thể chi tiêu lớn hơn nhiều so với tổng thời gian đó để tìm ra lỗi sai, sau đó kiểm tra sửa lỗi. Bản thân việc sửa lỗi thường nhanh chóng, thường chỉ chiếm một hoặc một vài dòng mã đã thay đổi.
một CVn

@ ThorbjørnRavnAndersen Hell có, đặc biệt là với các dự án Web như OP đề cập. Chúng ta đang có khoảng thời gian tuyệt vời với bảng mã nhân vật trong tuần này tại nơi làm việc ...
Izkata

5

Thêm kế hoạch

Không thể tránh khỏi việc bạn sẽ dành nhiều thời gian để gỡ lỗi, 10% là một mục tiêu khá tham vọng. Mặc dù một trong những cách tốt nhất để giảm thời gian gỡ lỗi và phát triển là dành nhiều thời gian hơn trong giai đoạn lập kế hoạch.

Điều này có thể bao gồm từ sơ đồ, đến mã giả trên bảng kế hoạch. Dù bằng cách nào, bạn sẽ có nhiều thời gian hơn để suy nghĩ về kế hoạch thực hiện của mình thay vì mắc những sai lầm đó trong quá trình phát triển.


1
+1 vì đây là những gì tôi làm để giảm thời gian gỡ lỗi. Khi tôi bắt đầu một dự án mới, tôi viết ra tất cả những gì tôi sẽ làm trong các bình luận, sau đó quay lại và thay thế các bình luận bằng mã
CamelBlues

Tôi làm tương tự với các bình luận, hơn nữa để giữ cho tôi không quên nơi tôi rời đi. Nhưng tôi thích vẽ sơ đồ lớp trên giấy và các phụ thuộc của chúng. Điều này cho tôi cái nhìn sâu sắc về những gì tôi nghĩ lúc đó.
Bryan Harrington

5

Làm việc cẩn thận hơn

Đây là phần mềm tương đương với "số đo hai lần cắt một lần":

  • Đừng viết mã nếu bạn cảm thấy mất tập trung hoặc mệt mỏi.
  • Dành đủ thời gian suy nghĩ về vấn đề để bạn có một giải pháp sạch sẽ và thanh lịch. Các giải pháp đơn giản ít có khả năng có vấn đề.
  • Dành tất cả sự chú ý của bạn vào nhiệm vụ. Tiêu điểm.
  • Đọc mã của bạn một cách nhanh chóng sau khi mã hóa để thử và tìm kiếm sai lầm. Tự kiểm tra mã.
  • Đừng chờ đợi quá lâu giữa mã hóa và thử nghiệm. Phản hồi ngay lập tức là rất quan trọng để cải thiện.
  • Tránh làm những việc thường dẫn đến sai sót. Đọc trên mã mùi .
  • Chọn các công cụ phù hợp cho công việc.

Tất cả những gì đã nói, không có gì sẽ loại bỏ hoàn toàn khuyết điểm. Bạn cần chấp nhận điều này như một thực tế của cuộc sống. Đưa ra kế hoạch thực tế cho các khiếm khuyết, ví dụ kiểm tra đơn vị. Cũng đừng coi điều này có nghĩa là "mất mãi mãi" (hay còn gọi là phân tích-tê liệt). Đó là về việc tìm kiếm sự cân bằng.


4

Các câu trả lời khác đã bao gồm hầu hết những gì tôi muốn nói, nhưng tôi vẫn muốn đưa ra ý kiến ​​của bạn (trung thực một cách thô bạo):

Về cơ bản, đối với công việc phần mềm không tầm thường, hy vọng sẽ dành phần lớn thời gian của bạn cho việc bảo trì và gỡ lỗi. Nếu bạn đang làm việc trên một hệ thống phần mềm sản xuất hoàn thiện và bạn dành ít hơn 80-90% thời gian cho việc bảo trì và gỡ lỗi, thì bạn đang làm tốt!

Bây giờ rõ ràng, sự khác biệt giữa "bảo trì" và "gỡ lỗi" là một chút chủ quan. Bạn chỉ coi "lỗi" là vấn đề với mã được tìm thấy sau khi nó được phát hành và người dùng đã phàn nàn về chúng? Hoặc có phải mọi điều nhỏ nhặt đều xảy ra với mã của bạn sau khi bạn đã thêm một cái gì đó (được tìm thấy trong các giai đoạn thử nghiệm trước khi phát hành của riêng bạn)? Trong một hệ thống phần mềm không tầm thường (tùy thuộc vào các kiểu sử dụng), một cái có thể lớn hơn nhiều so với cái kia. Nhưng trong mọi trường hợp, đây là thứ lập trình bất cứ thứ gì lớn hơn chương trình "Hello world" đồ chơi đòi hỏi - rất nhiều bảo trì và gỡ lỗi. Một số người thậm chí còn nói một cái gì đó như " mọi thứ sau dòng mã đầu tiên nên được dự kiến ​​là 'chế độ bảo trì',

TL; DR: Nghe có vẻ đơn giản với tôi như bạn có thể có một bức tranh hơi phi thực tế về những gì lập trình hệ thống phần mềm không tầm thường. Phần lớn nỗ lực là trong việc hoàn thiện, bảo trì, tái cấu trúc, sửa lỗi và nói chung là làm những việc sẽ được "gỡ lỗi" (bảo trì) - ít nhất là theo một nghĩa rất chung - trái ngược với việc thực hiện công việc hoàn toàn mới, viết mã mới.


2

Thật khó để đưa ra các kỹ thuật cụ thể mà không có chi tiết cụ thể về những gì bạn đang làm và những công nghệ bạn đang sử dụng. Nhưng ngay cả các lập trình viên thực sự giỏi cũng dành rất nhiều thời gian để thử nghiệm và gỡ lỗi.

Rất nhiều viết mã tốt mà không có nhiều lỗi là kinh nghiệm. Bạn mắc lỗi, sau đó bạn sửa lỗi, sau đó bạn nhớ những lỗi đó là gì và thay vào đó bạn phải làm gì để sửa lỗi và bạn không mắc lỗi tương tự vào lần tới. Và nếu bạn thậm chí còn chưa học đại học và bạn đã bắt đầu suy nghĩ nghiêm túc về những cách để ít mắc lỗi hơn, tôi sẽ nói rằng bạn chắc chắn đi trước trò chơi.


1
Điều đó làm tôi ngạc nhiên về những người mà tôi thấy những người không học hỏi từ những sai lầm của họ (hoặc bận tâm để cố nhớ những gì họ đã học). Và ngay sau khi một cái gì đó nổ tung trên mặt họ theo một cách lớn, họ quay lại và làm điều tương tự chính xác trong dự án tiếp theo.
HLGEM

2

TÍCH HỢP LIÊN TỤC (CI) là câu trả lời.

Tích hợp liên tục = Hệ thống quản lý cấu hình (viz., Git, Mercurial, SVN, v.v.) + Công cụ CI + Kiểm tra đơn vị + Kiểm tra khói

Công thức đó sẽ thúc đẩy bạn đọc thêm về Tích hợp liên tục (CI). Dưới đây là một số tài nguyên trong lĩnh vực này:


1

Thực sự, để giảm gỡ lỗi, bạn có thể tải trước bằng cách lập kế hoạch sâu hơn. Bạn chưa học đại học? Tôi nghĩ rằng bạn sẽ thấy trong các lớp học từ giữa đến cuối đại học, bạn sẽ trình bày chi tiết về vòng đời phát triển phần mềm rất có thể sẽ làm sáng tỏ những kẻ theo dõi bạn.

Khi tôi cố gắng giải thích với các nhà tuyển dụng của mình, cách tốt nhất để giảm bảo trì mã và hỗ trợ kỹ thuật là dành thời gian để lên kế hoạch toàn diện cho mã của bạn trước.


1

Phát triển theo hướng kiểm tra có thể giúp giảm thời gian gỡ lỗi bằng cách:

  • có rất nhiều bài kiểm tra nhỏ, tập trung có nghĩa là nếu một lần thất bại thì chỉ có một lượng nhỏ mã có thể gây ra sự cố.
  • làm việc theo các bước nhỏ (bằng cách viết một bài kiểm tra thất bại và sau đó thực hiện) có nghĩa là bạn có thể tập trung vào một nhiệm vụ tại một thời điểm. Đó là, làm cho bài kiểm tra hiện tại đã qua.
  • tái cấu trúc sau khi bạn thực hiện một bài kiểm tra khuyến khích bạn giữ cho mã của bạn rõ ràng và dễ hiểu - giúp dễ theo dõi hơn nếu có vấn đề xảy ra.

Ngay cả khi bạn sử dụng TDD, bạn vẫn sẽ có lúc cần sử dụng trình gỡ lỗi. Khi điều này xảy ra, bạn nên thử viết một bài kiểm tra đơn vị để tái tạo kịch bản gây ra phiên gỡ lỗi. Điều này sẽ đảm bảo rằng nếu sự cố đó xảy ra lần nữa, nó sẽ nhanh chóng được xử lý khi thử nghiệm thất bại và thử nghiệm sẽ đóng vai trò là điểm đánh dấu cho khu vực mã gây ra sự cố - giảm nhu cầu gỡ lỗi.


1

Gỡ lỗi là không thể tránh khỏi trong lập trình, nhưng chìa khóa ở đây là, mã của bạn có dễ gỡ lỗi hay không? Nếu bạn cần dành hàng giờ chỉ để gỡ lỗi một cái gì đó đơn giản, thì phải có điều gì đó thực sự sai với kiến ​​trúc mã của bạn.

Bạn nên làm quen với việc viết mã sạch và loại bỏ các thói quen xấu như sao chép mã dán và viết các phương thức dài, v.v.

Bên cạnh, thỉnh thoảng bạn nên cấu trúc lại mã của mình. Tôi đề nghị bạn đọc cuốn sách của Martin Fowler: Tái cấu trúc: Cải thiện thiết kế của mã hiện tại


1

Những người khác đã đề cập đến thử nghiệm và xem xét mã. Cả hai đều cực kỳ hữu ích nhưng có một sự khác biệt chính - khi nào là tốt nhất để thực hiện chúng. Kiểm thử được thực hiện tốt nhất rất gần với việc viết mã ban đầu, vì vậy bạn có thể dễ dàng nhớ tại sao bạn đã làm mọi thứ theo một cách nhất định và có thể nhanh chóng xác định vấn đề hơn khi nó không thực hiện kiểm tra. Mặt khác, đánh giá mã được thực hiện tốt hơn một chút về sau. Bạn muốn xem mã mà không có hồi ức hoàn hảo để không bị che lấp những chi tiết mà bạn nhớ đã nghĩ đến nhưng không đưa vào. Bạn muốn nhận ra những nơi mà mã của bạn không rõ ràng. Bạn muốn có thêm một chút nỗ lực để tìm ra mã đang làm gì. Bạn muốn có thể áp dụng bất kỳ kiến ​​thức mới nào bạn có được về vấn đề hoặc tương tác với mã khác hoặc các kỹ thuật mới. Về cơ bản,

Tất cả điều này vẫn còn tiếp xúc với câu hỏi của bạn, mặc dù. Để dành ít thời gian gỡ lỗi hơn, bạn phải hiểu lý do tại sao bạn phải gỡ lỗi ngay từ đầu. Hiểu sai vấn đề, kiến ​​thức không hoàn hảo về các công cụ và công nghệ của bạn và chỉ đơn giản là chạy vào "dữ liệu thực không khớp với dữ liệu mẫu", tất cả sẽ xuất hiện theo những cách khác nhau và cần các kỹ thuật và loại thực hành khác nhau để tránh trong tương lai.

Điểm cuối cùng tôi sẽ làm là kinh nghiệm. Không có cách nào dễ dàng để có được điều này, bạn chỉ cần đặt thời gian. Khi bạn có được kinh nghiệm, bạn sẽ mất ít thời gian hơn để gỡ lỗi vì bạn sẽ viết mã tốt hơn để bắt đầu, thông báo các vấn đề sớm hơn và phát triển trực giác tốt hơn về nguồn gốc của vấn đề. Giữ nó và bạn sẽ phát triển này đều đặn trong sự nghiệp của bạn.


0

Những câu trả lời tuyệt vời ở trên nhưng không ai đề cập trực tiếp (mặc dù hầu hết gợi ý về điều này):

ĐỌC ĐỌC ĐỌC ĐỌC et tại nauseam ...

Bạn càng biết nhiều, bạn càng không biết. Một chút sáo rỗng, nhưng vẫn là sự thật cơ bản.

Một khi bạn đã làm theo các lời khuyên ở trên và phân tích tài liệu về các lỗi, hãy cố gắng phân loại chúng, và sau đó đọc các tài liệu thích hợp.

Đó có phải là một vấn đề quyết định thiết kế? Đọc lên các mẫu thiết kế.

Đó có phải là thiếu kiến ​​thức về khuôn khổ hoặc ngôn ngữ? Xương lên trên đó!

v.v.

Có hai điều mà một nhà phát triển (trực tiếp) không bao giờ có thể thoát ra: thay đổi (hằng số duy nhất trong CNTT) và RTFMing ...


0

Kiểm tra đơn vị và khẳng định

Nếu có thể, hãy tính mã của bạn thành các phần nhỏ có thể được kiểm tra một cách cô lập. Điều này không phải lúc nào cũng thực tế. Một số phần chức năng phụ thuộc vào đầu vào cực kỳ phức tạp. Một số làm một cái gì đó không thể dễ dàng được xác minh theo cách tự động, chẳng hạn như vẽ công cụ lên màn hình. Đôi khi không xác định có liên quan, vv

Khi bạn không thể viết bài kiểm tra đơn vị tốt, điều tốt nhất tiếp theo là khẳng định. Trong khi kiểm tra đơn vị kiểm tra xem bạn có nhận được câu trả lời đúng trên một số đầu vào được xác định trước hay không, các xác nhận kiểm tra sự tỉnh táo của các bước trung gian trên các đầu vào trong thế giới thực. Nếu mã của bạn có lỗi, nó sẽ thất bại nhanh chóng, gần với gốc rễ của vấn đề và với một thông báo lỗi rõ ràng, thay vì cách xa vấn đề với thông báo lỗi mơ hồ. Hơn nữa, khẳng định các giả định tài liệu và làm cho mã của bạn dễ đọc hơn.


0

Khi bạn bắt đầu một dự án, bạn xác định được bao nhiêu cách tiếp cận thay thế?

Bạn có từ hai đến bốn cách tiếp cận khác nhau, với ưu và nhược điểm cho từng phương pháp không? Sau đó, bạn có thực hiện một lựa chọn hợp lý trong số họ?

Sau đó, quan trọng nhất, bạn có trọng lượng đơn giản như rất quan trọng?

Lý do tôi hỏi là, theo kinh nghiệm của tôi, khối lượng mã, và do đó, số lượng lỗi (không đề cập đến hiệu suất), có thể thay đổi nhiều hơn một thứ tự cường độ giữa phương pháp thiết kế này và phương pháp khác. Những gì tôi thấy những người có kinh nghiệm cao đang làm là hoàn thành công việc mà không cần nhiều mã hơn mức cần thiết.

Họ hoàn toàn có thẩm quyền và nhận thức được tất cả các thuật toán cấu trúc dữ liệu, tính năng của các ngôn ngữ hướng đối tượng, v.v., nhưng mã của họ trông như không , bởi vì họ sử dụng những thứ đó một cách tiết kiệm , hoặc không phải, nếu vấn đề xảy ra không yêu cầu họ.


0

Mỗi lần bạn sửa một lỗi, bạn muốn tránh mắc lại lỗi tương tự. Để làm như vậy, bạn có thể làm như sau:

  • Viết nó xuống trong một bản ghi ghi lỗi , bao gồm:

    • loại khiếm khuyết
    • giai đoạn mà khiếm khuyết đã được tiêm
    • giai đoạn mà nó đã được gỡ bỏ
    • thời gian sửa chữa
    • mô tả sự cố và khắc phục
  • Thông qua một styleguide để bình thường hóa phong cách mã bạn viết

  • Tích hợp các quy tắc mã hóa an toàn vào quy trình xem xét mã của bạn

  • Trực quan hóa luồng điều khiểndữ liệu

Tài liệu tham khảo

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.