Tampaknya pengalaman yang jarang tetapi umum bahwa kadang-kadang Anda sedang mengerjakan sebuah proyek dan tiba-tiba sesuatu muncul tanpa terduga, melemparkan kunci pas besar dalam karya dan meningkatkan kompleksitas banyak.
Sebagai contoh, saya sedang mengerjakan aplikasi yang berbicara dengan layanan SOAP di berbagai mesin lain. Saya membuat prototipe yang berfungsi dengan baik, kemudian mengembangkan ujung depan yang teratur dan umumnya membuat semuanya berjalan dengan baik, cukup sederhana dan mudah diikuti. Ini bekerja sangat baik sampai kami mulai menguji di jaringan yang lebih luas dan tiba-tiba halaman mulai kehabisan waktu karena latensi koneksi dan waktu yang diperlukan untuk melakukan perhitungan pada mesin jarak jauh menghasilkan permintaan batas waktu untuk layanan sabun. Ternyata kami perlu mengubah arsitektur untuk memutar permintaan ke utas mereka sendiri dan menyimpan kembali data yang dikembalikan sehingga dapat diperbarui secara progresif di latar belakang daripada melakukan perhitungan berdasarkan permintaan berdasarkan permintaan.
Detail dari skenario itu tidak terlalu penting - memang itu bukan contoh yang bagus karena cukup dapat ditiru dan orang-orang yang telah menulis banyak aplikasi jenis ini untuk jenis lingkungan seperti ini mungkin telah mengantisipasinya - kecuali bahwa itu menggambarkan cara yang seseorang dapat mulai dengan premis dan model sederhana dan tiba-tiba memiliki eskalasi kompleksitas dengan baik ke dalam pengembangan proyek.
Strategi apa yang Anda miliki untuk menghadapi jenis-jenis perubahan fungsional yang kebutuhannya muncul - seringkali sebagai akibat dari faktor lingkungan daripada perubahan spesifikasi - nanti dalam proses pengembangan atau sebagai hasil pengujian? Bagaimana Anda menyeimbangkan antara menghindari optimasi prematur / YAGNI / risiko rekayasa berlebihan dalam merancang solusi yang memitigasi terhadap masalah yang mungkin terjadi tetapi tidak selalu kemungkinan sebagai kebalikan dari mengembangkan solusi yang lebih sederhana dan lebih mudah yang mungkin sama efektif tetapi tidak menggabungkan kesiapan untuk setiap kemungkinan kemungkinan?
Sunting: Gila Eddie menjawab termasuk "Anda menyedotnya dan menemukan cara paling murah untuk menerapkan kompleksitas baru." Itu membuat saya memikirkan sesuatu yang tersirat dalam pertanyaan tetapi saya tidak secara khusus mengangkat.
Setelah Anda menekan benjolan itu, dan Anda memasukkan perubahan yang diperlukan. Apakah Anda melakukan hal yang akan membuat proyek sedekat mungkin dengan jadwal tetapi dapat mempengaruhi pemeliharaan atau apakah Anda kembali ke arsitektur Anda dan mengerjakannya kembali pada tingkat yang lebih terperinci yang mungkin lebih dapat dipelihara tetapi akan mendorong semuanya kembali selama pengembangan?
sumber
Saya tidak setuju dengan semangat jawaban @ Péter Török karena mengasumsikan bahwa tim (atau individu) dapat meramalkan item paling berisiko di awal siklus hidup proyek. Misalnya, dalam kasus OP, tim tidak dapat melihat kompleksitas yang semakin meningkat yang melekat pada solusi multi-berulir sampai punggung mereka menempel ke dinding.Pertanyaan OP adalah pertanyaan yang bagus, dan berbicara tentang masalah yang dimiliki oleh banyak toko pengembangan perangkat lunak.
Inilah cara saya menangani masalah:
Lebih lanjut tentang poin # 3:
sumber
Kode untuk antarmuka
Saat menulis fungsionalitas baru yang berinteraksi dengan fungsionalitas lain, buat batas dalam bentuk antarmuka (jenis Java) yang dilaluinya semuanya. Ini akan
sumber
Tidak mengherankan.
Ini adalah pengembangan perangkat lunak. Jika Anda tidak menemukan sesuatu yang baru, Anda mengunduh solusi yang sudah terbukti.
Ada sedikit jalan tengah.
Jika Anda menemukan sesuatu yang baru, maka harus ada setidaknya satu fitur yang Anda tidak sepenuhnya mengerti. (Untuk sepenuhnya memahaminya, Anda harus memiliki implementasi yang berfungsi, yang hanya akan Anda gunakan.)
Bagaimana cara mengaturnya?
Miliki harapan yang realistis. Anda sedang menciptakan sesuatu yang baru. Ada harus menjadi bagian yang tidak Anda mengerti.
Miliki harapan yang realistis. Jika tampaknya berfungsi dengan benar pertama kali, Anda telah mengabaikan sesuatu.
Miliki harapan yang realistis. Jika itu sederhana, orang lain akan melakukannya terlebih dahulu, dan Anda bisa mengunduh solusi itu.
Miliki harapan yang realistis. Anda tidak dapat memprediksi masa depan dengan baik.
sumber
Desain dan kode dengan pikiran usang. Asumsikan bahwa apa yang Anda kode hari ini harus dipotong dan diganti besok.
sumber
Lingkungan harus menjadi bagian dari spesifikasi. Jadi perubahan ke lingkungan ADALAH perubahan pada spesifikasi. Sebaliknya, jika Anda mendasarkan prototipe dan desain Anda pada lingkungan selain dari apa yang ada dalam spesifikasi, Anda membuat kesalahan bodoh. Bagaimanapun, Anda menyedotnya dan menemukan cara paling murah untuk mengimplementasikan kompleksitas baru.
sumber
Seperti kebanyakan masalah pemrograman, itu tergantung , menurut saya. Masalah ini sangat intrinsik untuk pekerjaan kreatif, sehingga Anda jangan lupa bahwa kegagalan akan terjadi, dan itu tidak masalah . Pemrograman adalah masalah yang jahat, dan Anda biasanya tidak tahu solusi yang tepat untuk masalah itu sampai Anda sudah menyelesaikannya.
Namun, ada sejumlah faktor lokal dan spesifik yang mungkin ikut berperan di sini, seperti:
Untuk hal-hal jangka pendek, mungkin tidak layak untuk memikirkannya lebih dari cukup untuk menjalankannya. Refactoring itu mahal, dan itu sesuatu yang tidak membuat nilai akhir langsung untuk pengguna Anda. Namun, hampir tidak ada kasus yang bisa saya pikirkan selain dari perangkat lunak sekali pakai, di mana itu sangat singkat sehingga tidak layak untuk meningkatkan desain Anda. Jauh lebih penting untuk dapat memahami apa yang Anda lakukan, dan memperbaikinya dengan cepat, daripada menyelesaikannya sekarang. Jika itu untuk jangka panjang, maka kemungkinan besar akan terbayar pada akhirnya (dan mungkin jauh lebih cepat dari yang dipikirkan semua orang yang terlibat), atau kebalikannya (tidak melakukannya akan menimbulkan rasa sakit segera daripada "ketika kita harus memperbaikinya"). Saya hampir tergoda untuk mengatakan "selalu meluangkan waktu untuk membuatnya lebih baik", tetapi ada beberapa kasus di mana itu tidak mungkin.
Ini akan sangat memengaruhi keputusan Anda. Tim Anda akan mendukung keputusan ini dengan memberi Anda sumber daya untuk mendesain ulang, atau mereka akan menuntut solusi cepat untuk dilakukan sekarang. Menurut pendapat saya, jika Anda menemukan bahwa tim mendorong Anda ke arah yang salah secara konsisten, itu adalah bendera merah besar. Saya telah melihat hal semacam ini berakhir dalam skenario di mana terjadi pemadaman api terus-menerus, di mana tidak pernah ada waktu untuk mendesain ulang karena Anda selalu memperbaiki masalah yang dihasilkan oleh desain buruk Anda. Mungkin juga ada jalan tengah: "lakban" sekarang, perbaiki secepatnya (tetapi sebenarnya lakukan).
Sangat penting. Pikirkan tentang apa kesalahan atau masalahnya dan mengapa itu terjadi. Situasi semacam ini adalah peluang besar untuk menemukan asumsi, kendala, dan interaksi yang cacat (atau hilang). Secara umum, selalu lebih baik memahami masalah Anda lebih baik daripada menyelesaikan masalah saat ini. Ini mungkin pertahanan terbesar Anda melawan YAGNI / overengineering. Jika Anda memahami masalah Anda dengan cukup baik, maka Anda akan menyelesaikannya itu dan tidak masalah lainnya.
Akhirnya, cobalah membangun sesuatu dengan cara yang benar . Saya tidak berbicara tentang kesalahan dan masalah yang Anda hadapi ketika Anda lebih mengerti tentang masalah atau kesalahan manusiawi Anda. Maksud saya bukan "jangan membuat kesalahan dan membuatnya sempurna pertama kali" - itu tidak mungkin. Maksud saya, coba kelola kompleksitas dengan baik dalam pekerjaan sehari-hari Anda, perbaiki jendela yang rusak, pertahankan sesederhana mungkin, perbaiki kode dan pemikiran Anda sepanjang waktu. Dengan begitu ketika (tidak jika) berganti mengetuk pintu Anda, Anda dapat menyambutnya dengan tangan terbuka, bukan senapan.
sumber