Indonesia

Methodology / design pattern / development driven apa yang paling bagus?

Saat sedang melihat-lihat group programming di facebook, saya pernah melihat beberapa job opportunity dengan slogan seperti berikut: “Perusahaan kami menerapkan agile dan scrum!”. Banyak juga bahasan mengenai “agile” lebih baik dari waterfall, adalah metodologi terbaik. Tidak sedikit pula junior programmer atau analyst atau project manager baru di kantor-kantor yang bersikukuh bahwa team harus mulai menerapkan agile dan scrum. Hal yang sama juga berlaku pada TDD (Test Driven Development). Benarkah scrum + TDD adalah metodologi yang terbaik?

Sebelum saya melanjutkan dengan pembahasan yang lebih detail, akan menekankan hal yang menurut saya pribadi paling penting dalam pengembangan applikasi / system:

Pergunakan tools / cara apapun yang dirasa terbaik untuk menghasilkan applikasi yang bekerja dengan baik, dan mudah diubah. “Make it works, and changeable!”

Individuals and interactions over processes and tools

Salah satu manifesto yang cukup penting dan sering dilupakan dalam agile adalah “individuals and interactions over processes and tools“, atau bisa disingkat sebagai “people over process“. Sebagai programmer / developer / analyst, terkecuali kamu adalah ConcernedApe yang men-develop indie game “Stardew Valley”seorang diri dulunya, kamu akan bekerja dalam team, berinteraksi dan membuat keputusan-keputusan bersama.

Preferensi setiap orang berbeda-beda, dan metolodogi tertentu bisa bekerja di satu kelompok orang, bisa juga tidak berfungsi di kelompok orang lainnya. Bagaimana kamu dan team developer bisa bekerja dengan baik adalah yang terpenting, proses / metodologi adalah “alat bantu” yang bisa digunakan untuk mencapainya. “Scrum user story“, “Kanban board” tidak lebih dari hanya alat bantu untuk bekerja dalam team.

Bila dalam beberapa situasi tools tersebut tidak dapat digunakan dalam team, misalnya mayoritas tidak mengerti cara pakainya, atau tidak merasa ada manfaatnya, atau misalnya projectnya cukup kecil sehingga tidak diperlukan, maka carilah alternatif tools yang lebih dapat bermanfaat bagi team. Misalnya post-it notes di cubicle kerja masing-masing, atau minutes of meeting yang di-share dalam email, atau bug tracker.

Pernah saya berdiskusi dengan seorang project manager yang cukup berpengalaman, mengapa beliau tidak menerapkan daily standup meeting, yang umumnya adalah senjata pemungkas di scrum. Beliau menjelaskan bahwa teamnya bekerja secara remote di berbagai daerah yang berbeda, sehingga daily standup meeting tidak dapat dilakukan. Selain itu, tidak selalu ada hal yang dapat di-share dalam daily meeting, sehingga beliau menerapkan rule weekly report, dan contact langsung apabila ada (laptop, mouse rusak misal atau approval) yang diperlukan. Itu adalah contoh “people over process“.

Management juga tidak akan serta merta mengubah metodologi yang sedang berjalan secara tiba-tiba, untuk mengadopsi scrum secara mendadak. Perubahan itu terlalu beresiko, apabila team tidak terbiasa dan banyak yang tidak mengerti, maka perubahan hanya akan membawa musibah daripada manfaat. Terkecuali memang ada kebutuhan untuk meningkatkan metodologi development, jangan memaksa management untuk berubah demi ego sendiri atau “hanya karena scrum lebih baik”.

Metodologi sebaik apapun tidak akan berguna bila team tidak dapat menghasilkan applikasi yang berfungsi dengan baik

Scale it!

Salah satu hal yang menarik yang saya cermati adalah tidak banyak orang yang menyadari bahwa metodologi yang berbeda bisa diterapkan dalam skala yang berbeda pula, dalam satu organisasi. Misalnya project manager dan customer menggunakan iterative waterfall untuk memecah-mecah feature development ke dalam project-project, sebagai team bisa saja development dilakukan secara agile / scrum.

Atau hingga dalam skala personal sebagai programmer, kamu bisa saja memecah task list yang diberikan menjadi iterasi2 yang bisa menghasilkan feedback dalam 2 minggu (iterasi standar scrum), dan melaporkannya ke project manager / team lead secepatnya.

Don’t forget to make it changeable!

Saya berani bertaruh, tidak ada development plan / requirement yang tidak berubah saat development. Perubahan requirement adalah sangat wajar dan sangat mungkin terjadi. Di luar negosiasi finansial yang memang bukan ranah developer, mengembangkan applikasi agar bisa mudah diubah-ubah sesuai dengan perubahan requirement adalah penting. Applikasi yang mudah diubah juga penting agar dapat menambahkan fitur dengan mudah di kemudian hari. Hal ini juga tersirat dalam agile manifesto, “Responding to change over following a plan“.

Lalu bagaimana dapat mengembangkan applikasi yang mudah dikembangkan / diubah? Salah satunya adalah dengan membuat “low coupling, high cohesion” modul (class / function). Dan TDD dapat membantu mengembangkan kode yang low coupling tersebut. Namun dengan efek samping development time yang meningkat hingga 2x dari biasa dan kompleksitas dalam unit test, tidak semua team dapat menggunakan TDD (namun pastikan menggunakan TDD bila memungkinkan).

Ada 2 pemahaman lain yang juga dapat membantu mengembangkan kode “low coupling high cohesion”, yaitu Single Responsibility Principle, dan Dependency Injection. Keduanya adalah bagian dari SOLID principle, yang menurut saya lebih bermanfaat dari ke-3 pemahaman lain dari SOLID principle.

Conclusion

Pergunakan development method yang paling cocok dan bermanfaat untuk team. Kembangkan applikasi yang berfungsi, bisa digunakan dan mudah untuk diubah. Kembangkan kode yang “Low coupling High cohesion” agar applikasi dapat diubah dengan lebih mudah.

Advertisements

Sekilas tentang biaya dan investasi

Beberapa bulan ini Indonesia diramaikan dengan banyaknya penipuan dalam berbagai macam bentuk, baik investasi maupun jasa. Artikel ini akan mencoba membahas sedikit apa saja yang perlu diketahui perihal biaya jasa dan hasil dari investasi.

Private company berorientasi pada profit / untung

Satu hal yang perlu diingat saat ingin menggunakan suatu jasa, adalah perusahaan / orang / badan yang menawarkan jasa tersebut pasti mencari keuntungan dari transaksi tersebut. Perusahaan akan mengambil keuntungan dari profit margin yang telah ditetapkan sebelumnya. Ambil contoh profit margin 20%, yang berarti untuk transaksi sebesar Rp. 120 ribu berarti perusahaan mengambil untung 20 ribu, dan 100 ribu adalah biaya asli dari jasa yang dikeluarkan.

Profit margin bermacam-macam sesuai dengan barang / jasa dan kisaran harga yang ditawarkan. Namun role nya tetap sama, apabila perkiraan keuntungan yang diperoleh dari penyedia jasa sangat sedikit, pasti ada sesuatu di belakang barang / jasa yang ditawarkan.

Memperkirakan keuntungan

Untuk mencari tahu kisaran keuntungan dari satu barang / jasa tidak mudah dan diperlukan pengetahuan mendalam terkait bidang tersebut. Namun minimal, anda bisa membandingkan harga barang / jasa yang ditawarkan, dengan kisaran harga lain yang berada di pasaran.

Misalnya sebuah mouse wireless model A dijual di kisaran Rp. 90-100 ribu, maka bila ada yang menjual di harga 120 ribu adalah sangat kemahalan, dan di harga 70 ribu sangat kemurahan. Pasti ada sesuatu pada mouse yang dijual di harga 70 ribu itu, apakah penjualnya tidak membayar pajak penjualan, atau barang masuk melalui jalur gelap sehingga tidak terkena pajak impor, atau bisa jadi itu adalah barang rekondisi. Namun mungkin juga si penjual membeli mouse tersebut dalam jumlah grosiran, sehingga harga perolehannya bisa sangat murah dan mampu menjualnya lebih murah.

Intinya, bila tidak ada kompetitor yang mampu menwarakan barang / jasa di tingkat harga yang sangat rendah tersebut, pasti ada sesuatu di belakangnya.

“Sesuatu di belakang harga yang sangat rendah”

Banyak faktor yang bisa membuat harga suatu produk / jasa menjadi sangat rendah, baik itu positif ataupun negatif. Mengetahui alasan di balik harga yang rendah tersebut sangat membantu kita menilai apakah barang / jasa tersebut layak untuk dibeli / diperoleh.

Alasan pertama yang paling umum, yaitu untuk promosi. Produk-produk dengan merk / model baru banyak yang dijual dengan kisaran harga 10% lebih murah untuk kepentingan promosi. Setelah banyak transaksi yang berhasil, baru produk tersebut kembali ke nilai aslinya.

Berikutnya adalah adanya pendapatan di samping barang / jasa yang ditawarkan. Misalnya mesin pencarian google yang gratis, di belakangnya ada transaksi yang besar untuk menempatkan website-website tertentu di halaman pertama pencarian google.

Biaya yang lebih rendah juga bisa jadi alasan rendahnya harga barang / jasa yang ditawarkan. Membeli barang secara grosir dan langsung dari agen utamanya, tentu akan mendapatkan diskon dan dapat dijual lagi dengan harga lebih murah. Produksi furniture dengan mesin dalam jumlah yang banyak, seperti yang dilakukan IKEA saat ini, tentu mengurangi biaya produksi. Uber dapat menawarkan harga yang lebih murah dari taksi konvensional, terlepas dari niat promosinya, beberapa alasannya adalah struktur organisasi yang lebih ramping dan proses yang lebih efisien.

Dalam investasi

Dalam investasi, suku bunga bank dapat dijadikan acuan untuk menentukan ekspektasi return profit dari investasi di pasaran. Misalnya bank A, B dan C masing-masing menawarkan suku bunga deposito sebesar 5%, 5.5% dan 6% per tahun, berarti kisaran return profit investasi yang paling aman di pasaran adalah sebesar itu. (Bila dalam contoh ada bank D yang menawarkan bunga deposito 8% per tahun juga perlu diwaspadai, apalagi bank yang kurang ternama).

Investasi dengan profit return yang lebih kecil dari bunga deposito tidak bermanfaat, taruh saja di deposito bank. Semakin besar return profit investasi yang ditawarkan dibandingkan dengan suku bunga bank, semakin besar risk yang harus dihadapi dari investasi tersebut (misalnya saham).

Dalam dunia IT…

Aturan yang sama juga berlaku dalam dunia IT. Harga yang sangat beragam dari vendor-vendor yang beragam untuk satu produk (applikasi) IT memiliki alasan-alasan tersendiri di belakangnya. Apakah memang biaya development nya mahal (jumlah programmer banyak), apakah vendor tidak efisien sehingga harga mahal atau sebaliknya, apakah vendor memiliki produk yang serupa sehingga kustomisasi tidak banyak, ataukah vendor menghasilkan produk yang berkualitas rendah (kita akan membahas kualitas software di lain kesempatan).

Namun secara umum, profit margin yang cukup logis (mungkin sekitar 15%-20%) sangat diperlukan bagi vendor untuk tetap mampu melanjutkan usahanya.

Kesimpulan

Setiap produk / jasa memiliki biaya dasarnya, dan ditambah dengan profit margin lalu menghasilkan harga pasaran. Harga yang lebih murah dari harga pasaran pasti memiliki alasan di belakangnya. Untuk IT, karena proses developmentnya lebih kompleks, maka harga penawarannya lebih beragam dari satu vendor ke vendor lainnya.

Kuliah IT tidak berguna? Betulkah?

Pagi ini saya sempat membaca satu artikel yang cukup menarik, mengenai 4 alasan yang membuat kuliah IT tidak berguna. Sebelum saya membahasnya, perlu saya ingatkan bahwa gelar sarjana atau S1 komputer cukup menjadi faktor penting atau bahkan faktor utama diterimanya bekerja di Indonesia sebagai programmer.

Gelar S1 Komputer (Sarjana Komputer)

Kemungkinan terbesar seseorang berniat menjalani dan menyelesaikan perkuliahan adalah untuk mendapatkan gelar S1. Minimal, gelar s.komp berlaku di perusahaan-perusahaan besar yang bidang usaha utamanya bukan di IT. Misal perbankan dan finansial sejenisnya, exportir-importir besar, perusahaan perminyakan, perusahaan produksi seperti mi instant dan lainnya. Startup-startup baru sepertinya lebih longgar mengenai gelar s1 saat perekrutan programmer.

Sepertinya bagus untuk dilakukan survey, untuk mencari tahu seberapa relevan gelar S1 komputer sebagai programmer saat ini.

Algoritma, analisa dan soft skill

Ada hal-hal yang tidak bisa diperoleh hanya dengan mempelajari pemograman saja dari internet, di antaranya algoritma, analisa, soft skill dan pengetahuan mengenai sistem. Perlu pengalaman dan latihan sendiri untuk mengasah kemampuan-kemampuan itu. Mungkin tidak tampak saat coding, bahwa skill-skill tersebut cukup besar manfaatnya dalam pengembangan sistem.

Tahukah anda, bahwa ada beberapa faktor yang menjadi tolak ukur kualitas system? Ini adalah beberapa di antaranya. Tahukah anda apa itu SDLC (Software Development Life Cycle)? OOAD (Object Oriented Analysis and Design)? Algoritma bubble sort, linked list, recursive? Soft skill seperti cara presentasi, komunikasi, kerja group dan diskusi. Banyak skill tersebut yang mungkin tidak anda kenal bila hanya mempelajari pemograman saja, tetapi diajarkan di universitas.

Note: skill-skill di atas berdasarkan pada pengalaman saya saat kuliah S1 Sistem Informasi di Bina Nusantara (BINUS).

Unit Kegiatan Mahasiswa (UKM), koneksi dan networking

Perkuliahan tidak hanya belajar saja. Koneksi, relasi dan networking bisa dibangun selama perkuliahan. Bisa saja anda menemukan partner yang tepat untuk membangun startup selama masa kuliah. Atau bisa saja menemukan pasangan hidup :).  UKM-UKM di universitas sangat berguna dan memberi pengalaman yang baik seperti mengatur seminar / acara, berhubungan dengan orang-orang yang bisa saja berpengaruh (seperti CEO startup atau pembicara), dan sekali lagi networking. Memiliki banyak networking sangat bermanfaat di dunia profesional nantinya.

Secara pribadi, saya memang tidak mengikuti UKM saat kuliah dulu. Berkaca pada saat ini, saya sangat menyarankan para mahasiswa/i untuk mengikuti UKM yang berhubungan dengan profesi yang ingin digeluti nantinya, misal computer club, atau yang dapat mengembangan soft skill, seperti english club. Pengalaman dalam UKM juga dapat disertakan di CV (curriculum vitae) sebagai pendukung sertifikasi.

Dosen juga manusia

Gali ilmu dan pengalaman dosen

Dan yang perlu ditekankan, dosen (apalagi dosen senior) adalah orang yang sudah berpengalaman di bidangnya, dan sudah/sedang mengalami dunia profesionalisme.

Jangan menyamakan kuliah dengan sekolah, di mana anda datang ke kelas, mengikuti pelajaran yang diberikan lalu pulang. Buat relasi dengan dosen, gali pengalaman-pengalaman dosen dan cari tahu pandangannya mengenai dunia profesionalisme. Asah kemampuan di rumah dan diskusikan hambatan-hambatan yang anda temui saat bertemu dengan dosen, setelah selesai kelas misalnya.

Sesi bimbingan dengan dosen, misal saat skripsi, sangat berguna dan tidak boleh disia-siakan. Dapatkan ilmu sebanyak-banyaknya dari orang yang sudah berpengalaman.

Take a project

Masa-masa perkuliahan memiliki waktu luang yang sangat banyak. Jadwal kuliah seminggu mungkin hanya sekitar 40 jam. Libur semester genap saja bisa sampai 1 bulan. Waktu yang ada itu jangan disia-siakan. Anda bisa mengambil project berbayar, mengambil part time, atau melakukan hobby project untuk sekedar melatih ilmu. Pergunakan github atau public repository lainnya dalam hobby project, agar nantinya dapat disertakan di CV.

Bekerja paruh waktu dan kuliah malam juga biasanya menjadi pilihan untuk mengambil gelar di saat tetap produktif.

Sistem perkuliahan IT

Berhubungan dengan artikel awal, 4 alasan yang membuat kuliah IT tidak berguna, tidak dapat dipungkiri bahwa perkuliahan IT di Indonesia masih kurang maksimal. Point 3 yang berbunyi “BANYAK SARJANA KOMPUTER TIDAK MAMPU JADI PROGRAMMER, HANYA JADI INSTALLATOR” juga adalah fakta. Akhirnya mahasiswa perlu melakukan usaha lebih untuk menutup kekurangan-kekurangan dari tidak efektifnya sistem perkuliahan.

Di samping itu, faktor mahalnya biaya perkuliahan bisa dianggap menjadi hambatan, dan menurunkan pandangan orang terhadap nilai-nilai tambah yang bisa diperoleh dalam dunia perkuliahan.

Kesimpulan

Kuliah tidak berguna bila skill yang mau dikembangan hanya sebatas skill pemograman saja. Tetapi bila ingin berkarya di dunia profesional, satu skill pemograman saja biasanya tidak cukup. Perkuliahan dapat membantu, atau lebih tepatnya menyediakan jalan untuk melengkapi skill-skill tersebut.

Newbie? Baca ini dulu

“Liburan sebentar lagi nih, iseng-iseng mau belajar programming ah”

“Mau coba cara bikin website e-commerce nih”

“Mau coba pemograman android nih”

Mulai dari mana ya?

Pemula-pemula yang baru mau mulai masuk ke dunia programming / IT biasanya dipenuhi pertanyaan-pertanyaan seperti “bagaimana caranya”, “mulai dari mana”, “cari di mana”, “ada contohnya nggak” dan lain-lainnya. Sementara, sebagian besar programmer berpengalaman, yang sehari-hari kerjaannya nge-google nyari-nyari info dan solusi, rata-rata nggak suka dengan pertanyaan seperti itu. Rata-rata programmer memang harus bisa mandiri dan bisa cari (baca: google) solusi sendiri. Tapi pemula yang nggak ngerti apa-apa juga akan bingung mau cari apa. Maka dari itu, sebelum mulai bertanya ada baiknya baca petunjuk-petunjuk ini dulu:

(more…)

Oh PHP empty…

Salah satu kelemahan terbesar PHP menurut saya adalah di null / value checking. Melihat bagaimana PHP adalah interpret language berarti validasi undefined value tidak dapat dilakukan di level compiler. Lalu bagaimana PHP adalah dynamic typing juga membuat null checking lebih sulit.

Null / Undefined

Ada 2 jenis variable kosong, yaitu null dan undefined. Variable null berarti variable tersebut pernah di-declare, dan di-initialize nilainya sebagai NULL. Undefined variable, adalah variable yang tidak pernah di-declare atau sudah di-declare namun tidak pernah di-initialize. Contoh:

$null = NULL; //null variable
$null2; //masih undefined
$null = $null + 1; //nilai $null jadi 1
$null = NULL;
echo $null["key"] === NULL ? "true" : "false"; //hasilnya true
$undefined = $undefined + 1; //error undefined variable

Lucunya di PHP, NULL dianggap sebagai sebuah value. Hal ini membuat operasi matematik / string yang berinteraksi dengan NULL tidak error, seperti contoh penambahan di atas. Untuk operasi matematik, NULL dianggap 0 dan untuk operasi string maka null dianggap string kosong. Bahkan untuk array, NULL hanya akan menghasilkan nilai NULL lagi dan tidak error.

empty / isset

Tadi kita sudah melihat bagaimana null dianggap sebagai value. Tetapi tidak pada pengecekan empty / isset. Anehnya lagi, kedua operasi tersebut tidak 100% berlainan dengan arti kata !empty == isset. Anggap kita menggunakan satu set variable sebagai berikut untuk mengecek validasi empty / isset:

$one = 1;
$two = 0;
$three = "";
$four = " ";
$five = "0";
$six = "false";
$seven = false;
$eight = [];
$null = NULL;
$null2;

Snippet untuk mengecek empty

echo 'empty($one) ';
echo empty($one) === true ? "true" : "false";
echo "\n";
echo 'empty($two) ';
echo empty($two) === true ? "true" : "false";
echo "\n";
echo 'empty($three) ';
echo empty($three) === true ? "true" : "false";
echo "\n";
echo 'empty($four) ';
echo empty($four) === true ? "true" : "false";
echo "\n";
echo 'empty($five) ';
echo empty($five) === true ? "true" : "false";
echo "\n";
echo 'empty($six) ';
echo empty($six) === true ? "true" : "false";
echo "\n";
echo 'empty($seven) ';
echo empty($seven) === true ? "true" : "false";
echo "\n";
echo 'empty($eight) ';
echo empty($eight) === true ? "true" : "false";
echo "\n";
echo 'empty($null) ';
echo empty($null) === true ? "true" : "false";
echo "\n";
echo 'empty($null2) ';
echo empty($null2) === true ? "true" : "false";
echo "\n";
echo 'empty($undefined) ';
echo empty($undefined) === true ? "true" : "false";
echo "\n";

Snippet untuk mengecek isset

echo 'isset($one) ';
echo isset($one) === true ? "true" : "false";
echo "\n";
echo 'isset($two) ';
echo isset($two) === true ? "true" : "false";
echo "\n";
echo 'isset($three) ';
echo isset($three) === true ? "true" : "false";
echo "\n";
echo 'isset($four) ';
echo isset($four) === true ? "true" : "false";
echo "\n";
echo 'isset($five) ';
echo isset($five) === true ? "true" : "false";
echo "\n";
echo 'isset($six) ';
echo isset($six) === true ? "true" : "false";
echo "\n";
echo 'isset($seven) ';
echo isset($seven) === true ? "true" : "false";
echo "\n";
echo 'isset($eight) ';
echo isset($eight) === true ? "true" : "false";
echo "\n";
echo 'isset($null) ';
echo isset($null) === true ? "true" : "false";
echo "\n";
echo 'isset($null2) ';
echo isset($null2) === true ? "true" : "false";
echo "\n";
echo 'isset($undefined) ';
echo isset($undefined) === true ? "true" : "false";
echo "\n";

Hasilnya

empty($one) false
empty($two) true
empty($three) true
empty($four) false
empty($five) true
empty($six) false
empty($seven) true
empty($eight) true
empty($null) true
empty($null2) true
empty($undefined) true

isset($one) true
isset($two) true
isset($three) true
isset($four) true
isset($five) true
isset($six) true
isset($seven) true
isset($eight) true
isset($null) false
isset($null2) false
isset($undefined) false

Untuk isset logikanya cukup mudah, semua variable yang sudah di set dengan nilai apapun terkecuali NULL menghasilkan true. Untuk empty cukup beragam, sebuah variable dianggap empty bila bernilai string kosong($three), string 0 ($five), boolean false ($seven), int 0 ($two) dan array kosong ($eight).

Encapsulate in function

Khusus untuk validasi undefined, saya belum menemukan cara lain kecuali dengan empty atau isset. Contoh dalam snippet kode berikut:

function isNullOrEmpty($str){
	return !(isset($str) && $str != '');
}
echo 'isNullOrEmpty($six) ';
echo isNullOrEmpty($six) ? "true" : "false";
echo "\n";
echo 'isNullOrEmpty($null) ';
echo isNullOrEmpty($null) ? "true" : "false";
echo "\n";
echo 'isNullOrEmpty($undefined) ';
echo isNullOrEmpty($undefined) ? "true" : "false";
echo "\n";

Hanya kode yang menggunakan variable $undefined saja yang menghasilkan PHP notice / error, lainnya tidak. Hal ini berarti kita tidak dapat meng-encapsulate function empty ke beberapa function validasi lain, seperti stringIsNullOrEmpty dan stringIsNullOrWhitespace.

Kesimpulan dan saran

Variable null dan undefined di-handle berbeda oleh PHP. Function empty dan isset juga menghasilkan validasi yang berbeda. Khusus untuk validasi variable undefined, saya belum menemukan function selain empty dan isset yang dapat meng-handle nya.

Sebagai programmer yang sudah lama menggunakan static type dan compiled language (C#), saya sudah terbiasa untuk melakukan variable declaration sehingga kemungkinan terjadinya undefined variable lebih kecil. Cukup baik untuk terbiasa melakukan variable declaration di awal function terlebih dulu untuk meminimalisir validasi empty / isset.

Pergunakan isset bila ingin me-validasi false dan empty value. Pergunakan empty bila sudah tahu kriteria-kriteria validasi yang dilakukan empty.

Dunning–Kruger effect

Kalau anda pernah mendalami dan sudah cukup ahli dalam suatu bidang/keahlian, kemungkinan besar ada saatnya dimana semakin anda belajar/berlatih, semakin rendah rasa percaya diri dan semakin anda merasa tidak mampu di bidangnya. Namun setelah mempelajarinya beberapa kali lagi, rasa percaya diri dan persaan mampu mulai berkembang dan bertambah seiring dengan banyaknya pelajaran/ilmu yang diterima.

Fenomena seperti itu disebut sebagai dunning-kruger effect.

dunning-kruger-effect-1024x724

Pengalaman saya dalam mengalami Dunning-Kruger effect

Dalam pemograman, saya sudah cukup banyak mempelajari dan memahami bidang architecture dan maintainability dari sebuah applikasi. Saya pernah mengalami rasa percaya diri yang tinggi setelah memahami N-Tier, dependency injection dan C#. Saat itu, saya berpikir bahwa inilah arsitektur terbaik dan paling mudah di-maintain. Sekitar 6 bulan berikutnya, saya mendapat kesempatan untuk menerapkan pemahaman saya dalam pengembangan di dunia nyata.

Setelah 3-6 bulan pengembangan berjalan, saya mulai merasakan masalah dan kesulitan dari arsitektur yang saya pilih. Semakin saya mempelajari lebih dalam, semakin saya ragu dengan kemampuan saya. Akhirnya setelah 1 tahun berjalan, proyek dibatalkan (yang merupakan keputusan dari sisi bisnis) dan applikasi yang saya kembangkan tidak berguna.

Kejadian ini saya manfaatkan untuk mengevaluasi pemahaman2 saya dan meneliti arsitektur-arsitektur secara lebih luas lagi. Saya mulai mempelajari nodejs dan kembali memperdalam php. Saya mulai menemukan banyak arsitektur baru dan mempelajari keunggulan dan kelemahan dari masing-masing arsitektur. Dari sana, saya mendapatkan pemahaman yang lebih luas dan menjadi semakin ahli dalam bidang ini.

Manfaat memahami / mengalami Dunning-Kruger effect

Dunning-Kruger effect adalah fenomena alamiah yang dapat dialami oleh siapapun. Efek ini juga alami terjadi dalam sebuah proses pembelajaran. Karena ini adalah proses alami, maka anda tidak perlu takut atau menghindarinya.

Orang biasa pada umumnya sudah menampilkan tanda-tanda menyerah saat mulai mengalami penurunan tingkat confidence saat baru mempelajari suatu bidang. Semakin mempelajari, semakin rendah tingkat confidence nya dan saat mencapai tingkatan terendah, mereka menyerah.

Namun sekarang anda menyadari bahwa ini adalah proses alamiah dan rendahnya rasa percaya diri itu adalah normal. Anda dapat mulai mempelajari bidang tersebut dari sudut pandang yang berbeda-beda, mencari teknik2 dan menggunakan cara-cara belajar yang berbeda. Perubahan cara pandang dan cara belajar tersebut memperbesar kemungkinan anda dalam mendapatkan pemahaman yang lebih luas, lebih dalam, dan meningkatkan confidence. Setelah itu, anda sudah mencapai tahap terakhir dari Dunning-Kruger effect dan pelajaran yang anda dapatkan berikutnya hanya akan memperkuat kemampuan dan confidence anda.

Conclusion

Dunning-Kruger effect adalah fenomena alami yang normal terjadi dalam proses pembelajaran. Memahami fenomena ini dapat membantu anda dalam melewati tahap confidence ter-rendah dan menjadi ahli dalam sebuah bidang yang diminati.

seminar at bizzy.co.id 22 feb 2016

Mengapa menggunakan framework?

Topik ini adalah salah satu bahasan yang cukup sering ditanyakan oleh programmer-programmer muda (saya belum tua tapi ya) yang baru akan memulai atau baru selesai memperlajari cara menggunakan framework. Sekedar flashback, penggunaan framework pada sekitar tahun 2005-an masih belum populer di Indonesia. Dan pada saat itu, konsep bahwa menggunakan framework menambahkan kode / size yang tidak perlu sangat mendominasi keputusan untuk mengarah ke scratch (tanpa framework).

Karena keterbatasan processing power dan kapasitas harddisk, sayapun pada saat itu juga mengarah untuk tidak menggunakan framework. Namun apa yang saya rasakah setelahnya adalah:

kalau kamu cukup mahir dan tidak menggunakan framework yang tersedia, kamu pasti akan membangun framework-mu sendiri

Mengapa demikian?

Susunan folder dan penempatan file

Untuk project berskala besar dengan tingkat kesulitan kompleks, susunan folder dan penempatan / pengelompokkan file menjadi suatu hal yang penting. Susunan file yang berantakan akan menyulitkan programmer-programmer lain untuk memahami kode, serta mengurangi kualitas dan meningkatkan resiko terjadinya bug.

Framework, pada umumnya sudah memiliki panduan untuk penempatan / pengelompokkan file-file dalam folder-folder tertentu. Standarisasi tersebut akan mempercepat programmer-programmer lain dalam memahami kode, atau mencari posisi kode yang menjalankan proses-proses tertentu. Contohnya folder config, constants, language dan sebagainya.

Bila tidak mengikuti / menggunakan framework yang tersedia secara umum, saya cukup yakin anda nanti akan membangun standar dan aturan pengelompokkan sendiri.

Arsitektur

Umumnya sebuah framework mengikuti susunan arsitektur tertentu. Misalnya pada php, umumnya framework-framework digunakan arsitektur MVC atau HMVC, karena paling cocok dalam server-client architecture. Bila menggunakan contoh lain, misalnya C# dan desktop, prism adalah framework MVVM untuk WPF.

Bagi programmer-programmer yang memahami manfaat arsitektur dalam pemograman, saya cukup yakin bila mereka tidak menggunakan framework yang tersedia, maka mereka akan membangun arsitektur yang mirip (misal dengan MVC).

Class Library

Project yang kompleks memerlukan banyak sekali operasi yang beragam. Namun tidak sedikit dari operasi tersebut yang mirip, berulang dan dapat dikelompokkan menjadi library / class library. Contohnya: logging, serialization, export to excel/csv, image manipulation dan masih banyak lagi.

Framework umumnya sudah memiliki cara sendiri / standar untuk meng-organize library-library tersebut. Contohnya pada laravel yang sudah menggunakan composer sebagai package manager, dan PSR4 untuk autoload class.

Common cases / operation

Mirip dengan class library, ada beberapa kasus / operasi yang umum dan sering ditemui dalam pengembangan applikasi. Contohnya bila dalam php adalah routing, login authentication, response type dan view templating. Umumnya framework sudah mendukung operasi-operasi tersebut.

Standar pengembangan, update dan komunitas

Keuntungan dari menggunakan framework yang tersedia, adalah framework tersebut sudah memiliki standar pengembangan (penempatan kode). Framework juga umumnya diupdate mengikuti teknologi terbaru, dan memiliki komunitas pengguna yang secara tidak langsung meningkatkan kualitas framework, dan mengurangi kemungkinan bug yang ada.

Kesimpulan

Banyak keuntungan yang didapat dengan menggunakan framework. Dan meskipun seseorang yang mahir tidak menggunakan framework yang sudah tersedia, cepat atau lambat applikasi yang dikembangkan akan mengarah dan pada akhirnya menghasilkan framework buatan sendiri.