Software engineer
Version Control System
Digunakan untuk mecatat perubahan/manage changes pada source code, track history of
changes, facilitates collaboration, enables rollback, supports branching and merging.
Centralized version control system terdapat single centar repository tiap user synchronize.
Distributed version control system memiliki local copy of repository
Aspect Centralized Distributed
Repository Single central Multiple local
server copies
Offline access Limited Full, can do without
connection
Collaboration Sequential Parallel
commits, update development,
dari main update from copy
then push to main
Performance Slower on Faster due local
operation
Use case Small terms, Larger projects,
simple projects open source
Git fundamentals
Repository, penyimpanan yang berisi file project beserta history perubahan
● Local repository, local device
● Remote repository, (server like github)
Commit, snapshot/perubahan yang terjadi di repository (imagine checkpoint).
Komponennya ada dua, commit message dan commit Hash.
Branch, cabang dari kode utama, memungkinkan pengembangan terpisah secara paralel,
ada main dan features branches. (Pohon banyak cabang dan dimerge ke batang)
Merge, branch dengan development beda beda digabung menjadi satu
● Fast forward merge, no diverging changes only one way
● Three way merge, terdapat penyimpangan pada saat branch digabung 2 into 1
Collaborative workflow in git
● Forking workflow, fork repository, change, submit pull request to first repo
● Feature branch workflow, make branch, merge back to main
● Gitflow workflow, existed branch from the beginning: master/main, develop, features,
release and hotfix
Advanced git features
● Rebasing, menguban base dari feature branch me titik awal berbeda
● Stashing, temporarily save changes yang belom commit (draft)
● Cherry picking, ngambil commit tertentu dari branch satu buat branch lainnya
Dependency management
Dependency artinya external code/libraries yang dibutuhkan dalam projek. Untuk mencegah
version conflicts.
● Transitive dependency, package yang bergantung sama package lain
● Diamond dependency, gabungan beberapa transitive dependencies (mungkin
menyebabkan conflict antar version)
Misal library A butuh Lib-X v1.0, library B butuh Lib-X v2.0, dan kita pake dua library tersebut
→ bakal konflik karena perbedaan version
One version rule
Hanya satu versi dari sebuah dependency yang boleh dipakai dalam project. Tujuannya
mencegah conflicts & incompatibilities, simplifies builds, dan maintenance & update.
Penerapannya bisa lewat 3 cara:
● Monorepo approach, disimpsan di satu repo
● Sutomated dependency update, tools buat update versi otomatis
● Consistent versioning, memastikan versi yang dipake semua tim sama
Reliability engineering
Kemampuan perangkat lunak untuk beroperasi tanpa kegagalan dalam kondisi tertentu. Hal
ini penting karena untuk kepercayaan pengguna, biays operasional, keamanan.
Metrik reliability
● MTTF (Mean Time To Failure): rata rata waktu sebelum gagal pertama kali
● MTTR (Mean Time To Repair): rata rata waktu untuk memperbaiki setelah kegagalan
● MTBF (Mean Time Between Failure): rata rata waktu antara kegagalan dengan
berikutnya. Semakin tinggi nilainya, semakin baik perangkat:
MTBF = MTTF + MTTR
● Availability: presentase waktu beroperasi dan diakses:
Availability = (MTTF/MTTF+MTTR) x 100%
Merancang arsitektur untuk reliability
Prinsip dasar
● Modularitas: memecah sistem besar menjadi komponen komponen kecil independent
● Redundansi dan replikasi: duplikat dari komponen kritis yang akan membantu jika
komponen utama gagal
● Deteksi dan koreksi error: mendeteksi suatu fungsi tidak berjalan dan
memperbaikinya secara otomatis
● Arsitektur failover: proses otomatis mengalihkan beban ke komponan cadangan saat
kegagalan di utama
Reliability patterns
. Circuit breaker pattern
Ketika ada beban berlebih akan putus untuk melindungi seluruh sistem dari
kerusakan. Keuntungan: mencegah kegagalan berantai, waktu recovery, UX
terjaga dengan fallback system. Contoh:
E-commerce Website → Payment Service
Normal: Order berhasil diproses
Payment Service Down: Circuit breaker OPEN
- User tetap bisa browse dan add to cart
- Checkout menampilkan "Payment temporarily
unavailable, try again later"
- Sistem tidak terus mencoba koneksi yang gagal
- Sistem tidak terus mencoba koneksi yang gagal
. Bulkhead pattern
Imagine titanic, jika satu ruangan bocor sekat akan mencegah air masuk
sehingga kapal tidak tenggelam. Keuntungan: fault isolation, resource
guarantee, better performance monitoring. Contoh:
Streaming Service:
- Stream Video: Dedicated resources
- User Profile: Separate resources
- Recommendation Engine: Isolated resources
- Search Function: Own resource pool
Jika recommendation engine bermasalah, user tetap
bisa streaming dan search.
. Event driven architecture
Imagine radio station, tidak tahu siapa yang mendengarkan, tapi bagi yang
frequency sama akan mendapat informasi sama. Keuntungan: loose coupling
(tidak butuh kenalan), scalability, resilience, flexibility
Contoh:
Online Shopping
Traditional Method:
User places order →
├─ Update inventory (wait...)
├─ Process payment (wait...)
├─ Send confirmation email (wait...)
├─ Update analytics (wait...)
└─ Create shipping label (wait...)
Total time: 5-10 seconds
Event Driven:
User places order → Publish "OrderCreated" event →
Response immediately
Background processing (parallel):
├─ Inventory Service: Update stock
├─ Payment Service: Process payment
├─ Email Service: Send confirmation
├─ Analytics Service: Update metrics
└─ Shipping Service: Create label
Total response time: <1 second
Measuring and improving software reliability
Measurement techniques:
● Failure tracking: mencatat setiap insiden
● User feedback: mengumpulkan laporan dari pengguna
Improving techniques:
● Refactoring: memperbaiki dan menyederhanakan struktur kode tanpa mengubah
fungsional eksternal
● Automated testing: pengujian secara otomatis setiap perubahan kode
Reliability engineering tools
● Chaos engineering: metode eksperimen untuk meningkatkan ketahanan dengan
menggagalkan secara sengaja. Contoh: chaos monkey dari netflix
● Monitoring tools: visibility real time ke dalam kinerja sistem. Contoh: prometheus
● Testing and automation tools: proses otomatis pengujian untuk mengurangi
kesalahan manusia. Contoh: jenkins
● Incident management: mengelola respon tehadap insiden yang ber eskalasi contoh:
pagerduty
Reliability practices
● Blameless postmortem: setelah setiap kegagalan, mengadakan pertemuan untuk
menganalisis
● Continuous improvement: proses iteratif untuk terus mengukur, belajar dari
kegagalan untuk membuat sistem lebih baik waktu ke waktu
Fault tolerance
Kemampuan sistem untuk tetap beroperasi meskipun ada kegagalan
Techniques:
● Redundancy: menyediakan komponen cadangan, contoh: server mati akan dialihkan
ke server cadangan
● Graceful degradation: jika kegagalan sistem tidak akan mati, tetapi tetap fungsional
dengan berkurang, contoh: tidak dapat menampilkan rokemendasi, tetapi masih bisa
mencari produk
● Recovery mechanism:
. Check pointing and rollback (checkpoint)
. Fallover system (cadangan mengambil alih)
. Self healing mechanism (memperbaiki secara otomatis)
Software testing
Proses mengevaluasi kualitas perangkat dengan mendeteksi bug, memverifikasi
spesifikasi, memvalidasi kebutuhan pengguna, menjamin kualitas, mengurangi resiko
Prinsip
. Testing menunjukkan leberadaan bug
. Exhaustive testing tidak mungkin dilakukan
. Testing dari awal (early testing)
. Defect clustering (error kumpul di area tertentu)
. Pesticide paradox (tes berulang tidak ada bug baru)
. Testing bergantung konteks
. Verifikasi tidak sama dengan validasi
Level testing
● Unit testing: menguji unit terkecil secara individual, contoh: menguji login secara
mandiri
● Integration testing: menguji unit2 yg telah diuji berinteraksi dengan satu sama lain.
Misalnya apakah fungsi login berkomunikasi dengan database secara benar
● System testing: menguji keseluruhan system end to end untuk semua komponen
berfungsi bersama dengan requirements, contoh: pengujian e commerce dari login,
browsing produk hingga checkout
● Acceptance testing: dilakukan dengan perspektif pengguna akhir/user untuk
memverifikasi kebutuhan user
Jenis pengujian
● Functional testing: software berfungsi sesuai dengan spesifikasi contoh: submit
button to page
● Non functional testing: menguji kualitas atribut seperti performa, keamanan dan
usability contoh: page load time
● Regression testing: perubahan atau perbaikan tidak menyebabkan bug baru
● Performa testing: mengukur performance, contoh: seberapa cepat sistem respon jika
100 user mengakses secara bersamaan
● Usability testing: mudah digunakan oleh user sesuai expectation
Teknik pengujian
– Blackbox testing
○ Fokus pada spesifikasi eksternal tanpa lihat struktur, cocok untuk requirement
fungsional
○ Tekniknya:
◆ Equivalence partitioning (membagi input ke kelas)
◆ Boundary value analysis (nilai min, max)
◆ Pairwise testing (dua parameter)
◆ Decision table testing
◆ State transition testing
◆ Use case testing
– Whitebox testing
○ Menggunakan pengetahuan kode internal untuk tes, cocok untuk menguji
logika program
○ Tekniknya:
◆ Statement coverage (setiap statement dijalankan)
◆ Branch coverage (true/false berjalan)
◆ Condition coverage (kondisi dievaluasi ke true or false)
◆ Basis path testing (cyclomatic complexity)
– Greybox testing
○ Gabungan box
○ Tester tahu sebagian logika internal like API
Test planning dan design
● Test plan (dokumen)
● Test case development
● Test execution
● Defect identification and tracking (identification ke perbaikan ke validasi ke close) with
github issue atau jira
Test driven development
Teknik membangun software melalui test untuk memastikan code memenuhi requirements
dan testable dari awal.
Core principles:
● Write a test
● Write a code
● Refactor
Red green refactor cycle
● Red (writing a fail) mendefinikasikan persyaratan sebelum implementasi
● Green (write the minimum code) bikin minimum amount code
● Refactor (improve the code)
DevOps
Pembuatan software ada dua, development team dan operative team, dimana mereka kerja
separately. Development team fokus bikin kode dan operation team fokus pada stabilitas
produk
DevOps adalah pendekatan dalam pembuatan software di mana dua team collaborate.
Tujuan:
● Faster delivery
● Improved quality
● Efficiency and reduced bottleneck
● Customer satisfaction
DevOps principles
● Automation: dilakukan secara otomatis
● Continuous integration: perubahan kode terintegrasi di satu repository
● Continuous delivery: memastikan deployment readiness
● Continuous deployment: automatically di deploy
Benefit DevOps
● Increased deployment frequency
● Reduced failure rate
● Faster time to market
● Improved team morale
DevOps toolchain
● Planning tools
● Version control tools
● Build CI/CD tools: jenkins and travis ci, spinnaker and go cd
● Monitoring and logging tools: prometheus