Dev Notes
Gaji Developer Bukan Soal Hafal Syntax: Ini Skill yang Bikin Value Lu Naik
Mengapa problem framing, business impact, dan ownership jauh lebih dihargai hiring manager ketimbang sekadar hafal syntax dan framework terbaru.

Banyak developer terjebak dalam ilusi bahwa semakin banyak framework, library, atau syntax esotaris yang mereka hafal, semakin mahal harga mereka di pasar kerja. Setiap ada framework JavaScript baru rilis minggu ini, mereka buru-buru ganti stack. Begitu ada bahasa pemrograman baru yang sedang hype, mereka langsung buat ulang side project mereka.
Tapi begitu masuk sesi interview senior engineer atau negosiasi gaji di perusahaan scale-up dan unicorn, realitas menghantam keras. Hiring manager tidak peduli lu hafal 50 metode Array.prototype di luar kepala atau bisa bikin server HTTP murni pakai Rust dalam 5 menit tanpa lihat dokumentasi.
Pertanyaan yang bikin gaji lu melesat naik dari belasan juta ke puluhan juta selalu berkisar di area ini:
- "Berapa biaya infrastruktur yang berhasil lu hemat saat melakukan optimasi ini?"
- "Gimana cara lu memastikan sistem pembayaran tidak double charge saat traffic spike Harbolnas?"
- "Kenapa lu pilih arsitektur ini daripada solusi yang lebih sederhana?"
Perusahaan membayar mahal engineer bukan karena kemampuan mereka mengetik teks di editor, melainkan kemampuan menyelesaikan masalah bisnis menggunakan perangkat lunak. Artikel ini membedah tiga skill inti—Problem Framing, Business Impact, dan Ownership—lengkap dengan implementasi kode konkret yang membedakan junior ticket-taker dengan high-value engineer.
1. Problem Framing: Jangan Cuma Jadi Tukang Ketik Tiket JIRA

Developer kelas bawah menerima tiket JIRA, membaca spesifikasi teknis, lalu langsung membuka kode untuk mulai ngetik. Developer kelas atas menerima tiket JIRA, mempertanyakan asumsi bisnis di baliknya, memahami batasan sistem, lalu merancang solusi paling efisien yang sering kali membutuhkan kode lebih sedikit.
Problem framing adalah kemampuan mentranslasikan masalah bisnis yang samar menjadi masalah rekayasa sistem yang terdefinisi dengan jelas.
Mari kita lihat perbedaan konkret dalam penulisan kode. Bayangkan ada kebutuhan bisnis: "Sistem checkout eCommerce sering timeout saat campaign flash sale karena semua request menembak database secara bersamaan."
Pendekatan Naif (Hanya Hafal Syntax Framework)
Developer yang hanya fokus pada syntax akan membuat API endpoint standar, menambahkan try-catch, lalu menyalahkan database kalau overload.
// naive-checkout.ts
import { Request, Response } from 'express';
import { db } from './database';
export async function handleCheckoutNaive(req: Request, res: Response) {
try {
const { userId, productId, quantity } = req.body;
// 1. Cek stok langsung ke SQL DB (Bottleneck 1)
const product = await db.query('SELECT stock FROM products WHERE id = $1', [productId]);
if (product.rows[0].stock < quantity) {
return res.status(400).json({ message: 'Stok habis' });
}
// 2. Potong stok (Bottleneck 2 - Race condition berisiko tinggi)
await db.query('UPDATE products SET stock = stock - $1 WHERE id = $2', [quantity, productId]);
// 3. Buat order
const order = await db.query(
'INSERT INTO orders (user_id, product_id, quantity) VALUES ($1, $2, $3) RETURNING id',
[userId, productId, quantity]
);
return res.status(200).json({ success: true, orderId: order.rows[0].id });
} catch (error) {
// Mengembalikan error generic tanpa logging kontekstual atau mekanisme pemulihan
return res.status(500).json({ error: 'Internal Server Error' });
}
}Pendekatan Value-Driven (Problem Framing + Defensive Design)
Engineer berpengalaman memikirkan: idempotency (agar user tidak terbayar dua kali saat koneksi terputus), atomic operations di level cache/in-memory, serta telemetry untuk memantau performa.
// resilient-checkout.ts
import { Request, Response } from 'express';
import { redisClient } from './redis';
import { db } from './database';
import { metrics } from './telemetry';
export async function handleCheckoutResilient(req: Request, res: Response) {
const idempotencyKey = req.headers['x-idempotency-key'] as string;
const { userId, productId, quantity } = req.body;
if (!idempotencyKey) {
return res.status(400).json({ error: 'Header X-Idempotency-Key wajib ada' });
}
// 1. Cek Idempotency: Cegah double charge akibat retry dari client
const cachedResponse = await redisClient.get(`idempotency:${idempotencyKey}`);
if (cachedResponse) {
metrics.increment('checkout.idempotent_hit');
return res.status(200).json(JSON.parse(cachedResponse));
}
// 2. Atomic Stock Decrement menggunakan Redis (Menghindari DB Row Locking Overhead)
const stockKey = `stock:${productId}`;
const remainingStock = await redisClient.decrby(stockKey, quantity);
if (remainingStock < 0) {
// Rollback atomic counter jika stok kurang dari nol
await redisClient.incrby(stockKey, quantity);
metrics.increment('checkout.out_of_stock');
return res.status(400).json({ error: 'Stok produk habis' });
}
try {
// 3. Simpan transaksi ke Database utama secara asinkron atau terisolasi
const orderId = await db.transaction(async (trx) => {
const res = await trx.query(
'INSERT INTO orders (user_id, product_id, quantity, idempotency_key) VALUES ($1, $2, $3, $4) RETURNING id',
[userId, productId, quantity, idempotencyKey]
);
return res.rows[0].id;
});
const responseData = { success: true, orderId, status: 'SUCCESS' };
// 4. Cache hasil selama 24 jam untuk respon idempotency berikutnya
await redisClient.setex(`idempotency:${idempotencyKey}`, 86400, JSON.stringify(responseData));
metrics.increment('checkout.success');
return res.status(200).json(responseData);
} catch (error) {
// Rollback Redis stock counter jika penulisan ke DB gagal
await redisClient.incrby(stockKey, quantity);
metrics.increment('checkout.db_failure');
console.error(`[Checkout Failure] User: ${userId}, Key: ${idempotencyKey}`, error);
return res.status(500).json({ error: 'Gagal memproses pesanan, silakan coba lagi' });
}
}Bedah Kode & Perbedaan Mindset:
- Idempotency Header: Penanganan retries secara aman. Kalau aplikasi seluler klien kehilangan koneksi lalu mengirim request ulang, server tidak akan memotong stok dua kali atau membuat dua transaksi berbeda.
- Atomic Operations (`decrby`): Menghilangkan lock contention pada PostgreSQL saat ribuan user checkout serentak. Beban bergeser ke memory-based datastore (Redis) yang mampu menangani puluhan ribu operations per second.
- Telemetry & Resilience: Penambahan
metrics.incrementmemberikan gambaran real-time kepada tim bisnis dan infra mengenai rasio sukses, kegagalan DB, dan stok habis.
2. Mengukur Business Impact: Code Lu Bikin Duit Masuk atau Hemat Cost?

Hiring manager kelas atas tidak akan terkesan jika lu bilang: "Gua refactor backend pakai arsitektur Clean Domain-Driven Design dengan 12 layer interface."
Mereka akan terkesan kalau lu bilang: "Gua mengoptimasi layer query dan caching backend, menurunkan p99 latency dari 1200ms ke 180ms, yang berdampak pada kenaikan checkout conversion rate sebesar 4.2% dan menghemat tagihan AWS RDS sebesar $3,500 per bulan."
Mari kita bandingkan masalah klasik N+1 Query Problem yang sering bikin database jebol dan tagihan cloud membengkak.
Masalah: Query Berulang (N+1 Query)
// bad-analytics.ts
import { db } from './database';
// Mengambil 1000 user beserta detail langganan (subscription) mereka secara terpisah
export async function getUsersWithSubscriptionNaive() {
// Query 1: Ambil 1000 user
const users = await db.query('SELECT id, name, email FROM users LIMIT 1000');
const result = [];
for (const user of users.rows) {
// Executing Query N kali (1000 kali query tambahan!)
const sub = await db.query('SELECT plan, status FROM subscriptions WHERE user_id = $1', [user.id]);
result.push({
...user,
subscription: sub.rows[0] || null
});
}
return result;
}Kode di atas memicu 1001 kali round-trip network antara backend dan database. Jika setiap query butuh waktu 2ms, total latensi API ini mencapai 2.000ms (2 detik) hanya untuk mengambil 1000 data. Database CPU akan meloncat ke 100%.
Solusi Value-Driven: Batching & Efficient Joins
// optimized-analytics.ts
import { db } from './database';
export async function getUsersWithSubscriptionOptimized() {
// Hanya 1 Single Query menggunakan SQL JOIN
const query = `
SELECT
u.id,
u.name,
u.email,
s.plan,
s.status
FROM users u
LEFT JOIN subscriptions s ON u.id = s.user_id
LIMIT 1000;
`;
const start = opacityPerformanceNow();
const { rows } = await db.query(query);
const duration = opacityPerformanceNow() - start;
console.log(`Query dieksekusi dalam ${duration.toFixed(2)}ms`);
return rows.map(row => ({
id: row.id,
name: row.name,
email: row.email,
subscription: row.plan ? { plan: row.plan, status: row.status } : null
}));
}
function opacityPerformanceNow(): number {
return Number(process.hrtime.bigint()) / 1000000;
}Hasil Pengukuran Dampak Bisnis:
- Latensi: Turun dari 2000ms menjadi 12ms.
- Database Connection Load: Berkurang 99.9%.
- Cost Impact: Perusahaan tidak perlu me-upgrade instance PostgreSQL ke tier
$800/bulandi AWS RDS. Cukup bertahan di tier$150/bulan.
Seorang engineer yang menyajikan data seperti ini di resume atau review tahunan punya posisi tawar jauh lebih kuat untuk meminta kenaikan gaji dibanding engineer yang sekadar menulis "Ahli menggunakan PostgreSQL".
3. Ownership: Berani Bertanggung Jawab Saat System Meledak
Sikap paling membunuh karir developer adalah frasa: "Di laptop gua jalan kok, berarti salah orang infra / devops."
high-value engineer memiliki sikap Ownership dari hulu ke hilir:
- Rancangan yang defensif: Menyiapkan penanganan ketika dependensi pihak ketiga (payment gateway, AI API, SMS provider) mati.
- Observability: Menuliskan log dan tracing yang jelas sehingga saat ada error pukul 02.00 pagi, tim pendukung bisa langsung tahu penyebabnya tanpa menebak-nebak.
- Graceful Degradation: Jika servis rekomendasi mati, halaman utama aplikasi tidak boleh ikut white screen.
Berikut adalah pola Circuit Breaker dan Fallback Mechanism yang biasa ditulis oleh engineer berpengalaman untuk menjaga uptime sistem.
// resilient-service.ts
interface CircuitBreakerOptions {
failureThreshold: number; // Jumlah kegagalan sebelum circuit dibuka
cooldownPeriodMs: number; // Waktu tunggu sebelum mencoba lagi
}
export class CircuitBreaker {
private failureCount = 0;
private state: 'CLOSED' | 'OPEN' | 'HALF-OPEN' = 'CLOSED';
private nextAttempt = Date.now();
constructor(private options: CircuitBreakerOptions) {}
async execute<T>(action: () => Promise<T>, fallback: () => Promise<T>): Promise<T> {
if (this.state === 'OPEN') {
if (Date.now() > this.nextAttempt) {
this.state = 'HALF-OPEN';
} else {
// Sistem sedang DOWN, langsung panggil fallback tanpa membebankan provider
return await fallback();
}
}
try {
const result = await action();
this.reset();
return result;
} catch (error) {
this.handleFailure();
console.error(`[CircuitBreaker] Failure caught. State: ${this.state}`, error);
return await fallback();
}
}
private handleFailure() {
this.failureCount++;
if (this.failureCount >= this.options.failureThreshold) {
this.state = 'OPEN';
this.nextAttempt = Date.now() + this.options.cooldownPeriodMs;
console.warn(`[CircuitBreaker] Threshold reached. Circuit OPEN for ${this.options.cooldownPeriodMs}ms`);
}
}
private reset() {
this.failureCount = 0;
this.state = 'CLOSED';
}
}
// Contoh Penggunaan saat memanggil Third-Party Recommendation Engine
const breaker = new CircuitBreaker({ failureThreshold: 3, cooldownPeriodMs: 30000 });
export async function getProductRecommendations(userId: string) {
return breaker.execute(
// Primary Action: Panggil Third-party AI Recommendation API
async () => {
const response = await fetch(`https://api.external-ai.com/recommend/${userId}`, { timeout: 2000 } as any);
if (!response.ok) throw new Error('API External Down');
return await response.json();
},
// Fallback Action: Kembalikan produk terlaris statis jika API utama meledak
async () => {
console.log(`[Fallback Triggered] Serving static top-selling products for user: ${userId}`);
return [
{ id: 'p1', name: 'Item Terlaris A (Fallback)' },
{ id: 'p2', name: 'Item Terlaris B (Fallback)' }
];
}
);
}Mengapa Pola Ini Menaikkan Value Lu?
Ketika provider rekomendasi luar mengalami outage, aplikasi tempat lu bekerja tetap bisa diakses oleh pelanggan. Transaksi checkout tetap berjalan, bisnis tidak kehilangan pendapatan, dan tim CS tidak dibanjiri komplain. Hiring manager dan CTO mencari engineer yang berpikir sampai pada tahap kegagalan seperti ini.
4. Checklist Actionable: Cara Naikkan Value Lu Mulai Hari Ini
Jika lu ingin menaikkan nilai tawar dan gaji dalam 3-6 bulan ke depan, hentikan kebiasaan membaca dokumentasi framework baru setiap malam. Alihkan fokus ke langkah-langkah konkret berikut:
1. Mulai Buat "Brag Document"
Jangan mengandalkan ingatan saat sesi performance review. Catat semua kontribusi teknis lu dalam bentuk metrik bisnis:
- Bukan: "Mengubah query database pengguna."
- Tapi: "Mengoptimasi indeks PostgreSQL pada tabel
users, menurunkan waktu query dari 450ms ke 12ms, menghemat 40% CPU DB saat peak load."
2. Tanya "Kenapa" Sebelum Menulis Kode
Setiap kali Product Manager memberikan PRD (Product Requirement Document) atau tiket JIRA:
- "Apa indikator keberhasilan (KPI) dari fitur ini?"
- "Berapa proyeksi traffic atau volume transaksi untuk fitur ini dalam 6 bulan ke depan?"
- "Apakah ada alternatif yang lebih mudah tanpa perlu membuat infrastruktur baru?"
3. Kuasai System Design & Observability
Pahami cara kerja caching layers, load balancing, message queues (RabbitMQ/Kafka), database indexing, serta perkakas observability seperti Prometheus, Datadog, atau Grafana. Engineer yang bisa membaca grafik latensi dan menemukan bottleneck sistem dalam hitungan menit jauh lebih berharga dibanding engineer yang hanya hafal perintah Git.
Kesimpulan
Menghafal syntax hanyalah entry barrier untuk menjadi software engineer. Itu skill dasar yang akan semakin terkomoditisasi oleh alat bantu AI seperti GitHub Copilot atau LLM lainnya.
Yang tidak bisa digantikan oleh AI dan paling dicari oleh hiring manager dengan anggaran gaji besar adalah:
- Problem Framing: Kemampuan membedah masalah rumit menjadi arsitektur perangkat lunak yang sederhana dan aman.
- Business Impact: Kemampuan menghubungkan baris kode dengan efisiensi biaya atau peningkatan pendapatan perusahaan.
- Ownership: Keberanian bertanggung jawab atas ketersediaan, keandalan, dan keberlanjutan sistem di lingkungan produksi.
Mulai ubah cara pandang lu hari ini. Jangan lagi bertanya "Pakai framework apa yang paling keren?", tapi tanyakan "Bagaimana kode yang gua tulis hari ini bikin bisnis tempat gua bekerja jadi lebih efisien dan tangguh?"
Butuh penyesuaian khusus untuk project Anda?
Jika situasi operasional atau arsitektur sistem bisnis Anda membutuhkan solusi kustom, diskusikan langsung bersama tim engineer kami. Anda juga bisa melihat rincian layanan vour.dev atau menghitung estimasi biaya project lebih dulu.
Mulai Project