Berbagi adalah sesuatu yang gratis, setiap orang dapat membagikan apapun yang mereka inginkan terlepas dari latar belakang dan pengalaman. Dan ditulisan ini gue ingin berbagi tentang cara gue mempelajari bahasa pemrograman lain, yang mungkin jika someday gue sudah bukan pemrogram lagi dan somehow gue ingin kembali ke dunia pemrograman, semoga tulisan ini bisa menjadi rujukan gue (dan semoga tetap bisa diakses seumur hidup jaringan internet) sehingga gue bisa mengingat dengan persisnya bagaimana gue mempelajari suatu bahasa pemrograman.
Sebagai sangkalan, gue bukanlah ahli apalagi ahlinya ahli melainkan hanya seorang acak di internet yang meyakini bahwa menulis program seharusnya menyenangkan dan gak bikin stress.
Section titled IntroduksiIntroduksi
Gue mengklaim diri gue sendiri bahwa gue adalah seorang Jack of all trades – and master of none, obviously. Di dunia nyata, biasanya kita memiliki “mother/first/native language” seperti Bahasa Indonesia dan Basa Jawa untuk kasus gue. Di dunia perkomputeran, gue kurang yakin apa mother language gue, namun jika boleh meng-generalisir, ia adalah bahasa pemrograman untuk membuat program di internet.
Bahasa pemrograman itu adalah PHP: Hypertext Preprocessor (PHP), yang gue pelajari sekitar 6 tahun yang lalu dengan mempelajari sumber kode webshell (ehm, backdoor) yakni b374k.
Setelah dari PHP, gue pindah ke Ruby yang gue pelajari dari Sekolah Koding.
Lalu setelah Ruby gue pindah ke JavaScript, sampai hari ini. Mungkin dari sini-lah gue pindah dari “Fullstack Developer” menjadi “Web Developer” atau yang sekarang disebut dengan Frontend Developer.
Banyak perkembangan yang gue rasakan ketika menjadi Frontend Developer sampai sekarang dan yang paling terasa adalah sekarang bebannya lebih banyak di kode daripada di design (remember how to fucking slice & sprite?)
Anyways, ada banyak bahasa pemrograman yang ada di dunia: Python, Java, Scala, Kotlin, Haskell dsb lalu mengapa gue memilih PHP; Ruby, dan JavaScript?
Secara filosofis adalah karena PHP relatif mudah dipelajari; Ruby relatif menyenangkan untuk ditulis dan JavaScript relatif mudah untuk dijalankan.
Jika untuk jawaban secara realistis: karena duit.
I follow where the fuck money goes – at the time.
Section titled MotivasiMotivasi
Meskipun meng-klaim diri gue sebagai Jack of all trades, gue tidak mengklaim diri gue sebagai polyglot (in programming), mungkin lebih sebagai language-agnostic kali ye.
Gue sadar kalau JavaScript itu bahasa yang menyebalkan, dan mungkin akan lebih menyenangkan jika mengembangkan User Interface menggunakan Elm atau TypeScript atau Reason atau mungkin ke yang lebih ekstrim lagi seperti Rust & C++ dengan target Web Assembly yang bisa dimengerti oleh evergreen browser.
Tapi, yeah, just pick the right tool for the job. Dan pada saat ini, the right tool yang gue yakinkan untuk pekerjaan gue adalah PHP & JavaScript.
In some cases, gue ada kesempatan dimana gue ‘pergi’ ke bahasa pemrograman lain. Tujuannya beragam, entah hanya untuk bersenang-senang; studi banding, ataupun hal lain (seperti ngambil side job misalnya hahaha).
Misal, pergi ke Elixir (seperti yang belakangan ini sedang gue lakukan) atau Haskell untuk mempelajari paradigma fungsional; pergi ke Go untuk mempelajari pola concurrency, pergi ke Rust untuk mempelajari manajemen memory atau pergi ke TypeScript untuk membuat meme.
Apapun alasannya, intinya gue tidak hanya karena iseng.
Bagian “Motivasi” disini gue harap bisa membantu untuk mendapatkan jawaban terkait “Motivasi” apa yang membuat lo ingin ‘pergi’ ke bahasa pemrograman lain – [spoiler] (jika motivasinya karena duit, bisa langsung skip bagian ini) [/spoiler] – sehingga waktu lo tidak banyak dihabiskan untuk melakukan hal yang tanpa alasan dan bisa dialokasikan ke hal lain seperti terus ber-eksplorasi dengan bahasa pemrograman yang sudah lo kuasai sekarang.
Jika sudah mendapatkan jawabannya, izinkan gue untuk membagikan apa yang gue ketahui & alami terkait mempelajari bahasa pemrograman ini kepada para pembaca budiman sekalian.
Section titled It%20always%20starts%20with%20%u2018predecessor%u2019It always starts with ‘predecessor’
Apapun bahasa pemrograman yang kamu pilih saat ini, pasti adalah sebuah ‘bahasa turunan’ dari induknya ataupun yang ‘terinspirasi’ dari bahasa lain.
Misal, JavaScript. Yang mana terinspirasi dari bahasa pemrograman Java dan Script.
Hahaha bercanda.
Oke oke, misal JavaScript yang menurut Wikipedia terinspirasi dari bahasa pemrograman Java, Scheme, AWK, dan HyperTalk. Orang yang sudah mengetahui Java akan terasa familiar melihat JavaScript, dan terkadang ini menjadi jebakan seperti menulis kode JavaScript dengan gaya EnterpriseⓇ sebagaimana pemrogram Java.
But anyway, Java sendiri terinspirasi dari C++. Jadi gak perlu bertanya mengapa belajar C++ lalu Java di jurusan Teknik Informatika yang kemungkinan penerapannya di dunia nyata untuk ukuran freshgrad sangat kecil, karena salah satunya dua bahasa pemrograman tersebut dapat dijadikan sebagai ‘batu loncatan’ untuk beranjak ke bahasa pemrograman lain yang lebih realistis.
Mengetahui bahasa induknya dapat membantu mempermudah mempelajari bahasa pemrograman yang ingin kamu pelajari saat ini. Bahasa pemrograman Python/Ruby akan relatif sulit dimengerti oleh kita yang terbiasa dengan Java/C dan bahasa pemrograman Haskell/Clojure akan relatif sulit dimengerti oleh kita yang terbiasa dengan Python/Ruby dan seterusnya.
Namun bukan berarti kita harus mempelajari bahasa induknya, melainkan cukup mengetahui saja sehingga tidak perlu heran untuk membuat polymorphism dengan class di Go ataupun untuk memutasi variable di Haskell.
Section titled ParadigmParadigm
Paradigma sederhananya adalah tentang cara pandang, yang mana berpengaruh terhadap cara pikir; bersikap dan bertingkah laku.
Gue rasa kemungkinan besar orang mempelajari suatu bahasa adalah karena dia terpengaruh dengan apa yang ada didalam bahasa tersebut, bukan murni karena bahasa tersebut itu sendiri.
Misal, mereka yang tertarik mempelajari bahasa Korea karena menyukai idola mereka, mereka yang tertarik mempelajari bahasa Prancis karena menyukai budaya Prancis, ataupun mereka yang mempelajari bahasa Jepang agar bisa nonton jav tanpa subtitle.
Apapun alasannya, intinya karena terpengaruh dengan apa yang ada ‘didalam’ nya tersebut.
Di bahasa pemrograman, gue rasa juga tidak jauh beda.
Gue tertarik dengan Rust karena di cara mereka mengatur memori, terpengaruh dengan Go karena di cara mereka memperlakukan banyak pekerjaan di satu waktu dan tertarik dengan Elixir karena pendekatan fungsional yang mereka tawarkan.
Di kasus umum, paradigma disini biasanya tentang imperatif & deklaratif; static & dynamic typing, data & event driven dsb.
Dan setiap orang pasti memiliki preferensinya masing-masing. Misal seperti para functional programmer yang membenci hal-hal ribet yang terlihat imperatif dengan cara membungkus apapun yang bisa dibungkus dan yang klo ditanya alasannya kenapa, akan bercerita tentang aljabar, tritunggal dan kaitan antara illuminati & freemasonry.
Anyways, jika kamu sudah memiliki preferensimu dan paradigma di bahasa pemrograman yang kamu pilih sesuai dengan preferensi, it must be not that hard to learn your next programming language.
Jika misalnya tidak sesuai dengan preferensimu, gpp. Dunia tidak akan pernah selalu berjalan sebagaimana yang kamu harapkan. Namun kamu memiliki pilihan: tinggalkan & pindah atau terima & biasakan.
Jika kamu membenci mengapa tidak ada kata kunci end
di setiap statement yang ada di Python ataupun membenci kenapa tidak ada class di Go, gue sudah memberikan jalan keluarnya diatas.
Section titled VocabularyVocabulary
Akhirnya, masuk topik inti.
Bahasa selalu tentang himpunan kata, begitupula dengan bahasa pemrograman. Mengetahui seberapa banyak “kata” yang ada dapat memberikan gambaran seberapa banyak yang harus kita hafal – sehingga kita tidak menulis True
di JavaScript untuk literal boolean, sebagai contoh.
Misal di JavaScript, ada lebih dari 50 kata yang harus diingat yang kabar baiknya kita tidak harus mengingat itu semua dalam satu waktu.
Kata kunci seperti for
, if
, while
, async
, yield
, throw
, function
, finally
, eventually
, technically
, literally
, anyway
dsb adalah kata-kata yang harus kita ketahui dan ingat.
Kabar baiknya, kebanyakan bahasa pemrograman menggunakan kata kunci yang hampir sama dalam ‘menandakan’ sesuatu karena pada dasarnya kata-kata yang dipilih menggunakan bahasa Inggris.
Di sudut pandang kompiler, kata-kata tersebut adalah token. Token disini tidak hanya tentang kata kunci, melainkan juga tentang pengenal; tanda baca, tipe data dan lain sebagainya.
Namun sekali lagi, token yang ada hampir menggunakan kata yang sama.
Seperti, hampir semua bahasa pemrograman setuju untuk membuat pengulangan adalah menggunakan kata kunci for dan untuk menetapkan nilai pada suatu variabel adalah dengan tanda baca =
dan bukan which is
.
Yang berarti, tidak terlalu banyak yang harus diingat, bukan?
Namun bahasa bukan hanya tentang kata saja, karena bahasa tidak bermakna bila tanpa tatabahasa.
Dan disini bagian yang lumayan sulitnya.
Section titled GrammarGrammar
Dalam bahasa Indonesia, untuk menjelaskan warna suatu daun, mungkin bisa menggunakan kalimat “warna daun itu adalah hijau”.
Dalam bahasa Inggris, mungkin “leaf color is green”.
Dalam JavaScript, mungkin var leaf = 'green'
dan dalam Java mungkin private static final String leaf = "green"
.
Secara bahasa, kalimat diatas hanyalah kumpulan kata yang terdiri dari:
- Warna
- Daun
- Itu
- Adalah
- Hijau
Yang jika kita urutkan secara alfabet berarti:
- Adalah
- Daun
- Hijau
- Itu
- Warna
Yang tentu saja terlihat tidak memiliki makna.
Maksudnya, untuk membuat kumpulan kata tersebut bermakna, kita harus merangkainya dengan tatabahasa yang tepat.
Jika tidak tepat, maka pembacanya tidak akan paham maksudnya.
Jika pembaca tersebut misalnya kompiler, biasanya terdapat syntax error, karena, yaa, si kompiler gak paham sama yang lo maksud.
Grammar atau tatabahasa adalah salah satu bagian yang sangat sulit dipahami namun kabar baiknya lagi, tatabahasa pun memiliki pola.
Yang artinya, karena pola, berarti bisa dihafal.
Misal, dalam pernyataan perulangan. Perulangan selalu tentang melakukan hal berkali-kali sampai ke kondisi ketika perulangan itu harus dihentikan (at least di bahasa pemrograman yang turing complete – waktunya bercerita tentang finite-state machine?). Untuk melakukan perulangan, misal dengan kata (kunci) for
, kalimat tersebut adalah seperti ini di JavaScript:
Yang mana akan terus menampilkan Dosa anda adalah: <jumlah dosa>
sampai jumlah dosa tersebut bernilai tidak lebih besar atau sama dengan 10
.
Biar lebih menarik, gue akan menggunakan contoh lain yakni di Ruby. Kode di Ruby yang serupa dengan kode diatas kurang lebih seperti ini:
2 kode diatas melakukan hal yang sama dan tata bahasa yang sama, namun memiliki sintaks yang berbeda.
Sintaks sederhananya adalah tentang “aturan struktur bahasa”, yang bila mengambil contoh diatas: Di JavaScript, ketika membuat perulangan menggunakan for
yang jenisnya jarak suatu angka, kita harus secara eksplisit membuat nilai “pembanding” menjadi seperti “yang dibandingkan” yang mana bila dari contoh diatas adalah dengan menambah 1 angka setiap pengulangan dan sedangkan di Ruby kita bisa menggunakan ..
(ekspresi rentang) untuk menandakan sebuah jarak angka, namun proses pemenuhan perbandingan tersebut dilakukan secara implisit.
Bagaimana bila kita menggunakan kata kunci ..
di JavaScript? Tentu tidak bisa, karena tidak sesuai aturan yang ada di JavaScript.
Dan kita harus menghafal “pola-pola” yang ada terkait aturan perstrukturan bahasa ini sehingga kita tidak menulis for dosa in range(10):
di Ruby sebagai contoh.
Section titled Standard%20LibraryStandard Library
Dan ini bagian yang paling terakhir, sejujurnya.
Kebiasaan buruk gue adalah menyederhanakan sesuatu (my ex will agree) dan bila berbicara untuk konteks bahasa pemrograman, pada dasarnya bahasa pemrograman hanyalah tentang:
- Tatabahasa
- Tipe data
- Alur kontrol
- Penangan kesalahan
- Perulangan
- Iterasi
- Ekspresi
- Operator
Dibeberapa bahasa pemrograman lain seperti C++, Rust, OCaml, dll mungkin memiliki ekstensi tambahan seperti metaprogramming, macro, generic, dsb namun itu hanyalah ekstensi dan kita tetap bisa membuat program tanpa menggunakan ekstensi tersebut.
Nah, satu bagian – yang sedikit menjadi – pembeda dalam setiap bahasa pemrograman adalah Standard Library, dan kita harus menaruh perhatian lebih terhadap ini.
Misal, untuk membuka sebuah berkas yang berada di disk di Ruby kita menggunakan File.open
sedangkan di Python menggunakan open
dan di JavaScript (Node.js) menggunakan fs.readFileSync
.
Bagaimana untuk membaca semua environment variables yang terdefinisi host? Bagaimana cara mengetahui jumlah core CPU yang ada di host? Bagaimana cara mendapatkan alamat memori dari variable X?
Pertanyaan-pertanyaan diatas mungkin bisa dijawab dengan cara RTFM yang biasanya berada di bagian API atau juga bisa didapat dari hasil mesin pencarian jika yang sedang buru-buru.
Intinya, kita harus mengetahui (dan menghafal) method mana yang harus dipilih untuk melakukan pekerjaan yang kita inginkan (apa yang harus gue pakai antara strcopy
, strlcpy
atau strncopy
untuk menyalin string di C++?) yang sudah disediakan oleh bahasa pemrograman yang kita gunakan.
Section titled PenutupPenutup
That’s it, folks!
Sejujurnya ketika gue pindah ke bahasa pemrograman lain, yang gue perhatikan hanya 5 hal diatas. Karena, sekali lagi (mohon dimaafkan kebiasaan buruk gue) bahasa pemrograman hanyalah tentang:
- Tatabahasa
- Tipe data
- Alur kontrol
- Penangan kesalahan
- Perulangan
- Iterasi
- Ekspresi
- Operator
Dan gue rasa, 8 poin diatas adalah “bare minimum” dalam menulis sebuah instruksi menggunakan sebuah bahasa pemrograman.
Selebihnya, gue rasa kita akan lebih banyak berurusan dengan pola.
Pola menulis kode yang rapih, pola menulis program yang aman, pola mengatur kode yang mudah dipelihara, pola membuat program yang mengonsumsi sedikit memori, dsb.
Selain berurusan dengan pola, juga akan banyak berurusan dengan target platform dan jenis program itu sendiri. Membuat aplikasi web? Good luck mempelajari dari cara peramban bekerja sampai ke HTTP, TLS, DNS, dsb.
Membuat game? Good luck mempelajari GPU, shader, dsb.
Membuat basis data? Good luck mempelajari RAM, parser, dsb.
Sebagai penutup, gue tidak menganggap diri gue seorang generalis yang meskipun secara harfiah harusnya itu tidak benar. Jika ada komunitas “pencinta bahasa pemrograman X” dan “pembenci bahasa pemrograman X” gue yakin gue bergabung di 2 komunitas tersebut untuk menentang & membenarkan apa yang mereka cintai dan benci hahaha.
Disini gue tidak menyinggung tentang “mengapa mempelajari bahasa pemrograman X dan bukan Y ataupun Z” karena itu beda topik. Dan juga, somehow menjadi generalis terkesan kurang baik karena mengetahui banyak dari sedikit hal lebih baik daripada mengetahui sedikit dari banyak hal.
Namun yang jadi pembelaan gue adalah: menjadi spesialis tidak selalu tentang menjadi ahli dalam menggunakan sebuah alat, melainkan menjadi ahli dalam membuat apa yang ingin dibuat juga termasuk dalam hitungan.
Mungkin spesialis JavaScript dapat membuat aplikasi web terbaik yang dibuat menggunakan JavaScript, namun seorang spesialis pembuat web yang yakin bahwa aplikasi web tidak hanya tentang JavaScript juga harusnya bisa termasuk dalam hitungan.
Gue percaya setiap bahasa pemrograman memiliki fitur unik & andalannya masing-masing, namun pada akhirnya, semuanya akan bergantung pada compiler ataupun interpreter, IYKWIM.
Anyway, just pick the right tool for the job.
Dan yang paling penting, menulis program seharusnya menjadi aktivitas yang menyenangkan dan bukan memusingkan apalagi membuat stress.
So, choose your best ;) money will follow.