MioCraft / Những Điều Mình Học Được

Ghi chép trên hành trình học lập trình

Những điều mình đã đọc, thử nghiệm và rút ra khi học về lập trình, kiến trúc phần mềm và system design — được ghi lại để dễ xem lại và chia sẻ với người cùng quan tâm.

160 bài · 12 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
Từ feature đến change
programming
03
Câu 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à bạn 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 bạn giỏi — đơn giản mới chứng minh bạn hiểu sâu
programming
10
Debug chậm không phải vì bạn dở — bạn đang debug sai cách
programming
P02 Clean Code 14 bài ▶
01
Clean Code không phải code hoàn hảo — là code sống sót qua thời gian
programming
02
Đặt tên biến là kỹ năng, không phải thói quen
programming
03
Function làm "một việc" — nhưng "một việc" nghĩa là gì?
programming
04
Khi nào comment là dấu hiệu code đang có vấn đề
programming
05
Boolean flag — kẻ phá hoại thầm lặng
programming
06
Magic number — bug không có tên nhưng rất khó sửa
programming
07
Đừng nuốt lỗi — hệ thống sẽ trả giá thay bạn
programming
08
Code không test được thì chưa bao giờ là Clean Code
programming
09
Refactor là gì — và khi nào thì nên làm
programming
10
Deadline dí không cho phép bạn viết code bừa — thực ra là sao?
programming
11
Logging đúng cách — vì sao log của bạn đang vô dụng lúc cần nhất
programming
12
Integration Test — tại sao unit test xanh hết mà vẫn deploy ra production bị lỗi
programming
13
Optional<T> — khi nào nên dùng, khi nào không
programming
14
Secrets không được hardcode — Spring profiles và env vars
programming
P03 Kiến trúc phần mềm 13 bài ▶
01
Tại sao Controller/Service/Repository thối theo thời gian
architecture
02
Layered Architecture không phải lúc nào cũng đúng
architecture
03
Business logic đặt sai chỗ — hệ thống sẽ trả giá
architecture
04
Sai boundary một ly, hệ thống đi một dặm
architecture
05
Domain logic không được biết database tồn tại
architecture
06
Use Case mới là trái tim thật sự của hệ thống
architecture
07
DTO vs Entity vs Domain Model — ba thứ khác nhau, và bạn cần cả ba
architecture
08
Fat Controller, Fat Service — dấu hiệu kiến trúc đang sai
architecture
09
Framework là công cụ, không phải nền móng
architecture
10
Refactor kiến trúc không phải là viết lại — là chỉnh hướng dần dần
architecture
11
Microservices không phải level up tự động từ Monolith
architecture
12
Kiến trúc thường chết vì con người, không phải vì code
architecture
13
Khi một lệnh Feign làm Saga mất nhất quán
architecture
P04 SOLID 7 bài ▶
01
SOLID — code chạy được vẫn fail vì bạn chưa hiểu cái này
programming
02
SRP — một class ôm quá nhiều là mầm mống thảm họa
programming
03
OCP — mỗi lần thêm feature lại sửa code cũ là thiết kế đang sai
programming
04
LSP — kế thừa sai còn nguy hiểm hơn code xấu
programming
05
ISP — interface càng to, code càng yếu
programming
06
DIP — business code mà phụ thuộc DB thì sớm muộn cũng khổ
programming
07
SOLID không làm code tốt hơn nếu bạn dùng sai thời điểm
programming
P05 Design Patterns 18 bài ▶
01
Design Pattern không giúp bạn viết code tốt hơn — nếu bạn dùng nó sai
programming
02
Template Method — pattern bạn đang dùng hàng ngày mà không biết tên
programming
03
Strategy vs State — hành vi hay trạng thái đang thay đổi?
programming
04
Observer — tại sao notification không được gọi trong transaction
programming
05
Facade — tại sao KeycloakService tồn tại thay vì gọi thẳng
programming
06
Decorator — kế thừa không sai, sai là bạn dùng nó để mở rộng hành vi
programming
07
Proxy — không phải object nào cũng nên được truy cập trực tiếp
programming
08
Command Pattern — khi hành vi cần được điều phối
programming
09
Review không chỉ là đọc code — mà là hiểu change
programming
10
Builder Pattern — khi constructor bắt đầu nhận 8 tham số
programming
11
Singleton — pattern dễ nhất, bị dùng sai nhiều nhất
programming
12
Factory — khi bạn không muốn code biết nó đang tạo ra object gì
programming
13
Builder — object phức tạp không cần constructor 12 tham số
programming
14
Adapter — khi hai interface không nói chuyện được với nhau
programming
15
Composite — khi cây và lá phải được xử lý như nhau
programming
16
Chain of Responsibility — khi request phải đi qua nhiều handler
programming
17
Iterator — duyệt collection mà không cần biết bên trong có gì
programming
18
Visitor — khi bạn cần thêm operation vào object hierarchy mà không sửa class
programming
P06 Database 18 bài ▶
01
Index là gì — và tại sao tạo index rồi query vẫn chậm?
system-design
02
Query Execution Plan — database đang làm gì sau cánh gà
system-design
03
MVCC — vì sao read không block write
system-design
04
Isolation Levels — bốn cấp độ và khi nào bạn cần cái nào
system-design
05
Deadlock — vì sao database tự kill query của bạn
system-design
06
N+1 Query — bug thầm lặng giết performance từ từ
system-design
07
Normalization vs Denormalization — chuẩn hóa bao nhiêu là đủ?
system-design
08
SQL vs NoSQL — chọn sai là refactor cả đời
system-design
09
Soft Delete — đơn giản hơn bạn nghĩ, và phức tạp hơn bạn tưởng
system-design
10
Connection Pool — vì sao hàng ngàn request chỉ cần vài chục connection
system-design
11
Database Migration — vì sao schema thay đổi mà không có migration là đang chơi với lửa
system-design
12
Pagination — offset vs cursor, và tại sao page 500 chậm hơn page 1 đến 500 lần
system-design
13
@Transactional sâu hơn — proxy, self-invocation, và rollback rules
programming
14
Soft delete leak — data đã xóa vẫn lọt ra API
system-design
15
Covering index — khi query không cần chạm bảng
system-design
16
Migration zero-downtime — expand-contract
programming
17
Read replica lag — vì sao đọc stale ngay sau khi write
system-design
18
Hợp đồng đã ký phải nhớ quá khứ
architecture
P07 Backend & Hệ thống 16 bài ▶
01
Request đi qua server như thế nào — từ TCP đến response
system-design
02
Thread per Request vs Event Loop — Spring Boot đang chọn gì và tại sao
system-design
03
Blocking vs Non-Blocking — thread đang làm gì khi chờ I/O
system-design
04
Caching — vì sao server không query database mỗi lần
system-design
05
Cache Stampede — khi cache sập gây sập cả hệ thống
system-design
06
Concurrency — khi nhiều request cùng chạm một tài nguyên
system-design
07
Queue — vì sao không phải lúc nào cũng xử lý request ngay lập tức
system-design
08
JWT là gì — và tại sao token không phải session
system-design
09
CORS — tại sao browser block và config đúng trong Spring
system-design
10
Spring Security filter chain — request đi qua những gì trước controller
system-design
11
WebSocket, SSE, và Polling — khi nào dùng cái nào
system-design
12
API versioning — /v1/ trong URL hay header, và khi nào breaking
programming
13
@Async trong Spring — thread pool và khi transaction không theo
programming
14
Message đã vào queue nhưng handler chưa chạy — converter cũng là một phần của hệ thống
system-design
15
Async rồi vẫn coupling — đừng biến consumer thành client ngược
system-design
16
Một try/catch quá rộng có thể biến lỗi business thành message hỏng
system-design
P08 System Design 15 bài ▶
01
System Design là gì — và tại sao code giỏi vẫn làm hệ thống sập
system-design
02
Functional vs Non-functional Requirements — hiểu sai là thiết kế sai
system-design
03
Monolith vs Microservices — chọn sai kiến trúc là đốt cả năm
system-design
04
API Design — vì sao 70% lỗi hệ thống bắt nguồn từ API tệ
system-design
05
Load Balancer — bí mật giúp hệ thống chịu hàng chục nghìn request/giây
system-design
06
Message Queue — khi nào cần, khi nào không
system-design
07
Rate Limiting — hàng rào bảo vệ API khỏi spam và DDoS
system-design
08
Circuit Breaker — vì sao một service chết mà cả hệ thống không sập theo
system-design
09
CAP Theorem — ba thứ không thể có cùng lúc
system-design
10
HTTP status codes đúng cách — tại sao return 200 cho mọi thứ là sai
system-design
11
Circuit Breaker — vì sao một service chậm có thể kéo sập cả hệ thống
system-design
12
Service Mesh là gì và khi nào bạn cần nó
system-design
13
API Gateway vs Load Balancer — hai thứ khác nhau nhưng hay bị gộp làm một
system-design
14
Escrow không thể nhảy thẳng từ SIGNED sang ACTIVE
system-design
15
Header tin cậy đến đâu trong microservices?
system-design
P09 Không phải lúc nào cũng đúng 8 bài ▶
01
Microservices không phải phép màu giúp bạn scale
system-design
02
NoSQL không scale tốt hơn SQL — đó là cú lừa hoàn hảo
system-design
03
Cache không phải lúc nào cũng làm hệ thống nhanh hơn
system-design
04
DRY không phải lúc nào cũng là best practice
system-design
05
Clean Architecture không phải lúc nào cũng tốt
system-design
06
Queue không phải lúc nào cũng làm hệ thống ổn định hơn
system-design
07
Scaling sớm không phải lúc nào cũng là quyết định đúng
system-design
08
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ế 21 bài ▶
01
2 người đặt lịch cùng 1 slot — Redis Lua atomic giải quyết thế nào
system-design
02
User bấm thanh toán 2 lần — idempotency key hoạt động ra sao
system-design
03
Notification gửi trước khi transaction commit — bug thầm lặng nhất
system-design
04
Doctor chỉ thấy bệnh nhân của mình — ABAC implement đúng chỗ hay sai chỗ
system-design
05
Keycloak revert fail — compensation pattern và cái giá của distributed state
system-design
06
Tại sao user thấy data cũ dù đã update — cache consistency trong thực tế
system-design
07
Một cái tên đặt sai gây ra bug production
system-design
08
Behind the feature — nút "Book Appointment" ẩn chứa bao nhiêu hệ thống phía sau
system-design
09
Password reset flow — one-time token, expiry, và tại sao không gửi password trong URL
system-design
10
File upload đúng cách — multipart, base64, và S3 presigned URL
system-design
11
State machine thanh toán — cancel đã trả tiền và refund
system-design
12
Retry outbound và idempotency — khi HMS gọi gateway
system-design
13
Search trong HMS — LIKE, FULLTEXT INDEX, và Elasticsearch
system-design
14
Optimistic lock — hai điều dưỡng sửa cùng MedicalRecord
system-design
15
Outbox pattern — email không mất sau commit
system-design
16
Payment webhook — signature verify và idempotent
system-design
17
Bulk import CSV bệnh nhân — batch, validation, không dừng cả file
system-design
18
Notification preferences — opt-out, unsubscribe, không spam người đã tắt
system-design
19
Timezone và slot lịch hẹn — 9h sáng không lệch ngày
system-design
20
Doctor double-booking — khi race lọt xuống tầng database
system-design
21
Idempotency không phải là existsBy()
system-design
P11 Tư duy sản phẩm 7 bài ▶
01
Dev làm task. Product engineer hỏi tại sao task này tồn tại
programming
02
90% dev giải sai vấn đề vì nhảy vào code quá sớm
programming
03
Làm ít hơn nhưng đúng hơn — MVP thinking
programming
04
Tính năng không tạo giá trị = tính năng vô nghĩa
programming
05
Hiểu sản phẩm kiếm tiền thế nào để viết code tốt hơn
programming
06
User không quan tâm code của bạn — họ quan tâm trải nghiệm
programming
07
Technical debt không xấu — xấu là không biết dùng nó
programming
P12 Production & Ops 13 bài ▶
01
Rate limit theo endpoint — cùng một user, khác hàng rào
system-design
02
Postmortem — sau incident, học hệ thống không đổ lỗi người
programming
03
Staging — môi trường không phải bản nháp vô nghĩa
programming
04
Feature flag — deploy code mà chưa bật feature
programming
05
Blue-green vs rolling deploy — khi nào dùng cái nào
programming
06
Alert design — on-call không chết vì noise
programming
07
Cron job — ShedLock khi hai instance cùng chạy scheduled task
programming
08
Graceful shutdown và readiness probe — deploy không cắt giữa request
programming
09
On-call — 15 phút đầu đọc log production
programming
10
Nginx thực tế: config từ dev đến production
programming
11
Distributed Tracing — request chết ở đâu trong chuỗi service?
programming
12
Database cũ đang che giấu bug của bạn
system-design
13
DLQ không phải thùng rác — retry và reconciliation trong Saga
system-design