Saturday 28 July 2012

Short Story tentang Mahasiswa ITB yang Internship di Facebook part 1

Warning: tulisan ini banyak berisi ratapan dan kegalauan seorang mahasiswa. Tidak dianjurkan dibaca saat anda sedang bahagia.

------------------------------------- START OF PART 1 ---------------------------------------

Sruput. Mie instan dua bungkus sedang saya lahap sebagai sahur saya untuk persiapan puasa hari ini. Hari ini tanggal 28 Juli 2012. Sebentar lagi subuh di Palo Alto dan saya sedang merenung karena seringnya ditanya oleh teman-teman: bagaimana cara bisa internship di Facebook? Bagaimana rasanya?

Saya ingat 2 tahun lalu ketika saya masih tingkat 3 awal, saya sibuk sekali mengerjakan banyak hal. Proyek, mengajar untuk TOKI, himpunan, dan kerja part-time. Saya hampir tidak peduli dengan kuliah. Merenungi saat-saat itu saya jadi merasa bahwa saat itu saya sedang mencari jati diri saya. Namun saya yakin, diri saya yang dahulu hanya memiliki satu pikiran: "jalani saja apa yang diberikan oleh dunia kepadamu." Hingga saat ini pun saya masih berpikir demikian.

Istilah internship masih asing bagi saya saat itu. Saya hanya berpikir bahwa internship di Facebook berarti kita akan pergi ke Facebook untuk belajar. Namun ternyata internship di Facebook berarti kita akan pergi ke Facebook untuk bekerja.

Dan saat-saat itulah saya mendengar kabar bahwa salah satu teman saya, Irvan, sedang di-interview untuk internship di Facebook. Saya cukup mengenal Irvan. Saya kira-kira tahu dari mana ia mendapat tawaran tersebut dan saya yakin saya bukanlah orang yang qualified untuk hal tersebut. Apalagi saya tidak memiliki banyak pengalaman dalam berbicara Bahasa Inggris. Jadi ketika Irvan menawarkan saya untuk di-refer untuk interview, saya hanya angguk-angguk dan menerima email recruiter yang ia berikan ke saya. Toh, tidak ada salahnya saya menyimpan email orang yang tidak saya kenal barang satu atau dua.

Kebetulan kami yang sudah tingkat tiga akhir diharuskan untuk melakukan kerja praktek. Kerja praktek ini pada umumnya berlangsung sekitar satu sampai tiga bulan. Kerja praktek ini juga harus dilaksanakan di tempat yang "jelas." Saat itu saya sudah memiliki pekerjaan sambilan, yakni menjadi programmer untuk Zingmobile. Saat itu bekerja untuk Zingmobile merupakan pengalaman yang baru dan menyenangkan. Jadi saya tidak terlalu berpikir untuk mencari kerja di tempat lain dan saya merasa relatif aman.

Diluar dugaan Irvan tidak diterima untuk internship di Facebook. Tentu saja hal ini makin memantapkan saya untuk tidak mencoba. Saya adalah manusia yang sudah sering merasakan kegagalan dan kekecewaan. Saya memutuskan untuk melanjutkan kehidupan normal saya yang sudah cukup amburadul agar tidak perlu mengenal kegagalan lagi.

Namun perlu diketahui, setelah interview dengan Facebook, Irvan melakukan interview dengan Google dan diterima. Menurut saya itu adalah pencapaian yang luar biasa mengingat usahanya yang sangat keras mengejar materi tentang Computer Science dan Software Engineering dengan membaca banyak buku-buku berat. Saya pernah berusaha membaca satu-dua buku rekomendasinya dan tertidur dalam 40 halaman pertama.

Tidak lama setelah itu, sekitar bulan Agustus, saya mendengar bahwa Adhit juga mendaftar untuk interview di Facebook melalui link lain. Saya yakin Adhit pasti sudah mendengar berita tentang Irvan. Saya mengagumi keberanian Adhit untuk mencoba, sehingga saya juga terpacu untuk mencoba. Saat itu saya mulai mengerjakan Facebook puzzle.

Hari demi hari saya habiskan untuk meratapi dan melakukan problem solving yang sudah sekian lama tidak saya lakukan. Soal demi soal saya kerjakan dengan teknik OOP, yang tidak umum digunakan untuk problem solving. Hal ini dikarenakan saya lebih terbiasa menghadapi segala hal dari sudut pandang OOP. Saya teringat kembali bagaimana dahulu saya sempat mengalami masa-masa trance dimana saya hanya tidur dua jam selama tiga minggu berturut-turut hanya untuk mengerjakan USACO.

Setelah cukup yakin dengan apa yang saya raih dalam mengerjakan puzzle, pada bulan September saya memutuskan untuk meng-email recruiter yang diberikan oleh Irvan. Saya masih ingat bahwa email saya sangatlah awkward. Tidak ada perkenalan, tidak ada basa-basi. Tiba-tiba saya menyodorkan CV dan meminta untuk interview. Tidak lama setelah itu recruiter saya, Kinh, membalas. Ia menanyakan darimana saya mendapatkan emailnya, dan beberapa hal basa-basi yang lupa saya lakukan sebelumnya. Setelah bertukar beberapa email, Kinh memutuskan untuk menelpon saya untuk interview singkat via Skype.

Saya grogi ketika akan ditelepon. Ini pertama kalinya saya akan menggunakan Bahasa Inggris untuk keperluan kerja. Saya bahkan tidak pernah berbicara Bahasa Inggris lebih dari 5 menit sebelumnya. Ketika ditelepon, ternyata internet saya kurang kuat. Akhirnya kami berbicang menggunakan telepon asli. Walau suara-nya tidak terlalu jelas, namun logat Amerika Kinh sangat membantu saya untuk melakukan percakapan. Singkat cerita percakapan kami diakhiri dengan Kinh menyuruh saya untuk mengerjakan puzzle tersulit Facebook.

Cukup lama waktu yang saya habiskan untuk mengerjakan puzzle tersebut. Saya habiskan satu hari untuk memikir berbagai macam algoritma. Hari kedua saya habiskan untuk membuat implementasi dan mengirim solusi. Dua hari berikutnya saya gunakan untuk membenarkan solusi dan membuat solusi alternatif hingga akhirnya saya berhasil memecahkan puzzle tersebut. Malamnya saya langsung memberitahu Kinh bawa saya sudah menyelesaikan puzzle yang ditugaskan.

Dua hari kemudian Kinh mengatakan bahwa saya akan di interview teknis selama satu jam. Malam itu tidak terlalu dingin namun saya menggigil kediningan karena grogi dengan interview teknis pertama saya. Saya meminta teman sekontrakan saya untuk tidak menggunakan internet pada saat saya interview dan teman-teman saya yang baik menyetujuinya. Sehingga pada interview kali ini Skype berjalan dengan sempurna.

Kring...kring... suara notifikasi telepon di Skype berdering. Jadwal interview adalah pukul 00.30 dan telepon berdering tepat ketika waktu memasuki menit ke 30 pada hari itu. Sangat tepat waktu pikir saya. Yang menjadi lawan bicara saya adalah seorang pria, engineer Facebook yang sudah bekerja selama 2 tahun disana. Ia dengan santainya melakukan percakapan santai selama 2 menit. Setelah itu kita masuk ke real-deal nya, interview teknis.

Ia menyuruh saya membuka editor online yang dimana saya bisa membuat kode secara live disana dan ia dapat membacanya. Saat itu saya menggunakan Collabedit. Lalu ia memberikan sebuah pertanyaan. Saya habiskan beberapa menit untuk mengerjakan pertanyaan-nya dan beberapa menit untuk menjelaskan apa yang saya tulis di editor. Ia menanyakan test case apa yang saya gunakan untuk memastikan jawaban saya benar. Lalu saya memberikan beberapa test case dan ia baru yakin bahwa jawaban saya benar.

Lalu ia memberikan pertanyaan kedua. Pertanyaan kedua relatif lebih sulit dari yang pertama. Saya menghabiskan beberapa menit untuk memikirkan algoritmanya. Setelah mendapat secercah ide, saya langsung menuliskan solusi saya. Kali ini saya langsung memberikan test case yang saya gunakan untuk mengujinya. Namun saya mengalami kesulitan untuk menjelaskan algoritma yang saya gunakan dalam menyelesaikan pertanyaan kedua. Setelah beberapa menit berlalu, interviewer saya percaya dengan solusi saya.

Ia lalu bertanya apakah saya punya pertanyaan untuk dia. Saat itu saya menanyakan tentang bagaimana Facebook bisa menangani arus data yang sangat besar. Saya tidak ingat jawaban dari dia karena penjelasannya sangat rumit. Yang saya ingat adalah saya merasa excited dengan interview tersebut. Namun pada saat itu saya tidak memiliki harapan untuk lolos. Karena saya cukup meragukan apakah saya telah menjelaskan solusi terhadap pertanyaan kedua dengan baik atau tidak. Setelah menjelaskan tentang arus data di Facebook, kami menghentikan pembicaraan dan saya langsung tidur. Ngomong-ngomong soal tidur, saat ini sudah saatnya saya menarik selimut tebal saya yang empuk dan menikmati tidur.

--------------------------------------- END OF PART 1 ---------------------------------------

Hiyaa, maap kalau gayanya sok novelist tapi gak jadi. There's a first time for everything right? Btw nantikan part-2 nya :)

Sunday 15 July 2012

Perbandingan Performa SharedPreferences dan SQLite

Yup bersama saya lagi bermain-main dengan Android! Kali ini saya ingin membahas tentang SharedPreferences dan SQLite sebagai pilihan untuk menyimpan data pada Android.

Pembuat aplikasi Android pasti suatu saat akan menemui suatu permasalahan tentang penyimpanan data. Bagaimana cara menyimpan data? Bagaimana data itu disimpan? Dimana harus disimpan? Jawaban dari pertanyaan itu dapat dijawab dengan membaca tutorial Android disini. Menurut saya tutorial itu sudah cukup memberikan pengantar yang cukup untuk memulai merambah dunia simpan-menyimpan di Android (sehubungan dengan simpan-menyimpan, saya jadi ingat dengan "simpanan" saya. Tapi itu untuk lain cerita).

Apabila si pembuat aplikasi ini sudah mulai advance, ia akan mulai bingung antara "apakah saya harus menggunakan SharedPreferences atau kah saya harus menggunakan SQLite?" dengan asumsi kita tidak memperdulikan penyimpanan di storage (internal maupun eksternal). Karena sudah dipastikan penyimpanan di storage itu lambat (akan disinggung sedikit nanti mengapa penyimpanan di storage itu lambat). Seperti kita ketahui, SharedPreferences hanya dapat menyimpan data dalam bentuk key-value pair sehingga mudah dimodifikasi. Sedangkan SQLite hanya dapat diubah dengan membuat query SQL.
Ini ngomongin apa sih? Saya maunya pake Hadoop saja >:)
Di sebuah post di StackOverflow sudah dibahas tipe penyimpanan mana yang harus anda gunakan pada suatu kondisi tertentu. Inti dari post itu adalah: Gunakan SharedPreferences bila data-nya kecil dan bermacam-macam. Gunakan SQLite bila data-nya besar, terstruktur dan sedikit macam-nya. Contoh data yang ingin anda simpan di SharedPreferences adalah: "opsi apakah user ingin mendapatkan notifikasi", "opsi apakah user hanya ingin mengunduh data dari internet ketika terhubung dengan wireless", "berapa kali notifikasi harus dilakukan tiap hari" dan berbagai macam data yang kecil yang lain. Contoh data yang ingin anda simpan di SQLite adalah: "daftar manga yang di bookmark oleh user", "contact list", "kumpulan teman-teman yang baru saja saya miss-call" dan berbagai macam data yang terstruktur yang lain.

Namun anda yang suka bermain Javascript atau fanatik dengan JSON akan berargumen: "Bitch please! Saya bisa mengubah data saya, misalnya Manga, menjadi sebuah JSON lalu saya simpan ke SharedPreferences. Manga saya nanti punya sebuah key, misal URL darimana Manga tersebut diambil, untuk mendapatkan Manga yang saya mau dari SharedPreferences dengan mudah. Solusi ini mudah dibuat dan sangat mudah dikembangkan! Semua-nya jadi rata ke SharedPreferences! Screw SQL!"
JSON can save the world! JSON can even kill and fight Freddy!
Baik saya sangat setuju bahwa dengan SharedPreferences pasti perlu digunakan (untuk setting, konstanta-konstanta kecil, menyimpan versi terakhir yang digunakan, menyimpan waktu update dari internet terakhir kali, dan lain sebagainya). Sedangkan seperti yang telah disebutkan diatas, SQLite tidak sepenuhnya dibutuhkan dengan alasan struktur yang kita butuhkan dapat dikompres dengan mudah kedalam JSON lalu kita simpan sebagai String biasa. Tapi bagaimana kalau kita tinjau dari segi performa?

Pertama SharedPreference akan makin lambat seiring dengan banyak-nya data yang disimpan dalam SharedPreference tersebut. Lambat disini hanya terjadi saat aplikasi mulai dijalankan. Misal anda menyimpan segala sesuatu di SharedPreference SPMangaMobile. Maka suatu saat apabila terlalu banyak Manga yang anda simpan di SPMangaMobile ini, untuk bisa me-load opsi-opsi trivial seperti "kapan terakhir kali aplikasi ini di-update" akan memakan waktu sangat lama. Samsung Galaxy Mini saya merasakan 5 detik startup hanya untuk memulai aplikasi karena saya menggunakan cara ini.

"Kalau begitu, pisahkan saja SharedPreference yang bersifat struktural, seperti Manga, ke SPManga. Sedangkan untuk yang lain, masukkan ke SPMangaMobile." In a way, solusi ini cukup benar sampai anda punya 1 MegaByte data. Me-load 300kB data saja membutuhkan waktu hingga hampir 1200 ms! Dan ini dilakukan di Android yang tidak sembarangan: Galaxy Tab 8.9" dengan processor Tegra 2 dual core 1 GHz! Bayangkan berapa lama waktu yang dibutuhkan di Galaxy Mini?


Tiap kali pengguna memulai aplikasi, pengguna harus menunggu selama 516 ms untuk  mempersiapkan SharedPreferences. Another 720 ms untuk mendapatkan data yang dibutuhkan.
Selebihnya program menghabiskan rata-rata 720ms untuk mengolah data hingga dapat digunakan.
Wow. Pengguna Android sekarang pasti akan mulai membanting HP-nya apabila HP-nya berhenti me-respon dalam waktu lebih dari 3 detik (ya, pengguna Android se-tidak-sabaran itu). "Nexus gw gak mungkin selambat itu! Yang lambat itu cuma BB!" Baik, coba tunjukkan waktu yang dibutuhkan bila menggunakan SQLite! Segera komandan!
3685 ms adalah waktu yang dibutuhkan untuk mem-backup database ke eksternal storage (karena itu saya bilang menyimpan di storage itu lambat). Hal ini hanya dilakukan sekali saja  setiap kali anda mengubah definisi database (misal menambah kolom pada suatu tabel). Jika anda pintar, database hanya perlu dibuat sekali saja :)
Loh tapi ternyata performa-nya tidak berkembang sama sekali! Penipuan ini namanya!
Ya, bisa anda lihat bahwa performa menggunakan SQLite tidak berbeda jauh dari menggunakan SharedPreference. Lalu apa gunanya donk kita menggunakan SQLite? Tunggu dulu! Mari kita simak lagi.

Berbeda dengan apabila kita menggunakan JSON terstruktur pada SharedPreferences, pada SQLite kita bisa mengambil data-data yang kita perlukan saja (dengan menspesifikasikan query yang tepat). Misalnya untuk kasus ini, saya hanya ingin mengambil judul, url, dan rating dari suatu Manga. Saya tidak peduli dengan deskripsi, genre, maupun data-data yang lain. Tentu hal ini bisa meningkatkan performa! Tapi sebesar apa? Mari kita lihat!
Karena sudah di-backup sebelumnya, kali ini kita hanya melihat waktu yang dihabiskan oleh aplikasi untuk menyiapkan data yang siap ditampilkan.
Yes! Akhirnya peningkatan performa! Kali ini aplikasi dapat me-load data dalam waktu hanya 231ms saja! Tiga kali lebih cepat dibandingkan sebelumnya!

Dari percobaan ini saya kembali ke kesimpulan yang sebelumnya telah dibuat oleh suatu post di  StackOverflow : Gunakan SharedPreferences bila data-nya kecil dan bermacam-macam. Gunakan SQLite bila data-nya besar, terstruktur dan sedikit macam-nya.


Sekian dari saya. Seperti biasa, komentar dan tanggapan sangat diterima :)