Tại sao phát triển theo hướng thử nghiệm bị thiếu trong Thử nghiệm của Joel?


23

Tôi đã đọc blog này của Joel Spolsky khoảng 12 bước để viết mã tốt hơn . Sự vắng mặt của Test Driven Development thực sự làm tôi ngạc nhiên. Vì vậy, tôi muốn ném câu hỏi cho Gurus. Là TDD không thực sự xứng đáng với nỗ lực?


13
Bài báo đó được viết vào thứ Tư, ngày 09 tháng 8 năm 2000 (khoảng 12 năm trước). Không phải là TDD không xuất hiện vào thời điểm đó nhưng tôi không tin rằng nó rất thích sự ồn ào như hiện nay.
Mike

12
Bài kiểm tra Joel chỉ là một bộ hướng dẫn chung. Không phải tất cả mọi thứ "đáng nỗ lực" có thể phù hợp ở đó.
yannis

2
' Tôi đã đưa ra bài kiểm tra cẩu thả, vô trách nhiệm của riêng mình để đánh giá chất lượng của một nhóm phần mềm. Điều tuyệt vời ở đây là mất khoảng 3 phút ... Điều thú vị về Bài kiểm tra Joel là thật dễ dàng để có nhanh chóng có hoặc không cho mỗi câu hỏi. Bạn không cần phải tìm ra các dòng mã mỗi ngày hoặc lỗi trung bình mỗi điểm uốn ... ' - quyết định xem dự án của bạn sẽ có lợi gì cho TDD sẽ mất hơn 3 phút và, tốt , có thể yêu cầu tính điểm trung bình-lỗi trên mỗi điểm uốn - đó là lý do tại sao nó không có trong danh sách
gnat

Di chuyển đến Joel Stack plz. Đó là một q thú vị.
Erik Reppen

Bạn nên cân nhắc việc chấp nhận câu trả lời liên kết và trích dẫn trực tiếp từ Joel, vì nó không có thẩm quyền nào hơn thế. Xem lập trình
Bryan Oakley

Câu trả lời:


30

Phát triển theo hướng thử nghiệm hầu như không được biết đến trước khi cuốn sách của Kent Beck ra mắt vào năm 2002, hai năm sau khi Joel viết bài đăng đó. Câu hỏi sau đó trở thành lý do tại sao Joel không cập nhật bài kiểm tra của mình, hoặc nếu TDD được biết đến nhiều hơn vào năm 2000, liệu anh ta có đưa nó vào tiêu chí của mình không?

Tôi tin rằng anh ta sẽ không có, vì lý do đơn giản rằng điều quan trọng là bạn có một quy trình được xác định rõ ràng, chứ không phải các chi tiết cụ thể của quy trình đó. Đó là lý do tương tự, ông khuyến nghị kiểm soát phiên bản mà không chỉ định hệ thống kiểm soát phiên bản cụ thể hoặc khuyên bạn nên có cơ sở dữ liệu lỗi mà không đề xuất một thương hiệu cụ thể. Các nhóm tốt liên tục cải thiện và thích nghi, và sử dụng các công cụ và quy trình phù hợp với tình huống cụ thể của họ tại thời điểm cụ thể đó. Đối với một số đội, điều đó chắc chắn có nghĩa là TDD. Đối với các đội khác, không quá nhiều. Nếu bạn chấp nhận TDD, hãy chắc chắn rằng nó không nằm ngoài tâm lý sùng bái hàng hóa .


1
Ngoài ra ... oh bạn phần nào đạt TDD là điểm Kool Aid phải không?
Erik Reppen


27

Joel đã thực sự giải quyết điều này cụ thể ở một vài nơi.

Ông giải thích rằng các bài kiểm tra không có khả năng nắm bắt được nhiều vấn đề quan trọng, đặc biệt là những vấn đề chủ quan như "giao diện người dùng của phần mềm này có hút không?" Theo ông, việc phụ thuộc quá nhiều vào các bài kiểm tra tự động tại Microsoft là cách chúng tôi kết thúc với Windows Vista.

Theo kinh nghiệm của anh ấy, anh ấy đã viết như thế nào, các loại lỗi mà người dùng thực sự tìm thấy có xu hướng rơi vào hai loại: 1) loại lỗi xuất hiện trong cách sử dụng phổ biến, mà các lập trình viên sẽ thấy rằng họ tự chạy mã của mình trước khi sử dụng hoặc 2) các trường hợp cạnh khó hiểu đến mức không ai có thể nghĩ sẽ viết các bài kiểm tra để che chúng ngay từ đầu. Anh ta tuyên bố rằng chỉ có một tỷ lệ rất nhỏ các lỗi mà anh ta và nhóm của anh ta sửa trong FogBugz là loại điều mà thử nghiệm đơn vị sẽ mắc phải. (Tôi không thể tìm thấy bài viết đó ngay bây giờ, nhưng nếu có ai biết ý tôi là gì, vui lòng chỉnh sửa liên kết vào đây.)

Và anh ấy đã viết làm thế nào nó có thể rắc rối hơn giá trị của nó, đặc biệt là khi dự án của bạn phát triển thành một dự án rất lớn với nhiều bài kiểm tra đơn vị, và sau đó bạn thay đổi một cái gì đó (cố ý) và kết thúc với một số lượng lớn các bài kiểm tra đơn vị bị hỏng. Anh ta đặc biệt sử dụng các vấn đề mà kiểm tra đơn vị có thể gây ra là lý do tại sao anh ta không thêm nó vào điểm thứ 13 trong Thử nghiệm Joel, ngay cả khi mọi người đề nghị rằng anh ta nên làm.


2
Thật ra, bạn đã đúng. MO thông thường của Joel là người rơm. Giống như TDD sẽ không bắt được bất kỳ lỗi nào đối với tôi, vì vậy nó không thể tốt được. Điều mà phần nào bỏ lỡ quan điểm rằng TDD không phải là về thử nghiệm, đó là về thiết kế. Các bài kiểm tra còn lại là một phần thưởng. Hoặc để tranh luận rằng một thay đổi nhỏ sẽ phá vỡ nhiều bài kiểm tra đơn vị, điều đó cho thấy anh ta chỉ làm sai. Hoặc để viết lại hoàn toàn một nguyên tắc RẮN trước khi tấn công nó. Đó là một cách nghĩ. Đó thực sự là những người đề xướng anh ta sử dụng logic tròn chứ không phải anh ta.
pdr

7
Tôi hoàn toàn đồng ý với những bình luận này của Joel's. Tôi nghĩ một vấn đề thậm chí còn lớn hơn là ngôn ngữ - với nhiều ngôn ngữ động mà tôi không thể tưởng tượng được khi làm bất cứ điều gì mà không có bài kiểm tra đơn vị - làm thế nào bạn có thể biết nếu một lỗi đánh máy đơn giản sẽ gây ra một số vấn đề mà bạn sẽ không gặp phải cho đến khi nghiêm trọng chốc lát? Trong các kiểu gõ tĩnh, các ngôn ngữ được biên dịch được thiết kế để giảm lỗi bạn được hướng dẫn khỏi tất cả các lỗi đơn giản nhất và hầu hết bị lỗi logic. Điều này giúp giảm nhu cầu về loại bảo hiểm đầy đủ do TDD cung cấp.
Bill K

2
@MasonWheeler: Bạn đang tranh luận nghiêm túc rằng trình biên dịch- / type-safe loại bỏ sự cần thiết của các bài kiểm tra đơn vị? Bạn cũng cố tình bỏ qua các lợi ích thiết kế của TDD, nhưng quan trọng hơn, bạn phải có một thời gian tái cấu trúc bất cứ điều gì. Thay vào đó, điều ngược lại đã được nhìn thấy là đúng: ví dụ: các nhà phát triển .NET theo phương pháp TDD đột nhiên thấy thất vọng bởi số lượng mã họ cần viết để làm hài lòng trình biên dịch ngày càng không có ích.
pdr

2
@pdr: Tôi nghiêm túc lập luận rằng "nhu cầu kiểm tra đơn vị" ngay từ đầu là thiếu an toàn loại. Và, không phải là một nhà phát triển .NET, tôi thực sự không thể nói nhiều về trải nghiệm của họ, nhưng theo kinh nghiệm của riêng tôi, tôi thấy rằng khó khăn trong việc tái cấu trúc hoàn toàn dựa trên hai yếu tố: tôi có viết mã đầu tiên hay không nơi, và liệu tác giả có viết mã tốt hay không. (Lưu ý: điểm 1 và 2 không nhất thiết phải tương quan mạnh với nhau!)
Mason Wheeler

3
@Pdr Các bài kiểm tra đơn vị không chứng minh mã của bạn, chúng chủ yếu là trình kiểm tra cú pháp, nhưng có thể rất hữu ích trong quá trình phát triển. Tích hợp và kiểm tra hệ thống có ý nghĩa hơn rất nhiều mặc dù. Ngoài ra, hầu hết các phép tái cấu trúc trong các ngôn ngữ được nhập tĩnh có thể được chứng minh là an toàn, trên thực tế đó là phép tái cấu trúc - một tập hợp các hoạt động "An toàn" đã biết để chuyển đổi mã của bạn mà không đưa ra các thay đổi. Trong ngôn ngữ tĩnh, IDE thường có thể thực hiện những thay đổi này cho bạn và đảm bảo rằng chúng an toàn, một điều thường không thể thực hiện được trong các ngôn ngữ động do đó yêu cầu kiểm tra đơn vị để hỗ trợ (không chứng minh) sự an toàn tương tự
Bill K

25

Joel Spolsky đã trả lời câu hỏi này vào năm 2009 :

Joel: Có một cuộc tranh luận về Phát triển dựa trên thử nghiệm ... bạn có nên thử nghiệm đơn vị cho tất cả mọi thứ, loại công cụ đó ... rất nhiều người viết thư cho tôi, sau khi đọc Thử nghiệm Joel, để nói, "Bạn nên có một ngày 13 điều ở đây: Kiểm tra đơn vị, kiểm tra đơn vị 100% tất cả mã của bạn. "

Và điều đó gây ấn tượng với tôi khi chỉ là một học thuyết hơi quá về một thứ mà bạn có thể không cần. Giống như, toàn bộ ý tưởng về lập trình nhanh không phải là làm những việc trước khi bạn cần, mà là lỗi trang khi cần thiết. Tôi cảm thấy như tự động kiểm tra mọi thứ, rất nhiều lần, sẽ không giúp bạn. Nói cách khác, bạn sẽ viết rất nhiều bài kiểm tra đơn vị để đảm bảo rằng mã đó thực sự sẽ hoạt động và bạn chắc chắn sẽ tìm hiểu xem nó có hoạt động không [nếu bạn không viết các bài kiểm tra], thực tế vẫn còn hoạt động, ... Tôi không biết, tôi sẽ nhận được thư lửa như vậy vì tôi không thể hiện nó tốt. Nhưng, tôi cảm thấy nếu một đội thực sự có phạm vi bảo hiểm 100% mã cho các bài kiểm tra đơn vị của họ, sẽ có một vài vấn đề. Một, họ đã dành rất nhiều thời gian để viết bài kiểm tra đơn vị, và họ không nhất thiết có thể trả tiền cho thời gian đó với chất lượng được cải thiện. Ý tôi là, họ có một số chất lượng được cải thiện và họ có khả năng thay đổi mọi thứ trong mã của họ với sự tự tin rằng họ không phá vỡ bất cứ điều gì, nhưng đó là điều đó.

Nhưng vấn đề thực sự với các bài kiểm tra đơn vị như tôi đã khám phá là loại thay đổi mà bạn có xu hướng thực hiện khi mã phát triển có xu hướng phá vỡ một tỷ lệ phần trăm không đổi trong các bài kiểm tra đơn vị của bạn. Đôi khi bạn sẽ thực hiện thay đổi mã của mình, bằng cách nào đó, phá vỡ 10% bài kiểm tra đơn vị của bạn. Cố ý. Bởi vì bạn đã thay đổi thiết kế của một cái gì đó ... bạn đã chuyển một menu, và bây giờ mọi thứ dựa trên menu đó đang ở đó ... menu bây giờ ở nơi khác. Và vì vậy tất cả những bài kiểm tra bây giờ phá vỡ. Và bạn phải có khả năng đi vào và tạo lại các thử nghiệm đó để phản ánh thực tế mới của mã.

Vì vậy, kết quả cuối cùng là, khi dự án của bạn ngày càng lớn hơn, nếu bạn thực sự có nhiều bài kiểm tra đơn vị, số tiền đầu tư bạn sẽ phải thực hiện để duy trì các bài kiểm tra đơn vị đó, giữ cho chúng cập nhật và giữ họ đi qua, bắt đầu trở nên không cân xứng với số tiền mà bạn nhận được từ họ.


2
Có thật không? Downvote về việc đăng câu trả lời của Joel cho câu hỏi của OP?
Ross Patterson

1
Khó tính. Một số người sử dụng phiếu bầu có nghĩa là "Tôi chấp thuận" thay vì "điều này hữu ích". Đây rõ ràng là câu trả lời được chấp nhận vì nó dứt khoát.
Bryan Oakley

Tôi chưa bao giờ làm việc trên một dự án có phạm vi kiểm tra 100%. Nhưng nếu bạn có phạm vi kiểm tra 0% ... ... điều đó thật tuyệt vời.
Kzqai

Cảm ơn bạn! Tôi nghĩ rằng điều này nên được đánh dấu là câu trả lời được chấp nhận.
Jalal

5

Không ai ngoài Joel có thể trả lời chắc chắn. Nhưng chúng ta có thể thử một số lý do / quan sát.

Trước hết, thử nghiệm không vắng mặt trong Thử nghiệm của Joel

  • Các xét nghiệm được đề cập hai lần trong 12 bước trực tiếp (10 và 12)
  • Sự tồn tại của một bản dựng là một trong những điểm đầu tiên. Ý tưởng của việc xây dựng là để có được khả năng xem liệu chúng có bị hỏng hay không, vì vậy chúng tôi (cũng) đang nói về việc thử nghiệm ở đây.

Thứ hai, toàn bộ ý tưởng của Thử nghiệm Joel (theo tôi hiểu) là có câu hỏi nhanh, có - không. "Bạn có làm TDD không?" sẽ không chính xác phù hợp (câu trả lời có thể là: "một số người trong chúng tôi", "cho phần đó của mã" hoặc "chúng tôi thực hiện kiểm tra đơn vị".

Thứ ba, tôi nghĩ không ai nói rằng (kể cả Joel) rằng những điểm mà "người duy nhất đáng giá thời gian" (nhân tiện, "bạn có lập trình" không ở trên đó không), chỉ là đó là những câu hỏi nhanh để hỏi khi đến tiếp xúc với một nhóm phần mềm, dù là thành viên nhóm tương lai hay thậm chí là khách hàng - đây là danh sách tôi đã đưa cho một số người không có kỹ thuật xung quanh tôi đang tìm kiếm manh mối về việc bộ phận CNTT của họ tốt / xấu như thế nào. Nó không phải là tất cả, nhưng nó thực sự tồi tệ để đánh bại trong ba phút.


3
"Bạn có làm TDD không?" chắc chắn phù hợp như một câu hỏi có - không. Và ý tôi là đó là một câu hỏi mà mọi người đều trả lời với câu "có", điều đó thực sự có nghĩa là "không".
yannis

2
@YannisRizos: Giống như "Bạn có sử dụng công cụ tốt nhất mà tiền có thể mua không?" (Vâng ... cũng sẽ ... trong lý do.) Và "Các lập trình viên có điều kiện làm việc yên tĩnh không?" (Ohhhh vâng ... wellllll ... phụ thuộc vào điểm tham chiếu cho yên tĩnh, tôi đoán.)
Lào

@pdr Phụ thuộc vào việc bạn có xem xét tiếng còi báo động phát ra từ cửa sổ mở không.
Robert Harvey

Ngoài ra, "Có, tôi làm thiết kế từ trên xuống ." ;)
Izkata
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.