Becoming an Architect in Software Development?

Revan Ragha Andhito
8 min readMay 11, 2020

--

Dalam dunia software engineering, sebagai developer kita perlu memperhatikan arsitektur dari software yang akan dikembangkan. Arsitektur seperti apa? Apakah seperti membangun sebuah rumah atau gedung? Tentu tidak😂 Mari kita mengenal lebih jauh apa saja arsitektur yang saya gunakan dalam pengembangan proyek aplikasi Sistem Informasi Penilaian dan Evaluasi Praktikum yang dikembangkan oleh saya dan rekan-rekan tim saya.

System Architecture

Arsitektur sistem adalah suatu istilah untuk mendefinisikan komponen-komponen yang lebih spesifik secara terstruktur, baik dari komponen hardware dan software. Arsitektur sendiri memiliki pengaruh terhadap kualitas dari produk itu sendiri, mulai dari tahap perencanaan, pengembangan, testing, deployment, dan deliver product ke klien. Hubungan antara produk dengan komponen pendukung sangat mempengaruhi performa dari sebuah sistem dalam menyesuaikan dengan requirements dan future development di masa yang akan datang. Arsitektur sistem akan menjadi hal penting untuk memahami apa yang terjadi pada tingkat platform & komponen pendukung sebelum perancangan sistem dimulai.

Arsitektur sistem juga harus mewakili kebutuhan non-fungsional (non-functional requirements). Kebutuhan non-fungsional secara tidak langsung memiliki pengaruh yang besar pada desain arsitektur. Harus dipahami bahwa kebutuhan dari klien dan pengguna harus dapat dipenuhi oleh keseluruhan sistem. Pemilihan susunan arsitektur yang tidak tepat akan menyebabkan sebuah solusi tidak dapat digunakan oleh user dengan tepat.

Berdasarkan artikel dari Marco Bürckel mengenai “Practical Tips on Software Architecture Design”, berikut adalah hal-hal yang perlu diperhatikan dalam mengidentifikasi kebutuhan non-fungsional:

  • Extensibility : Upaya yang diperlukan dalam mengelaborasi dan memperluas jangkauan dari fitur tertentu.
  • Performance: Waktu respons singkat / throughput tinggi.
  • Scalability: Kemampuan suatu sistem untuk menangani peningkatan jumlah pekerjaan (workload).
  • Portability: Kegunaan suatu sistem yang dapat digunakan pada environment yang berbeda.
  • Compliance: Kesesuaian terhadap pemenuhan suatu sistem dengan kebijakan dan standar yang berlaku.

Dari aspek di atas, kita sebagai developer harus bisa mengidentifikasi kebutuhan non-fungsional dan menyesuaikannya dengan kebutuhan fungsional yang dibutuhkan oleh klien dan pengguna. Contohnya dalam proyek aplikasi Sistem Informasi Penilaian dan Evaluasi Praktikum yang kami kembangkan, klien kami membutuhkan suatu sistem yang melibatkan penyimpanan dan akses suatu informasi, seperti menyimpan link, mengunggah dokumen, men-download dokumen, dan lain-lain yang mengedepankan kecepatan pengiriman informasi dari server ke user. Selain itu, dari aspek keamanan, klien kami juga membutuhkan autentikasi pengguna sistem menggunakan sistem Single Sign On dari Universitas Indonesia.

Berikut adalah library dan framework yang kami gunakan dalam pengembangan proyek aplikasi kami, yaitu Sistem Informasi Penilaian dan Evaluasi Praktikum.

React

React JS adalah sebuah library JavaScript yang bersifat open-source untuk membangun User Interface yang dibuat oleh Facebook. React adalah library yang bersifat composable user interface, yang artinya kita dapat membuat berbagai user interface yang bisa kita bagi menjadi beberapa komponen. React sendiri hanya mengurusi ha-hal yang berkaitan dengan tampilan dan logika di sekitarnya.

Alasan kami menggunakan React adalah karena React adalah salah satu library yang sedang “happening” dan dari proyek PPL ini kami dituntut untuk mempelajari hal yang baru, karena React sendiri belum pernah dikenalkan di mata kuliah yang kami ambil sebelumnya. Selain itu, React sendiri memiliki berbagai keunggulan, yaitu mudah dipahami, scalable, fleksibel, efisien, cepat, dan dapat digunakan berulang kali.

Django

Django adalah sebuah framework full-stack untuk membuat aplikasi web dengan bahasa pemrograman Python. Framework ini akan membantu kita membuat web lebih cepat, dibandingkan menulis kode dari nol. Django banyak digunakan karena mengikuti prinsip DRY (Dont Repeat Yourself) sehingga memiliki efisiensi waktu yang baik. Selain itu, terdapat beberapa alasan lain mengapa Django ini dapat populer di kalangan developer.

Alasan kami menggunakan Django karena kami sudah cukup familiar menggunakan framework ini ketika mengambil mata kuliah Perancangan dan Pemrograman Web. Selain itu, Django memiliki berbagai keunggulan. Dikutip dari artikel logique.co.id, Django memiliki fitur untuk menyederhanakan proses development dengan cara menyediakan hal yang diperlukan untuk mengembangkan sistem secara lengkap serta menyelesaikan tugas-tugas umum dalam pengembangan seperti user authentication, URL routing, database schema migration, memenuhi prinsip KISS dan DRY, dan juga aman ketika digunakan.

Docker

Docker adalah sebuah aplikasi yang bersifat open source yang berfungsi sebagai wadah/container untuk mengemas sebuah software secara lengkap beserta semua hal lainnya yang dibutuhkan oleh software tersebut, sehingga dapat berfungsi. Pengaturan software beserta file dan hal pendukung lainnya akan menjadi sebuah Image (istilah yang diberikan oleh docker). Kemudian sebuah instance dari Image tersebut kemudian disebut Container. Dengan container, sebuah sistem ‘diikat’ beserta library-nya, file konfigurasi, dependencies, dan seluruh hal yang dibutuhkannya.

Docker dapat digunakan sebagai suatu ‘alat’ yang dapat mengurangi celah antara fase development dan deployment suatu produk software. Sebagai ilustrasi, kami sebagai developer mengerjakan produk kami di sistem operasi yang berbeda, seperti Windows, Linux, dan MacOS. Untuk mencegah terjadinya masalah seperti kemungkinan adanya dependencies, setup database, line-break (linter), kami menggunakan Docker sebagai salah satu solusi mengantisipasi masalah-masalah tersebut.

Latar belakang dari adanya Docker itu sendiri, yaitu:

Developing apps today requires so much more than writing code. Multiple languages, frameworks, architectures, and discontinuous interfaces between tools for each life cycle stage creates enormous complexity. Docker simplifies and accelerates your workflow, while giving developers the freedom to innovate with their choice of tools, application stacks, and deployment environments for each project.

Docker Architecture (source: https://devopedia.org/images/article/101/8323.1565281088.png)

Docker Orchestration

Dalam pengembangan produk kami, kami menerapkan microservices, yaitu memisah services menjadi front-end dan back-end. Dalam arsitektur microservices, aplikasi dipecah menjadi berbagai service yang masing-masing dikemas dalam wadah yang terpisah. Manfaatnya adalah bahwa container dapat diskalakan dan hanya berlangsung sesaat. Tetapi, walaupun dapat diskalakan, skalabilitas (scalability) adalah sebuah tantangan. Sebagai ilustrasi, jika kita punya 200 containers dan 45 aplikasi, pengaturan dari container akan semakin sulit, maka dari itu Docker Orchestration akan sangat berguna dalam membantu proses manajemen & scaling container. Docker Orchestration adalah hal-hal yang berkaitan dengan pengelolaan life-cycle dari container, terutama di lingkungan yang besar dan dinamis.

Dikutip dari artikel NewRelic, developer dapat menggunakan docker orchestration untuk mengontrol dan mengotomatisasi banyak tugas, seperti penyediaan dan penyebaran container, redundansi dan ketersediaan container, perpindahan container dari satu host ke host lain jika ada kekurangan sumber daya di host, atau jika host mati, konfigurasi aplikasi terkait dengan container yang menjalankannya, dan masih banyak lagi.

Implementasi Docker

Pertama-tama, sebelum mulai kita perlu meng-install Docker.

Kemudian, kita membuat sebuah image yaitu sebuah file bernama Dockerfile. Image tersebut berisi file proyek yang ingin dieksekusi dan nantinya siap dijalankan pada suatu container. Di dalam Dockerfile kita perlu mendefinisikan bagaimana aplikasi tersebut siap dieksekusi pada saat perintah docker dijalankan ketika runtime.

Berikut adalah contoh isi dari Dockerfile dari tim kami:

### DockerfileFROM python:3.8

ENV PYTHONUNBUFFERED 1

ENV PYTHONDONTWRITEBYTECODE 1

RUN mkdir /app

WORKDIR /app

COPY requirements.txt /app/

RUN pip install -r requirements.txt

COPY .env .env.staging

COPY . /app/

FROM digunakan untuk memberitahu image docker mana yang akan kita pakai.

RUN digunakan untuk menjalankan command / perintah.

WORKDIR berfungsi untuk mendefinisikan folder yang akan kita gunakan.

ENV digunakan untuk mengatur environmental variables.

COPY digunakan untuk menyalin / meng-copy file atau direktori dari source dan menambahkannya ke file system dari container di path tujuan.

Kemudian, pastikan posisi path dari proyek kita berada, dan kita harus build image tersebut dengan perintah berikut:

docker build -t <nama-image>:<tag> .

Pada proyek kami nama dan tag dari image yang di build sebagai berikut:

docker build -t mkppl-backend:latest .

Setelah itu, kita jalankan container (dari image) dengan perintah :

docker run -p 8000:8000 mkppl-backend:latest

Docker Compose

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a Compose file to configure your application’s services. Then, using a single command, you create and start all the services from your configuration.

Docker compose dapat membantu kita dalam menyimpan konfigurasi dalam file, berarti semua perubahan dependency service, seperti versi database dan service lain dapat dimasukkan dalam VCS (Version Control System).

Dalam proyek kami, kami menggunakan PostgreSQL sebagai database management system dan Django sebagai back-end.

Berikut adalah langkah-langkah yang perlu dilakukan untuk menggunakan Docker Compose:

  1. Memastikan image dari PostgreSQL atau DBMS lain sudah didefinisikan dalam file docker-compose.yml
  2. Mendefinisikan image Dockerfile dari proyek yang dikerjakan (seperti yang dijelaskan pada bagian sebelumnya)
  3. Mendefinisikan file docker-compose.yml, yang berisi environment yang dibutuhkan untuk masing-masing service. Service yang digunakan oleh kami, yaitu db (database-PostgreSQL) dan web (backend-django).

Berikut adalah file docker-compose.yml dari tim kami:

version: "3.7"
services:
db:
image: postgres
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
ports:
- "5432"
volumes:
- ./db_backend:/var/lib/postgresql/data/
networks:
- backend
web:
build: .
command: python3 manage.py runserver 0.0.0.0:9000 --settings=sip.settings.staging
volumes:
- .:/app
- ./sip/settings/static:/app/static
environment:
SECRET_KEY: ${SECRET_KEY}
DB_NAME: ${DB_NAME}
DB_USER: ${DB_USER}
DB_PASS: ${DB_PASS}
DB_HOST: ${DB_HOST}
DB_PORT: ${DB_PORT}
ports:
- "8001:9000"
depends_on:
- db
networks:
- backend
networks:
backend:
driver: bridge

version: format dari compose file
services: container apa yang digunakan
image: image apa yang digunakan
ports: port mana yang diikat dengan image
depends_on: dependency dari image
environment: environment yang digunakan berdasarkan dependency

Setelah file docker-compose.yml didefinisikan, selanjutnya kita perlu menjalankan perintah sebagai berikut:

docker-compose builddocker-compose up -d

Untuk melihat output yang dikeluarkan jalankan perintah berikut:

docker-compose logs -f

Jika sudah selesai, maka servis dapat dimatikan dengan perintah

docker-compose down

Lesson Learned

Dalam mengembangkan produk aplikasi yang kami kembangkan, saya bisa belajar banyak hal terutama yang terkait pada fase development, seperti arsitektur dari software dan penggunaan framework & library baru yang sebelumnya belum pernah saya pahami lebih dalam. Dalam hal ini, saya sendiri sebagai developer harus bisa beradaptasi dengan hal yang baru dan dengan environment yang berbeda-beda. Saya juga dituntut untuk berpikiran terbuka (open-minded) dan selalu terus berkembang.

Docker merupakan sesuatu hal yang sedang “happening” karena lebih efektif dan efisien dibandingkan menggunakan hypervisor atau virtual machine. Dengan adanya Docker, Docker dapat menyatukan file dan aplikasi menggunakan sistem operasi yang bersama-sama beserta dependencies-nya. Beberapa pelajaran yang saya dapatkan dari Docker di proyek kami, kita tidak perlu khawatir untuk menjalankan sebuah aplikasi dalam environment yang berbeda. Saya juga belajar bahwa menggunakan Docker itu lebih mudah di-scale untuk skala yang lebih besar, membutuhkan lebih sedikit space, memiliki efisiensi yang tinggi, dan waktu booting yang pendek. Walaupun memang Docker adalah sesuatu yang “happening”, kita harus paham kenapa sebuah teknologi tersebut dapat bermanfaat bagi proyek aplikasi kita dan bagaimana mekanisme hal tersebut berjalan. Walaupun saya baru belajar mengenai Docker pada proyek PPL ini, saya bisa mengetahui mengenal lebih jauh tentang Docker dan mungkin mempertimbangkan untuk menggunakannya di masa yang akan datang.

--

--