Membina perisian boleh terasa seperti satu persembahan awam. Internet memberi ganjaran kepada pelancaran, tangkapan skrin, dan poin-poin senarai perubahan (changelog). Jadi, apabila seorang pembangun menghabiskan keseluruhan sesi pada satu projek dan tidak mempunyai apa-apa yang nyata untuk ditunjukkan, naluri mereka adalah untuk menganggap hari itu sebagai sia-sia. Log pembangunan (dev log) terbaru daripada Platform Blog Makanan membuktikan sebaliknya. Tiada resipi baharu untuk dipaparkan, tiada kad yang direka semula, tiada butang tambahan untuk diklik oleh pengguna. Hanya kod yang diurai, diperiksa, dan disusun semula dengan lebih baik daripada sebelumnya.
Inilah kerja tidak kelihatan yang memastikan kelangsungan projek jangka panjang.
Ciri-ciri Mendapat Kemasyhuran; Refactoring Memastikan Operasi Terus Berjalan
Apabila anda menyelenggara sebuah platform blog makanan, permukaannya kelihatan ringkas. Pengguna menghantar resipi, memuat naik foto, dan melayari mengikut kategori. Namun, di bawahnya, anda sedang menguruskan saluran paip imej (image pipelines), hubungan pangkalan data antara bahan dan arahan, indeks carian, dan lapisan caching. Lama-kelamaan, penyelesaian pantas akan bertimbun. Satu fungsi pembantu (helper function) yang disalin ke dalam tiga fail berbeza. Satu pertanyaan pangkalan data (database query) yang masuk akal untuk sepuluh hantaran tetapi menjadi sangat perlahan apabila mencecah seribu. CSS yang bermula dengan teratur sehinggalah lima tampalan kecemasan (emergency patches) mengubahnya menjadi seperti labirin.
Refactoring bermaksud menghadapi kekusutan tersebut secara berhadapan. Ia mungkin bermaksud menyatukan logik pendua supaya borang penyuntingan resipi dan papan pemuka admin menggunakan lapisan pengesahan (validation layer) yang sama dan bukannya mengekalkan versi yang selari. Ia mungkin bermaksud memudahkan cara imej diproses supaya rutin pemampatan berjalan sekali sahaja dan bukannya setiap kali halaman dimuat semula. Atau ia mungkin melibatkan penyusunan semula codebase supaya penambahan jenis kandungan baharu pada masa hadapan tidak memerlukan pencarian melalui enam direktori yang tidak berkaitan.
Semua ini tidak akan kelihatan pada antara muka pengguna (user interface). Pelawat yang melayari laman tersebut tidak akan melihat sepanduk yang tertulis "kueri dioptimumkan" atau "komponen dinyahpasang". Tetapi mereka akan merasainya apabila laman tersebut dimuatkan dengan lebih pantas. Mereka akan menyedari apabila ciri baharu muncul tiga hari selepas diminta, bukannya tiga minggu. Pembangun tidak menambah keupayaan hari ini. Mereka melapangkan jalan supaya keupayaan baharu boleh ditambah tanpa perlu bergelut dengan codebase.
Kod Bersih Adalah Pelaburan Menentang Kegagalan Masa Depan
Setiap projek yang bertahan lebih daripada sebulan akan mengumpul rintangan. Anda membina prototaip pantas untuk menguji idea. Kemudian pengguna benar-benar muncul. Kemudian anda memerlukan lapisan pengesahan (authentication layer), kemudian barisan moderasi, dan kemudian susun atur mudah alih. Setiap penambahan itu dipasang pada struktur sedia ada. Tanpa penyelenggaraan berkala, seni bina tersebut mula menyerupai sebuah rumah di mana setiap bilik baharu direka oleh orang berbeza yang tidak pernah melihat pelan lantai asal.
Hutang teknikal (technical debt) bukanlah kegagalan disiplin. Ia adalah hasil sampingan semula jadi daripada membuat timbal balik (trade-offs) untuk melancarkan sesuatu yang nyata. Bahayanya bukan kerana kod anda tidak sempurna. Bahayanya adalah membiarkannya tidak sempurna terlalu lama sehingga mengubah satu pemboleh ubah merosakkan tiga ciri lain yang tidak berkaitan. Anda mendapati diri anda takut untuk menyentuh bar carian kerana kali terakhir anda mencubanya, sistem tag telah rosak. Anda menangguhkan penambahan widget perancang hidangan kerana anda tahu skema pangkalan data telah menjadi simpulan yang akan mengambil masa berjam-jam untuk dileraikan.
Menghabiskan masa sehari untuk refactoring adalah seperti membayar hutang tersebut sebelum faedahnya melampaui kemampuan anda. Ia menghalang masalah kecil daripada menjadi masalah besar. Apabila Platform Blog Makanan akhirnya menambah ciri utama seterusnya, pembangun tidak perlu bergelut dengan kod yang rapuh. Mereka akan menulis logik baharu, memasukkannya ke dalam antara muka yang bersih, dan meneruskan kerja. Itulah pulangan pelaburan (return on investment).
Langkah Kecil, Pembelajaran Sebenar
Terdapat mitos dalam pembangunan perisian yang mengatakan bahawa kemajuan kelihatan seperti penemuan genius dan sesi pengekodan maraton yang menulis semula segalanya dalam semalam. Kebanyakan pembangun profesional akan memberitahu anda bahawa itu hanyalah fantasi. Kemajuan sebenar kelihatan seperti perbezaan (diff) pada petang Selasa di mana tiga fungsi menjadi lebih pendek, satu kebergantungan (dependency) yang berlebihan telah dibuang, dan nama pemboleh ubah yang mengelirukan telah ditukar supaya pembaca seterusnya benar-benar faham fungsinya.
Log pembangunan Platform Blog Makanan merakam rentak ini dengan sempurna. Membina perisian adalah tentang penambahbaikan kecil yang konsisten. Anda belajar daripada setiap cabaran. Mungkin hari ini cabarannya adalah memahami mengapa modul tertentu menjadi sangat bergantung kepada modul yang lain. Mungkin ia adalah menyedari bahawa jalan pintas yang diambil dua minggu lalu telah mula memakan lebih banyak masa daripada yang dijimatkannya. Setiap commit menjadikan projek lebih baik, walaupun commit tersebut memadam lebih banyak daripada apa yang diciptanya.
Pendekatan ini juga melindungi motivasi anda. Penulisan semula secara besar-besaran adalah memenatkan dan berisiko. Ia memperkenalkan pepijat baharu semasa menyelesaikan pepijat lama. Refaktor secara berperingkat, dilakukan
