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.

Geek Personality Quiz

Ada lagi kuis untuk membuang-buang waktu luang dan bandwidth Anda. Jangan ketinggalan!! Ketahuilah jenis personality Anda segera.

Ini hasil kuis saya :

You are .exe When given proper orders, you execute them flawlessly.  You're familiar to most, and useful to all.
Which File Extension are You?


Refactoring

Three times and you refactor !! Begitu kata Martin Fowler dalam bukunya Refactoring.

Sering terjadi dalam pembuatan aplikasi, kita akan menulis suatu rutin yang sudah pernah kita tulis sebelumnya, dengan sedikit perbedaan parameter dan variabel. Biasanya, kalau menemui hal seperti ini, kita akan copy-paste dari kode yang sudah ada, melakukan sedikit modifikasi, dan selesai. Mudah dan sederhana, tapi terlalu rajin. Untuk jadi programmer yang efektif, kita perlu memiliki sifat malas.

Misalnya, kita punya UserDao, dengan kode seperti ini :

public class UserDao {
    public void insert(User u) {
      // connect dulu
      Connection conn = DriverManager.getConnection(url, user, pass);
      PreparedStatement ps = conn.prepareStatement("INSERT INTO tbl_user VALUES (?,?)");
      
      // ... dan seterusnya .... 
    }
}

Setelah itu, kita akan menambahkan method untuk delete:

public class UserDao {
    public void insert(User u) {
        // connect dulu
        Connection conn = DriverManager.getConnection(url, user, pass);
        PreparedStatement ps = conn.prepareStatement("INSERT INTO tbl_user VALUES (?,?)");
      
        // ... dan seterusnya .... 
    }

    public void delete (User u) {
        // connect dulu
        Connection conn = DriverManager.getConnection(url, user, pass);
        PreparedStatement ps = conn.prepareStatement("DELETE FROM  tbl_user WHERE id=?");
      
        // ... dan seterusnya .... 
    }
}

Nah, sekarang kita mau tambah method untuk search user berdasarkan id, tentunya kita akan tulis kode seperti ini :

public class UserDao {
    public void insert(User u) {
        // connect dulu
        Connection conn = DriverManager.getConnection(url, user, pass);
        PreparedStatement ps = conn.prepareStatement("INSERT INTO tbl_user VALUES (?,?)");
      
        // ... dan seterusnya .... 
    }

    public void delete (User u) {
        // connect dulu
        Connection conn = DriverManager.getConnection(url, user, pass);
        PreparedStatement ps = conn.prepareStatement("DELETE FROM  tbl_user WHERE id=?");
      
        // ... dan seterusnya .... 
    }

    public User search (int id) {
        // connect dulu
        Connection conn = DriverManager.getConnection(url, user, pass);
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM  tbl_user WHERE id=?");
      
        // ... dan seterusnya .... 
    }
}

Stop !!! Three times and you refactor. Artinya, begitu kita paste untuk kedua kali (berarti ada tiga kopi blok yang sama), itulah waktunya kita refactor. Kita paste blok tersebut, masukkan ke dalam function/method sendiri, berikan parameter seperlunya. Ini untuk menghindari terjadinya duplikasi kode, sehingga untuk tiap perintah cuma ada satu versi.

Setelah direfactor, kode di atas menjadi :

public class UserDao {
    public PreparedStatement prepareStatement(String sql) {
        // connect dulu
        Connection conn = DriverManager.getConnection(url, user, pass);
        return conn.prepareStatement(sql);              
    }

    public void insert(User u) {
        PreparedStatement ps = prepareStatement("INSERT INTO tbl_user VALUES (?,?)");
        // ... dan seterusnya .... 
    }

    public void delete (User u) {
        PreparedStatement ps = prepareStatement("DELETE FROM tbl_user WHERE id=?");      
        // ... dan seterusnya .... 
    }

    public User search (int id) {
        PreparedStatement ps = prepareStatement("SELECT * FROM tbl_user WHERE id=?");
        // ... dan seterusnya .... 
    }
}

Apabila kita menggunakan IDE canggih seperti Eclipse, IDEA, atau Netbeans, refactoring ini mudah saja dilakukan. Tinggal blok kode yang akan direfactor, kemudian klik kanan, dan pilih Extract Method. Method baru akan dibuatkan dan diisi dengan kode yang kita blok. Sedangkan kode asal yang kita blok sebelumnya akan diganti dengan pemanggilan method baru.

Extract Method hanya satu contoh kecil saja dari Refactoring. Masih ada Extract Classes, Inline Method, dan lain sebagainya. Buku wajib buat programmer Java.

Silahkan beli di Amazon atau download di Flazx.


Deadline !!!

Deadline memang bikin stress.

Cangkir kopi bertebaran, dan kantung mata bergelayutan. Tidak lupa bos mondar-mandir di belakang, terus menerus kirim email, telpon ke HP, kirim BUZZ lewat Y!, dan melakukan tindakan-tindakan lain yang menambah ketegangan.

Di tengah kesibukan deadline, jangan lupa untuk selalu berpikir positif, dan yang paling penting, jangan mudah tertipu. Beberapa jenis deadline sebetulnya palsu, merupakan kelihaian pihak-pihak tertentu yang menguasai teknik khusus.

Di website ini dapat Anda baca beberapa teknik untuk menciptakan nuansa deadline di lingkungan Anda.

Selamat mengejar deadline, awas maag kumat. :P


Subversion backup dan restore

Setelah repository terpasang dan telah terisi struktur folder awal, hal pertama yang wajib dilakukan adalah memasang perangkat backup otomatis. Berikut adalah checklistnya :

  1. Buat folder khusus backup (misalnya /home/endy/backup-svn)

  2. Download script backup dari buku Pragmatic Version Control Using Subversion. Ada dua script yang didapat di sini, weekly-backup.pl dan daily-backup.pl Kedua script butuh instalasi Perl untuk dapat dijalankan.

  3. Letakkan script di folder backup

  4. Sesuaikan permission :

 $ chmod 755 *.pl 
  1. Test eksekusi script
$ ./weekly-backup.pl
$ ./daily-backup.pl 

Seharusnya akan ada dua file : weekly-full-backup.yyyyMMdd.gz dan daily-incremental-backup.yyyyMMdd.gz

  1. Otomasi dengan cron
# Repository Weekly Backup
0 6 * * 1       /home/endy/backup-svn/weekly-backup.pl
# Dijalankan setiap Senin jam 6 pagi.

# Repository Daily Backup
0 23 * * *      /home/endy/backup-svn/daily-backup.pl
# Dijalankan setiap hari jam 23 malam
  1. Setiap Senin pagi, tulis semua file dari Senin minggu lalu sampai Minggu malam ke dalam CD. Simpan CD di lokasi yang berbeda (gedung lain, kota lain, negara lain, planet lain bila perlu).

Bila semua ini dijalankan, cuma butuh 10 menit, sudah termasuk membaca artikel ini. Jangan sia-siakan hidup Anda hanya karena malas investasi 10 menit.

Apabila terjadi bencana, dan repository rusak, kita tinggal ambil CD terbaru, dan dump dengan cara :

  1. Install ulang Subversion
  2. Buat repository
  3. Unzip dump file

    $ gunzip *.gz

  4. Load ke repository baru
$ svnadmin load newrepos < weekly-full-backup.yyyyMMdd
$ svnadmin load newrepos < daily-incremental-backup.yyyyMMdd

Dimulai dari tanggal paling lama, sampai tanggal terbaru.


Testing Aplikasi

Sebelum diinstal di tempat customer, aplikasi yang kita buat harus ditest. Itu jelas. Semua orang melakukannya. Hanya saja, teknik melakukan testing akan membedakan antara yang pro dan belajaran (apalagi yang baru lulus kuliah :P)

Mari kita ambil contoh nyata. Misalkan kita punya class Calculator, dengan satu method divide yang tugasnya membagi dua bilangan. Berikut kodenya :

public class Calculator {
    public double divide (double a, double b) {
          return 0;
    }
}

Programmer pemula (atau pro yang kurang wawasan), hampir pasti akan segera menulis

public static void main(String[] xxx) {
    Calculator c = new Calculator();
    System.out.println("10 dibagi 2 adalah : " +c.divide(10,2));  // hasilnya harus 5
}

Hmm… primitif sekali. Dengan segala kecanggihan teknologi komputer, kita yang berada di tengah dunia komputer, membuat program komputer, masih menggunakan teknologi jaman DOS prompt untuk melakukan test.

Apa yang salah dengan kode test di atas? Salah, karena programmer harus mengeksekusi kode di atas, melihat bahwa tampilan yang dihasilkan seperti ini :

10 / 2 adalah : 0

membetulkan kode, kemudian lihat lagi, memastikan kali ini tampilannya seperti ini :

10 / 2 adalah : 5

Mengapa salah? Karena ini tidak otomatis. Bagaimana kalau kita punya 100 method? Bagaimana kalau tiap method punya 2 kemungkinan yang harus ditest (misalnya: pembagian dengan 0, pembagian dengan bilangan negatif)? Berarti ada sekitar 200 baris yang harus diteliti. Dan ini akan menjadi membosankan dan melelahkan.

Programmer profesional (baca: menghidupi anak istri dari coding) yang berwawasan luas akan menggunakan Automated Unit Testing. Tools ini akan memungkinkan kita untuk melakukan test secara :

  • Cepat

  • Otomatis

  • Dapat dieksekusi dengan tekan satu tombol

Programmer profesional yang berwawasan tersebut akan menulis test seperti ini :

public void testDivide() {
    Calculator c = new Calculator();
    assertEquals(5, c.divide(10,2));
}

Dengan cara ini, komputerlah yang akan memeriksa kode kita. Pada waktu kita jalankan, komputer akan mencetak tanda titik bila sukses, huruf F bila gagal, dan huruf E bila terjadi Exception. Tidak perlu lagi periksa secara manual. 200 test? Tidak perlu khawatir. Tinggal jalankan dan lihat. Berapa huruf yang muncul, itulah yang diperbaiki.

Bagusnya lagi, semua test tadi dapat dikonfigurasi sehingga dapat dijalankan sekaligus. Jadi dengan sekali tekan tombol, kita dapat menjalankan semua test yang telah kita buat dari sejak project dimulai.

Proses ini dapat diotomasi lebih jauh lagi, apabila kita menggunakan Ant, atau plugin IDE (misalnya Eclipse). Proses testing dapat diintegrasikan. Sehingga kalau biasanya setelah melakukan perubahan di source code kita lakukan save dan compile, dengan sedikit konfigurasi, kita ubah menjadi save-compile-test. Dengan sekali tekan tombol, kode yang baru saja kita edit telah ditest.

Ingatlah, programmer profesional mencari nafkah dari coding. Semakin cepat menyelesaikan aplikasi, semakin cepat dapat mengirimkan tagihan ke customer, dan semakin cepat pula istri akan tersenyum.

Tulisan ini merupakan bagian pertama dari rangkaian tulisan tentang Otomasi Pembuatan Aplikasi.