Berapa banyak detail untuk dimasukkan ke dalam iterasi pertama proyek?

15

Saya baru saja memulai proyek pribadi baru (Python), dan saya sedang menulis berapa jumlah untuk "konsep kasar" dari program, minimum yang diperlukan untuk melakukan apa yang ingin saya lakukan. Saya belum memasukkan kesalahan yang luas / penanganan pengecualian atau elemen UI estetika (bahkan dalam kasus di mana saya tahu hal-hal ini pada akhirnya akan diperlukan), dan dokumentasi hanya cukup untuk membantu masa depan saya melihat apa yang saya lakukan.

Apakah bertentangan dengan prinsip-prinsip tertentu dari desain / manajemen proyek untuk memulai dengan sangat kasar? Saya seorang ilmuwan, bukan seorang programmer, jadi saya tidak bisa mempercepat hal-hal ini. Jadi pertanyaan utamanya adalah, apakah ada konsensus tentang di mana seseorang harus bertujuan untuk jatuh di antara dua ekstrem:

  1. Tulis kode menyeluruh dan berkualitas tinggi dari awal, dengan semua penanganan pengecualian dan sedemikian rupa sehingga Anda tahu Anda pada akhirnya akan membutuhkannya.

  2. Tulis konsep kasar yang berfungsi minimal dari awal, dan masuk untuk mengisi semua detail di lain waktu.

Pertanyaan terkait: Kapan OK untuk mengorbankan "kerapian" desain untuk menyelesaikan proyek?

neuronet
sumber
1
Catatan untuk penjawab potensial: OP secara khusus menanyakan bagaimana menyeimbangkan kualitas kode terhadap kecepatan pengembangan dalam (mungkin) siklus iterasi awal suatu proyek. Pertanyaannya bukan apakah produk akhir harus berkualitas tinggi (penanganan kesalahan robus dll.) Tetapi kapan prototipe harus mulai menyertakan atau mengonversi ke kode berkualitas tinggi.
Lilienthal

Jawaban:

10

Tidak ada jawaban tunggal, karena ini sepenuhnya tergantung pada proyek. Kita perlu memikirkan dua hal di sini. Apa target akhirnya? Bagaimana Anda bisa sampai di sana?

Hasil akhir

Apakah Anda menulis perangkat lunak pengontrol Mars Orbiter? Maka Anda lebih baik pastikan Anda menulis kode yang paling kuat mungkin, Anda sebaiknya memeriksa setiap pengecualian ditangani dalam hal yang waras.

Apakah Anda menulis program yang hanya akan Anda jalankan, dan Anda hanya akan berjalan secara manual sesekali? Maka jangan repot-repot dengan pengecualian. Jangan repot-repot dengan arsitektur yang berat. Dapatkan itu berfungsi sampai pada titik di mana ia bekerja untuk Anda.

Bagaimana Anda bisa sampai di sana?

Apakah Anda melakukan pengembangan air terjun yang berat, di mana Anda menghabiskan banyak waktu untuk mencari tahu apa yang dibutuhkan, dan kemudian Anda akan pergi berbulan-bulan, berkembang? Jika demikian, maka Anda ingin mencapai kualitas target yang disebutkan di atas cukup awal. Dapatkan semua kesalahan Anda memeriksa infrastruktur yang direncanakan di awal.

Apakah Anda melakukan pengembangan lincah yang berat, di mana Anda mengumpulkan sesuatu selama satu atau dua minggu, yang kemudian akan ditunjukkan kepada para pemangku kepentingan, yang mungkin meminta revisi radikal, dan di mana Anda berharap untuk dapat mengulangi lebih dari sprint 1-2 wee sampai Anda mencapai target? Maka Anda mungkin lebih baik membuat sesuatu bekerja, tetapi rapuh bersama dengan cepat, dan hanya menambahkan ikat pinggang dan ikat pinggang saat persyaratan produk menguat.

Jika Anda memegang kendali atas air terjun atau keputusan tangkas (yang sebenarnya merupakan rangkaian bukan pilihan biner) maka buat keputusan itu berdasarkan perubahan yang diharapkan. Jika Anda yakin tahu persis seperti apa hasil akhirnya, maka air terjun adalah pilihan terbaik Anda. Jika Anda hanya memiliki gagasan yang kabur tentang apa yang harus Anda selesaikan, gesit adalah pilihan terbaik Anda. (Agile lebih populer hari ini bukan karena secara inheren lebih baik tetapi karena situasi kedua jauh lebih umum.)

Sekarang temukan jawaban Anda sendiri

Bagi sebagian besar, jawabannya akan terletak di suatu tempat di tengah. Jawab kedua pertanyaan itu tentang proyek Anda, dan itu akan menuntun Anda ke arah dasar.

Saya bisa mengatakan itu untuk diri saya sendiri, jika saya sering menulis skrip satu kali yang dirancang dengan sangat buruk dan tidak ada kesalahan dalam memeriksa apa pun. Saya juga menangani kode produksi, di mana penanganan kesalahan dan arsitektur mendapat banyak perhatian. Itu semua tergantung pada apa yang Anda lakukan.

Satu peringatan terakhir: Jika Anda memutuskan untuk membuat skrip satu kali yang dapat dilakukan dengan cepat dan kotor, pastikan. Sayangnya, sering terjadi bahwa skrip cepat dan kotor yang melakukan sesuatu yang menarik dapat dimanfaatkan secara luas ketika orang lain memperhatikannya. Pastikan bahwa ketika ini terjadi, waktu diberikan untuk pengerasan.

Gort the Robot
sumber
Informasi yang sangat membantu! Milik saya adalah proyek bertubuh kecil yang tidak penting untuk mata pencaharian siapa pun, dan saya ingin umpan balik segera pada model kerja minimal, untuk memahami bagaimana perasaan orang tentang struktur keseluruhan. Jadi saya pikir konsep kasar tidak apa-apa, tetapi poin terakhir Anda sangat bagus: ketakutan lain adalah saya menyelesaikan konsep, tetapi kemudian tidak pernah melakukan perbaikan yang perlu saya lakukan untuk membawanya ke tingkat pemrograman yang baik (sebagai lawan dari "itu hanya nyaris tidak bekerja "pemrograman).
neuronet
1
@neuronet: Terkadang kekokohan "it just nothing works" sudah cukup. Salah satu cara untuk memikirkannya adalah membandingkan frustrasi yang Anda dapatkan ketika bekerja dengan perangkat lunak dengan ketahanan yang dibutuhkan. Semakin frustrasi masalah dengan perangkat lunak, semakin penting mereka diselesaikan.
Bart van Ingen Schenau
11

Semua desain perangkat lunak dan konsep dan pola pengkodean muncul sebagai respons terhadap beberapa masalah. Pola atau konsep adalah solusi untuk masalah itu. Seiring waktu, beberapa pola menjadi "terkenal" sebagai solusi yang lebih disukai karena mereka memecahkan masalah dengan cara yang memenuhi persyaratan tertentu untuk konsistensi, keakraban, kinerja, pemeliharaan, dan sebagainya.

Oleh karena itu, jika masalah yang ingin diselesaikan oleh pola perangkat lunak tidak ada dalam perangkat lunak khusus Anda, maka Anda tidak perlu pola tersebut. Lebih jauh, setiap diskusi tentang pola apa yang mungkin diperlukan perangkat lunak Anda juga harus mencakup diskusi terperinci tentang perangkat lunak yang Anda usulkan: apa yang seharusnya dilakukan? Masalah apa yang dipecahkannya? Berapa banyak pengguna akan ada? Apakah pengguna akan berbagi data dengan cara tertentu? Dan seterusnya.

Masalah yang seharusnya diselesaikan oleh pengecualian adalah ketika sesuatu terjadi sehingga kode tidak dapat melakukan apa-apa. Contohnya adalah operasi File / Buka di mana nama file ditentukan yang tidak ada pada media penyimpanan. Pengecualian memberikan kode cara untuk mengatakan kepada penelepon, "Sesuatu terjadi yang mencegah saya melanjutkan, dan tidak ada yang bisa saya lakukan tentang itu, jadi saya menyerah." Jika Anda tidak memiliki tempat dalam kode Anda di mana kondisi seperti itu ada, maka Anda tidak perlu pengecualian. Atau, Anda bisa mengembalikan kode kesalahan, dan menghindari pengecualian sama sekali.

Saat Anda mendapatkan pengalaman, Anda akan belajar tentang pola perangkat lunak dan kapan penggunaannya sesuai. Anda juga akan tahu berapa banyak desain awal yang Anda butuhkan; sekali lagi, itu sangat tergantung pada aplikasi yang Anda tulis. Utilitas kecil ditulis dengan cara yang secara fundamental berbeda dari aplikasi perusahaan besar, dengan kata lain.

Robert Harvey
sumber
Poin-poin bagus: Saya telah memperjelas dalam pertanyaan saya bahwa saya menunda hal-hal yang saya tahu (berdasarkan proyek lain) yang pada akhirnya saya perlukan dalam proyek yang sudah selesai.
neuronet
Saya harap saya menjelaskan bahwa, bahkan jika Anda mengetahui hal-hal ini, jika Anda tidak membutuhkannya, maka Anda tidak membutuhkannya.
Robert Harvey
4

Ada pendekatan yang sangat sederhana dan praktis untuk ini, yang bekerja untuk berbagai proyek ukuran kecil hingga menengah. Meskipun itu mungkin tidak akan bekerja dengan baik untuk Mars Explorers.

Pertama, cari tahu apa yang Anda ingin sistem lakukan dan catat masing-masing fitur individual. Ini bisa secanggih papan cerita seluruh pengguna atau sesederhana beberapa poin yang dituliskan pada selembar kertas di depan Anda. Tetapi penting Anda tahu apa yang ingin Anda lakukan.

Berdasarkan itu menyusun struktur umum sistem. Sekali lagi, ini sangat sering hanya gambar cepat dari berbagai kelas / modul dan bagaimana mereka berhubungan satu sama lain, tetapi mungkin serumit keseluruhan dokumen. Yang penting adalah Anda memiliki semacam ide tentang bagaimana Anda akan mengimplementasikan sistem. Tapi, ini mungkin akan disempurnakan saat Anda mengerjakannya, jadi jangan mencoba untuk menjadi rumit dan terperinci.

Dari semua fitur ini, pelajari hal-hal utama yang perlu dilakukan oleh program - fitur inti.

Kemudian implementasikan satu per satu. Sekarang kuncinya di sini adalah untuk benar-benar memastikan bahwa setelah Anda mengimplementasikan fitur ini dilakukan dan berfungsi penuh - idealnya ini disertai dengan unit test yang memastikan tetap berfungsi. Saya biasanya melanjutkan dengan asumsi bahwa saya akan sangat sibuk sehingga saya tidak akan pernah punya waktu untuk kembali ke fitur dan memperbaikinya.

Setelah fitur inti diimplementasikan, saya biasanya mencoba menempatkan sistem untuk digunakan sedekat mungkin dengan lingkungan produksi. Ini memberi Anda a) bug apa pun yang mungkin Anda lewatkan sebelumnya dan b) Anda mendapat ide bagus tentang prioritas fitur berikutnya.

Kemudian Anda dapat terus mengimplementasikan fitur yang tersisa sesuai kebutuhan.

Kualitas Kode vs. Fitur

Dengan pemikiran di atas, saya cenderung mengorbankan fitur daripada kualitas kode, jika saya harus membuat tenggat waktu. Hanya karena, setidak-tidaknya dalam pekerjaan saya, ketika saya menyelesaikan sesuatu, manajemen saya menganggap itu sudah selesai. Dan mereka bisa memberi saya tugas selanjutnya. Saya tidak punya banyak waktu membuat kode lebih bagus setelah fakta.

Sekarang, bagaimana dengan penanganan pengecualian?

Jika Anda tidak ingin mengimplementasikannya, Anda bisa mencantumkannya sebagai fitur lain dalam daftar. Dan ketika Anda sampai di sana, Anda bisa menerapkannya. Tetapi kemungkinan besar dalam kasus Anda mungkin ada banyak hal lain yang lebih penting terlebih dahulu.

Namun, ada persyaratan minimum untuk pengecualian: Pastikan pengguna diberi tahu jika terjadi kesalahan - tidak peduli seberapa jelek outputnya. Jangan menelan pengecualian di suatu tempat.

ced-b
sumber
1
"Saya biasanya pergi dengan asumsi bahwa saya akan sangat sibuk sehingga saya tidak akan pernah punya waktu untuk kembali ke fitur dan memperbaikinya." ini adalah kekhawatiran yang saya miliki yang seharusnya saya sebutkan. Senang Anda menyebutkannya, dan untuk posting bermanfaat.
neuronet