Wawancara teknis 45 menit adalah tekanan tinggi: kita harus memahami soal, mendiskusikan pendekatan, mengkode solusi, dan menguji — semua sambil berbicara dengan interviewer. Tanpa framework yang jelas, mudah terjebak coding langsung tanpa rencana, atau sebaliknya, terlalu banyak bicara tanpa coding. Pada Chapter ini kita akan membangun framework 4-fase wawancara (Clarify → Plan → Code → Test) dengan estimasi waktu per fase dan daftar aksi konkret. Kita juga akan membahas platform wawancara umum (CoderPad, LeetCode, whiteboard) dan anti-patterns yang harus dihindari. Tujuan akhirnya: wawancara terstruktur, bukan reaksi panik.
Framework 4-Fase: Time Budget 45 Menit #
Wawancara teknis standar berdurasi 45 menit (5 menit Q&A akhir). Waktu harus dialokasikan keempat fase secara seimbang — terlalu lama di satu fase mengorbankan fase lain.
| Fase | Durasi | Tujuan |
|---|---|---|
| 1. Clarify | 5 menit | Pahami soal 100% |
| 2. Plan | 10 menit | Diskusikan pendekatan |
| 3. Code | 20 menit | Implementasi bersih |
| 4. Test | 10 menit | Verifikasi kebenaran |
| Q&A | 5 menit | Pertanyaan ke interviewer |
Fase 1: Clarify (5 Menit) #
Tujuan: pastikan kita memahami soal persis seperti yang dimaksud interviewer. Banyak kandidat langsung coding, hanya untuk mengetahui 20 menit kemudian bahwa mereka solve soal yang salah.
Aksi konkret:
- Tanya edge case: input kosong, n=1, duplikat, nilai max.
- Konfirmasi tipe data:
int,long long, signed/unsigned. - Tanya asumsi: input sorted? unique? boleh modifikasi?
- Restate soal dengan kata sendiri untuk konfirmasi: “Jadi saya diminta mencari … dengan input …, dan output …”.
Fase 2: Plan (10 Menit) #
Tujuan: pilih pendekatan, dapat persetujuan interviewer sebelum coding.
Aksi konkret:
- Brute force dulu + sebut O(time/space).
- Identifikasi bottleneck: bagian mana yang membuat solusi lambat?
- Usulkan optimasi + sebut O baru.
- Bahas trade-off time/space.
- Pilih pendekatan dan dapat persetujuan interviewer: “Apakah Anda setuju saya mulai dengan pendekatan X?”.
Pitfall: jangan terjebak diskusi pendekatan lebih dari 10 menit. Bila ragu antara dua pendekatan, pilih yang lebih sederhana — kita bisa optimasi nanti bila ada waktu.
Fase 3: Code (20 Menit) #
Tujuan: implementasi bersih, terbaca, dan benar.
Aksi konkret:
- Mulai dengan signature fungsi —
vector<int> twoSum(vector<int>& nums, int target). - Coding step-by-step, komentar singkat untuk logika non-trivial.
- Bicarakan saat coding (“think out loud”) — interviewer menilai cara berpikir, bukan hanya hasil.
- Hindari magic number; pakai konstanta bermakna (
const int MOD = 1e9+7;). - Validasi input bila perlu (empty array, out-of-range).
Fase 4: Test (10 Menit) #
Tujuan: verifikasi kode benar dan kompleksitas akhir sesuai.
Aksi konkret:
- Trace sample input dengan kode — tulis variabel dan nilainya.
- Test edge case: n=0, n=1, nilai max, duplikat.
- Cek off-by-one: indeks 0 vs n-1,
<=vs<. - Cek overflow:
long longbila akumulasi besar. - Estimasi time complexity akhir: “Loop utama O(n), hash lookup O(1), total O(n).”
Kode: Framework Interview 4-Fase #
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
using namespace std;
struct InterviewPhase {
string name;
int duration_min;
string goal;
vector<string> actions;
};
vector<InterviewPhase> interviewFramework() {
return {
{"1. Clarify", 5, "Pahami soal 100%",
{
"Tanya edge case: input kosong, n=1, duplikat",
"Konfirmasi tipe data: int, long long, signed/unsigned",
"Tanya asumsi: input sorted? unique?",
"Restate soal dengan kata sendiri untuk konfirmasi"
}},
{"2. Plan", 10, "Diskusikan pendekatan",
{
"Brute force dulu + sebut O",
"Identifikasi bottleneck",
"Usulkan optimasi + sebut O baru",
"Bahas trade-off time/space",
"Pilih pendekatan dan dapat persetujuan interviewer"
}},
{"3. Code", 20, "Implementasi bersih",
{
"Mulai dengan signature fungsi",
"Coding step-by-step, komentar singkat",
"Bicarakan saat coding (think out loud)",
"Hindari magic number; pakai konstanta bermakna",
"Validasi input bila perlu"
}},
{"4. Test", 10, "Verifikasi kebenaran",
{
"Trace sample input dengan kode",
"Test edge case: n=0, n=1, nilai max",
"Cek off-by-one: indeks 0 vs n-1",
"Cek overflow: long long bila perlu",
"Estimasi time complexity akhir"
}},
};
}
void timeBudget() {
cout << "=== Time Budget 45 Menit ===\n\n";
auto phases = interviewFramework();
int total = 0;
cout << left << setw(18) << "Fase" << setw(10) << "Menit" << "Tujuan" << "\n";
cout << "-----------------|---------|---------------------------\n";
for (const auto& p : phases) {
cout << left << setw(18) << p.name
<< setw(10) << p.duration_min
<< p.goal << "\n";
total += p.duration_min;
}
cout << "\nTotal: " << total << " menit (5 menit buffer untuk Q&A akhir)\n";
}
void phaseActions() {
cout << "\n=== Detail Aksi per Fase ===\n\n";
auto phases = interviewFramework();
for (const auto& p : phases) {
cout << p.name << " (" << p.duration_min << " menit)\n";
cout << " Tujuan: " << p.goal << "\n";
cout << " Aksi:\n";
for (size_t i = 0; i < p.actions.size(); ++i) {
cout << " [" << (i+1) << "] " << p.actions[i] << "\n";
}
cout << "\n";
}
}
void commonPlatforms() {
cout << "=== Platform Wawancara Umum ===\n\n";
cout << left << setw(22) << "Platform" << setw(25) << "Fitur Khusus" << "Klien Tipikal" << "\n";
cout << "---------------------|------------------------|-------------------\n";
vector<vector<string>> platforms = {
{"CoderPad", "Editor + compiler", "Startup, mid-size"},
{"HackerRank", "Testing otomatis", "Bank, enterprise"},
{"LeetCode", "Database soal", "Tech companies"},
{"CodeSignal", "Multiple languages", "FAANG"},
{"Google Docs", "Editor sederhana", "Google, manual"},
{"Whiteboard (on-site)","Tanpa compiler", "On-site classic"},
};
for (const auto& p : platforms) {
cout << left << setw(22) << p[0] << setw(25) << p[1] << p[2] << "\n";
}
}
void antiPatterns() {
cout << "\n=== Anti-Patterns dalam Wawancara ===\n\n";
vector<pair<string,string>> bad = {
{"Langsung coding tanpa clarify", "Bisa solve soal salah, sia-sia 20 menit"},
{"Diam saat berpikir", "Interviewer tidak tahu progres; terlihat stuck"},
{"Coding tanpa testing", "Bug tidak terdeteksi sampai akhir"},
{"Terlalu banyak optimasi prematur", "Coding tidak selesai tepat waktu"},
{"Tidak tanya pertanyaan", "Terlihat tidak engaged atau tidak paham"},
{"Defensif saat dihint", "Tunjukkan tidak bisa menerima feedback"},
{"Menyalahkan soal/interviewer", "Sinyal merah profesional"},
};
for (const auto& b : bad) {
cout << " - " << left << setw(40) << b.first << b.second << "\n";
}
}
int main() {
cout << "=== Menyelesaikan Wawancara Teknis ===\n";
cout << "Framework 4-fase: Clarify -> Plan -> Code -> Test\n\n";
timeBudget();
phaseActions();
commonPlatforms();
antiPatterns();
cout << "\n=== Aturan Emas ===\n";
cout << "1. Think out loud - interviewer menilai cara berpikir, bukan hanya hasil\n";
cout << "2. Clarify > speed - 5 menit clarify hemat 20 menit rework\n";
cout << "3. Test wajib - kode yang tidak teruji tidak dianggap selesai\n";
cout << "4. Bila stuck, bicara - interviewer bisa beri hint bila tahu masalahnya\n";
cout << "5. Akhiri dengan summary - tunjukkan refleksi atas solusi\n";
return 0;
}Output yang Dihasilkan:
=== Menyelesaikan Wawancara Teknis ===
Framework 4-fase: Clarify -> Plan -> Code -> Test
=== Time Budget 45 Menit ===
Fase Menit Tujuan
-----------------|---------|---------------------------
1. Clarify 5 Pahami soal 100%
2. Plan 10 Diskusikan pendekatan
3. Code 20 Implementasi bersih
4. Test 10 Verifikasi kebenaran
Total: 45 menit (5 menit buffer untuk Q&A akhir)
=== Detail Aksi per Fase ===
1. Clarify (5 menit)
Tujuan: Pahami soal 100%
Aksi:
[1] Tanya edge case: input kosong, n=1, duplikat
[2] Konfirmasi tipe data: int, long long, signed/unsigned
[3] Tanya asumsi: input sorted? unique?
[4] Restate soal dengan kata sendiri untuk konfirmasi
2. Plan (10 menit)
Tujuan: Diskusikan pendekatan
Aksi:
[1] Brute force dulu + sebut O
[2] Identifikasi bottleneck
[3] Usulkan optimasi + sebut O baru
[4] Bahas trade-off time/space
[5] Pilih pendekatan dan dapat persetujuan interviewer
3. Code (20 menit)
Tujuan: Implementasi bersih
Aksi:
[1] Mulai dengan signature fungsi
[2] Coding step-by-step, komentar singkat
[3] Bicarakan saat coding (think out loud)
[4] Hindari magic number; pakai konstanta bermakna
[5] Validasi input bila perlu
4. Test (10 menit)
Tujuan: Verifikasi kebenaran
Aksi:
[1] Trace sample input dengan kode
[2] Test edge case: n=0, n=1, nilai max
[3] Cek off-by-one: indeks 0 vs n-1
[4] Cek overflow: long long bila perlu
[5] Estimasi time complexity akhir
=== Platform Wawancara Umum ===
Platform Fitur Khusus Klien Tipikal
---------------------|------------------------|-------------------
CoderPad Editor + compiler Startup, mid-size
HackerRank Testing otomatis Bank, enterprise
LeetCode Database soal Tech companies
CodeSignal Multiple languages FAANG
Google Docs Editor sederhana Google, manual
Whiteboard (on-site) Tanpa compiler On-site classic
=== Anti-Patterns dalam Wawancara ===
- Langsung coding tanpa clarify Bisa solve soal salah, sia-sia 20 menit
- Diam saat berpikir Interviewer tidak tahu progres; terlihat stuck
- Coding tanpa testing Bug tidak terdeteksi sampai akhir
- Terlalu banyak optimasi prematur Coding tidak selesai tepat waktu
- Tidak tanya pertanyaan Terlihat tidak engaged atau tidak paham
- Defensif saat dihint Tunjukkan tidak bisa menerima feedback
- Menyalahkan soal/interviewer Sinyal merah profesional
=== Aturan Emas ===
1. Think out loud - interviewer menilai cara berpikir, bukan hanya hasil
2. Clarify > speed - 5 menit clarify hemat 20 menit rework
3. Test wajib - kode yang tidak teruji tidak dianggap selesai
4. Bila stuck, bicara - interviewer bisa beri hint bila tahu masalahnya
5. Akhiri dengan summary - tunjukkan refleksi atas solusiBedah Kode Baris-per-Baris #
struct InterviewPhase { string name; int duration_min; string goal; vector<string> actions; }: model data untuk satu fase. Fieldactionssebagai vector memungkinkan aksi fleksibel — fase berbeda bisa memiliki jumlah aksi berbeda.return { {"1. Clarify", 5, "...", {...}}, ... };: brace-init untuk vector of struct. Pendekatan ini ringkas dan deklaratif — mudah membaca seluruh struktur framework dalam satu blok.auto phases = interviewFramework();:automendeduksi tipe dari return value. Lebih ringkas daripada menulisvector<InterviewPhase>eksplisit.for (const auto& p : phases): iterasi dengan const reference — menghindari copy struct.auto&menangkap tipe kompleks secara otomatis.vector<vector<string>> platforms = { {"CoderPad", "Editor + compiler", "Startup, mid-size"}, ... };: data tabel sebagai vector 2D. Sederhana tetapi fleksibel untuk dataset kecil.vector<pair<string,string>> bad = { ... };: pasangan anti-pattern + konsekuensi.paircocok untuk data 2-field; lebih ringan daripada struct khusus.
Karakteristik Platform Wawancara #
Setiap platform punya karakteristik berbeda yang mempengaruhi strategi:
| Platform | Editor | Compiler | Strategi |
|---|---|---|---|
| CoderPad | Ya | Ya (live) | Bisa langsung run test; manfaatkan untuk verifikasi cepat |
| LeetCode | Ya | Ya (submit) | Submit berarti AC; gunakan sample test sebelum submit |
| HackerRank | Ya | Ya | Test otomatis; baca format input/output dengan teliti |
| Google Docs | Ya | Tidak | Kompilasi mental; tidak bisa test run; lebih fokus pseudocode |
| Whiteboard | Manual | Tidak | Tunjukkan struktur tinggi; interviewer menilai approach |
Aturan Emas Wawancara #
- Think out loud — interviewer menilai cara berpikir, bukan hanya hasil. Bila diam, mereka tidak tahu progres.
- Clarify > speed — 5 menit clarify hemat 20 menit rework. Tanya edge case sebelum coding.
- Test wajib — kode yang tidak teruji tidak dianggap selesai. Selalu trace sample + edge case.
- Bila stuck, bicara — interviewer bisa beri hint bila tahu masalahnya. Diam menghindari hint.
- Akhiri dengan summary — tunjukkan refleksi: “Solusi saya O(n) time, O(n) space. Bila input sorted, bisa O(n) time O(1) space dengan two pointers.”
Manajemen Saat Stuck #
Saat mengalami kebuntuan, jangan diam. Strategi:
| Situasi | Tindakan |
|---|---|
| Lupa syntax | “Saya biasanya pakai X untuk ini, mari saya cek signature” — interviewer biasanya membantu |
| Tidak tahu algoritma | “Saya belum pernah lihat soal seperti ini, mari saya pikirkan dari brute force dulu” |
| Bug misterius | “Mari saya trace dengan sample input, baris per baris” |
| Waktu hampir habis | “Saya akan menyelesaikan bagian X dulu, sisanya bisa saya jelaskan secara teori” |
| Salah pendekatan | “Setelah saya lihat lebih dekat, pendekatan ini ada masalah dengan X. Mari saya revisi” |
Pertanyaan untuk Interviewer di Akhir #
Akhir wawancara biasanya ada 5 menit untuk kita bertanya. Pilih pertanyaan yang menunjukkan ketertarikan:
- “Tim Anda menggunakan teknologi apa untuk X?”
- “Apa tantangan terbesar tim saat ini?”
- “Bagaimana proses review kode di tim Anda?”
- “Apakah ada peluang belajar [topik tertentu] dalam peran ini?”
- “Bagaimana tim mengukur dampak pekerjaan engineer?”
Hindari: “Berapa gajinya?” (tanyakan ke recruiter, bukan interviewer teknis).
Ringkasan #
- Framework 4-fase: Clarify (5 mnt) → Plan (10 mnt) → Code (20 mnt) → Test (10 mnt).
- Clarify adalah investasi paling murah — 5 menit hemat 20 menit rework.
- Think out loud: interviewer menilai cara berpikir, bukan hanya hasil.
- Test wajib: kode tidak teruji tidak dianggap selesai.
- Bila stuck, bicara — interviewer bisa beri hint bila tahu masalahnya.
- Akhiri dengan summary kompleksitas + pertanyaan untuk interviewer.