Setiap Penulisan Ulang Selalu Dianggap yang Terakhir
Saya menulis ulang komponen inti yang sama dari sistem saya sebanyak tiga kali. Bukan ditambal, bukan di-refactor — dibangun ulang, nyaris dari nol, tiga kali terpisah. Dan setiap kalinya, saya yakin bahwa versi inilah yang sebenarnya: arsitektur yang bersih dan benar yang akhirnya akan saya jadikan fondasi untuk selamanya.
Saya salah tiga kali berturut-turut, dengan keyakinan penuh setiap kalinya. Soal salah itu menjengkelkan. Keyakinan penuh itulah bagian yang sebenarnya ingin saya bahas, karena itu adalah perasaan yang sama yang berulang, dan saya tidak pernah sekali pun mengenalinya sebagai peringatan.
”Kali ini benar”
Ada sensasi tertentu yang muncul saat penulisan ulang yang segar. Kode lama berantakan — kau bisa melihat setiap kompromi, setiap tambalan, setiap tempat di mana kenyataan memaksamu untuk menekuk. Desain baru, yang tertata bersih di kepalamu, tidak punya satu pun dari itu. Ia elegan. Ia jelas. Ia nyata-nyata lebih baik.
Maka kau robohkan benda lama itu dan membangun yang baru, dan untuk sementara terasa seperti kemajuan, karena kode baru memang benar-benar lebih bersih. Lalu kau mulai menggunakannya, dan penekukan itu mulai lagi, dan beberapa waktu kemudian kau berdiri di hadapan kekacauan kedua, merasakan gatal yang persis sama untuk memulai dari awal lagi.
Mengapa penulisan ulang selalu tampak lebih baik
Perbandingannya curang, dan butuh tiga putaran bagi saya untuk melihat caranya. Ketika kau menilai sebuah penulisan ulang, kau membandingkan desain yang segar dan diidealkan terhadap desain lama yang telah menghabiskan berbulan-bulan menyerap gesekan dari penggunaan nyata. Tentu saja yang baru tampak lebih baik. Ia belum menghadapi satu pun masalah.
Kode lama tampak buruk bukan hanya karena ia dirancang secara tidak sempurna, tetapi karena ia mengenakan pengalamannya. Banyak percabangan canggung di dalamnya adalah bekas luka dari edge case nyata — hal-hal yang dilemparkan dunia kepadanya yang desain baru yang bersih itu belum pernah harus bertahan menghadapinya. Kau tidak selalu membandingkan desain bagus dengan desain buruk. Sering kali kau membandingkan seorang veteran dengan seorang rekrutan baru dan terkesan dengan betapa tak bercacatnya rekrutan itu.
Biaya yang terus saya bayar
Setiap penulisan ulang membuang lebih dari sekadar kode. Ia membuang pengetahuan — penanganan yang terkumpul dan diperoleh dengan susah payah atas semua situasi aneh yang telah diam-diam dipelajari versi lama untuk dihadapi. Dan karena pengetahuan itu hidup di dalam kode, bukan di kepala saya, membangun ulang berarti menemukannya kembali: menabrak kasus-kasus aneh yang sama lagi, men-debug masalah yang sama lagi, membayar untuk kedua dan ketiga kalinya demi pelajaran yang sudah saya beli.
Ada jenis kelelahan tertentu dalam memperbaiki sebuah bug dan menyadari bahwa kau telah memperbaiki bug yang persis ini sebelumnya, dalam versi kode yang sudah tidak ada lagi. Itulah sebagian besar dari penulisan ulang ketiga saya — perlahan memperoleh kembali pengetahuan yang sudah saya buang di penulisan ulang kedua.
Hal di baliknya: abstraksi prematur
Mesin sesungguhnya dari semua pembangunan ulang ini adalah sebuah kesalahan dalam cara saya memikirkan desain. Saya terus menulis ulang karena saya terus mencoba menemukan struktur yang benar sebelum saya benar-benar memahami masalahnya. Saya memperlakukan abstraksi yang benar sebagai sesuatu yang bisa saya rancang dengan benar di muka, asalkan saya cukup pintar.
Dalam pengalaman saya, abstraksi yang berguna jarang sekali dirancang dengan benar di muka; ia diperoleh melalui penggunaan. Abstraksi itu datang dari hidup bersama masalah cukup lama untuk belajar di mana ia benar-benar menekuk — bagian mana yang berubah-ubah dan mana yang tetap, di mana sambungan sejatinya berada. Merancangnya sepenuhnya di awal adalah menebak, dan setiap penulisan ulang hanyalah saya menebak lagi, sedikit lebih berinformasi, tetapi masih jauh sebelum saya cukup belajar untuk bisa menebak dengan baik.
Kapan penulisan ulang benar-benar sepadan
Saya tidak ingin mengklaim bahwa penulisan ulang selalu salah. Kadang sebuah desain memang tidak bisa diregangkan ke tempat yang kau butuhkan, dan mengembangkannya di tempat akan lebih mahal daripada memulai dari awal. Pembedaan yang akhirnya saya pelajari untuk ditarik adalah tentang sumber dorongannya.
Penulisan ulang yang digerakkan oleh pemahaman baru yang sejati tentang masalah — “saya sekarang melihat bahwa benda yang saya perlakukan sebagai satu konsep sebenarnya dua” — sering kali merupakan kemajuan nyata. Penulisan ulang yang sebagian besar digerakkan oleh ketidaknyamanan dengan kode saat ini — “ini jelek, saya ingin sesuatu yang bersih” — lebih sering merupakan gerakan yang mengenakan lapisan cat baru. Yang pertama lebih mungkin menghasilkan kemajuan struktural yang berarti. Yang kedua sebagian besar hanya mengubah bagaimana perasaanmu tentangnya selama beberapa minggu, sampai benda baru itu menjadi jelek juga.
Solusinya: tekuk di tempat, sampai kau benar-benar tidak bisa
Kebiasaan yang saya bangun adalah menurunkan penulisan ulang dari insting pertama menjadi pilihan terakhir. Dihadapkan pada struktur yang menjengkelkan saya, saya kini mencoba mengubahnya di tempat terlebih dahulu — membentuknya kembali, me-refactor-nya, membiarkannya mempertahankan pengetahuan yang terkumpul sementara saya menggesernya menuju apa yang saya butuhkan. Saya berusaha menyimpan pembangunan ulang penuh untuk saat struktur yang ada benar-benar melawan setiap upaya untuk mengembangkannya, bukan sekadar ketika ia menyinggung rasa kerapian saya.
Sering kali, ketidaknyamanan yang membuatmu ingin memulai dari awal itu adalah informasi, bukan vonis. Itu adalah kode yang memberitahumu di mana ia sakit — dan itu persis pengetahuan yang akan kau buang dengan membangun ulang dari nol.
Keyakinan itulah pertandanya
Benang yang mengalir melalui ketiga penulisan ulang itu bukanlah kode yang buruk. Ia adalah sebuah perasaan: keyakinan yang bersih dan total bahwa kali ini saya sudah benar. “Ini adalah arsitektur final” adalah kalimat yang, pada intinya, saya ucapkan sebelum setiap penulisan ulang. Bahwa sebuah kalimat terus-menerus terbukti salah seharusnya menurunkan kepercayaanmu padanya, dan perlahan memang begitu.
Keyakinan kuat tentang sebuah desain yang belum kau uji-tekan bukanlah hal yang sama dengan wawasan. Itu sering kali hanyalah ketiadaan bekas luka yang seharusnya mengajarimu sebaliknya — kepercayaan diri yang nyaman dari sebuah rencana yang belum bertemu dunia. Belakangan ini, ketika saya merasa benar-benar yakin bahwa sebuah desain baru adalah yang final, saya berusaha memperlakukan perasaan itu sendiri sebagai petunjuk bahwa saya mungkin belum hidup bersama masalah itu cukup lama untuk dipercaya dengan pendapat tersebut.
— Tanpa sinyal, tanpa imbal hasil, bukan nasihat investasi.