Belajar Rekayasa Perangkat Lunak – Bagian I
Dahulu, ketika
masih sekolah (SD-SMP-SMA), matematika dan fisika adalah pelajaran favorit
saya. Matematika adalah cinta pertama, hingga ia menjadi terlalu abstrak bagi
pikiran saya. Cinta kedua saya adalah fisika. Dalam fisika, matematika
digunakan sebagai alat. Hal yang lebih penting (dan lebih menarik bagi saya)
adalah pemahaman mengenai konsep dan hukum-hukum fisika.
I was pretty good
at those two. Jika saya
telah memahami suatu konsep fisika beserta teknik matematikanya, maka saya siap
mengerjakan soal serumit apapun. Namun, hanya sebatas itulah minat saya
terhadap fisika. Sama seperti matematika, konsep-konsep fisika tingkat lanjut –
seperti teori relativitas dan mekanika kuantum – terlalu abstrak bagi saya.
Mungkin saya bisa mendalami fisika eksperimental, namun saya tidak cakap dalam
pekerjaan laboratorium.
Saya adalah tipe
orang yang sensing, hanya bisa memahami sesuatu yang konkrit, atau
setidaknya bisa dibayangkan dengan analogi hal-hal yang konkrit. Selain itu,
saya hanya tertarik untuk mempelajari sesuatu yang mudah untuk diaplikasikan
dan terlihat jelas manfaatnya di dunia nyata. Hal inilah yang mengantarkan saya
pada cinta saya yang ketiga: ilmu komputer.
Ilmu komputer juga
terdiri dari konsep-konsep abstrak. Sebagian besar konsepnya berasal dari
matematika seperti logika, algoritma, matematika diskrit, metode formal, metode
numerik, dan sebagainya. Ada juga beberapa konsep yang idenya berasal dari
kehidupan nyata seperti struktur data dan pemrograman berorientasi objek. Hal
yang menjadikan ilmu komputer berbeda dengan fisika adalah prakteknya:
pemrograman. Pemrograman dilakukan sebagai implementasi dari solusi terhadap
masalah dalam ilmu komputer. Karena prosesnya hanya dilakukan dengan duduk di
depan layar monitor dan mengetik kode program, tidak seperti eksperimen fisika,
saya cukup cakap dalam hal ini .
Ketika saya kuliah,
pemrograman dipelajari dalam mata kuliah Algoritma dan Pemrograman, Struktur
Data, Basisdata, Pemrograman Berorientasi Objek, dan Konsep Bahasa Pemrograman.
Selain itu, dalam mata kuliah yang lain sering diberikan tugas untuk membuat
program. Namun, saya merasa kurang puas jika hanya membuat program untuk
keperluan kuliah. Seperti yang sudah saya sampaikan sebelumnya, saya ingin
membuat program yang bermanfaat dalam dunia nyata. Oleh karena itu, sembari
kuliah saya juga bekerja sambilan sebagaiprogrammer. Saya sempat
terlibat dalam berbagai proyek rekayasa perangkat lunak, baik dalam proyek yang
saya dapatkan sendiri (dan dikerjakan bersama beberapa orang teman) maupun
proyek di institusi tempat saya bekerja.
Faktanya sungguh
menyedihkan: tidak satu pun perangkat lunak dalam
proyek-proyek tersebut yang benar-benar digunakan oleh
pengguna. Untuk kasus proyek di mana saya hanya sebagai pegawai, proyek
tersebut nampaknya memang hanya untuk menghabiskan anggaran. Memang saya
mendapatkan honor, namun tentu saja kepuasan batin kurang karena perangkat
lunak yang saya buat tidak digunakan.
Ceritanya lain
untuk kasus di mana proyek saya dapatkan sendiri. Dalam proyek tersebut, saya
(dan teman-teman saya yang terlibat) bertanggung jawab secara langsung terhadap
klien. Ada sebuah proyek yang terpaksa dihentikan karena jadwal sudah terlalu
molor dan kami masih belum mampu untuk men-deliverperangkat lunaknya.
Jadi, atas kesepakatan bersama dengan klien maka kami menghentikan proyek
tersebut dan uang muka yang telah diberikan klien kami kembalikan setengahnya.
Berdasarkan
pengalaman dari proyek-proyek tersebut, saya memahami bahwa kemampuan
pemrograman saja tidak cukup untuk membuat suatu perangkat lunak. Hal itu
sebenarnya telah saya ketahui ketika mengikuti mata kuliah Rekayasa Perangkat
Lunak. Pada mata kuliah tersebut diajarkan mengenai berbagai macam proses dan
metodologi dalam rekayasa perangkat lunak. Dalam metodologiwaterfall,
pemrograman hanyalah aktivitas utama dalam fase implementasi. Masih ada fase
lain seperti requirement definition, perancangan (design),
dan pengujian (testing).
Proses rekayasa
perangkat lunak di dunia nyata, khususnya di Indonesia, tidak seindah teori.
Jika saya sudah mendapat materi kuliah Rekayasa Perangkat Lunak, mengapa proyek
yang saya kerjakan bisa gagal? Yah, kalau kata CEO di perusahaan saya sekarang
sih:
Belajar Rekayasa Perangkat Lunak – Bagian II
Pelajaran yang bisa dipetik dari Belajar Rekayasa
Perangkat Lunak – Bagian Iadalah bahwa mahir di bidang pemrograman
bukanlah jaminan bahwa kita akan sukses mengerjakan proyek rekayasa perangkat
lunak (ini keyakinan jahiliyah saya waktu masih mahasiswa, jangan ditiru
yah . Pemrograman hanyalah salah satu
pekerjaan (task) dalam rekayasa perangkat lunak. Setelah mengingat
kembali proyek-proyek yang saya pernah terlibat di dalamnya, saya menyimpulkan
bahwa proyek-proyek tersebut gagal karena kelemahan dalam hal-hal berikut:
1. Manajemen Proyek
Mungkin kesalahan saya dulu adalah tidak
mengambil mata kuliah Manajemen Proyek sehingga proyek-proyek saya jadi gagal
semua . Jadi apa itu manajemen proyek?
Kalau menurut saya, secara singkat manajemen proyek adalah mengenai bagaimana
kita bisa merencanakan dan menjalankan proyek agar hasilnya sesuai dengan
tujuan proyek, tentunya dalam waktu yang sesuai jadwal dan biaya yang sesuai
anggaran.
Teorinya, pertama-tama kita tentukan dulu
tujuan proyek (seperti apa hasil atau produk yang diharapkan dari proyek).
Selanjutnya, kita tentukan pekerjaan-pekerjaan apa saja yang perlu kita lakukan
untuk mencapai tujuan tersebut. Untuk setiap unit pekerjaan, kita perkirakan
berapa lama waktu dan orang yang dibutuhkan untuk menyelesaikan pekerjaan
tersebut. Setiap orang dapat memiliki “tarif” yang berbeda (bisa juga sama, ini
masalah bisnis) per satuan waktu (bisa jam, hari, atau bulan). Dengan
menggunakan informasi waktu yang dibutuhkan dan “tarif” setiap orang yang terlibat
dalam keseluruhan pekerjaan proyek, maka kita dapat menentukan biaya proyek
untuk bagian sumber daya manusia (SDM). Untuk mendapatkan biaya total proyek
kita dapat menambahkan biaya-biaya lain (kalau ada) seperti biaya lisensi
perangkat lunak dan transportasi. Jangan lupa juga menambahkan margin
keuntungan yang ingin kita peroleh .
Setelah semua rencana mengenai tujuan
proyek, unit-unit pekerjaan, jadwal, SDM, dan anggaran kita mulai menjalankan
proyek. Selama proyek berjalan, kita evaluasi secara berkala apakah pelaksanaan
proyek sesuai dengan rencana atau tidak.
Teorinya sih seperti itu . Kenyataan di lapangan seringkali
tidak sesederhana teori yang saya ceritakan. Langkah pertama, menentukan tujuan
proyek, merupakan salah satu faktor utama penyebab kegagalan proyek. Seringkali
tujuan proyek terlalu abstrak atau high-level, atau sering juga
tujuan proyek tersebut berubah-ubah selama proyek berjalan. Penentuan unit
pekerjaan dan perkiraan waktu juga merupakan hal yang sulit dilakukan jika
proyek tersebut merupakan proyek pertama kita dalam suatu domain. Yang saya
maksud domain di sini bisa dari segi bisnis maupun teknologi. Dari segi bisnis
misalnya: biasanya kita membangun perangkat lunak untuk industri retail, namun
dalam proyek saat ini klien kita adalah rumah sakit. Demikian juga jika kita
sebelumnya biasa menggunakan platform Java dan untuk proyek saat ini kita harus
menggunakan platform .NET.
Sebenarnya, manajemen proyek tidak hanya
membahas mengenai masalah tujuan proyek, membagi unit pekerjaan, memperkirakan
jadwal, menentukan SDM yang diperlukan, dan menghitung anggaran. Rujukan
otoritatif mengenai manajemen proyek dapat Anda baca di A Guide to the
Project Management Body of Knowledge (PMBOK). Ada 9 knowledge
area dari PMBOK, yaitu: integrasi, scope, waktu, biaya,
kualitas, SDM, komunikasi, resiko, dan procurement. Mungkin saya
akan membahas PMBOK pada tulisan yang terpisah karena akan terlalu panjang jika
disampaikan di sini.
Jika pembaca ingin mempelajari manajemen
proyek lebih lanjut, saya juga merekomendasikan buku The Mythical
Man-Month. Frederick P. Brooks, Jr. menulis buku ini dengan gaya
bercerita sehingga enak untuk dibaca, tidak seperti buku teks kuliah. Selain
itu, saya juga sering membaca artikel dari blog Endy Muhardin, pemilik perusahaan pengembang
perangkat lunak Artivisi. Beliau memiliki banyak pengalaman dalam bidang
manajemen proyek rekayasa perangkat lunak dan untungnya, beliau banyak membagi
ilmunya melalui blog .
2. Penerapan Metodologi
Rekayasa Perangkat Lunak yang Benar
Kalau faktor kedua ini saya sudah mengambil
mata kuliahnya . Dari mata kuliah Rekayasa Perangkat
Lunak saya mengetahui mengenai metodologiwaterfall, spiral,
iteratif, prototyping, Rapid Application Development (RAD),
danobject-oriented. Selain semua itu, ada juga suatu kelompok metodologi
yang baru saya ketahui secara otodidak: Agile. Terdapat banyak
metodologi yang termasuk dalam kelompok Agile, di antaranya adalah Scrum,
Extreme Programming (XP), Rational Unified Process (RUP), dan Test-Driven
Development (TDD). Metodologi-metodologi dalam kelompok Agile ini lahir sebagai
kritik terhadap metodologi-metodologi sebelumnya yang kebanyakan berbasis waterfall.
Para pencetus Agile secara garis besar menyampaikan kritik mereka dalam Agile Manifesto.
Teori dan metodologi dalam rekayasa
perangkat lunak itu ada banyak sekali. Dan dalam prakteknya metodologi rekayasa
perangkat lunak juga tidak semudah teori karena:
1. Tidak semua ahli sepakat mengenai bagaimana
metodologi rekayasa perangkat lunak yang benar.
2. No Silver Bullet, tidak ada suatu metodologi yang cocok
diterapkan untuk semua kasus rekayasa perangkat lunak.
3. Jadwal, jumlah SDM, dan biaya dari suatu
proyek kadang-kadang berbenturan dengan metodologi yang digunakan. Yang ini
merupakan permasalahan bisnis.
Sebenarnya masih ada lagi 2 hal yang
menjadi penyebab utama kegagalan proyek-proyek saya, yaitu bagaimana
berhubungan dengan klien/pengguna dan pemahaman akan proses bisnis klien. Kedua
hal tersebut memang tidak diajarkan dalam kuliah. Saya akan membahas kedua hal
tersebut dalam tulisan saya selanjutnya (kalau masih semangat nulis .
0 komentar:
Posting Komentar