Saya baru saja membaca tautan artikel yang Anda posting, saya harus mengatakan Fowler telah membuat beberapa poin yang sangat bagus dan banyak hal yang dia katakan, saya telah melakukan advokasi dengan tim kami selama bertahun-tahun.
IMO, jika Anda melakukan desain yang layak, Anda tidak boleh masuk ke dalam situasi buntu. Saya selalu melihat perangkat lunak sebagai bagian dari blok bangunan . Saya masih percaya pada beberapa desain di muka, tetapi tujuan utamanya bukan untuk merancang seluruh produk, tetapi untuk memberikan arsitektur / arah secara keseluruhan sehingga tim Anda dapat memvisualisasikan gambaran umum yang sedang kita semua kerjakan. Jika Anda memiliki banyak potongan kubus dan segitiga, akan sangat membantu untuk menggambarkan bagaimana sebuah kastil akan disatukan sebelum Anda mulai menampar potongan-potongan bersama.
Karena saya berasal dari tanah OO, bagi saya setiap blok adalah kelas dan area permukaan blok itu adalah antarmuka publik (apa yang terlihat oleh kelas eksternal atau berasal). Jika Anda mengikuti prinsip SOLID yang baik, Anda akan memastikan bahwa setiap blok sangat sederhana dan memiliki antarmuka publik yang intuitif. Kembali ke analogi saya, Anda ingin memastikan kode Anda hanya membuat bentuk sederhana. Setiap kali Anda membuat kelas, yang terlalu kompleks (banyak fungsi, banyak variabel), Anda membuat bentuk yang sulit untuk digunakan kembali ketika persyaratan berubah.
Saya setuju dengan Fowler bahwa risiko / tantangan terbesar untuk desain evolusi adalah bahwa Anda membiarkan keputusan desain sesuai waktu pengkodean, dan Anda mengharapkan setiap pengembang individu untuk membuat keputusan itu. Di sinilah sistem dapat rusak jika Anda tidak memiliki mekanisme umpan balik yang tepat. Setiap kali fitur baru diminta, sangat menggoda untuk hanya menemukan fungsi yang perlu diperluas, meletakkan beberapa jenis kondisional di dalamnya dan hanya menambahkan sejumlah besar kode tepat di dalam fungsi itu. Dan kadang-kadang, ini mungkin yang dibutuhkan, tetapi ini juga (IMO) satu-satunya praktik paling umum yang mengarah pada komponen buntu. Ini tidak ada hubungannya dengan desain evolusi. Inilah yang disebut "tanpa desain".
Selama Anda meluangkan waktu untuk mundur dan berkata, tunggu sebentar, kelas ini sudah memiliki 15 variabel anggota, izinkan saya mengekstrak 6 dari ini dan dimasukkan ke dalam kelas mandiri mereka sendiri, perangkat lunak Anda akan terdiri dari sangat ringan - blok bangunan yang ringan, fleksibel dan dapat digunakan kembali. Tentu jika PM datang dan mengubah setengah persyaratan produk pada Anda, Anda mungkin harus mengambil beberapa blok Anda, meletakkannya kembali di rak dan menyusun beberapa yang baru (seperti ketika membangun sebuah kastil, Anda mungkin tidak menggunakan semua silinder Anda). Tetapi pada saat itu, itu hanya bagian dari berbisnis. Persyaratan diubah dan dengan menjaga kode Anda fleksibel dan modular, Anda harus dapat mengubah produk agar selaras dengan arah bisnis baru Anda.
Saya percaya pendekatan evolusi ini untuk desain bekerja dengan setiap tingkat keahlian insinyur. Secara pribadi, saya telah melakukan perangkat lunak untuk waktu yang sangat lama dan sebelum tim kami pindah ke metodologi tangkas, saya bertanggung jawab untuk pengiriman beberapa komponen utama dari PC dev saya hampir langsung ke pelanggan dengan hampir tidak ada QA. Pada saat yang sama komponen-komponen itu selalu tetap fleksibel dan dapat dipelihara.
Saya hanya mencoba mengatakan bahwa saya akan menganggap diri saya relatif layak dalam merancang perangkat lunak. Pada saat yang sama, jika Anda meminta saya untuk menulis dokumen desain 100 halaman, memberikannya kepada seorang pembuat kode dan berharap itu berfungsi, saya mungkin tidak bisa mendesain diri dari kantong kertas. Ketika mulai bekerja, kadang-kadang saya membuat sketsa beberapa diagram UML (sangat disederhanakan, bukan bahasa lengkap), tetapi ketika saya mulai coding, saya akan melakukan refactor sesuai kebutuhan dan kode terakhir saya tidak akan pernah terlihat seperti apa yang saya gambar sebelumnya. Bahkan jika saya menghabiskan satu atau dua bulan memikirkan setiap detail kecil, saya tidak dapat membayangkan orang lain dapat mengambil diagram saya dan menghasilkan perangkat lunak yang solid tanpa memodifikasi desain saat mereka sedang mengkode.
Di ujung lain spektrum, saat ini di tim saya (sekarang gesit dan saya sepenuhnya mendukung itu) kami memiliki beberapa orang yang bergabung dengan kami dari tanah tertanam di mana mereka hanya melakukan C selama 15 tahun terakhir. Saya jelas membantu dengan beberapa perencanaan awal dan menyusun kelas, tetapi saya juga memastikan untuk menindaklanjuti dengan ulasan kode reguler dan sesi brainstorming di mana kami membahas aplikasi prinsip SOLID dan desain. Mereka memang menghasilkan beberapa kode spageti yang membuat saya sedikit ngeri, tetapi dengan sedikit dorongan dari saya, mereka mulai refactoring apa yang sudah diproduksi dan yang lucu adalah bahwa salah satu dari mereka kembali kepada saya beberapa hari kemudian dan berkata, saya benci untuk mengatakannya tetapi setelah memindahkan kode itu, ini terlihat jauh lebih mudah dibaca dan dimengerti. Jalan buntu dihindari. Titik I ' Yang saya coba buat adalah bahwa bahkan seseorang yang benar-benar baru untuk OO dapat menghasilkan kode yang lumayan, selama ia memiliki seorang mentor dengan lebih banyak pengalaman, untuk mengingatkannya bahwa "desain evolusi" tidak sama dengan "tanpa desain". Dan bahkan beberapa kelas "yang lebih kompleks" tidak begitu menakutkan karena setiap kelas tidak memiliki banyak tanggung jawab (yaitu tidak banyak kode), jadi yang terburuk menjadi lebih buruk, jika satu kelas "jalan buntu", kami buang dan tulis kelas pengganti yang memiliki antarmuka publik yang sama (sejauh ini saya tidak pernah melihat kebutuhan untuk hal tak terduga ini dalam apa pun yang kami tulis dan saya sudah melakukan tinjauan kode dua kali seminggu).
Sebagai catatan akhir, saya juga sangat percaya pada dokumen desain (setidaknya untuk kondisi bisnis tim saya saat ini) tetapi tujuan utama untuk dokumen desain kami adalah Memori Organisasi , jadi dokumen yang sebenarnya ditulis setelah kode diproduksi dan refactored. Sebelum pengkodean, kita umumnya memiliki fase desain cepat (kadang-kadang tidak begitu cepat) di mana kita membuat sketsa kelas pada serbet / mspaint / visio dan saya selalu mengingatkan orang bahwa fase ini menghasilkan jalur untuk diikuti, bukan cetak biru dan ketika mereka mulai coding, segala sesuatu yang tidak masuk akal harus diubah. Bahkan dengan pengingat ini, orang yang lebih baru cenderung mencoba untuk memasukkan kembali kode yang sesuai ke dalam desain asli tidak peduli seberapa tidak alami rasanya bagi mereka. Ini biasanya muncul dalam ulasan kode.
Dang, saya banyak menulis. Maaf soal itu.