Saya sudah mencoba merencanakan hal-hal sebelumnya, tetapi saya tidak bisa benar-benar meramalkan semuanya sampai saya mulai memalu beberapa kode.
Sangat menggoda untuk berpikir bahwa perencanaan yang sempurna akan memberikan Anda desain / arsitektur perangkat lunak yang sempurna, namun ternyata itu salah. Ada dua masalah besar dengan ini. Pertama, "di atas kertas" dan "kode" jarang cocok, dan alasannya adalah karena mudah untuk mengatakan bagaimana itu harus dilakukan sebagai lawan untuk benar-benar melakukannya . Kedua, perubahan persyaratan yang tak terduga menjadi jelas terlambat dalam proses pengembangan yang tidak dapat dipikirkan sejak awal.
Pernahkah Anda mendengar tentang gerakan Agile? Ini adalah cara berpikir di mana kita menghargai "bereaksi terhadap perubahan" sebagai lawan dari "mengikuti rencana" (antara lain). Inilah manifestonya (ini bacaan cepat). Anda juga dapat membaca tentang Big Design Up Front (BDUF) dan apa perangkapnya.
Sayangnya, versi perusahaan "Agile" adalah sekelompok palsu (master scrum bersertifikat, proses berat atas nama "Agile", memaksa scrum, memaksa cakupan kode 100%, dll), dan biasanya menghasilkan perubahan proses asinin karena manajer berpikir Agile adalah proses dan peluru perak (yang mana keduanya bukan). Baca manifesto tangkas, dengarkan orang - orang yang memulai gerakan ini seperti Paman Bob dan Martin Fowler, dan jangan terjebak dalam versi omong kosong "Agile perusahaan".
Secara khusus, Anda biasanya bisa lolos dengan hanya melakukan TDD (Test Driven Development) pada kode ilmiah , dan ada kemungkinan besar proyek perangkat lunak Anda akan berubah dengan sangat baik. Ini karena kode ilmiah yang berhasil sebagian besar memiliki antarmuka yang dapat digunakan, dengan kinerja sebagai masalah sekunder (dan terkadang bersaing), sehingga Anda dapat lolos dengan desain yang lebih "serakah". Jenis TDD memaksa perangkat lunak Anda menjadi sangat berguna , karena Anda menulis bagaimana Anda ingin sesuatu dipanggil (idealnya) sebelum Anda benar-benar mengimplementasikannya. Ini juga memaksa fungsi-fungsi kecil dengan antarmuka kecil yang dapat dengan cepat dipanggil dengan cara "input" / "output" yang sederhana, dan menempatkan Anda pada posisi yang baik untuk melakukan refactor. dalam hal persyaratan berubah.
Saya pikir kita semua bisa sepakat bahwa numpy
perangkat lunak komputasi ilmiah berhasil. Antarmuka mereka kecil, dapat digunakan super, dan semuanya bermain dengan baik bersama. Perhatikan bahwa numpy
panduan referensi secara eksplisit merekomendasikan TDD: https://docs.scipy.org/doc/numpy-1.15.1/reference/testing.html . Saya telah menggunakan TDD di masa lalu untuk perangkat lunak pencitraan SAR (Synthetic Aperature Radar): dan saya juga dapat menyatakan bahwa itu bekerja sangat baik untuk domain tertentu.
Peringatan: Bagian desain TDD bekerja kurang baik dalam sistem di mana refactoring mendasar (seperti memutuskan bahwa Anda memerlukan perangkat lunak Anda menjadi sangat bersamaan) akan sulit, seperti dalam sistem terdistribusi. Misalnya, jika Anda harus mendesain sesuatu seperti Facebook di mana Anda memiliki jutaan pengguna secara bersamaan, melakukan TDD (untuk menggerakkan desain Anda) akan menjadi kesalahan (masih oke untuk digunakan setelah Anda memiliki desain awal , dan lakukan saja "uji pengembangan pertama "). Penting untuk memikirkan sumber daya dan struktur aplikasi Anda sebelum memasukkan kode. TDD tidak akan pernah menuntun Anda ke sistem terdistribusi yang sangat tersedia.
Bagaimana saya bisa menghindari selalu merasa seperti jika saya benar-benar membangun kembali program saya dari awal saya akan melakukannya lebih baik?
Mengingat hal di atas, harus agak jelas bahwa desain yang sempurna sebenarnya tidak mungkin dicapai, jadi mengejar desain yang sempurna adalah permainan yang bodoh. Anda benar-benar hanya bisa dekat. Bahkan jika Anda berpikir Anda dapat mendesain ulang dari awal, mungkin masih ada persyaratan tersembunyi yang belum ditampilkan sendiri. Selain itu, penulisan ulang memakan waktu setidaknya selama yang dibutuhkan untuk mengembangkan kode asli. Hampir pasti tidak akan lebih pendek, karena kemungkinan bahwa desain baru akan memiliki masalah yang tak terduga, ditambah Anda harus mengimplementasikan kembali semua fitur dari sistem lama.
Hal lain yang perlu dipertimbangkan adalah bahwa desain Anda hanya penting ketika persyaratan berubah .Tidak masalah seberapa buruk desainnya jika tidak ada yang berubah (dengan asumsi itu berfungsi penuh untuk kasus penggunaan saat ini). Saya bekerja pada garis dasar yang memiliki 22.000 baris pernyataan switch (fungsinya bahkan lebih lama). Apakah itu desain yang mengerikan? Heck ya, itu mengerikan. Apakah kita memperbaikinya? Tidak. Ini berfungsi dengan baik seperti dulu, dan bagian dari sistem itu tidak pernah benar-benar menyebabkan crash atau bug. Itu hanya tersentuh sekali dalam dua tahun saya di proyek, dan seseorang, Anda dapat menebaknya, memasukkan kasus lain ke sakelar. Tapi tidak ada gunanya meluangkan waktu untuk memperbaiki sesuatu yang sangat jarang disentuh, hanya saja tidak. Biarkan desain yang tidak sempurna seperti apa adanya, dan jika tidak rusak (atau terus-menerus rusak) maka jangan memperbaikinya. Jadi mungkin Anda bisa melakukan yang lebih baik ... tetapi apakah itu layak ditulis ulang? Apa yang akan kamu dapatkan?
HTH.