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?
design-patterns
language-agnostic
philosophy
Justin Myles Holmes
sumber
sumber
Jawaban:
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.
sumber
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
Cara Zen Python mengatakan:
Idenya adalah bahwa itu bukan karena Anda dapat mendefinisikan sesuatu sekarang yang seharusnya. Apakah Anda membutuhkannya sekarang?
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!
sumber
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.
sumber
Mereka ortogonal dan tidak ada hubungannya satu sama lain.
Um Apakah mereka berdua? Apa lagi yang bisa ada?
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.
sumber
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 aCookieFactory
untuk mengubahCookieRecipes
itu menjadiCookies
, berdasarkan beberapa parameter input Anda, makaCookieSource
tidak perlu dan dengan demikian tidak harus bergantung pada bagaimanaCookieFactory
diterapkan dan bagaimanaCookieRecipes
diwakili.Jika
CookieFactory
itu sebenarnya aBakery
, itu bisaRecipe
menjadi apa pun menurutPastry
seharusnya 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 antaraCookieSource
dan 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 .
sumber
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.
sumber
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.
sumber