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.


Rabu, 30 Mei 2012

IPv4 versus IPv6

IP version 4
IPv4 atau Internet Protocol version 4 merupakan revisi keempat dari pengembangan Internet Protocol (IP). IPv4 secra de facto merupakan protocol internet pertama yang digunakan secara meluas di seluruh dunia. IPv4 diusulkan oleh RFC791 di bulan September 1981.
Secara ringkas, dapat dikatakan bahwa IPv4 merupakan protocol pengalamatan jaringan yang digunakan didalam model arsitektur jaringan TCP/IP. Arsitektur IPv4 sendiri memeiliki panjang 32-bit dan 'dianggap' dapat mengalamati 4 miliar host, atau tepatnya 4.294.967.296 host. 
Jenis Alamat IPv4
Alamat IPv4 terbagi atas beberapa jenis, yakni:
1. Alamat unicast; 
yakni alamat IPv4 yang ditentukan untuk sebuah antarmuka jaringan yang dihubungkan ke sebuah internetwork IP. Alamat unicast digunakan dalam komunikasi point-to-point. Alamat unicast, sering disebut sebagai alamat logis karena alamat ini merupakan alamat yang diterapkan pada layer jaringan DARPA Reference Model. Komponen alamat unicast terbadi menjadi host identifier dan network identifier. Alamat unicast menggunakan kelas A, B dan C dari kelas-kelas alamt IP, sehingga ruang alamatnya adalah dari 1.x.y.y.z hingga 223.x.y.z. Sebuah alamat unicast dibedakan dengan alamat lainnya dengan menggunakan skema subnet mask.
Jenis-jenis alamat unicast adalah:
a. alamat publik; yakni alamat-alamat yang telah ditetapkan oleh InterNIC dan berisi beberapa buah network identifier yang telah dijamin unik.
b. alamat ilegal; yakni alamat-alamat yang digunakan dalam intranet pribadi, yang tidak dikoneksikan dengan internet. Alamat-alamat ini cenderung membuat konflik antara satu dan lainnya karena tidak dikoordinasikan dengan InterNIC.
c. alamat privat; ini merupakan alamat IP yang berada di dalam ruangan alamat pribadi. Biasanya digunakan dalam private network, dan tidak saling overlapping dengan publik address.
d. localhost; yakni rentang alamat 127.0.0.0/8 yang dicadangkan untuk host local. Paket data yang dikirimkan melalui alamat ini akan datang kembali kepada host sebagai incoming packet pada antar muka jaringan (NIC) yang sama (atau disebut loopback).
2. Alamat broadcast
Alamat broadcast merupakan alamat IPv4 yang didisain agar dapat memproses permintaan setiap node IP dalam segmen jaringan yang sama. Alamat broadcast digunakan dalam komunikasi one-to-everyone. Alamat IP broadcast hanya dapat ditujukan sebagai alamat tujuan saja, sehingga tidak dapat digunakan sebagai alamat sumber.
Ada empat jenis alamat IP broadcast, yakni network broadcast, subnet broadcast, all-subnets-directed broadcast dan limited broadcast.
3. Alamat multicast
Multicast address merupakan alamt IPv4 yang dapat memproses permintaan satu atau beberapa node dalam segmen jaringan yang sama atau berbeda. Alamat multicast digunakan dalam komunikasi one-to-many. IP multicast merupakan alamat yang digunakan untuk menyampaikan paket data kepada banyak penerima. Alamat-alamat multicast IPv4 didefinisikan dalam ruang alamat kelas D, yakni 224.0.0.0/4, yang berkisar dari 224.0.0.0 hingga 224.255.255.2555. Prefiks alamat 224.0.0/24 tidak dapat digunakan karena dicadangkan untuk digunakan sebagai lalu lintas multicast dalam subnet lokal.

IP version 6
IP version 6 atau IPv6 merupakan protokol pengembangan IPv4. Dalam Ipv6, alamt 128 bit akan dibagi ke dalam 8 blok berukuran 16-bit yang dapat dikonversikan ke dalam bilangan heksadesimal berukuran 4-digit. Format notasi yang digunakan IPv6 sering disebut colon-hexadecimal format (berbeda dengan IPv4 yang disebut dotted-decimal format)
IPv6 memiliki angka prefiks, tetapi angka prefiks IPv6 tidak digunakan untuk merujuk kepada subnet mask (karena IPv6 memang tidak mendukung subnet masking). Struktur prefiks dinyatakan dengan [alamat]/[angka panjang prefiks]. Panjang prefiks menentukan jumlah bit terbesar paling kiri yang membuat prefisk subnet.
Alamat IPv6 terbagi atas beberapa jenis:
1. Alamat unicast; yang menyediakan komunikasi secara point-to-point; secara langsung antara dua host dalam sebuah jaringan.
2. Alamat multicast; alamat ini digunakan untuk komunikasi one-to-many.
3. Alamat anycast; alamat ini digunakan dalam komunikasi one-to-one-of-many. Alamat ini digunakan sebagai alamat tujuan (destination address) dan diberiakan hanya kepada router, bukan kepada host-host biasa.


Rabu, 23 Mei 2012

Pengantar Cloud Computing

Makin banyak yang bertanya-tanya kepada saya, tentang apa itu cloud computing, atau dalam bahasa Indonesia disebut Komputasi Awan. Dunia Teknologi Informasi, dikenal memiliki banyak jargon, yang membuat masyarakat awam (bahkan para mahasiswa pun) kesulitan untuk memahaminya. Sebuah tulisan pengantar Cloud Computing, kiranya dapat membantu untuk memulai pemahaman kita.

Menurut NIST (National Institute of Standard and Technology) maka sebuah Cloud Computing dikatakan memiliki beberapa karakteristik tertentu, yakni:
1. Layanan Sendiri
Komputasi Awan harus dapat memberikan layanan sendiri kepada para penggunanya. Layanan sendiri yang dimaksud disini tentu saja layanan aplikasi yang terkait proses bisnis penggunanya. Intinya disini adalah kebebasan pengguna untuk meng-customize, atau "men-setting" sendiri layanan yang diinginkan pengguna.
2. Elastisitas Layanan
Elastisitas Layanan menyangkut kapasitas layanan yang diberikan oleh pihak penyedia komputasi awan, dimana pengguna diberi keluasan untuk dapat meningkatkan kapasitas layanan yang ingin dimilikinya. Kapasitas layanan ini terkait aplikasi, infrakstuktur maupun platform dalam komputasi awan. Tentu saja, penyedia layanan komputasi awan harus dapat menyediakan kapasitas layanan secara tak-terbatas untuk pengguna layanan komputasi awan tersebut.
3. Akses Jaringan Pitalebar
Akses jaringan pitalebar atau broad network access menyangkut prinsip "segala alat". Maksudnya layanan komputasi awan itu harus dapat diakses dengan menggunakan berbagai perangkat seperti desktop, smart phone, ipad, Tab, Laptop, PDA dan KindleFire dari Amazon. Prinsip segala alat ini menunjukkan bahwa komputasi awan sebenarnya adalah sebuah platform yang dapat digunakan oleh berbagai macam device yang terhubung dengan layanan tersebut.
4. Sumberdaya yang terkumpul
Karakteristik lainnya dari komputasi awan adalah sunberdaya layanan yang terkumpul. Karakteristik ini terkait penyedia layanan komputasi awan yang "mengumpulkan" layanan komputasi awan secara terpusat, atau lebih tepat dikatakan terpadu dan terkendali. Sumberdaya komputasi awan menyangkut bandwith, media penyimpanan, CPU, dsb. Pengguna komputasi awan "melihat" sumber dayanya secara terpusat, meskipun sebenarnya sumber daya tersebut bisa juga tersebar oleh berbagai penyedia web services misalnya, namun penyedia layanan, menampilkannya secara terpadu, terpusat dihadapan user.
5. Layanan yang terukur.
Karakteristik terakhir yangharus dimiliki komputasi awan, yakni layanan yang terukur. Disini yang dimaksudkan adalah monitoring dan evaluasi dari layanan komputasi awan tersebut.

Layanan Komputasi awan itu sendiri sebenarnya dapat dibedakan menjadi tiga bagian, yakni:
1. software as service
2. infrastucture as service
3. platform as service
Kita dapat melihat secara jelas, apa sebenarnya yang dimaksud dengan layanan komputasi awan itu tersebut. Intinya ada pada kata "service". Ini berarti semua produk Teknologi Informasi Komunikasi, yakni perangkat lunak, perangkat keras, komputasi, storage dan networking dijadikan sebagai pendukung dan pemungkin proses bisnis pengguna layanan komputasi awan. Pendukung dan pemungkin proses bisnis inilah yang HARUS menjadi pemahaman kunci dalam "pendayagunaan" komputasi awam tersebut.

Berikut saya berikan sebuah link yang sangat bagus untuk mulai memahami komputasi awan,
http://www.cloudindonesia.org/pengantar-cloud-computing.html
Link tersebut juga memberikan FREE e-book Pengantar Komputasi Awan yang sangat menarik dan mudah dicerna.