Tags

, ,

By Bryan Purwa Hartono, Cloud Computing for Business Student. 

“Software engineer yang hebat harus mengerti hardware komputer.” Apa gak salah?. Kenapa demikian?. Bukankah Software engineer pekerjaannya adalah untuk menciptakan software baik program aplikasi atau operating system? Lantas mengapa perlu tahu tentang seluk beluknya hardware yang dipergunakan ?.

Bukankah menjadi software engineer yang penting memiliki kemampuan algorithm(strategi) dan data structure(penataan tata letak data) saja ?”.  Apakah itu yang anda pikirkan ketika membaca statement pada judul diatas ?. Jika ya, maka anda sama dengan saya ketika pertama kali mendengar hal tersebut.

Kita tentu tahu bahwa software dan hardware merupakan perangkat yang berbeda pada sebuah komputer. Jika pekerjaannya berbeda, mengapa seorang software engineer seolah bertanggung jawab untuk mengerti pekerjaan hardware engineer?. Untuk mengerti algorithm dan data structure saja sudah bikin ketar-ketir apalagi masih harus mengerti tentang hardware (Computer Architecture and Organization) yang tidak kalah ribetnya. Namun mari kita pelajari bersama mengenai hal ini.

Coba bayangkan pada sebuah turnamen balap mobil.  Apakah yang menentukan siapa yang akan keluar sebagai juara ?.  Tentunya kwalitas mobil yang dipergunakan memegang peranan penting, pemahaman akan medan jalanan yang harus dilalui, dan begitu juga dengan si pengemudi.  Tetapi pernakah anda menyadari bahwa kemenangan itu terutama ditentukan oleh bagaimana si pengemudi mengendalikan mobilnya atau dengan kata lain teknik mengemudi yang dipergunakan oleh si pengemudi tersebut. Tidak heran bukan kalau anda pernah mendengar pepatah bahwa “Pengemudi yang handal sangat mengenal mobil yang dikendarainya dengan baik” ?.

Jadi berbicara mengenai turnamen balap mobil tidak akan terlepas dari empat komponen utama yaitu mobil, medan balap, teknik mengemudi, dan si pengemudi.  Analoginya ke software engineering adalah mobil sebagai hardware, medan sebagai problem yang dipecahkan, teknik mengemudi sebagai software yang dibuat, dan pengemudi sebagai si pembuat software atau software engineer.  Jadi sebagaimana seorang pembalap harus mengenal mobinya(mesin) juga untuk bisa menerapkan teknik mengemudi yang terbaik begitu juga dengan seorang software engineer yang harus mengenal hardware yang dipergunakannya atau lebih tepatnya adalah target hardwarenya yaitu hardware yang nantinya akan dipergunakan untuk menjalankan software yang dibuatnya.  Misalnya hardware sebuah smartphone adalah berbeda dengan sebuah notebook atau laptop biasa.

Kita bisa melihat sebuah pengertian yang sebenarnya sangat sederhana di balik ilustrasi tersebut. Sadar tidak sadar masalah seperti itu merupakan hal yang sering terjadi di dunia IT khususnya di Indonesia. Banyak software engineer yang hanya terpaku dalam mempelajari apa itu algorithm dan data structure saja tetapi tidak merasa perlu untuk memahami hardwarenya.

Mari kita buktikan lebih jauh dengan melihat apa yang terjadi dalam proses pembuatan sebuah software.  Sebenarnya software adalah sekumpulan perintah atau instruksi yang diberikan kepada hardware untuk melakukan sesuatu proses. Software engineer berperan sebagai pemberi perintah, dan hardware adalah si penerima.  Berarti sudah tentu ada komunikasi antara software engineer dan hardware.

Bagaimana mereka berkomunikasi satu sama lain ?.  Setiap komunikasi tidak pernah terlepas dari bahasa, maka itu kita mengenal bahasa pemrograman, yaitu bahasa yang digunakan software engineer untuk memberi perintah kepada hardware seperti bahasa mesin, Assembly, C#, java, BASIC, C, C++, dan lain-lain.

Untuk menuliskan program dengan mempergunakan bahasa mesin yang merupakan bahasa asli si mesin (dalam binary numbers) adalah sangat sulit bagi kebanyakan orang walaupun tentunya akan memberikan hasil yang terbaik.  Oleh karena itu diciptakan sebuah bahasa assembly yang mempergunakan simbol simbol singkat (mnemonics) yang merupakan singkatan dari bahasa inggris yang dikenal manusia misalnya MOV (MOVe), SUB (Subtract), MUL (Multiply), dsb.  Tetapi bahasa assembly ini tidak menutupi kondisi fisik hardware seperti prosesor, dll.  Sebuah software bernama ASSEMBLER diciptakan untuk menerjemahkan program yang dibuat dalam bahasa assembly ke dalam bahasa mesin.

Namun bahasa assemblypun masih menyulitkan banyak software engineer sehingga diciptakan bahasa pemrograman tingkat tinggi (High Level Programming Languages) seperti bahasa C, C#, C++, Java, Visual Basic, dsb yang sudah sangat dekat dengan bahasa yang dikenal oleh manusia misalnya print untuk mencetak message, read untuk membaca file, dsb.  Diciptakanlah sebuah COMPILER yang dipergunakan untuk menerjemahkan program yang dituliskan dalam bahasa tingkat tinggi ke dalam bahasa mesin atau ke dalam bahasa assembly untuk diterjemahkan lagi dengan ASSEMBLER ke dalam bahasa mesin.

Disinilah letak permasalahan yang ada yaitu apakah hasil penerjemahan si COMPILER itu sudah maksimal atau belum.  Dalam kehidupan kita saja bisa dilihat bilamana ada seorang pembicara misalnya dalam bahasa Inggris lalu diminta beberapa orang menterjemahkannya maka sudah bisa dipastikan bahwa terjemahannya akan berbeda beda walaupun “tetap” memiliki arti yang sama.  Ada yang menerjemahkan lebih berbelit tetapi ada yang sangat ringkas dan padat.

Apa artinya disini ?. Software engineer yang biasa saja hanya pasrah terhadap compilernya atau penerjemahnya. Mereka membiarkan compiler untuk mengartikan kepada hardware instruksi yang mereka buat walaupun belum tentu apa yang diterjemahkan 100 persen tepat dan terbaik.  “I am hungry and I want to eat” bisa diterjemahkan ke dalam bahasa Indonesia dengan banyak cara. “Saya lapar dan saya mau makan” atau “Jadi nih ya, saya sekarang mesara lapar, dan saya ingin sekali untuk makan”. Artinya memang sama tetapi terjemahan yang kedua menurut saya terlalu berbelit-belit. Inilah yang terjadi. Banyak software engineer sering kali tidak menghiraukannya karena memiliki pemikiran yang penting tetap berfungsi.

Memang tergantung pada aplikasi software yang dibuat akan menentukan seberapa besar ukuran dan kecepatan yang dibutuhkan atau harus dicapai.  Mungkin dalam kasus aplikasi pada umumnya, hal ini tidak terlalu bermasalah. Namun bagaimana dengan software yang menuntut “real-time” process?  seperti pada pesawat jet tempur autopilot misalnya.

Pesawat jet tempur memiliki system yang real-time yang harus bisa merespond sesuatu dengan tepat waktu dan tepat fungsi. Contohnya adalah bila ada yang menembakan rudal, pesawat itu harus mampu merespond dengan cepat dan tepat dalam mengambil keputusan untuk menghindar atau menembak balik. Jika harus menembak balik, system pada pesawat itu harus tahu kapan timing yang akurat untuk menembaknya, dan menembak pada waktu yang sudah ditentukan. Perbedaan sedetik saja bisa membawa dampak yang berbeda. Menembak sih menembak, tapi kalau jarak rudal dengan pesawat sudah beberapa meter saja apakah tidak terlambat karena terkena ledakannya dalam jarak yang dekat juga sama berbahayanya.  Jadi tepat fungsi saja tidak cukup.

Software engineer yang hebat mampu mengkalkulasikan tiap ketepatan waktu dari setiap instruksi yang dia berikan yaitu jumlah CPU Clock Cycle atau waktu prosesor yang dibutuhkan untuk melaksanakan instruksi tersebut. Mereka tidak pernah membuat program atau software yang asal jalan, namun harus tepat waktu dan tepat fungsi. Bagaimana bisa untuk membuat hal itu menjadi mungkin? Tidak lain, software engineer harus mengerti hardware, atau computer architecture.

Sekalipun seorang software engineer yang hebat masih menggunakan compiler untuk beberapa software yang tidak membutuhkan presisi tinggi namun akan menjadi jauh berbeda bila dia mengerti hardware dan bahasa assembly. Dia tidak akan pasrah dengan hasil kerja compiler. Dia akan kritis dan mengecek ulang apakah compiler menterjemahkan dengan tepat, dan dengan cara yang paling efektif.

Sehingga bila dalam kasus pesawat jet tempur tadi,  software engineer yang hebat bisa mengatasi hal tersebut. Dia tidak pernah kehabisan akal. Bila coding yang terefektif belum bisa tepat waktu, dia akan bermain langsung ke bahasa mesin bila perlu atau mempergunakan compiler untuk menterjemahkan instruksi kedalam bahasa assembly dan meminimalisasikan lagi terjemahan itu sebelum meng-assemble-nya kembali dengan sebuah assembler. Software engineer yang biasa saja tidak bisa melakukannya karna hal ini hanya bisa tercapai bila seorang software engineer mengerti mengenai bahasa mesin bahkan mesin/hardware itu sendiri baru dia bisa melakukan teknik tersebut.

Jadi apakah seorang software engineer yang hebat harus mengerti computer architecture? Saya rasa kita bisa menyetujuinya.