Rabu, 06 Juni 2012

Software Modelling untuk Software Engineers


[Tulisan ini dibuat untuk Calon Mahasiswa Informatika, para mahasiswa program studi informatika dan khalayak umum yang ingin mengetahui kompetensi dasar seorang software engineers; untuk tulisan saya sebelumnya yang terkait dengan bagian ini, dapat dilihat disini:
1) Problem Solving untuk Software Engineers disini: http://stanleykarouw.blogspot.com/2012/06/problem-solving-untuk-software.html
2) Matematika Dasar untuk Software Engineers disini: http://stanleykarouw.blogspot.com/2012/06/matematika-dasar-untuk-software.html
3) Dasar Komputasi untuk Software Engineers disini: http://stanleykarouw.blogspot.com/2012/06/dasar-komputasi-untuk-software.html
4) Software Construction untuk Software Engineers disini:
karena tulisan ini merupakan tulisan bersambung mengenai topik Kompetensi Yang Harus dimiliki seorang Software Engineers]

Seorang software engineers secara umum, harus memiliki keahlian dalam SOFTWARE DEVELOPMENT atau pengembangan perangkat lunak. Software Development dapat dibagi menjadi beberapa bagian utama, yakni:
  • Software Construction (Konstruksi Software)
  • Software Engineering Models and Methods (Pemodelan dan Metode Software)
  • Software Maintenance (Perawatan Software)
  • Software Configuration (Konfigurasi Software)
Pada bagian ini saya akan menulis tentang Software Engineering Models and Methods.  Aspek ini terbagi pada dua bagian besar, yakni Pemodelan Perangkat Lunak dan Metode Pengembangan Perangkat Lunak. Selain, kontruksi perangkat lunak, maka pemodelan perangkat lunak merupakan kompetensi utama yang HARUS dimiliki oleh seorang software engineers.


Metode dan Pemodelan Perangkat Lunak merupakan struktur teknik informatika yang bertujuan untuk membuat konstruksi perangkat lunak berfokus pada aktivitas yang sistematis, repeatable dan success-oriented. Model perangkat lunak memberikan pendekatan baru dalam konstruksi perangkat lunak yang lebih "problem - solving", dengan menggunakan notasi dan prosedur yang menekankan proses analis dan perancangan perangkat lunak. Metode perangkat lunak menyediakan pemahaman kerangka kerja yang mengikuti "daur hidup", sehingga menuruti prinsip logis, berurutan dan berkesinambungan. Fokus kompetensi software engineers terkait bagian ini adalah pemahaman komprehensif tentang pengembangan perangkat lunak, mulai dari perencanaan, spesifikasi, perancangan, konstruksi, pengujian hingga implementasi.

Materi kurikulum terkait Software Engineering Models and Methods menurut Software Engineering Body of Knowledge IEEE adalah sebagai berikut:
1. Modelling
Modelling terbagi atas Modelling Principles, Properties and Expression; Syntax, Semantics dan Pragmatics; Pre-conditions, Post-conditions dan Invariants,
2. Types of Models
Tipe Model Perangkat Lunak terbagi atas: Information Modelling, Behavioral Modelling, Structure Modelling.
3. Analysis of Models
Analisis Model Perangkat Lunak terdiri atas: Analisis untuk Completeness, Analisis untuk Consistency, Analisis intik Correctness, Traceabiliy (keterlacakan/keterunutan) dan Analisis Interaksi.
4. Metode Perangkat Lunak
Bagian ini terdiri dari: Metode Heuristics, Metode Formal, Metode Prototyping dan Metode Agile.



Software Construction untuk Software Engineers

[Tulisan ini dibuat untuk Calon Mahasiswa Informatika, para mahasiswa program studi informatika dan khalayak umum yang ingin mengetahui kompetensi dasar seorang software engineers; untuk tulisan saya sebelumnya yang terkait dengan bagian ini, dapat dilihat disini:
1) Problem Solving untuk Software Engineers disini: http://stanleykarouw.blogspot.com/2012/06/problem-solving-untuk-software.html
2) Matematika Dasar untuk Software Engineers disini: http://stanleykarouw.blogspot.com/2012/06/matematika-dasar-untuk-software.html
3) Dasar Komputasi untuk Software Engineers disini: http://stanleykarouw.blogspot.com/2012/06/dasar-komputasi-untuk-software.html
karena tulisan ini merupakan tulisan bersambung mengenai topik Kompetensi Yang Harus dimiliki seorang Software Engineers]

Setelah menulis tentang ketiga topik diatas yang merupakan kompetensi dasar utama dari seorang software engineers, maka pada bagian ini, saya akan menulis tentang kompetensi keahlian seorang software engineers. Seorang software engineers secara umum, harus memiliki keahlian dalam SOFTWARE DEVELOPMENT atau pengembangan perangkat lunak. Software Development dapat dibagi menjadi beberapa bagian utama, yakni:
  • Software Construction (Konstruksi Software)
  • Software Engineering Models and Methods (Pemodelan dan Metode Software)
  • Software Maintenance (Perawatan Software)
  • Software Configuration (Konfigurasi Software)

(gambar diatas diambil dari http://cs.anu.edu.au/student/comp2100/ )

Pada bagian ini, saya akan membahas tentang Software Construction/Konstruksi Perangkat Lunak. Secara umum, yang dimaksud dengan Konstruksi Perangkat Lunak adalah keseluruhan aktivitas menciptakan perangkat lunak yang berfungsi dan bermanfaat melalui berbagai proses kodifikasi, verifikasi, pengujian dan pemeriksaan-ulang. Konstruksi Perangkat Lunak adalah kompetensi yang terkait dengan disain perangkat lunak dan pengujian perangkat lunak.
Dari sudut pandang akademisi dan praktisi maka konstruksi perangkat lunak merupakan "bagian" proses pengembangan perangkat lunak yang memiliki "highest volume of configuration items" (atau aktivitas-aktivitas konfigurasi yang diutamakan). Konstruksi perangkat lunak berhubungan dengan penulisan kode, pengujian kode dan pemeriksaan-ulang kode sehingga tentu saja berkaitan dengan kualitas perangkat lunak itu sendiri. Secara mendasar, maka kualitas perangkat lunak itu ditentukan oleh kualitas penulisan, pengujuan dan pemeriksaan-ulang kode.
Disamping itu, konstruksi perangkat lunak juga sangat berkaitan dengan "kemampuan komputasi" (terutama pengetahuan algoritma), karena penulisan kode, pengujian kode dan pemeriksaan-kode sangat membutuhkan pemahaman komputasi dasar secara komprehensif dan mendalam.

Berikut adalah beberapa topik bahasan dalam kurikulum Teknik Informatika yang dikeluarkan oleh IEEE Software Engineering Body of Knowlede (SWEBOK IEEE):

1. Dasar-dasar Konstruksi Perangkat Lunak
Dasar-dasar konstruksi perangkat lunak ini termasuk: penyederhanaan kompleksitas; antisipasi perubahan persyaratan perangkat lunak;  konstruksi untuk verifikasi perangkat lunak; guna-ulang (atau disebut "reuse") dan standarisasi konstruksi perangkat lunak.

2. Pengelolaan Konstruksi Perangkat Lunak
Topik bahasan yang termasuk pada bagian ini adalah: 
Model Daur Hidup konstruksi perangkat lunak; Perencanaan Perangkat Lunak dan Pengukuran Konstruksi Perangkat Lunak.

3. Aspek-aspek Praktis Konstruksi Perangkat Lunak
Meliputi pembahasan tentang: Disain konstruksi perangkat lunak, bahasa pemrograman, kodifikasi, pengujian perangkat lunak, konstruksi untuk guna-ulang (dan konstruksi dengan guna-ulang), jaminan kualitas perangkat lunak dan integrasi perangkat lunak.

4. Aspek-aspek Teknis Konstruksi Perangkat Lunak
Topik bahasan bagian ini meliputi: 
Disain API dan Penggunaannya; Object-oriented Run-time; Generalisasi dan Parameterisasi; Assertion, Design by Contract, Defensive Programming; Pengendalian Error, Pengendalian Exception, dan Fault Tolerance; Executable Models; State-based dan Teknik Konstruksi Table Driven; Run-time Configuration dan Internationalization; Grammer-based Input Processing; Concurrency Primitives; Middleware; Metode Konstruksi untuk Distributed Software; Kontruksi Heterogeneous Systems; Analisis Performance dan Tuning; Platform Standards; Test-first programming.

5. Tools Konstruksi Perangkat Lunak
Terkait dengan materi ini adalah: Development Environments; GUI Builders; Unit Testing Tools; Profiling, Performance Analysis dan Slicing Tools.


Selasa, 05 Juni 2012

Problem Solving untuk Software Engineers

[Tulisan ini dibuat untuk Calon Mahasiswa Informatika, para mahasiswa program studi informatika dan khalayak umum yang ingin mengetahui kompetensi dasar seorang software engineers]

Salah satu kompetensi yang HARUS (atau SEBAIKNYA) dimiliki oleh seorang software engineers adalah kemampuan untuk menyelesaikan masalah. Karakteristik seorang engineers pada hakikatnya adalah seorang PROBLEM SOLVER, dan dalam konteks software engineers, maka kompetensi ini terkait dengan menyelesaikan masalah-masalah yang ada dalam software engineering.
(gambar diambil dari http://usf-web2.wikispaces.com/ )

Untuk menjadi seorang "problem solver" maka, software engineers harus memahami sedikitnya 3 hal:
1. Menguasai TEORI yang RELEVAN; terkait dengan kompetensi ini maka seorang software engineers harus menguasai teori matematika dasar, teori ilmu komputasi dasar dan berbagai teori software engineering lainnya (seperti misalnya teori pengembangan perangkat lunak).
2. Membangun KERANGKA BERPIKIR; terkait dengan kompetensi ini maka seorang software engineers harus dapat membangun kerangka berpikir berdasarkan metodologi penelitian yang presisi. Proses logis yang berurutan, saling-terkait, saling-kausal dengan didukung oleh paradigma keilmuan engineering harus menjadi prinsip kerangka berpikir seorang software engineers.
3. Menguasai DOMAIN MASALAH; terkait dengan kompetensi ini adalah pemahaman komprehensif (atau menyeluruh) dari keilmuan software engineering.
Penjelasan diatas saya kutip (dengan perubahan seperlunya dari seorang dosen saya: DR. Riri Satria yang memberikan "ilmu" pada saya terkait Metodologi Penelitian. Tulisan beliau tentang kompetensi problem solver seorang software engineers, dapat dibaca selengkapnya disini.
Argumentasi yang dikemukakan oleh DR Riri Satria tersebut adalah ketiga kompetensi diatas, diperlukan untuk melakukan PROSES ANALISIS DAN DISAIN, dimana hasil "proses berpikir: analisis dan disain" itu tersebut digunakan untuk MENYELESAIKAN permasalahan yang dihadapi.
Lihat Gambar dibawah ini:
(gambar diatas diambil di http://ririsatria40.wordpress.com/2010/05/01/kuliah-membahas-kasus/ )

Terkait dengan "core competency" sebagai seorang problem solver maka, dalam keilmuan software engineering, IEEE SWBOK memberikan "saran acuan" kurikulum sebagai berikut:
(a) Definisi Penyelesaian Masalah; 
(b) Formulasi Permasalahan; 
(c) Analisis Permasalahan; 
(d) Mendisain Solusi Penyelesaian Masalah


Menurut pendapat saya, untuk dapat melakukan proses thinking analisis, sintesis dan disain, maka seorang software engineers HARUS memiliki kebiasaan membaca buku. Pengalaman saya dalam mendidik para calon-calon sarjana teknik Informatika adalah mereka tidak bisa melakukan proses analisis, sintesis dan disain, bukan karena tidak mampu, TETAPI lebih dikarenakan mereka tidak cukup memiliki "data/informasi" terkait TEORI dan DOMAIN MASALAH. Menurut hemat saya, membiasakan diri (baca: MENDISIPLINKAN) untuk membaca adalah suatu kegiatan belajar yang MANDATORY untuk dilakukan para software engineers.


Dasar Komputasi untuk Software Engineers

[Tulisan ini dibuat untuk Calon Mahasiswa Informatika, para mahasiswa program studi informatika dan khalayak umum yang ingin mengetahui kompetensi dasar seorang software engineers]

Komputasi untuk Software Engineers merupakan "core competency" atau kompetensi inti. Komputasi pada dasarnya terkait dengan dasar-dasar ilmu komputer yang mendukung proses analisa, perancangan dan konstruksi dari perangkat lunak. Komputasi dasar juga akan terkait dengan proses transformasi "disain" perangkat lunak, menjadi perangkat lunak yang siap digunakan (implementasi), tools (atau alat pendukung) yang diperlukan dalam proses-proses ini dan berbagai metode pengembangan perangkat lunak.
Pada umumnya, kita menerima sebagai suatu kenyataan bahwa software engineering (atau Rekayasa Perangkat Lunak atau Teknik Informatika) "dibangun" diatas dasar-dasar ilmu komputer dan ilmu matematika. Meskipun demikian, ada beberapa ilmuwan yang tidak sependapat dengan pandangan ini. Saya berpendapat bahwa software engineering "dibangun" diatas keilmuan ilmu komputer dan matematika.

Seorang pakar ilmu komputer Andrew Tanenbaum, menulis dalam bukunya Structured Computer Organization ISBN 978-0-13-148521-1; bahwa ilmu komputer mempelajari komputer sebagai "berbagai level abstraksi perangkat keras dan perangkat lunak". Level abstraksi sistem komputer itu dapat dilihat pada Gambar dibawah ini:
(Gambar Abstraksi Komponen Sistem diatas diambil di http://kambing.ui.ac.id/bebas/v06/Kuliah/SistemOperasi/2003/41/produk/SistemOperasi/c1.html)

Software Engineers "melihat" komputer dari sudut pandang software abstraction layer dan hardware abstraction layer. Dibagian lebih dasar dari hardware abstraction layer ada layer solid-states yang merupakan bagian dari disiplin ilmu Elektro (Electrical Engineering). Dibagian lebih atas dari software abstraction layer, dapat ditambahkan layer internet, web (1.0, 2.0 dan X.X) dan komputasi awan/cloud computing. Layer ini sering disebut Teknologi Informasi.
Keilmuan software engineering meliputi "abstraksi" dari perangkat lunak dan perangkat keras. Secara kasar dapat dikatakan bahwa tidak ada perangkat lunak yang "berjalan" tanpa membutuhkan perangkat keras. Software Engineering melihat kerangka kerja perangkat lunak, perangkat keras dan konektivitas jaringan sebagai bagian level abstraksi. Abstraksi perangkat lunak dan perangkat keras dibangun berdasarkan ilmu komputasi dan matematika. Sehingga, dengan demikian setiap software engineer harus memiliki kompetensi terkait ilmu komputasi dasar, karena ilmu komputasi dasar sangat erat terkait dengan proses analisis, disain dan implementasi perangkat lunak, dalam lingkungan abstraksi seperti pada Gambar diatas.

Ilmu Komputasi Dasar meliputi bahasan seperti pemrograman, struktur data, algoritma, organisasi dan arsitektur komputer, networking, sistem terdistribusi, dan lainnya. Pemetaan ilmu komputasi dasar dengan matematika dasar, analisa dan perancangan perangkat lunak, pengembangan perangkat lunak, pengujian perangkat lunak, jaminan kualitas perangkat lunak dan pemeliharaan perangkat lunak MERUPAKAN salah satu pemahaman kunci yang harus dimiliki seorang Software Engineers.

Berikut adalah topik bahasan ilmu komputasi dasar menurut Software Engineering Body of Knowledge yang dikeluarkan IEEE:
  • Abstraksi; level abstraksi, enkapsulasi, prinsip hierarki
  • Pemrograman Dasar: proses pemrograman, paradigma pemrograman dan defensive programming.
  • Dasar Bahasa Pemrograman: Sejarah Bahasa Pemrograman, Sintaks dan Semantik Bahasa Pemrograman, Bahasa Pemrograman Tingkat Rendah, Bahasa Pemrograman Tingkat Tinggi, Bahasa Pemrograman Imperative dan Declarative
  • Teknik dan Tools Debugging: Tipe Error, Teknik Debugging, Tools Debugging.
  • Struktur dan Representasi Data: Struktur Data, Tipe-tipe struktur data dan Operasi pada Struktur Data.
  • Algoritma dan Kompleksitas: Pengantar Algoritma, Atribut Algoritma, Analisa Algoritma dan Disain  Strategis Algoritma.
  • Konsep Dasar Sistem: Karakteristik Emergent System, System Engineering, Pengantar Sistem Komputer.
  • Organisasi dan Arsitektur Komputer: Pengantar Organisasi Komputer, Sistem Digital, Logika Digital, Ekspresi Data, Central Processing Unit, Organisasi Sistem Memori, Unit Input/Output.
  • Dasar Kompilasi: Pengantar Kompilasi, Interpretasi dan Proses Kompilasi.
  • Dasar Sistem Operasi: Pengantar Sistem Operasi, Abstraksi Sistem Operasi, Fungsi Sistem Operasi dan Klasifikasi Sistem Operasi.
  • Basis Data dan Manajemen Data: entitas dan schema, sistem manajemen basis data, bahasa query basis data, manajemen data, data mining.
  • Dasar Komunikasi Jaringan: Tipe Jaringan, Komponen Dasar Jaringan, Standar dan Protokol Jaringan, Internet, Internet of Things dan Virtual Private Network.
  • Parallel dan Distributed Computing: Pengantar Parallel dan Distributed Computing, Perbedaan Parallel dan Distributed Computing, Model dan Isu terkini.
  • Basic User Human Factors: Tampilan Masukan dan Keluaran, Pesan Kesalahan, dan Software Robustness
  • Basic Developer Human Factors: Struktur, Comments
  • Secure Coding: Aspek Secure Coding, Coding Security pada Software, Persyaratan Security, Disain Security dan Implementasi Security.

Matematika Dasar untuk Software Engineers

[Tulisan ini saya buat untuk setiap calon mahasiswa yang ingin melanjutkan studi ke jurusan informatika (atau Ilmu Komputer). Juga bagi setiap mahasiswa program studi Informatika atau Ilmu Komputer. Dan tentu saja, khalayak umum yang ingin mengetahui dapat membaca tulisan ini.]

Pada umumnya, saya menduga, masyarakat awam tidak memahami dengan tepat, tentang Software Engineers (atau Sarjana Teknik Perangkat Lunak), Teknik Informatika, Ilmu Komputer ataupun Sistem Informasi. Kebanyakan hanya memahami bahwa seorang sarjana teknik komputer adalah mereka yang berhubungan dengan komputer, internet dan seperangkat mobile phone.

Gambar dibawah ini saya ambil dari Grup Facebook Only an Engineering Student can understand the value of Last Night Study


Sebuah Gambar yang menjelaskan secara "tajam", kekeliruan yang ada pada masyarakat awam (atau bahkan pada mahasiswa jurusan Teknik Informatika di seluruh dunia???) terkait pengertian seorang ENGINEERS tersebut. Sudah jelas bahwa, seorang engineers itu adalah seorang yang "good in math"; seperti yang dilukiskan oleh figur gambar kanan bawah (seorang anak yang sedang berpikir, dilatarbelakangi papan tulis yang bertuliskan rumus matematika dasar). Sehingga jika dihubungkan dengan Software Engineers, maka sudah dapat dipastikan bahwa seorang software engineers itu adalah engineers (dgn skill matematika) perangkat lunak.

Sebelum saya lanjutkan, maka perlu juga saya menjelaskan mengenai Informatika dan Ilmu Komputer. Pengertian kedua kata ini sebenarnya adalah sama maknanya, hanya berbeda dalam penggunaannya. Di dataran Eropa, lebih cenderung menggunakan kata "Informatics" (yang diterjemahkan menjadi informatika dalam bahasa Indonesia), sedangkan di dataran Amerika dan Kanada, lebih cenderung menggunakan kata "Computer Science" (atau Ilmu Komputer). Esensinya, yang dimaksud dengan informatics dan computer science ini adalah disiplin ilmu yang sama.

Seorang SOFTWARE ENGINEERS, adalah seorang yang "terampil dengan matematika" dalam hubungannya dengan membuat program atau perangkat lunak. Mengapa? Dalam pengertian yang paling mendasar, maka seseorang dapat membuat program jika memahami dan mengikuti suatu kaidah tertentu, suatu logika yang teratur. Dalam konteks inilah, suatu skill matematika dibutuhkan oleh software engineers; yakni matematika membantu memberikan dasar fondasi untuk memahami kaidah logika teratur ini sedemikian, sehingga akhirnya logika teratur ini dapat diterjemahkan menjadi sebuah bahasa pemrograman tertentu. Esensi matematika untuk seorang software engineers sangat terkait dengan "logic and reasoning".
Menurut IEEE Software Engineering Book of Knowledge (SWEBOK), dikatakan bahwa seseorang dapat membuat program yang menyelesaikan permasalahan tertentu hanya dengan mengikuti alur logis tertentu. Tujuan kemampuan dasar matematika adalah untuk mengidentifikasi dan memahami "alur logis tertentu" tersebut, dengan penekanan pada pemahaman konsep-konsep dasar matematis, dan bukan pada kemampuan aritmatika.
Sebagai suatu disiplin ilmu, maka Matematika sangat terkait dengan studi tentang formal system. Kata formal disini adalah PRECISENESS (atau ketepatan), dimana tidak boleh terdapat ambiguitas ataupun kesalahan dalam menginterpretasi suatu data (atau fakta). Seorang software engineers harus berurusan dengan proses abstraksi fakta; dimana ketepatan abstraksi adalah mandatory (diharuskan). Disinilah peran matematika dasar bagi seorang software engineers.

Mengikuti SWEBOK IEEE, maka berikut ini adalah daftar kemampuan dasar matematis yang harus dimiliki oleh seorang Software Engineers:
  1. Himpunan, Relasi dan Fungsi
  2. Logika Dasar, seperti Logika Proporsional dan Logika Predikat
  3. Teknik Pembuktian Matematika seperti Metode Pembuktian Teorema dengan Pembuktian Langsung dan Pembuktidan dengan Kontradiksi
  4. Dasar dasar Perhitungan, seperti Aturan Penjumlahan, Aturan Perkalian, Prinsip Inclusive-Exclusive, Fungsi Rekursive, Permutasi dan Kombinasi.
  5. Teori Graph dan Trees
  6. Probabilitas Diskrit; seperti model probabilitas, random variable, diskret dan kontinyu random variabel, distribusi probabilitas (mean dan variance).
  7. Finite State Machines
  8. Teori Formal Language
  9. Presisi Numerik (atau Metode Numerik)
  10. Teori Angka (Number Theory); misalnya bilangan natural, bilangan Real, bilangan integer, bilangan rational, bilangan prima dan bilangan kompleks.
  11. Struktur Aljabar
Jadi, dapat kita simpulkan bahwa kemampuan matematika dasar inilah yang akan menjadi PONDASI bagi seorang software engineers dalam melakukan analisis, abstraksi dan proses logis.