Software Engineering 101 dalam Pengembangan Produk Digital
“Kami sedang merancang sebuah Produk Digital. Kami sudah mempersiapkan mock-up desain UI/UX. Tinggal kita cari frontend dan backend developer untuk membuat aplikasi mobile-nya. Gampang kok! 2 minggu juga jadi.”
Apakah memang segampang itu?
TL;DR
Mengembangkan produk digital berupa software membutuhkan praktik software engineering yang relevan untuk memastikan produk digital yang baik dan berkualitas.
1. Agile Software Development + CI/CD
2. Clean Code and Refactoring
3. Integrasi dengan legacy systems.
4. Kebutuhan non-fungsional (non-functional requirements)
5. Keamanan Aplikasi (application security)
Gambaran Umum Aplikasi mobile sebagai Produk Digital
Tulisan ini akan lebih fokus pada bagian proses software development, di luar proses-proses product development pada umumnya seperti customer discovery, design thinking, customer journey design, product roadmap dan UI/UX design. Dan tulisan ini lebih relevan bagi perusahaan non digital-native yang perlu menyesuaikan praktik software engineering dalam menjalankan transformasi digital
Studi Kasus:
Sebuah institusi pendidikan ingin melakukan transformasi digital dengan membuat aplikasi mobile untuk memudahkan para pengajar maupun pelajarnya berinteraksi. Misalnya, pelajar bisa melihat jadwal dan materi pelajaran dari ponsel.
OK. Asumsikan, customer journey dan desain UI/UX sudah tersedia. Kita bisa hire frontend developer untuk melakukan pengembangan aplikasi mobile iOS dan Android. Kita bisa menggunakan teknologi native dalam pengembangan masing-masing platform Android dan iOS. Alternatif lain, kita bisa menggunakan teknologi multi-platform seperti Flutter dan React Native. Tentu masing-masing pilihan ada trade-off nya.
Namun, jika kita berbicara produk digital, aplikasi mobile saja tidak cukup. Aplikasi di ponsel perlu berinteraksi dengan backend system yang menyimpan lebih banyak informasi yang tidak bisa disimpan di aplikasi mobile. Contoh paling sederhana, informasi username dan password untuk masuk ke aplikasi. Jika dikaitkan dengan studi kasus kita, informasi tentang jadwal belajar dan materinya mesti disimpan di backend server.
Komunikasi antara aplikasi mobile dan backend server ini dilakukan via API (Application Programming Interface). Para backend developer juga memiliki banyak opsi teknologi dalam membuat backend server, seperti Nodejs, Golang, SpringBoot, PHP dan sebagainya. Komponen backend ini biasanya juga dibantu dengan datastore untuk penyimpanan data. Datastore ini juga tersedia dalam banyak pilihan, baik yang relasional (PostgresSQL, MySQL, Oracle) maupun non-relasional (MongoDB, Cassandra, Redis).
Salah satu bentuk API yang paling umum saat ini adalah REST dengan menggunakan data format JSON. Alternatif lain seperti Web Service, GraphQL, gRPC juga bisa digunakan.
Tidak semua backend API perlu kita buat dari nol. Beberapa API umum/generic sudah tersedia di cloud dan bisa kita langsung konsumsi dengan mudah. Tentunya dengan adanya biaya subscription, tapi ini menghemat effort kita dalam membangun solusi secara keseluruhan. Don’t reinvent the wheel!.
Contoh API publik yang bisa kita manfaatkan seperti Google Analytics untuk memonitor trafik penggunaan aplikasi kita. Contoh lain adalah Firebase yang sebagai backend-as-a-service memberikan banyak fitur yang siap digunakan, seperti user authentication, data store (penyimpanan data) dan monitoring performa aplikasi.
Selain API publik, ada kalanya kita butuh kolaborasi dengan 3rd party partner. Ambil contoh, institusi pendidikan ini ingin menambahkan fitur payment (contoh: pembayaran dengan CC, Gopay, LinkAja, dll), maka kita bisa berkolaborasi dengan 3rd party payment provider seperti Midtrans atau Finpay.
SELESAI!
Hanya dengan frontend dan backend developer, kita bisa membuat produk digital langsung jadi …
Nanti dulu ..
We are just getting started …
Sekadar membuat software berupa aplikasi mobile bukanlah hal yang terlalu sulit. Kita bisa outsource-kan ke freelancer atau mahasiswa misalnya. Tool dan tutorial pembuatan aplikasi mobile juga sudah banyak tersedia. Bahkan sudah banyak tersedia tool drag-and-drop untuk memudahkan kita dalam pembuatan, tanpa harus coding!
Namun, produk digital yang baik dan berkualitas berawal dari software yang baik dan berkualitas — software yang sederhana untuk dioperasikan dan dirawat. Tidak membutuhkan banyak orang untuk terlibat. Tidak kompleks untuk dilakukan perubahan. Tidak membuat kita 24/7 was-was apa yang akan terjadi dengan software kita.
Pengembangan sebuah software yang baik dan berkualitas tidaklah mudah — membutuhkan ilmu pengetahuan, pengalaman dan seni. Di sinilah peran bidang rekayasa perangkat lunak (software engineering) untuk menjawab pertanyaan bagaimana membangun software yang baik dan berkualitas. Kita akan coba bahas satu persatu-satu praktik dan pola software engineering yang relevan dalam pengembangan produk digital.
1. Agile Software Development & CI/CD
Bagaimana kita memastikan aplikasi mobile dan backend yang kita bangun memang mensolusikan permasalahan yang didefinisikan di awal?
Apakah aplikasi ini memang menjawab tantangan digital transformation yang digaung-gaungkan?
Bagaimana menjamin fitur-fitur yang dibuat sesuai dengan spesifikasi kebutuhan yang sudah didefinisikan di awal?
Dalam dunia rekayasa perangkat lunak (software engineering), kita mengenal istilah SDLC (software development lifecycle). Salah satu bentuk SDLC yang paling klasik adalah waterfall — Pembuatan software di mulai dari fase requirement, dilanjutkan dengan analysis, design, build dan selanjutnya.
Fase-fase dari SDLC di atas sepertinya tidak perlu dijelaskan, sudah cukup jelas. Pada dasarnya, proses SDLC akan membantu menjaga ekspektasi kebutuhan di awal, ditranslasikan ke desain sistem yang tepat, dibangun dan diujikan apakah sudah sesuai dengan kebutuhan awal.
Namun, dalam dunia disrupsi digital ini, SLDC waterfall tidak akan cukup untuk membuat produk digital yang sukses.
Software was invented to be “soft.” It was intended to be a way to easily change the behavior of machines. If we’d wanted the behavior of machines to be hard to change, we would have called it hard ware. To fulfill its purpose, software must be soft — that is, it must be easy to change. When the stakeholders change their minds about a feature, that change should be simple and easy to make
Robert C. Martin — Clean Architecture
Mengutip quote dari Uncle Bob di atas, software harus bisa mengakomodasi perubahan. Saat ini kita sering mendengar istilah agile software development yang sebenarnya sudah dirintis sejak tahun 2000-an. Agile menekankan respons yang cepat dan fleksibel terhadap perubahan.
- Individuals and Interactions over processes and tools
- Working Software over comprehensive documentation
- Customer Collaboration over contract negotiation
- Responding to Change over following a plan
Dalam pengembangan produk digital, adopsi agile software development menjadi sangat penting. Dalam persaingan yang serba cepat dan reaktif, produk digital kita dituntut untuk bisa mengakomodasi perubahan dengan efektif.
Dan perubahan ini harus diakomodasi dengan cepat. Dalam konsep product development, kita mengenal konsep cost of delay — mengukur potensi akibat dari waktu yang delay/telat. Contohnya: potensi kehilangan revenue karena telat rilis fitur ke pengguna. Salah satu competetitive advantage yang dimiliki oleh perusahaan digital native adalah kemampuan untuk deliver software dengan kecepatan yang sangat cepat — bahkan bisa 10–100x lebih cepat jika dibandingkan perusahaan biasa (data berdasarkan State of DevOps Report 2019).
Namun jika hanya cepat, tapi tidak memperhatikan kualitas juga akan jadi percuma — product kita akan memiliki banyak cacat dan masalah. Bagaimana kita bisa lebih cepat, tapi tetap bisa menjaga kualitas?
Jika agile software development lebih ke arah metodologi dan proses, di software engineering ada CI/CD (continuous integration and continuous delivery). CI/CD adalah proven best-practice yang membantu delivery lifecycle dari software supaya lebih cepat dan di saat bersamaan juga menjaga kualitasnya.
Kunci dari CI/CD adalah regular check-in / integrasi terhadap kode yang dikembangkan untuk mendapatkan early feedback, dan otomasi proses (build, testing, deploy)
2. Clean Code and Refactoring
Clean Code adalah kode pemrograman yang mudah dimengerti dan diubah, terlepas dari bahasa pemrograman apa yang digunakan. Seperti yang kita ketahui, software (baik itu frontend maupun backend) dibangun dengan menggunakan kode pemrograman. Masing-masing developer akan memiliki preferensi bahasa pemrograman yang akan digunakan. Di satu sisi, satu bahasa pemrograman bisa memiliki kelebihan dibandingkan bahasa pemrograman lain, namun yang terpenting adalah memastikan kode yang kita buat mudah dimengerti dan diubah.
Semakin besar produk digital yang kita bangun, maka semakin penting prinsip clean code ini untuk diterapkan. Sebagai besar dan kompleks sebuah software, maka akan semakin menantang untuk dipahami dan diubah. Apalagi jika kode pemrograman ini dikerjakan oleh beberapa orang.
Namun kita tidak perlu terlalu khawatir apakah kode yang kita kembangkan, apakah sudah clean atau belum. Dalam software engineering, direkomendasikan dilakukan praktik refactoring secara kontinu. Refactoring adalah proses restrukturisasi dan penyederhanaan ulang kode tanpa merubah fungsionalitas dari aplikasi. Refactoring bertujuan untuk meningkatkan kualitas internal dari kode, supaya lebih mudah dipahami dan dikembangkan di masa mendatang.
3. Kebutuhan Non-fungsional (Non-functional Requirements)
Memberikan kenyamanan dan pengalaman yang menyenangkan buat pengguna (user experience) tidak hanya berhubungan dengan tampilan aplikasi / user interface yang indah, tetapi tidak kalah pentingnya adalah memenuhi non-functional requirement dengan tepat. Contoh, kita tidak ingin aplikasi kita:
- Lemot, loading lambat
- Tidak responsif
- Banyak bug
- Tidak selalu tersedia / available
Belum lagi jika sesuatu terjadi dengan backend server kita. Gambar 2 di atas adalah gambaran paling sederhana antara frontend dan backend. Kenyataannya, arsitektur backend server akan jauh lebih kompleks — akan sangat riskan jika kita hanya menggunakan 1 backend server. Aspek non-functional ini dinamakan high-availability (H/A).
Selain H/A, ada beberapa non-functional requirement lain yang perlu dipersiapkan:
- Performance — bagaimana software kita tetap bisa beroperasi dengan optimal dan tidak crash, sesuai dengan ekspektasi/proyeksi traffic. Misalkan, aplikasi harus bisa menangani 100 concurrent user, dan 20 TPS (transaction per second).
- Scalability — bagaimana software kita bisa dengan mudah disesuaikan untuk menangani beban yang lebih tinggi. Dalam disrupsi digital, scalability penting untuk diperhatikan. Akan sulit memprediksi seperti apa beban dan trafik yang akan masuk ke aplikasi kita.
- Stability — bagaimana software kita tetap bisa stabil, walaupun harus menangani beban tinggi dalam jangka waktu yang lama
- Deployability — bagaimana software kita mudah untuk di-deploy ke environment yang berbeda (development, testing dan production).
- Operability — bagaimana software kita mudah dioperasikan dan di-monitor.
Untungnya teknologi backend ini semakin berkembang untuk memudahkan dan menyederhanakan usaha kita. Teknologi seperti container, PaaS (platform-as-a-service), dan FaaS (function-as-a-service) dikembangkan dan dibuat untuk membantu kita mengurangi kompleksitas di pengembangan backend server.
Namun perlu diperhatikan, jika kode yang kita kembangkan “boros” penggunaan sumber daya (CPU, memory, storage), maka secanggih apapun infrastruktur dan platform yang digunakan tidak akan menolong.
4. Integrasi dengan Legacy System
Perusahaan yang sedang melakukan tranformasi dan mengembangkan produk digital terkadang mesti membangun integrasi dengan core system (baca: legacy system) mereka yang sudah ada. Integrasi dengan core system yang sudah ada ini perlu direncanakan dengan baik dan hati-hati, karena:
- Kapasitas sistem tersebut biasanya terbatas, karena belum mempertimbangkan estimasi trafik baru yang akan datang dari produk digital yang sedang dibangun
- Aspek keamanan integrasi ke sistem — sebelum era digital, sistem-sistem IT cendrung terisolasi dalam island yang tertutup. Transisi ke dunia digital, sistem ini akan mulai berhubungan dengan Internet (walaupun tidak secara langsung)
- Kecepatan membuat perubahan/changes di existing core system biasanya lebih ‘lambat’ dibandingkan dengan digital produk yang kita bangun. Ada juga core system yang dibangun menggunakan packaged software yang akan membuat kompleksitas perubahan semakin tinggi.
5. Keamanan Aplikasi (Application Security)
Last, but not the least. Security.
Dalam dunia digital dan mobile, security adalah tantangan nyata. Kita harus serius memperhatikan dan menjaga risiko ancaman (security threat) yang mungkin terjadi. Misalnya dengan:
- Melindungi data dan perangkat pengguna.
- Memitigasi risiko fraud dan penyalahgunaan informasi.
Untuk memberikan sedikit gambaran, kita coba bahas teknik security protection minimum dalam pengembangan aplikasi mobile:
- Code Obsfucation — Perlu dilakukan pengacakan terhadap kode aplikasi mobile yang sudah dikembangkan supaya tidak mudah untuk dilakukan reverse engineering — para peretas bisa dengan mudah mempelajari dan eksploit celah di aplikasi kita
- TLS/SSL Pinning — TLS/SSL bertujuan untuk mengamankan komunikasi antara frontend (aplikasi mobile) dan backend. Teknik pinning menambahkan lagi perlindungan di sisi frontend supaya komunikasi lebih susah dicegat.
- Otentikasi User and API — Gunakan protokol standar industri yang aman seperti OAuth 2.0 untuk memproteksi otentikasi user dan API kita
- (D)DoS & prevention — Serangan DoS (denial of service) bertujuan untuk menyerang aplikasi kita hingga menerima load yang tinggi dan akhirnya tidak bisa melayani traffic. DDos adalah serangan lebih besar, karena dilakukan secara distributed. Gunakan berbagai teknik seperti rate-limiter, throttling, dan WAF (web application firewall). Akan semakin bagus jika proteksi bisa dilakukan di sisi network perimeter seperti firewall.
Namun, jangan sampai aspek security juga jadi penghambat proses software development — kita bisa kehilangan potensi dan peluang bisnis yang besar (kembali ke konsep cost of delay).
Jalan tengahnya, adalah dengan melibatkan aspek security dari aspek pengembangan software. Istilah kekiniannya, shift left on security. Beberapa contoh cara implementasinya:
- Melibatkan lebih awal aspek desain secure application di fase awal pengembangan software.
- Melakukan otomasi pengujian vulnerability dan dilakukan secara terus-menerus, sehingga tidak menjadi blocker dalam end-to-end proses software development.
Kesimpulan
Kembali ke studi kasus kita, kira-kira apa yang terjadi dengan aplikasi mobile yang dibuat oleh institusi pendidikan tadi, jika tidak menerapkan praktik software engineering dengan benar? Berikut beberapa kemungkinan yang bisa terjadi:
- Aplikasi selesai dibuat, dan rilis ke pengguna. Namun pengguna kesulitan mengakses layanan, karena ternyata kapasitas backend server tidak cukup. Atau backend server sering down atau tidak stabil.
- Aplikasi sukses dirilis, dan direspons dengan baik. Namun berdasarkan pola penggunaan oleh pelajar dan pengajar, ternyata perlu ada penyesuaian lagi. Belum lagi masukan dari manajemen untuk improvement. Tim developer aplikasi kesulitan melakukan pengembangan, karena kode yang terlalu kompleks dan sulit dikembangkan lebih lanjut
- Aplikasi kena retas — data pengguna bocor diambil oleh peretas
Terakhir, coba kita bandingkan aplikasi mobile yang dirilis oleh pemain digital native / start-up seperti Gojek dan Tokopedia, dengan aplikasi mobile yang dirilis oleh perusahaan traditional / korporasi. Kita coba lihat dari beberapa sisi, dan secara umum pemain digital native ini lebih unggul.
- Responsiveness
- Kestabilan, frekuensi terjadi error
- Kecepatan penambahan fitur
Perusahaan digital native kebanyakan sangat kuat di bidang engineering, memiliki tim internal software development yang besar, dan menerapkan praktik yang benar sejak awal. Ini tantangan bagi para perusahaan yang sedang melakukan transformasi digital — bagaimana memastikan penerapan software engineering yang tepat untuk menghasilkan produk digital yang baik dan berkualitas.