04 August 2013

Renungan tentang Kesulitan Belajar Bahasa Pemrograman Komputer

Aku merenungkan suatu hal yang mungkin juga direnungkan banyak orang yang telah lama berkecimpung di dunia rekayasa perangkat lunak, namun telah sadar diri bahwa ada titik kesulitan di dalam menguasai sebuah bahasa pemrograman. “Mengapa aku sulit mendapatkan ruh bahasa pemrograman yang aku idam-idamkan untuk aku kuasai?”, mungkin itu pertanyaan yang selalu berputar-putar di kepala seseorang yang belum menemukan jati dirinya di dalam pemrograman komputer. Aku juga bingung, mengapa minat yang besar terhadap suatu bahasa pemrograman komputer kadang tidak diimbangi dengan kecepatan.tingkat penguasaan terhadap bahasa pemrograman komputer tersebut. Menurutku, seharusnya semakin besar minat terhadap suatu bahasa pemrograman komputer maka akan semakin besar pula akselerasi penguasaan terhadap bahasa pemrograman komputer tersebut. Namun kenyataannya tidak demikian, aku akui secara terang-terangan bahwa aku tidak menguasai secara penuh tentang bahasa pemrograman komputer, satupun tidak ada yang aku kuasai secara penuh, entah itu Bahasa C, C++, Java,  Visua basic, ataupun  semacam Javascript dan PHP. Ibaratnya, aku hanya tahu kulitnya, tanpa menyentuh bijinya, apalagi menanam bijinya agar berbuah lebih banyak lagi. Secara garis besar apa yang aku alami dan renungkan ini adalah implikasi dari hal yang aku anggap memalukan sebagai seorang mahasiswa Teknik Informatika, yang notabene pada masa kuliahnya digerojok dengan materi-materi kuliah berbagai bahasa pemrograman komputer. Apakah aku akan menyalahkan sistem perkuliahanku?, tidak. Apakah aku menyalahkan kemampua otakku?, tidak juga. Apakah aku menyalahkan kurang sarana dan prasarana untuk mempelajari bahasa pemrograman komputer?, jelas tidak mungkin.

Aku menemukan jawaban atas masalahku dalam penguasaan bahasa pemrograman komputer ketika membaca ulang buku-buku konsep dasar pemrograman komputer, lebih tepatnya buku tentang algoritma dan struktur data. Aku membaca buku tersebut perlahan-lahan,  mengelaborasinya sedikit  demi sedikit, dan mengkontekstualisasikannya dengan bermacam-macam hal. Kesimpulan atas jawaban yang aku temukan adalah bahwa kesulitanku dalam menguasai bahasa pemrograman komputer selama ini karena ekspektasiku yang terlalu tinggi sebagai seorang pemula. Ya, aku akui keinginanku dalam menguasai bahasa pemrograman komputer bagaikan pesawat yang ingin mendarat dari terbangnya padahal lepas landas saja belum. Aku tidak bisa melihat diriku sendiri sebagai seorang pemula karena terlalu banyak melihat kehebatan-kehebatan pihak lain yang profesional di bidang rekayasa perangkat lunak, aku buta diri. Kebutaanku menutupi aksesku sendiri kepada hal-hal yang fundamental, seperti konsep algoritma dan struktur data. Seolah-olah aku ini ingin secara instan menjadi seorang expert tanpa mau menengok pondasi-pondasi apa yang aku perlukan agar pantas disebut expert di bidang rekayasa perangkat lunak, khususnya dalam hal penguasaan bahasa pemrograman komputer.

Aku mengulang-ulang istilah “bahasa pemrograman komputer” berkali-kali dalam otakku sebagai tanda rasa ingin tahuku apakah ada titik mati yang bisa aku gunakan untuk melompat dari permasalahanku dalam menguasainya. Aku kemudian mencoba memecah istilah tersebut dan menyisakannya hanya satu kata, yaitu “bahasa”, yang dalam literatur asing Bahasa Inggris disebut language. Aku menarik-narik sendiri pemahamanku bahwa bahasa adalah suatu bentuk cara berkomunikasi dengan orang lain, atau mungkin makhluk lain selain manusia, sehingga maksud dan tujuan si pemakai bahasa bisa tersampaikan dengan jelas dan mendapatkan feedback (sambutan) dari pihak yang diajak berkomunikasi tanpa ada kesalahpemahaman. Sebagai contoh, apabila aku ingin bicara dengan orang Jawa, maka sebaiknya aku mengguakan Bahasa Jawa, agar maksudku tersampaikan dengan jelas, tidak ada kesalahpahaman, dan ada perasaan nyaman diantara aku dan orang yang aku ajak bicara. Contoh lagi, mungkin suatu saat aku ingin berbicara dengan ayam, maksudnya mengusir ayam yang bertengger di teras rumahku, maka aku harus menggunakan bahasa yang dimengerti ayam itu, bisa berupa bahasa melalui ucapan langsung berupa hardikan yang mengagetkan dia, atau dikolaborasi dengan bahasa tubuh yang mengagetkan.  Tidak mungkin lah aku mengusir ayam pakai Bahasa Indonesia sambil duduk-duduk  dan kipas-kipas santai di ruang keluarga, “Hai ayam, pergilah kau dari teras rumahku dan jangan buang kotoran disitu ya!”. Menurutku Si Ayam tidak mungkin beranjak dari teras rumahku kalau aku memakai Bahasa Indonesia seperti itu.
Kemudian lagi, aku beri contoh yang lebih operasional pada level superkontekstual. Semisal aku ingin menyatakan cinta kepada Britney Spears, dan misalnya lagi, Briteny Spears hanya memahami Bahasa Inggris, maka jelaslah aku harus menyatakan cinta kepadanya dengan Bahsa Inggris. Misal pernyataan cinta yang aku perlukan adalah “Aku cinta kamu”, maka aku harus tahu apa translasi Bahasa Inggris dari tiap kata itu. Aku adalah I, cinta adalah love, dan kamu adalah you. Setelah tahu translasinya, maka aku harus tahu, mungkin, tenses apa yang harus aku gunakan, kemudian baru aku rangkai kata-katanya. Hasil akhirnya adalah “aku cinta kamu” diubah ke Bahasa Inggris menjadi “I love you”. Aku katakan kepada Britney Spears dengan pengucapan yang benar, “I love you”, dan tinggal aku tunggu apa sambutan darinya. Dari segi bahasa, apakah mungkin Britney Spears memahami “I love you” sebagai kalimat makian? Jelas tidak, pasti dia memahami “Oh, orang ini sedang menyatakan rasa cinta kepadaku”. Tidak mungkin secara bahasa dia memahaminya seperti “Oh, orang ini sedang bersin”, kecuali Si Britney sedang tidak waras alias error atau aku mengucapkannya sambil bersin-bersin tidak jelas. Apa yang aku dapatkan dari kontekstualisasi tersebut? Ingat, yang aku bahas adalah kata “bahasa”, dimana untuk dapat memakai bahasa (misal Bahasa Inggris) maka aku harus tahu translasi bahasaku ke bahasa tersebut. Dimulai dari penulisan kata, perangkaian kata, sampai dengan pengucapan. Dalam bahasa tulis dimulai dari kata, dilanjutkan ke frasa, dilanjutkan ke kalimat, dilanjutkan ke paragraf, kemudian berakhir dengan tulisan yang benar benar memilki makna atau pesan tertentu agar bisa dipahami oleh pembaca (apabila dibaca) atau oleh pendengar (bila dideklamasikan).
Mempelajari bahasa pemrograman komputer juga memiliki konsep yang sama dengan mempelajari bahasa lain, seperti Bahasa Indonesia ataupun Bahasa Inggris. Pembedanya adalah Bahasa Indonesia atau Bahasa Inggris aku gunakan untuk berbicara dengan orang, sedangkan bahasa pemrograman komputer aku gunakan untuk berbicara dengan komputer. Ya, mau tidak mau, sebagai jembatan dasar berbicara kepada komputer dalam paradigma programmer, aku harus berbicara dengan komputer melalui bahasa pemrograman komputer. Pokoknya, aku ingin berbicara kepada komputerku untuk memberi dia suatu perintah. Perintah bisa bermacam-macam, misal perintah untuk menghitung, menampilkan gambar, mematikan lampu, dan lain sebagainya. Apakah perintahku akan dituruti komputerku? Pada dasarnya adalah iya, selama perintahnya jelas, bisa dipahami komputer, dan komputer punya sumber daya untuk melakuakan perintahku. Sejahat apapun perintahku pasti dituruti oleh komputerku. Berbeda dengan contoh Britney Spears sebelumnya, karena dia adalah manusia (baca: orang alias makhluk sosial) maka dia belum tentu memenuhi perintahku, meskipun dia sudah paham yang aku maksudkan bahwa aku cinta dia. Apakah cintaku ditolak ataukah diterima, itu terserah Britney.
Kuncinya adalah “selama bahasa pemrograman komputer yang aku sampaikan kepada komputerku bisa dimengerti dengan baik oleh komputerku, maka pada dasarnya komputer pasti akan menuruti perintah yang aku berikan kepadanya”. Batasannya adalah “dimengerti dengan baik oleh komputer”, apa maksudnya?  Maksudnya adalah perintah yang aku berikan kepada komputerku harus mentaati kaidah-kaidah yang ada pada bahasa pemrograman komputer yang aku gunakan dan tidak ada error, sehingga komputer bisa memahaminya. Dengan demikian, aku harus megetahui kaidah-kaidah dasar terlebih dahulu tentang bahasa pemrograman komputer yang ingin aku kuasai. Misalnya adalah Bahasa C++, kalau Bahasa Inggris dimulai dari translasi dari kata “cinta” ke “love”, maka bagaimana sistem translasi di C++? Nah banyak sekali sistem translasinya dalam bahasa C++, misal perintah mencetak suatu kalimat, maka translasinya adalah cout, dan lain sebagainya. Setelah aku tahu translasi dasar dari C++, maka aku coba ke langkah berikutnya, yaitu translasi tentang variabel, apa itu variabel, dan bagaimana penulisannya, langkah berikutnya mungkin aku ingin transalsi aritmatika, dan seterusnya sehingga tercapailah sesuatu yang disebut sebagai satu cerita atau pesan utuh yang terdiri dari sekumpulan paragraf-paragraf perintah yang saling berkaitan dan siap disampaikan kepada komputer dalam Bahasa C++. Pasti komputer akan memberikan feedback yang aku inginkan bila semua perintahku bisa dipahami oleh komputer. Memang bisa diibaratkan, kalau di Bahasa Indonesia aku mengenal Ejaan yang Disempurnakan (EYD), maka Bahasa C++ yang aku tulis harus mematuhi EYD Bahasa C++ secara ketat, tidak boleh ada yang salah‼!. Selain itu, kalau di bahasa tulis kita mengenal koherensi antar paragraf yang baik sehingga tulisan mudah dipahami, maka Bahasa C++ yang aku tulis harus memiliki alur logika yang tepat, harus tepat‼!, agar feedback yang aku harapkan  dari komputer bisa tercapai.
Pada buku algoritma dan struktur data yang aku baca, aku menemukan beberapa hal fundamental yang bisa aku jadikan contoh untuk menjelaskan keruwetan masalah yang sedang aku renungkan. Aku jelaskan salah satu saja. Aku akan jelaskan secara top down dan singkat. Salah satunya adalah tentang organisasi data di dalam suatu tabel. Aku membayangkan sebuah tabel (bisa tabel jadwal pelajaranku ketika SD, tabel apa sajalah), karena sebenarnya semua permasalahan pada dunia bahasa pemrograman komputer kembali kepada susunan tabel yang terdiri dari baris dan kolom. Tujuan dasar pengolahan informasi melalui bahasa pemrograman komputer adalah data. Data diartikan sebagai suatu angka yang mempunyai nilai atau arti. Sekarang aku bertanya, dimana letak data itu? Dalam kerangka bahasa pemrograman komputer, visualisasi letak data bisa digambarkan, misal,  melalui penggambaran sebuah tabel dengan 4 kolom dan 3 baris. Kolom pertama adalah kolom Nomor KTP, kolom kedua adalah kolom Nama Lengkap, dan kolom ketiga adalah kolom Alamat, dan kolom keempat adalah kolom Umur. Nah, mengingat kembali pelajaran statistika, baris pertama disebut sebagai kepala tabel yang berisi nama kolom, sedangkan baris kedua dan ketiga adalah tubuh tabel. Pada ranah organisasi data komputer, kepala tabel disebut sebagai atribut, sedangkan tubuh tabel disebut sebagai nilai. Misal pada baris pertama diisi secara berurutan dari kolom ke kolom, kolom Nomor KTP diisi 12345, kolom Nama Lengkap diisi Admaja Dwi Herlambang, kolom Alamat diisi Padangan, dan kolom Umur diisi 21. “Nomor KTP mempunyai nilai 12345” bisa disebut sebagai data, “Nama Lengkap mempunyai nilai Admaja Dwi Herlambang”, bisa disebut sebagai data, “Alamat mempunyai nilai Padangan” bisa disebut data, dan “Umur 21” bisa disebut sebagai data. Data tersebut bisa saling berhubungan berdasarkan atribut-atribut yang relevan, relevan artinya berada di dalam satu baris kepala tabel. “No KTP 12345, Nama Lengkap Admaja Dwi Herlambang, Alamat Padangan, Umur 21”, merupakan sekumpulan data yang telah terorganisasi dan menghasilkan informasi yang lebih luas daripada data tersebut berdiri sendiri atau belum dihubungkan dalam satu baris. Demikian pula dengan data pada baris 3 akan memiliki informasi yang lebih jelas bila tiap nilai pada satu baris dihubungkan. Data pada baris 2 tidak akan tercampur dengan data baris 3, maka dari itu ini semua disebut sebagai organisasi data karena semua teratur dan tidak campur aduk.
Kemudian aku telah paham, bahwa secara sederhana, setiap baris itu merupakan data. Baris disini merupakan gabungan antara baris kepala tabel dengan salah satu baris pada tubuh tabel, bisa baris 2, baris 3, atau seterusya. Ada baris, maka pasti ada kolom. Kemudian kolom disebut dengan apa? Kolom disebut sebagai fields, kemudian kumpulan kolom-kolom yang membentuk sebuah tabel (misal tabel data mahasiswa, yang terdiri dari kolom Nomor KTP, Nama Lengkap, Alamat, dan Umur) disebut sebagai record. Kemudian sekumpulan tabel-tabel yang saling berhubungan, walaupun telah berdiri sendiri dan membentuk informasi yang lebih besar daripada sebuah tabel, disebut sebagai files. Kesimpulannya, sebuah kolom disebut sebagai fields, sekumpulan fileds secara mandiri disebut sebagai record, dan sekumpulan record yang saling berhubungan disebut sebagai files. Oke, jelaslah sudah, jadi sekarang aku harus membelah pikiran menjadi dua. Ketika ada orang bilang kolom, pertama, aku harus berpikir secara umum yaitu meikirkan kolom biasa seperti pada tabel-tabel biasa. Kemudian, kedua, aku harus berpikir bahwa itu adalah fields, dan begitu pula antara tabel dan record, ataupun antara sekumpulan tabel dan files. Atau mungkin pikirannya dibalik, kalau ada orang bilang, “aku minta file gambarnya boleh ya?”, maka aku berpikir bahwa file gambar adalah sekumpulan data grafis yang tersusun rapi di dalam tabel-tabel atau record-record yang bersatu padu dan mencitrakan informasi sebagai sebuah gambar.
 Sebelum berlanjut, aku merenung lagi, kalau tadi aku berkata bahwa data adalah suatu angka yang mempunyai nilai, maka Adamaja Dwi Herlambang dan Padangan itu data apa bukan?, kan itu bukan angka. Oke, pertanyaan ini kemudian membawaku ke pembahasan datum, data numerik dan alphanumerik, dan lain sebagainya,  yang muaranya adalah tipe-tipe data, dan seterusnya, dan seterusnya. Sungguh indah sekali bukan?. Singkat cerita, secara keseluruhan, pemahaman ini akan membawaku ke konsep tipe data, array, record, pointer, list, stack, queue, tree, graph, dan hashing (misalnya pada ranah Bahasa C++). Semua terangkai, tidak berdiri sendiri, setelah memahami organisasi data (tabel-tabel) maka aku memahami apa itu tipe data, setelah memahami tipe data aku memahami array, dan seterusnya. Pemahamanku yang semula saling bercerai berai antara konsep tipe data, array, record, pointer, list, stack, queue,tree, graph, dan hashing, seolah sekarang saling menyambung. Ibaratnya, lima jari tangan yang semula terbuka lebar, kemudian sekarang seperti menggenggam erat.
Kesimpulannya, pengetahuan tentang bahasa pemrograman komputer jenis apapun, adalah unit pengetahuan yang bersifat majemuk dan terdiri dari sub pengetahuan seperti konsep, prosedur, ataupun prinsip yang saling berhubungan  (multiple knowledge). Pengetahuan tentang bahasa pemrograman komputer bukan pengetahuan parsial yang matriksnya bersifat mandiri dan eksklusif (single knowledge). Kesalahan yang menyebabkan aku kesulitan menguasai bahasa pemrograman komputer adalah pemahamanku yang bersifat parsial terhadap matriks pengetahuan bahasa pemrograman komputer seperti konsep tipe data, array, record, pointer, list, stack, atau yang lain. Pemahaman seperti itu menuntunku kepada pola acak dalam mempelajari bahasa pemrograman komputer dimana dari satu konsep melompat ke konsep yang lain, tanpa memahami bahwa sebenarnya ada ketersambungan (linked) diantara konsep-konsep tersebut. Misalnya, saat mempelajari Bahasa C++ tiba-tiba aku mempelajari array, kemudian setelah memahami penggunaan array aku melompat mempelajari stack. Pada tengah proses mempelajari stack, aku menemui kesulitan yang menggiringku untuk mempelajari tipe data. Berulang dan berulang seperti itu sehingga aku gagal mencapai kebermaknaan antar sub pengetahuan tersebut. Setelah putus asa, yang aku artikan dengan kebosanan, aku beralih ke bahasa lain, semisal Java. Begitulah seterusnya sehingga jelas sudah pola letak kesulitanku dalam mempelajari bahasa pemrograman komputer. Kurang tepat bila aku memandang pengetahuan tentang bahasa pemrograman komputer adalah pengetahuan parsial, tetapi akan lebih baik aku memandangnya sebagai pengetahuan majemuk dimana bila aku akan dituntun ke proses belajar yang elaboratif. Proses belajar yang mengalir dari pengetahuan dasar yang bersifat sederhana (worm paradigm) menuju pengetahuan puncak yang bersifat kompleks (eagle paradigm), kemudian apabila telah mencapai eagle paradigm, maka bisa menuju ke pengetahuan jenis lain dengan cara kembali ke pengetahuan dasar dari pengetahuan baru tersebut tanpa mengabaikan pengetahuan yang diperoleh sebelumnya (diving paradigm). Apabila aku visualisasikan, maka akan terbentuk paradigma rajut yang mirip siklus sinusoida.
Demikian, renungan sederhana tetapi secara egois bisa aku katakan bahwa renunganku ini telah membuka cakrawala kebodohanku sendiri. Aku harus memahami hal-hal yang mendasar terlebih dahulu sebelum punya keinginan untuk melompat ke hal-hal yang kompleks, atau bahkan bermimpi-mimpi ke hal-hal kompleks yang membutuhkan pengetahuan komprehensif. Seperti nasehat dari seorang ilmuwan asing yang aku lupa nama dan rupanya (yang aku ingat hanya inti nasehatnya), ”Bila aku menemukan suatu kesulitan dalam memecahkan suatu masalah matematika kompleks, maka aku akan membuka buku-bukuku lagi untuk mempelajari ulang hal-hal yang bersifat sederhana dan mendasar, meskipun hal-hal mendasar itu adalah penjumlahan sederhana seperti satu ditambah satu sama dengan dua”. Selain itu, aku sebagai orang Indonesia, mungkin akan kesulitan menguasai Bahasa Inggris kalau tidak ada lawan bicaranya dalam kehidupan sehari-hari. Begitu pula dengan Bahasa C++, atau bahasa pemrograman komputer lain, aku tidak akan menguasai kalau aku tidak mengetik bahasa pemrograman komputer yang ingin aku kuasai secara berulang-ulang untuk memecahkan berbagai masalah. Bisa karena biasa.

"Semoga bermanfaat. Harapanku, pembaca bisa memilah bagian renunganku yang sekiranya bisa diambil manfaat dan bisa menambah motivasi untuk mempelajari bahasa pemrograman komputer. Aamiin."

Padangan, 2 Agustus 2008
Salam,

A. D. Herlambang