Saya telah menggunakan metodologi tangkas (SCRUM) selama sekitar tiga tahun sekarang dan saya melihat keuntungan tertentu untuk itu, terutama dalam umpan balik jangka pendek di berbagai tingkatan (dari pelanggan memiliki akses awal ke fitur yang diimplementasikan, dari penguji yang dapat menguji fitur sebagai segera setelah diterapkan, dari pengembang lain yang dapat memberikan umpan balik sangat awal tentang kode baru melalui ulasan, dll).
Di sisi lain, saya memiliki dua masalah terbuka, yang pertama akan saya coba jelaskan dalam pertanyaan ini.
Masalah: Kesulitan mendapatkan desain yang bagus
Saya mencoba melakukan refactoring segera setelah kode menjadi berantakan, saya menulis unit test sebanyak yang saya bisa (yang memang membantu mencegah bug secara umum dan ketika refactoring pada khususnya). Di sisi lain, mengembangkan beberapa fitur kompleks dengan peningkatan kecil, dengan komitmen harian dan terus menerus memikirkan kembali kode ketika tidak terstruktur tidak memungkinkan saya untuk menghasilkan desain yang sangat bagus.
Satu-satunya modul yang dirancang dengan baik yang dapat saya hasilkan baru-baru ini saya peroleh dengan mengambil pendekatan yang berbeda: Saya menganalisis masalah selama beberapa hari (saya benar-benar memiliki masalah melewati pikiran saya selama beberapa bulan sebelum saya mulai bekerja dengan serius ), membuat sketsa desain yang agak rinci dari semua kelas yang terlibat dan hubungan mereka selama beberapa hari lagi, dan kemudian mengunci diri di kantor saya dan menuliskan seluruh kode dengan bekerja tanpa gangguan selama sekitar tiga minggu. Hasilnya adalah hal terbaik yang saya hasilkan sementara waktu, dengan sangat sedikit bug yang agak mudah ditemukan dan diperbaiki, dan dengan desain yang sangat jelas, yang tidak memerlukan perubahan yang relevan sejak saat itu.
Jadi sampai sekarang saya merasa jauh lebih efektif untuk mendapatkan gambaran keseluruhan tentang apa yang ingin saya lakukan sebelumnya daripada mulai menulis kode dalam peningkatan kecil dengan harapan bahwa gambaran besar secara ajaib muncul dalam proses. Dengan upaya terbaik saya, pendekatan pengembangan peningkatan kecil selalu membawa saya ke desain yang lebih buruk.
Pertanyaan : Adakah yang punya pengalaman serupa? Apakah saya menerapkan SCRUM dengan cara yang salah atau apa yang harus saya perhatikan jika saya ingin mengembangkan sedikit demi sedikit dan masih berakhir dengan perangkat lunak yang dirancang dengan baik? Atau haruskah saya menjadwalkan cerita pengguna desain sebelum memulai pengkodean yang sebenarnya? Apakah ini dianggap praktik yang baik, setidaknya untuk fitur yang lebih kompleks daripada rata-rata?
EDIT - CATATAN
Saya menyadari fakta bahwa desain yang baik bukanlah sesuatu yang absolut dan tidak memiliki nilai sendiri tetapi tergantung pada konteksnya, dan bahwa seseorang harus mengarah pada desain yang cukup baik untuk masalah yang dihadapi.
Misalnya, saya tidak peduli (terlalu banyak) tentang desain yang baik jika saya harus mengimplementasikan komponen sederhana yang (1) harus siap sesegera mungkin, (2) hanya akan digunakan sekali, (3) tidak digunakan oleh bagian lain dari sistem (YAGNI).
Saya sangat peduli dengan desain yang baik ketika komponen (1) akan digunakan beberapa kali dan dalam beberapa rilis produk yang berbeda, (2) perlu dipertahankan dan diperpanjang dari waktu ke waktu, (3) memiliki banyak komponen lain bergantung padanya .
The only well-designed module I could produce recently I obtained by taking a different approach
- Anda menjawab pertanyaan Anda sendiri. Anda masih membutuhkan beberapa desain di muka; Anda tidak dapat mengharapkan desain yang bagus untuk tumbuh secara organik dari refactoring. Tidak berfungsi seperti itu.Jawaban:
Maka jangan lakukan itu.
Tidak semuanya cocok dengan kotak lincah yang bagus. Sering kali suatu produk akan memiliki beberapa hal kompleks yang tidak dapat dihilangkan untuk individu dan tidak dapat diselesaikan dengan cara yang waras dalam sprint. Memaksa mereka ke dalam kotak itu hanya akan menyebabkan masalah. Tetapi ini harus sedikit dan jauh dari itu. Jika Anda menemukan bahwa banyak komponen Anda seperti ini, pemilik produk Anda perlu bekerja untuk memecahkan masalah dengan lebih baik (dengan tim Anda). Saya baik-baik saja melakukan apa yang Anda lakukan: ambil cerita, rancang, lalu pisahkan ASAP dengan harapan bahwa itu akan memakan waktu beberapa minggu.
Dalam kasus yang lebih umum, ada 3 hal yang saya lihat dilakukan untuk mendapatkan desain yang baik di Agile:
Sebenarnya melakukan desain - Banyak tempat yang saya lihat memulai sprint mereka dan baru saja memulai koboi kode. Anda akan mendapatkan desain yang buruk dengan cara ini. Agile tidak mengubah proses pengembangan plan - code - test - release, itu hanya mempersingkat menjadi potongan granular. Di awal sprint, duduklah sesuai kebutuhan dan rancang solusi Anda.
Miliki arsitek / pemimpin - Setelah proyek Anda cukup besar, Anda akan berakhir dengan beberapa tim scrum mengerjakan bagian aplikasi yang berbeda. Sangat berguna untuk memiliki seseorang (atau beberapa orang tergantung pada ukuran aplikasi) yang tugas utamanya adalah mengetahui apa yang dilakukan semua tim dari sudut pandang desain. Mereka dapat menjawab pertanyaan dan membimbing tim ke arah desain lengkung yang lebih harmonis. Setiap tim scrum memiliki pemimpin yang tahu sebagian besar dari apa yang dilakukan tim lain. Saya juga telah melihat dan sangat efektif.
Jadilah seorang pragmatis - Saya membahas ini di atas. Agile adalah alat, dan seperti alat apa pun; itu tidak berlaku untuk semua masalah. Jika tidak masuk akal untuk diterapkan ke beberapa komponen, maka jangan menerapkannya di sana. Tujuan Anda adalah mengirimkan perangkat lunak yang baik; jangan lupakan itu.
sumber
Sangat mungkin untuk menerapkan dalam peningkatan kecil dan berakhir dengan kode yang dapat dikelola dengan baik terstruktur. Secara teori, ini sangat sederhana: jika Anda memastikan bahwa kode terstruktur dengan baik setelah setiap perubahan, itu akan selalu terstruktur dengan baik. Kode Anda menjadi terstruktur dengan buruk karena Anda terus menambahkan kode ketika Anda harus melakukan refactoring.
Tidak peduli berapa banyak waktu yang Anda habiskan untuk desain, pada akhirnya persyaratan akan berubah dengan cara yang tidak terduga dan Anda harus menulis kode yang tidak sesuai dengan desain aslinya. Maka Anda harus membuat perubahan tambahan. Jika Anda memiliki serangkaian unit test yang baik, dan ahli dalam refactoring, maka Anda akan dapat menjaga kode terstruktur dengan baik saat Anda memenuhi persyaratan baru.
sumber
"Dirancang dengan baik" adalah subyektif
Apa arti "dirancang dengan baik" bagi Anda? kepada Pemilik Produk? kepada Pelanggan?
Apakah "dirancang dengan baik " merupakan tujuan dari pemilik produk? tujuan pelanggan? atau hanya kamu?
Apakah yang Anda anggap "tidak dirancang dengan baik" masih memenuhi harapan Pemilik Produk dan membuat pelanggan senang? Maka itu cukup "dirancang dengan baik" .
Cukup Baik dan YAGNI
Tidak ada dalam sebagian besar metodologi Agile berbicara tentang "dirancang dengan baik", karena setiap sistem yang Pemilik Produk menerima cerita sebagai lengkap dan pelanggan percaya itu memenuhi persyaratan mereka adalah "dirancang dengan baik" .
Hal ini diharapkan bahwa pengembang profesional dan akan pragmatis menggunakan praktik terbaik, desain yang tepat dan idiom untuk menerapkan fitur dan cerita.
Jika Anda tidak memfaktorkan waktu untuk melakukan hal-hal dengan benar yang merupakan masalah pengembang, jika Pemilik Produk menuntut hal-hal dalam waktu yang lebih sedikit agar hal ini dapat dilakukan, itu adalah hak prerogatif mereka untuk melakukan ini, dan tanggung jawab Anda untuk mendidik mereka tentang konsekuensi dalam bentuk cerita utang teknis .
SCRUM
Metodologi Agile yang dapat ditulis, bukan Metodologi Agile. "- Jarrod Roberson
SCRUM seharusnya menjadi kerangka kerja alat untuk mengelola siklus hidup total produk perangkat lunak. Seharusnya tidak menjadi serangkaian hal yang kaku, hanya tempat yang baik untuk memulai dan mudah-mudahan membaik.
Sebagian besar toko tempat saya bekerja memiliki apa yang disebut Sprint ZERO, Sprint untuk anggota senior tim untuk membuat sketsa keseluruhan arsitektur atau tema produk.
Cerita yang lebih besar dari katakan 20 biasanya dipecah-pecah sampai mereka benar-benar beberapa Cerita 3 - 5 poin. Salah satu cerita ini adalah, "Sebagai sebuah tim kita perlu bertemu untuk membahas bagaimana kita akan merancang fitur ini, sehingga kita akan memiliki utang teknis sesedikit mungkin mengingat waktu yang diberikan."
Umumnya
Secara umum sistem "dirancang dengan baik" , Cukup Baik dan mengikuti YAGNI.
Agile, dan SCRUM khususnya sebagai implementasi Agile lebih tentang bagaimana menghasilkan suatu produk setransparan mungkin dengan Pemilik Produk / Sponsor.
Ini bukan tentang apa pun desain teknis / arsitektur bijaksana. Ini lebih merupakan filosofi tentang bagaimana pendekatan memberikan perangkat lunak yang memenuhi kebutuhan dan harapan pelanggan. Jika tidak ada yang Anda sebut bagian "dirancang dengan baik" , itu bukan bagian yang gagal, karena itu bukan bagian mendasar dari filosofi.
sumber
Kami telah bekerja dengan scrum selama beberapa bulan, dan saya ingin berbagi pengalaman saya tentang masalah Anda.
Beberapa bulan yang lalu saya diberi potongan besar untuk diterapkan. Saya sudah menyiapkan semua spesifikasi, jadi saya harus mengimplementasikan fitur baru yang sesuai. Tugasnya adalah sekitar 5-6 minggu (seperti yang saya perkirakan). Saya menghabiskan minggu pertama hanya mengerjakan desain. Tugasnya sedikit rumit: ada objek utama yang, seperti yang saya simpulkan dari spec, memiliki 15 keadaan berbeda, dan UI memiliki perilaku yang berbeda untuk setiap keadaan.
Saya mendesain seluruh alur kerja, dan struktur dan kelas DB sesudahnya.
Saya tidak melihat pendekatan lain dalam kasus saya. Jika saya terjun ke dalam pengkodean sekaligus, saya akan mendapatkan kekacauan besar yang buruk pada akhirnya _ hampir tidak mungkin untuk dipertahankan dan sangat sulit untuk membuat perubahan lebih lanjut. Tetapi perubahan terjadi dalam 2 minggu ke depan, jadi saya harus mengolah kode. Ini mudah sekarang, dengan desain pemikiran awal. Ini menghemat waktu, uang, dan saraf kami.
Setelah pengalaman ini, saya sangat yakin bahwa layak membuat desain yang dapat diterima di awal, daripada berharap bahwa dengan keajaiban Anda akan memilikinya di akhir.
sumber
Hind-sight adalah 20-20. Jika Anda memiliki informasi yang Anda miliki di awal proyek untuk mencari tahu semuanya dan kemudian menulis kode dalam beberapa minggu, saya sarankan Anda melakukannya.
Anda tidak memberikan kredit yang cukup untuk semua wawasan yang Anda peroleh, pendekatan yang dicoba dan gagal / harus diubah, dan peningkatan kemampuan klien / pengguna untuk memberikan persyaratan kredit yang cukup.
Mengapa ada orang yang memiliki sejarah proyek water-fall yang sukses, beralih ke metodologi yang gesit?
sumber
Anda selalu memerlukan gambaran yang lebih besar tentang apa tujuan akhir seharusnya, dan fitur apa yang dimaksudkan untuk diimplementasikan dan kapan, sebelum Anda memulai proyek. Mengerjakan cerita sebagai tugas atom menuntut masalah. Anda perlu mengingat persyaratan di masa depan sebanyak mungkin.
sumber