Akhdani Tech Talk 2021 Series #5 – Test Driven Development

Test Driven Development

Oleh: Agus, Dimas, Moris

Apa itu Test Driven Development (TDD)

Praktek koding yang pertama kali dibuat adalah uji tesnya, lalu membuat koding yang bisa membuat test tersebut lolos. Menagapa harus TDD ? TDD baiknya digunakan apabila Anda ingin menjaga base code dalam waktu yang lama.  TDD itu merupakan proses tertutup yang berulang. Hal ini membuat programmer paham dengan apa yang dia buat. Sebagai contoh berikut adalah gambaran dari proses pembuatan TDD tersebut

Mengapa menggunakan TDD?

Karena TDD adalah cara paling sederhana untuk mencapai kode berkualitas baik dan cakupan pengujian yang baik.

Untuk Jawaban lebih panjang, keep scrolling!

Lima langkah dalam flow TDD

  1. Baca, pahami dan proses permintaan fitur atau fix-bug.
  2. Terjemahkan persyaratan dengan menulis tes unit. Jika memiliki pengaturan hot-reload, unit test akan berjalan dan gagal karena belum ada kode yang diimplemen.
  3. Tulis dan implementasikan kode yang memenuhi persyaratan. Jalankan semua tes dan pastikan test berhasil/lulus. Jika ada yang tidak lulus ,silakan ulangi langkah ini.
  4. Bersihkan kode dengan refactoring.
  5. Check dan ulangi hingga test sudah bisa diimpelemtasikan untuk produksi (production).

tdd

tdd-red-green-refactoring-v3

 

 

Terdapat beberapa keuntungan dan kekurangan yang didapatkan jika menggunakan metode TDD. Berikut adalah contohnya :

Keuntungan : 

  1. Bisa memberitahu pada kondisi apa kodingan tersebut bisa berjalan sempurna dan tidak jalan sempurna. Programmer bisa mengetahui jika terjadi kesalahan karena sebelumnya kodingan tersebut berjalan dengan baik.
  2. Membuat waktu yang lebih singkat untuk melakukan refactor kodingan jika diperlukan, karena programmer dapat mengetes dengan mudah.
  3. Membuat programmer lebih percaya diri. karena apabila ada penambahan fitur, dapat dites dengan mudah.

Kekurangan : 

  1. Tidak mudah untuk memulai dengan TDD. Anda harus mengetahui mengetahui banyak praktik dan teknik baru. Contoh: unit testing, dan asertions, dll.
  2. Dibutuhkan lebih banyak waktu diawal saat melakukan pengembangan, karena Programmer harus menguji kode saat membuat kodingan juga.

Secara umum, TDD dapat dibagi menjadi 4 bagian yaitu : 

  1. Unit Testing: Unit test yang paling rendah. Biasanya yang di test hanya 1 method. Hal ini membuat unit testing mudah untuk digunakan.
  2. Integration Testing: Integration testing yang menyentuh beberapa class. Selain berhubungan dengan beberapa class, ada juga yang berhubungan dengan pihak external lainnya, misalnya API lain. 
  3. Functional Testing: Functional testing adalah tipe testing yang dilakukan kepada semua fitur. Testing ini agak memakan banyakan waktu karena fitur yang dites nya lebih banyak dari integration testing.
  4. Acceptance Testing: Acceptance testing merupakan test yang paling atas. Testing ini hanya dianggap sukses apabila customer sudah mengatakan testnya selesai.

Sebagai contoh, disini kita akan membuat 1 bagian TDD yaitu unit testing. Sebagai awalan, framework yang digunakan adalah menggunakan laravel (contoh menggunakan laravel karena saat menginstal laravel sudah sekaligus otomatis terinstal contoh unit testnya). Untuk menjalankan TDD secara otomatis, ketikan “vendor\bin\phpunit” pada root folder laravel.

Script test yang dibuat biasanya disimpan pada folder test\Unit

folder

lalu pada terminal akan muncul tampilan seperti ini

success1

hal tersebut menandakan bahwa semua test lolos.

sebagai contoh lain, kita buat 1 class yang bernama Calculate yang isinya 1 methode untuk menghitung luas

public function areaOfSquare($length)
{
    return pow($length, 2);
}

lalu buat class testnya yang bernama CalculateTest pada folder “tests\Unit”

 

folder-2

 

buat 1 method pada CalculateTest yang berfungsi untuk mengetes hasil balikan dari method “areaOfSquare” pada class “Calculate”

public function test_areaOfSquare_WhenCalledWithLength2_Return4()
{
    $this->calculate = new Calculate();

    $length = 2;

    $response = $this->calculate->areaOfSquare($length);

    $this->assertTrue(is_int($response));
    $this->assertEquals(4, $response);
}

jalankan test maka akan menghasilkan tampilan seperti berikut

success1

untuk apabila ada logic yang salah pada method “areaOfSquare” pada class “Calculate”, maka akan muncul tampilan seperti berikut.

error

 

disana disebutkan bahwa pada test “test_areaOfSquare_WhenCalledWithLength6_Return36″ hasil yang diharapkan adalah 36, sedangkan hasil yang keluar dari uji test adalah 216. dari sana bisa diambil kesimpulan bahwa kodingan di method “areaOfSquare” pada class “Calculate” terdapat kesalahan. Namun tidak menutup kemungkinan juga jika output yang ditulis pada script test yang dibuat salah. padahal hasil yang dikeluarkan oleh kodingan di method tersebut betul.

Kesimpulan :

Pengembangan berbasis tes (TDD) adalah teknik pengembangan di mana harus terlebih dahulu menulis tes yang gagal sebelum menulis kode fungsional baru. TDD dengan cepat diadopsi oleh pengembang perangkat lunak tangkas untuk pengembangan kode sumber aplikasi. TDD tidak menggantikan pengujian tradisional, melainkan mendefinisikan cara yang telah terbukti untuk memastikan pengujian unit yang efektif. Efek samping dari TDD adalah bahwa tes yang dihasilkan adalah contoh kerja untuk menjalankan kode, sehingga memberikan spesifikasi kerja untuk kode tersebut. Pengalaman pribadi, bahwa TDD bekerja dengan sangat baik dalam praktiknya dan ini adalah sesuatu yang harus dipertimbangkan oleh semua pengembang perangkat lunak.

 

Efek Dunning Kruger dan Teknologi Informasi

Keberadaan internet, biaya koneksi dan penetrasi perangkat mobile yang makin terjangkau (terutama Android) telah membuat kita semakin mudah dan cepat menemukan informasi. Tak hanya dari situs-situs berita, kita juga bisa mendapatkan informasi yang di-share di media sosial. Selain informasi, internet juga dapat membuat kita mendapatkan kualitas layanan yang lebih baik dan lebih cepat. Sayangnya, kecepatan menemukan informasi dan melakukan sesuatu ini dapat menjadi candu dan memiliki efek samping, salah satunya adalah tuntutan akan hasil yang instan (sering disebut dengan instant gratification).

Suka tidak suka, paradigma instan makin menyusup dalam kehidupan kita, salah satunya dalam penilaian kita terhadap kompetensi / keahlian diri kita sendiri. Lebih lanjut, hal tersebut menimbulkan ilusi terhadap superioritas. Misalnya, baru baca beberapa artikel sudah merasa jadi orang sholeh. Baru ikut beberapa seminar bisnis, tiba-tiba merasa siap jadi pengusaha dan berkoar-koar bahwa jadi karyawan itu tidak mulia. Nonton acara diskusi politik, tiba-tiba merasa jadi pakar politik.

road-to-success

Ditambah mentalitas intimidatif, judgement plus hobi mem-bully, ilusi superioritas membuat media sosial (atau di era pra-medsos dulu berupa mailing list) menjadi makin “berisik”. Kalau orang lain tidak sepaham / sepemikiran, maka dianggap pasti salah, karena kita merasa “paling” (paling benar, paling tahu, paling pintar). Kalau kehabisan argumen, kita tiarap dulu. Buka Google, cari informasi, kalau hasil googling ternyata kurang mendukung argumen kita, cari terus sampai halaman kesekian, yang penting mendukung argumen kita hehe :)

Namun, fenomena mengganggu dan menyebalkan di atas ternyata lumrah jika dilihat dari sudut pandang psikologi, ilusi superioritas ini disebut dengan efek Dunning-Kruger. Efek Dunning-Kruger adalah bias kognitif yang terjadi pada orang yang tidak kompeten plus memiliki pengetahuan dangkal pada tugas/area tertentu, dimana mereka cenderung menakar kemampuan diri di atas kenyataan yang ada dan menganggap mereka jauh lebih kompeten dibandingkan orang lain serta mengabaikan ketidaktahuan mereka sendiri.

dunning-kruger-chart

Penelitian David Dunning dan Justin Kruger (keduanya dari Cornell University) diinspirasi oleh perampok bank bernama McArthur Wheeler yang sangat over-confidence. Wheeler menggunakan sari lemon pada wajahnya sebelum merampok dua bank di Pittsburgh pada tahun 1995. Wheeler sangat percaya bahwa sari lemon merupakan invisible ink yang dapat membuat wajahnya tidak terekam kamera keamanan. Malam harinya pada hari yang sama, Wheeler ditangkap dan ketika diperiksa oleh polisi, reaksi Wheeler adalah terkejut dan masih tidak percaya bahwa rencana briliannya bisa gagal.

Menurut Dunning, bias kognitif tersebut terjadi karena :

“If you’re incompetent, you can’t know you’re incompetent. The skills you need to produce a right answer are exactly the skills you need to recognize what a right answer is.”

Para pemuda yang masih sangat bersemangat relatif lebih rentan mengalami efek Dunning-Kruger. Sewaktu kuliah, mata kuliah pemrograman di Informatika ITB tidak menekankan pada penguasaan bahasa pemrograman, namun lebih kepada pemahaman algoritma, bukan kepada tools. Beberapa kawan yang pernah ngoprek bahasa pemrograman dari SMP/SMA ada yang merasa tidak nyaman, karena hal yang pernah dipelajari sebelumnya dibabat habis, mereka harus legowo dan learn to unlearn secara bersamaan dengan proses learning yang baru. Uniknya di akhir semester, nilai mata kuliah beberapa kawan yang tidak pernah belajar pemrograman (bahkan ada yang baru belajar menghidupkan komputer ketika kuliah) ternyata bisa lebih tinggi ketimbang yang sebelumnya pernah memprogram.

Bagi beberapa kawan, perkuliahan juga terkesan membosankan dan ketinggalan dibanding kawan-kawan dari kampus lain. Kawan di kampus lain sudah membuat program GUI, HTML hingga mengakses SQL, sementara kami masih console/text based, sorting dan struktur data. Namun beberapa tahun kemudian ketika kami melakukan rekrutmen programmer, ternyata terbukti pengajaran dasar yang benar akan menghasilkan programmer dengan kemampuan problem solving yang lebih terstruktur.

Selepas kuliah, di awal pendirian perusahaan, kami sempat meragukan beberapa saran dari mentor. Saran-saran tersebut bagi kami terasa sangat pragmatis, tidak keren dan tidak kekinian (pada waktu itu), apalagi jika dibandingkan dengan perusahaan baru lainnya (jaman itu belum booming istilah startup / perusahaan rintisan). Jujur, sempat muncul arogansi bahwa kami merasa lebih tahu mengenai jaman dan masa depan :P . Beruntung, kami menuruti saran mentor tersebut. Dua – tiga tahun kemudian barulah terlihat ternyata saran yang disampaikan benar adanya.

Perlu kita pahami bahwa semua bias kognitif adalah natural dan manusiawi. Oleh karena itu, efek Dunning-Kruger bisa dialami pada berbagai lapisan usia maupun jenis profesi. Faktor kultur organisasi / industri juga bisa memiliki pengaruh. Fenomena argumentasi tanpa tanggung jawab atau debat kusir akan relatif lebih sedikit kita temui di bidang kedokteran dan militer jika dibandingkan dengan bidang lain seperti Teknologi Informasi.

Terkait dengan efek Dunning-Kruger di bidang Teknologi Informasi, berikut ini beberapa contoh yang pernah kami temukan :

  • klien yang memiliki kompetensi ilmu hukum bisa merasa jauh lebih kompeten dalam membuat software ketimbang konsultan IT yang mereka hire sendiri dan menganggap konsultan IT mereka tidak melakukan apa-apa (Anda bisa mengganti ilmu hukum dengan bidang-bidang lainnya, tidak ada maksud merendahkan ilmu hukum)
  • para script kiddies yang baru belajar hacking lebih banyak berkoar-koar ketimbang hacker profesional
  • programmer software bisa merasa lebih jago mengenai HRD daripada praktisi HRD yang minta dibuatkan software-nya
  • klien merasa lebih jago dan update tentang web design ketimbang web designer
    classics : http://theoatmeal.com/comics/design_hell
  • non-programming programmer yang beberapa kali kami temukan dalam tes rekrutmen Akhdani. Yang kami amati, beberapa individu yang merasa sudah menjadi programmer berpengalaman tersebut tidak memahami konsep fungsi/prosedur, kondisional dan variabel dengan baik. Jadi mereka lebih banyak menggunakan copy-paste + trial error ketimbang analisis masalah dan memahami kode
  • hasil ngobrol dengan beberapa kawan, laju kenaikan expected salary programmer pemula semakin tinggi, di atas inflasi dan tidak sebanding dengan hukum permintaan-penawaran / kelangkaan. Kehadiran Google dan Stackoverflow sepertinya membuat banyak orang merasa lebih kompeten ;)

Beruntung kami tidak terlalu lama terjebak efek Dunning-Kruger di awal-awal perusahaan. Adalah wajar dan manusiawi jika kita mengalami efek Dunning-Kruger, yang lebih penting adalah bagaimana meminimalisir dampak negatifnya, misalnya :

  • Menerapkan prinsip adab sebelum ilmu
    Prinsip klasik yang sering diajarkan di pesantren ini bisa membuat kita berpikir dan lebih hati-hati dalam bersikap, berpendapat dan mengambil tindakan. Efek Dunning-Kruger cenderung akan berakibat negatif apabila dikonkritkan dalam bentuk tindakan spontan dan minim pikir, seperti kasus perampokan bank oleh McWheeler dan kebisingan perdebatan di media sosial
  • Terus belajar dan berusaha menambah pemahaman
    Sebagaimana bisa kita lihat pada grafik di atas, makin bertambahnya pemahaman akan menurunkan level kepercayaan diri karena kita merasa ternyata banyak yang belum kita ketahui, dan fase awal ini akan memicu pembelajaran yang lebih dalam hingga pada titik tertentu kepercayaan diri kita berbalik naik kembali.

Sejalan dan koheren dengan kutipan yang dipopulerkan Steve Jobs

“stay hungry, stay foolish”

Seorang ulama Islam, Imam Al-Ghazali pernah menyampaikan ada 4 jenis manusia, yaitu :

  1. Seseorang yang tahu (berilmu), dan dia tahu kalau dirinya tahu
  2. Seseorang yang tahu (berilmu), tapi dia tidak tahu kalau dirinya tahu
  3. Seseorang yang tidak tahu (tidak atau belum berilmu), tapi dia tahu alias sadar diri kalau dia tidak tahu
  4. Seseorang yang tidak tahu (tidak berilmu), dan dia tidak tahu kalau dirinya tidak tahu

Di era overload informasi seperti sekarang, sangat mungkin jika kita mengalami promosi-degradasi posisi antara nomor 1 hingga 4. Yang penting adalah cepat menyadari apabila kita sedang berada pada posisi nomor 4.

Disclaimer : penulis bukan praktisi psikologi dan tidak pernah masuk pesantren, oleh karena itu sangat mungkin ada efek Dunning-Kruger dalam tulisan ini sendiri, harap dimaklumi, cheers ;)

Bacaan lainnya :

https://en.wikipedia.org/wiki/Dunning–Kruger_effect

https://en.wikipedia.org/wiki/Invisible_ink

http://arstechnica.com/science/2012/05/revisiting-why-incompetents-think-theyre-awesome/

https://mindhacks.com/2010/02/11/the-burglar-with-the-lemon-juice-disguise/

https://blog.codinghorror.com/the-nonprogramming-programmer/

Akhdani Culture Series : Result Oriented

Beberapa kenalan menyarankan kami berbagi mengenai budaya kerja / corporate culture di Akhdani yang mungkin cukup unik bagi mereka. Karena admin sedang (beralasan) banyak pekerjaan, maka sebagai awalan, berikut ini adalah hasil copy paste dari tulisan blog (sayangnya sudah mati suri) salah satu founder sekaligus direksi, ditulis pada tahun 2009, mengenai prinsip result oriented. Tulisan tersebut bisa jadi adalah salah satu dokumentasi pertama mengenai kultur kerja di Akhdani sejak 2006.


Sesi Mimpi : anti penindasan korporat

Dulu waktu mentoring agama Islam (saya mentor cadangan dengan pengetahuan syar’i yg pas-pasan :D ) di kampus, beberapa adik kelas menanyakan kenapa kok jadi pengusaha, apakah karena potensi memiliki pendapatan hingga tak terbatas ? Sebenarnya alasan utamanya bukan itu, lebih kepada passion, saya jadi pengusaha sebenarnya lebih karena :

  • Tidak cocok dengan jam kerja kantoran yang fixed
  • Tidak suka dengan atasan yang seenaknya, tidak mau mengerti apakah stafnya punya masalah atau tidak. Tidak semua atasan seperti itu, namun populasi atasan yang baik pasti langka :D
  • Otak technical saya sepertinya moody, lebih sering “hidup” dan kreatif di waktu santai ketimbang office hours:D
  • Tidak suka dengan office politics. Kedua ortu saya berstatus PNS dan karyawan, beliau berdua terkadang menceritakan beberapa dampak office politics yang mereka alami .. :) banyak bekerja & berprestasi tapi sering kali tidak dihargai karena berbagai faktor non objektif, ide-ide yang dicuri oleh teman sekantor sendiri, teman sekantor yang tidak mau action, tetapi luar biasa menjilatnya kpd atasan, dsb …
  • Sepertinya lebih menyenangkan membuka lowongan kerja ketimbang mencari pekerjaan, lebih bermanfaat bagi orang lain :)

Jadi boleh dikatakan bahwa saya mungkin termasuk orang yang cukup anti “penindasan korporat”. Contoh penindasan korporat : saya pernah meeting sore hari dengan 2 ibu dari sebuah perusahaan IT besar, ketika sudah maghrib dan meeting selesai ternyata mereka masih ada meeting dengan bos jam 20, lantas nasib suami dan anak-anaknya gimana? Mereka sempat curhat : harus datang jam sekian, dan pokoknya harus kerja padahal di rumah sedang ada masalah. Dimarahi bos karena membantu mengurusi tetangga yang meninggal dunia, dsb.

Karena saya tidak ingin diperlakukan seperti itu, jadi saya tidak boleh memperlakukan orang lain seperti itu. Beberapa efek pemikiran anti “penindasan korporat” ini di kantor antara lain :

  • karyawan boleh datang tidak tepat waktu
  • boleh bekerja di rumah dulu atau di kampus, kemudian datang untuk koordinasi
  • boleh main game di kantor, asal jangan main game sepanjang hari
  • dan beberapa kebebasan lain

Namun tentunya dengan beberapa syarat :

  • target pekerjaan tercapai, deadline tidak boleh lewat
  • kalau telat atau tidak masuk memberi tahu pihak berwenang :)
  • tidak merugikan/merepotkan orang lain
  • maklum dengan gaji yang tidak terlalu besar dibandingkan perusahaan lain yang sejenis, jadi jangan menuntut terlalu banyak dulu hihi :D

Pak Harry Sufehmy mungkin menyebutnya dengan istilah KBH / result oriented:) . Baru-baru ini, ketika browsing, saya menemukan link berikut ini :
http://askmonty.org/wiki/index.php/The_hacking_business_model

Dokumen tersebut dibuat berdasarkan pengalaman di masa-masa awal MySQL AB dan perusahaan open source lainnya. Banyak hal-hal ingin saya terapkan di perusahaan liliput saya, ternyata tertulis di dokumen tersebut. Sambil menerapkan pola result oriented ini, sebenarnya masih ada beberapa pertanyaan yang mengganjal :

  • Saya sebenarnya masih ingin memberikan beberapa benefit lagi, seperti waktu cuti yang lebih banyak, asuransi kesehatan, bonus Idul Adha : terserah untuk beli qurban atau keperluan lainnya, dsb. Namun apakah karyawan akan memberikan kontribusi maksimal seiring dengan kebebasan yang diberikan perusahaan ? Jujur saja, perilaku orang Indonesia cukup “unik”, dulu beberapa kali saya menemui orang-orang yang tidak tahu berterima kasih, malah cenderung menusuk walaupun sudah dibantu, hanya berfikir keuntungan jangka pendek dan memanfaatkan niat baik orang lain :(. Saya berharap rekan-rekan yang kami rekrut tidak seperti itu dan hingga saat ini alhamdulillah belum ada.
  • apakah klien beranggapan bahwa kami profesional dengan pola kerja seperti ini ?

Well, sejauh ini alhamdulillah beberapa mitra masih percaya dengan kinerja perusahaan liliput ini, dari 2006 perusahaan konsisten mencetak laba. Prediksi saya tantangan dan ujian sebenarnya terhadap pemikiran anti “penindasan korporat” ini akan datang ketika perusahaan ini makin membesar, makin banyak kontrak pekerjaan dan makin banyak orang bergabung sebagai anggota perusahaan. Buat teman-teman dan rekan kerja, saya mohon doanya moga-moga rezeki perusahaan liliput ini dilancarkan dan tetap anti penindasan korporat, amiin…