Programming dan Penetration Testing

Pentest adalah kegiatan menyerang sistem komputer untuk mencari kelemahan security, atau dari Wikipedia:

A penetration test, or the short form pentest, is an attack on a computer system with the intention of finding security weaknesses, potentially gaining access to it, its functionality and data.

Pentesting dilakukan atas permintaan client, jadi bukan hacking ke sembarang website. Contoh sederhana pentesting seperti ini: coba jebol website perusahaan kami, apakah ada bug securitinya? atau: coba pergi ke lobi atau tempat parkir perusahaan kami, apakah ada WIFI terbuka, apakah dari situ bisa masuk ke sistem internal perusahaan kami?. Kami punya app mobile, apakah bisa “dijebol” (misalnya apakah kita bisa membuat request ke server supaya memberikan data user lain).

Karena ini blog mengenai programming, saya tidak akan membahas banyak mengenai pentesting, hanya ingin menunjukkan betapa keahlian programming bisa sangat berguna untuk pentesting. Dari contoh yang saya sebutkan di atas, scope dari pentesting bisa sangat banyak, mulai dari yang on site: datang dan mengecek kabel, wireless network, dsb, sampai ke level network dan aplikasi (baik web, desktop, mobile). Saya hanya ingin membahas aspek programming, untuk mendorong peminat bidang security agar mau belajar programming.

Perkiraan saya mungkin sekitar 70% pekerjaan pentesting bisa dilakukan dengan tools yang sudah tersedia, baik yang open source maupun komersial, tanpa butuh keahlian scripting ataupun programming. Sisanya bakal butuh programming. Bahkan saya yakin 100% beberapa jenis bug tidak bisa ditemukan tanpa keahlian programming.

Screenshot_2014-11-27-18-19-36

Kemampuan programming minimal yang dibutuhkan adalah bisa mengcompile atau menjalankan program dalam berbagai bahasa. Kadang di sebuah server tidak tersedia tool tertentu, jadi kita perlu mengcompile dari source karena OS di server itu sudah terlalu lama (misalnya masih banyak yang memakai RHEL 4). Jika tidak tahu bagaimana menjalankan sesuatu, maka sudah game over di titik ini. Pernah saya baca di blog pak Budi Rahardjo mengenai kompetisi CDC (Cyber Defense Competition):

Salah satu soal yang disampaikan adalah men-decode data base64 yang kemudian menjadi skrip Python, yang tinggal dijalankan. Lucunya ada banyak yang gak tahu Python. ha ha ha. Mereka kebingungan menjalankannya. Padahal tinggal “python namaskrip.py”. Mereka tidak perlu tahu bahasanya. hi hi hi. Ada yang pura-pura tahu dan me-rename menjadi bahasa C, menambahkan “#include ” dibagian awalnya, kemudian mencoba compile. Ya gak bakalan jalanlah. he he he.

Kejadian semacam di atas itu yang mendorong saya menulis tulisan seperti ini.

Keahlian lain adalah mencari program atau menulis program kecil dalam bahasa tertentu yang kadang tidak terlalu umum atau sudah kuno. Contoh: jika sebuah web server bisa menerima upload file, dan web server itu hanya bisa menjalankan ASP versi klasik, ya kita harus bisa mencari shell dalam ASP Classic (bukan ASP.NET). Berbeda dengan software development biasa di mana kita bisa memilih bahasa pemrograman atau teknologi yang ingin kita pakai, di sini kita dipaksa mengikuti apa yang tersetup di server.

Jika beruntung, sudah ada orang yang menuliskan program standar (web shell) yang memiliki fungsi seperti “file manager/file upload” (untuk mengupload tool tambahan), “shell” (untuk mengeksekusi command apapun di sisi server), dan “database shell” (untuk mengirimkan query apapun ke database). Jika tidak beruntung, atau ada batasan tertentu di server, mungkin kita perlu membuat tool baru. Contoh sederhana: jika server membatasi upload hanya 100 KB saja, sementara binary nmap yang ingin diupload (plus librarnya) besarnya beberapa megabyte, maka kita perlu membuat program kecil untuk mengupload parsial lalu menggabungkan hasil uploadnya.

Keahlian membaca kode dalam berbagai bahasa juga diperlukan. Dalam beberapa kasus, kita bisa mendapatkan akses ke source code aplikasi web (karena bug, karena salah konfigurasi, karena lupa ikut mengupload direktori “.git”, dsb). Setelah punya source code, kita bisa menemukan bug tambahan dengan membaca kodenya. Sebagai pentester, tentunya Anda tidak akan bilang: wah ternyata dia pake Python, saya nggak tau cara ngehack aplikasi web dengan Python.

Dengan membaca source code, hal paling minimal adalah mengerti di mana file konfigurasi supaya bisa mengekstrasi user/password database, berikutnya adalah mencari bug-bug tambahan seperti SQL Injection, hidden functionality, dsb.

Dengan maraknya OS Mobile, sekarang pentesting juga masuk ke ranah mobile. Di sini ilmu reverse engineering sangat diperlukan. Untuk OS Android, reverse engineering bisa dilakukan dengan decompiler yang bisa mengembalikan kode Java ke bentuk semula (kecuali sudah diobfuscate), jadi kembali keahlian membaca kode diperlukan.

Setelah mengetahui kodenya, biasanya kita perlu melakukan fuzzing request, alias mencoba-coba berbagai kemungkinan request. Untuk aplikasi berbasis HTTP, kita masih bisa memakai proxy (misalnya ZAP) dan mengubah-ubah request untuk tahu reaksi server (bagaimana jika nilaiya negatif, bagaimana jika nama file mengandung “../”, dsb). Tapi untuk aplikasi yang memakai protokol khusus via SSL, kita perlu memahami, lalu mengimplementasikan ulang client sendiri yang bisa melakukan fuzzing.

Pengetahuan mengenai best practice dalam sebuah bahasa juga diperlukan dalam membuat aplikasi yang aman. Contoh: untuk menghasilkan bilangan random untuk kriptografi di Java gunakan SecureRandom (jangan Random). Di Android untuk melakukan koneksi SSL menggunakan socket, jangan gunakan SSLFactory tapi gunakan SSLCertificateSocketFactory, dsb. Pekerjaan pentester cukup mudah di sini, hanya menyarankan saja, dan programmer yang akan mengimplementasikan saran tersebut.

Saya sudah banyak menemukan bug yang memerlukan banyak coding. Ada bug yang terkait dengan penyimpanan password (terenkripsi) yang disimpan lokal di device yang seharusnya aman, tapi ternyata saya bisa membuat tool yang cukup optimal untuk bisa mengcrack dalam 1 jam karena banyak hal kecil yang lupa dilakukan oleh programmer (lupa menginisialisasi IV, memakai EBC). Saya pernah menemukan bug fatal yang berhubungan dengan menggunakan algoritma hashing yang tidak aman (tidak memakai Cryptographic Hash Function). Dengan tools yang tersedia saja, tanpa pengetahuan programming (dan kriptografi), kedua bug itu tidak akan bisa ditemukan.

Jadi saran saya: untuk mereka yang tertarik di bidang security, pelajari juga bagian programmingnya. Ini saya masih bicara level pentesting yang kebutuhkan programmingnya masih minimal. Di bagian lagin security, keahlian programming lebih dibutuhkan lagi, misalnya membuat exploit butuh pemahaman yang lebih mendalam tentang sistem dan low level programming.

Dalam full security audit, selain pentesting kadang client menginginkan juga review kode mereka, jadi kita perlu bisa membaca, menjalankan, dan memberi saran yang berkaitan dengan security.

Buat saya sendiri sebagai programmer, saya jadi rajin membaca mengenai best security practice untuk berbagai bahasa dan framework. Jika ada yang bertanya: buat apa sih belajar bahasa X atau teknologi Y, saya bisa bilang: mungkin suatu saat ada sistem yang memakai teknologi itu yang perlu saya test.

Menjual Aplikasi di Appstore

Dulu waktu saya masih kuliah, menjual aplikasi tidaklah semudah sekarang. Waktu saya kuliah, pemrograman mobile masih cukup baru. Menjual aplikasi baik desktop maupun mobile juga tidak mudah (sekarang berbagai metode pembayaran sudah tersedia). Biasanya yang saya kerjakan adalah mencari proyek.

playstore

Saya punya saran bagi mahasiswa yang saat ini masih kuliah: cobalah membuat aplikasi, minimal satu dan menjualnya di sebuah application store. Mengapa saya menyarankan orang menjual aplikasi di sana? Tujuan utamanya adalah untuk belajar. Menurut saya ada banyak sekali yang bisa dipelajari dari menjual aplikasi di app store. Pelajaran ini bukan cuma dari sisi programming, tapi keseluruhan software development lifecycle.

Catatan: Biasanya orang-orang mengasosiasikan “App Store” dengan apple, dalam konteks artikel ini “App Store” adalah sembarang application store (misalnya Apple App Store, Nokia OVI, BlackBerry Appworld, Google Play, dsb).

Sejak “demam app store” banyak orang (termasuk non programmer) yang belajar memprogram dan berusaha membuat aplikasi yang laris agar menjadi jutawan. Memang mungkin menjadi jutawan dengan menjual aplikasi, tapi saran saya: jangan jadikan itu tolok ukur kesuksesan. Anda bisa tetap sukses belajar meskipun tidak menjadi jutawan dari appstore.

Apa saja yang bisa dipelajari dari menjual aplikasi di app store? pertama dari sisi programming: Anda belajar bagaimana memoles dan mempaketkan aplikasi supaya bisa dijual. Anda akan belajar membuat aplikasi yang layak pakai oleh end user. Kadang untuk proyek tertentu (misalnya proyek pemerintah), aplikasi yang dibuat asal jadi, asal memenuhi spesifikasi.

Ketika Anda punya pengguna, Anda akan belajar bagaimana berinteraksi dengan pengguna. Anda akan menghadapi bug report, feature request, pujian, dan juga cacian. Bahkan jika Anda membuat game yang amat bagus sekalipun, bisa ada yang protes dan memberi review 1 bintang karena mereka “stuck di level 5”. Jika aplikasi Anda cukup kompleks, akan ada bug yang hanya muncul di user tertentu, dan Anda belajar mendebug bersama pengguna aplikasi Anda.

Setelah ada perbaikan, Anda akan bisa merilis update software Anda (meluncurkan versi baru). Setelah Anda merilis beberapa versi, Anda akan sadar perlunya memakai versioning system. Bagi Anda yang belum memakai versioning system (Git, CVS, dsb), maka ini saat yang baik untuk belajar.

Setelah merilis aplikasi, jangan berhenti dan menunggu. Belajarlah mempromosikannya. Pertama: buatlah website untuk aplikasi Anda, bisa berupa halaman blog, atau mungkin Facebook page. Anda perlu belajar membuat teks dan screenshot yang menarik dan bahkan mungkin perlu membuat video. Setelah itu promosikan di media sosial seperti Twitter dan Facebook. Hubungi juga situs-situs komunitas dan mailing list komunitas. Anda akan belajar bagaimana mengirim email mempromosikan produk Anda.

Di titik ini Anda bisa mengetahui apakah Anda tertarik pada marketing atau tidak. Anda mungkin akan bereksperimen dengan harga yang berbeda, bereksperimen menggunakan iklan, menggunakan in app purchase, dan sebagainya. Jika Anda membuat aplikasi bagus, memasarkan dengan baik, dan beruntung, Anda bisa mendapatkan pendapatan lumayan dari app store ini dari mulai sekedar puluhan ribu rupiah sampai puluhan juta tiap bulannya.

Saya menambahkan kata “beruntung” karena kadang memang butuh keberuntungan supaya aplikasi sukses di pasaran. Kata “beruntung” juga sebagai penghibur bahwa kadang-kadang aplikasi yang sudah sangat bagus dan dipasarkan dengan mati-matian masih bisa gagal di appstore. Sedangkan aplikasi sangat sederhana kadang bisa sangat sukses. Jadi kadang bukan kesalahan pembuat aplikasi dan bukan kesalahan marketing. Bisa saja di saat yang bersamaan, ada aplikasi serupa yang sedang dipasarkan perusahaan yang lebih besar.

Tergantung app store mana yang Anda pilih, Anda mungkin harus menandatangani perjanjian tertentu. Anda akan belajar mengenai revenue sharing, pajak, sistem pembayaran, dsb. Anda akan belajar bahwa ada app store yang harganya sama di seluruh dunia (misalnya harga aplikasi 0.99 USD akan sama di manapun juga di dunia), tapi ada juga yang memvariasikan harga tergantung wilayah pembeli (misalnya: di Nokia Ovi Store harga 0.99 EURO di Eropa bisa menjadi 0.3 USD di India).

Sebagai perbandingan: mencari proyek software itu gampang-gampang susah, baik dari proses mencari, mengerjakan, sampai mengejar pembayarannya. Appstore itu sangat gampang: Anda bisa masuk ke app store dengan gratis (misal Blackberry), sekali bayar (25 USD untuk Google Play), atau per tahun (99 USD/tahun, Apple AppStore). Anda bisa langsung menjual app dengan mudah, tidak ada yang memburu deadline, pembayaran juga langsung masuk rekening (tidak perlu menagih).

Selain mendapatkan pengalaman, Andaikan tidak ada yang membeli aplikasi Anda, Anda tetap memiliki portfolio. Sudah banyak sekali penawaran pekerjaan dan proyek yang saya terima karena ada orang yang melihat aplikasi yang saya buat. Ini cukup wajar. Misalnya ada seseorang yang ingin membuat aplikasi resep masakan, mereka akan mencari orang yang sudah pernah membuat aplikasi sejenis itu.

Saya sendiri kurang sukses secara langsung dari appstore, tapi cukup banyak mendapat tawaran proyek karena aplikasi yang saya pajang di appstore. Walau demikian, secara langsung dari appstore ada pendapatan ekstra belasan sampai puluhan dollar sebulan yang cukup untuk membayar hosting, atau kadang-kadang membeli satu dua barang online untuk dioprek. Dapet 5 USD? cukup buat beli Arduino atau makan siang yang enak, 35 USD? bisa beli Raspberry Pi, atau duitnya bisa juga dipinjamkan jika tidak tau ingin diapakan.

Mengajarkan pemrograman pada anak-anak

Anak saya yang sekarang ini usianya 4 tahun sudah mulai saya ajari memprogram dengan tutorial dari code.org. Mulanya anak saya iseng meminjam laptop saya, dan dia bermain-main, katanya dia sedang “mrogram”, jadi ternyata dia mau “play pretend” jadi programmer. Karena code.org menyediakan pelajaran untuk usia 4+, saya perkenalkan dia pada situs tersebut, dan dia sangat menyukainya.

IMG_0635

Mungkin sebagian dari Anda bertanya-tanya: ngapain sih anak-anak diajari programming? Apa gunanya? kenapa nggak diajarin nanti aja? Nanti jadi orang yang lebih dekat dengan mesin daripada manusia lain?

Sejak 2 tahun yang lalu, saya sudah membeli dan membaca buku Seymour Papert, yang berjudul, Mindstorms: Children, Computers, And Powerful Ideas.  Sebenarnya saya ingin menuliskan review yang panjang mengenai bukunya, tapi sudah ada orang lain yang menuliskannya dengan cukup detail. Jadi akan saya ceritakan secara singkat saja.

Buku ini ditulis tahun 1980 dan direvisi tahun 1993. Buku ini ditulis oleh pionir AI, yang pernah bekerja sama bertahun-tahun dengan Jean Piaget, seorang psikolog dan filosofer yang terkenal karena studi epistemologi pada anak-anak (epistemologi = teori  mengenai pengetahuan). Jadi buku ini dituliskan oleh orang yang benar-benar mengerti ilmu perkembangan anak, dan yang benar-benar mengerti mesin.

Belajar memprogram adalah belajar membuat instruksi yang logis dan  terperinci, jadi ini melatih logika anak. Ketika belajar membuat program, kita akan membuat kesalahan, di sini kita akan belajar debugging.  Ketika belajar memprogram, seseorang tidak belajar mengenai “benar”, dan “salah”, tapi “apakah ini bisa diperbaiki?”, dan “bagaimana cara memperbaikinya?”.

Ilmu pemrograman sangat dekat dengan ilmu matematika, tapi dari sisi praktis. Bahasa pemrograman Logo yang dirancang oleh Seymour Papert merupakan salah satu contoh pendekatan pengajaran matematika melalui program.

Ilmu yang dipelajari dalam pemrograman bisa diaplikasikan dalam hidup sehari-hari . Di buku Mindstorm, contoh yang diberikan adalah juggling. Keahlian yang sepertinya sulit ini ternyata bisa dipelajari langkah-langkahnya secara detail, dan jika kita membuat kesalahan, bisa didebug. Tentunya ini tidak cuma berlaku untuk juggling, segala macam aktivitas dan proses bisa dipecah menjadi langkah-langkah sederhana, dan bisa didebug.

Mengenai ketakutan bahwa anak-anak akan lebih dekat pada mesin: menurut saya ketakutan ini tidak terlalu beralasan.  Sejauh ini saya melihat bahwa orang-orang komputer di berbagai komunitas yang saya temui (komunitas network, programming, dan security), semuanya  memiliki banyak teman. Saat ini, anak sayapun lebih suka bermain dengan orang daripada dengan mesin.

Menurut saya, orang-orang yang kurang bisa bersosialisasi adalah karena orang itu introvert, jadi tidak peduli bidangnya komputer atau bukan. Orang introvert mungkin lebih banyak yang tertarik pada dunia komputer karena lebih nyaman bagi mereka berada di depan komputer. Jadi bukan komputer yang membuat orang menjadi introvert, tapi orang introvert yang lebih tertarik pada dunia komputer.

Tentunya mengajarkan pemrograman pada anak adalah keputusan orang tua, dan juga tergantung pada kemampuan dan kesukaan anak. Sebagai orang tua yang mengerti komputer (dan berusaha banyak membaca mengenai perkembangan anak), saya merasa bahwa pelajaran pemrograman ini berharga, dan anak saya merasa ini adalah hal yang menyenangkan.

Saya bukan orang tua yang ingin memaksa anaknya mengikuti jejak saya. Saya akan sangat senang jika anak saya mengambil bidang lain (misalnya kedokteran), tapi bisa menggabungkannya dengan ilmu pemrograman. Tapi jika dia mengambil jalan lain yang tidak ada hubungannya dengan pemrograman pun, saya tidak keberatan.

Perlu dicatat, bahwa logika dan pemrograman hanya salah satu dari banyak hal yang saya ajarkan pada anak saya. Saya tutup dengan quote dari Seymour Papert:

“I FEEL VERY DEEPLY COMMITTED TO THE IDEA that, although rationality isn’t everything, and passion and interests and faith of various sorts count as much–nevertheless, rationality is a force for the good, and the more people that are capable of rational, critical thinking–the better the world will be; the more that have access to knowledge about the rest of the world–the better the world will be.”

–Seymour Papert, Mathematician, Computer Scientist, Educator – 2007 Interview – One Laptop Per Child

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

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.

20160409_113910 (1)

Untuk orang-orang dalam kategori kedua, saya akan berusaha memberikan panduan amat sangat dasar mengenai cara belajar memprogram, supaya setidaknya Anda bisa lulus kuliahnya. Orang-orang yang punya bakat memprogram tidak perlu belajar dengan cara ini.

Pertama: cobalah mengetik ulang banyak program, mengcompile dan menjalankannya.  Kalau perlu, cobalah mengetik satu bagian demi satu bagian, lalu compile. Nanti Anda akan dapat feeling mengenai: nama-nama fungsi, pentingnya besar kecil huruf, dan hal-hal kecil lainnya.

Ketika program sudah jalan, cobalah “merusak” programnya. Perhatikan apa pesan errornya ketika salah nama variabel, ketika kurang tanda kurung, dsb, jadi ketika ada error serupa, Anda tahu sebabnya apa.

Ketika membuat program baru, jangan langsung mengetikkan semua program sampai selesai, lalu baru dicompile. Misalnya untuk membuat stack dalam C, cobalah buat dulu bagian typedef, bagian inisialisasi stack, dan bagian main. Coba compile, ketika sudah benar, coba tambahkan “push” lalu compile, coba tambahkan “print” untuk mencetak isi stack, compile, test apakah sudah jalan atau belum. Coba tambahkan “pop”, compile dan lihat hasilnya sudah benar belum, dst.

Intinya adalah: memprogram perlu dilakukan selangkah demi selangkah. Jika Anda berusaha mengetik semuanya, baru dicompile, maka Anda akan bingung sendiri.

Selanjutnya cobalah mencari video tentang cara memakai debugger. Ini akan sangat membantu Anda mengetahui jalannya sebuah program, Anda akan tahu bagaimana nilai variabel berubah, dan Anda akan tahu di mana program Anda crash (biasanya jika Anda membuat program dalam bahasa C, akan crash). Dengan menggunakan tools yang modern seperti XCode atau Visual Studio, Anda bisa mulai menggunakan debugger dengan sangat mudah (dengan satu klik atau dua saja).

Jika Anda mau melakukan hal-hal tersebut, semoga Anda bisa lolos mata kuliah pemrograman dan mungkin bisa menemukan jalan Anda sebagai programmer.

 

Catatan: Lihat juga link “Kurikulum Pemrograman” dan “Cara Belajar Algoritma

 

 

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. Continue reading 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.

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 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.