Iseng di Kelas Praktikum Algoritma dan Pemrograman

Semester lalu alhamdulillah saya diberi kepercayaan oleh dosen mata kuliah Algoritma & Pemrograman di kampus saya (Bapak Harry T. Y. Achsan) untuk jadi asisten. Senang sekali tentunya, karena mata kuliah ini adalah mata kuliah favorit saya. ūüėČ

Ngomong-ngomong, mengajar di kelas itu sangat menyenangkan sebenarnya. Hal yang membuatnya jadi agak kurang menyenangkan adalah kewajiban di akhir untuk memberikan penilaian. Selain sulit dan ribet, kadang-kadang agak khawatir juga bahwa terjadi subjektifitas dalam penilaian saya.

Karena itu kemarin waktu melakukan asistensi saya sempat membuat UTS yang penilaiannya otomatis berdasarkan jumlah soal yang berhasil diselesaikan.

Namun tentunya, melakukan hal ini butuh pengorbanan yang lain juga. Saya harus menciptakan sejenis grader yang akan melakukan pengujian input dan output yang nantinya kemudian akan menilai hasil pekerjaan peserta kelas saya.

Dengan meluangkan waktu sejenak, akhirnya saya membuatnya juga. Ini tampilannya:

Tampilan Score Board UTS Algoritma dan Pemrograman

Tampilan Score Board UTS Algoritma dan Pemrograman

Kalau dipikir-pikir, jatuhnya sama seperti kontes pemrograman. ūüėõ

Sebenarnya, kalau fasilitasnya mendukung, saya tidak perlu capek-capek melakukan pembuatan aplikasinya, karena sudah banyak programming contest management system yang sudah mumpuni seperti PC^2 atau DOMjudge. Kendalanya, saya tidak punya server sendiri, sehingga saya menggunakan cara lain untuk melakukan penilaian.

Oh iya, soal yang saya buat bisa di-download di sini.

Kelas pemrograman ini menggunakan bahasa pemrograman Java. Jadi, untuk melakukan penilaian, saya membuat sebuah library yang disimpan dalam format JAR yang kemudian dapat digunakan untuk melakukan penilaian sekaligus untuk men-submit nilai ke server. Server yang saya maksud bukan server beneran sih. Saya menaruh score board tadi di website yang saya miliki di alamat http://muslihat.net.

Library yang saya implementasikan sebenarnya sederhana. Seluruh input dan output yang benar untuk setiap testcase yang diujikan ke program buatan peserta diletakkan di dalam array. Karena saya tidak mungkin menganalisis output yang dihasilkan program peserta (berhubung saya tidak bisa sekonyong-konyong mengubah hosting server menjadi grader server), maka setiap soal yang saya buat merupakan soal OOP yang tiap method-nya tinggal di-override saja.

Hasilnya lumayan juga ternyata. Saya jadi tidak perlu capek menilai pekerjaan mahasiswa peserta praktikum. Cukup santai saja melihat scoreboard. Hihi.

Barangkali, seharusnya mata kuliah algoritma dan pemrograman diubah modelnya menjadi seperti ini saja. Selain lebih fun, hal ini mempermudah dosen juga.

Bayangkan kalau seorang dosen memberikan tugas pemrograman. Setelah men-download source code dari masing-masing muridnya, sang dosen harus melakukan compile dan kemudian menguji input dan output dari program tersebut. Selain melelahkan, kadang-kadang jadi kurang teliti. Akan lebih baik kalau ada proses yang terautomatisasi untuk melakukan hal tersebut.

Nantinya kalau sang murid mau yang lebih serius, ada banyak kompetisi pemrograman yang model pengujiannya juga seperti ini. Buat programnya, submit untuk dinilai, dan kemudian lihat hasilnya. Kompetisi seperti International Collegiate Programming Contest (ICPC) menggunakan model seperti ini. Kompetisi yang berskala nasional seperti COMPFEST dari UI atau ITB-PC juga menggunakan model yang seperti ini.

Bayangkan, dari yang sekedar iseng-iseng mencoba kode, bisa sekalian keliling dunia kalau berhasil. Kenapa tidak? ūüėČ

Advertisements

Menghitung Pemangkatan Bilangan Dengan Algoritma Divide and Conquer

Secara naif, untuk menghitung pemangkatan bilangan a pangkat n, kita akan membutuhkan tepat n kali operasi perkalian dengan bilangan a (a dikali a dikali a dan seterusnya sebanyak n kali). Hal ini tentu saja kurang efisien karena jika n nilainya besar, algoritma dengan kompleksitas O(n) relatif lambat.

Untuk mengatasi hal ini, dapat digunakan metode rekursif divide and conquer untuk melakukan pemangkatan bilangan yang performanya jauh lebih cepat, yaitu O(log n).

int pow(int a, int n) {
    if (n == 0) return 1;

    int x = pow(a, n/2);

    if (n % 2 == 0) {
        return pow(x, 2);
    }
    else {
        return a * pow(x, 2);
    }
}

Algoritma ini berangkat dari ide, bahwa operasi a pangkat n itu sama saja dengan melakukan operasi kuadrat dari a pangkat (n / 2) yang dilakukan secara rekursif.

Jadi, kalau ada yang lebih cepat, kenapa tidak? ūüėČ

Jodoh

Ada satu jodoh,
yang tanpa kau kenal, ia telah mengenalmu,
tanpa kau dekati, ia selalu mendekatimu,
dan bahkan tanpa kau mencintainya, ia nanti suatu saat pasti akan bersanding denganmu.
Jodoh itu bernama kematian.

Membaca Source Code Bahasa Pemrograman

Saya punya ketertarikan yang sangat besar terhadap programming language development. Bayangkan saja, tanpa perkembangan yang signifikan dari bidang ini, pembuatan software akan sangat sulit. Dulu para programmer harus langsung berinteraksi dengan mesin secara langsung menggunakan bahasa mesin yang notabene hanya merupakan karakter dan angka-angka yang mewakili instruksi di dalam mesin tersebut. Seiring dengan berjalannya waktu, instruksi-instruksi ini diterjemahkan ke dalam kode-kode yang lebih representatif untuk manusia. Bahasa ini disebut assembly. Walaupun sudah diterjemahkan supaya lebih representatif, assembly masih tidak ramah, karena terdiri dari instruksi-instruksi mentah mesin.

Contoh bahasa assembly coba lihat di sini: http://assembly.happycodings.com/code1.html

Programmer saat ini tentunya sudah sangat nyaman sekali memrogram. Sekarang tinggal ketik source code, compile lalu programnya bisa jalan. Semuanya terasa lebih mudah.

Dibalik kemudahan programmer saat ini dalam melakukan programming, ada jasa yang sangat besar yang telah dilakukan oleh programmer-programmer terdahulu, yaitu para pemrogram compiler. Compiler merupakan program yang digunakan untuk menerjemahkan bahasa pemrograman tingkat tinggi ke bahasa mesin sehingga bisa dieksekusi. Disebut bahasa pemrograman tingkat tinggi (high level programming language) karena sangat dekat ke-familiar-annya  dengan bahasa manusia. Semakin sulit dimengerti oleh manusia, maka bahasa tersebut akan disebut low level programming language.

Saat ini, karena adanya berbagai macam¬†compiler¬†bahasa pemrograman, para penggemar bidang ini bisa dengan mudah memilih bahasa pemrograman yang mereka sukai. Sekarang ada banyak sekali bahasa pemrograman. C, C++, Java, C#, Pascal adalah contohnya. Sekarang semakin ke sini semakin banyak pula berkembang bahasa pemrograman baru. Ada PHP, Ruby, Python, Scala, Clojure, F# dan masih banyak lainnya. Bayangkan tahun-tahun ke depan, memilih bahasa pemrograman sama seperti memilih rasa mie instan. ūüėÄ

Menariknya lagi, sekarang sebagian besar bahasa-bahasa pemrograman tersebut open source. Dengan kata lain, kita bisa melihat ada kode seperti apa dibalik program-program tersebut. Ini menarik sekali, karena kita jadi bisa mengetahui cara kerja dibalik programnya.

Walaupun memang rumit, tapi ini luar biasa sekali. Bahasa pemrograman yang baru seperti Scala saja penggunanya saja sudah meliputi perusahaan-perusahaan besar seperti LinkedIn dan Twitter. Hal ini tentu saja bisa terjadi karena kehandalan bahasa pemrograman tersebut. Scala, ternyata juga¬†open source. ūüėČ

Coba saja kunjungi link-link ini:

  1. PHP (github.com/php/php-src)
  2. Google JavaScript Engine (code.google.com/p/v8)
  3. Clojure (github.com/clojure/clojure)
  4. Ruby (github.com/ruby/ruby)
  5. Python (hg.python.org/cpython)
  6. Scala (github.com/scala/scala)

Sebagian besar bahasa-bahasa pemrograman tersebut ternyata ditulis dengan menggunakan bahasa pemrograman C dan C++, namun ada juga yang menggunakan bahasa pemrograman Java seperti Scala dan Clojure.

Mau coba baca? Kunjungi saja. ūüėČ

Pentingnya Time Tracking

Pernah lihat gambar ini?

system_of_life

Representatif sekali ya? ūüėÄ Saya bingung juga saat melihatnya.

Pembaca sekarang ada di fase mana? Kalau saya sekarang ada di fase paling kiri, dan sedang menjalani transisi untuk menuju ke tengah.

Sangat terasa, sekarang waktu merupakan hal yang penting untuk dikontrol. Kalau dulu mungkin mau ini atau mau itu tinggal dijalani saja, tetapi kalau sudah terlibat dalam suatu pekerjaan yang sifatnya profesional, dibutuhkan time management yang baik supaya semua target dan pencapaian bisa dikejar.

Ngomong-ngomong soal waktu, saya jadi ingat. Bulan ini sudah sekitar 9 bulan saya bekerja sebagai intern programmer di Netmile Solutions, sebuah software house di Jakarta yang fokus pada pengembangan aplikasi web dan mobile.

Ada banyak hal yang saya pelajari di sana, dan 1 hal yang paling saya rasakan sangat mengubah pola pikir saya adalah tentang time tracking. Saya bekerja part time di sana, sehingga saya secara aktif harus mengunggah timesheet yang dijadikan dasar untuk perhitungan salary.

Jadi setiap saya mengerjakan sesuatu, saya harus menghitung waktu yang saya habiskan untuk mengerjakan pekerjaan tersebut. Kadang-kadang saya juga bekerja secara remote sehingga untuk lebih teliti perhitungannya, tentunya dibutuhkan data durasi pekerjaan yang saya lakukan.

Setelah menjalaninya, barulah saya menyadari. Time tracking ternyata bukan masalah perhitungan salary saja.

Kalau misalkan pembaca ditanya, dalam 1 hari berapa jam pembaca mengakses internet? Ya, mungkin pembaca bisa saja menjawab tentang nominal jam. Presisi? Mungkin iya, tapi kemungkinan besar tidak presisi bukan?

Di kantor, terkadang ada¬†project¬†yang perhitungan¬†fee-nya dilakukan berdasarkan jam kerja. Saya kadang suka bingung kalau ditanya, “untuk menyelesaikan¬†software¬†yang¬†requirements-nya begini begini dan begini, kamu butuh berapa jam?” Saya tidak pernah menghitung waktu yang saya habiskan selama ini untuk menciptakan suatu¬†software. Akhirnya saya harus mereka-reka jumlah jamnya dan agak rawan jadinya kalau-kalau jumlahnya terlalu sedikit atau terlalu banyak.

Bayangkan, kalau ternyata saya menebaknya terlalu sedikit, otomatis saya yang akan repot untuk mengejar tenggat waktu. Padahal sebenarnya saya punya waktu yang cukup kalau saya tahu berapa lama seharusnya pekerjaan itu diselesaikan. Sedangkan, kalau terlalu banyak alokasinya, client akan merasa rugi, karena harus menghabiskan uang banyak dan bisa jadi juga client akan mengecap kita sebagai orang yang lamban, karena seharusnya pekerjaan yang diberikan tersebut bisa diselesaikan dalam durasi yang lebih singkat.

Ternyata di sini pentingnya. Saya sekarang jadi tahu kalau misalkan harus menjawab pertanyaan seperti itu. Sejak saat itu, setiap saya mengimplementasikan sesuatu, saya coba hitung waktu yang saya habiskan dengan menggunakan time tracking software. Di kantor, saya dianjurkan untuk membiasakan menggunakan Toggl.

Rekaman data dari time tracking ini bisa kita manfaatkan untuk banyak hal.

Pertama, tentunya kita jadi tahu berapa total waktu yang kita gunakan untuk mengerjakan sesuatu. Jika kita ingin melakukan hal yang serupa, kita jadi lebih mudah mengalokasikan waktunya. Dan yang lebih penting, kita juga jadi bisa tahu, pada jam-jam berapa kita produktif, dan seberapa besar¬†delay¬†yang kita lakukan tiap pengerjaan. Ini juga bisa jadi patokan, seberapa lama kita sering menunda-nunda pekerjaan. ūüėõ

Kedua, kita juga jadi bisa mengetahui progress dari diri kita sendiri dalam mengerjakan sesuatu. Misalnya, kalau dulu untuk membuat sebuah modul autentikasi di dalam suatu aplikasi web bisa menghabiskan 3 jam, ternyata sekarang saya sudah bisa lebih cepat karena bisa mengerjakannya dalam 1 jam saja. Dengan ini kita juga jadi bisa melihat seberapa besar performa kita meningkat dalam suatu pekerjaan.

Ketiga, tentu saja mempermudah kita dalam melakukan time management. Time management itu sangat penting. Kadang kita tidak sadar sudah terpaku berjam-jam di depan komputer tetapi tidak menghasilkan apapun. Time tracking membantu kita untuk mengetahui hal ini dan yang lebih pentingnya membuat kita tahu durasi-durasi dari hal yang tidak pernah kita hitung sebelumnya.

Dengan memanfaatkan waktu secara optimal, kita tentunya jadi bisa mengalokasikan waktu dengan lebih baik. Hidup bukan urusan pekerjaan saja bukan? Tentunya mengalokasikan waktu untuk me-time atau menyempatkan diri untuk berada di tengah-tengah keluarga dan orang-orang yang kita cintai merupakan sesuatu yang juga kita butuhkan. Dan dengan alokasi waktu yang berantakan, mana mungkin?

Jadi, ayo mulai hitung durasi dari aktifitas-aktifitas kita. ūüėČ