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.

Saya sedikit menyesal, kenapa tidak menemukan layanan ini dari dulu. Saya pernah mencicipi akses ke layanan ini ketika jadi member ACM, tapi jumlah buku yang ada sangat sedikit (beberapa ratus buku saja), dan waktu itu belum bisa offline. Beberapa buku yang sudah saya baca (sudah saya beli) ternyata ada di sini. Jadi sekalian di posting ini saya ceritakan beberapa buku yang menarik (yang saya miliki dan sudah saya baca) yang bisa ditemukan di Safari Books Online:

Tangled WebThe Tangled Web oleh Michal Zalewski. Buku yang sangat bagus yang membahas semua aspek security Web, dari mulai protokol HTTP sampai semua aspek browser. Bacaan wajib untuk orang yang berkecimpung di dunia web. Buku ini bukan untuk orang yang benar-benar pemula, dibutuhkan pengetahuan dasar mengenai protokol HTTP, tentang HTML, dan juga tentang JavaScript.

9781597492997_s-stealing-network
Stealing the Network: The Complete Series Collector’s Edition
Sebenarnya ini tadinya 3 buku novel yang dijadikan satu. Saya baru selesai membaca bagian pertama dan setengah bagian kedua. Buku ini bagus karena menjelaskan masalah security dalam bentuk cerita yang menarik. Di bagian pertama (buku pertama), ceritanya terpisah (seperti kumpulan cerpen), di buku selanjutnya, ceritanya memiliki hubungan.

9780735634688_s-code
CODE
Buku ini membahas hal yang amat dasar sekali, bagaimana informasi diproses dari mulai manipulasi bit. Buku ini berbeda dari semua buku pengenalan komputer yang lain, caranya bercerita sangat menarik, penjelasannya sangat sederhana. Buku ini sangat cocok untuk pemula.

Sebenarnya saya tidak menemukan hal yang baru di sini (karena saya sudah mengerti semuanya), tapi saya membacanya sampai habis karena saya mengagumi caranya bercerita. Suatu hari saya ingin bisa menjelaskan ke anak saya seperti ini.

9781118107874_s-app-empire
App Empire: Make Money, Have a Life, and Let Technology Work for You
Buku ini menjelaskan mengenai bagaimana mendapatkan uang yang banyak dari aplikasi mobile. Banyak triknya yang tidak berlaku lagi (dan menurut saya mengesalkan bagi pengguna aplikasi), tapi buku ini memberikan pencerahan pada saya mengenai berbagai trend di dunia mobile. Buku ini banyak menjual mimpi, tapi mungkin bisa memotivasi Anda untuk mempertimbangkan dunia mobile.


Don’t Make Me Think!: A Common Sense Approach to Web Usability, Second Edition
Selain mengenai teknik pemrograman, saya juga suka membaca buku mengenai usability. Buku ini cukup ringkas dan menjelaskan dengan baik berbagai aspek usabilitas dalam web, walaupun masih kurang membahas teknologi terbaru (buku ini tahun 2005). Sebagian besar hal yang dijelaskan sangat obvious, tapi Anda akan menyadari betapa banyaknya website yang tidak memperhatikan usabilitas.

9781430219484_s-coders-at-workCoders at Work: Reflections on the Craft of Programming. Buku ini isinya kumpulan cerita dan pandangan hidup banyak programmer. Di sini kita bisa melihat bahwa para programmer hebat memiliki pandangan hidup yang berbeda dalam memandang masalah pemrograman. Tidak ada kebenaran absolut dalam hal pemrograman, tidak ada gaya yang paling benar. Anda bisa melihat review yang lebih lengkap yang sudah pernah saya tuliskan sebelumnya di situs ini.

Meski koleksi bukunya sangat banyak, ada juga buku-buku yang tidak ada di sana. Kali lain akan saya tuliskan buku-buku menarik yang tidak saya temui di sana.

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:
Continue reading 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.
Continue reading 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 Eclipse (walau tidak wajib, tapi memakai Eclipse akan lebih bagus untuk pemula). Jika ingin memprogram iPhone, belilah Mac, belajar memakai XCode, dan belajar memprogram dalam Objective-C. Tapi sebenarnya itu juga tidak 100% benar, karena ada beberapa opsi dalam memprogram platform tertentu.

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:

  • Developer membuat restriksi tertentu, misalnya jika ingin dipakai di aplikasi komersial, silakan bayar ke developer tersebut, atau buka source Anda. Contohnya lisensi GPL.
  • Developer menjual support untuk softwarenya (contoh: MySQL, gcc). Banyak pihak butuh support jika terjadi masalah di server mereka.
  • Developer punya versi yang lebih lengkap dan lebih bagus dari versi open sourcenya (contoh OpenBTS). Ini sedikit seperti model shareware, ada versi yang bisa dicoba, dan ada versi berbayarnya.
  • Developer punya plugin/module/library/theme untuk software open source yang bisa Anda beli (contoh: WordPress). Ini bisa banyak variannya, misalnya menjual tools khusus agar aplikasinya mudah dideploy di enterprise.
  • Developer menjual dokumentasi untuk softwarenya. Contohnya dokumentasi JPos harganya 50 USD. Programmer bisa mempelajari sendiri source codenya, tapi butuh waktu berapa jam? lebih murah membeli panduannya daripada berkutat dengan source code.
  • Website software tersebut ada iklannya, jadi developer mendapat uang dari iklan (banyak sekali proyek open source seperti ini).
  • Di software open source yang dipaketkan standar, ada iklannya (jika ingin versi tanpa iklan, silakan compile sendiri, contoh Free Download Manager)
  • Developer ingin supaya saingan saya yang closed source beralih ke software miliknya (kemudian membayar support atau membeli buku, atau melihat iklan di webnya, banyak contoh ini, misalnya OpenOffice). Sebagian orang juga berpikiran bahwa cara ini yang dipakai oleh Microsoft: biarkan saja sebagian orang membajak, asalkan perusahaan besar membayar lisensi Windows dan Office.
  • Developer ingin mempromosikan softwarenya untuk platform lain. Misalnya dulu Qt gratis di Linux, tapi komersial di Windows (sekarang gratis untuk semua platform).
  • Developer dibayar pihak lain atau bekerja sama dengan pihak lain, dan software tersebut sebenarnya mempromosikan produk mereka. Misalnya program yang hanya bisa melakukan koneksi ke database komersial tertentu. Firefox bekerja sama dengan Google (menjadikan Google sebagai search engine default).
  • Developer/perusahan ingin menguasai pasar dan akan mengambil keuntungan dari produk lain. Contohnya: Java. Oracle akan mengambil keuntungan dari berbagai application server for Java. Teknologi dasar Java sendiri bisa digratiskan dan diopensourcekan agar terkenal di berbagai platform.

Ada alasan personal. Alasan personal ini juga bisa banyak sekali:
Continue reading 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.
Continue reading 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.
Continue reading Cara Belajar Algoritma

Struktur Data

Mungkin sebagian dari Anda berpikir: buat apa sih belajar struktur data yang rumit? bukankah saya hanya tinggal memakai library tertentu?. Memang ada beberapa pekerjaan di mana Anda hanya perlu tahu sangat sedikit konsep untuk bisa bekerja, tapi pekerjaan semacam ini tidak banyak, dan di masa depan akan semakin hilang dengan banyaknya code generator.

Saya akan menunjukkan beberapa penggunaan struktur data dalam program-program yang umum ditemui setiap hari. Bahkan jika Anda bukan programmer pun, Anda kadang menemui struktur ini.

Tree structure (struktur pohon) sangat umum ditemui. Mulai dari struktur folder/direktori di komputer Anda, sampai di setiap halaman web yang Anda kunjungi (dokumen HTML memiliki struktur tree, setiap browser ada struktur tree untuk DOM HTML). Beberapa contoh lain di mana Anda akan menemui struktur pohon:

  1. Memproses XML memerlukan pemahaman mengenai tree
  2. Pohon keluarga (family tree)
  3. Pohon organisasi
  4. Membuat pivot table yang kompleks memerlukan pemahaman mengenai tree

Jika Anda menjadi administrator database yang ingin bisa mengoptimasi sampai level penyimpanan, Anda harus tahu struktur dasar seperti B-tree. Di beberapa database, misalnya Oracle, Anda bisa mengatur ukuran blocksize untuk indeks B-tree.

Struktur graph (graf) juga banyak digunakan sehari-hari:

  1. Node-node dalam sebuah jaringan membentuk graf, dan ini perlu dipahami oleh administrator jaringan.
  2. Jalan dan lokasi di sebuah peta bisa dianggap sebagai graf.
  3. Jaringan pertemanan (di Facebook, Friendster, dsb) juga merupakan graf. Jika Anda membuat situs seperti itu, Anda perlu tahu konsep graf.

Ada beberapa gabungan dari tree dan graph. Jika Anda menjadi administrator jaringan, Anda perlu mengenal konsep spanning tree untuk mengkonfigurasi STP (spanning tree protocol). Jika Anda perlu membuat program peta sendiri, Anda perlu struktur data quad-tree untuk mengakses dengan cepat node-node dalam graf yang Anda miliki.

Continue reading Struktur Data

Kurikulum Pemrograman

Tujuan pengajaran universitas adalah mengajarkan secara umum sebuah ilmu. Setelah itu masing-masing bisa mengambil bidang spesifik. Semua dokter yang Anda tahu (baik umum maupun spesialis) telah mendapatkan ilmu dasar mengenai tubuh manusia, pertolongan pertama. Meskipun sebagian besar dokter ini tidak akan pernah membedah dalam hidupnya, mereka pasti diajari juga ilmu dasarnya.
Saat ini banyak kurikulum pemrograman yang dibuat untuk mengikuti tren terbaru. Sayangnya tren ini bisa cepat sekali berlalu, dan kadang baru disadari kemudian betapa jeleknya tren sebelumnya (misalnya Microsoft yang menyadari Visual Basic merupakan bahasa yang tidak scalable, tidak cocok untuk enterprise). Di posting ini saya akan menceritakan kurikulum yang dulu saya alami ketika belajar pemrograman di ITB. Sayangnya saat ini kurikulumnya sudah berubah, tapi saya tetap ingin menunjukkan di sini, kira-kira kurikulum yang baik itu seperti apa.

Ketika saya belajar pemrograman di ITB, kurikulumnya dimulai dengan dasar pemrograman. Dalam dasar pemrograman kami diajari LISP. LISP merupakan bahasa dengan paradigma fungsional. Tidak semua aspek LISP diajarkan (misalnya do-loop yang sifatnya imperatif). Ketika belajar LISP, fokusnya adalah memanipulasi struktur data (list, tree) secara rekursif dan mengenai stateless programming.

Continue reading Kurikulum Pemrograman