Skip to content

Latest commit

Β 

History

History
363 lines (249 loc) Β· 10.4 KB

File metadata and controls

363 lines (249 loc) Β· 10.4 KB

πŸ“š Panduan Prinsip & Istilah Penting dalam Dunia Coding

🎯 Pengantar

Dokumen ini berisi kumpulan prinsip, konsep, dan istilah penting yang wajib dipahami oleh setiap developer. Prinsip-prinsip ini akan membantu Anda menulis kode yang lebih baik, mudah dipelihara, dan profesional.


πŸ—οΈ Prinsip Desain Fundamental

1. DRY (Don't Repeat Yourself)

Jangan Ulangi Dirimu Sendiri

Prinsip ini mengajarkan untuk menghindari duplikasi kode. Setiap bagian pengetahuan atau logika harus memiliki satu representasi yang jelas dan otoritatif dalam sistem.

Mengapa penting?

  • Mengurangi kesalahan saat update (cukup ubah di satu tempat)
  • Mempermudah maintenance
  • Menghemat waktu dan usaha

Contoh Buruk:

# Menghitung diskon untuk berbagai produk
harga_buku = 100000
diskon_buku = harga_buku * 0.1
harga_akhir_buku = harga_buku - diskon_buku

harga_pensil = 5000
diskon_pensil = harga_pensil * 0.1
harga_akhir_pensil = harga_pensil - diskon_pensil

Contoh Baik:

def hitung_diskon(harga, persentase_diskon=0.1):
    return harga - (harga * persentase_diskon)

harga_akhir_buku = hitung_diskon(100000)
harga_akhir_pensil = hitung_diskon(5000)

2. KISS (Keep It Simple, Stupid)

Buat Sesederhana Mungkin

Kompleksitas adalah musuh dari eksekusi. Selalu pilih solusi yang paling sederhana yang dapat menyelesaikan masalah.

Mengapa penting?

  • Kode sederhana lebih mudah dipahami
  • Lebih sedikit bug
  • Lebih mudah di-debug dan di-maintain

Contoh Buruk:

// Mengecek apakah angka genap
function isEven(num) {
    if (num === 0) return true;
    else if (num === 1) return false;
    else if (num < 0) return isEven(-num);
    else return isEven(num - 2);
}

Contoh Baik:

function isEven(num) {
    return num % 2 === 0;
}

3. YAGNI (You Aren't Gonna Need It)

Kamu Tidak Akan Membutuhkannya

Jangan tambahkan fungsionalitas sampai benar-benar diperlukan. Hindari over-engineering.

Mengapa penting?

  • Menghemat waktu development
  • Mengurangi kompleksitas yang tidak perlu
  • Fokus pada fitur yang benar-benar dibutuhkan

Contoh: Jangan buat sistem authentication yang super canggih dengan 10 metode login berbeda jika aplikasi Anda hanya butuh login dengan email dan password.

4. SOLID Principles

Kumpulan 5 prinsip desain berorientasi objek yang membuat software lebih mudah dipahami, fleksibel, dan maintainable.

S - Single Responsibility Principle (SRP)

Setiap class harus memiliki satu dan hanya satu alasan untuk berubah.

Contoh Buruk:

class User {
    void createUser() { /* ... */ }
    void deleteUser() { /* ... */ }
    void sendEmail() { /* ... */ }
    void generateReport() { /* ... */ }
}

Contoh Baik:

class User {
    void createUser() { /* ... */ }
    void deleteUser() { /* ... */ }
}

class EmailService {
    void sendEmail() { /* ... */ }
}

class ReportGenerator {
    void generateReport() { /* ... */ }
}

O - Open/Closed Principle

Software entities harus terbuka untuk ekstensi, tapi tertutup untuk modifikasi.

L - Liskov Substitution Principle

Objek dari subclass harus bisa menggantikan objek dari superclass tanpa merusak fungsionalitas.

I - Interface Segregation Principle

Client tidak boleh dipaksa bergantung pada interface yang tidak mereka gunakan.

D - Dependency Inversion Principle

Modul high-level tidak boleh bergantung pada modul low-level. Keduanya harus bergantung pada abstraksi.


🎨 Prinsip Clean Code

5. Boy Scout Rule

Tinggalkan kode lebih bersih dari yang Anda temukan

Setiap kali Anda menyentuh kode, perbaiki sedikit demi sedikit. Refactor nama variabel yang buruk, pecah fungsi yang terlalu panjang, atau hapus kode yang tidak terpakai.

6. Principle of Least Astonishment

Prinsip Kejutan Minimal

Kode harus berperilaku sesuai dengan yang diharapkan. Jangan buat fungsi atau fitur yang mengejutkan pengguna atau developer lain.

Contoh Buruk:

def add_numbers(a, b):
    return a * b  # Nama fungsi menyesatkan!

7. Separation of Concerns (SoC)

Pemisahan Kepentingan

Pisahkan program menjadi bagian-bagian yang berbeda, dimana setiap bagian menangani concern/kepentingan tertentu.

Contoh: Model-View-Controller (MVC) memisahkan:

  • Model: Logika bisnis dan data
  • View: Presentasi/tampilan
  • Controller: Mengatur interaksi antara Model dan View

πŸ”„ Prinsip Development Process

8. Fail Fast

Gagal Cepat

Sistem harus segera melaporkan masalah sedekat mungkin dengan sumbernya. Jangan biarkan error tersembunyi.

def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")  # Fail fast!
    return a / b

9. Convention Over Configuration

Konvensi di Atas Konfigurasi

Framework atau library harus menyediakan default yang masuk akal, sehingga developer hanya perlu mengkonfigurasi hal-hal yang berbeda dari standar.

Contoh: Ruby on Rails otomatis mencari model User di file app/models/user.rb

10. Composition Over Inheritance

Komposisi di Atas Pewarisan

Lebih baik membuat objek dari kumpulan komponen kecil daripada membuat hierarki inheritance yang kompleks.


πŸ’‘ Istilah Penting Lainnya

11. Technical Debt

Hutang Teknis

Konsekuensi dari memilih solusi cepat/mudah sekarang dibanding solusi yang lebih baik yang membutuhkan waktu lebih lama. Seperti hutang finansial, technical debt menumpuk "bunga" berupa kerja ekstra di masa depan.

12. Code Smell

Bau Kode

Indikasi bahwa ada sesuatu yang mungkin salah dengan kode. Bukan bug, tapi tanda bahwa kode perlu di-refactor.

Contoh Code Smell:

  • Fungsi terlalu panjang (>20 baris)
  • Terlalu banyak parameter (>3-4)
  • Komentar yang menjelaskan kode buruk
  • Duplikasi kode
  • God Class (class yang tahu/melakukan terlalu banyak)

13. Refactoring

Refaktorisasi

Proses restrukturisasi kode tanpa mengubah perilaku eksternalnya. Tujuannya membuat kode lebih bersih, readable, dan maintainable.

14. MVP (Minimum Viable Product)

Produk Minimum yang Layak

Versi produk dengan fitur minimal yang cukup untuk memuaskan early adopters dan memberikan feedback untuk development selanjutnya.

15. API (Application Programming Interface)

Interface yang memungkinkan aplikasi berbeda untuk berkomunikasi satu sama lain. Seperti "kontrak" yang mendefinisikan bagaimana software components berinteraksi.

16. CI/CD

  • CI (Continuous Integration): Praktik menggabungkan perubahan kode ke main branch sesering mungkin
  • CD (Continuous Delivery/Deployment): Otomasi proses release software

17. TDD (Test-Driven Development)

Pengembangan Berbasis Test

Metodologi dimana Anda menulis test terlebih dahulu, baru kemudian menulis kode untuk membuat test tersebut pass.

Siklus TDD:

  1. Red: Tulis test yang fail
  2. Green: Tulis kode minimal untuk membuat test pass
  3. Refactor: Perbaiki kode tanpa merusak test

18. Agile & Scrum

Agile: Metodologi pengembangan software iteratif dan incremental Scrum: Framework Agile dengan sprint, daily standup, dan retrospective

19. Version Control

Sistem yang merekam perubahan file dari waktu ke waktu. Git adalah contoh paling populer.

20. Microservices vs Monolithic

  • Monolithic: Aplikasi dibangun sebagai satu unit besar
  • Microservices: Aplikasi dipecah menjadi services kecil yang independent

πŸ“Š Prinsip Performance & Optimization

21. Premature Optimization

Optimasi Prematur

"Premature optimization is the root of all evil" - Donald Knuth

Jangan optimalkan performa sebelum Anda tahu dimana bottleneck-nya. Fokus dulu pada kode yang benar dan readable.

22. Big O Notation

Cara mendeskripsikan kompleksitas waktu/ruang dari algoritma:

  • O(1): Constant time
  • O(log n): Logarithmic time
  • O(n): Linear time
  • O(nΒ²): Quadratic time

23. Caching

Menyimpan hasil komputasi untuk digunakan kembali nanti, menghindari kalkulasi ulang yang mahal.


πŸ›‘οΈ Prinsip Security

24. Principle of Least Privilege

Prinsip Hak Akses Minimal

Berikan user atau proses hanya akses minimum yang diperlukan untuk menyelesaikan tugasnya.

25. Defense in Depth

Pertahanan Berlapis

Jangan andalkan satu layer security. Gunakan multiple layers untuk melindungi sistem.


🎯 Best Practices Umum

26. Code Review

Proses dimana developer lain memeriksa kode sebelum di-merge. Membantu menemukan bug, sharing knowledge, dan menjaga kualitas kode.

27. Documentation

Kode yang baik adalah self-documenting, tapi dokumentasi tetap penting untuk:

  • API documentation
  • Setup instructions
  • Architecture decisions
  • Complex business logic

28. Naming Convention

Gunakan nama yang deskriptif dan konsisten:

# Buruk
def calc(x, y):
    return x * 0.1 + y

# Baik  
def calculate_total_with_tax(price, tax_amount):
    return price * 0.1 + tax_amount

29. Comments

Komentar harus menjelaskan "mengapa", bukan "apa":

// Buruk: Menambah 1 ke counter
counter++;

// Baik: Increment counter untuk menghindari race condition
// saat multiple threads mengakses resource yang sama
counter++;

30. Error Handling

Selalu handle error dengan graceful. Jangan biarkan aplikasi crash tanpa penjelasan.

try:
    result = risky_operation()
except SpecificError as e:
    log_error(e)
    return default_value

πŸ“š Kesimpulan

Prinsip-prinsip ini bukan aturan kaku, melainkan panduan untuk membantu Anda menjadi developer yang lebih baik. Ingat:

  1. Konteks adalah raja - Tidak semua prinsip cocok untuk semua situasi
  2. Belajar terus menerus - Dunia tech selalu berkembang
  3. Praktik membuat sempurna - Terapkan prinsip-prinsip ini dalam proyek nyata
  4. Kolaborasi - Diskusikan dengan tim untuk best practices yang sesuai

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." - Martin Fowler


πŸ”— Referensi untuk Belajar Lebih Lanjut

  • Clean Code by Robert C. Martin
  • The Pragmatic Programmer by David Thomas & Andrew Hunt
  • Design Patterns: Elements of Reusable Object-Oriented Software
  • Refactoring by Martin Fowler
  • The Clean Coder by Robert C. Martin

Dokumen ini adalah living document yang akan terus diperbarui seiring perkembangan best practices dalam dunia software development.