Untuk mereka yang putus asa mau jadi programmer

Sudah beberapa kali saya temukan di berbagai forum dan mailing list, orang-orang yang bertanya: kenapa program saya ini tidak jalan, dan kemudian mereka mempaste source code mereka. Biasanya saya akan menemukan kesalahan-kesalahan super fatal, mulai dari:

  1. Salah syntax
  2. Salah besar-kecil huruf di bahasa yang case sensitive (misalnya C)
  3. Salah logika

Saya bisa memahami bahwa orang-orang ini mungkin:

  1. Salah memilih jurusan Informatika/Ilmu komputer, atau
  2. Terpaksa mengambil kuliah pemrograman karena ini mata kuliah wajib meski jurusannya tidak langsung berhubungan dengan pemrograman
20160409_113910 (1)

Untuk orang-orang dalam kategori pertama: sudah saatnya Anda memperbaiki cara belajar Anda, atau segeralah pindah jurusan. Jika Anda kesulitan mencari kerja karena Anda tidak bisa memprogram, itu murni kesalahan Anda.

Lanjutkan membaca Untuk mereka yang putus asa mau jadi programmer

Single Board Computer dan Single Board Microcontroller

Belajar embedded system merupakan cara yang baik untuk lebih mengenal arsitektur komputer. Di PC/Tablet/Smartphone, ada begitu banyak “layer” yang mempersulit pemahaman kita tentang hardware, tapi di embedded system, kita bisa langsung berinteraksi dengan hardware, bahkan tanpa menggunakan sistem operasi sama sekali.

Saat ini ada dua jalur populer untuk belajar embedded system: menggunakan single board computer (misalnya: Raspberry Pi, BeagleBoard, BeagleBone Black, Cubie Board, RadXa, dsb), atau menggunakan single board microcontroller (misalnya: berbagai versi Arduino, Parallax Propeller, LaunchPad MSP430, dsb).  Singkatan SBC untuk single board computer sudah lazim digunakan, tapi single board microcontroller  biasanya tidak disingkat, tapi supaya artikel ini ringkas, akan saya singkat saja sebagai SBM.

Perlu diperhatikan bahwa saya menekankan pada kata populer, Anda tidak harus menggunakan SBM atau SBC untuk belajar embedded system, tapi keduanya akan membuat proses belajar menjadi lebih mudah.

Banyak pemula merasa bingung memilih dan membedakan fungsi keduanya. Jika Anda melihat berbagai proyek elektronik di Internet, sepertinya fungsi dan kemampuan keduanya hampir sama.   Untuk lebih jelasnya, saya akan membahas keduanya.

Lanjutkan membaca Single Board Computer dan Single Board Microcontroller

Safari Books Online + Review Buku

Saya sekedar mau sharing layanan Safari Books Online (ini saya nggak dibayar, nggak dapet referal atau apapun). Layanan ini semacam perpustakaan di mana kita bisa meminjam buku selama menjadi member.

Paket termurahnya 9.99 USD/bulan, kita mendapatkan 5 slot buku yang bisa kita baca penuh. Setelah memasukkan sebuah buku ke dalam sebuah slot, bukunya hanya bisa dikeluarkan 30 hari kemudian. Kita bisa membaca bukunya offline menggunakan aplikasi yang mereka sediakan (untuk iOS/Android/BlackBerry). Mereka juga menyediakan trial 15 hari (tapi kita harus memberikan nomor kartu kredit).

Bagi sebagian orang, layanan ini tidak cocok, karena mereka ingin terus memiliki satu buku untuk dibaca ulang, tapi bagi saya yang jarang membaca ulang sebuah buku (kalau ada bagian penting, bisa saya copy paste), layanan ini sangat cocok.

Kenapa saya mau sharing hal tersebut? Harga sebuah buku asli sangat mahal, bahkan versi ebooknya sekalipun. Contohnya buku SDN: Software Defined Network harganya 47.99 (menurut kurs saat ini: lebih dari 500 ribu rupiah). Buku tersebut bisa dibaca sebagai satu slot dalam pakt 9.99 USD per bulan. Saya ingin hidup legal, tapi juga belum mampu membeli segala sesuatu yang saya inginkan.

Lanjutkan membaca Safari Books Online + Review Buku

Pentingnya memahami Ilmu Informatika secara menyeluruh

Hari ini saya menemukan link ke sebuah pertanyaan menarik di Stack Overflow. Sebuah pertanyaan sederhana: mengapa menjumlahkan elemen yang nilainya kurang dari nilai tertentu dalam array yang terurut, lebih cepat dari melakukan operasi yang sama pada array yang tidak terurut. Lebih jelasnya silakan baca pertanyaan dan jawabannya di sini:

Why is processing a sorted array faster than an unsorted array?

Ada beberapa hal menarik dari jawaban pertanyaan tersebut.

Pertama: meskipun Anda memprogram high level sekalipun (menggunakan Java/Ruby/Python, atau bahasa lain yang menggunakan JIT), Anda akan tetap dibatasi oleh hardware. Anda tetap perlu mengerti hardware untuk membuat aplikasi yang performasinya tinggi.

Kedua: perhatikan bahwa dengan mengetahui sebab dari masalah, kita bisa mempercepat program, tanpa menggunakan sorting. Cukup dengan menggunakan manipulasi bit yang menghilangkan branching. Kita ingin menghilangkan sorting, karena sorting sendiri butuh waktu.

Ketiga: dalam kasus tertentu, compiler bisa mengoptimasi jika diberi flag yang tepat. Tapi kita tidak bisa menggantungkan diri pada compiler saja. Compiler yang berbeda menghasilkan kode yang berbeda, dan hasilnya bisa sangat jauh berbeda. Misalnya disebutkan bahwa compiler Visual C++ 2010 tidak bisa mengoptimasi kodenya, sedangkan compiler Intel bisa melakukannya dengan sangat baik.

Keempat: Perhatikan juga bahwa optimasi compiler dibatasi oleh hardware. Hardware tertentu (misalnya Intel sejak Pentium Pro) mendukung instruksi conditional move (di assembly Intel, instruksi ini disebut dengan CMOV) yang tadinya perlu manipulasi bit manual (AND, OR, dsb). Anda tidak bisa menggunakan optimasi ini di semua hardware, apalagi jika Anda menargetkan CPU model lama (banyak digunakan di embedded device).

Mungkin sebagian dari Anda mengira pertanyaan tersebut agak mengada-ada: untuk apa mencari jumlah bilangan yang kurang dari N dan dilakukan berulang-ulang, kalau sekali saja kan hanya butuh beberapa milidetik. Dan berbeda beberapa milidetik saja kan harusnya tidak berpengaruh bagi user.

Saya terpikir beberapa aplikasi dalam dunia nyata yang mungkin membutuhkan penjumlahan secara cepat tapi berulang-ulang. Saya berikan contoh kecil: Misalnya Anda punya aplikasi interactive data viewer, dengan slider yang bisa diubah nilainya dengan mouse (sangat cepat)

  1. Anda punya array yang berisi daftar jumlah gaji semua orang pegawai di sebuah kota (arraynya tidak terurut)
  2. Kita ingin menampilkan secara interaktif: jika saya set slider ke nilai 1 juta, maka saya akan melihat bahwa total gaji semua orang yang dibawah satu juta adalah X
  3. saya bisa mengubah nilai di slider, dan menghitung ulang total semua orang yang gajinya di bawah 2 juta. Saya bisa menaik turunkan slider dengan sangat cepat, ratusan kali per detik nilai slider bisa berubah.

Perhatikan bahwa meskipun contoh ini hanya menyatakan kurang dari X, tapi sebenarnya berlaku juga untuk operasi lebih dari X, atau X dalam range tertentu.

Dalam contoh ini: perbedaan interaksi antara beberapa milidetik dan beberapa puluh milidetik bisa sangat terasa. Jadi mengerti untuk mengurutkan data (atau menggunakan trik manipulasi bit) sebelum menjumlahkan bisa membuat interaksi semakin smooth. Menggunakan database untuk tujuan animasi yang sangat smooth seperti itu tidak akan berhasil (latensinya sangat tinggi), apalagi misalnya devicenya kemampuannya processing/komputasinya rendah (misalnya tablet atau smartphone).

Sebenarnya saya bisa menunjukkan contoh yang lebih kompleks lagi (misalnya dalam hal komputasi piksel grafik), tapi nanti pembahasannya akan ngelantur ke mana-mana. Hal yang ingin saya tekankan adalah: ada banyak persoalan serupa dalam dunia nyata semacam ini. Ini adalah penyederhanaan, supaya inti masalah bisa dilihat lebih jelas.

Seringkali jika ada yang menunjukkan bahwa optimasi seperti ini diperlukan, jawaban programmer yang malas adalah: beli saja hardware yang lebih cepat, masalahnya kan beres. Perlu dicatat juga: bahwa membeli hardware yang lebih cepat tidak selalu menjadi solusi.

Misalnya Anda menjual aplikasi Anda di Apple appstore, Anda harus mendukung hardware terlambat sampai tercepat. Jika Anda bandingkan iPad generasi pertama dan kedua, maka perbedaan hardwarenya sangat jauh: memori menjadi 2x lipat, prosessor menjadi jauh lebih cepat (dari single menjadi dual core). Anda bisa mengabaikan 14.8 juta pengguna iPad 1, tapi penjualan aplikasi Anda bisa menurun jauh.

Mungkin Anda terpikir untuk melakukan komputasi di server saja. Tapi berapa delay karena latensi jaringan? apakah kecepatannya cukup acceptable untuk membuat interaksi yang smooth?

Jika saya rangkum, semua hal tersebut menunjukkan: betapa perlunya kita belajar ilmu informatika atau computer science secara baik dan menyeluruh. Misalnya dalam contoh yang sangat kecil ini:

  1. Dalam arsitektur komputer, kita belajar mengenai batasan hardware, bagaimana arsitektur CPU superscalar bekerja.
  2. Dalam pelajaran algoritma, kita belajar mengenai kompleksitas algoritma. Bagaimana memilih algoritma yang baik.
  3. Dalam pelajaran compiler, kita bisa tahu optimasi apa yang bisa (dan tidak bisa) dilakukan oleh compiler
  4. Dalam pelajaran networking, kita bisa tahu mengenai latensi jaringan (jika ingin memindahkan komputasi ke server)

Jadi menurut saya, orang-orang yang ingin membatasi pelajaran komputer hanya dengan materi yang praktis saja, tidak akan berhasil.

Masih Ingin Banyak Belajar

Dari dulu ada banyak sekali hal-hal yang masih ingin saya pelajari yang berhubungan dengan pemrograman, ada banyak hal yang ingin saya buat. Setiap kali saya melihat sesuatu dilakukan, saya penasaran: bagaimana sih caranya teknologi itu bekerja? rasanya seperti apa sih memprogram benda seperti itu? Sekarang saya ingin menuliskan sebagin hal yang sudah saya pelajari/lakukan, dan hal-hal yang ingin saya lakukan. Sebagian ini bisa dianggap resolusi 2012.

001

Ini beberapa daftar keinginan saya dari mulai waktu jaman SMU dulu yang saya ingat saat ini yang sudah kesampaian:

  • memprogram virus polimorfik
  • membuat antivirus
  • Membuat animasi dengan assembly yang kurang dari 100 byte (waktu itu saya membuat animasi API)
  • membuat program kompresi (cuma pernah huffman, belum yang lain)
  • membuat game mode grafik (dulu pernah membuat beberapa, tidak ada yang benar-benar selesai, tapi sudah cukup puas)
  • memproses gambar (teknik dasar manipulasi piksel)
  • membuat daemon
  • memprogram Wii (porting 2 emulator)
  • membuat server HTTP, proxy server
  • mengimplementasikan beberapa enkripsi, dan setidaknya memahami berbagai jenis enkripsi (tidak pusing lagi dengan istilah stream, block, cbc, dsb)
  • menulis program dengan FORTAN (cuma untuk tugas kuliah, setelah itu pernah menulis bagaimana menghubungkan gfortran dengan DELPHI)
  • membuat aplikasi desktop dengan GUI di Windows, Linux, OS X
  • menulis sendiri shellcode untuk exploit buffer overflow
  • memprogram set top box, yang punya fitur DVD player (dengan Windows CE)
  • memprogram J2ME (pengalaman pertama memprogram mobile device dengan SL45, HP Java pertama)
  • memprogram serial port, modem, STK (Sim toolkit), SMS
  • membuat program yang berhubungan dengan SMS center
  • memprogram Palm OS, Symbian, BlackBerry
  • memprogram mesin EDC (mesin untuk swipe kartu kredit, mencetak tanda terima)
  • membaca source code Linux dan FreeBSD (serta NetBSD). Sudah berhasil memporting kernel Linux dan FreeBSD dan kodenya pernah direview oleh salah satu developer FreeBSD
  • membuat aplikasi web dengan PHP, Java, Perl, Python
  • membuat aplikasi dengan HTML5 dan ActionScript
  • memprogram microcontroller (ATMEGA, PIC, dan MSP430)
  • memprogram jam tangan (MSP430)
  • Mempelajari assembly MIPS
  • Reverse engineering berbagai program
  • Membuat shareware yang dijual
  • Menjual aplikasi BlackBerry di appworld
  • membuat program untuk update ROM handphone (Acer E130)
  • membuat parser dan translator sederhana (salah satunya adalah interpreter BASIC dalam JavaScript)

Masih ada beberapa yang ingin saya lakukan, tapi belum karena alasan ini dan itu:

Lanjutkan membaca Masih Ingin Banyak Belajar

Review Buku “Coders at Work: Reflections on the Craft of Programming”

Akhir-akhir ini saya sudah cukup jarang membaca buku programming. Saya lebih sering belajar hal baru dari tutorial dan dokumentasi di Internet. Saya lupa awalnya bagaimana, tapi saya menemukan (lagi) buku “Coders at Work: Reflections on the Craft of Programming”. Sebelumnya saya pernah menemukan versi bajakannya di internet, tapi tidak pernah saya selesaikan. Karena sekarang sudah punya Kindle, saya beli versi kindlenya, yang harganya lebih murah dari versi cetaknya.

Bukunya tidak terlalu tebal (632 halaman versi cetak), tapi karena sering terganggu, agak lama juga saya menyelesaikan buku ini.
Lanjutkan membaca Review Buku “Coders at Work: Reflections on the Craft of Programming”

Belajar Pemrograman (di luar bangku kuliah)

Ada beberapa orang yang membaca blog ini lalu mengirim email atau berkomentar. Kira-kira pertanyaannya begini: “Saya masih muda, tertarik pemrograman, harus mulai dari mana?”, “Saya dulu tidak kuliah informatika/komputer, tapi sekarang tertarik untuk memprogram, harus mulai dari mana?”, “Saya bingung mau mulai memakai bahasa apa”, “Compiler mana yang harus saya pakai?”, “Saya sudah mulai belajar memprogram, tapi saya nggak tau mau bikin software apa, ada ide?”.

Jawaban saya sebenarnya sangat sederhana: programlah yang Anda suka. Ini akan berpengaruh pada bahasa dan tools yang perlu Anda pakai. Misalnya Anda tertarik pemrograman karena ingin memprogram handphone Android Anda, maka belajarlah Java, belajar memakai IDE Android Studio (walau tidak wajib, tapi memakai Android Studio akan lebih bagus untuk pemula). Jika ingin memprogram iPhone, belilah Mac, belajar memakai XCode, dan belajar memprogram dalam Objective-C/Swift. Tapi sebenarnya itu juga tidak 100% benar, karena ada beberapa opsi dalam memprogram platform tertentu (tidak harus Java di Android, tidak harus Objective C/SWIFT di iOS).

Di tahun 80-an, bahasa yang mudah dikuasai dan bisa jalan di berbagai platform adalah BASIC. Sekarang yang mudah bagi pemula dan jalan di berbagai platform adalah HTML dan JavaScript. Jika niat Anda ingin membuat aplikasi yang jalan di berbagai platform, cobalah belajar HTML dan Javascript. Dengan tools/sdk seperti Titanium dan PhoneGap, Anda cukup belajar satu bahasa dan bisa berjalan di multi platform.

Lalu setelah belajar bahasa dan toolsnya, apa yang harus dibuat? itu terserah Anda. Cobalah membuat aplikasi yang Anda sendiri mau memakainya. Dengan membuat aplikasi untuk diri sendiri, Anda akan tau segala macam kekurangan aplikasi Anda. Jangan khawatir berpikir: aplikasi semacam ini sudah banyak, males ah bikinnya. Jika begitu cara berpikirnya, maka cuma akan ada beberapa lukisan bunga (ngapain ah ngelukis bunga, dah banyak yang bikin), dan tidak ada orang yang mau membuat apapun (misalnya tukang kayu akan bilang: ah ngapain bikin kursi sendiri, beli juga banyak).

Belajar memprogram itu enak karena umumnya tidak butuh bahan ekstra. Kalau lukisan Anda gagal, Anda perlu beli kanvas dan cat baru, kalau kursi buatan Anda gagal, Anda harus beli kayu lagi. Anda cuma butuh waktu untuk memperbaiki atau mengulang lagi jika program Anda salah.

Jadi intinya adalah: mulailah dari yang membuat Anda tertarik, maju terus, silakan coba-coba, jangan takut gagal.

Kenapa orang membuka source codenya?

Saya membaca di sebuah majalah Indonesia yang berusaha menjelaskan kenapa orang mau membuat software open source. Di situ sedikit sekali disebutkan motivasi yang ada dan yang paling dibahas adalah developer atheis yang ingin berbuat kebajikan dalam hidup ini. Di posting ini saya hanya ingin menyatakan bahwa ada banyak motivasi lain bagi seseorang untuk membuat software open source, dan tidak perlu satu artikel penuh untuk membahas satu motivasi.

sqlite

Ada alasan Komersial. Banyak orang yang tidak tahu bahwa ada banyak cara menghasilkan uang dari open source. Berikut ini saya tunjukkan beberapa di antaranya:

Lanjutkan membaca Kenapa orang membuka source codenya?

Asyiknya Open source

Sebagai orang yang cinta programming, saya sangat suka open source. Kali ini saya ingin menceritakan pengalaman pribadi saya dengan open source baru-baru ini. Sebagai orang yang sudah 3 kali mewakili Indonesia di Asia Open Source Symposium dan menjadi panitia ketika acara diadakan di Indonesia, saya sudah banyak mengemukakan dan mendengar masalah bagusnya open source sebagai ideologi dan untuk bisnis. Nah kali ini saya hanya akan membahas dari sudut pandang seorang pribadi yang cinta programming. Untuk Anda yang ingin mempertanyakan open source dari segi bisnis dan lain-lain, akan saya bahas lain waktu.

Saya baru membeli HP Android Acer BeTouch E130 beberapa minggu yang lalu. Device ini memiliki keyboard (bentuknya seperti Blackberry) dan harganya relatif murah. Sebenarnya banyak device android lain yang murah, tapi tanpa keyboard.

Sebagai penggemar command line dan terminal, hal yang ingin saya lakukan adalah menjalankan Debian di device saya. Android menggunakan kernel Linux yang lisensinya GPL, sehingga saya bisa mendapatkan source kernelnya dan mengcompilenya. Saya bisa mengcompile sendiri modul ext3 sehingga saya bisa menginstall Debian dalam lingkungan chroot.

Ketika mulai bermain dengan debian, saya mulai menyadari bahwa keyboardnya kurang nyaman untuk mengetik karakter yang sering dibutuhkan di command line dan program, misanya karakter tilde (untuk shortcut home directory) karakter kurung siku buka dan tutup (untuk indexing array), karakter kurung kurawal buka dan tutup (untuk blok kode program), dsb.

Untungnya program terminal dan client ssh yang saya gunakan (Android Terminal Emulator dan ConnectBot) sifatnya opensource, jadi saya bisa memodifikasinya. Untungnya lagi, proyek keduanya ada di github, jadi saya hanya perlu mem-fork sourcenya dan mengubahnya. Sayapun bisa berbagi perubahan yang saya lakukan pada dunia dengan sangat mudah.

Setelah debian terinstall, dan dengan keyboard yang sudah lebih nyaman, saya bisa menginstall debian dan aneka program di dalamnya. Saya bisa menginstall hampir semua program yang ada di desktop saya, misalnya server SSH, compiler C, Java, interpreter PHP, Perl, Python.
Lanjutkan membaca Asyiknya Open source

Cara Belajar Algoritma

Beberapa pembaca blog ini menanyakan “bagaimana sih caranya belajar algoritma?”. Daripada saya harus menjelaskan ulang berkali-kali, akan saya coba tuliskan di sini. Pertama perlu diingat bahwa cara belajar setiap orang berbeda-beda, jadi cara yang saya sebutkan mungkin tidak berlaku 100% bagi Anda. Misalnya jka Anda penyuka matematika, Anda bisa mempelajari aspek matematis algoritma, tapi dalam tulisan ini saya asumsikan bahwa anda bukan matematikawan.

Cara yang paling baik dalam memahami algoritma adalah dengan berlatih. Di tahap ini orang akan mulai bertanya: saya harus latihan apa? Cobalah berlatih membuat struktur data dasar, misalnya tree, atau linked list.

Ada banyak algoritma dasar yang bisa dipelajari dari sebuah struktur data, misalnya cobalah membuat binary tree. Pertama Anda bisa mencoba melihat buku, tapi setelah itu cobalah dengan menggunakan logika sendiri. Beberapa hal dasar dalam membuat binary tree: menyisipkan elemen tree, menghitung jumlah node daun (leaf node/node yang tidak punya anak), menghapus node, melakukan traversal, dsb. Lalu kemudian Anda bisa membuat pohon biner terurut. Setelah itu Anda bisa mencoba mengaplikasikan pohon biner itu pada masalah nyata, misalnya membuat kompresi dengan algoritma hufman.
Lanjutkan membaca Cara Belajar Algoritma