Saya membaca blog ini oleh Joel Spolsky tentang 12 langkah menuju kode yang lebih baik . Tidak adanya Pengembangan Berbasis Tes sangat mengejutkan saya. Jadi saya ingin mengajukan pertanyaan kepada para Guru. Apakah TDD tidak sepadan dengan usaha?
Saya membaca blog ini oleh Joel Spolsky tentang 12 langkah menuju kode yang lebih baik . Tidak adanya Pengembangan Berbasis Tes sangat mengejutkan saya. Jadi saya ingin mengajukan pertanyaan kepada para Guru. Apakah TDD tidak sepadan dengan usaha?
Jawaban:
Perkembangan yang didorong oleh tes hampir tidak dikenal sebelum buku Kent Beck keluar pada tahun 2002, dua tahun setelah Joel menulis posting itu. Pertanyaannya kemudian menjadi mengapa Joel belum memperbarui tesnya, atau jika TDD lebih dikenal pada tahun 2000 akankah ia memasukkannya ke dalam kriteria?
Saya percaya dia tidak akan memiliki, karena alasan sederhana bahwa yang penting adalah Anda memiliki proses yang terdefinisi dengan baik, bukan detail spesifik dari proses itu. Itu alasan yang sama ia merekomendasikan kontrol versi tanpa menentukan sistem kontrol versi tertentu, atau merekomendasikan memiliki database bug tanpa merekomendasikan merek tertentu. Tim yang baik terus meningkatkan dan beradaptasi, dan menggunakan alat dan proses yang cocok untuk situasi khusus mereka pada waktu tertentu. Untuk beberapa tim, itu pasti berarti TDD. Untuk tim lain, tidak banyak. Jika Anda mengadopsi TDD, pastikan itu bukan dari mentalitas kultus kargo .
Joel sebenarnya telah membahas hal ini secara khusus di beberapa tempat.
Dia menjelaskan bahwa tes hal-hal tidak mampu menangkap banyak masalah penting, terutama yang subjektif seperti "apakah antarmuka pengguna perangkat lunak ini payah?" Menurutnya, ketergantungan yang berlebihan pada tes otomatis di Microsoft adalah bagaimana kami berakhir dengan Windows Vista.
Dia menulis bagaimana, dalam pengalamannya, jenis bug yang ditemukan pengguna cenderung terbagi dalam dua kategori: 1) bug yang muncul dalam penggunaan umum, yang akan ditemukan oleh para programmer jika mereka menjalankan kode mereka sendiri sebelum menggunakannya. , atau 2) tepi case sangat tidak jelas sehingga tidak ada yang akan berpikir untuk menulis tes untuk menutupi mereka di tempat pertama. Dia menyatakan bahwa hanya sebagian kecil dari bug yang dia dan timnya perbaiki di FogBugz adalah hal-hal yang akan ditangkap oleh unit test. (Saya tidak dapat menemukan artikel itu sekarang, tetapi jika ada yang tahu yang saya maksud, jangan ragu untuk mengedit tautan di sini.)
Dan dia menulis bagaimana ini bisa lebih merepotkan daripada nilainya, terutama ketika proyek Anda tumbuh menjadi proyek yang sangat besar dengan banyak tes unit, dan kemudian Anda mengubah sesuatu (secara sengaja) dan berakhir dengan sejumlah besar tes unit yang rusak. Dia secara khusus menggunakan masalah-masalah yang dapat ditimbulkan oleh pengujian unit sebagai alasan mengapa dia tidak menambahkannya sebagai poin ke-13 pada Tes Joel, bahkan ketika orang-orang menyarankan bahwa dia harus melakukannya.
Joel Spolsky sendiri menjawab pertanyaan ini pada tahun 2009 :
Joel: Ada perdebatan tentang Pengembangan Didorong Test ... jika Anda memiliki unit test untuk semuanya, hal-hal semacam itu ... banyak orang menulis kepada saya, setelah membaca The Joel Test, untuk mengatakan, "Anda harus memiliki yang ke-13 satu hal di sini: Unit Testing, 100% unit test semua kode Anda. "
Dan itu menurut saya sedikit terlalu doktriner tentang sesuatu yang mungkin tidak Anda butuhkan. Seperti, seluruh ide pemrograman cerdas bukan untuk melakukan hal-hal sebelum Anda membutuhkannya, tetapi untuk kesalahan halaman sesuai kebutuhan. Saya merasa seperti pengujian otomatis atas segalanya, sering kali, tidak akan membantu Anda. Dengan kata lain, Anda akan menulis banyak sekali unit test untuk memastikan kode itu, benar-benar, akan berfungsi, dan Anda pasti akan mencari tahu apakah itu tidak berhasil [jika Anda tidak menulis tes] tidak, sebenarnya masih bekerja, ... Saya tidak tahu, saya akan mendapatkan mail api seperti ini karena saya tidak mengekspresikannya dengan baik. Tapi, saya merasa jika sebuah tim benar-benar memiliki cakupan kode 100% dari tes unit mereka, akan ada beberapa masalah. Satu, mereka akan menghabiskan banyak waktu untuk menulis tes unit, dan mereka tidak perlu membayar untuk waktu itu dalam kualitas yang lebih baik. Maksud saya, mereka akan memiliki beberapa peningkatan kualitas, dan mereka akan memiliki kemampuan untuk mengubah hal-hal dalam kode mereka dengan keyakinan bahwa mereka tidak merusak apa pun, tetapi hanya itu.
Tetapi masalah sebenarnya dengan tes unit seperti yang saya temukan adalah bahwa jenis perubahan yang cenderung Anda buat ketika kode berevolusi cenderung memecah persentase konstan dari tes unit Anda. Kadang-kadang Anda akan membuat perubahan pada kode Anda yang, entah bagaimana, merusak 10% dari tes unit Anda. Sengaja. Karena Anda telah mengubah desain sesuatu ... Anda telah memindahkan menu, dan sekarang semua yang bergantung pada menu itu ada di sana ... menunya ada di tempat lain. Jadi semua tes itu sekarang rusak. Dan Anda harus bisa masuk dan membuat ulang tes-tes itu untuk mencerminkan realitas baru kode.
Jadi, hasil akhirnya adalah, ketika proyek Anda semakin besar dan lebih besar, jika Anda benar-benar memiliki banyak unit test, jumlah investasi yang harus Anda lakukan dalam mempertahankan unit test tersebut, menjaga mereka tetap up-to-date dan menjaga mereka lewat, mulai menjadi tidak proporsional dengan jumlah manfaat yang Anda dapatkan dari mereka.
Tidak seorang pun kecuali Joel yang bisa menjawabnya dengan pasti. Tetapi kita dapat mencoba beberapa alasan / pengamatan.
Pertama-tama, pengujian tidak absen dari Tes Joel
Kedua, seluruh gagasan Tes Joel (seperti yang saya mengerti) adalah untuk memiliki pertanyaan cepat, ya-tidak. "Apakah kamu melakukan TDD?" tidak akan persis cocok (jawabannya bisa: "sebagian dari kita", "untuk bagian kode" atau "kami melakukan pengujian unit".
Ketiga, saya pikir tidak ada yang mengatakan bahwa (bahkan Joel) bahwa titik-titik di mana "satu-satunya yang bernilai waktu" (omong-omong, "apakah Anda memprogram" tidak ada di sana), hanya saja itu adalah pertanyaan cepat yang bagus untuk ditanyakan ketika datang berhubungan dengan tim perangkat lunak, baik sebagai anggota tim di masa depan atau bahkan sebagai pelanggan - ini adalah daftar yang saya berikan kepada beberapa orang non teknis di sekitar saya yang mencari petunjuk tentang seberapa baik / buruk departemen TI mereka sendiri. Ini bukan segalanya, tetapi sangat buruk untuk mengalahkan dalam tiga menit.