MioCraft / Code Có Nghề

Từ đặt tên biến đến vận hành production

Viết cho junior dev và sinh viên năm cuối. Những gì trường không dạy nhưng công việc sẽ đòi hỏi — ví dụ thực tế từ hệ thống quản lý bệnh viện, Java 17 + Spring Boot 3.

150 bài · 13 phần

Không tìm thấy bài viết nào.

P01 Tư duy lập trình 10 bài
01
Code chạy được vẫn bị reject — và đây là lý do
programming
02
Junior nghĩ về feature. Senior nghĩ về change
programming
03
Câu hỏi senior hỏi trước khi viết dòng code đầu tiên
programming
04
Over-engineering — cái bẫy mà sinh viên hay sa vào nhất
programming
05
Under-engineering — cái bẫy ít ai nói đến
programming
06
Technical debt không xấu — xấu là mày không biết mình đang nợ ai
programming
07
Tư duy Failure-first — thiết kế để không sập, không phải để chạy
programming
08
Tư duy Trade-off — không có giải pháp hoàn hảo, chỉ có lựa chọn phù hợp
programming
09
Complexity không chứng minh mày giỏi — đơn giản mới chứng minh mày hiểu sâu
programming
10
Debug chậm không phải vì mày dở — mày đang debug sai cách
programming
P02 Clean Code 14 bài
11
Clean Code không phải code hoàn hảo — là code sống sót qua thời gian
programming
12
Đặt tên biến là kỹ năng, không phải thói quen
programming
13
Function làm "một việc" — nhưng "một việc" nghĩa là gì?
programming
14
Khi nào comment là dấu hiệu code đang có vấn đề
programming
15
Boolean flag — kẻ phá hoại thầm lặng
programming
16
Magic number — bug không có tên nhưng rất khó sửa
programming
17
Đừng nuốt lỗi — hệ thống sẽ trả giá thay mày
programming
18
Code không test được thì chưa bao giờ là Clean Code
programming
19
Refactor là gì — và khi nào thì nên làm
programming
20
Deadline dí không cho phép mày viết code bừa — thực ra là sao?
programming
102
Logging đúng cách — vì sao log của mày đang vô dụng lúc cần nhất
programming
103
Integration Test — tại sao unit test xanh hết mà vẫn deploy ra production bị lỗi
programming
104
Optional<T> — khi nào nên dùng, khi nào không
programming
105
Secrets không được hardcode — Spring profiles và env vars
programming
P03 Kiến trúc phần mềm 12 bài
21
Tại sao Controller/Service/Repository thối theo thời gian
architecture
22
Layered Architecture không phải lúc nào cũng đúng
architecture
23
Business logic đặt sai chỗ — hệ thống sẽ trả giá
architecture
24
Sai boundary một ly, hệ thống đi một dặm
architecture
25
Domain logic không được biết database tồn tại
architecture
26
Use Case mới là trái tim thật sự của hệ thống
architecture
27
DTO vs Entity vs Domain Model — ba thứ khác nhau, và mày cần cả ba
architecture
28
Fat Controller, Fat Service — dấu hiệu kiến trúc đang sai
architecture
29
Framework là công cụ, không phải nền móng
architecture
30
Refactor kiến trúc không phải là viết lại — là chỉnh hướng dần dần
architecture
31
Microservices không phải level up tự động từ Monolith
architecture
32
Kiến trúc thường chết vì con người, không phải vì code
architecture
P04 SOLID 7 bài
33
SOLID — code chạy được vẫn fail vì mày chưa hiểu cái này
programming
34
SRP — một class ôm quá nhiều là mầm mống thảm họa
programming
35
OCP — mỗi lần thêm feature lại sửa code cũ là thiết kế đang sai
programming
36
LSP — kế thừa sai còn nguy hiểm hơn code xấu
programming
37
ISP — interface càng to, code càng yếu
programming
38
DIP — business code mà phụ thuộc DB thì sớm muộn cũng khổ
programming
39
SOLID không làm code tốt hơn nếu mày dùng sai thời điểm
programming
P05 Design Patterns 10 bài
40
Design Pattern không giúp mày viết code tốt hơn — nếu mày dùng nó sai
programming
41
Template Method — pattern mày đang dùng hàng ngày mà không biết tên
programming
42
Strategy vs State — hành vi hay trạng thái đang thay đổi?
programming
43
Observer — tại sao notification không được gọi trong transaction
programming
44
Facade — tại sao KeycloakService tồn tại thay vì gọi thẳng
programming
45
Decorator — kế thừa không sai, sai là mày dùng nó để mở rộng hành vi
programming
46
Proxy — không phải object nào cũng nên được truy cập trực tiếp
programming
47
Command Pattern — khi hành vi cần được điều phối
programming
48
Senior không review code — senior review change
programming
98
Builder Pattern — khi constructor bắt đầu nhận 8 tham số
programming
P06 Database 17 bài
49
Index là gì — và tại sao tạo index rồi query vẫn chậm?
system-design
50
Query Execution Plan — database đang làm gì sau cánh gà
system-design
51
MVCC — vì sao read không block write
system-design
52
Isolation Levels — bốn cấp độ và khi nào mày cần cái nào
system-design
53
Deadlock — vì sao database tự kill query của mày
system-design
54
N+1 Query — bug thầm lặng giết performance từ từ
system-design
55
Normalization vs Denormalization — chuẩn hóa bao nhiêu là đủ?
system-design
56
SQL vs NoSQL — chọn sai là refactor cả đời
system-design
57
Soft Delete — đơn giản hơn mày nghĩ, và phức tạp hơn mày tưởng
system-design
58
Connection Pool — vì sao hàng ngàn request chỉ cần vài chục connection
system-design
99
Database Migration — vì sao schema thay đổi mà không có migration là đang chơi với lửa
system-design
100
Pagination — offset vs cursor, và tại sao page 500 chậm hơn page 1 đến 500 lần
system-design
106
@Transactional sâu hơn — proxy, self-invocation, và rollback rules
programming
127
Soft delete leak — data đã xóa vẫn lọt ra API
system-design
136
Covering index — khi query không cần chạm bảng
system-design
120
Migration zero-downtime — expand-contract
programming
137
Read replica lag — vì sao đọc stale ngay sau khi write
system-design
P07 Backend & Hệ thống 13 bài
59
Request đi qua server như thế nào — từ TCP đến response
system-design
60
Thread per Request vs Event Loop — Spring Boot đang chọn gì và tại sao
system-design
61
Blocking vs Non-Blocking — thread đang làm gì khi chờ I/O
system-design
62
Caching — vì sao server không query database mỗi lần
system-design
63
Cache Stampede — khi cache sập gây sập cả hệ thống
system-design
64
Concurrency — khi nhiều request cùng chạm một tài nguyên
system-design
65
Queue — vì sao không phải lúc nào cũng xử lý request ngay lập tức
system-design
101
JWT là gì — và tại sao token không phải session
system-design
107
CORS — tại sao browser block và config đúng trong Spring
system-design
108
Spring Security filter chain — request đi qua những gì trước controller
system-design
113
WebSocket, SSE, và Polling — khi nào dùng cái nào
system-design
131
API versioning — /v1/ trong URL hay header, và khi nào breaking
programming
132
@Async trong Spring — thread pool và khi transaction không theo
programming
P08 System Design 13 bài
66
System Design là gì — và tại sao code giỏi vẫn làm hệ thống sập
system-design
67
Functional vs Non-functional Requirements — hiểu sai là thiết kế sai
system-design
68
Monolith vs Microservices — chọn sai kiến trúc là đốt cả năm
system-design
69
API Design — vì sao 70% lỗi hệ thống bắt nguồn từ API tệ
system-design
70
Load Balancer — bí mật giúp hệ thống chịu hàng chục nghìn request/giây
system-design
71
Message Queue — khi nào cần, khi nào không
system-design
72
Rate Limiting — hàng rào bảo vệ API khỏi spam và DDoS
system-design
73
Circuit Breaker — vì sao một service chết mà cả hệ thống không sập theo
system-design
74
CAP Theorem — ba thứ không thể có cùng lúc
system-design
109
HTTP status codes đúng cách — tại sao return 200 cho mọi thứ là sai
system-design
139
Circuit Breaker — vì sao một service chậm có thể kéo sập cả hệ thống
system-design
140
Service Mesh là gì và khi nào mày cần nó
system-design
141
API Gateway vs Load Balancer — hai thứ khác nhau nhưng hay bị gộp làm một
system-design
P09 Không phải lúc nào cũng đúng 8 bài
75
Microservices không phải phép màu giúp mày scale
system-design
76
NoSQL không scale tốt hơn SQL — đó là cú lừa hoàn hảo
system-design
77
Cache không phải lúc nào cũng làm hệ thống nhanh hơn
system-design
78
DRY không phải lúc nào cũng là best practice
system-design
79
Clean Architecture không phải lúc nào cũng tốt
system-design
80
Queue không phải lúc nào cũng làm hệ thống ổn định hơn
system-design
81
Scaling sớm không phải lúc nào cũng là quyết định đúng
system-design
82
More layers không phải lúc nào cũng là design tốt hơn
system-design
P10 Case Studies thực tế 20 bài
83
2 người đặt lịch cùng 1 slot — Redis Lua atomic giải quyết thế nào
system-design
84
User bấm thanh toán 2 lần — idempotency key hoạt động ra sao
system-design
85
Notification gửi trước khi transaction commit — bug thầm lặng nhất
system-design
86
Doctor chỉ thấy bệnh nhân của mình — ABAC implement đúng chỗ hay sai chỗ
system-design
87
Keycloak revert fail — compensation pattern và cái giá của distributed state
system-design
88
Tại sao user thấy data cũ dù đã update — cache consistency trong thực tế
system-design
89
Một cái tên đặt sai gây ra bug production
system-design
90
Behind the feature — nút "Book Appointment" ẩn chứa bao nhiêu hệ thống phía sau
system-design
110
Password reset flow — one-time token, expiry, và tại sao không gửi password trong URL
system-design
111
File upload đúng cách — multipart, base64, và S3 presigned URL
system-design
123
State machine thanh toán — cancel đã trả tiền và refund
system-design
126
Retry outbound và idempotency — khi HMS gọi gateway
system-design
112
Search trong HMS — LIKE, FULLTEXT INDEX, và Elasticsearch
system-design
114
Optimistic lock — hai điều dưỡng sửa cùng MedicalRecord
system-design
115
Outbox pattern — email không mất sau commit
system-design
116
Payment webhook — signature verify và idempotent
system-design
133
Bulk import CSV bệnh nhân — batch, validation, không dừng cả file
system-design
134
Notification preferences — opt-out, unsubscribe, không spam người đã tắt
system-design
118
Timezone và slot lịch hẹn — 9h sáng không lệch ngày
system-design
135
Doctor double-booking — khi race lọt xuống tầng database
system-design
P11 Tư duy sản phẩm 7 bài
91
Dev làm task. Product engineer hỏi tại sao task này tồn tại
programming
93
90% dev giải sai vấn đề vì nhảy vào code quá sớm
programming
94
Làm ít hơn nhưng đúng hơn — MVP thinking
programming
95
Tính năng không tạo giá trị = tính năng vô nghĩa
programming
97
Hiểu sản phẩm kiếm tiền thế nào để viết code tốt hơn
programming
92
User không quan tâm code của mày — họ quan tâm trải nghiệm
programming
96
Technical debt không xấu — xấu là không biết dùng nó
programming
P12 Production & Ops 11 bài
122
Rate limit theo endpoint — cùng một user, khác hàng rào
system-design
124
Postmortem — sau incident, học hệ thống không đổ lỗi người
programming
125
Staging — môi trường không phải bản nháp vô nghĩa
programming
128
Feature flag — deploy code mà chưa bật feature
programming
129
Blue-green vs rolling deploy — khi nào dùng cái nào
programming
130
Alert design — on-call không chết vì noise
programming
117
Cron job — ShedLock khi hai instance cùng chạy scheduled task
programming
119
Graceful shutdown và readiness probe — deploy không cắt giữa request
programming
121
On-call — 15 phút đầu đọc log production
programming
138
Nginx thực tế: config từ dev đến production
programming
142
Distributed Tracing — request chết ở đâu trong chuỗi service?
programming
P05 Design Patterns thực chiến 8 bài
149
Singleton — pattern dễ nhất, bị dùng sai nhiều nhất
programming
150
Factory — khi mày không muốn code biết nó đang tạo ra object gì
programming
151
Builder — object phức tạp không cần constructor 12 tham số
programming
152
Adapter — khi hai interface không nói chuyện được với nhau
programming
153
Composite — khi cây và lá phải được xử lý như nhau
programming
154
Chain of Responsibility — khi request phải đi qua nhiều handler
programming
155
Iterator — duyệt collection mà không cần biết bên trong có gì
programming
156
Visitor — khi mày cần thêm operation vào object hierarchy mà không sửa class
programming