Ariandy Wiki

1 Tentang Pemrograman

TL;DR, ada banyak bagian dari yang ditulis disini yang tidak lain dan tidak bukan adalah tentang melawan status quo di dunia pemrograman.

1.1 <2018-07-03 Tue> Alasan mengapa Haskell sulit dipahami untuk beberapa orang.

  • Pengguna bahasa dengan paradigma prosedural biasanya sewaktu ingin mempelajari Haskell, inginnya langsung mempelajari Monad tanpa mempelajari terlebih dahulu tentang apa itu Functor1.

1.2 <2019-10-11 Fri> Official Formatter dan isu psikologis dalam pemrograman.

Adalah hal yang wajib untuk suatu bahasa untuk memiliki official formatter. Contohnya, Go yang memiliki gofmt. Jika suatu bahasa tidak memiliki official formatter, akan ada banyak waktu yang terbuang hanya karena bertengkar meributkan soal bagaimana seharusnya style dari kode dalam bahasa tersebut ditulis. Dengan adanya official formatter perdebatan mengenai hal tersebut tidak perlu ada sedari awal.

1.3 <2020-05-02 Sat> Apakah Reinventing the Wheel salah?

TL;DR Bagi saya Reinventing the Wheel2 bukanlah suatu kesalahan.

Saya sering mendengar dan membaca tulisan-tulisan dari web-dev (umumnya pengguna JS) bahwa Reinventing the Wheel itu adalah hal yang percuma. Permasalahannya adalah mereka menyebut hal tersebut tanpa memberikan konteks Reinventing the Wheel seperti apa yang sebenarnya dianggap percuma tersebut. Reinventing the Wheel, sebenarnya dilakukan karena 2 hal:

  • Untuk mempelajari cara kerja suatu hardware / software
  • Untuk melakukan improvement pada hardware / software

Saya kurang mengerti di saat ada banyak orang menyuarakan bahwa Reinventing the Wheel itu hal yang percuma. Jika kita lebih lanjut melihat ke level hardware, kita merasakan komputer yang sekarang lebih cepat dari generasi sebelumnya dikarenakan adanya pendulum yang bergerak ke arah RISC. Kalau kita menggunakan kerangka berpikir "/Reinventing the Wheel itu percuma", untuk apa membuat RISC? Bukankah sudah ada CISC? Mirisnya, secara parsial, orang yang sering menyuarakan sikap anti terhadap Reinventing the Wheel ini adalah web-dev yang mengguanakan Node.js. Sekali lagi, kalau kita harus berpikir seperti itu, untuk apa pakai Node.js; bukankah sudah ada PHP? atau, Untuk apa Ryan Dahl membuat Deno, kalau sudah ada Node.js?

Update: <2023-07-25 Tue> Masih dengan kerangkan pikir serupa yang sering mereka gunakan, "Untuk apa ada Bun, kalau sudah ada Node.js dan Deno?" :D

1.4 <2018-12-20 Thu> Apakah bahasa awal dalam bahasa pemrograman sangat penting?

Bahasa awal terkadang akan menentukan seberapa familiar kita dengan bahasa yang selanjutnya akan kita pelajari. Sebagai analogi,

  • Jika Anda adalah seseorang yang berbahasa Indonesia, akan besar kemungkinannya untuk lebih mudah mempelajari bahasa lain dari rumpun Melayu.
  • Jika Anda mampu berbahasa Hakka, akan lebih besar kemungkinannya untuk mudah mempelajari dialek lain dari rumpun Mandarin.
  • Jika Anda adalah penutur bahasa Russia, akan lebih besar kemungkinannya untuk mudah mempelajari bahasa lain dari rumpun bahasa Slavia.

Hal ini juga berlaku di bahasa pemrograman. Orang yang sedari awal terbiasa berfikir dengan bahasa fungsional, mungkin saja akan kesulitan saat menggunakan bahasa dengan paradigma prosedural atau OOP. Sebagaimana bahasa lisan, hipotesa Sapir-Whorf3 itu juga berlaku di bahasa pemrograman. Itulah sebabnya, Almarhum Dijkstra dalam tulisannya yang berjudul To the members of the Budget Council, Dijkstra menuliskan,

It is not only the violin that shapes the violinist, we are all shaped by the tools we train ourselves to use, and in this respect programming languages have a devious influence: they shape our thinking habits. This circumstance makes the choice of first programming language so important. —Edsgar W.Dijkstra

1.5 Mengapa typed language agak susah diterima pada saat ini?

  • Banyak compiler terdahulu yang tidak memberikan reward yang sepadan saat programmer menuliskan type.

1.6 Apakah mempelajari pemrograman memerlukan matematika? / Apakah untuk menjadi Programmer perlu untuk memahami beberapa topik matematika?

Ada kalanya, saya tidak terlalu suka dengan istilah Programmer atau Programming di saat kata tersebut digunakan hanya untuk mewakili segelintir sub-disiplin dari pemrograman. Akan saya jelaskan alasannya.

Pertama-tama, Programming itu sendiri adalah umbrella term dari "proses atau aktivitas menulis program komputer". Sedangkan program komputer itu sendiri ada banyak macamnya.

  • OS yang kita gunakan, adalah program komputer.
  • Compiler dan Interpreter yang kita gunakan pun adalah program komputer.
  • Game yang kita mainkan di komputer, adalah program komputer.
  • Machine-learning ataupun AI yang populer hari ini juga adalah program komputer.
  • Cryptocurrency pun adalah program komputer.

Dan semua sub-disiplin yang saya tuliskan di atas tersebut semuanya memerlukan pengetahuan spesifik dari beberapa topik di matematika, mulai dari matematika yang sifatnya kontinu (seperti kalkulus) sampai dengan matematika diskrit. Mulai dari matematika terapan, sampai dengan matematika teoritis.

Tiba-tiba, startup menjadi trend. Setiap startup tersebut memerlukan SDM yang bisa siap pakai dalam waktu cepat. Jadilah bahasa seperti JS dipilih karena itu adalah bahasa yang diyakini mudah untuk mendapatkan SDM tersebut dengan cepat. Bootcamp web-dev pun menjamur. Buruknya adalah, ada beberapa bootcamp web-dev tidak bertanggung jawab yang menyebarkan misleading bahwa "Belajar pemrograman itu tidak memerlukan matematika". Ya, Saya tahu. Kalimat tersebut dilontarkan atas nama kebaikan, agar banyak orang yang bisa memberanikan dirinya mempelajari web tanpa ditakuti oleh momok yang bernama matematika. Hanya saja, tidak sekali dua kali bahwa adagium "The road to hell is paved with good intentions" adalah benar adanya. Output dari misleading tersebut mencetak web developer yang menganggap seakan-akan kegiatan programming itu hanya aktivitas membuat web saja. Mari perhatikan, dari semua sub-disiplin yang saya sebutkan sebelumnya, semuanya memerlukan matematika, hanya web-developing saja yang tidak memerlukan matematika terlalu dalam.

Akan lebih baik apabila bootcamp web-dev (dan pihak lainnya) yang menyebarkan misleading ini mulai jujur dan memperbaiki pernyataannya bahwa, "Programming itu memerlukan matematika". Atau, mungkin bisa dimulai dengan mengubah kalimat yang semula "Programming tidak memerlukan matematika" menjadi "Web Developing tidak memerlukan matematika".

1.7 Kritik kurikulum Computer Science.

Mungkin dari semua opini saya mengenai pemrograman, opini yang kali inilah yang paling tidak populer. Bagi saya pribadi, seharusnya kampus dengan jurusan Computer Science disamakan saja seperti kuliah yang berhubungan dengan musik, yang mana, setiap dari calon mahasiswanya diharuskan sudah bisa menggunakan setidaknya satu atau dua alat musik (atau mungkin juga bisa menyanyi dengan benar). Dengan kata lain, setidaknya sewaktu akan masuk ke kampus dengan jurusan Computer Science, calon mahasiswa setidaknya sudah di level intermediate di satu atau dua bahasa pemrograman. Banyak waktu yang terbuang pada semester awal hanya karena mempelajari materi yang semestinya tidak perlu diajarkan lagi di level Perguruan Tinggi.

Saya masih bisa memaklumi apabila di masa lalu banyak kampus yang menempatkan materi dasar di semester awal. Dulu, tidak semua mahasiswa memiliki komputer. Satu-satunya cara mereka belajar hanya melalui lab kampus, yang mana dengan ini konsekuensinya adalah harus ada kelas praktikumnya. Dan adalah hal yang janggal apabila kelas praktikumnya ada, tetapi mata kuliahnya tidak ada. Namun zaman berubah. Memiliki komputer dengan harga murah adalah hal yang memungkinkan pada hari ini. Akses terhadap ilmu pemrograman bisa diakses dengan biaya nyaris gratis. Apakah sudah saatnya materi dasar dihapuskan saja dan penerimaan mahasiswa untuk perkuliahan Computer Science dibuat lebih ketat lagi?

1.8 Orang-orang dengan skill issue yang gemar mendefinisikan ulang sesuatu dengan suka-suka.

Entah mengapa, pada hari ini saya sering menemukan tulisan yang mengemukakan bahwa bahasa C merupakan bahasa low-level. Ini cukup mengganggu dikarenakan definisi dari low-level programming language dari dulu sampai dengan hari ini adalah "bahasa pemrograman yang nyaris tidak memiliki (atau bahkan memang tidak memiliki) abstraksi ke instruction-set", yang mana dengan definisi ini, yang dimaksud adalah assembly language dan machine code.

Hanya karena kita tidak mengerti suatu bahasa pemrograman, tidaklah berhak apabila kita langsung mengatakan bahwa bahwa bahasa tersebut merupakan bahasa low-level. Akan lebih baik apabila kita jujur bahwa bahasa tersebut adalah bahasa tingkat tinggi, dan mengakui bahwa Anda memiliki skill issue pada bahasa tersebut.

Namun, saya memiliki jalan tengah dari hal ini. Agar menghindari redefinisi dari orang-orang seperti mereka, saya akan mencoba menawarkan hal baru.

  • Di masa lalu, low-level programming language diterjemahkan sebagai "Bahasa pemrograman beraras rendah" di bahasa Indonesia. Sedangkan high-level programming language diterjemahkan sebagai "Bahasa pemrograman beraras tinggi" dalam bahasa Indonesia.
  • Bahasa pemrograman pada umumnya terdevelop secara gradual melalui dua jalur, top-down (ter-influence oleh Kalkulus Lambda) dan bottom-up (ter-influence oleh Mesin Turing).
  • Oleh karenanya, akan lebih baik kalau kita berinisiasi untuk mulai mengganti istilah yang semula adalah "Bahasa pemrograman beraras rendah" dan "Pemrograman beraras tinggi" menjadi "Bahasa pemrograman beraras mesin" dan "Bahasa pemrograman beraras matematis".

Dengan hal ini, setidaknya mereka bisa "dipaksa" untuk jujur mengenai skill issuenya dan tidak sesuka-suka mereka untuk me-redefined sesuatu hanya karena skill issue di sisi mereka

1.9 Yang mana yang lebih dahulu muncul, Matematika atau Komputasi?

1.10 Apakah Data Science sama rigornya dengan Natural Science?

Mari kita runutkan seperti berikut.

  • Semua disiplin yang ada pada Natural Science (entah Fisika, Kimia, Biologi beserta sub-disiplin dari ketiga disiplin tersebut) memiliki framework Science yang sama, yang mana landasannya adalah observasi dan eksperimentasi.
  • Atau bisa dikatakan bahwa Science (in sense of Natural Science) adalah upaya mengorganisir ilmu kedalam bentuk testable explanation.
  • Dengan framework dan pemahaman yang sama tersebut, terlepas dari Anda datang dari background Fisika, Kimia, Biologi, dst, Anda akan menemukan bahwa Evolusi adalah fakta.
  • Permasalahannya adalah: Kenapa pada hari ini sangat banyak orang yang gagal memahami Evolusi sebagai fakta, namun berani menyebut dirinya sebagai Scientist (lebih spesifik lagi, sebagai Data Scientist) ?
  • Dengan begitu, apakah Data Science sama rigornya dengan Natural Science? Ataukah Data Science bukan bagian dari Natural Science? Ataukah kata Science di belakang kata "Data" itu disisipkan agar hanya terdengar fancy saja?

Namun ada juga yang menggolongkan Data Science sebagai Formal Science. Saya setengah setuju mengenai hal ini. Namun ini rebuttal dari setengah ketidaksetujuan saya.

  • Data Science merupakan kegiatan untuk mengekstraksi serta mengekstrapolasi juga menginterpolasi knowledge melalui dataset-dataset.
  • Dataset tersebut merupakan hasil dari observasi.
  • Katakanlah, ada seorang Data Scientist yang tidak memahami bahwa Evolusi adalah fakta saintifik, dan Data Scientist tersebut perlu untuk melakukan pengolahan dataset terkait fossil ataupun genetik.
  • Untuk mengolah data tersebut, diperlukan domain knowledge seperti Genetika, Paleontologi, Bioinformatika dan (lebih general lagi) Biologi.
  • Keempat ilmu tersebut setidaknya memerlukan requirement yang mana Evolusi adalah pilarnya.
  • Dari sini, boleh kita katakan bahwa Data Science merupakan proses matematis (Formal Science) yang digunakan untuk mengolah data observasi dan memerlukan domain knowledge tertentu, yang mana dalam kasus ini adalah Natural Science.
  • Atau singkatnya, Data Science adalah interdisiplin antara Formal Science dan Natural Science.
  • Pertanyaannya:
    • Apakah Data Scientist tersebut akan tetap dianggap sebagai Scientist di saat ada fakta dari disiplin Natural Science lain yang berlawan dengan personal value yang dipercayainya?
    • Apabila Data Science memang se-rigor itu, apakah seharusnya ada filter tertentu agar para "penumpang gelap" ini tidak semudah itu melakukan self proclaim menganggap diri mereka adalah Scientist hanya karena mereka Data Scientist?
    • Apakah istilah Data Science ini ada baiknya diubah saja agar kita tidak perlu menjadi ragu akan rigoritas dari kata "Science" yang ada di "Data Science" ?

Bacaan/Link Terkait:

1.11 Apakah Computer Science sama rigornya dengan Formal Science?

Peter Thiel pernah mengatakan hal berikut:

"A subject is a true science if you don't need to put the word 'science' behind it." —Peter Thiel

Ada bagian dimana saya setuju dengan hal ini. Alasannya adalah:

  • It's Physics. Not Physics Science.
  • It's Chemistry. Not Chemistry Science.
  • It's Biology. Not Biology Science.

Namun ada bagian dimana saya tidak setuju dengan kalimat tersebut. Karena Computer Science itu sendiri secara historis, pada awalnya sangatlah formal.

Sedangkan untuk reasoning dibalik quote tersebut sangatlah masuk akal. Alasannya adalah "Computer Science can vary wildly from school to school". Peter Thiel mengkritik bahwa Computer Science yang ada pada hari ini (atau yang populer pada hari ini) ada pada state yang jauh dari rigoritas.

Untuk membuktikan hal ini, akan saya petakan 1:1 beberapa paradigma pemrograman yang saya ketahui ke mathematical underpinning concept yang melandasi paradigma tersebut.

  • Functional -> Lambda Calculus
  • Logical -> First-order Logic
  • Procedural -> Turing Machine

Namun saat kita menanyakan apa landasan matematika dari OOP, jawabannya sudah pasti tidak ada. Inilah salah satu dari sekian banyak faktor dari awal mula dunia Computer Science tidak lagi rigor.

Agar fair, harus pula saya katakan bahwa upaya untuk memformalkan OOP itu pernah dilakukan (nominally-typed OO4). Silahkan baca "A Theory of Objects"5. Namun Martín Abadi dan Luca Cardelli (penulis dari buku tersebut) mendefinisikan Object sebagai recursive records in a typed lambda calculus, yang mana ini sudah jauh dari pengertian Object yang pada saat ini umum dipahami.

Tidak perlu jauh-jauh ke ke OOP yang formal, OOP yang diperkenalkan oleh Alan Kay dan GoF pun sudah berbeda. OOP yang dipahami hari ini sama sekali tidak sama dengan yang dipahami pada awal mulanya. OOP hanya soal "Menurut si X", "Menurut si Y", "Menurut si Z". OOP hanya dipahamkan seperti sebuah agama yang setiap Nabinya memiliki cult-follower-nya masing-masing tanpa ada mathematical proof dari idea tersebut. Tidak ada definisi rigor tentang pemahaman OOP yang populer pada hari ini. Sama sekali tidak ada formalisme pada OOP yang umum digunakan pada hari ini.

Untuk mengembalikan Computer Science menjadi ilmu yang rigor dan formal, dalam konteks OOP, hanya ada satu jalan keluar. Yaitu, menghapus OOP (yang dipahami hari ini) dari kurikulum Computer Science, lalu me-rebuildnya dari awal lagi, sama seperti paradigma-paradigma yang proven by math.

1.12 DRY Principle vs. Orthogonality, dan problem pendefinisiannya.

  • Kritik terhadap pengusung DRY:
    • Ada beberapa penjelasan dari DRY yang dicabut dari konteksnya.
    • Mengacu dari interview Andy Hunt and Dave Thomas yang dilakukan Bill Venners6, bisa dikatakan bahwa sebenarnya tidak ada programmer yang layak disebut menggunakan DRY Principle apabila kodenya tidak berprinsip one authoritative, unambiguous representation.
    • Tujuan dari DRY adalah kode yang ditulis bersifat one authoritative, unambiguous representation.
    • Code Generator adalah (salah satu?) solusi agar code yang digenerate tadi bersifat one authoritative, unambiguous representation.
    • Programmer yang hari ini "mengaku mengusung" DRY, justru melakukan hal yang sama sekali tidak DRY. Mereka menulis class ataupun function, dan menggunakannya dibanyak tempat tanpa penjaminan bahwa class/function yang mereka tulis itu dijamin one authoritative, unambiguous representation.
    • Masalah muncul ketika ada perubahan pada satu class ataupun function, dan perubahan itu terjadi di banyak tempat yang tidak seharusnya. Kodenya tidak orthogonal. Kadang hal ini disebut sebagai "Too DRY"7.
  • Kritik terhadap Andy Hunt dan Dave Thomas:
    • Kesalahpahaman mengenai DRY dimulai dari nama principle ini sendiri. Alih-alih memberi nama yang terdengar fancy (DRY, Don't Repeat Yourself), mengapa dulu mereka tidak memberi nama yang tidak ambigu saja (misal, OAUR, One Authoritative, Unambiguous Representation)?
    • Penggunaan kata Repeat di Don't Repeat Yourself adalah masalah yang serius. Cara termurah dan termudah untuk membuat kode orthogonal tanpa menggunakan tools yang menjamin kodenya one authoritative, unambiguous representation (atau yang dalam konteks ini adalah Code Generator), adalah dengan cara duplikasi. Dengan begini, sudah pasti bahwa kode yang DRY tidak orthogonal. Dan kode yang orthogonal tidaklah DRY.

1.13 Menulis di CV bahwa dirimu adalah seorang "Problem Solver" terkadang adalah perkara sia-sia.

Akan saya berikan konteks terlebih dahulu terkait hal ini:

  • Eksplanasi yang akan saya tuliskan ini adalah mengenai dunia programming. Saya tidak mengetahui apakah case serupa terjadi di luar dunia programming.
  • Apa yang akan saya tuliskan ini murni observasi dari saya. Dan akan sangat mungkin apabila yang saya tuliskan ini berbeda dari pengalaman orang lain.

Beberapa orang dari latar belakang Computer Science terkadang memiliki keluhan bahwa CV mereka dianggap berlebihan oleh HRD dan orang-orang dari kalangan Software Developer. Hal yang paling menyedihkan, (apabila tidak dianggap berlebihan) CV mereka dianggap 'bodong' saat mereka menuliskan "Problem Solving".

Berdasarkan observasi saya, ada gap mengenai pemahaman yang dimiliki oleh HRD dan Software Developer saat seorang Computer Scientist menulis "Problem Solving" dalam CVnya.

Problem solving yang ada di dunia Computer Science (terutama yang berkutat di ranah teoritis) adalah menyelesaikan mathematical problem dan logical problem. Bisa jadi ada sedikit porsi engineering problem, dan bisa jadi juga tidak ada sama sekali. Dan tidak jarang juga mereka berurusan dengan philosophical problem (filsafat analitik). Dan bahkan, lebih granular daripada itu, problem yang dihadapi Computer Science adalah linguistic problem.

Saya paham benar. Adalah fakta apabila dikatakan apabila problem solving skill atau skill set mereka tidak compatible dengan keinginan industri, hampir tidak ada reward apapun dari skill set tersebut untuk saat ini. Problem solving yang diinginkan oleh banyak perusahaan adalah problem solving yang condong ke engineering problem, managerial problem dan business problem. Namun pertanyaannya adalah, apakah hanya karena problem solving skill yang mereka miliki tidak compatible dengan yang diinginkan oleh dunia industri, lantas problem solving skill yang mereka miliki boleh diinvalidasi oleh segelintir orang-orang yang ada di status quo tersebut?

Inilah sebabnya, bagi saya, menulis di CV bahwa dirimu adalah seorang "Problem Solver" terkadang adalah perkara sia-sia.

1.14 Perbedaan Computer Science dan Software Engineer

TODO : Tuliskan eksplanasi terkait hal ini

  • 8
  • 9
  • On the cruelty of really teaching computing science (EWD 1036)10
  • The end of Computing Science? (EWD 1304)11

Footnotes:

Created: 2023-11-16 Thu 23:26