Tahun lalu saya membaca mengenai skill yang seharusnya dimiliki lulusan SMK. Entah kenapa tulisan ini beredar lagi di timeline saya tahun ini. Ketika saya baca lagi mengenai skill yang diharapkan, kebanyakan skill ini bahkan tidak dimiliki oleh lulusan Sarjana Informatika/Ilmu Komputer/Teknologi Informasi (berikutnya akan saya singkat jadi: lulusan/sarjana IT).
Sudah menjadi fakta bahwa banyak lulusan IT yang tidak bisa memprogram (silakan baca artikel: Why can’t programmers.. program?). Separah ini:
Like me, the author is having trouble with the fact that 199 out of 200 applicants for every programming job can’t write code at all. I repeat: they can’t write any code whatsoever.
Sebelum diskusi masuk ke masalah pekerjaan, kesuksesan, jiwa entrepreneur, dsb saya ingin menekankan dulu: lulusan apapun dengan skill bagaimanapun bisa bekerja di berbagai bidang yang tidak sesuai jurusan yang diambilnya. Tapi jika sebuah negara ingin bisa maju di bidang tertentu, ya tentunya yang diharapkan adalah lulusan dari bidang tersebut memiliki skill yang baik dan berkontribusi di bidangnya.
Contohnya sebagian orang menyatakan: nggak apa-apa nggak bisa mrogram setelah lulus IT, yang penting kemampuan logikanya terpakai nanti ketika jadi manager. Nah terus siapa yang akan memajukan industri IT? Contoh lainnya: jika semua sarjana pertanian beralih profesi ke berbagai bidang lain, bagaimana bisa maju pertanian Indonesia?
Kebanyakan jurusan teknik yang saya tahu minimal lulusannya memiliki dasar teori yang baik mengenai bidang ilmunya, dan memiliki keahlian praktis meskipun sangat minimal. Misalnya target pelajaran Teknik Kimia dan Teknik Fisika adalah untuk industri, dan saya tahu bahwa lulusan Teknik Kimia dan Fisika minimal punya keahlian praktis untuk mengenal dan mengoperasikan berbagai peralatan lab sederhana. Mereka juga memahami berbagai konsep dasar mengenai ilmu Kimia/Fisika.
Beda kasusnya dengan banyak lulusan IT yang saya tahu: banyak yang tidak bisa melakukan hal dasar. Install sistem operasi? tidak bisa, itu kan bisa dilakukan oleh dukungan teknis, Memasang kabel jaringan atau mengkonfigurasi router/firewall? tidak bisa, itu kan bagian jaringan.
Sedihnya lagi, seringkali skill pemakaian software juga rendah. Contoh kecil: Microsoft Word memiliki fitur otomatis untuk membuat daftar isi. Tapi banyak yang tidak tahu fitur ini dan daftar isinya seringkali dibuat secara manual. Memakai spreadsheet juga terbatas pada formula sederhana (tidak sampai LOOKUP atau Pivot). Saya tidak berharap seseorang jadi jago Ms Excel ketika lulus, tapi setidaknya konsep dasarnya tahu dan tidak bingung jika pindah ke OpenOffice atau Google Sheets. Sama seperti lulusan Teknik Fisika tidak akan bingung memakai timbangan, baik itu analog maupun digital.
Memang di jurusan IT ini gampang sekali mencontek: semua praktikum programming bisa mencontek/menyalin dengan mudah dari orang lain (via internet/jaringan lokal/USB disk). Semua tugas dan pekerjaan rumah bisa dicari jawabannya online (atau bisa pesan dari situs freelancer). Jadi kurang ada “paksaan” untuk serius mencoba.
Berbeda dengan lulusan Teknik Kimia yang pasti harus pernah melihat dan bekerja berbagai bahan kimia, hanya sedikit lulusan IT yang pernah bekerja dengan berbagai software praktis. Apakah yang diajarkan ketika kuliah terlalu banyak teori? Bagaimana dengan level skill yang lebih tinggi, misalnya membuat blueprint aplikasi (baik skala kecil ataupun besar) atau merancang database? ini juga biasanya tidak bisa.
Supaya praktikum IT bisa dilakukan dengan cepat, di kebanyakan tempat semua sudah disiapkan di awal. Semua software sudah terinstall dengan versi eksak yang sudah diberikan (kadang versi softwarenya sudah kuno), dan mahasiswa hanya perlu datang, mengetik (atau mencontek/download dari Internet/copy dengan USB Disk) lalu pulang. Keahlian mendebug program biasanya tidak diajarkan. Jika programnya lambat, umumnya tidak paham kenapa terjadi, baik secara teori dari analisis notasi Big-O ataupun secara praktis menggunakan tools profiler.
Kebanyakan mahasiswa yang ketika lulus bisa memprogram secara praktis (misalnya: membuat website, membuat game, membuat aplikasi) biasanya belajar sendiri berbagai keahlian itu. Jadi apakah ini salah kurikulumnya? salah dosennya?
Sebagian mungkin salah dosennya. Seringkali dosen tidak bisa menjelaskan dengan baik suatu topik. Bahkan banyak dosen yang tidak bisa memprogram sedangkan dosen tersebut mengajar pemrograman.
Kalau saya bertemu lulusan Teknik Kimia, saya cukup yakin dia akan bisa menjelaskan secara umum tentang dasar kimia (atau lulusan fisika untuk menjelaskan tentang dasar fisika). Sedangkan kalau saya tanyakan ke lulusan IT, cukup banyak yang tidak tahu menjelaskan dari mulai 0 dan 1, Mesin Turing, sampai bagaimana program bisa berjalan. Padahal dasar ilmu komputer tidak terlalu rumit.
Harapan saya seorang lulusan IT bisa tahu dasar teori dan bisa mempraktikkannya. Hapalan teori untuk dunia IT lebih sedikit dari kebanyakan bidang lain (kebanyakan hal bisa memakai logika saja). Dalam urusan praktis saat ini semua masalah bisa dicari solusinya dengan Google asalkan tahu apa yang perlu dicari. Jadi skill praktis minimal adalah: menginstall sesuatu, menjalankan sesuatu, dan mencari solusi suatu masalah di Google/StackOverflow. Tentunya dasar teori yang baik akan mendukung dalam hal praktis, misalnya jika sudah mengerti konsep OOP dengan baik, berpindah dari Java ke C# bisa dilakukan dengan cepat. Jika sudah mengerti konsep sistem operasi Unix, berpindah dari Linux ke FreeBSD/NetBSD/Solaris bisa dilakukan relatif singkat.
Saya tidak berharap lulusan IT bisa menjadi Superman yang bisa segala macam hal. Tapi yang diharapkan adalah: bisa cepat beradaptasi dengan berbagai hal praktis, dan juga bisa mengimplementasikan berbagai algoritma jika diperlukan. Jika ada suatu algoritma baru yang sangat baik dan ada deskripsi lengkapnya, maka bisa menyatakan: ok akan saya implementasikan dalam Python, dan bukan berkata: belum ada yang membuat versi Python-nya jadi kita tunggu saja sampai suatu saat ada yang mengimplementasikan (kadang kalau beruntung bisa cepat, tapi bisa juga beberapa tahun kemudian baru ada versi Python-nya)
Dasar Komputer itu Mudah
Sebagian masalah dalam dunia IT mungkin karena sekarang ini komputer sudah terlalu abstrak. Hal ini menyebabkan orang sulit memahami hal-hal dasar yang membentuk sebuah sistem komputer. Padahal Kurikulum informatika/ilmu komputer sebenarnya sudah dirancang dengan baik, tapi banyak yang tidak bisa melihat benang merah topik-topik yang diajarkan.
Akibat tidak terlihatnya benang merah ini, orang merasa belajar berbagai topik terpisah yang tidak dipahami konsepnya (misalnya pelajaran otomata, arsitektur komputer) dan juga tidak punya nilai praktis di kehidupan nyata (tetap tidak bisa assembly setelah arsitektur komputer, tidak bisa membuat parser setelah pelajaran otomata).
Di pelajaran matematika SMU (atau bahkan SMP) kita sudah diajari mengenai basis bilangan. Di luar konteks komputer basis bilangan ini biasanya kurang penting tapi karena komputer yang kita temui sehari-hari memakai sistem biner, maka ini penting. Menuliskan nilai biner bisa sangat panjang, jadi kita biasanya juga memakai basis 8 (mengelompokkan 3 bit biner jadi satu digit basis 8) dan basis 16 (mengelompokkan 4 bit biner jadi satu digit basis 16).
Kuliah arsitektur komputer biasanya akan memperkenalkan gate dasar, seperti AND, OR, NOT, dsb. Gate-gate ini kemudian disusun untuk membuat sebuah binary adder (penjumlah 1 bit dengan 1 bit). Sepertinya ini tidak penting, tapi ingat waktu kita masih SD, kita diajari untuk menghapal penjumlahan satu digit (seperti 9 + 7), supaya berikutnya kita bisa menjumlahkan angka yang lebih besar (misalnya 19+27) dengan menjumlahkan dulu digit paling kanan (9+7 = 16), lalu jika ada lebihnya (carry, dalam kasus ini ada carry 1) ditambahkan ke penjumlahan berikutnya (1 + 2 + carry).
Sama seperti ilmu penjumlahan satu digit desimal bisa dipakai untuk n-digit. Sirkuit adder ini bisa disusun dengan adder yang lain agar bisa menjumlahkan bukan cuma 1 digit biner tapi n digit biner. Sekarang kita bisa menjumlahkan bilangan sebesar apapun. Karena bisa menjumlahkan, kita juga bisa mengalikan, perkalian hanyalah penjumlahan yang diulang.
Bagaimana dengan pengurangan? kita bisa merepresentasikan bilangan negatif dengan menggunakan two’s complement. Sekarang jika kita punya angka 2, angka -1 dan sirkuit adder, kita bisa menjumlahkan 2 dan -1 dan hasilnya adalah 1. Jadi dengan memahami representasi tersebut, kita bisa mengurangi, dan jika kita bisa mengurangi, maka kita bisa membagi.
Bisa mengurangi juga berarti bisa membandingkan. Sebuah bilangan a sama dengan b jika a dikurangi b nilainya nol. Sebuah bilangan a lebih dari b jika a dikurangi b nilainya positif, dan sebaliknya a kurang dari b jika a dikurangi b nilainya negatif.
Topik lain yang akan diajarkan adalah flip-flop atau latch. Intinya adalah sirkuit ini bisa “mengingat” atau menyimpan satu bit. Jika kita bisa menyimpan satu bit, maka dengan banyak flip-flop kita bisa menyimpan banyak bit. Ini adalah topik dasar memori. Topik clock juga biasanya akan dijelaskan untuk memahami urutan operasi.
Dalam sebuah sirkuit digital, kita bisa memilih (dengan multiplexer dan demultiplexer) sirkuit mana yang aktif. Jadi kita bisa memasukkan dua bilangan biner, dan memilih apakah ingin membagi atau menjumlah, atau melakukan operasi lain.
Sebagai manusia kita bisa memasukkan sekuens biner ini (yang merupakan “instruksi”)secara manual satu persatu: tekan ini untuk menjumlah, lalu tekan ini untuk mengurangi, dst seperti memakai kalkulator. Tapi karena kita sudah mengenal memori (dari topik flip-flop), maka bilangan dan urutan instruksi tersebut bisa dimasukkan ke dalam memori, dan kemudian dieksekusi.
Setelah itu topik akan berlanjut ke berbagai detail bagaimana membuat instruksi yang lebih kompleks yang tidak hanya menjalankan instruksi secara linear dari pertama sampai terakhir tapi bisa juga lompat instruksi tertentu (jump) jika kondisi terpenuhi (biasanya kondisi ini dari hasil komparasi, yang pada dasarnya adalah pengurangan). Inilah dasar sebuah komputer.
Tanpa sebuah “bahasa pemrograman” dan bahkan tanpa sebuah “assembler”, dasar teori tadi sudah cukup untuk menjelaskan komputer sangat sederhana, dan bahkan komputer paling awal dulu ya seperti ini: input output biner, tanpa assembler/shell/editor/user interface.
Gambar berikut ini adalah PDP-8, komputer pertama yang sukses di pasaran. Komputer ini mulai dipasarkan tahun 1965 dan terjual 50 ribu buah komputer. Dulu harganya 18500 USD, dengan menghitung inflasi kira-kira saat ini setara sekitar 2 milyar rupiah.
Jadi kita mengisi memori (baik instruksi maupun data) langsung dengan mengeset bit 0 dan 1 menggunakan saklar, lalu menekan tombol untuk mengirimkan bahwa kita sudah selesai mengisi. Ada tombol juga untuk pergi ke memori berikutnya. Outputnya pun berupa biner dalam bentuk lampu yang menyala. Hanya ada 8 instruksi di komputer ini.
Komputer populer berikutnya di tahun 1976 adalah KIM-1. Komputer ini tidak sesulit PDP-8, input dalam bahasa mesin menggunakan keypad heksadesimal, dan output dalam bentuk angka 6 digit. Komputernya memang seperti di bawah ini, tidak ada case-nya (245 USD pada tahun 1976, setara dengan 15 juta rupiah nilai saat ini). Prinsip kerjanya masih sama dengan komputer sebelumnya: input disederhanakan dengan keypad dan output dengan bilangan heksadesimal 6 digit. Semua harus diprogram dalam bahasa mesin.
KIM-1
Apakah kita masih bisa bereksperimen dengan benda low level seperti ini? Sangat bisa. Kita bisa membeli transistor sendiri dan menyusun komputer sendiri (harganya sangat murah). Adakah orang yang “gila” untuk melakukan hal ini? Jawabnya: ada, contohnya proyek monster6502
Menyusun transistor memang terlalu hardcore (satu gerbang logika butuh beberapa transistor), alternatif lain adalah membeli chip yang mengimplementasikan gate tertentu (NAND, OR, NOT, dsb). Kemudian kita bisa menyusun sendiri chip-chip ini untuk membentuk komputer. Ada banyak orang yang iseng melakukan hal ini. Ekseperimen semacam ini sekarang tidak penting, tapi masih berguna bagi orang yang cara belajarnya bisa paham melalui praktik. Intinya saya ingin menyatakan bahwa eksperimen low level seperti ini masih bisa dilakukan.
Jika kita hanya ingin bekerja secara konseptual tanpa praktik langsung, ada banyak emulator yang bisa kita pakai, termasuk juga emulator untuk berbagai komputer awal. Sebagai catatan, dulu di masa awal komputer, bahkan ada buku belajar bahasa mesin untuk anak-anak (klik pada gambar untuk link ke PDF-nya, sudah digratiskan oleh penerbitnya).
Buku lama ini saat ini juga tidak terlalu berguna, kecuali Anda penyuka sistem klasik, tapi ilmunya masih bisa dipakai untuk membuat emulator. Berbagai dasar low level ini juga diperlukan jika kita ingin membuat compiler atau interpreter yang memakai JIT (Just In Time compilation).
Berbagai mata kuliah lain saling melengkapi. Mata kuliah Teori bahasa dan Otomata akan memberikan dasar penting: bahwa komputer yang sudah dijelaskan di arsitektur komputer ini bisa dipakai untuk menghitung/menjalankan algoritma semua fungsi yang computable. Selain itu ada teori bagaimana sebuah bahasa bisa di-parse, di sini akan jelas kenapa bahasa pemrograman tidak seperti bahasa manusia.
Setelah memahami bagian dasar ini, topik pemrograman akan terasa lebih sederhana. Semua yang diproses komputer hanyalah bilangan. Sebuah teks hanyalah pemetaan dari bilangan ke sebuah karakter (misalnya bilangan 65 berarti karakter A di tabel ASCII). Sebuah foto di layar hanyalah titik-titik dengan nilai warna tertentu (nilai warna ini juga hanya bilangan) dan video hanyalah gambar yang berganti dengan cepat seolah bergerak. Signal suara yang mentah di komputer hanyalah nilai sampling amplitudo setiap interval waktu tertentu.
Jika sudah memahami layout memori, kebanyakan algoritma dan struktur data dasar bisa dipahami dengan logika saja dan terasa sangat wajar, tidak perlu menghapal. Contoh struktur data yang mudah adalah: linked list, tree, hash table. Contoh algoritma sederhana: berbagai sorting dasar.
Beberapa struktur data dan algoritma memang rumit, tapi biasanya kita tidak perlu mengimplementasikan berbagai algoritma ini dalam pemrograman sehari-hari. Hal yang penting adalah: kita paham algoritma tersebut ada dan bisa dipakai di kasus seperti apa, dan ketika membaca deskripsi detail algoritmanya (misalnya dari buku atau website) kita bisa mengimplementasikan algoritma itu di bahasa tertentu yang mungkin baru kita kenal.
Berbagai pelajaran lainnya sebenarnya hanyalah penerapan dari dasar yang sudah dipelajari. Misalnya: sistem operasi memberikan abstraksi supaya kita tidak mengakses hardware secara low level, dan bagaimana mengatur sumberdaya sistem supaya bisa dipakai oleh banyak program/user. Pemrograman grafis adalah penerapan dari berbagai algoritma dasar, algoritma yang berhubungan dengan matriks, dan algoritma spesifik untuk grafik.
Berbagai hal praktis bisa dijelaskan ketika praktikum. Dan untuk mendalami suatu topik tertentu sebaiknya dilakukan sendiri di luar kelas. Contoh: jika ingin menjadi network engineer untuk merk/brand tertentu (CISCO, JUNIPER, dsb) ya pelajari materi dari vendor tersebut.
Mungkin ada juga yang berpikir: ah nggak perlu tahu sampai sedetail itu cukup kok buat cari kerja. Sekali lagi saya tekankan: kalau sekedar supaya bisa memprogram sederhana, lulusan SMK juga bisa diarahkan. Kalau ingin Indonesia punya tenaga ahli yang bisa memajukan dunia IT, ya pengetahuan sangat low level dibutuhkan.
Ingin jadi ahli security yang baik, yang bisa menemukan bug sejenis Spectre? perlu tahu sampai level hardware. Jika ingin mendapatkan overview yang cukup baik bisa membaca buku yang membahas sampai level ini Silence On the Wire oleh Michal Zalewski, pada tiap bab diberikan pengenalan berbagai topik informatika dasar untuk bisa menjelaskan bug security. Deskripsi buku ini cukup akurat:
In Silence on the Wire: A Field Guide to Passive Reconnaissance and Indirect Attacks, Zalewski shares his expertise and experience to explain how computers and networks work, how information is processed and delivered, and what security threats lurk in the shadows.
Memang saat ini sudah banyak sekali berbagai produk open source untuk membuat apapun, tapi untuk menjadi terdepan tetap dibutuhkan berbagai komponen khusus buatan sendiri. Contohnya: untuk membuat sistem chat dengan skala WhatsApp atau Telegram tetap dibutuhkan sistem custom . Telegram hanya membuka source code aplikasi client untuk Desktop/Web/Mobile, tapi komponen server tetap milik mereka dan tetap tertutup.
Berbagai perusahaan besar bisa menjadi terdepan karena mereka menciptakan sendiri teknologi yang saat itu belum ada. Misalnya Google bisa maju karena algoritma PageRank dan juga memiliki BigTagble untuk implementasinya.
Penutup
Semua di atas hanyalah gabungan dari berbagai fakta dicampur dengan opini saya. Jika tujuannya memang hanya mencari kerja, ya silakan saja belajar berbagai hal yang praktis. Tapi saya berharap lulusan jurusan IT levelnya lebih dari sekedar praktis (apalagi sekedar bisa memakai produk buatan orang lain), tapi bisa tahu berbagai konsep dasar dan mengaplikasikannya.
Sebagai tambahan untuk yang masih kuliah dan merasa blank saya sarankan untuk mulai mengubah cara belajar dan mencari suplemen materi lain, misalnya dari Coursera atau YouTube.
Dua buku saya sarankan: Code: The Hidden Language of Computer Hardware and Software, buku ini ringan dengan banyak penjelasan sederhana. Buku lainnya adalah The Elements of computing systems. Buku ini sangat praktis dan mencakup topik dasar sampai lanjut.
Kemungkinan akan ada banyak yang kurang setuju dengan tulisan ini. Buat yang kurang setuju dengan isi tulisan ini, mungkin bisa menjawab dua pertanyaan saya:
- Jika bukan lulusan jurusan IT, jadi lulusan mana yang seharusnya bisa memajukan dunia IT Indonesia? (Apakah harus mengimpor programmer dari India?)
- Menurut Anda lulusan jurusan IT itu minimal harus bisa apa? Di mana keseimbangan sangat praktis (seperti diajarkan di SMK) atau sangat teoretis (level S2/S3)?
Saya sering juga terima anak PKL, tingkat SMK dan S1, dengan maksud ingin berbagi juga. Kalo tingkat SMK nyerah deh, kalo musti ngajarin banyak, saya gak telaten, hehe. Jadi jangan salahkan guru atau sekolahnya, lihat juga kualitas siswa2nya seperti apa. Pernah ada anak yg ok, tidak perlu diajari sudah bisa jalan sendiri, ternyata resepnya dia banyak gabung dengan komunitas2 terkait.
Nah, sayangnya yg tingkat S1 juga masih belepotan di programming, padahal cuma bikin web pake PHP. Dengan alasan mereka sibuk dst, akhirnya gagal maning gagal maning. Saya agak dilematis untuk menekan mereka, wewenang saya sebatas PKL bukan dosen, jadi biasanya diselesaikan secara adat.
Namun kurang fair kalo di tulisan membandingkan IT dengan kimia, lha IT selain berkembang cepat juga lebar sekali cakupannya, supporting banyak bidang, tidak jelas titik tumpunya di mana. Belajar dasar2 yg jadoel di atas rasa2nya bagus untuk nostalgia, tapi menghambat orang berpikir maju, di era Revolusi Industri 4.0. Saya lebih sepakat apa kata Rhenald Khasali, yg dibutuhkan generasi sekarang adalah gairah dan kemampuan untuk (cepat) belajar dan (mau) berubah.
menurut saya kenapa bisa begini pertama mungkin kurangnya membaca dari para mahasiswa TI, yang menyebabkan kurangnya juga pengetahuan mereka, terlebih buku buku yang bagus buat programming itu kebanyakan bahasa inggris juga, jadi bahasa juga biasanya jadi kendala
kedua dosen juga kadang mengarahkan lebih ke arah bisa programming, jadi bahasan tentang low level hardware tidak terlalu ditekankan, karena goal lulusa TI itu kalo di kampus saya cuma implementasi algoritma A untuk permasalahan A
ketiga buat bisa jadi profesional itu gak bisa langsung instant apalagi fresh graduate, pasti ada namanya tahapan kaya biginner, amateur, dll, kalo lulusan TI fresh graduate bisa tau semua kaya yang dijelaskan diatas gitu saya rasa 95% gamungkin, kecuali dia memang jenius,