Membaca git log sebagai praktik sepanjang karier

Kebiasaan membaca riwayat commit sendiri — bukan karena narsis, tapi karena itu satu-satunya catatan jujur tentang apa yang benar-benar kamu putuskan, dan apa yang ada di pikiranmu saat memutuskannya.

5 menit baca
  • craft
  • git
  • habits

Commit hash-nya adalah a3f8c21. Aku push pada Kamis sore di awal 2022. Pesan commit-nya berbunyi: fix.

Hanya itu isinya. fix.

Sekarang aku melihatnya di terminal, menjalankan git log --author="Arif" --since="2022-01-01" --until="2022-04-01" --oneline pada repo yang tidak aku sentuh selama delapan bulan. Riwayatnya bergulir lewat. Ada commit-commit bagus di sana — pesan dengan konteks nyata, alasan yang nyata. Tapi ada juga fix. Ada wip. Ada satu yang bertuliskan ok now for real yang tidak aku ingat pernah menulis dan tidak bisa sepenuhnya aku jelaskan.

Yang membuatku berhenti bukan rasa malu. Tapi kesadaran bahwa siapa pun yang push fix pada Kamis itu sedang bekerja cepat, di bawah tekanan, dan sudah memutuskan bahwa Arif-masa-depan bisa mengurainya sendiri. Arif-masa-lalu salah. Arif-masa-depan — yang sekarang adalah aku — tidak punya gambaran apa yang diperbaiki atau mengapa.

Aku menatap a3f8c21 sejenak. Ada sesuatu yang aneh tentang dihadapkan pada keputusan-keputusan dirimu sendiri yang telah ditelanjangi dari semua konteks aslinya.

Mengapa engineer hampir tidak pernah melakukan ini

Kita dilatih untuk selalu menatap ke depan. Semua alat menunjuk ke depan. Standup harian menanyakan apa yang kamu kerjakan hari ini dan apa yang menghalangimu — bukan apa yang ada di pikiranmu enam bulan lalu. Sprint board mengosong dari kiri ke kanan. Setiap alur kerja dalam pengembangan perangkat lunak dirancang untuk menggerakkanmu menuju hal berikutnya.

Membaca riwayatmu sendiri terasa mewah. Terlalu melihat ke dalam diri. Kerja itu ada di luar sana, sedang dikirim, bukan di sini, untuk direnungkan.

Menurutku itu keliru. Dan aku pikir kebanyakan engineer diam-diam menduga itu keliru, itulah mengapa topik ini membuat orang sedikit tidak nyaman ketika muncul.

Git log kamu adalah satu-satunya catatan tentang apa yang benar-benar kamu putuskan — bukan apa yang kamu rencanakan untuk diputuskan, bukan apa yang kamu katakan pada dirimu sendiri sedang kamu lakukan, tapi apa yang benar-benar kamu commit dan push. git log adalah buku besar. Ia tidak memperlunak entri. Ia tidak tahu bahwa kamu sedang lelah.

Membacanya berarti bertemu dengan dirimu sendiri secara jujur.

Tiga hal yang kamu pelajari dari commit lama

Pola yang tidak kamu sadari ada. Punyaku adalah refactor-yang-bukan-refactor. Aku terus menulis pesan commit seperti clean up auth module atau simplify token handling yang, ketika kubaca tiga bulan kemudian, ternyata adalah perubahan logika substansial yang tersembunyi di balik frasa kosmetik. Pola itu muncul lagi dan lagi. Aku jelas tidak yakin dengan perubahannya dan menggunakan bahasa cleanup untuk menyamarkannya. Sekarang aku melihat polanya, aku bisa menamainya ketika sedang melakukannya. Itu lebih berguna dari retrospektif mana pun.

Pertimbangan yang bertahan uji. Dalam log awal 2022 yang sama, ada sebuah commit tiga minggu sebelum a3f8c21 yang berbunyi: use read replicas for reporting queries — main db at 80% capacity, this buys time before schema work. Commit itu membosankan. Tidak cerdas. Itu adalah langkah jelas yang diambil dengan hati-hati, dengan konteks yang tertulis. Ia memberi waktu enam bulan, bukan dua minggu seperti yang aku perkirakan. Keputusan membosankan yang terdokumentasi baik adalah yang terus berkembang. Aku menemukan ini secara konsisten di berbagai repo, berbagai tahun. Yang tampak memukau jarang terlihat sebaik itu tiga bulan kemudian.

Pertimbangan yang tidak bertahan uji. Ada sebuah commit di repo berbeda yang berbunyi replace ORM queries with raw SQL for perf — 40% faster in load test. Aku ingat cukup bangga dengan itu. Nyatanya, pembaca, itu adalah bencana pemeliharaan. Load test-nya tidak realistis. Raw SQL itu menyebar ke delapan file selama sprint-sprint berikutnya. Delapan belas bulan kemudian seseorang menulis ulang seluruh layer-nya. Pesan commit itu memiliki keyakinan seseorang yang telah menjalankan satu benchmark dan menyebutnya selesai. Aku bisa melihat itu sekarang. Tidak bisa saat itu.

Tiga hal yang muncul dari telaah git log triwulanan: pola, penilaian yang bertahan, penilaian yang tidak
Dua puluh menit, sekali per kuartal. Tiga hal muncul setiap kali.

Pesan commit sebagai sebuah surat

Catatan Tim Pope tentang pesan commit sudah lima belas tahun usianya dan masih yang paling jelas ditulis tentang topik itu. Imperative mood, wrapping 72 karakter, baris kosong sebelum body. Mekanikanya penting, tapi prinsip mendasarnya lebih penting: tulis pesan itu untuk orang yang akan membacanya nanti, yang tidak tahu apa pun tentang konteks yang kamu berdiri di dalamnya sekarang.

Orang itu sering kali adalah kamu sendiri.

Linus Torvalds mengatakannya lebih blak-blakan: pesan commit harus mendeskripsikan apa yang berubah dan mengapa, bukan sekadar mengulangi diff dengan kata-kata lain. “Apa” sudah terlihat di diff. Pesan commit ada untuk “mengapa” — hal yang hilang sepenuhnya ketika konteksnya pergi.

fix tidak memberitahuku apa pun. fix session expiry on mobile safari — token was being cleared on blur event, not on actual logout memberitahuku semua yang aku butuhkan delapan belas bulan kemudian. Butuh sembilan puluh detik lebih lama untuk menulisnya. Ketidakseimbangannya absurd.

Tulislah seakan kamu sungguh-sungguh. Tulislah seakan kamu akan bersyukur nanti.

Praktiknya sendiri

Sekali per kuartal, aku menghabiskan dua puluh menit membaca tiga bulan git log milikku sendiri. Bukan untuk mengaudit diri sendiri. Bukan untuk merasa baik atau buruk tentang isinya. Hanya untuk melihat apa yang benar-benar ada dalam catatan itu.

Perintah yang aku gunakan:

git log --author="Arif" --since="3 months ago" --pretty=format:"%h %ad %s" --date=short

Aku membaca pesan-pesannya sekaligus. Aku mencari pola — baik dalam pekerjaan (jenis masalah apa yang terus muncul) maupun dalam penulisan (apa yang jelas-jelas coba aku hindari untuk dikatakan, apa yang aku dokumentasikan dengan baik tanpa menyadarinya). Aku mencatat di mana aku benar-benar menjadi lebih baik versus apa yang aku pikir sedang aku perbaiki. Keduanya sering kali berbeda.

Praktik ini bukan terapi. Ini adalah kalibrasi. Kamu tidak bisa menjadi lebih baik dalam sesuatu yang tidak mau kamu amati dengan jujur. Git log adalah pengamatannya.

Jika pesan-pesannya tipis — banyak fix, banyak update, banyak wip — itu pun informasi. Pesan yang tipis biasanya berarti pekerjaan itu sendiri tidak jelas. Itu layak untuk diketahui.

Kembali ke a3f8c21

Aku menjalankan git show a3f8c21. Diff-nya dua belas baris. Sebuah null check pada response object, sebuah early return yang defensif. Itu jelas memperbaiki sebuah crash. Butuh seseorang mungkin dua puluh menit untuk menulisnya, mungkin kurang.

Tidak ada pesan karena Arif-masa-lalu memutuskan perbaikannya sudah jelas dan Arif-masa-depan akan mengerti. Arif-masa-lalu sedang membuat taruhan kecil: bahwa ini tidak akan pernah jadi masalah.

Hampir tidak pernah jadi masalah. Itulah jebakannya.

Karena satu kali ketika itu jadi masalah — ketika ada regresi, ketika seseorang sedang debug isu terkait pukul 11 malam, ketika kamu mencoba memahami apakah ini keputusan yang disengaja atau sebuah kelalaian — pesan itulah yang mereka punya. Dan fix adalah yang kamu berikan kepada mereka.

a3f8c21 adalah hal kecil. Dua belas baris, empat tahun lalu, hampir terlupakan.

Aku masih mengingatnya sekarang.