Bagaimana “Kamu Tidak Akan Membutuhkannya” dan “Sekarang lebih baik daripada tidak pernah” bermain bersama?

17

Saya sering menemukan diri saya memeluk "sekarang lebih baik daripada tidak pernah" ketika saya memajukan KERING desain. Biasanya, saya menemukan bahwa saya perlu memupuk pemahaman tentang Satu Lokasi Resmi untuk sepotong pengetahuan dalam konteks sistem potongan pengetahuan lainnya. Jadi, saya cenderung mendesain sistem 'sekarang.'

Sebaliknya, latihan ini membuat saya membangun jauh di muka, meskipun ada peluang yang masuk akal bahwa saya tidak akan membutuhkannya.

Bagaimana kedua pola ini selaras?

Praktek apa yang Anda gunakan untuk memastikan mereka bermain bagus?

Bagaimana Anda mengajar mereka bersama tanpa menciptakan kebingungan?

Justin Myles Holmes
sumber
2
Lihatlah sebelum Anda melompat. Tapi dia yang ragu-ragu hilang.
mmyers

Jawaban:

26

Saya mencoba berpikir jauh ke depan juga, tetapi biasanya tidak dalam kode. Saya bertukar pikiran dan membuat catatan, semoga mengatur hal-hal dengan cukup baik sehingga saya dapat merujuk kembali kepada mereka.

Saya lebih condong ke arah "Anda tidak akan membutuhkannya" sehubungan dengan kode, tetapi "sekarang lebih baik daripada tidak sama sekali" dengan desain.

Ketika mulai membangun sistem baru, tergoda untuk ingin membangun segalanya sekarang, tetapi itu juga dapat menguras momentum dan semangat Anda. Saya cenderung berpikir tentang desain keseluruhan dan mencoba untuk menggambar garis langsung melalui itu - datang dengan arsitektur kerangka ujung-ke-ujung dan membangun yang pertama, menerapkan prinsip-prinsip desain suara sehingga saya nanti dapat mengembangkannya dan refactor untuk membawa dalam fitur baru.

Membangun representasi end-to-end paling sederhana dari sistem yang dapat bekerja; lakukan itu dulu, lalu Anda punya sesuatu untuk direnungkan. Itu cenderung membantu mengkristalkan semua pertanyaan "bagaimana jika" yang tidak jelas itu dan membantu Anda menentukan apa yang perlu Anda bangun selanjutnya.

samplebias
sumber
3
+1 meninggalkan tempat untuk sesuatu dalam desain tidak berarti Anda harus membangunnya terlebih dahulu. CARA terlalu banyak orang mendapat dorongan absolut bahwa tidak ada yang harus dipertimbangkan sebelum permintaan dan membiarkan diri mereka dalam situasi yang jauh lebih buruk daripada jika mereka telah membangun semuanya tanpa masukan pelanggan sama sekali.
Bill
9

YAGNI berarti hal-hal yang dilakukan ketika mereka perlu dilakukan dan bukan sebelumnya. Itu tidak berarti mereka tidak pernah selesai, tidak kecuali mereka tidak pernah dibutuhkan. Ini berarti Anda hanya melakukan apa yang memberi pelanggan nilai bisnis langsung . Apa nilai bisnis langsung berarti subjektif bagi setiap pelanggan dan setiap proyek.

Dalam kedua kasus tersebut, Anda tidak dapat kehilangan apapun dengan YAGNI.

Dalam kasus lain, Anda kehilangan waktu menulis kode yang tidak pernah digunakan, dan menulis tes untuk kode yang tidak pernah digunakan, dan menulis dokumentasi untuk kode yang tidak pernah digunakan, dan pemeliharaan pada kode yang tidak pernah digunakan, orang bertanya-tanya apa yang dilakukan kode ini , dan jika itu pernah digunakan, ad nauseum.

Contoh

Jika saya mengerjakan prototipe / bukti konsep atau versi 1.0 dari aplikasi maka saya tidak perlu desain untuk skala ke tingkat Facebook. Sial, saya tidak perlu desain untuk meningkatkan ke tingkat Facebook, sampai saya mulai melihat bahwa saya memiliki lalu lintas semacam itu.

Apakah Anda pikir Zuckerberg merancang versi Facebook yang paling pertama untuk skala hingga 500 juta pengguna? Tidak, ia mendesain dan membangunnya agar hanya ingin itu perlu dilakukan dan tidak lebih. Jika ia mencoba menyiram desain untuk 500 Juta pengguna sejak hari pertama, Facebook mungkin tidak akan pernah dirilis.

Cara praktis untuk melakukan sesuatu adalah bagaimana ia melakukannya. Dia mulai dengan PHP dan MySQL, dan desain ulang dan penulisan ulang sesuai kebutuhan berdasarkan nilai bisnis , penskalaan ke jutaan pengguna adalah nilai bisnis yang luar biasa, tetapi tidak pada hari ke 0. Pada hari 0 hanya meluncurkan sesuatu adalah nilai bisnis yang luar biasa.

Dia berencana mendesain ulang dan menulis ulang. Yang merupakan pola pikir yang berbeda dari perencanaan untuk wastafel dapur dan tidak pernah benar-benar mengembangkan atau memberikan sesuatu yang bermanfaat yang lengkap.

Merencanakan akhir masa hidup untuk basis kode, dan penulisan ulang adalah Agile dan bukti di masa depan. Mencoba untuk datang dengan beberapa tujuan "fleksibel" yang tidak ditentukan hanya berakhir dengan kegagalan setiap saat. Anda mendesain tanpa perlu dan membuang waktu Anda bisa mengembangkan apa yang bernilai bisnis, bukan bermimpi tentang fitur yang tidak akan pernah digunakan.


sumber
2
Jika desain Anda buruk (mis. Tidak fleksibel), Anda bisa kehilangan banyak hal dengan YAGNI.
EricSchaefer
1
@EricSchaefer - tidak jika itu memenuhi tujuan dan memberikan nilai bagi bisnis dan Anda tidak memiliki banyak waktu yang diinvestasikan, Anda hanya membuangnya lebih sedikit hilang daripada tidak pernah memberikan sistem magis Anda yang tak terhingga fleksibel yang tidak akan pernah lengkap dan dikirimkan dan jika itu terjadi, itu akan menjadi mimpi buruk konfigurasi.
6

Cara Zen Python mengatakan:

Sekarang lebih baik daripada tidak sama sekali. Meskipun tidak pernah sering lebih baik daripada saat ini.

Idenya adalah bahwa itu bukan karena Anda dapat mendefinisikan sesuatu sekarang yang seharusnya. Apakah Anda membutuhkannya sekarang?

  • Ya: lakukan sekarang!
  • Tidak: jangan lakukan itu! Tunggu kebutuhannya! YAGNI!

Kasus-kasus di mana ini kurang jelas adalah dalam kasus-kasus refactoring. Haruskah saya menerapkan KERING setiap kali saya bisa? Jawabannya tidak jelas karena ada kalanya menerapkan biaya KERING lebih banyak (dalam waktu yang dihabiskan) daripada duplikasi. Namun, dalam jangka panjang, menerapkan KERING sampai Anda memiliki alasan teknis / kinerja untuk tidak selalu baik.

Jadi, YAGNI sampai Anda melakukannya, lalu LAKUKAN SEKARANG. Jangan menunggu!

Klaim
sumber
3

Saya tidak berpikir mereka bermain bersama sama sekali. Saya pikir Anda condong satu arah atau yang lain. Dan saya condong ke arah YAGNI.

Tetapi untuk apa nilainya, saya tidak setuju dengan proposal kedua, bahwa "Sekarang lebih baik daripada tidak sama sekali." Jika suatu persyaratan penting, maka itu harus diselesaikan. Jadi "tidak pernah" bukanlah suatu kemungkinan. Jika tidak penting, daripada "sekarang" tidak lebih baik - "tidak pernah 'lebih baik.

Hanya dua sen saya.

MJB
sumber
Dan sekarang pertanyaan jutaan dolar: Apa arti "penting"?
Aaronaught
1
"Penting" berarti ini adalah tes penerimaan.
kindall
Penting artinya klien berteriak ketika tidak ada.
Paul Nathan
2
Penting artinya klien tidak membayar jika tidak ada di sana.
Christopher Mahan
@Christopher, itu bisa diartikan sebagai mendorong profesionalisme. Misalnya melindungi terhadap injeksi SQL adalah penting bahkan jika klien tidak akan tahu apa itu dan tentu saja tidak akan mengujinya sebelum membayar.
Peter Taylor
2

Bagaimana kedua pola ini selaras?

Mereka ortogonal dan tidak ada hubungannya satu sama lain.

Praktek apa yang Anda gunakan untuk memastikan mereka bermain bagus?

Um Apakah mereka berdua? Apa lagi yang bisa ada?

Bagaimana Anda mengajar mereka bersama tanpa menciptakan kebingungan?

YAGNI menggambarkan fitur yang terlihat oleh pengguna. Anda tidak perlu mewah.

Sekarang lebih baik daripada tidak pernah menggambarkan prosesnya. Tulis tes sekarang. Tulis kode sekarang. Jangan menghabiskan waktu memikirkan alternatif desain. Bangun sesuatu daripada bicara tentang membangun sesuatu.

S.Lott
sumber
2

Jika "tidak pernah" adalah implikasi dari "tidak sekarang", maka desain Anda cacat.

Keputusan lokal yang Anda buat harus transparan terhadap seluruh sistem.
Misalnya, jika Anda memiliki komponen CookieSource, yang memerlukan a CookieFactoryuntuk mengubah CookieRecipesitu menjadi Cookies, berdasarkan beberapa parameter input Anda, maka CookieSourcetidak perlu dan dengan demikian tidak harus bergantung pada bagaimana CookieFactoryditerapkan dan bagaimana CookieRecipesdiwakili.
Jika CookieFactoryitu sebenarnya a Bakery, itu bisa Recipemenjadi apa pun menurut Pastryseharusnya tidak masalah. Dan kecuali Anda membutuhkan fungsi itu, tidak perlu untuk mengimplementasikannya. Dan tidak ada alasan di dunia mengapa Anda tidak dapat menambahkannya setelah itu, kecuali jika tidak ada penghalang abstraksi yang jelas antara CookieSourcedan layanan yang digunakannya.

Saat membuat perangkat lunak, tambahkan fungsionalitas sesuai kebutuhan dan cobalah untuk tidak mengunci diri Anda dalam setiap keputusan yang Anda buat. Alih-alih mengunci keputusan menjadi abstraksi yang sesuai .

back2dos
sumber
1

Solusi paling sederhana yang saya temukan adalah mengharapkan perubahan saat menulis kode di muka. Ketika saya memberikan bool ke suatu fungsi, saya biasanya mengubahnya sesegera mungkin menjadi flag / enums sehingga a) lebih mudah dibaca dan b) mudah diperluas. Mirip, jika saya perhatikan bahwa saya melewati banyak parameter di mana baunya seperti saya akan membutuhkan satu lagi, saya biasanya membuat struktur khusus. Harapannya adalah bahwa YAGNI itu, tetapi jika Anda melakukannya pada suatu titik, itu tidak akan menghancurkan semua pengguna segera dan "pekerjaan kasar" sudah dilakukan. Cukup sering, Anda juga bisa menambahkan beberapa komentar seperti / * penambahan di masa depan masuk di sini * / atau jadi sudah jelas bahwa itu belum diterapkan tetapi di sinilah tempat untuk menambahkannya. Itu biasanya paling membantu, karena saya menemukan antarmuka refactoring nanti paling memakan waktu.

Anteru
sumber
Saya suka filosofi ini pada prinsipnya, tetapi dalam praktiknya saya menemukan bahwa migrasi cukup menyakitkan untuk membuat saya berpikir dua kali. Apakah Anda pernah menemukan bahwa memigrasi model Anda menghalangi perubahan?
Justin Myles Holmes
Hal yang baik tentang pendekatan ini adalah bahwa perubahan tidak terlalu menyakitkan; masih banyak pekerjaan yang harus dilakukan. Saya tidak yakin apa yang Anda maksud dengan model migrasi - Saya jelas berada di pihak YAGNI, tapi saya bersiap untuk yang terburuk :)
Anteru
0

Desain dengan ekstensi di masa depan, tetapi jangan menerapkan ekstensi itu sampai Anda membutuhkannya.

Contoh yang muncul dalam pikiran adalah ketika Netflix pertama kali dimulai, Anda hanya dapat memiliki satu antrian yang terkait dengan setiap akun. Mereka kemudian meretas dukungan untuk beberapa antrian. Karena tidak dirancang seperti itu sejak awal, itu menjadi semakin sulit untuk dipertahankan, sehingga mereka memutuskan untuk menghentikan fitur itu. Setelah keributan pelanggan, mereka menggigit peluru dan melakukan desain ulang untuk mengintegrasikan beberapa antrian dengan benar.

Jika seseorang pada awalnya telah memungkinkan untuk kemungkinan mereka menginginkan banyak antrian nanti, mereka bisa menyelamatkan diri mereka dari banyak kesedihan jangka panjang untuk sedikit usaha tambahan jangka pendek. Mereka tidak harus benar-benar mengimplementasikan banyak antrian segera, pastikan jika mereka pernah melakukannya tidak akan memerlukan penulisan ulang yang besar atau peretasan yang tidak dapat dipertahankan.

Di permukaan, sepertinya itu akan membutuhkan kemampuan peramal seperti keberuntungan untuk memprediksi kebutuhan di masa depan, tetapi dalam praktiknya hal-hal seperti itu cenderung menonjol pada seorang programmer yang baik ketika ia memperhatikan bahwa ia sedang meng-coding sesuatu, atau bahwa tabel database sedang mengumpulkan banyak kolom yang hanya samar-samar terkait.

Karl Bielefeldt
sumber