Bagaimana cara mendapatkan desain yang baik saat menggunakan metode gesit?

15

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 .

Giorgio
sumber
5
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.
Robert Harvey
1
Tidak. Karena mungkin saya tidak menerapkan SCRUM dengan benar.
Giorgio
3
Tidak ada yang namanya "SCRUM dengan benar." Hanya ada proses yang menghasilkan hasil yang diinginkan.
Robert Harvey
1
Itu sebabnya mereka disebut "pedoman" :) Pokoknya, komit setiap hari, memiliki sprint pendek (1 minggu hingga 1 bulan), aturan seperti ini tidak berbicara sama sekali untuk mendesain. Anda masih harus memiliki desain.
Robert Harvey

Jawaban:

13

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.

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.

Telastyn
sumber
3
+1 (+10 jika saya memiliki lebih dari satu suara!) Untuk "Memaksa mereka ke dalam kotak itu hanya akan menyebabkan masalah."
Giorgio
17

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.

kevin cline
sumber
+1: Oke. Jadi saya harus menjadwalkan cerita refactoring ketika saya pikir ada kebutuhan untuk itu dan tidak menambahkan fitur baru sampai saya memiliki desain yang cukup bagus lagi. Mungkin itu yang kami lewatkan dalam proses kami (selain fakta bahwa, IMO, peningkatan yang kami kembangkan sering kali terlalu kecil).
Giorgio
2
sebenarnya Anda harus menambahkan kisah utang teknis dan membahas kapan harus benar-benar menindaklanjutinya dengan Pemilik Produk, inilah yang dimaksud dengan utang teknis .
4
Semua proyek yang saya lihat di mana Anda meletakkan tanggung jawab kualitas kode di tangan pemilik produk dengan membuat cerita "hutang teknis" atau sejenisnya, kualitas kode selalu diprioritaskan sedemikian rendah sehingga sangat merusak kecepatan dan moral. Saya percaya tim adalah entitas yang bertanggung jawab atas kualitas kode. Tim harus memperkirakan cerita sehingga ada ruang untuk penyampaian dengan utang teknis yang dipertahankan atau, jika perlu, diturunkan.
Buhb
4
"Cerita refactoring" atau "Kisah utang teknis" seharusnya tidak terjadi. Tidak pernah. Biaya refactoring adalah bagian dari pengembangan dan seharusnya tidak menjadi tugas yang terpisah. Itu harus dilakukan terus menerus dalam langkah-langkah kecil, tidak direncanakan, setelah fakta, cerita. Saya tahu ini, tim kami mencoba cerita refactoring, itu buruk. Ketika Anda mulai refactoring 'on-the-fly', Anda akan melihat bahwa refactoring menjadi bagian dari stile coding Anda dan bukan tugas yang terpisah untuk dilakukan.
Patkos Csaba
1
Jika Anda yakin bahwa basis kode tidak akan dapat dengan mudah menangani cerita X tanpa restrukturisasi / penulisan ulang yang signifikan, maka restrukturisasi ini harus menjadi bagian dari cerita X dan pekerjaan yang diperlukan untuk restrukturisasi ini harus dipertimbangkan ketika memperkirakan cerita X.
Buhb
6

"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.

Robert Harvey
sumber
2
Adalah "dirancang dengan baik" tujuan pemilik produk: Bukan tujuan langsung. Secara tidak langsung, ya: dirancang dengan baik berarti lebih mudah untuk debug dan pemeliharaan. Saya harus menghabiskan waktu berminggu-minggu menemukan bug penting (yang membuat aplikasi crash) dalam kode yang berantakan dan dirancang dengan buruk.
Giorgio
3
Sungguh jawaban yang menyedihkan. Ini pada dasarnya menjamin perangkat lunak biasa-biasa saja menyelimuti planet ini seperti abu
Robert Harvey
@Iorgio itu bukan tujuan, itu harapan tersirat.
@RobertHarvey Saya tahu Anda telah melihat video Big Ball of Mud dan membaca Paper. Ini adalah kehidupan nyata, SCRUM khususnya adalah pengakuan BBOM dan merangkulnya dalam metodologi dengan menerima entropi sebagai bagian dari proses dan mengelolanya dengan mencoba mendokumentasikannya (debut teknis) dan memperlambatnya (refactoring). Ya, Anda harus mulai sejauh dari total BBOM / Entropy, tetapi dalam kehidupan nyata itu tidak selalu terjadi.
1
OKE, tetapi Anda tidak bisa makan "harapan tersirat." Itu hanya melambaikan tangan. "Ini akan dirancang dengan baik karena saya seorang profesional dan saya tahu apa yang saya lakukan." (Menggunakan suara Bill Murray terbaik saya) Ya, benar.
Robert Harvey
3

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.

superM
sumber
1
+1: Jawaban yang sangat menarik. Pendukung yang tangkas akan memberi tahu Anda bahwa Anda seharusnya membagi cerita 6 minggu Anda menjadi cerita yang lebih kecil. Saya pernah diberi saran serupa dan saya menjawab bahwa enam cerita 1 minggu saya akan memiliki banyak ketergantungan satu sama lain: karena bahkan jika saya mengubah rencana kerja saya, saya tidak dapat mengubah domain masalah. Saya tidak mendapat jawaban tentang ini: lincah sering menganggap bahwa Anda dapat memecah pekerjaan Anda pada cerita kecil, independen, tetapi di dunia nyata ini tidak selalu terjadi.
Giorgio
1

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?

JeffO
sumber
"Mengapa ada orang yang memiliki sejarah proyek water-fall yang sukses, beralih ke metodologi yang gesit?": Pengamatan yang sangat bagus (+1). Saya pikir pilihan antara air terjun dan lincah harus terkait dengan jenis proyek yang dilakukan: untuk proyek dengan persyaratan yang tidak jelas yang perlu sering prototipe dan di mana prototipe kemungkinan akan menjadi produk akhir, tangkas bisa tepat. Untuk proyek di mana persyaratan lebih stabil dan di mana ketahanan dan stabilitas lebih penting, air terjun (atau beberapa variasi) mungkin merupakan pilihan yang lebih baik.
Giorgio
0

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.

James
sumber
Apakah praktik yang baik untuk menjadwalkan kisah pengguna desain ?
Giorgio
@Giorgio: Itu mungkin tidak perlu tetapi Pemilik Produk setidaknya harus memberi timnya gambaran tentang harapan pelanggan dari proyek, sebelum proyek dimulai, dan penjelasan tentang bagaimana itu dipecah seperti itu.
James
1
Jika seseorang mundur, beri alasan
James
Downvoters jarang meluangkan waktu untuk menjelaskan mengapa mereka downvote. Saya merasa sangat menjengkelkan.
Giorgio