<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Cinta Programming</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/" />
    <link rel="self" type="application/atom+xml" href="http://cintaprogramming.com/atom.xml" />
    <id>tag:cintaprogramming.com,2009-07-02:/4</id>
    <updated>2010-08-13T06:30:16Z</updated>
    <subtitle>A hacker does for love what others would not do for money</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.261</generator>

<entry>
    <title>Struktur Data</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2010/08/struktur-data.html" />
    <id>tag:cintaprogramming.com,2010://4.64</id>

    <published>2010-08-01T05:14:04Z</published>
    <updated>2010-08-13T06:30:16Z</updated>

    <summary>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...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="umum" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>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.</p>

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

<p><b>Tree structure</b> (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:</p>

<ol>
<li>Memproses XML memerlukan pemahaman mengenai tree</li>
<li>Pohon keluarga (family tree) </li>
<li>Pohon organisasi</li>
<li>Membuat pivot table yang kompleks memerlukan pemahaman mengenai tree</li>
</ol>

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

<p>Struktur <b>graph</b> (graf) juga banyak digunakan sehari-hari:</p>

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

<p>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.</p>
]]>
        <![CDATA[<p>Mungkin sebagian dari Anda berpikir: itu kan hanya sebagian saja struktur data yang ada, bagaimana dengan yang lain? </p>

<p>Ketika belajar struktur data yang sederhana akan membantu kita memahami struktur data yang lebih kompleks. Misalnya jika seseorang tiba-tiba diminta mengimplementasikan tree dengan pointer, dia biasanya akan bingung. Sementara jika diajari selangkah demi selangkah mulai dari linked list, maka biasanya akan lebih mudah. Jadi fungsi pertama struktur yang sederhana adalah untuk mempelajari struktur yang lebih rumit. Dalam berbagai bahasa, struktur Linked List, Double Linked List, dsb sudah masuk menjadi API standar.</p>

<p>Dalam mengimplementasikan suatu struktur data, Anda bisa melihat kelebihan dan kekurangan masing-masing struktur data. Misalnya linked list sangat efisien untuk menyimpan data yang selalu ditambahkan di akhir. Ini akan membantu Anda memilih struktud data terbaik untuk keperluan Anda (jadi Anda tidak selalu hanya memakai java.util.Vector saja di Java). Jadi penggunaan struktur data spesifik berguna untuk optimasi. </p>

<p>Misalnya Anda punya beberapa punya struktur data yang hanya selalu ditambah saja di akhir. Struktur List akan sangat efisien untuk hal ini. Jika Anda sudah tahu tepatnya berapa data yang akan datang Anda bisa memakai array (atau std::vector di C++, atau java.util.Vector di Java). Tapi jika Anda tidak tahu, setiap kali array mencapai kapasitasnya, Anda perlu meresize memori (dan jika ternyata memori tidak cukup, tanpa sepengetahuan Anda kadang perlu ada penyalinan data ke lokasi memori yang baru). Jadi dalam kasus ini Anda bisa melihat bahwa List sederhana juga punya kegunaan.</p>

<p>Sebagian programmer yang saya tahu hanya memakai vector dan hashmap di Java untuk menyimpan apapun. Biasanya jika ada kesalahan mereka akan mulai bingung. Misalnya mengenai hashmap, ada banyak sekali orang yang menyangka HashMap di Java memiliki bug karena tidak paham implementasinya. Misalnya Anda bisa melihat <a href="http://forums.sun.com/thread.jspa?threadID=5419794">ini</a> dan <a href="http://groups.google.com/group/comp.lang.java.programmer/browse_thread/thread/31f6ebc80b7baa14/7d2b6b63db45a61e">ini</a>. Banyak orang berusaha membuat "solusi" yang aneh (namun tidak dipublish di web) misalnya dengan membuat fungsi hash baru (yang tidak lebih baik dari fungsi hash milik Java). Sebagai catatan: beberapa IDE (misalnya NetBeans)menyembunyikan kompleksitas implementasi HashMap, sehingga kita tidak bisa melihat representasi internalnya.</p>

<p>Kesimpulannya adalah: mempelajari struktur data merupakan hal yang penting. Hanya di bidang yang sangat sempit saja kita tidak perlu mempelajari struktur data. Dan bahkan dalam bidang yang sempit itu, pemahaman struktur data akan bisa banyak membantu untuk membuat program yang lebih baik.</p>
]]>
    </content>
</entry>

<entry>
    <title>Kurikulum Pemrograman</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2010/08/kurikulum-pemrograman.html" />
    <id>tag:cintaprogramming.com,2010://4.63</id>

    <published>2010-08-01T05:10:27Z</published>
    <updated>2010-08-01T05:13:35Z</updated>

    <summary>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...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="bahasa" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="umum" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>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.</p>

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

<p>Ketika saya belajar pemrograman di ITB, kurikulumnya dimulai dengan dasar pemrograman. Dalam dasar pemrograman kami diajari LISP. LISP merupakan bahasa dengan <a href="http://en.wikipedia.org/wiki/Functional_programming">paradigma fungsional</a>. 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. </p>
]]>
        <![CDATA[<p>Pelajaran tentang LISP ini nantinya akan berguna di lambda calculus. Aspek stateless dalam LISP ini kelak akan berguna juga di pemrograman parallel. Bahkan framework yang dipatenkan Google yang bernama <a href="http://en.wikipedia.org/wiki/MapReduce">MapReduce</a> diinspirasi dari fungsi "map" dan "reduce" di bahasa fungsional.</p>

<p>Setelah itu ada pelajaran algoritma dan pemrograman yang diajarkan dalam Pascal dan C. Kelas ini mengajarkan pemrograman dalam paradigma prosedural. Aspek fungsional sudah dipelajari di LISP, jadi dalam aspek prosedural, kami hanya perlu belajar mengenai aspek imperatif (state program, loop tanpa rekursi) dari sebuah program. Di sini terlihat bahwa paradigma prosedural juga mengandung aspek fungsional. Dalam kelas ini kami juga diajari cara menstrukturkan sebuah program (menjadi unit). </p>

<p>Pelajaran berikutnya ada dalam kelas Pemrograman Berorientasi Objek (obect oriented programming/OOP) yang sesuai namanya, mengajarkan paradigma OOP. Apa yang sudah dipelajari ketika belajar paradigma prosedural tetap terpakai di kelas ini. Semua jenis loop, kondisional, dsb semua masih terpakai. Jadi ketika masuk kelas OOP, hal tersebut tidak diajarkan lagi. Hanya aspek OOP saja yang perlu dipelajari, jadi kelas OOP benar-benar berfokus pada aspek OOP, bukan mengajari mahasiswa cara menulis loop atau mengajari konsep assignment.</p>

<p>Di antara konsep prosedural dan OOP, ada pelajaran mengenai paradigma deklaratif dengan menggunakan Prolog. Di sini kita diajarkan bahwa menyatakan setiap langkah program bukanlah satu-satunya cara untuk menyelesaikan masalah. Dalam pemrograman deklaratif, kita hanya menyatakan apa yang perlu dilakukan, tanpa perlu menjelaskan langkah-langkahnya. Ada banyak bahasa deklaratif di dunia ini (CSS, SQL, dsb), tapi pelajaran prolog ini kelak akan berguna di kelas Intelegensia Buatan, di mana kami diminta mengimplementasikan mesin inferensi untuk bahasa prolog sederhana.  Saya senang pernah mengenal paradigma deklaratif, karena sangat memudahkan ketika saya terjun dalam bidang math modelling language yang memakai paradigma <a href="http://en.wikipedia.org/wiki/Constraint_programming">constraint programming</a></p>

<p>Kalau Anda menengok wikipedia, ada masih banyak lagi paradigma pemrograman, tapi tidak semuanya diajarkan secara khusus. Sebagian besar paradigma dimasukkan ke kelas yang paling dekat (misalnya event driven programming ketika memprogram GUI dalam OOP, metaprogramming ketika belajar tempate C++, dsb). Sebagian paradigma sangat sempit pengunaannya dan bisa dipelajari sendiri nanti ketika diperlukan.</p>

<p>Beberapa bahasa lain juga perlu dipelajari dalam kuliah yang berbeda. Dalam metode numerik, kami belajar memakai FORTRAN. Setelah mempelajari beberapa bahasa, FORTRAN sangat mudah dipelajari. Selain itu dalam kelas arsitektur komputer, ada pelajaran mengenai bahasa assembly. Bagi sebagian orang ini agak sulit, karena memang urutan kuliahnya tidak diberikan sesudah Teori Bahasa Formal (yang mengajarkan konsep turing machine, dan sudah cukup dekat dengan assembly).</p>

<p>Bisa Anda lihat bahwa setiap pelajaran merupakan dasar dari pelajaran berikutnya (paradigma yang satu mengandung paradigma yang lain). Aneh sekali jika di kelas OOP yang diajarkan adalah tentang loop dan pernyataan if (aspek prosedural) atau tentang rekursi (aspek fungsional). Di kelas OOP yang diajarkan seharusnya adalah hal-hal yang spesifik OOP, seperti masalah inheritance, polymorphism dsb.</p>

<p>Jadi menurut saya kurikulum yang baik seharusnya mengajarkan banyak paradigma (bukan cuma satu saja) secara bertahap. Setiap tahap akan membuat mahasiswa bisa memahami setiap paradigma dengan baik, dan membentuk proses berpikir yang lebih baik.</p>
]]>
    </content>
</entry>

<entry>
    <title>Perlukah kuliah untuk bisa memprogram? bagian 2</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2010/07/perlukah-kuliah-untuk-bisa-memprogram-bagian-2.html" />
    <id>tag:cintaprogramming.com,2010://4.62</id>

    <published>2010-07-02T11:15:37Z</published>
    <updated>2010-07-02T11:25:30Z</updated>

    <summary>Saya ingin menambahkan point penting dari tulisan saya mengenai apakah perlu kuliah untuk bisa memprogram. Selain masalah ilmu yang dipelajar dalam kuliah, universitas juga menyediakan akses ke berbagai fasilitas.Pertama adalah hardware, jika Anda belajar sendiri, mungkin Anda akan mendapatkan kesulitan...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="umum" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[Saya ingin menambahkan point penting dari tulisan saya mengenai apakah perlu kuliah untuk bisa memprogram. Selain masalah ilmu yang dipelajar dalam kuliah, universitas juga menyediakan akses ke berbagai fasilitas.<div><br /></div><div>Pertama adalah hardware, jika Anda belajar sendiri, mungkin Anda akan mendapatkan kesulitan mengakses berbagai jenis hardware (komputer multiprosessor, robot, router, dsb). Di universitas, berbagai hardware tersedia bagi mahasiswa untuk bisa terjun langsung mencoba.</div><div><br /></div><div>Kedua adalah software. Mungkin sebagian besar software bisa dicari versi bajakannya di Internet, tapi ada beberapa software yang sulit dicari, atau sangat diproteksi (misalnya software yang terhubung ke Internet). Banyak perusahaan software memberikan lisensi gratis kepada universitas, atau kepada mahasiswa (selama masih menjadi mahasiswa).</div><div><br /></div><div>Ketiga adalah informasi. Informasi ini bisa berupa akses ke jurnal (umumnya universitas berlangganan jurnal internasional). Beberapa buku tidak tersedia ebooknya, dan umumnya universtas memiliki buku-buku yang bermutu yang bisa dipinjam.</div><div><br /></div><div>Selain ketiga hal tersebut, universitas juga memberikan akses pada para ahli (dsen dan peneliti) yang bisa diajak diskusi, dan bisa mengajar Anda untuk menghindarkan dari berbagai kesalahan umum, serta bisa mengkoreksi kesalahan Anda.</div><div><br /></div><div>Dan yang terakhir adalah: universitas mengajari Anda untuk bekerja bersama dan bersosialisasi. Dengan berbagai tugas yang diberikan, Anda akan belajar untuk membagi tugas, merencanakan pekerjaan, dan sebagainya. Hal ini sulit didapat dari belajar sendiri ataupun dari kursus.</div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Berpikir Ketika Memprogram dan Menguji Program</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2010/04/berpikir-ketika-memprogram-dan-menguji-program.html" />
    <id>tag:cintaprogramming.com,2010://4.61</id>

    <published>2010-04-21T14:25:59Z</published>
    <updated>2010-04-23T06:44:33Z</updated>

    <summary>Setelah membaca posting reddit ini, saya teringat kembali pada buku Programming Pearl, terutama bagian yang dibahas dalam posting itu yaitu mengenai binary search. Dalam buku programming pearl dinyatakan bahwa para programmer professional yang diberi waktu 2 jam untuk menulis binary...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="teknis" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="umum" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>Setelah membaca posting reddit <a href="http://www.reddit.com/r/programming/comments/bt7nh/according_to_jon_bentleys_book_programming_pearls/">ini</a>, saya teringat kembali pada buku Programming Pearl, terutama bagian yang dibahas dalam posting itu yaitu mengenai binary search. Dalam buku programming pearl dinyatakan bahwa para programmer professional yang diberi waktu 2 jam untuk menulis binary search, 90% memiliki bug (terutama di <em>boundary</em> condition). Penulis blog memberi tantangan pada pembacanya untuk membuat binary search, boleh beberapa jam, tapi <em>tanpa testing</em> sama sekali. </p>

<p>Respon kebanyakan orang bisa dirangkum menjadi tiga kubu. Kubu pertama: ah di dunia nyata kan orang pasti testing, keahlian buat memprogram dengan benar tanpa testing itu tidak berguna. Kubu kedua menyatakan: kalau program sependek itu tidak bisa dibuat tanpa testing, bagaimana mungkin bisa membuat program besar yang rumit, apakah tiap baris program harus ditest?. Kubu terakhir menyatakan: buat apa sih membuat binary search, kan sudah ada di library/API?</p>

<p>Untuk kubu terakhir, jawabannya sederhana: ada kasus di mana hal tersebut masih diperlukan. Misalnya fungsi binary search di library kebanyakan tidak menyatakan elemen mana yang akan dikembalikan jika ada lebih dari 1 data yang cocok, dan tidak akan mengembalikan lokasi di mana data bisa disisipkan jika data belum Ada. Contohnya di fungsi <code>bsearch</code> di C (POSIX): </p>

<blockquote>
  <p>The bsearch() function returns a pointer to a matching member of the array, or NULL if no match is found.  If there are multiple elements that match the key, the element   returned is <em>unspecified</em>. </p>
</blockquote>

<p>Kadang diperlukan fungsi yang mengembalikan elemen pertama yang cocok, atau terakhir yang cocok, atau bahkan elemen random dari antara semua elemen yang cocok. Tentu saja salah satu solusinya adalah membungkus fungsi bsearch, lalu mencari ke depan atau belakang sampai tidak cocok lagi. Tapi dalam hal ini Anda juga tetap perlu memperhatikan batas index ketika mencari, jadi Anda tetap perlu menulis kode (yang perlu testing dan perlu dipikirkan).</p>

<p>Jika Anda mengimplementasikan fungsi binary search sendiri, Anda bisa membuat fungsi yang sekaligus mengembalikan posisi elemen di mana kita harus menyisipkan elemen tersebut jika elemen tidak ditemukan (ini bisa didapat dari lokasi perbandingan terakhir), dalam kasus ini kita tidak bisa membungkus fungsi bsearch, karena fungsi tersebut hanya mengembalikan NULL jika elemen tidak ditemukan.</p>

<p>Beberapa Pelajaran yang bisa dipetik dari posting dan diskusi adalah: testing itu perlu, bahkan untuk program kecil sekalipun. Pelajaran kedua adalah: kita tetap harus teliti dan berpikir ketika memprogram. Pelajaran ketiga adalah: meski isi library di berbagai bahasa sudah cukup lengkap, mengerti algoritma sederhana itu perlu, dan kadang kita perlu mengimplementasikan algoritma tersebut atau variannya.</p>

<p>Sebagian orang berpikir: ah tidak perlu terlalu teliti ketika memprogram, nanti akan ketauan salahnya ketika testing. Sebagian lagi berpikir: program ini sudah saya pikirkan, jadi gak perlu ditest. Sikap yang benar adalah: kedua hal tersebut berhubungan, kita harus teliti ketika memprogram, dan harus teliti juga dalam membuat testing. Mengapa tidak menggantungkan diri pada testing saja? ada beberapa masalah dengan testing, pertama testing itu sulit, untuk membuat test case yang baik perlu kasus yang sangat besar dan kedua testing tidak selalu bisa dilakukan. </p>
]]>
        <![CDATA[<p>Contoh sebuah program dengan testing yang baik adalah SQLLite, kode program utama hanya 62 ribu baris kode, tapi kode untuk testingnya lebih dari 45 juta baris kode, atau 679 kali lebih besar dari programnya sendiri (Sumber: <a href="http://www.sqlite.org/testing.html">http://www.sqlite.org/testing.html</a>). Apakah Anda sanggup memikirkan dan membuat test sebanyak itu?. Mungkin Anda berpikir: ah tidak perlu sebanyak itu, test yang penting saja. Nah pertanyaannya: bagian mana yang penting untuk ditest? Anda perlu mencari semua boundary condition (misalnya dalam binary search: kasus kosong, kasus 1 elemen, kasus data berjumlah ganjil, kasus data berjumlah genap, kasus data tidak ditemukan, kasus data yang sangat besar). </p>

<p>Banyak sekali security bug dalam program terjadi karena <a href="http://en.wikipedia.org/wiki/Off-by-one_error">off-by-one error</a>, dan sering kali ini tidak diketahui. Kasus seperti ini akan sering jika penulis kode unit testing bukan programmer yang menulis kode, sehingga dia tidak bisa melakukan <a href="http://en.wikipedia.org/wiki/Boundary_value_analysis">boundary value analysis</a>. Oleh karena itu berpikir sambil memprogram adalah hal yang penting (jangan menggantungkan diri dari testing saja).</p>

<p>Ada kalanya testing kadang sulit dilakukan, misalnya jika program harus dijalankan di harware khusus. Hal ini terutama jika hardware tidak memiliki emulator, atau jika emulator tidak sempurna. Contohnya: banyak emulator ponsel (terutama Symbian versi awal) tidak mengimplementasikan bluetooth, kamera dan wifi. Mau tidak mau kita harus testing di hardware sebenarnya, yang biasanya memakan waktu lebih lama, dan kadang membutuhkan biaya yang lebih besar. Dalam kasus ini testing tetap bisa dilakukan, tapi harus diminimasi, dan harus dipikirkan dengan matang apa saja yang ingin ditest.</p>

<p>Jadi yang perlu diingat: jangan asal coding, lalu mendebug/mengetes sampai kodenya benar, pikirkan dulu sebelum menulis kode. Setelah dipikirkan, baru diuji, sambil memikirkan aneka kasus uji yang penting.</p>

<blockquote>
  <p>Programmers are not to be measured by their ingenuity and their logic but by the completeness of their case analysis.
<a href="http://en.wikipedia.org/wiki/Alan_Perlis">Alan Perlis</a></p>
</blockquote>
]]>
    </content>
</entry>

<entry>
    <title>Buktikan Anda hebat, bukalah source code Anda</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2010/03/buktikan-anda-hebat-bukalah-source-code-anda.html" />
    <id>tag:cintaprogramming.com,2010://4.60</id>

    <published>2010-03-08T02:57:17Z</published>
    <updated>2010-03-11T05:53:16Z</updated>

    <summary>Saya banyak mendengar orang yang merasa dirinya hebat dalam bidang programming, tapi tidak bisa membuktikan klaimnya. Jika ada yang bilang bahwa dirinya adalah penyanyi yang hebat, saya tinggal meminta dia menyanyi, jika dia adalah pelukis yang hebat, saya akan meminta...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="umum" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>Saya banyak mendengar orang yang merasa dirinya hebat dalam bidang programming, tapi tidak bisa membuktikan klaimnya. Jika ada yang bilang bahwa dirinya adalah penyanyi yang hebat, saya tinggal meminta dia menyanyi, jika dia adalah pelukis yang hebat, saya akan meminta dia melukis. Jika seseorang hanya memperlihatkan lukisan lalu bilang "saya melukis ini", maka saya belum tentu percaya bahwa itu adalah benar lukisannya.</p>

<p>Dalam hal programming, kadang-kadang ada orang yang memperlihatkan program yang sudah jadi sebagai "bukti" mereka jago memprogram. Tapi sebuah program tidak cukup bercerita (apalagi hanya dari screenshotnya). Kita tidak bisa melihat apa isi dalamnya, yang mungkin penuh dengan komponen buatan orang lain. Mungkin ada yang bangga bisa membuat "MP3 Player", tapi ternyata yang dibuat hanyalah user interface untuk komponen yang sudah ada. Tampilan bukanlah segalanya. Jika dibandingkan dengan seseorang yang membuat program command line yang memutar MP3 dengan membuat decodernya sendiri, saya akan menyatakan bahwa orang yang membuat decoder MP3 player tersebut jauh lebih hebat dibandingkan orang yang hanya membuat user interface saja.</p>

<p>Dengan tidak melihat source codenya, saya juga tidak yakin apakah gaya penulisan kode Anda bagus atau tidak. Bahkan ada kemungkinan ternyata source code Anda adalah hasil copy paste dari banyak tempat (yang bisa dicari dengan google code search). Saya sudah sering melihat banyak aplikasi yang seolah-olah hebat, tapi ternyata tidak sama sekali. Dengan sedikit <a href="http://blog.compactbyte.com/2008/07/26/hacking-dan-reverse-engineering/">reverse engineering</a>, saya sudah melihat ada banyak aplikasi yang ternyata hanya memakai komponen yang sudah jadi (bahkan sebagian memakai komponen komersial dan tidak membayar, tapi diakali menggunakan crack).</p>

<p>Sebagian orang akan beralasan: wah saya tidak bisa memperlihatkan program saya atau source code saya, karena itu rahasia perusahaan. Jika Anda adalah programmer yang hebat, Anda tentunya akan membuat banyak program dalam hidup Anda (kecuali Anda sangat sibuk seperti Linus Torvalds yang hanya berkonsentrasi di Kernel Linux dan sedikit di Git). Program tersebut tidak perlu besar ataupun rumit. Banyak produk yang dibuat oleh programmer yang terdiri dari beberapa puluh, beberapa ratus, atau 1000-2000 baris kode saja dan sangat berguna bagi orang lain.</p>

<p>Kebanyakan plugin wordpress atau skrip GreaseMonkey hanya berkisar beberapa puluh sampai beberapa ratus baris kode. Bahkan Anda bisa membuat aplikasi serius tanpa harus menulis banyak kode. Jika Anda memang hebat. Misalnya salah satu produk web dari 37signals <a href="http://weblog.rubyonrails.org/2005/01/21/matz-takes-note-of-ta-da-and-rails/">hanya terdiri atas 579 baris kode</a>. Sebuah Window Manager untuk X11 dapat dibuat dalam 1000-2000 baris kode saja (contohnya <a href="http://xmonad.org/">xmonad</a> dan <a href="http://dwm.suckless.org/">dwm</a>). Bahkan kernel sistem operasi <a href="http://www.minix3.org/reliability.html">Minix</a> hanya sekitar 4000 baris kode saja (driver dsb dibuat di userspace, dan tidak termasuk dalam kode kernel).</p>

<p>Saya menggunakan metrik Lines of Code, karena ini yang paling mudah (meski tidak akurat), dan dengan aneka framework dan library yang ada saat ini Anda bisa menulis aplikasi lengkap dengan sangat cepat. Jadi saya tidak menantang Anda membuat program sangat kecil seperti dalam <a href="http://en.wikipedia.org/wiki/Demoscene">demoscene</a> menggunakan assembly, tapi menantang Anda merilis program yang berguna, walaupun sederhana. Programnya juga sebaiknya memperlihatkan sesuatu yang baru atau menarik, bukan sekedar membuat another MP3 player dengan komponen buatan orang lain. </p>

<p>Saya belum merasa diri saya sudah hebat, tapi jika ada yang bertanya aplikasi apa saja yang sudah saya buat, saya bisa memperlihatkan halaman ini: <a href="http://yohan.es/applications/">http://yohan.es/applications/</a>. Kalau ada orang lain yang mengaku hebat, tapi tidak bisa membuktikan kehebatannya, jangan-jangan dia hanya seperti <a href="http://www.detiknews.com/read/2009/01/22/140529/1072779/10/joko-blue-energy-berniat-banding">djoko blue energy</a>.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>System programming</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2010/02/system-programming.html" />
    <id>tag:cintaprogramming.com,2010://4.59</id>

    <published>2010-02-12T03:36:29Z</published>
    <updated>2010-02-12T04:35:13Z</updated>

    <summary>Banyak orang yang terkesima dengan orang yang memprogram di level kernel sistem operasi; banyak juga yang menganggap wilayah kompilasi atau interpretasi itu sesuatu yang rumit, dan sebaiknya diterima saja, tidak perlu dipelajari.Sebagian orang bersifat tidak mau tahu. Misalnya ada yang...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="c" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="hardware" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[Banyak orang yang terkesima dengan orang yang memprogram di level kernel sistem operasi; banyak juga yang menganggap wilayah kompilasi atau interpretasi itu sesuatu yang rumit, dan sebaiknya diterima saja, tidak perlu dipelajari.<div><br /></div><div>Sebagian orang bersifat tidak mau tahu. Misalnya ada yang bilang: mengapa belajar assembly atau C/C++, bahasanya nggak dipakai, mendingan belajar PHP, Ruby, Java atau .NET. Orang-orang tersebut tidak menyadari bahwa compiler dan atau runtime bahasa-bahasa tersebut dibuat dengan C dan C++. Sebagian besar library yang dipakai di berbagai bahasa juga diimplementasikan di C/C++.</div><div><br /></div><div>Sebagian kemampuan prosessor juga tidak akan bisa dimanfaatkan secara maksimal oleh bahasa tingkat tinggi, tanpa bantuin assembly dan atau C/C++. Contoh terbaru adalah instruksi-instruksi STTNI (String &amp; Text New Instructions) yang diperkernalkan di prosessor baru Intel dengan arsitektur Nehalem untuk mempercepat pemrosesan teks (dan parsing XML) tidak akan bisa dilakukan.</div><div><br /></div><div>Bahkan jika Anda tidak memprogram dalam bahasa C sekalipun, pengetahuan tersebut bisa berguna, misalnya Anda bisa mengoptimasi penggunaan memori dan mengoptimasi kecepatan di PHP. Lihat juga posting saya mengenai <a href="http://cintaprogramming.com/2009/07/kritik-php.html">Kritik PHP</a>.</div><div><br /></div><div>Sekarang pertanyaan berikutnya yang mungkin muncul adalah: bagaimana saya belajar pemrograman sistem?</div>]]>
        <![CDATA[<div><a href="http://en.wikipedia.org/wiki/System_programming">System programming</a> adalah aktivitas pembuatan <a href="http://en.wikipedia.org/wiki/System_software">software sistem</a>. Ini cakupannya luas, dari mulai kernel sistem operasi, sampai compiler, dan aneka utility level sistem.</div><div><br /></div><div>Untuk memahami system programming, belajarlah dari memakai bahasa C. Bahasa ini sangat dekat dengan mesin. Anda mungkin akan merasa stress harus mengatur semua hal sendiri (memori harus dialokasi dan dealokasi, menyalin string tidak bisa dengan sekedar tanda sama dengan, dan sebagainya). &nbsp;Jangan terlalu memikirkan membuat aplikasi GUI, aplikasi mode teks sudah cukup.</div><div><br /></div><div>Sistem operasi Unix atau turunannya sangat berguna, karena arsitekturnya terbuka, jadi Anda bisa melihat internalnya dengan mudah. Sekarang ini Anda dengan mudah bisa menginstall Linux, FreeBSD atau jika punya uang: OS X (walau bisa juga diinstall di desktop non-Apple dengan cara tertentu).</div><div><br /></div><div>Ketika belajar C kali pertama mungkin Anda akan memanggil fungsi-fungsi milik library C (fopen, fprintf, dsb), berikutnya Anda bisa langsung memanggil layanan sistem operasi (open, write, close, dsb). Anda mungkin akan bisa melihat bahwa fopen/fwrite/fclose sebenarnya hanya membungkus <i>system call</i> tertentu.</div><div><br /></div><div>Pelajari aneka algoritma dasar dan struktur data yang mungkin belum pernah Anda implementasikan. Di berbagai bahasa, hashtable/map sudah menjadi hal dasar, tapi di C Anda perlu mengimplementasikan sendiri. Anda mungkin tidak pernah memikirkan bagaimana sorting dilakukan di PHP, tapi di C Anda perlu melakukannya.</div><div><br /></div><div>Memprogram dalam bahasa C seharusnya akan membuat Anda bisa melihat bagaimana sebenarnya aneka fungsi di bahasa tingkat tinggi hanya membungkus fungsi yang diberikan di sistem operasi atau library.</div><div><br /></div><div>Setelah itu Anda bisa bermain-main, mengkompilasi kernel Anda sendiri. Sekarang ini mengkompilasi kernel Linux di komputer modern butuh waktu hanya beberapa puluh menit saja (tidak berjam-jam seperti dulu). Setelah bisa mengkompilasi, cobalah memodifikasi source yang ada. Anda bisa belajar membuat device driver juga. Ketika belajar ini, mungkin Anda akan membuat komputer Anda menjadi hang, jadi cobalah di virtual machine.</div><div><br /></div><div><div>Seharusnya di level ini, Anda akan memiliki motivasi untuk mencari tahu sendiri bagaimana caranya melakukan X atau Y, atau mengapa Z tidak bisa berjalan.</div></div><div><br /></div><div>Bagian yang sulit bagi saya adalah ketika memahami soal hardware. Saya tidak memiliki background elektronika. Untuk meningkatkan pemahaman saya, saya belajar dari tingkat yang sangat rendah: saya belajar sendiri microcontroller. Sebuah microcontroller adalah sebuah paket CPU dalam sebuah IC disertai dengan berbagai input/output serta periferal tambahan (misalnya UART controller).</div><div><br /></div><div>&nbsp;Microcontroller mengajarkan saya mengenai berbagai cara interkoneksi hardware, dengan general purpose IO pin, dengan SPI, dan sebagainya. Ini jauh lebih sederhana daripada sistem desktop yang rumit.&nbsp;</div><div><br /></div><div>Hal yang sangat membantu saya memahami sebuah sistem adalah ketika melakukan porting. Porting adalah proses untuk membuat software di suatu sistem berjalan di sistem lain. Menulis software dari nol akan sangat membosankan, dan butuh waktu lama, jadi porting merupakan aktivitas yang menarik karena memberi pengalaman dari dunia asal dan dunia tujuan .&nbsp;Ketika saya memporting pembaca Alkitab PalmBible plus ke Symbian, saya belajar bagaimana penanganan akses file, memori, dsb di Palm dan di Symbian.&nbsp;</div><div><br /></div><div>Pengalaman&nbsp;<a href="wiki.freebsd.org/FreeBSDcns11xx">FreeBSD ke platform ARM baru</a>&nbsp;memberikan pengalaman yang lebih banyak lagi. Diberikan sebuah hardware, dan sebuah sistem operasi yang jarang sekali saya pakai, saya harus belajar bagaimana inisialisasi kernel FreeBSD, bagaimana alokasi memori dilakukan, bagaimana FreeBSD menemukan hardware, dan sebagainya. Walau sampai sekarang masih ada sedikit misteri di beberapa bagian FreeBSD yang belum saya mengerti, saya yakin bahwa dengan ketekunan, saya akan bisa memahaminya.</div><div><br /></div><div>Intinya adalah: jika ingin belajar system programing, Anda tidak perlu langsung lompat turun belajar assembly. Belajarlah dengan mempelajari satu level di bawah level abstraksi saat ini, lalu satu level lagi, dan seterusnya.</div>]]>
    </content>
</entry>

<entry>
    <title>Kritik PHP</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2009/07/kritik-php.html" />
    <id>tag:cintaprogramming.com,2009://4.58</id>

    <published>2009-07-19T14:20:08Z</published>
    <updated>2009-07-20T01:02:36Z</updated>

    <summary>PHP merupakan bahasa yang kurang bagus, designnya tidak dipikirkan dengan matang. Banyak sekali keanehan PHP dibanding bahasa lain, dan meskipun PHP sudah mulai agak membaik di versi 5.3 (yang baru dirilis 3 minggu yang lalu), saya masih menunggu PHP6 untuk...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="bahasa" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="teknis" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>PHP merupakan bahasa yang kurang bagus, designnya tidak dipikirkan dengan matang. Banyak sekali keanehan PHP dibanding bahasa lain, dan meskipun PHP sudah mulai agak membaik di versi 5.3 (yang baru dirilis 3 minggu yang lalu), saya masih menunggu PHP6 untuk mencoba lagi.</p>

<p>Kebanyakan orang tidak menyadari bahwa mereka butuh sesuatu, atau bahwa sesuatu itu jelek, sampai mereka diberikan sesuatu yang lebih baik. Di artikel ini saya ingin mengkritik PHP, tapi sebelumnya akan saya contohkan apa yang saya maksud dengan melihat sejarah MySQL.</p>

<p>Awalnya MySQL tidak mendukung transaksi. Komentar pendukung MySQL waktu itu: transaksi itu tidak perlu, yang penting cepat (Bahkan pembuat mysql pun berpikir demikian, coba lihat <a href="http://www.genome.ou.edu/mysql_manual.html#Bugs"> http://www.genome.ou.edu/mysql_manual.html#Bugs</a>, bagian " Some things we don't have any plans to do"). Tapi kemudian transaksi ditambahkan, dengan catatan: kalau mau cepat jangan pakai transaksi. Lalu berikutnya: transaksi adalah salah satu fitur yang kami banggakan.</p><p>Nah, saya cukup yakin, isi kritik saya ini kemungkinan akan banyak ditolak oleh orang yang cinta buta pada PHP, setidaknya saat ini. Tapi ketika PHP sudah berkembang, baru akan bisa diterima. Memang begitulah sifat penggemar sesuatu, jadi saya bisa memakluminya.<br /></p>

<p>Saya sendiri pernah memprogram PHP dari sejak PHP3, lalu PHP4, dan sampai awal PHP5. Semakin lama saya mempelajari dan memakai PHP, saya semakin merasakan keterbatasannya. Saya tidak menyangkal bahwa PHP merupakan bahasa yang sangat populer. Namun tidak semua yang populer itu bagus (ingat DBase? Ingat Visual Basic 6? dsb). Bagi pencinta PHP, Anda mungkin bisa berbangga PHP semakin membaik, meski caranya dengan "tambal sulam", dan meski Anda harus sering menyesuaikan program agar berjalan di PHP terbaru. Mungkin saya akan mencoba lagi PHP di versinya yang keenam, tapi saat ini mari kita bahas satu persatu kelemahan PHP. <br /></p><br /><p><br /></p>]]>
        <![CDATA[<h2><b>Designnya Kurang dipikirkan Dengan Matang</b></h2>

<p>Dari sejarahnya PHP berasal dari proyek pribadi (singkatannya waktu itu: Personal Home Page), dan ditambahi aneka fitur tanpa pertimbangan yang matang (magic_quotes, register_globals, dsb). Mereka kadang menyesali suatu keputusan dan menarik fiturnya (misalnya magic_quotes dan register_globals yang akan ditarik di PHP6), bahkan menurut saya kadang mereka <i>bingung</i> misalnya is_a sempat dianggap deprecated lalu di undeprecated. </p>

<p>Baru-baru ini PHP memiliki fitur namespace (yang sudah ditunggu lama), tapi sayangnya mereka memakai separator \ (backslash). Tidak seperti bahasa lain yang memiliki proses pengambilan keputusan melalui proposal yang kemudian disetujui/ditolak oleh komunitas via diskusi (yang biasanya memakan waktu beberapa minggu/bulan), keputusan memakai backslash diambil dari chatting IRC selama beberapa jam. Mungkin akhirnya orang akan bisa menerima ini, tapi ini bukan sesuatu yang elegan jika Anda beralih dari bahasa lain. Contoh ini saya ambil dari <a href="http://developers.slashdot.org/comments.pl?sid=1008291&amp;cid=25522773">salah satu komentar slashdot</a>.</p>

<pre>Java/C#/Python:
Attribute/Method access: foo.bar
Static method access:    Foo.bar
Package access:          foo.bar.baz
</pre>

Sementara di PHP:

<pre>Attribute/Method access: $foo-&gt;bar
Static method access:    Foo::bar
Namespace access:        foo\bar\baz
</pre>

<p>Pada akhir tahun 2005 ada sebuah webcast dari Zend yang berisi  presentasi Zend Framework (sayang webcastnya tidak bisa saya temukan, linknya sudah mati, tapi Anda bisa melihat rangkumannya di <a href="http://shiflett.org/blog/2005/dec/zend-framework-webcast">blog ini</a>). Framework tersebut berusaha meniru Ruby on Rails dalam masalah ActiveRecord, tapi ada satu masalah besar. <br /></p><p>Masalah besarnya adalah: isi webcast tersebut tidak mungkin bisa diimplementasikan dengan PHP yang ada saat itu, dan bahkan baru bisa diimplementasikan di PHP 5.3 yang baru dirilis 3 minggu yang lalu. (ok sebenarnya dengan trik yang sangat jelek, dan membuat aplikasi jadi super lambat, itu bisa dilakukan, tapi secara praktis itu tidak bisa dilakukan). Sebagai catatan, PHP 5.3 menambahkan fitur late static binding sehingga sekarang isi webcast tersebut bisa diimplementasikan.</p>

<p>Perlu dicatat, metode tambal sulam dalam memperbaiki fitur PHP menyebabkan banyak program PHP3 tidak berjalan di PHP4, dan program PHP4 tidak berjalan di PHP5. Itu sebabnya Anda akan melihat banyak hosting yang masih menyediakan PHP versi 4 walau versi 5 sudah ada sejak tahun 2004 (5 tahun yang lalu).</p>

<h2><b>Tidak konsisten</b></h2>
<p>PHP memiliki banyak fungsi di namespace utama (lebih dari 3000 fungsi), namun penamaan fungsi sangat tidak konsisten:</p>
<ul>
<li>ada yang memakai underscore, dan ada yang tidak (isset, is_object, dsb)</li>
<li>urutan verb object atau object verb tidak seragam, misalnya base64_decode bentuknya: object verb, sedangkan recode_string bentuknya verb object</li>
<li>fungsinya banyak yang redundan (pencarian string: strstr , strchr, strpos, dsb, sorting: sort, arsort, asort, krsort, ksort, natsort, natcasesort, rsort, usort, dsb)</li>
<li>pemakaian to dan 2 yang tidak seragam: ascii2ebcdic, strtolower</li>
</ul>

<p>Daftar di atas itu hanya komplain saya, masih banyak hal lain yang lengkapnya bisa dibaca di url <a href="http://tnx.nl/php.html">http://tnx.nl/php.html</a></p>

<h2><b>Struktur Data</b></h2>
<p>Tahukah Anda bahwa array di PHP sebenarnya adalah hashtable? Apa konsekuensinya: pertama ini butuh memori yang lebih banyak. Di C/Pascal/C++, dsb setiap elemen dalam sebuah array of integer akan membutuhkan space 4 byte. Dalam PHP, <a href="http://pankaj-k.net/weblog/2008/03/did_you_know_that_each_integer.html">setiap elemen integer butuh 68 byte</a>, berari overheadnya sangat besar (17 kali lipat dibanding array biasa). Detailnya: 6 byte untuk struktur value (zval), 36 byte untuk hash bucket, dan 2*8 = 16 byte untuk header alokasi memori. Ini pun hanya di sistem 32 bit, di sistem 64 bit penggunaan memorinya 2 kali lipatnya.  Biasanya kita memiliki tradeoff memory vs speed. Dalam kasus ini kita memiliki konsekuensi kedua: akses array memiliki kompleksitas yang lebih besar dari O(1), sehingga lebih lambat di banding aneka bahasa lain. Tepatnya: tergantung dari cara Anda mengakses array, kompleksitasnya berbeda-beda (misalnya sebagian <a href="http://www.ingo-schramm.de/blog/archives/9-PHP-array_shift-does-not-scale.html">mengkomplain array_shift yang terlalu lambat</a>, lebih lambat dari membalik array dan mem-pop hasilnya). <br /></p>

<p>Di PHP 5.3 diperkenalkan kelas SplFixedArray untuk tipe array yang benar-benar array (area kontigu di memori). Mereka juga memperkenalkan kelas-kelas lain yang lebih cepat dan hemat memori, yaitu: SplDoublyLinkedList, SplStack, SplQueue, SplHeap, SplMaxHeap, SplMinHeap, SplPriorityQueue, dan SplObjectStorage. Sebagai catatan, array 1000 elemen yang tadinya butuh sekitar 200kb di php lama, dengan SplFixedArray sekarang hanya butuh sekitar 60 kb (catatan: saya menggunakan sistem 64 bit).</p>

<p>Perlu dicatat juga bahwa sebelum PHP 5.3 jika kita memiliki circular reference, maka garbage collector PHP tidak bisa menghapus objek-objek yang terbelit dalam circular reference. Dalam program yang berjalan lama, bug memori karena circular reference ini bisa menumpuk, Jadi PHP sebelum 5.3 tidak cocok untuk operasi yang berjalan lama (misalnya untuk daemon), kecuali kita memprogram dengan sangat berhati-hati.</p>

<h2><b>Penutup</b></h2>
<p>PHP merupakan bahasa yang sangat populer. Dengan adanya banyak pengguna, maka banyak pula demand untuk memperbaiki bahasa ini dan memperbaiki implementasi interpreternya. Karena itu kemungkinan bahasa ini memiliki masa depan yang cukup baik. Namun saat ini sudah mulai ada banyak pesaing PHP, sehingga PHP harus berusaha secepat mungkin membenahi diri agar tidak terlibas oleh bahasa lain. PHP6 yang sudah bertahun-tahun dikembangkan saya harap bisa menyenangkan banyak orang.</p>

<p>Microsoft pernah membuat bahasa yang super populer: Visual Basic (sampai versi 6). Tapi mereka menyadari keterbatasan dan kekurangan bahasanya, dan menggantinya dengan Visual Basic .NET yang sangat baik (dari paradigma OOP). Kiranya hal yang sama bisa terjadi di dunia PHP.</p><p><br /></p><p><b>Link Tambahan</b><br /></p><p>Bagi Anda yang tertarik dengan internal PHP, beberapa link ini mungkin bisa menambah wawasan Anda:</p><p><a href="http://www.hardened-php.net/hphp/zend_hash_del_key_or_index_vulnerability.html">Implementasi Hashtable di PHP</a> (artikel lama, sekarang strukturnya sudah agak berubah)</p><p><a href="http://www.ibm.com/developerworks/opensource/library/os-php-future/">Masa depan PHP6</a> (artikel dari tahun 2008)</p><p><a href="http://developer.studivz.net/2009/03/18/php-spl-data-structures-benchmark/">Benchmark Array dan Tipe Data Baru</a> <br /></p><p><br /></p>]]>
    </content>
</entry>

<entry>
    <title>DataStore di Google AppEngine (RDBMS bukan segalanya)</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2009/07/pengalaman-dengan-google-appengine.html" />
    <id>tag:cintaprogramming.com,2009://4.57</id>

    <published>2009-07-08T04:21:10Z</published>
    <updated>2009-07-08T06:05:08Z</updated>

    <summary>Google AppEngine adalah sebuah layanan Google, di mana kita bisa membuat aplikasi dalam Python atau Java (atau bahasa lain yang memakai virtual machine Java) di infrastruktur milik Google. Secara teori, Anda akan bisa melayani 5 juta pengunjung per bulan secara...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="teknis" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<a href="http://code.google.com/appengine/">Google AppEngine</a> adalah sebuah layanan Google, di mana kita bisa membuat aplikasi dalam Python atau Java (atau bahasa lain yang memakai virtual machine Java) di infrastruktur milik Google. Secara teori, Anda akan bisa melayani 5 juta pengunjung per bulan secara gratis. Anda bisa membayar ekstra jika ingin mendapatkan resource yang lebih banyak.<br /><br />Saya akan menceritakan salah satu pengalaman development dengan google appengine, yaitu mengenai bagian pembuatan aplikasi yang scalable, dengan fokus pada DataStore. Menurut saya DataStore merupakan implementasi penyimpanan data yang menarik, yang berbeda dari database relasional yang umum dipakai saat ini. <br /><br />Ilmu relational database dan SQL hampir tidak dipakai sama sekali di sini. Bahkan operasi Join yang sangat lazim di basis data tidak bisa dilakukan dengan DataStore. Lalu apa kelebihan DataStore? datastore memiliki aneka batasan yang memungkinan Google mendistribusikan data di berbagai server di seluruh dunia. DataStore diiimplementasikan di atas teknologi google yang sudah terbukti, yaitu BigTable.<br /><br />]]>
        <![CDATA[Di <a href="http://code.google.com/appengine/docs/python/datastore/overview.html#Quotas_and_Limits">DataStore</a> kita bisa menyimpan banyak jenis entitas, setiap entitas punya satu atau lebih property.&nbsp; Sebuah property berupa nama dengan tipe tertentu, atau bisa merujuk ke entitas lain. Setiap entitas merupakan instance dari suatu Kind. Entitas dalam kind yang sama tidak selalu memiliki property yang sama.<br /><br />Dari sudut pandang praktis: kind itu seperti tabel di database, entitas itu seperti row/record dalam sebuah tabel. Berbeda dengan model relasional, di mana jumlah kolom di setiap baris tabel harus sama, jumlah properti dalam sebuah entitas boleh tidak sama dengan entitas lain dengan kind yang sama.<br /><br />Kita bisa menambah dan menghapus entitas, dan kita bisa melakukan query untuk mendapatkan entitas tertentu. Kita juga bisa mendapatkan sebuah entitas berdasarkan key entitas tersebut. Setiap entitas pasti punya key, jika tidak didefinisikan, maka sistem akan menciptakan sebuah key secara otomatis.<br /><br />Berikut ini <a href="http://code.google.com/appengine/docs/python/datastore/overview.html">beberapa batasan query terhadap entitas</a>: Query terhadap entitas tidak bisa menggunakan join. Query tertentu misalnya untuk pengurutan ascending/descending)membutuhkan indeks. Jadi kita tidak bisa mengquery "order by purchase_date desc" jika indeks purchase_date tidak ada. Sebuah query hanya bisa mengembalikan maksimum 1000 entitas. Query agregasi, seperti misalnya COUNT atau SUM tidak ada. Kita tidak bisa melakukan query yang berulang karena ada batasan waktu eksekusi untuk setiap request.<br /><br />Jadi bagaimana kita bisa hidup dengan aneka batasan tersebut? Jawabannya adalah dengan berpikir panjang. Saya tidak akan membahas secara mendalam aneka hal yang berhubungan dengan DataStore, tapi mari kita ambil satu contoh: agregasi.<br /><br />Sebuah query agregasi di RDBMS memiliki kompleksitas O(n) dengan n adalah jumlah data di tabel. Dalam suatu sistem dengan data yang terdistribusi, ini akan sangat menyulitkan, data harus di kumpulkan dari semua server untuk bisa menghitung agregasinya. Lalu bagaimana solusi yang baik? jawabannya adalah dengan memindah proses agregasi, yang tadinya dilakukan pada query, sekarang dilakukan ketika menyisipkan/menghapus data. <br /><br />Tapi masalah lainnya adalah: kalau hanya punya satu akumulator/counter , maka entitas itu akan diakses terus menerus dan bisa menjadi bottleneck. Bagaimana solusinya? dengan <a href="http://en.wikipedia.org/wiki/Shard_%28database_architecture%29">sharding</a>, yaitu dengan memecah entitas data menjadi beberapa entitas. Untuk mendapatkan&nbsp; total data, kita perlu mengquery dan menjumlahkan semua entitas.<br /><br />Kedengarannya rumit? ya memang rumit. Tapi begitulah jika kita ingin membuat aplikasi yang scalable. Segala batasan DataStore akan memaksa kita berpikir agar aplikasi kita scalable.<br /><br />Cara berpikir kebanyakan orang dalam mengelola data sudah sangat terpengaruh oleh cara berpikir RDBMS, padahal cara berpikir itu bukanlah satu-satunya cara, dan bahkan mungkin bukan cara terbaik untuk semua aplikasi.<br /><br />]]>
    </content>
</entry>

<entry>
    <title>Tutorial Membuat Interpreter/Compiler</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2009/07/tutorial-membuat-interpretercompiler.html" />
    <id>tag:cintaprogramming.com,2009://4.56</id>

    <published>2009-07-08T02:19:34Z</published>
    <updated>2009-07-08T03:11:18Z</updated>

    <summary>Membuat sebuah interpreter/compiler masih merupakan misteri bagi sebagian besar orang. Setelah melihat-lihat aneka kurikulum, dan slide kuliah di berbagai tempat di Indonesia, saya mulai menyadari mengapa. Pertama: dasar teori untuk membuat sebuah compiler/interpreter kurang diajarkan dengan baik, dan yang kedua:...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="bahasa" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>Membuat sebuah interpreter/compiler masih merupakan misteri bagi sebagian besar orang. Setelah melihat-lihat aneka kurikulum, dan slide kuliah di berbagai tempat di Indonesia, saya mulai menyadari mengapa. Pertama: dasar teori untuk membuat sebuah compiler/interpreter kurang diajarkan dengan baik, dan yang kedua: mata kuliah kompilasi hanya berisi teori, padahal mempraktikkan pembuatan compiler/interpreter tidaklah sulit.<br /><br />Proses interpretasi/kompilasi dimulai dengan parsing source code. Masalah parsing seharusnya sudah diajarkan di mata kuliah otomata. Parsing akan membuat sebuah parse tree, dan kemudian dikonversi menjadi abstract syntax tree. Untuk menangani pembuatan parser, diperlukan struktur data tree. Pelajaran mengenai tree diajarkan di mata kuliah struktur data.<br /><br /></p>
]]>
        <![CDATA[<p>Jika Anda pernah mendapat kuliah dasar pemrograman yang menggunakan
LISP, pemahaman pemrosesan tree akan lebih mudah, karena pemrosesan
tree umumnya rekursif. Pengetahuan LISP akan membantu abstraksi Anda
dalam memproses tree.<br /><br />Berikutnya kode perlu dijalankan. Untuk
sebuah interpreter, ini sangat mudah, eksekusi bisa dilakukan langsung dengan mengunjungi pohon.
Untuk sebuah compiler, atau interpreter yang menggunakan pendekatan
bytecode, pengetahuan yang diperlukan adalah mengenai arsitektur
komputer. Pengetahuan arsitektur komputer akan membantu dalam proses
pembuatan kode assembly atau bytecode. <br /><br />Berikutnya Anda perlu
tahu lingkungan di mana hasil kompilasi akan dijalankan. Misalnya Anda
membuat compiler yang membuat executable untuk Linux, Anda akan
memerlukan library dasar (misalnya untuk input/output) bagi OS Linux.
Nah di sini kuliah sistem operasi dan kuliah pemrograman sistem sangat
berguna.<br /></p><p>Membuat website sederhana sangat mudah, tapi membuat website yang besar dan rumit seperti facebook akan sulit. Sama halnya dengan pembuatan compiler, jika Anda hanya ingin membuat interpreter/compiler yang bisa menjalankan kode saja, maka hal itu bisa cepat dilakukan. Compiler atau interpreter untuk bahasa yang sangat spesifik (DSL/Domain Specific Language) dapat dibuat dengan mudah.<br /></p><p>Hal yang sulit dalam pembuatan sebuah compiler adalah bagaimana menghasilkan compiler yang menghasilkan kode cepat (atau bagaimana cara menginterpretasi kode dengan cepat). Masalah ini sangat rumit,&nbsp; Anda akan memerlukan pengetahuan algoritma dan struktur data yang kompleks. Teori mengenai graf juga akan diperlukan (masalah analisis alur eksekusi program melibatkan banyak graf). Tapi topik terakhir ini pun sudah bisa diatasi dengan adanya aneka tools di internet.<br /></p><p>Saat ini sudah banyak tools yang tersedia untuk memudahkan semua langkah di atas, namun untuk memakai tools-tools tersebut Anda perlu tahu dasar teorinya. Untuk parsing, sudah ada puluhan parser generator (bison, antlr, jflex, dsb). Untuk membuat bahasa yang diinterpretasi memakai bytecode, sudah ada <a href="http://jakarta.apache.org/bcel/">BCEL</a> (bytecode engineering library) untuk Java,&nbsp; <a href="http://www.parrotcode.org/">Parrot</a>/PIR, <a href="http://nekovm.org/">NekoVM</a>, dsb. Jika Anda ingin menghasilkan kode native yang sudah dioptimasi, Anda bisa menggunakan <a href="http://llvm.org/">LLVM</a>. <br /></p><p>Tools yang saya sebutkan umumnya bukan barang baru, dan sudah tersedia sejak lama (dari tools yang saya sebutkan di atas: yang terbaru NekoVM: tahun 2005, Bison sudah ada sejak 1988). Tools yang saya sebutkan sifatnya gratis, dan bahkan boleh dipakai di proyek komersial. Jadi jika ada yang menyatakan bahwa pembuatan compiler sederhana itu sangat sulit, maka jelas bahwa orang itu kurang mengenal bidang kompilasi. Jika Anda cukup memperhatikan semua kuliah Anda, membuat interpreter/compiler itu hanya sedikit lebih sulit dari membuat website.<br /></p><p><br />Untuk menunjukkan bahwa pembuatan
interpreter/compiler tidak sesulit itu, saya telah membuat tutorial
yang bisa diakses di <a href="http://yohan.es/compiler/">http://yohan.es/compiler/</a>.
Tutorial ini masih belum lengkap, dan akan terus diperbarui.</p>
]]>
    </content>
</entry>

<entry>
    <title>Garbage Collection bukan Panasea</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2009/07/garbage-collection-bukan-panasea.html" />
    <id>tag:cintaprogramming.com,2009://4.47</id>

    <published>2009-07-02T10:42:36Z</published>
    <updated>2009-07-08T02:16:13Z</updated>

    <summary>Para mahasiswa yang belajar C setelah belajar beberapa bahasa lain (seperti PHP dan Java) biasanya akan kesulitan, karena di C alokasi memori harus diperhatikan dengan sangat detail. Bahkan setiap string harus dialokasi manual. Anda juga harus tahu dengan tepat apakah...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="bahasa" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>Para mahasiswa yang belajar C setelah belajar beberapa bahasa lain (seperti PHP dan Java) biasanya akan kesulitan, karena di C alokasi memori harus diperhatikan dengan sangat detail. Bahkan setiap string harus dialokasi manual. Anda juga harus tahu dengan tepat apakah suatu objek berada di heap atau stack (dalam C <em>objek</em> adalah suatu lokasi memori yang bernama).  </p>

<p>Detail-detail alokasi memori dan dealokasi memori biasanya tidak dibutuhkan lagi dalam aneka bahasa modern (Java, semua bahasa berhasis .NET, python, php, dsb) karena adanya fitur garbage collection. Tapi Anda akan salah jika menanggap pengetahuan mengenai alokasi dan dealokasi memori tidak diperlukan lagi.</p>

<p>Jika Anda memiliki sebuah list, tree, atau struktur data lain di mana satu objek merefer ke objek lain, dan objek tersebut merefer ke objek lain lagi, maka Anda mulai harus berhati-hati. Jika ternyata masih ada objek yang memegang reference ke "ujung" struktur data (root tree, atau elemen pertama list), maka seluruh elemen yang berhubungan tidak akan dilepaskan. </p>

<p>Garbage collection juga memiliki kelemahan: sifatnya tidak deterministik, kita tidak tahu kapan garbage collection akan dilakukan (sangat tergantung pada komponen yang melakukan garbage collection). Efek pengumpulan sampah di saat yang tidak diinginkan adalah kinerja aplikasi akan terganggu.</p>

<p>Efek lain yang buruk adalah: ketika garbage collection dilakukan, biasanya semua thread harus dihentikan sementara. Ini berarti bahwa kinerja aplikasi bisa sangat terganggu di saat yang tidak diharapkan.</p>

<p>Jadi jika Anda masih mempertanyakan kenapa harus belajar alokasi memori, dan mengapa mahasiswa masih perlu diajari bahasa C, berarti Anda belum paham benar mengenai garbage collection.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Pendidikan Pemrograman Yang Tidak Baik</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2009/05/pendidikan-pemrograman-yang-tidak-baik.html" />
    <id>tag:cintaprogramming.com,2009://4.55</id>

    <published>2009-05-18T11:38:35Z</published>
    <updated>2009-07-02T11:01:02Z</updated>

    <summary>Seperti telah saya tuliskan sebelumnya, belajar pemrograman secara formal itu perlu, tapi sayangnya beberapa tempat tidak mengajarkan pemrograman dengan baik. Berikut ini beberapa ciri pengajaran pemrograman yang tidak baik: Terlalu berfokus pada tools tertentu yang trend saat ini. Mahasiswa wajib...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="bahasa" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="umum" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[Seperti telah saya tuliskan sebelumnya, belajar pemrograman secara formal itu perlu, tapi sayangnya beberapa tempat tidak mengajarkan pemrograman dengan baik. Berikut ini beberapa ciri pengajaran pemrograman yang tidak baik:<br /><br /><ol>	<li>Terlalu berfokus pada tools tertentu yang trend saat ini. Mahasiswa wajib memakai tools X (misalnya IDE-nya harus Microsoft Visual Studio, atau harus memakai Visual Prolog). Tools akan cepat sekali berganti. Ketika Anda diajari tools X, ketika lulus, tools tersebut mungkin sudah tidak ada, atau tidak didukung lagi. Ingin contoh? DBase dan Visual Basic. Dulu keduanya sempat menjadi tools yang "standar", tapi sekarang tools tersebut tidak disupport lagi.</li>	<li>Tidak mengikuti perkembangan zaman. Ini ekstreem sebaliknya dari yang pertama, ada yang masih mengajarkan kuliah C dengan standar Pre ANSI-C, dan menggunakan compiler Turbo C++ 2.0, yang dirilis kira-kira 20 tahun yang lalu, dan sudah tidak didukung lagi.</li>	<li>Kurang mengajarkan aspek algoritma. Pada sebagian besar bahasa, sudah tersedia library standar untuk sorting, searching, dsb, tapi tanpa memahami kemampuan dan batasan setiap algoritma, Anda akan menemukan hambatan ketika memproses data dalam jumlah yang besar. </li>	<li>Hanya mengajarkan paradigma tertentu. Umumnya paradigma yang dipakai sekarang adalah object-oriented yang digabung dengan procedural, tapi itu bukan satu-satunya cara menyelesaikan masalah. </li></ol>Jangan heran jika ternyata <a href="http://www.codinghorror.com/blog/archives/000781.html">lulusan sebuah sekolah/perguruan tinggi komputer tidak bisa memprogram</a> jika pengajarannya tidak benar. Jika Anda ingin menyaring antara orang yang punya dasar pemrograman dan yang tidak, <a href="http://tickletux.wordpress.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/">cobalah test sederhana ini</a>.<br /><br /><blockquote>Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".</blockquote>Programmer yang baik akan bisa menuliskan solusinya <i>di atas kertas</i> (tanpa bantuan komputer), dalam beberapa menit.<br /><br />]]>
        
    </content>
</entry>

<entry>
    <title>Representasi Bilangan Desimal di Komputer</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2009/05/representasi-desimal.html" />
    <id>tag:cintaprogramming.com,2009://4.54</id>

    <published>2009-05-08T16:03:08Z</published>
    <updated>2009-07-02T10:58:27Z</updated>

    <summary>Dalam dunia komputer, biasanya kita menggunakan representasi floating point untuk menyimpan bilangan desimal. Namun itu bukan satu-satunya representasi yang ada. Ada beberapa representasi lain yang berupa fixed point, misalnya BCD (binary coded decimal), Chen-Ho, dan DCD (Densely Coded Decimal). Jika...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="bahasa" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="hardware" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[Dalam dunia komputer, biasanya kita menggunakan representasi floating point untuk menyimpan bilangan desimal. Namun itu bukan satu-satunya representasi yang ada. Ada beberapa representasi lain yang berupa fixed point, misalnya BCD (binary coded decimal), Chen-Ho, dan DCD (Densely Coded Decimal). Jika diperlukan Anda pun bisa membuat representasi sendiri, sesuai yang Anda mau.Metode penyimpanan yang ada tersebut dibuat dengan tujuan yang berbeda-beda, misalnya tujuan utama representasi floating point adalah dapat menampung angka dalam range yang besar, tapi dengan presisi yang berkurang/terbatas. Floating point juga biasanya basis 2, sehingga lebih cepat dieksekusi di komputer yang memakai binary logic (<a href="http://en.wikipedia.org/wiki/Ternary_computer">perlu dicatat, tidak semua komputer memakai binary logic</a>). Representasi desimal yang lain bertujuan agar dapat merepresentasikan bilangan secara eksak, namun rangenya terbatas. Variasi representasi dibuat untuk berbagai tujuan, misalnya DCD dibuat agar memori yang diperlukan lebih sedikit.]]>
        <![CDATA[<h2>Floating Point dan Fixed Point</h2>Dalam desimal, kita bisa menyatakan 1234.5 sebagai 1.2345 x (10 <sup>3</sup>). Jadi ada bagian fraction (1.2345), ada bagian basis (10), dan ada bagian exponent (3). Dalam representasi floating point, ketiga bagian tersebut ada, tapi basis yang dipakai biasanya adalah basis 2. Standar IEEE 754 menyatakan berapa bit untuk bagian fraction, berapa bit untuk bagian exponent. Perhatikan bahwa kita bisa merepresentasikan sebuah bilangan dengan berbagai cara: 1.234 x 10<sup>2</sup> sama dengan 12.34 x 10 <sup>1</sup>.  Posisi titik bisa berubah-ubah (floating), dan ini penting untuk bisa merepresentasikan range yang besar. Contohnya perkalian     0.12 × 0.12 = 0.0144 dalam floating point akan dilakukan seperti ini:    (1.2 × 10<sup>−1</sup>) × (1.2 × 10<sup>−1</sup>) = (1.44 × 10<sup>−2</sup>).<br /><br />Representasi desimal lain adalah fixed point. Ada sejumlah bit yang disiapkan untuk bagian sebelum dan sesudah titik desimal (<i>radix point</i>). Misalnya kita hanya punya representasi 2 digit sebelum dan sesudah titik desimal,  maka perkalian 0.12 x 0.12 dilakukan seperti ini: 00.12 × 00.12 = 00.01. Range fixed point terbatas sampai jumlah titik di belakang koma yang diharapkan.<br /><br />Anda pasti sudah tahu bahwa 1/3 tidak bisa dinyatakan dalam bentuk desimal, karena ekspansinya tidak berhenti (0.3333...). Dalam basis 2, hanya bilangan yang bisa dinyatakan dalam a/(2 pangkat b), yang akan memiliki ekspansi yang berhenti. Bilangan seperti 0.1, dan 1/3 tidak bisa direpresentasikan secara tepat dalam floating point berbasis 2, berapapun jumlah bit yang dipakai. 

Jika kita menggunakan floating point basis 10, maka 0.1 bisa direpresentasikan dengan tepat. Dalam fixed point, 0.1 dapat dengan mudah direpresentasikan dengan jumlah bit yang sangat sedikit. Kita tetap tidak bisa direpresentasikan 1/3 dalam basis 2 atau 10, kita hanya bisa melakukannya memakai basis 3 atau kelipatannya.
<br /><br />Jumlah presisi digit desimal untuk suatu representasi binary floating point bergantung pada bagian fractionnya. Misalnya dalam representasi single precision (32 bit), IEEE menyatakan jumlah fractionnya 24 bit, jadi presisi desimalnya adalah log(24)/log(10) yang nilainya mendekati 7. Untuk tipe double (64 bit, dengan 53 bit fraction), presisinya dalah 15 digit (hampir 16), untuk tipe quadruple (128 bit, dengan 112 bit fraction), presisinya adalah 34 digit. <br /><br />Semakin besar jumlah bit untuk fraction, presisinya semakin tinggi. 

Jumlah presisi yang diperlukan tergantung aplikasi yang akan kita buat. Misalnya untuk menggambar grafik 3D di layar, Anda perlu banyak komputasi floating point, namun hasil akhir dibatasi oleh resolusi layar. Dalam banyak kasus, penggunakan tipe single precision sudah cukup, bahkan di game lama, penggunaan fixed point sudah cukup. Namun kita juga perlu memperhatikan hardware dalam memilih presisi floating point, jika komputer ternyata memiliki hardware khusus untuk melakukan komputasi floating, dan hardware tersebut lebih cepat dalam memproses double (dan memiliki memori yang cukup), maka memilih double mungkin adalah pilihan yang lebih baik.

<br /><br />Beberapa aplikasi mungkin butuh presisi yang lebih tinggi, tapi biasanya ada batasan untuk masing-masing bidang. Jadi kita hampir tidak pernah membutuhkan ketelitian yang tidak terbatas. Kita bisa melihat hal-hal terkecil di alam ini memiliki presisi terbatas, dalam bidang fisika kuantum misalnya, presisi untuk bisa merepresentasikan konstanta planck dalam SI adalah 34 digit desimal di belakang koma. Menurut <a href="http://en.wikipedia.org/wiki/Planck%27s_constant">wikipedia</a>: <i>The Planck constant is (with one or two exceptions) the fundamental physical constant which is known to the lowest level of precision, with a relative uncertainty u<sub>r</sub> of 5.0 × 10<sup>−8</sup>.</i><br />Jika kita ingin menghitung waktu sampai batasan fisik yang terkecil, maka hanya perlu bisa merepresentasikan <a href="http://en.wikipedia.org/wiki/Planck_time">waktu planck</a> yang presisinya 44 digit desimal (butuh 147 bit fraction). Dalam banyak aplikasi, presisi dibatasi oleh batasan pengukuran, misalnya untuk timbangan yang presisinya hanya 1 kilogram, menampilkan hasil dalam 0,5 kilogram dapat menyesatkan (istilahnya <a href="http://en.wikipedia.org/wiki/False_precision">false precision</a>).
<br /><br />Kadang-kadang ada perhitungan lain yang membutuhkan presisi yang lebih besar, misalnya untuk mengakumulasi bilangan yang kecil berulang kali. Jika hal tersebut diperlukan, maka representasi lain bisa dipakai (contohnya representasi BigDecimal di Java yang memakai jumlah bit yang variabel). Namun secara umum dengan jumlah bit fraction yang cukup besar, maka perhitungan yang "eksak" (sesuai batasan presisi yang diinginkan) dapat dilakukan dengan representasi binary floating point. 

<h2><br /></h2><h2>Memahami floating point dalam program</h2>
Sekarang mari kita coba melihat aplikasi pengetahuan kita dalam program. Representasi 0.1 dalam 32 bit single precision jika dikalikan dengan bilangan 1 milyar (10 pangkat 9) akan menghasilkan 100000001.490116, tapi jika kita memakai representasi double, maka hasilnya akan benar (100000000.0). Coba saja sendiri membuat program dalam bahasa C, dengan a adalah float (dengan nilai 0.1), dan b adalah double (dengan nilai 1000000000.0), lalu coba ganti tipe a menjadi double, dan bandingkan hasilnya. Menambah jumlah bit, akan membuat perhitungan menjadi lebih eksak (sampai batas di mana kita peduli/sampai batasan pengukuran yang mungkin). 

<pre escaped="true" lang="C"><br />#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
int main(int argc, char *argv[])
{	
	float a = 0.1;	
	double b = 1000000000;	
	printf("result = %f\n", a*b);
	return 0;
}
</pre>

hasilnya (prosessor AMD 64 bit, compiler GCC):<pre><br />result = 100000001.490116</pre>

Jika kita mengganti <code>float a</code> dengan <code>double a</code>, hasilnya menjadi:<code>result = 100000000.000000</code>

Perhatikan bahwa tipe float hanya memiliki presisi sampai 7 digit (tepatnya sedikit lebih dari 7, dalam kasus ini kebetulan 8 digit pertama benar), sehingga sisanya tidak tepat lagi. Sekarang kasus yang lebih rumit:Apakah output program ini?

<pre escaped="true" lang="C"><br />#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;

int main()
{	
	float a = 0.1;	
	float b = 0.1;
	int i;	
	for (i=0; i&lt;9; i++) {	
		b += a;
	}
	printf("a=%lf b=%lf a==b? %s\n", a*10.0, b, <br />		b==(a*10.0)?"yes":"no");<br />	return 0;<br />}</pre>

<pre>a=1.000000 b=1.000000 a==b? no</pre>

Meski output a dan b terlihat sama, tapi representasi internalnya berbeda. Dan apakah output program ini?:

<pre escaped="true" lang="C"><br />#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;math.h&gt;
int main()<br />{
	long double a = 0.1;
	long double b = 0.1;
	int i;	
	for (i=0; i&lt;9; i++) {
		b += a;
	}
	printf("a=%Lf b=%Lf a==b? %s\n", a*10.0L, b, <br />		b==(a*10.0L)?"yes":"no");<br />	return 0;<br />}<br /></pre>

outputnya adalah:
<pre><br />a=1.000000 b=1.000000 a==b? yes</pre>

Perhitungan yang di luar presisi akan dibulatkan, sesuai dengan mode operasi saat itu (apakah mode pembulatan ke atas, ke bawah, terdekat, atau dipotong). Karena representasi floating point tidak eksak, maka kesalahan akan terus terakumulasi dalam sebuah loop. 

Seperti diperlihatkan dalam contoh (0.12 x 0.12), ketika melakukan perkalian posisi radix point bisa digeser, tapi dalam penjumlahan berulang, pergeseran ini tidak langsung dilakukan. Dalam pembuatan aplikasi yang memerlukan presisi tinggi, kita harus memahami masalah ini. Biasanya pelajaran mengenai numerical analysis diberikan dalam kuliah Metode Numerik.<br /><br />Bacaan lebih lanjut: <a href="http://docs.sun.com/source/806-3568/ncg_goldberg.html">What Every Computer Scientist Should Know About Floating-Point Arithmetic</a><br /><br />]]>
    </content>
</entry>

<entry>
    <title>Struct vs Union</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2009/05/struct-vs-union.html" />
    <id>tag:cintaprogramming.com,2009://4.53</id>

    <published>2009-05-01T13:58:16Z</published>
    <updated>2009-07-02T11:11:12Z</updated>

    <summary>Posting ini merupakan jawaban saya pada sebuah pertanyaan di milis linux-programming (Juli 2007). Saya posting di sini karena mungkin akan berguna bagi pemula dalam C.Struct berguna untuk mengelompokkan data. Contoh: struktur mahasiswa mungkin memiliki NIM, nama, dst. Rasanya ini mudah...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="bahasa" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="c" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bahasa" label="bahasa" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="c" label="c" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>Posting ini merupakan jawaban saya pada <a href="http://www.mail-archive.com/linux-programming@linux.or.id/msg08845.html">sebuah pertanyaan di milis linux-programming</a> (Juli 2007). Saya posting di sini karena mungkin akan berguna bagi pemula dalam C.<br /></p><p>Struct berguna untuk mengelompokkan data. Contoh: struktur mahasiswa mungkin memiliki NIM, nama, dst. Rasanya ini mudah dimengerti.</p><p>Union: untuk memberi beberapa nama untuk satu lokasi memori. Ini yang biasanya yang sulit dimengerti oleh yang baru belajar C. Saya berikan beberapa contoh:</p><pre lang="C">#include &lt;stdio.h&gt;<br />union {<br />&nbsp;int a;<br />&nbsp;int b;<br />} a_dan_b;<br /><br />int main()<br />{<br />&nbsp;<em></em>a_dan_b.a = 5;<br />&nbsp;printf("%d\n", <em></em>a_dan_b.b);<br />&nbsp;return 0;<br />}</pre>Apa hasil keluaran program itu? Jawabnya adalah 5, karena a dan b menempati lokasi memori yang sama. Kita bisa menambahkan banyak variabel di union. Jika tipe variabel itu sama, maka nilainya akan sama. Kita bisa membuat union dari tipe yang berbeda juga, misalnya:
]]>
        <![CDATA[<p></p><pre lang="C">union {<br />&nbsp;int a;<br />&nbsp;char <em>b;<br />&nbsp;long c;<br />&nbsp;double d;<br />} test;</em><br /><br /></pre>

Kompilator akan mengalokasikan memori sesuai dengan tipe yang paling besar (dalam contoh di atas adalah double, 8 byte. Jika kita akses:<br /><br /><pre lang="C">test.a  = 5;</pre>Lalu kita akses test.d, maka akan keluar angka yang aneh. Hal ini terjadi karena representasi double dan int tidak sama di memori.

Lalu apa kegunaan fitur semacam ini? biasanya union digabung dengan struct jika struktur digunakan untuk menyimpan lebih dari satu jenis data, dan pada satu saat kita hanya akan menggunakan satu jenis data.<br /><br />Misalnya kita punya struktur bentuk, yang bisa menyimpan lingkaran atau bujursangkar. LIngkaran punya radius yang tipenya float sedangkan bujursangkar hanya integer (ini hanya contoh saja, sebenarnya agak mengada-ada supaya contohnya sederhana).Kita definisikan enumerasi seperti ini:<br /><br /><pre lang="C"><em>typedef enum {       <br />lingkaran,      <br />bujursangkar<br />} jenisbentuk;</em></pre><em>Dan struktur bentuk adalah seperti ini:</em><pre lang="C"><em>typedef struct {<br />&nbsp;jenisbentuk jenis;<br />&nbsp;union {<br />&nbsp;float radius;<br />&nbsp;int sisi;<br />&nbsp;} info;<br />} bentuk;</em></pre>

Kita bisa membuatnya tanpa union seperti ini:<br /><br /><pre lang="C"><em>typedef struct {<br />&nbsp;jenisbentuk jenis;<br />&nbsp;float radius;<br />&nbsp;int sisi;<br />} bentuk;</em></pre>Tapi ini akan memakan lebih banyak memori  (12 byte, sedangkan versi union hanya butuh 8 byte). Kita bisa menaruh informasi sisi dan radius di memori yang sama karena kita tahu, bahwa pada satu saat, hanya sisi ATAU radius saja yang dipakai. <br /><br />Contoh pemakaiannya:
<pre lang="C"><em><br />bentuk b;<br />if (bentuk_baru == lingkaran) {<br />&nbsp;b.jenis = lingkaran;<br />&nbsp;b.info.radius = r;<br />} else if (bentuk_baru == bujursangkar)  {<br />&nbsp;b.jenis = bujursangkar;<br />&nbsp;b.info.sisi = s;<br />} else {<br />&nbsp;/</em>*mungkin error*/<br />}</pre>Untuk mengakses lagi, kita harus tahu apakah tadi kita menyimpan di sisi atau radius:<pre lang="C"><br />if (b.jenis==lingkaran) {<br />&nbsp;printf("Radius = %f\n", b.info.radius);<br />}</pre>Teknik semacam ini banyak digunakan di banyak API/system call UNIX (contoh: API untuk socket yang bisa menangani berbagai jenis socket, baik tcp/ip. unix socket, bluetooth, dll). Banyak juga dipakai di teknik kompilasi (misal satu node identifier bisa berupa integer, float, atau yang lain).<br /><br />]]>
    </content>
</entry>

<entry>
    <title>Mengenal fitur bahasa: Tipe Enumerasi</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2009/05/mengenal-fitur-bahasa-tipe-enumerasi.html" />
    <id>tag:cintaprogramming.com,2009://4.52</id>

    <published>2009-05-01T13:33:27Z</published>
    <updated>2009-07-02T11:14:30Z</updated>

    <summary>Sebagian orang menganggap bahasa hanya sebagai alat, dan memakai bahasa apapun sama saja. Sebagian lagi fanatik terhadap suatu bahasa, dan menganggap bahasa yang lain itu jelek. Menurut saya yang benar ada di antara keduanya itu. Dalam banyak hal, memakai bahasa...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="bahasa" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bahasa" label="bahasa" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>Sebagian orang menganggap bahasa hanya sebagai alat, dan memakai bahasa apapun sama saja. Sebagian lagi fanatik terhadap suatu bahasa, dan menganggap bahasa yang lain itu jelek. Menurut saya yang benar ada di antara keduanya itu. Dalam banyak hal, memakai bahasa apa saja sama saja, tapi dalam kasus tertentu bahasa tertentu lebih baik dari bahasa yang lain. </p>

<p>Memprogram embedded system dalam C akan lebih mudah dibanding dengan menggunakan Pascal misalnya. Penggunaan C dalam embedded system juga menghemat memori, yang akan menghemat biaya produksi alat. Untuk dapat menggunakan suatu bahasa dengan baik, kita perlu mengetahui mengapa fitur tertentu ada di suatu bahasa, dan kapan sebaiknya kita memanfaatkannya.</p>

<p>Dalam kesempatan ini, saya akan membahas penggunakan tipe enumerasi (enum), yang jarang digunakan programmer pemula. Tipe ini banyak diajarkan di berbagai kuliah atau buku, tapi hal yang kurang dibahas adalah mengapa kita sebaiknya memakai tipe enumerasi dibandingkan menggunakan konstanta integer.</p>

<p>Tipe enumerasi adalah tipe di mana nilai yang mungkin disebutkan satu per satu oleh programmer. Misalnya tipe hari yang terdiri dari Senin, Selasa, Rabu, Kamis, Jumat, Sabtu, dan Minggu. Banyak bahasa pemrograman memiliki tipe enumerasi, misalnya C, Pascal, C#, Java 5 ke atas, Ada, dan Visual Basic.</p>
]]>
        <![CDATA[<p>Dalam implementasi, biasanya enumerasi diimplementasikan sebagai tipe data integer. Anda bisa saja membuat tipe <em>hari</em> berupa bilangan integer dengan konstanta (Senin=1, Selasa=2, dst), tapi menggunakan enumerasi bisa membantu membuat program yang lebih jelas. </p>

<p>Pertama, compiler bisa mengingatkan jika kita melakukan operasi aritmatika terhadap tipe enumerasi, tapi compiler tidak akan memperingatkan jika Anda melakukannya terhadap tipe integer. Jika Anda menggunakan pernyataan case/switch, compiler juga akan bisa memperingatkan jika Anda tidak menangani semua kasus enumerasi. Misalnya:</p>

<pre lang="C">
switch (hari) {
    case SABTU:{
    hitung_gaji(); 
    break;
    }
case MINGGU:{
    pemeriksaan_mesin(); 
    break;
    }
}</pre>

<p>Compiler bisa memperingatkan bahwa hari-hari lain tidak ditangani dalam blok tersebut. Dalam bahasa tertentu (Java misalnya), tipe enumerasi ketika dicetak akan menghasilkan representasi string dari enumerasi, dan bukan sebuah angka.</p>

<p>Bacaan lebih lanjut: <a href="http://en.wikipedia.org/wiki/Enumerated_type">http://en.wikipedia.org/wiki/Enumerated_type</a></p>
]]>
    </content>
</entry>

<entry>
    <title>Perlukah kuliah untuk bisa memprogram?</title>
    <link rel="alternate" type="text/html" href="http://cintaprogramming.com/2009/05/perlukah-kuliah-untuk-bisa-memprogram.html" />
    <id>tag:cintaprogramming.com,2009://4.51</id>

    <published>2009-05-01T11:12:18Z</published>
    <updated>2009-07-02T11:19:12Z</updated>

    <summary>Perlukah &quot;kuliah&quot; (mengambil pendidikan formal di universitas) untuk bisa memprogram?. Jawaban singkatnya: perlu jika Anda ingin menjadi programmer yang baik (kecuali Anda orang jenius yang rajin belajar). Sebelum memulai argumen saya, saya perlu memberitahu bahwa perbedaan antara programmer yang baik...</summary>
    <author>
        <name>Yohanes Nugroho</name>
        
    </author>
    
        <category term="umum" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-us" xml:base="http://cintaprogramming.com/">
        <![CDATA[<p>Perlukah "kuliah" (mengambil pendidikan formal di universitas) untuk bisa memprogram?. Jawaban singkatnya: perlu jika Anda ingin menjadi programmer yang baik (kecuali Anda orang jenius yang rajin belajar). <img src="http://cintaprogramming.com/files/2009/05/121503billboard-300x209.jpg" alt="121503billboard" class="alignnone size-medium wp-image-59" align="left" width="300" height="209" /><br /></p><p>Sebelum memulai argumen saya, saya perlu memberitahu bahwa <a href="http://www.codinghorror.com/blog/archives/000072.html">perbedaan antara programmer yang baik dan programmer yang buruk sangat besar</a>. Dalam suatu riset yang membandingkan programmer terbaik dan programmer terburuk dalam suatu perusahaan, programmer yang terbaik dibanding programmer terburuk dapat membuat program 20 kali lebih cepat, dapat mendebug 25 kali lebih cepat, membuat program yang 5 kali lebih kecil yang berjalan 10 kali lebih cepat (buku <a href="http://en.wikipedia.org/wiki/Code_Complete">Code Complete</a> halaman 548).</p><p>Ketika kakek saya membuat rumah, dia tidak membutuhkan arsitek. Ketika bapak saya membuat rumah kami yang pertama, dia juga tidak membutuhkan arsitek. Bagi yang berpikiran sangat sempit, mungkin dia akan segera berpikir: sekolah arsitek itu tidak perlu, anak STM saja sudah cukup. Beberapa tukang bangunan yang cuma lulusan SD pun bisa membangun rumah sederhana di perkampungan. <br /></p><p>Coba lihat berapa jumlah rumah di Indonesia yang dibangun tanpa arsitek. Sebagian juga berpikir arsitek itu tidak perlu, mereka bahkan tidak tahu harga pasir termurah di desa ini di mana. Anda yang berpikiran waras tentunya akan segera melihat, bahwa membuat gedung tinggi, apalagi pencakar langit, tidak bisa dilakukan orang yang tidak memiliki pendidikan arsitektur.</p><p>Membuat program komputer sederhana, dan aplikasi bisnis untuk sebuah perusahaan kecil bisa dilakukan tanpa perlu kuliah. Kebanyakan aplikasi bisnis hanyalah menerjemahkan ke logika bisnis ke dalam program sederhana yang sudah difasilitasi dengan aneka library. Tapi jika Anda berpikir membuat aplikasi bisnis yang besar hanya sekedar membuat form dan report Anda salah besar. Bagaimana Anda bisa membuat sistem yang bisa menangani ratusan ribu transaksi per detik?</p>
]]>
        <![CDATA[<p>Mari kita lihat contoh lain yang lebih sederhana: game. Sebuah game sederhana bisa dibuat dengan melihat buku, tapi game yang revolusioner perlu&nbsp; pengetahuan mendalam mengenai algoritma dan hardware.&nbsp; Ditahun 1993, ketika game Doom dirilis, game itu mendobrak pasar karena dengan aneka batasan hardware, mereka bisa mengimplementasikan game 3D. Kini game semacam Doom bisa dibuat dengan mudah memanfaatkan aneka engine 3D yang ada. Jika pikiran Anda hanya "membuat game", maka tanpa kuliah pun bisa, tapi jika Anda ingin berada di depan, dan membuat game engine, kuliah akan sangat membantu Anda.</p><p>Ada beberapa perkecualian orang-orang jenius yang tidak butuh kuliah. Orang-orang seperti ini ada di berbagai bidang, bukan hanya programmer. Jika Anda bukan jenius maka saya sangat menyarankan Anda mengambil kuliah di Informatika atau Ilmu komputer. Dan karena sebagian besar orang bukanlah jenius, maka saran saya secara umum adalah: ikutlah kuliah pemrograman.</p><p>Ada banyak kisah di mana orang yang merasa bisa memprogram, tapi sebenarnya tidak bisa. Coba lihat <a href="http://www.codinghorror.com/blog/archives/000781.html">kasus</a>, di mana banyak pelamar yang mengaku bisa memprogram, tapi ternyata gagal ketika diberi test yang sederhana.</p><p>Namun bukan berarti kuliah akan selalu bisa membuat Anda bisa memprogram. Jika Anda tidak punya bakat melukis dan pergi ke sekolah seni, kemungkinan besar lukisan karya Anda tetap tidak akan bagus. Bisa dikatakan bahwa: jika Anda lulus kuliah informatika, belum tentu Anda menjadi programmer yang baik, tapi bila Anda ingin menjadi programmer yang baik sebaiknya Anda pergi ke sekolah informatika.</p><p>Sayangnya tidak semua sekolah informatika di Indonesia, dan bahkan di dunia ini mengajarkan hal yang baik. Sebagian besar terlalu praktis, dan kurang teori. Tapi saya akan membahas hal ini kali lain. Seperti matematika dasar yang diperlukan oleh semua orang di hampir segala bidang, sebenarnya sedikit pengetahuan pemrograman bisa membantu banyak orang yang bekerja di bidang komputer (mulai dari administrator sampai sekretaris). Pengetahuan dasar semacam itu tidak perlu kuliah khusus, dan saya akan membahasnya di posting yang lain.</p>
]]>
    </content>
</entry>

</feed>
