2.0 Pengantar Bagian 2: Pemrograman Perangkat Lunak
Bagian 2 membahas keterampilan harian menulis perangkat lunak yang dapat dibaca, diubah, dan dipercaya banyak orang sepanjang umurnya yang panjang. Bagian 1 meletakkan fondasi tentang bagaimana tim mengorganisasi diri dan memutuskan. Bagian ini beralih ke kodenya sendiri: konvensi yang Anda ikuti, cara Anda membentuk desain dan antarmuka, bagaimana Anda menguji dan meninjau pekerjaan, bagaimana Anda mengelola riwayat sumber, dan bagaimana Anda menuliskan segala sesuatu. Inilah praktik yang membedakan basis kode yang mempercepat pengiriman dari yang melawan setiap perubahan.
Pada tim besar, keterampilan bukan soal selera pribadi. Itulah cara Anda berkoordinasi. Ketika ratusan atau ribuan insinyur, kontraktor, dan penerus menyentuh sistem yang sama, konvensi bersama dan kontrak yang jelas adalah yang memungkinkan semua orang bekerja secara paralel tanpa bertabrakan terus-menerus. Ingatlah bahwa kode dibaca jauh lebih sering daripada ditulis, dan banyak pembacaan itu terjadi bertahun-tahun kemudian, oleh orang yang tidak akan pernah Anda temui.
Dalam konteks enterprise dan pemerintah taruhannya naik lebih jauh. Sistem rutin hidup lebih lama daripada penulisnya selama satu dekade atau lebih. Regulasi dan audit menuntut bukti kendali yang terdokumentasi. Pengetahuan harus berpindah melintasi pergantian staf dan batas kontrak. Maka bab-bab di sini memperlakukan kualitas bukan sebagai aksi heroik melainkan sebagai sifat yang direkayasa dan sebagian besar otomatis dari cara seluruh tim bekerja.
Bab dalam bagian ini
2.1 Standar pengodean dan gaya: Konvensi bersama yang ditegakkan secara otomatis untuk penamaan, format, dan idiom yang memungkinkan banyak penulis menulis seolah-olah satu penulis yang cermat yang menulisnya, sehingga peninjau membelanjakan perhatian pada desain, bukan gaya.
2.2 Prinsip desain perangkat lunak: Heuristik seperti SOLID (lima prinsip desain berorientasi objek), DRY (jangan ulangi diri sendiri), kopling dan kohesi, serta Domain-Driven Design (memodelkan perangkat lunak dalam bahasa domain bisnis), diperlakukan sebagai perkakas dengan ranah penerapan dan mode kegagalan yang diketahui, bukan hukum untuk dipatuhi.
2.3 API dan desain antarmuka: Merancang kontrak tempat sistem dan tim bertemu, agar tim independen dapat mengubah bagian dalamnya tanpa merusak konsumen atau memaksa deployment serentak.
2.4 Strategi pengujian: Pilihan yang disengaja tentang apa yang diuji, pada tingkat apa, dan hingga keyakinan seberapa, membangun jaring pengaman yang cepat dan tepercaya yang memungkinkan organisasi besar melakukan deployment sering dan aman.
2.5 Tinjauan kode dan kolaborasi: Memeriksa perubahan sebelum digabung untuk menangkap cacat, menyebarkan pengetahuan, menegakkan standar, dan memenuhi kontrol kepatuhan, sambil menjaga tinjauan tetap cepat dan konstruktif, bukan seremonial.
2.6 Kontrol versi dan manajemen sumber: Sistem pencatat untuk setiap perubahan, serta disiplin percabangan, repositori, dan commit yang menjaga jalur utama dapat dirilis, riwayat terbaca, dan jejak audit utuh.
2.7 Dokumentasi: Pengetahuan tertulis, dari panduan memulai hingga runbook (prosedur operasional langkah demi langkah) dan log keputusan, yang melindungi dari risiko orang kunci, mempercepat orientasi, dan memindahkan pemahaman melintasi tahun dan batas kontrak.
2.8 Persyaratan perangkat lunak: Menggali, menspesifikasikan, memvalidasi, dan mengelola apa yang harus dilakukan perangkat lunak dan seberapa baik, dengan keterlacakan yang dituntut oleh pekerjaan yang diatur dan pemerintah.
2.9 Konstruksi perangkat lunak: Keterampilan membangun perangkat lunak yang berfungsi: meminimalkan kompleksitas, membangun untuk verifikasi dan perubahan, pemrograman defensif, dan pemakaian ulang yang disiplin.
2.10 Manajemen konfigurasi perangkat lunak: Mengidentifikasi, mengendalikan, dan mengaudit setiap butir konfigurasi (artefak apa pun yang versinya harus dilacak dan dikendalikan) dan perubahan, agar rilis dapat direproduksi dan jejak audit utuh.
2.11 Kualitas perangkat lunak: Kualitas sebagai sifat yang dikelola, lebih luas daripada pengujian: model kualitas, jaminan versus kendali, pengukuran, manajemen cacat, dan biaya kualitas.
2.12 Model dan metode perangkat lunak: Kapan dan bagaimana memodelkan, mencakup model struktural dan perilaku, metode formal (spesifikasi dan verifikasi berbasis matematika), pembuatan prototipe, dan metode agile, serta kapan pemodelan adalah pemborosan.
2.13 Fondasi komputasi, matematika, dan rekayasa: Dasar-dasar abadi di bawah praktik: algoritma dan struktur data, logika dan probabilitas, dan metode rekayasa empiris.
2.14 Struktur proyek dan repositori: Konvensi yang konsisten untuk mengorganisasi sebuah solusi dan repositorinya, termasuk folder baku, titik masuk README, dan konfigurasi bersama, agar insinyur mana pun dapat menavigasi basis kode mana pun.
2.15 Debugging dan pemecahan masalah: Menemukan dan memperbaiki cacat sebagai praktik yang disiplin dan dapat diajarkan: mereproduksi, mengisolasi dengan pencarian biner, membentuk dan menguji hipotesis, dan menangkap setiap perbaikan sebagai tes regresi, bukan tebakan dan perubahan serampangan.
2.16 Rekayasa kinerja: Membuat perangkat lunak cukup cepat dengan sengaja lewat menetapkan anggaran kinerja, mengukur dan memprofilkan sebelum mengoptimalkan, memahami biaya algoritmik dan latensi ekor, dan menjaga dari regresi, semuanya pada tingkat kode dan komponen.
2.17 Konkurensi dan paralelisme: Menulis kode konkuren yang benar dengan menjadikan imutabilitas dan penyampaian pesan sebagai bawaan, memahami race, deadlock, dan visibilitas memori, memilih sinkronisasi dan model tingkat lebih tinggi yang tepat, dan menguji perilaku non-deterministik dengan sengaja.
2.18 Manajemen dependensi dan rantai pasok: Mengelola kode pihak ketiga yang menyusun sebagian besar sistem modern melalui disiplin versi dan lockfile, irama pembaruan yang stabil, jejak dependensi yang minimal dan diperiksa, serta asal-usul dan bill of materials perangkat lunak untuk rantai pasok yang tepercaya.
2.19 Refaktoring dan utang teknis: Memperbaiki desain internal kode yang berfungsi di balik rangkaian tes yang tepercaya, mengenali code smell dan menerapkan refaktoring kecil bernama, memakai strangler fig untuk perubahan lebih besar, dan mengelola utang teknis sebagai portofolio yang terlihat dan didanai, bukan kegagalan moral.
2.20 Penanganan galat dan pola ketahanan: Memutuskan dengan sengaja bagaimana kode gagal dan pulih, lewat kontrak galat yang jelas, pilihan fail-fast versus fail-safe, retry dengan backoff dan idempotensi, circuit breaker dan degradasi anggun, dan tidak pernah menelan galat secara diam-diam.
2.21 Sistem tipe dan analisis statis: Menangkap seluruh kelas cacat sebelum kode berjalan, lewat pengetikan statis dan bertahap yang membuat keadaan ilegal tidak dapat direpresentasikan, serta linter, pemeriksa tipe, dan penganalisis yang dipasang ke editor dan pipeline.
Bagaimana bab-bab ini saling berkaitan
Benang merah Bagian 2 adalah kemampuan berubah pada skala besar. Setiap praktik di sini ada agar banyak orang dapat mengubah sistem bersama yang berumur panjang dengan percaya diri. Standar pengodean (2.1) dan prinsip desain (2.2) membentuk kode agar Anda dapat memahami dan mengubahnya. Desain antarmuka (2.3) menggambar batas yang memungkinkan tim mengubah bagian dalamnya secara independen. Pengujian (2.4) menyediakan jaring pengaman yang membuat perubahan aman. Tinjauan kode (2.5) adalah tempat kerja individual bertemu kepemilikan kolektif, dan tempat standar benar-benar ditegakkan. Kontrol versi (2.6) adalah fondasi tempat tinjauan, integrasi, dan audit bertumpu. Dan dokumentasi (2.7) menjaga maksud di balik semuanya bagi orang yang datang kemudian.
Bab-bab ini juga memberi makan sisa buku panduan. Antarmuka dan prinsip desain di sini menjadi blok bangunan sistem di Bagian 3, terutama dasar-dasar arsitektur (bab 3.1). Strategi pengujian (2.4) dan kontrol versi (2.6) adalah bahan mentah untuk pipeline pengiriman otomatis di bab 8.1. Praktik dokumentasi (2.7) terhubung langsung dengan runbook dan observabilitas operasi, seperti bab 9.2. Dan seluruh bagian ini dibangun di atas nilai dan fondasi pengambilan keputusan yang diletakkan di Bagian 1, mengubah prinsip bersama menjadi keterampilan harian yang konkret.