Living life and Make it Better

life, learn, contribute

Endy Muhardin

Software Developer berdomisili di Jabodetabek, berkutat di lingkungan open source, terutama Java dan Linux.

Google "endy"

Masukkan keyword “endy” di Google Indonesia. Lihat hasil search paling atas …

[Google Search "endy". Klik untuk memperbesar ](/images/uploads/2007/01/endy-google-search-crop.png)


Version Control untuk Database

Menyimpan kode program Java ke repository tidak sulit. Yang lebih sulit adalah menyimpan artifak database, yaitu:

  • Skema database
  • Stored Procedure
  • Functions
  • Sample/Initial data

Kalau dilakukan dengan cara manual, akan sangat merepotkan, karena programmer harus melakukan langkah-langkah berikut untuk memastikan kode programnya tersimpan di repository:

  1. Copy semua source code melalui Query Editor
  2. Paste satu per satu ke text file
  3. Commit ke repository
  4. Ulangi langkah 1 - 3 untuk setiap kali perubahan

Dengan skala ribuan procedure, cara ini sangat merepotkan dan dijamin tidak akan dilakukan oleh programmer. Harus ada cara yang lebih baik.

Untungnya –seperti halnya masalah yang umum kita temukan– sudah banyak orang lain yang mengalami masalah sama, dan sudah ada yang memecahkannya. Kali ini solusinya adalah ScriptDB4SVN. Aplikasi kecil yang seumur hidupnya hanya bertugas melakukan langkah 1-3 di atas.

Sayangnya aplikasi ini hanya bisa digunakan untuk Microsoft SQL Server.

Aplikasi ini membutuhkan .Net Framework 2.0 yang dapat didownload secara cuma-cuma di website Microsoft. Segera setelah .Net Framework diinstal, kita dapat langsung menjalankan ScriptDB4SVN.

Sebelumnya, kita harus edit dulu file konfigurasinya. Kita harus beritahu ScriptDB4SVN tentang:

  • Host database
  • Nama database yang akan digunakan
  • Daftar tabel yang akan didump datanya

Berikut adalah contoh konfigurasinya

Setelah konfigurasi selesai dibuat, jalankan ScriptDB4SVN.exe. Hasilnya seperti ini.

Screenshot ScriptDB4SVN

Setiap kali ada perubahan di database, dobel-klik ScriptDB4SVN dan commit file yang berubah. Harus diperhatikan, ScriptDB4SVN tidak otomatis menjalankan svn add. Jadi kalau ada Store Procedure baru, kita harus jalankan svn add secara manual.

Pembaca yang teliti mungkin akan melihat script sql dengan nama aneh pada screenshot di atas. Itu adalah script replikasi. Kalau script tersebut dijalankan di Query Analyzer, maka dia akan merekonstruksi database sehingga sama dengan kondisi database target pada saat ScriptDB4SVN dijalankan.

Dengan adanya tools ini, masing-masing programmer dapat bekerja di database lokalnya sendiri. Secara periodik, dia harus melakukan svn update dan merekonstruksi database lokalnya dengan script terbaru sehingga tetap sinkron dengan kondisi terbaru.


Project Starter Kit

Mengelola project software tidak mudah. Ada berbagai aspek teknis dan non teknis. Apalagi kalau projectnya berkaitan dengan pemerintahan atau organisasi lain yang birokratis. Akan banyak pekerjaan dokumentasi.

Di sisi lain, pekerjaan teknis selain coding juga tidak kalah banyaknya. Contohnya, dalam kehidupan sehari-hari programmer, dia harus:

  1. Menulis kode
  2. Menyimpan kode di repository
  3. Memberitahu programmer lain tentang perubahan yang dilakukan
  4. Menulis dokumentasi kode
  5. Menjalankan unit test
  6. Membuat rilis
  7. Menjawab pertanyaan client/bos/tim user manual

Semua kegiatan ini harus dikelola dengan baik agar tidak saling tumpang tindih. Untungnya banyak perangkat pembantu yang dapat memudahkan hidup kita. Pastikan Anda menggunakan persenjataan ini agar proyek bisa berjalan dengan lebih lancar. Berikut daftarnya:

  1. Version Control
  2. Bug tracker
  3. Mailing list
  4. File server
  5. Wiki
  6. Forum
  7. Build server

Mari kita bahas dengan lebih detail.

Version Control

Semacam file server, tapi lebih sakti. Mampu menyimpan riwayat perubahan, perbedaan antar versi, dan lainnya. Silahkan download presentasi saya tentang Subversion untuk pemahaman lebih lanjut.

Bug Tracker

Sepanjang perjalanan project, pasti banyak terjadi kesalahan. Baik kesalahan dokumen, kode program, permintaan yang kurang jelas, dan sebagainya. Daripada membuat mencatat di satu file khusus, lebih baik gunakan aplikasi bug tracker. Setiap entri di bug tracker bisa ditugaskan pada satu user. Status dari setiap entri (sedang dikerjakan, sudah selesai, selesai tapi tidak memuaskan) semua bisa ditentukan.

Gunakan bug tracker untuk memberikan tugas pada orang lain. Bug tracker yang baik biasanya terintegrasi dengan mail server, sehingga begitu kita membuat entri, email akan dikirim ke orang yang menerima tugas. Pada waktu suatu entri selesai dikerjakan dan statusnya diganti, email akan dikirim ke si pemberi tugas. Dengan demikian, tidak ada hal yang tercecer atau terlupakan.

Berikut daftar beberapa aplikasi bugtracker yang gratis dan open source:

Mailing List

Biasanya dalam project, kita akan sering mengirim email ke beberapa orang sekaligus. Misalnya pengumuman rilis, klarifikasi requirement, janji meeting, atau laporan kemajuan. Daripada mengetik banyak alamat sekaligus, lebih baik buat mailing list sesuai tujuan komunikasi. Buatlah mailing list untuk manajemen dan development. Segala pengumuman dan diskusi tentang manajemen proyek dikirim ke mailing list manajemen. Pembicaraan tentang pemrograman dilakukan di milis development.

Dengan demikian, selain tidak perlu mengetik alamat email satu persatu dan beresiko lupa, semua pembicaraan juga terekam secara kronologis.

Tidak mau repot menginstal aplikasi milis? Gunakan saja milis gratisan seperti YahooGroups atau GoogleGroups.

File Server

Selain melalui repository, kadang kita perlu bertukar file berukuran besar. Untuk itu, kita perlu file server. Banyak penyedia file server gratisan di internet, misalnya Rapidshare atau Megaupload.

Kalau tidak mau pakai gratisan –mungkin takut data penting diambil orang– gunakan XAMPP.

Wiki

Wiki adalah website yang bisa diedit orang banyak. Contohnya wiki ArtiVisi. Cara mengeditnya juga mudah dan sederhana. Tidak perlu keahlian HTML atau pemrograman web. Ideal digunakan untuk membuat dokumen yang sering berubah dan diakses sepanjang waktu, misalnya:

  • spesifikasi aplikasi
  • desain sistem
  • manual penggunaan aplikasi

Aplikasi wiki banyak tersedia secara gratis, misalnya:

dan masih banyak aplikasi lainnya.

Perbandingan antar aplikasi dapat dilihat di situs MediaWiki dan DokuWiki

Instalasi DokuWiki sangat mudah, cukup extract, kemudian publish melalui webserver yang support PHP. Pengguna Windows bisa menggunakan XAMPP dan menjalankan DokuWiki dalam 5 (lima) menit saja.

Forum

Apabila proyek/produk kita digunakan masyarakat luas, pasti akan banyak interaksi dengan pengguna. Biasanya pengguna baru akan menemui kesulitan dan butuh tempat bertanya. Mereka ini biasanya malas ikut milis, karena mungkin cuma butuh satu jawaban dan tidak ingin mengikuti diskusi di milis.

Kita bisa gunakan aplikasi forum yang banyak tersedia secara gratis. Salah satu yang terkenal adalah phpBB. Maniak Java bisa gunakan mvnforum.

Build Server

Apabila proyek kita sudah dilengkapi dengan version control, automated unit test, dan automated code review, kita bisa gunakan build server. Gunanya adalah agar secara berkala (misalnya sehari sekali), ada yang mengambil semua kode terbaru dari repository, melakukan kompilasi, menjalankan semua automated test, dan melaporkan hasilnya via website, email, rss, instant messenger, sms, atau media komunikasi lainnya.

Berkat keajaiban open source, aplikasi ini tersedia secara gratis. Kita bisa gunakan CruiseControl atau Luntbuild. Buat yang nekat tetap ingin bayar, bisa gunakan Pulse atau Bamboo.

Wow … begitu banyak yang harus disiapkan?

Begitu dalam pikiran Anda.

Jangan khawatir, ada aplikasi gratis untuk menyatukan semuanya. Gunakan Trac.

Bagaimana kalo projectnya banyak? Di kantor saya biasanya ada 10 project jalan berbarengan. Belum lagi 15 produk yang harus dikelola.

Jangan khawatir. Bawa pulang Sourceforge ke kantor Anda. Atau gunakan saingannya, GForge. Keduanya gratis dan open source.

Demikianlah rangkaian persenjataan dalam mengelola proyek. Semoga bermanfaat.


Snap

Ide orang memang ada-ada saja. Kali ini ada situs yang menampilkan preview dari suatu link. Coba arahkan (tidak perlu klik) mouse anda ke link Snap.com ini. Tunggu sejenak, dan (tergantung kecepatan bandwidth anda) screenshot website Snap akan muncul.

Cara mendapatkannya tidak sulit. Cukup buka halaman pendaftarannya, dan masukkan:

  • URL website kita
  • Email
  • Tulisan di gambar captcha

Centang I Agree dan klik Get Code.

Pada halaman berikutnya kita akan mendapat sepotong kode untuk dipasang di kode HTML website kita. Sangat mudah.

Selain Snap.Com, ada lagi website yang namanya Twitter. Kalau yang ini benar-benar kurang kerjaan. Silahkan cek sendiri dan cari tahu apa yang dikerjakan dunia saat ini.


Ruthless Testing 5

Setelah beberapa seri artikel Ruthless Testing, ternyata lebih banyak yang skeptis daripada yang antusias. Respon yang paling banyak ditemukan adalah:

Wah, ini konsep yang sangat menarik. Tentunya akan sangat baik jika diterapkan. Sayang sekali, di tempat saya tidak bisa, karena … [berbagai alasan dan kesulitan] …

Hmm … saya mengerti perasaan Anda. Been there, done that. Saya pernah jadi programmer, dan juga pernah jadi project manager. Saya mengerti beberapa keberatan dan kesulitan implementasinya.

Daripada berkeluh kesah tiada guna, mari kita lihat satu persatu masalahnya.

Programmer : Bikin unit test? Nambah kerjaan aja. Lagian test code kan gak dideliver ke client

Jawaban saya: Unit test itu adalah investasi Anda. Bayangkan beberapa bulan/tahun yang akan datang, client datang ke kita, meminta perbaikan untuk error dalam aplikasi. Padahal kita sedang sibuk mengerjakan proyek lain yang sama sekali berbeda. Hampir seluruh kode sudah kita lupakan. Bahkan untuk method sederhana seperti ini

calc.divide(x, y);

kita sudah lupa bagaimana behaviournya kalau menghadapi pembagian dengan nol, bilangan negatif, atau bilangan tidak bulat. Dan seperti biasa, kita tidak membuat komentar Javadoc.

Unit test to the rescue. Tinggal buka unit test untuk kode di atas, dan kita akan melihat bagaimana kode tersebut menghadapi bilangan negatif, nol, dan kasus-kasus aneh lainnya.

Next ..

Programmer : Aplikasi saya mengakses jaringan/database/email. Sulit dites

Jawaban saya: Itu namanya integration testing, bukan unit testing. Walaupun demikian, tetap bisa dites secara otomatis. Tapi butuh sedikit investasi tambahan.

Misalnya, kita punya method seperti ini:

public void process(Order order) {
    // coba lihat customernya, periksa saldonya
    Customer c = order.getCustomer();
    if(c.getBalance() < 0) {
        // handle error
    }
    
    // saldo ok, simpan order ke database
    String sql = "INSERT INTO tbl_order VALUES (?, ?, ?)";

    // kirim email konfirmasi
    String dest = c.getEmail();
    // kode send email tidak ditunjukkan
}

Seperti kita lihat, ada beberapa integration point di sini, yaitu akses database dan koneksi ke mail server.

Untuk mengotomasi pengetesan method ini, kita gunakan teknik yang sudah teruji dari 400 tahun lalu: divide et impera. Yang tidak tidur di kelas waktu pelajaran Sejarah pasti tau teknik ini. Sekarang teknik ini sudah diadaptasi ke dunia programming dengan istilah Refactoring. Silahkan google keyword tersebut untuk lebih jelasnya.

Pada contoh kita di atas, kita me-refactor kode akses database dan koneksi mail server ke class yang berbeda. Kita pisahkan kode tersebut ke class tersendiri. Berikut adalah interfacenya:

public interface OrderDao {
    public void save(Order o);
}

dan

public interface MailSender {
    public void send(String from, String to, String message);
}

Implementasinya disisakan buat latihan di rumah.

Sehingga method kita menjadi seperti ini:

public void process(Order order) {
    // coba lihat customernya, periksa saldonya
    Customer c = order.getCustomer();
    if(c.getBalance() < 0) {
        // handle error
    }
    
    orderDao.save(order);
    
    mailSender.send(adminEmail, c.getEmail(), "Order sudah dikirim");
}

Dengan adanya kedua class tambahan ini, kita bisa menggunakan Mock Object untuk memalsukan object orderDao dan mailSender. Kita bisa buat kedua object ini selalu sukses, atau selalu gagal, tergantung skenario yang mau dites.

OrderDao sendiri bisa dites dengan menggunakan teknik pengetesan database. MailSender dapat ditest dengan menggunakan Dumbster, mail server palsu.

Kasus seperti ini biasanya terjadi karena kodenya sudah terlanjur campur aduk. Apabila unit test diterapkan dari awal project, programmer terkondisi untuk membuat kode yang mudah dites, sehingga effort untuk refactor tidak terlalu besar.

Tujuan utama kita adalah semua tes bisa dijalankan otomatis, independen (tes satu tidak mempengaruhi tes lain) dan repeatable(bisa diulang-ulang dengan hasil yang konsisten). Tidak harus menggunakan JUnit. Bisa pakai tools buatan sendiri.

Keberatan berikutnya datang dari project manager.

Project Manager : Berarti saya harus alokasikan waktu tambahan untuk membuat unit test, wah bisa-bisa saya dimarahi client/bos.

Jawaban saya: Bos… programmer Anda pasti membuat kode test, walaupun tidak otomatis. Ini sudah naluri dasar manusia.

Berikut contohnya:

public void process(Order order) {
    // coba lihat customernya, periksa saldonya
        
    // saldo ok, simpan order ke database
    String sql = "INSERT INTO tbl_order VALUES (?, ?, ?)";
  
    // coba periksa ... nanti kita hapus lagi
    String coba = "SELECT * FROM tbl_order WHERE .. ";

    // kirim email konfirmasi
    String dest = c.getEmail();
    // kode send email tidak ditunjukkan
}

Jadi, daripada dia pasang kode test di kode program, dan nantinya dihapus lagi, kan sayang. Lebih baik suruh saja untuk bikin unit test betulan. Keuntungan berikutnya, dengan banyaknya unit test, kesalahan coding akan lebih cepat ditemukan, sehingga pada tahap testing oleh client, lebih sedikit bug yang ditemukan. Dengan demikian, alokasi waktu untuk rework akan lebih sedikit.

Project Manager : Kalau terlalu banyak unit test, nanti aplikasinya menjadi rumit.

Jawaban saya: Justru sebaliknya. Aplikasi yang banyak unit testnya akan menjadi lebih modular dan tidak terlalu kusut struktur internalnya. Dengan demikian, kode program menjadi lebih mudah dipelihara dan dikembangkan.

Terakhir, ada beberapa tips dari saya agar penerapan unit testing dapat berjalan dengan optimal:

  • siapkan infrastruktur sebelum mulai coding
  • sering-sering refactor agar kode mudah dites
  • gunakan coverage testing sebagai pelengkap, agar kekurangan unit test cepat terdeteksi
  • terapkan daily build otomatis yang menjalankan semua tes

Demikian, semoga bermanfaat