Bagaimana Anda menjelaskan tentang refactoring (dan utang teknis) kepada orang non-teknis (biasanya PHB atau pelanggan)? ("Apa, itu akan menghabiskan biaya sebulan untuk pekerjaanmu tanpa perbedaan yang terlihat ?!")
UPDATE Terima kasih atas semua jawaban sejauh ini, saya pikir daftar ini akan memberikan beberapa analogi yang bermanfaat yang dapat kami tunjukkan kepada orang yang tepat (meskipun mengedit referensi ke PHB mungkin bijaksana!)
Jawaban:
Ketika Anda memiliki teater rumah besar dan Anda menambahkan sesuatu, perlahan-lahan tapi pasti sarang tikus besar terbentuk di belakang.
Jika Anda sering mengganti komponen, terkadang ada baiknya meluruskan semua itu.
Tentu, jika Anda melakukan itu, itu berhasil sebelumnya, dan itu tidak akan bekerja lebih baik daripada ketika Anda mulai, tetapi ketika Anda harus mengacaukannya lagi, segalanya akan jauh lebih mudah.
Dalam hal apa pun, mungkin yang terbaik untuk membuat perbandingan yang serupa dengan beberapa bidang studi yang sudah dikenal oleh PHB atau pelanggan, yaitu mobil atau konstruksi atau sesuatu ...
sumber
Re-factoring sama seperti proses pengemasan ulang koper sampai semuanya pas. Terkadang, dalam prosesnya, Anda bertanya-tanya mengapa Anda mencoba untuk mendapatkan begitu banyak sampah di sana untuk memulai.
sumber
Saya tidak akan menjelaskan konsep hutang teknis, karena itu tidak perlu. Alih-alih, fokuslah pada refactoring: Anda mengubah desain program Anda, tidak harus sehingga "lebih baik" atau "ditingkatkan", Anda mengubahnya sehingga dapat menerima perubahan yang perlu Anda buat.
Analogi mobil mungkin cocok: Anda perlu menambahkan AC ke mobil, tetapi awalnya tidak dirancang untuk itu. Anda tidak hanya harus membuat AC aneh berbentuk L, tetapi Anda juga harus memindahkan beberapa hal lain terlebih dahulu dan mengubah sistem ventilasi.
Saya juga berpikir itu adalah strategi yang lebih baik untuk refactor ketika Anda mengakomodasi fitur-fitur baru: jika tidak, Anda mungkin mengubah desain menjadi sesuatu yang hanya terlihat "lebih baik," tetapi sebenarnya mungkin kurang cocok dengan keadaan di sekitar penambahan fitur Anda berikutnya.
sumber
Saya menggunakan istilah Hutang Teknis dan menghubungkannya langsung dengan sesuatu yang mereka pahami - Hutang Korporat. Utang Teknis seperti mengambil pinjaman. Anda membayar bunga untuknya. Misalnya, Anda dapat membangun pabrik baru dan membayarnya langsung atau Anda dapat memperoleh pinjaman untuk itu. Jika Anda mendapatkan pinjaman, Anda akan benar-benar membayar lebih untuk jangka panjang, tetapi masuk akal secara finansial jika persyaratannya benar .
Namun, jika Anda membayar bunga 25% untuk pinjaman seperti itu, Anda menempatkan diri Anda pada posisi yang tidak berkelanjutan. Ini sama dengan utang teknis. Terkadang masuk akal untuk mengambil utang teknis. Namun, ada titik di mana bunganya terlalu tinggi dan harus dilunasi. Beberapa hutang techincal seperti pinjaman rumah dan beberapa lainnya seperti hutang kartu kredit. Dalam keadaan darurat, hutang kartu kredit adalah aset yang penting dan berharga. Namun, itu juga dapat merusak bank (atau rumah tangga jika Anda pilih) jika digunakan secara tidak bijaksana.
Contoh lain: Anda dapat membayar $ 10.000 untuk pengiriman surat pemasaran untuk mendapatkan lebih banyak arahan untuk penjualan di masa mendatang. Anda membayar "hutang penjualan". Ini merupakan pengeluaran dengan imbalan jangka panjang. Menyamakan ini dengan mengapa Anda ingin "menghabiskan" uang sekarang refactoring sepotong kode. Dalam kedua kasus tidak ada imbalan langsung, tetapi Anda menyiapkan diri Anda untuk kinerja yang lebih baik di masa depan.
Saya cenderung menggunakan istilah "utang xxxx" sebagai analogi ketika berbicara dengan siapa pun audiens targetnya. Misalnya, Hutang Operasional - Mesin cetak yang kita miliki sekarang berfungsi dengan baik, tetapi dengan menghentikan produksi selama satu hari (atau satu minggu) dan meningkatkan ke mesin baru kita dapat meningkatkan output sebesar 25%.
EDIT - Ini adalah pandangan lain tentang ini
sumber
Membersihkan musim semi.
Anda tidak melakukan modifikasi apa pun di rumah. Anda hanya memindahkan barang-barang dan menyingkirkan debu. Mungkin membuang beberapa hal yang tidak Anda gunakan atau butuhkan lagi. tetapi Anda tidak menambahkan apa pun.
sumber
"Apakah Anda pernah memainkan Mouse Trap ? Saat kami menggunakan fitur baru, mengubah antarmuka, dan memperbaiki bug, kode dapat mulai terlihat seperti itu. Ada saatnya kita harus mengeluarkan banyak modal (waktu dan usaha) , yang berarti sejumlah uang) memastikan semua bagian yang bergerak bermain dengan baik dengan setiap perubahan atau penambahan baru, atau kita dapat menyisihkan waktu untuk memperbaiki desain, sehingga lebih sedikit bagian bergerak yang harus kita kelola setiap kali kita melakukan perubahan. mungkin terlihat , dari perspektif pengguna akhir, bahwa refactor tidak memiliki manfaat apa pun, tetapi manfaat terjadi setiap kali fitur baru ditambahkan pasca-refactor. Prosesnya lebih cepat, memperkenalkan lebih sedikit bug, dan lebih murah setelahnya, belum lagi bahwa kode refactored sering lebih efisien secara keseluruhan.
Anda mungkin bertanya-tanya mengapa kami membiarkannya mulai terlihat seperti Mouse Trap:
Dalam upaya untuk terus membangun perangkap tikus yang lebih baik, kita harus terus-menerus kembali dan menemukan tempat untuk mengurangi kerumitan dan merampingkan apa yang kita miliki. Ini perbedaan antara hanya memiliki perangkat lunak dengan banyak fitur, dan memiliki perangkat lunak yang benar-benar berkualitas tinggi. "
sumber
Ini adalah versi analogi home theater yang sedikit lebih grafis.
Jika Anda ingin menambahkan satu lagi alat baru [alias, fungsionalitas baru], dalam keadaan darurat Anda mungkin dapat memasangnya di suatu tempat.
Jika Anda ingin menambahkan alat lain, Anda dapat membeli ekstensi, yang akan memberi Anda waktu.
Tetapi pada setiap penambahan, menjadi lebih sulit untuk menemukan solusi. Dan Anda mengekspos diri Anda untuk risiko 1 api [alias bug], dan Anda akan harus menarik keluar uang besar untuk membayar seseorang untuk menempatkan soket baru ke dinding, yang bisa sangat mungkin meningkat sepanjang jalan sampai ke utama papan sirkuit, atau lebih jauh.
1 Hal lain yang tidak disukai PHK dengan baik: "Ya, jika itu hanya bisa terjadi, apa yang Anda khawatirkan?"
sumber
Refactoring - seperti mengatur lemari pakaian / Laci Alat Anda.
Anda tidak membuang pakaian / peralatan Anda hanya karena mereka ada di semua tempat.
Anda bisa berpendapat bahwa mereka seharusnya tidak pernah berantakan. Tetapi mereka melakukannya.
Sama seperti kode. Terutama karena ia tumbuh seiring waktu.
Dan jika Anda tidak membersihkannya, Anda akan terus bertanya-tanya apa yang terjadi pada kaus yang Anda cintai atau kunci pas yang selalu Anda butuhkan tetapi tidak pernah dapat ditemukan!
sumber
Saya akan mengatakan "pemeliharaan kode" . Sangat penting untuk menggunakan kata-kata yang akrab dengan orang non-teknis dan masuk akal untuk pandangan dunia non-teknis. Jika orang non-teknis (pelanggan) terbiasa dengan pemeliharaan aplikasi, maka mudah untuk membuat paralel pemeliharaan kode dan pemeliharaan aplikasi. Bahkan jika mereka tidak sama, Anda dapat menjelaskan bahwa pelanggan akhir di sini adalah pengembang atau mereka yang memelihara sistem.
sumber
Katakanlah Anda adalah mekanik yang berspesialisasi dalam menyesuaikan mobil, bahkan membuatnya dari awal jika pelanggan membutuhkannya. Ada pelanggan ini yang sering kembali ke toko Anda untuk selalu menaruh barang mengkilap baru di limusinnya yang berukuran super.
Begitu dia datang untuk memiliki sistem suara yang bagus diinstal. Anda rajin melakukan tugas melewati kabel dan menghubungkan semuanya dengan benar. Dia keluar sehari kemudian, dia bahagia dan membayar mahal, seperti biasa.
Bulan berikutnya dia kembali tetapi kali ini dia ingin home theater yang penuh sesak dipasang. Sekali lagi, Anda mengambil limusin. Menjadi seorang profesional Anda meninjau kembali sistem suara dan membuatnya lebih mudah untuk dirawat dengan memasang sistem tabung untuk menjalankan kabel di sekitar mobil. Dengan cara ini kabel terlindungi dan lebih mudah ditarik dan harus Anda tambahkan lebih banyak juga akan mudah dilakukan. Jadi Anda merobek kabel lama, memasang tabung dan melewatkan sistem suara dan kabel tambahan untuk bioskop, tutup semuanya dan Anda selesai.
Menyadari bahwa pelanggan tidak meminta Anda untuk mengganti sound system lama, Anda mencoret sebagian biaya penggantian dan tabung. Namun Anda masih menghasilkan uang dari kesepakatan, Hanya saja tidak sebanyak yang Anda miliki, Anda baru saja melempar sistem seperti yang Anda lakukan pertama kali.
Satu bulan kemudian dia kembali, kali ini dia menginginkan sistem pencahayaan dan dia ingin speaker baru merusak yang lama di awal minggu.
Karena Anda menjaga semuanya bagus dan rapi, Anda dapat dengan cepat menjalankan kabel pencahayaan baru melalui tabung Anda, menginstal sistem dan mengganti speaker. Namun kali ini Anda melakukan jauh lebih cepat, anjak piutang terbayar dengan membuat Anda tetap di atas permainan Anda.
Pesaing Anda yang menertawakan Anda karena merobek kabel yang sangat bagus dan memasang semua pipa tambahan ini masih berjuang untuk membuat pelanggannya puas. Tentu saja dia sudah melakukan lebih cepat daripada Anda sebagian besar kali, tetapi seiring berjalannya waktu pelanggannya mengeluh bahwa ada semakin banyak penundaan dan kualitas pekerjaan secara keseluruhan merendahkan.
Melihat ini, Anda menyadari bahwa tujuan Anda untuk tidak hanya bertahan dalam bisnis tetapi untuk menjadi yang terbaik adalah menyeimbangkan apa yang Anda lakukan untuk memenuhi permintaan pelanggan dan apa yang Anda lakukan untuk membuat hidup Anda lebih mudah di jalan. Sangat jarang seorang pelanggan akan membayar keduanya sehingga Anda harus mengelola dengan cermat. Anda bertaruh bahwa dengan secara proaktif melakukan sesuatu dengan benar bahkan dengan biaya melakukan dua kali Anda akan menjaga biaya pemeliharaan pada persentase stabil yang stabil dari produktivitas Anda.
Perangkat lunaknya sama, kecuali programmer dapat bermain dengan lakban digital untuk SANGAT lama sebelum efeknya benar-benar dirasakan oleh pelanggan dan manajer. Sayangnya pada saat itu biaya melakukan kembali hal-hal yang benar tumbuh secara eksponensial sehubungan dengan berapa banyak lakban hadir dan usia rata-rata lakban tersebut.
Inilah sebabnya mengapa penting bagi kami untuk terus memfaktorkan ulang sistem. Sangat sering pengalaman akan menunjukkan kepada kita cara baru yang lebih efisien untuk melakukan hal yang sama atau kita dapat menggabungkan fungsi serupa dan mengeksploitasi redudansi alih-alih hanya menyalin melewatinya. Inilah cara kami menjaga sistem tetap ramping dan berarti. Waktu akan menunjukkan bahwa terus-menerus memfaktorkan ulang sistem untuk memenuhi permintaan akan menjaga produktivitas konstan dengan mengendalikan jumlah yang ditempatkan dalam pemeliharaan.
Menempatkan lakban sebentar akan meningkatkan produktivitas dengan biaya membawa sistem yang kurang optimal. Hutang teknis timbul setiap kali produktivitas langsung lebih disukai sehingga merugikan aspek-aspek lain dari suatu sistem. Analogi utang itu baik karena seperti halnya bunga atas modal yang dipinjam menggerogoti keuntungan waktu yang dipinjam membuat hal-hal dengan cepat menimbulkan pemeliharaan yang lebih tinggi dan meningkatkan kerapuhan sistem memaksa tim untuk menghabiskan sumber daya tambahan dalam mempertahankan daripada menciptakan. Sama seperti kerabat keuangannya, jika pinjaman terus berlanjut, sebagian besar sumber daya dihabiskan untuk pembayaran bunga dan hanya sedikit perbaikan. Utang teknis akan menggerogoti sumber daya teknis ke titik di mana sebagian besar sumber daya dihabiskan hanya menjaga sistem berjalan grinding untuk menghentikan semua peningkatan lainnya yang mungkin.
Jadi pada akhirnya pertanyaannya adalah bukan seharusnya kita atau tidak seharusnya kita lakukan tetapi apakah etis membiarkan manajer dan pelanggan percaya bahwa mereka dapat mengandalkan angka produktivitas yang secara artifisial menggembung dengan penggunaan selotip digital. Beberapa orang akan berpikir itu adalah keputusan bisnis tetapi terus terang ini hanya karena manajer tidak memahaminya. Pada akhirnya, seseorang harus membayar hutang baik melalui anjak piutang yang berat atau dengan bermigrasi ke sistem baru. Pada akhirnya bagi kami, pemrogram, untuk menjaga sistem tetap terpelihara, Anda tidak perlu meminta faktor karena itu adalah bagian yang melekat dalam pekerjaan, gagal memahami ini gagal memahami apa itu rekayasa perangkat lunak. Ini mengatakan, saya menyadari ada sistem di luar sana yang telah mengeluarkan hutang penting dan melunasi hutang ini akan membutuhkan keputusan dari para pembayar. Pekerjaan Anda adalah situasi seperti itu untuk setidaknya melakukan bagian Anda untuk berhenti meminjam. Hutang ini dikeluarkanOLEH AS, mungkin karena kami tidak tahu yang lebih baik, karena kami ditekan untuk melakukannya, tetap saja, kami mengambil hutang ini dan sangat sering orang-orang yang kami serahkan hutang itu tidak memahaminya, sehingga tidak bisa mengelolanya dengan baik.
Ini perangkat lunak Anda, semuanya sudah selesai, semoga Anda menyukainya .... Ngomong-ngomong, saya maksimalkan kartu kredit Anda melakukannya, semoga Anda tidak keberatan ... cya
sumber
Tujuan re-factoring adalah menyederhanakan desain dan menghilangkan ketidakefisienan. Ini membuatnya lebih mudah untuk memperbaiki bug dan menambahkan fitur baru di masa depan.
Jika Anda terus menambahkan fitur baru ke kode, re-factoring akan dengan cepat membayar sendiri. Ini akan terlihat dalam tingkat kesalahan yang lebih rendah, debugging lebih cepat dan perbaikan lebih cepat.
sumber
clever == 0
begitu2 * clever == 0
...Perangkat lunak menulis sangat mirip dengan menulis buku non-fiksi besar, atau ensiklopedia.
Draf pertama selalu menyebalkan. Itu selalu dapat ditingkatkan dengan mengatur ulang, menghapus bagian yang tidak perlu ada di sana, dan memastikan gaya yang konsisten di seluruh.
Kapan pun Anda harus merevisi, hal paling sederhana untuk dilakukan adalah menambahkan bagian baru, mengubah beberapa kata, dan sebagainya. Tetapi ketika revisi menumpuk, buku itu mulai kehilangan organisasinya. Jadi Anda harus membuat langkah reorganisasi lebih lanjut. Jika tidak, buku itu menjadi serakan yang tidak masuk akal.
sumber
Ambil komputer desktop Anda misalnya. Anda memiliki menara, monitor, keyboard, mouse, printer, pemindai, dan speaker. Pada akhirnya yang Anda inginkan adalah meja yang terorganisir dengan baik. Jadi Anda cukup mencolokkan semuanya, dan beberapa menit kemudian, lihatlah, semuanya diatur seperti yang Anda inginkan. Yah ... hampir seperti yang Anda inginkan.
Sehari kemudian ketika Anda mengubah keseimbangan pada speaker Anda, Anda menyadari bahwa Anda secara tidak sengaja meletakkan speaker kiri dan kanan Anda di area yang salah, sehingga Anda ingin menukar posisi mereka. Tapi oh tidak! Ada rimba tali kusut; ketika Anda melanjutkan untuk memindahkan speaker, kabel mouse Anda ketagihan, dan sekarang mouse Anda diseret bersama dengan speaker. Selain itu, keyboard Anda sekarang tidak memiliki kelonggaran - Anda dulu dapat memindahkannya dari meja ke pangkuan Anda.
Baiklah, Anda bisa mencabut mouse dan keyboard dan memasangnya kembali sehingga semuanya sudah diperbaiki. Tetapi ini tidak akan membantu dengan reorganisasi masa depan dan penambahan masa depan. Juga menenun kabel mouse dan keyboard Anda melalui hutan adalah hal yang merepotkan.
Solusi yang lebih baik adalah dengan memasang kembali semuanya untuk memasangnya kembali dengan cara yang rapi dan bersih di mana setiap kabel tidak mengganggu kabel lainnya. Sekarang perubahan di masa depan mudah dan terus menjadi mudah. Anda berinvestasi sedikit di depan untuk keuntungan besar nanti.
Poin kuncinya adalah bahwa solusi asli sebagian besar BEKERJA. Itulah hal tentang refactoring: ini bekerja untuk memulainya, tetapi Anda perlu mengubah bagaimana hal-hal yang sudah ada untuk dengan mudah membuat perubahan di masa depan (menggerakkan speaker).
sumber
Ini seperti membersihkan rumah setelah pesta liar dan gila dari malam sebelumnya.
Katakanlah ruang tamu benar-benar hancur. Rumah itu masih rumah, ruang tamu masih ruang tamu. Ini bekerja tetapi tidak seperti yang seharusnya. Setelah menatap kekacauan Anda menyadari bahwa itu perlu dibersihkan.
Jadi, Anda mulai mengantongi sampah. Terlihat lebih baik. Jadi, Anda melihat-lihat ruangan dan memutuskan untuk meluruskan perabotan. Anda meletakkan satu bagian kembali, lalu yang berikutnya dan yang berikutnya. Wow, ruangannya terlihat sangat bagus. Kamu bangga.
Kakakmu masuk dan mengatakan ruangan itu seperti sampah, kamu harus memperbaiki rak buku dan mengosongkan karpet. Dia benar. Kamarnya terlihat sangat, sangat bagus.
Anda melihat sekeliling dan melihat bahwa nuansa jendela akan terlihat jauh lebih baik jika semuanya pada ketinggian yang sama. Selesai. Wow, kamarnya luar biasa.
Perlakukan kode Anda dengan cara yang sama.
sumber
Mudah!
Ambillah dengan sebuah contoh ... setiap orang dalam hidup mereka menulis surat kepada orang yang saya kasihi. Itu pasti seseorang yang tersayang karena dalam surat-surat itu kita biasanya memperhatikan komposisi juga.
Jadi, Anda memiliki teks Anda, ... artinya akan melalui kedua cara, tetapi Anda ingin semuanya terdengar bagus! Baik?
Refactoring, hal yang sama ... informasi yang sama, lebih atau kurang, tetapi komposisinya lebih baik. Dan itu mungkin akan menghasilkan ulasan yang lebih baik oleh pembaca.
Contoh lain - menulis artikel untuk majalah. Dua penulis, keduanya tahu "barang-barang mereka", satu-satunya perbedaan adalah satu tahu "bagaimana menulis" dan yang lainnya menulis seperti ia belajar menulis dari jawaban seperti ini.
Artikel siapa yang akan Anda ingat?
sumber
Semua analogi dengan hal-hal di dunia fisik - seperti membangun teater - adalah, IMO, mengerikan.
Anda perlu menjelaskan bahwa kode refactoring seperti ... kode refactoring. Perangkat lunak dapat ditempa dengan cara yang bukan analog fisik. Ketika segala sesuatunya menjadi semakin kompleks, kita harus reaktor (atau mengulang, seperti yang Anda inginkan) bagian basis kode yang besar atau kecil sehingga kita dapat terus meningkatkan kompleksitas tanpa menjadi gila.
Mengapa kami melakukan refactor? Karena kode yang tidak pernah di refactored biayanya lebih tinggi per menit untuk dipertahankan dan diubah, dan akhirnya menjadi lebih bermasalah.
Apa yang sangat menarik tentang refactoring adalah bahwa kita mengulang basis kode tetapi, setidaknya pada awalnya, fungsionalitasnya tetap sama.
sumber
Re-factoring sama dengan membersihkan sesuatu dan memberikan barang tempat baru untuk 'menginap'
Mudah sederhana dan sesuatu yang bisa memakan banyak waktu. Kadang-kadang saya bahkan menambahkan bahwa orang X meninggalkan banyak hal dan saya harus membersihkannya.
sumber
Saya memikirkan contoh lain, yang tampaknya tidak ada yang disebutkan di sini: refactoring hampir sama persis dengan menata ulang persamaan dalam matematika (meskipun itu mungkin berada di luar ruang lingkup 'orang non-teknis, saya kira).
Saat Anda menyusun ulang persamaan, Anda hanya 'memindahkan barang' agar lebih mudah dibaca dan lebih dapat digunakan, tanpa mengubah artinya .
sumber
Beri mereka persamaan matematika sederhana. Sebagai contoh:
Mana yang lebih sederhana?
atau
Refactoring adalah konsep serupa kecuali alih-alih persamaan matematika sederhana, Anda memasukkan algoritma. Gagasan utamanya adalah Anda dapat bertukar antara dua cara dalam melakukan sesuatu karena keduanya akan menghasilkan hasil yang sama.
Refactoring paling sederhana yang bisa dilakukan adalah mengubah nama.
Sekarang karena kita tidak benar-benar ingin hal-hal disebut doX karena kita tidak benar-benar tahu apa artinya, kita mengubah nama menjadi sesuatu yang lebih jelas dan menggantikan di mana saja kita telah menggunakannya.
Ini akan menghemat uang Anda nanti ketika ada masalah atau peningkatan karena mengurangi waktu bagi orang untuk memahami dan memperbaiki aplikasi Anda. Untuk lebih menghemat uang, ada alat gratis yang berfungsi untuk Anda secara otomatis tergantung pada bahasa apa yang Anda gunakan. Alat-alat ini juga dilisensikan sehingga tidak membatasi dan akan mengharuskan Anda untuk melakukan sesuatu yang khusus selain mengakuinya jika Anda menggunakannya secara langsung.
sumber
Sebuah gambar mengatakan seribu kata. Misalnya, refactoring memiliki dua kasus penggunaan:
Referensi
xkcd: kode yang baik
xkcd: apakah ini sepadan dengan waktu?
sumber
Pertimbangkan jawaban yang diberikan dalam Refactoring , dan jangan menjelaskannya kepada orang yang tidak teknis. Refactoring adalah kegiatan teknis yang tidak perlu mereka ketahui:
(Refactoring, Martin Fowler, 2000, halaman 61)
Tentu saja ini tidak akan berhasil jika Anda akan menghabiskan satu bulan melakukan apa-apa selain refactoring, tapi saya pikir itu umumnya ide yang buruk, dan itu jauh lebih baik untuk hanya refactor sejauh yang diperlukan untuk membuat tugas Anda saat ini atau selanjutnya lebih mudah , atau untuk membersihkan kode yang baru saja Anda kerjakan.
sumber