Mọi người nói rằng "nói về TDD hầu như không hoạt động, nếu bạn muốn thuyết phục ai đó về TDD, hãy cho họ thấy kết quả". Tuy nhiên, tôi đã nhận được kết quả tuyệt vời mà không cần TDD. Cho tôi thấy rằng những người sử dụng TDD có kết quả tốt sẽ không thuyết phục, tôi muốn thấy rằng những người viết cả TDD và không TDD đều có kết quả tốt hơn với TDD.
Bất chấp tất cả những điều này, tôi muốn thử TDD. Tuy nhiên tôi không tin rằng tôi sẽ đạt được bất cứ điều gì từ điều này. Nếu nó hữu ích, tôi sẽ cố gắng đẩy nó về phần còn lại của đội mình.
Câu hỏi chính của tôi là: TDD sẽ phục vụ bất kỳ mục đích nào cho mã, nếu tôi đã có thể chứng minh tính chính xác của mã?
Rõ ràng, không ai là viên đạn bạc. Bằng chứng của bạn có thể sai vì bạn đã bỏ lỡ một chi tiết và bài kiểm tra của bạn có thể không phát hiện ra lỗi mà bạn không kiểm tra được. Cuối cùng, chúng ta là con người, không ai có thể tạo mã miễn phí 100% mãi mãi. Chúng tôi chỉ có thể phấn đấu để đến gần nhất có thể.
Tuy nhiên, TDD có thực sự tiết kiệm bất kỳ thời gian nào đối với mã đã được chứng minh tính đúng đắn của nó không? tức là mã, trong máy trạng thái mà mã hoạt động, tất cả các trạng thái có thể hợp lệ và phạm vi của chúng được nhà phát triển nhận ra, tất cả đều được tính và mã được thiết kế theo kiểu kiểm tra lỗi theo danh sách trắng vượt qua mọi ngoại lệ một trình xử lý phía trên để đảm bảo không có bất kỳ rò rỉ bất ngờ nào -> mà không hiển thị cả thông báo có liên quan (trong lý do-) cho khách hàng và gửi thông báo nhật ký cho quản trị viên.
Câu trả lời với các ví dụ thực tế sẽ tốt hơn.
Một số làm rõ:
Câu hỏi này không phải là về việc bạn có thể chứng minh tính chính xác của mã hay không. Theo mặc định, giả sử rằng không phải tất cả các mã đều có thể được chứng minh là đúng trong khung thời gian hợp lý, nhưng một số đoạn mã có thể được. Ví dụ, rất dễ chứng minh tính đúng đắn của mô-đun FizzBuzz. Không dễ dàng cho một dịch vụ đồng bộ hóa dữ liệu dựa trên đám mây.
Trong giới hạn này, câu hỏi đặt ra như sau: Bắt đầu với giả định rằng một cơ sở mã được chia thành 2 phần: [I] các phần đã được chứng minh là đúng [II] các phần chưa được chứng minh là đúng, nhưng được kiểm tra thủ công để hoạt động.
Tôi muốn áp dụng các thực tiễn TDD cho cơ sở mã này mà không có chúng cho đến bây giờ. Câu hỏi đặt ra như sau: TDD có nên được áp dụng cho mọi mô-đun không, hoặc liệu có đủ để áp dụng chúng cho chỉ các mô-đun không được chứng minh là đúng?
"Đã được chứng minh chính xác" có nghĩa là bạn có thể xem mô-đun này hoàn toàn theo kiểu chức năng, nghĩa là nó không dựa vào bất kỳ trạng thái toàn cầu hoặc bên ngoài nào bên ngoài và hoàn toàn có API riêng cho I / O mà các mô-đun khác tương tác với nó phải tuân theo . Không thể "phá vỡ mô-đun này" bằng cách thay đổi mã bên ngoài mô-đun, tệ nhất là bạn có thể sử dụng sai và nhận các thông báo lỗi được định dạng trả lại cho bạn.
Rõ ràng, mọi quy tắc đều có ngoại lệ, lỗi trình biên dịch trong các phiên bản trình biên dịch mới có thể đưa ra lỗi cho mô-đun này, nhưng các lỗi tương tự có thể được đưa vào các thử nghiệm đã kiểm tra nó và dẫn đến cảm giác an toàn sai từ các thử nghiệm không còn hoạt động như dự định. Điểm mấu chốt là các thử nghiệm không phải là một giải pháp kỳ diệu, chúng là một lớp bảo vệ khác và câu hỏi này thảo luận về vấn đề liệu lớp bảo vệ này có xứng đáng với nỗ lực trong trường hợp cụ thể của một mô-đun đã được chứng minh là đúng hay không (giả sử rằng nó đã thực sự).