Saat menulis kode atau selama desain Anda mencoba untuk menggeneralisasi masalah pada contoh pertama itu sendiri atau mencoba untuk menyelesaikan masalah yang sangat spesifik.
Saya menanyakan hal ini karena mencoba menyamaratakan masalah cenderung mempersulit hal-hal (yang mungkin tidak perlu) dan di sisi lain akan sangat sulit untuk memperluas solusi spesifik jika ada perubahan dalam persyaratan.
Saya kira solusinya adalah menemukan jalan tengah yang lebih mudah diucapkan daripada dilakukan. Bagaimana Anda mengatasi masalah jenis ini? Jika Anda mulai menggeneralisasikannya pada titik waktu yang Anda tahu bahwa generalisasi sebanyak ini sudah cukup?
Jawaban:
Terlalu sering ketika Anda mencoba merancang untuk masa depan, prediksi Anda tentang kebutuhan masa depan ternyata salah. Biasanya lebih baik untuk refactor ketika Anda benar-benar tahu bagaimana kebutuhan telah berubah daripada mendesain ulang sistem Anda pada hari pertama. Pada saat yang sama, jangan tembak kaki Anda juga. Tentu saja ada jalan tengah, dan mengetahui di mana itu lebih merupakan seni daripada sains.
Untuk merebusnya menjadi satu aturan praktis: lebih sedikit lebih banyak.
sumber
Apakah Anda terbiasa dengan Agile? Salah satu prinsip besar Agile adalah YAGNI . Saya menemukan itu cara terbaik untuk mendekati sesuatu.
sumber
Ini mungkin salah satu bagian paling sulit dari pengembangan perangkat lunak karena Anda harus melewati batas antara "YAGNI" dan "PYIAC" (Paint Yourself Into A Corner).
Sangat mudah untuk mengatakan "jangan menulis fitur kecuali Anda membutuhkannya". Bagian yang sulit adalah merancang kode Anda sehingga Anda dapat dengan mudah menambahkan fitur nanti ketika Anda membutuhkannya.
Kuncinya adalah untuk dapat merancang arsitektur yang dapat dikembangkan di mana Anda tidak menulis kode lebih dari yang Anda butuhkan saat ini. Kemampuan untuk melakukan ini dengan baik benar-benar berasal dari banyak pengalaman (dan rasa sakit).
sumber
Saya menghabiskan waktu di muka untuk memikirkan arah umum desain - tidak terlalu banyak, tetapi cukup untuk membuat sketsa gambaran tingkat tinggi. Saya kemudian mengikuti metodologi tangkas berbasis cerita menggunakan TDD untuk mengembangkan solusi untuk cerita individu. Karena saya menerapkan melalui TDD, saya mengingat ikhtisar tingkat tinggi saya dan (a) mengarahkan implementasi khusus saya untuk mengikuti ikhtisar tingkat tinggi atau (b) refactor (dan meningkatkan) pemahaman / arahan tingkat tinggi saya berdasarkan apa yang saya pelajari selama pengujian / implementasi.
Saya pikir itu adalah kesalahan untuk tidak melakukan perencanaan dimuka, tetapi mungkin yang lebih besar untuk melakukan terlalu banyak. Sebisa mungkin saya ingin memberi saya pengalaman memandu saya dalam gambaran besar dan kemudian membiarkan desain tumbuh secara organik di sepanjang garis yang telah saya paparkan dalam pikiran saya tentang bagaimana aplikasi akan dikembangkan. Menggunakan TDD saya menemukan bahwa desain itu sendiri dipaksa menjadi prinsip-prinsip desain yang lebih baik (dipisahkan, tanggung jawab tunggal, dll) dan lebih mudah ditempa sehubungan dengan perubahan daripada jika saya mencoba untuk menyusun keseluruhan dan menyesuaikan pengembangan ke dalamnya.
sumber
Desain yang bagus mengakomodasi perubahan di masa depan dan pasti layak untuk dilakukan. Pertimbangkan sistem operasi UNIX dan "semuanya adalah filosofi file". Keputusan desain itu diambil bukan untuk memenuhi beberapa kebutuhan mendesak tetapi dengan pandangan untuk persyaratan di masa depan. Seseorang ngeri membayangkan seperti apa sistem operasi yang didasarkan pada desain "gesit" itu.
sumber
Apa yang Anda coba selesaikan berkaitan dengan penggunaan kembali (yaitu generalisasi masalah yang Anda hadapi sekarang sehingga Anda dapat menggunakan kembali pekerjaan (kode) di masa mendatang). Saya sudah mengatakannya sebelumnya dan saya akan menautkannya lagi.
Saya pikir saya pernah mendengar orang lain mengatakan sesuatu dengan efek:
sumber
Desain untuk "sekarang +1". Itu berarti, selesaikan masalah langsung yang ada, dan bangun fungsionalitas yang cukup sehingga pada saat mereka meminta perubahan, Anda sudah menyelesaikannya setengah jalan (atau lebih) dan memiliki pilihan a) menyelesaikannya segera dan refactoring nanti, atau b) menyelesaikan "sekarang +1" lagi (dengan setengah "sekarang" selesai)
Ini tergantung proyek, dan, singkatnya, pengalaman akan mengajarkan Anda apa "+1" itu.
sumber
Filosofi YAGNI , Kamu Tidak Akan Membutuhkannya, dapat diringkas dengan (dari artikel):
sumber
Saya sangat percaya merancang untuk masalah yang dihadapi dan tidak meniup desain Anda dengan mencoba menebak semua kasus yang harus Anda penuhi karena "suatu hari nanti kita mungkin membutuhkannya".
Pada dasarnya, diberikan daftar persyaratan khusus, desain yang bertentangan, namun, ini tidak berarti bahwa Anda tidak boleh:
Masalah utama dengan merancang untuk "kemungkinan masa depan" adalah bahwa Anda selalu hanya menebak. Mungkin membuat tebakan yang terpelajar, tetapi "ketika dorongan datang untuk mendorong" itu masih hanya serangkaian tebakan.
Dengan melakukan ini, Anda juga memiliki kemungkinan yang sangat nyata untuk memeras solusi Anda agar sesuai dengan kasus umum (s) daripada menyelesaikan masalah spesifik yang dihadapi sebagaimana ditentukan oleh persyaratan yang diketahui Anda.
Apa yang dikatakannya? "Ketika semua yang kamu miliki adalah palu, semuanya mulai terlihat seperti paku."
Saya berharap memiliki satu pound untuk setiap kali saya mendengar seseorang berkata, "Tapi itu solusi yang lebih mudah beradaptasi untuk kasus-kasus umum yang mungkin kita lihat di masa depan."
sumber