Aplikasi rekap invoice yang sama saya tulis dua kali, Python 99 baris lalu C# 2.043 baris

Tahun ini saya menulis aplikasi yang sama sebanyak dua kali. Yang pertama tidak rusak. Saya cuma penasaran.

Aplikasinya sederhana. Dia membaca semua invoice PDF di satu folder, mengambil nominalnya, lalu mengeluarkan dua berkas: satu rekap Excel dan satu PDF gabungan siap cetak. Versi pertama saya tulis dengan Python, jadi 99 baris dalam satu berkas. Versi keduanya saya tulis ulang dengan C#, dan jadinya 2.043 baris yang tersebar di dua belas berkas.

Keluarannya sama persis. Saya sudah membandingkannya baris per baris dengan tiga puluh invoice yang sama.

Selisih dua puluh kali lipat itu yang akhirnya mengajari saya perbedaan kedua bahasa ini, dan pelajarannya datang dari mengerjakan pekerjaan yang identik di keduanya.

Apa sebenarnya Python dan C# itu

Python lahir tahun 1991, dibuat oleh Guido van Rossum. Tujuan desainnya dari awal adalah keterbacaan. Kodenya sengaja dibuat mirip kalimat biasa, dan blok program ditandai dengan indentasi, bukan dengan kurung kurawal.

C# lahir sembilan tahun kemudian, tahun 2000, dibuat Microsoft dengan arsitek utama Anders Hejlsberg. Dia dirancang untuk platform .NET, yang waktu itu jadi jawaban Microsoft atas Java.

Perbedaan tujuan itu masih terasa sampai sekarang. Python dibuat supaya cepat ditulis. C# dibuat supaya aman dipelihara dalam tim besar dan proyek panjang.

Dasar bahasa yang membuat keduanya terasa berbeda

Ada tiga hal mendasar yang memisahkan keduanya, dan ketiganya langsung terasa waktu saya mengerjakan aplikasi yang sama.

Tipe data. Di Python saya cukup menulis nominal = 0 dan selesai. Di C# saya harus menyebut tipenya lebih dulu, misalnya long nominal = 0. Kedengarannya merepotkan, dan memang begitu di awal. Tapi efeknya baru terasa nanti, waktu saya salah menaruh teks ke tempat angka. Di C# program menolak untuk dibangun. Di Python programnya jalan dulu, baru berhenti di tengah jalan waktu sudah memproses invoice ke-17.

Cara dijalankan. Python dibaca baris per baris oleh interpreter saat program berjalan. C# dikompilasi lebih dulu jadi bentuk lain, baru dijalankan oleh runtime .NET. Praktisnya, kesalahan ketik di Python baru ketahuan saat baris itu dieksekusi, sedangkan di C# ketahuan sebelum programnya sempat jalan.

Ekosistem pustaka. Untuk pekerjaan yang sama, saya memakai pustaka yang berbeda:

Kebutuhan Versi Python Versi C#
Membaca teks dari PDFpdfplumberPdfPig
Menggabungkan PDFPyMuPDFPdfSharp
Menulis berkas ExcelpandasClosedXML

Yang menarik, logika intinya tidak berubah sedikit pun. Pola pencarian yang saya pakai untuk menemukan nominal di invoice saya salin apa adanya dari Python ke C#, sampai komentar di kode C# saya pun menuliskan pola aslinya sebagai pembanding.

Empat langkah alur kerja aplikasi rekap invoice yang sama di versi Python dan C#
Alur kerja yang sama di kedua versi. Gambar ini ilustrasi buatan saya sendiri, bukan tangkapan layar aplikasi.

Kebutuhan PC untuk keduanya

Ini bagian yang sering bikin salah kaprah, termasuk saya dulu. Untuk sekadar belajar dan membuat aplikasi seperti punya saya, keduanya ringan. Yang membedakan justru terletak di apa yang harus dipasang lebih dulu.

Aspek Python C#
Sistem operasiWindows, macOS, LinuxWindows paling nyaman, Linux dan macOS bisa untuk aplikasi non-jendela
Yang dipasang untuk menulis kodePython saja, editor apa pun.NET SDK, biasanya dengan Visual Studio
Ukuran pemasangan alatnyaratusan MBbeberapa GB kalau pakai Visual Studio
Ukuran hasil jadi aplikasi sayasatu berkas exe 69 MBsatu folder 188 MB berisi 263 berkas pendukung
Perlu install di PC tujuantidak, kalau sudah dibungkus jadi exetidak, versi saya sudah membawa .NET di dalamnya

Angka terakhir itu sempat mengejutkan saya. Berkas exe versi C# sendiri hanya 0,3 MB, jauh lebih kecil dari 69 MB milik Python. Tapi karena saya memilih membungkusnya bersama seluruh .NET supaya bisa jalan di PC mana pun tanpa install, foldernya jadi 188 MB. Jadi kalau diukur dari total yang harus disalin, versi C# saya justru lebih besar.

Soal tenaga PC, saya perlu jujur soal batas pengujian saya. Kedua versi ini cuma pernah saya jalankan di satu mesin, laptop dengan AMD Ryzen 7 7435HS dan RAM 16 GB, jadi saya belum bisa bilang seberapa turun performanya di mesin yang lebih lemah. Yang bisa saya bilang, pekerjaan seperti ini tidak menuntut prosesor kencang, karena waktunya habis untuk membuka dan membaca berkas PDF, bukan untuk berhitung. Kartu grafis pun tidak terpakai sama sekali di kedua versi. Yang lebih terasa berat justru alat tulisnya. Visual Studio memakan jauh lebih banyak RAM dibanding editor teks biasa yang saya pakai untuk Python.

Plus minus Python, dari yang saya rasakan sendiri

Yang saya suka.

Sedikit sekali yang harus ditulis. Seluruh pekerjaannya muat dalam 99 baris di satu berkas, dan itu sudah termasuk membaca PDF, mencari nominal, menulis Excel, sekaligus menggabungkan semua PDF jadi satu. Untuk masalah yang bentuknya “ambil data dari berkas, olah sebentar, keluarkan hasil”, Python hampir selalu jalur tercepat.

Pustakanya sangat banyak dan matang, terutama untuk urusan data dan berkas. Menulis Excel dengan pandas cuma butuh satu baris.

Kodenya enak dibaca ulang. Waktu saya membukanya kembali setelah berbulan-bulan, saya masih langsung paham alurnya.

Yang bikin repot.

Kesalahan baru ketahuan saat jalan. Ini kelemahan yang paling sering saya temui. Program terlihat baik-baik saja sampai berhenti di tengah proses.

Berkasnya membengkak waktu dibungkus jadi exe. Program 99 baris tadi berubah jadi satu berkas 69 MB, karena seluruh Python beserta pustakanya ikut dibungkus di dalamnya.

Membuat tampilan berjendela bukan kekuatannya. Versi Python saya berhenti sebagai aplikasi konsol, jendela hitam dengan teks berjalan. Untuk saya tidak masalah, tapi untuk diberikan ke orang lain di kantor, itu kurang meyakinkan.

Versi Python juga lebih repot dijalankan, karena masih perlu sedikit menyentuh kode, bukan tinggal klik tombol seperti versi C#.

Tangkapan layar versi Python berjalan di konsol Windows, menampilkan daftar berkas PDF beserta jenis dan nominalnya
Versi Python waktu dijalankan. Nama tab di bilah judul saya kaburkan karena memuat alamat folder kerja.

Plus minus C#, dari yang saya rasakan sendiri

Yang saya suka.

Kesalahan ketahuan sebelum jalan. Beberapa kali saya salah menulis nama atau salah tipe, dan program menolak dibangun. Di Python, kesalahan seperti itu baru muncul setelah aplikasi memproses separuh folder.

Membuat aplikasi berjendela jauh lebih mudah di Windows. Versi C# saya punya tombol, tabel hasil, kolom pencarian folder, tombol batal, dan tombol untuk langsung membuka Excel hasilnya. Itu yang membuat jumlah barisnya membengkak, dan saya tidak menyesalinya.

Saya jadi punya berkas uji. Di versi C# ada 469 baris khusus untuk menguji kasus-kasus aneh: folder kosong, nama berkas bukan angka, PDF rusak, berkas Excel sedang dibuka orang lain, dan pembatalan di tengah proses. Versi Python saya tidak punya satu pun pengujian seperti itu.

Yang bikin repot.

Jauh lebih banyak yang harus ditulis. 2.043 baris untuk hasil yang sama. Sebagian besar memang untuk tampilan, tapi tetap saja.

Lebih banyak yang harus diputuskan di awal. Target kerangka kerja, jenis proyek, cara membungkus, semuanya harus ditentukan sebelum baris pertama ditulis.

Alatnya berat. Visual Studio bukan program yang enteng, dan ini terasa sekali di PC lama.

Tangkapan layar versi C# berupa aplikasi berjendela dengan kolom folder, tombol mulai, kotak ringkasan, dan tabel hasil, nama aplikasi dan logo ditutup penuh
Versi C# waktu dibuka. Nama aplikasi, logo, dan alamat folder saya tutup karena ini aplikasi internal kantor. Isi 58 berkas di situ pekerjaan lain, bukan tiga puluh invoice yang saya pakai membandingkan kedua versi.

Cara menyuruh AI membuat keduanya juga berbeda

Kedua versi ini saya kerjakan dibantu Claude Pro, dan saya menemukan bahwa perintah yang berhasil untuk satu bahasa tidak berhasil untuk bahasa lainnya.

Untuk Python, sebutkan pustakanya dan bentuk keluarannya. Perintah yang bekerja untuk saya bentuknya begini:

Buat skrip Python yang membaca semua PDF di folder Input_Invoice, urutkan berdasarkan nama berkas yang berupa angka, ambil nominal setelah tulisan TOTAL TAGIHAN, lalu simpan hasilnya ke Excel dan gabungkan semua PDF jadi satu berkas. Pakai pdfplumber untuk membaca teks, PyMuPDF untuk menggabungkan, pandas untuk Excel. Tulis dalam satu berkas saja.

Kuncinya ada di menyebut nama pustakanya. Kalau tidak disebut, AI akan memilih sendiri, dan sering memilih yang berbeda setiap kali diminta.

Untuk C#, sebutkan kerangka kerjanya dan struktur proyeknya lebih dulu. Perintah yang sama persis akan menghasilkan kode yang tidak bisa dibangun kalau bagian ini dilewat:

Buat aplikasi Windows Forms dengan .NET 8 bernama KelvianRecapInvoice. Pisahkan kode jadi folder Core untuk logika dan folder Ui untuk tampilan. Pakai PdfPig untuk membaca teks PDF, PdfSharp untuk menggabungkan, ClosedXML untuk Excel. Logika dan pola pencariannya salin persis dari skrip Python ini, jangan diubah sedikit pun. Buat juga proyek terpisah untuk menguji kasus folder kosong, nama berkas bukan angka, dan PDF rusak.

Tiga hal yang wajib ada di perintah untuk C# dan tidak perlu ada untuk Python: versi kerangka kerjanya, jenis aplikasinya berjendela atau konsol, dan bagaimana berkasnya dipisah.

Satu kalimat yang paling berguna waktu saya menulis ulang versi keduanya adalah meminta salinan yang setia, bukan versi yang lebih baik. Kalau tidak diminta begitu, AI cenderung memperbaiki logika sambil menerjemahkan, dan hasilnya jadi tidak bisa dibandingkan dengan versi lama.

Ada satu hal yang berubah gara-gara AI, dan ini yang paling terasa buat saya. Jumlah baris berhenti jadi alasan memilih bahasa. Dua-duanya jadi dengan cepat, dan selisih 99 baris lawan 2.043 baris itu tidak saya bayar dengan waktu mengetik. Dulu perbandingan Python dan C# hampir selalu berujung ke mana yang lebih singkat ditulis. Sekarang pertanyaannya bergeser ke hal lain: mana yang lebih enak dipakai orang lain, mana yang kesalahannya ketahuan lebih awal, dan mana yang lebih gampang dikirim ke komputer lain.

Jadi sebaiknya pilih yang mana

Saya tidak menyesali keduanya, dan sekarang keduanya masih saya simpan.

Kalau tujuannya membuktikan bahwa sebuah ide bisa jalan, atau pekerjaannya sekali pakai, Python menang telak. 99 baris, satu berkas, tidak ada yang perlu disiapkan lebih dulu.

Kalau aplikasinya akan dipakai berulang oleh orang lain, apalagi orang yang tidak terbiasa dengan jendela hitam, C# yang saya pilih. Bukan karena bahasanya lebih hebat, tapi karena hasil akhirnya terasa seperti aplikasi betulan, dan karena kesalahannya ketahuan lebih awal.

Yang paling berguna dari mengerjakan dua-duanya adalah ini: saya jadi tahu bahwa ukuran kode tidak sama dengan ukuran masalah. Masalah yang saya selesaikan tetap 99 baris. Sisanya yang 1.944 baris itu harganya sebuah tampilan yang enak dipakai dan kesalahan yang ketahuan lebih cepat. Dan dengan AI yang ikut menulis, harga itu jauh lebih murah dibanding kalau saya mengetiknya sendiri satu per satu.

Tinggalkan komentar