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.

Introduksi

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 Sunda 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 8 tahun yang lalu dengan mempelajari sumber kode *webshell *(ehm, backdoor) yakni b374k versi 2.3.

Setelah dari PHP, gue pindah ke Ruby yang gue pelajari dari Codecademy. Ruby adalah bahasa pemrograman pertama gue ketika gue bekerja dengan orang luar melalui situs *freelancer marketplace *bernama Upwork (oDesk) dan *project *pertama gue adalah membuat CMS(-ish) yang dibuat diatas Jekyll.

Lalu setelah Ruby gue pindah ke JavaScript, sampai hari ini. Mungkin dari sekitar 2014 ketika 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.

Motivasi

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

It 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.

Paradigm

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.

Vocabulary

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.

Grammar

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:

  1. Adalah
  2. Daun
  3. Hijau
  4. Itu
  5. 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.

At least itu yang dikasih tau sama manajer gue.

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:

for (let dosa = 0; dosa <= 10;) {
  console.log(`Dosa anda adalah: ${dosa}`);
  dosa++
}

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:

for dosa in 0..10
  puts "Dosa anda adalah: #{dosa}"
end

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.

Standard 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.

Penutup

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