Làm tay trước khi làm máy — giải ba ca rồi mới rút quy luật
Người mới mở trình soạn thảo rồi ngồi nhìn màn hình trắng. Người có nghề làm ngược: giải vài ca bằng giấy bút cho quy luật tự lộ ra.
TL;DR: Trước khi viết bước cho máy, bạn giải tay vài ca cụ thể — không nghĩ trong đầu, mà viết số ra giấy rồi tính. Bài này giải ba ca của đề đếm số bạn trên trung bình lớp: 5, 7, 9 ra 1 bạn, 8, 8 ra 0 bạn, 10, 0, 5 ra 1 bạn. Ca thứ hai không ai đoán đúng nếu chỉ nghĩ trong đầu, và chính nó lộ ra hai quy luật: phải biết trung bình TRƯỚC khi đếm nên phải duyệt hai lượt, và "trên" là so sánh chặt nên bằng đúng trung bình thì không tính. Bỏ bước giải tay là viết ra lời giải sai đúng chỗ đó mà không biết.
Bài trước bạn đã bóc đề thành ba ô: input, xử lý, output. Ô output đề hôm nay ghi rõ — đếm xem có bao nhiêu bạn có điểm trên điểm trung bình của lớp. Biết input, biết output vẫn chưa đủ để gõ một dòng code nào cho đúng.
Nhiều người mới mở trình soạn thảo ngay và gõ luôn một vòng lặp: "trên trung bình thì đếm, vậy duyệt từng bạn, so sánh, cộng dồn" — nghe rất hợp lý. Chạy thử với dữ liệu thật, kết quả sai, mà không hiểu vì sao.
Người có nghề làm khác. Trước khi gõ dòng code nào, họ lấy giấy bút, chọn vài bộ số cụ thể, và tự tay tính ra đáp án đúng — không phải bằng máy. Bài này cho bạn thấy vì sao bước đó không hề thừa thãi, qua đúng ba bộ số.
1. Analogy — nếm thử trước khi múc cả nồi
Một nồi phở lớn phải múc ra hàng trăm tô giống hệt nhau, theo đúng một công thức nêm nếm. Trước khi múc đại trà, đầu bếp múc thử vài tô nhỏ ở vài vị trí khác nhau trong nồi rồi nếm bằng miệng — không phải múc luôn tô đầu tiên cho khách rồi mới biết mặn nhạt.
| Nấu phở | Giải tay trước khi lập trình |
|---|---|
| Múc thử vài tô nhỏ ở các vị trí khác nhau trong nồi | Giải tay vài ca cụ thể, chọn số khác nhau |
| Nếm bằng miệng, biết ngay mặn nhạt | Tự tính bằng tay, biết ngay đáp án đúng |
| Tô múc gần đáy mặn hơn hẳn — không ai đoán trước | Ca 8, 8 ra 0 bạn — không ai đoán trước |
| Chỉnh công thức nêm nếm rồi mới múc đại trà cho khách | Rút ra quy luật rồi mới viết bước cho máy chạy hàng loạt |
Máy là nồi phở múc hàng trăm tô giống hệt nhau theo đúng MỘT công thức. Sai một chỗ trong công thức, sai luôn hàng trăm tô. Nếm thử vài tô trước rẻ hơn nhiều so với việc trả lại hàng trăm tô cho khách.
2. Ca thứ nhất — giải tay bằng giấy bút
Đề bài: đếm xem có bao nhiêu bạn có điểm trên điểm trung bình của lớp. Ca đầu tiên, lớp có ba bạn với điểm 5, 7, 9.
Giải tay nghĩa là làm đúng những gì máy sẽ phải làm, nhưng bằng chính đầu bạn:
| Bước | Việc làm | Kết quả |
|---|---|---|
| 1 | Cộng ba điểm: 5 cộng 7 cộng 9 | 21 |
| 2 | Chia cho 3 bạn | trung bình bằng 7 |
| 3 | So từng điểm với 7: bạn 5 điểm (dưới), bạn 7 điểm (bằng), bạn 9 điểm (trên) | 1 bạn trên trung bình |
Để ý bạn có 7 điểm: đúng bằng trung bình lớp, và KHÔNG được tính. Chi tiết dễ lướt qua ở ca này sẽ quay lại rất rõ ràng ở ca tiếp theo.
3. Ca thứ hai — thử đoán trước khi tin
Lớp chỉ có hai bạn, điểm đều là 8. Đếm xem có bao nhiêu bạn có điểm trên điểm trung bình của lớp. Viết ra con số bạn tin chắc, rồi mới đọc tiếp.
| Bước | Việc làm | Kết quả |
|---|---|---|
| 1 | Cộng hai điểm: 8 cộng 8 | 16 |
| 2 | Chia cho 2 bạn | trung bình bằng 8 |
| 3 | So từng điểm với 8: bạn 1 (bằng), bạn 2 (bằng) | 0 bạn trên trung bình |
Không bạn nào cả. Cả hai đều đúng bằng trung bình, mà "trên" nghĩa là lớn hơn, không phải lớn hơn hoặc bằng.
Cùng lỗi so sánh sai (lớn hơn hoặc bằng thay vì lớn hơn hẳn), ở ca 1 kết quả chỉ lệch từ 1 thành 2 bạn — vẫn nghe hợp lý, dễ bỏ qua. Ở ca này, kết quả lệch từ 0 thành 2 bạn, và 0 là con số gần như không ai đoán ra khi chỉ nghĩ trong đầu. Sai lệch càng phản trực giác, càng khó lờ đi — đó là lý do ca này đắt giá hơn hẳn ca 1.
4. Ca thứ ba — đổi thứ tự, quy luật vẫn đứng vững
Ca cuối, lớp có ba bạn với điểm 10, 0, 5 — cố ý viết theo thứ tự không tăng dần, và có một bạn 0 điểm.
| Bước | Việc làm | Kết quả |
|---|---|---|
| 1 | Cộng ba điểm: 10 cộng 0 cộng 5 | 15 |
| 2 | Chia cho 3 bạn | trung bình bằng 5 |
| 3 | So từng điểm với 5: bạn 10 điểm (trên), bạn 0 điểm (dưới), bạn 5 điểm (bằng) | 1 bạn trên trung bình |
Vẫn đúng hai điều đã thấy ở trên: phải cộng đủ ba điểm rồi mới có trung bình đúng, và bạn 5 điểm — bằng trung bình — không được tính dù đứng cuối danh sách.
5. Quy luật rút ra sau ba ca
Xếp ba ca cạnh nhau, quy luật chung tự lộ ra mà không cần đoán:

Hai quy luật, đọc thẳng ra từ ba bảng bạn vừa tự tính:
① Phải biết trung bình của CẢ danh sách trước khi đếm được ai trên trung bình — nghĩa là phải duyệt danh sách hai lượt: lượt một tính tổng và trung bình, lượt hai mới so sánh và đếm.
② "Trên" là so sánh chặt — bằng đúng trung bình thì KHÔNG tính, chỉ lớn hơn mới tính.
Ca 2 là lý do cả bài này tồn tại: không có nó, bạn vẫn viết ra một lời giải trông hợp lý, chạy được với vài bộ dữ liệu, và tự tin nó đúng — cho tới khi gặp một lớp mà mọi bạn cùng điểm, và chương trình âm thầm trả về con số sai mà không báo lỗi gì.
6. Vì sao đúng ba ca này, không phải ba ca khác?
Ba ca không phải chọn ngẫu nhiên — mỗi ca trả lời một câu hỏi khác nhau:
- Ca thường (
5, 7, 9) — số khác nhau rõ ràng. Xác nhận công thức cơ bản chạy đúng khi không có gì đặc biệt. - Ca dễ gây bất ngờ (
8, 8) — tất cả bằng nhau, nằm đúng ranh giới điều kiện "trên trung bình". Lộ ra giả định ngầm: "trên" có tính cả "bằng" hay không. - Ca đổi thứ tự (
10, 0, 5) — không tăng dần, có một giá trị 0. Xác nhận công thức không phụ thuộc thứ tự nhập liệu.
Ba ca giống nhau — chẳng hạn 5, 7, 9, 6, 8, 10, 4, 6, 8 — không rút ra được gì mới, vì cả ba đều là "ca thường" trá hình. Mỗi ca phải thử một giả định khác, không lặp lại cùng một phép thử ba lần.
Ở module 1, bạn kẻ bảng trace để KIỂM CHỨNG một đoạn code đã viết sẵn chạy đúng hay sai — các dòng lệnh đã có, bạn chỉ theo dõi giá trị biến qua từng dòng. Ở bài này, CHƯA có dòng code nào cả: bạn kẻ bảng (bước, việc làm, kết quả) để tự mình TÌM RA quy luật cần viết thành code. Cùng một công cụ — bảng ghi giá trị từng bước — nhưng dùng theo hai chiều ngược nhau.
7. Tới lượt bạn
Đề mới: đếm xem có bao nhiêu bạn có điểm thấp hơn hoặc bằng điểm trung bình của lớp.
Tự chọn ba ca của riêng bạn — một ca thường, một ca bạn nghĩ sẽ gây bất ngờ, một ca đổi thứ tự nhập liệu hoặc chứa giá trị đặc biệt — rồi giải tay từng ca bằng giấy bút, đúng quy trình ở mục 2 đến 4. Không có mẫu sẵn để điền, không có bảng dựng sẵn — tự kẻ bảng, tự chọn số. Làm xong cả ba ca trên giấy trước khi đọc tiếp mục Bẫy thường gặp.
8. Bẫy thường gặp
❌ Nhầm 1 — duyệt một lượt, so sánh luôn giữa chừng: cộng dồn tổng và so sánh với "trung bình tạm tính" trong cùng vòng duyệt. Ở ca 3, làm vậy nghĩa là so 10 với trung bình của đúng một phần tử — chính nó.
✅ Trung bình chỉ đúng khi biết đủ TẤT CẢ điểm. Duyệt xong lượt một (tính trung bình) rồi mới sang lượt hai (so sánh, đếm).
❌ Nhầm 2 — đọc "trên" thành "từ trở lên": dùng lớn hơn hoặc bằng thay vì lớn hơn hẳn. Ca 2 lộ lỗi ngay: tính kiểu này, cả hai bạn 8, 8 đều được tính, ra 2 thay vì 0.
✅ "Trên" luôn là so sánh chặt; "từ ... trở lên" mới là lớn hơn hoặc bằng. Đọc kỹ từ nối trong đề trước khi chọn phép so sánh.
9. 📚 Đào sâu — vì sao giải tay lại hiệu quả
Khi tự tính bằng tay, bạn buộc phải quyết định những chuyện cái đầu coi là hiển nhiên: 8 có tính là "trên" 8 hay không, danh sách duyệt mấy lượt. Nghĩ trong đầu, các quyết định ngầm này thường bị lướt qua — cho tới khi code chạy sai.
Chọn ca thử nằm đúng RANH GIỚI của một điều kiện có tên riêng trong kiểm thử phần mềm: boundary-value analysis — biên là chỗ lỗi hay nằm, vì đó là nơi người viết phải quyết định lấy hay không lấy giá trị nằm đúng trên ranh. Ca 8, 8 chính là một phép thử biên: giá trị nằm đúng trên đường ranh giữa "được tính" và "không được tính".
Ghi chú: khi tự giải tay, luôn có ít nhất một ca chạm đúng biên của điều kiện trong đề, không chỉ chọn số "đẹp" hay dễ tính nhẩm.
10. Liên hệ các bài khác
- Bài 1 — Đọc đề — vì sao trước khi giải tay, bạn phải bóc đề thành input, output, ràng buộc.
- Bài 3 — Lưu đồ có cấu trúc — hai quy luật ở mục 5 chính là thứ bạn ghi thành lưu đồ ở bài sau.
- Bài 6 — Ca biên — ca
8, 8ở đây thực chất là một ca biên; bài 6 mở rộng cách soi ca biên có hệ thống hơn. - Module 1, bài 4 — Bảng trace — công cụ dùng lại với mục đích ngược hẳn: kiểm chứng code có sẵn, thay vì khám phá quy luật khi chưa có code.
11. Tóm tắt
- Bỏ qua giải tay là đặt cược: bạn tin lời giải đúng vì nó nghe hợp lý, không phải vì đã kiểm bằng số thật.
- Một ca tử tế trả lời một câu hỏi khác: ca thường xác nhận công thức cơ bản đúng, ca biên (
8, 8) lộ giả định ngầm, ca đổi thứ tự (10, 0, 5) xác nhận công thức không phụ thuộc cách nhập liệu. - Hai quy luật rút ra áp dụng cho mọi đề dạng "so với trung bình cả nhóm": phải duyệt hai lượt vì trung bình cần biết đủ dữ liệu trước, và đọc đúng nghĩa "trên/dưới" trước khi chọn phép so sánh.
- Bảng bạn kẻ tay ở bài này dùng NGƯỢC với bảng trace ở module 1: không kiểm chứng code có sẵn, mà đi tìm quy luật cho code chưa viết.
12. Tự kiểm tra
- Q1Ca 1 (5, 7, 9) đã có một bạn đạt điểm bằng đúng trung bình và không được tính. Vậy ca 8, 8 còn cần thiết ở chỗ nào?
- Q2Vì sao phải biết trung bình của cả danh sách TRƯỚC khi bắt đầu đếm, thay vì vừa cộng dồn tổng vừa so sánh luôn?
- Q3'Trên trung bình' và 'từ trung bình trở lên' khác nhau ở chỗ nào, và ảnh hưởng ra sao tới kết quả của ca 2?
- Q4Với đề mới 'đếm số chẵn lớn hơn tất cả số lẻ trong danh sách' (luôn có ít nhất một số lẻ), nêu một ca 'dễ gây bất ngờ' và vì sao nó đáng chọn.
- Q5Vì sao mục Tới lượt bạn không đưa sẵn ba ca cho bạn, trong khi mục 2 đến 4 lại đưa sẵn?
- Q6Bảng trace ở module 1 và bảng giải tay ở bài này đều có cột, hàng ghi giá trị. Điểm khác nhau mấu chốt là gì?
Bài tiếp theo: Lưu đồ có cấu trúc — ký hiệu, cách đọc, và chỗ nó bất lực
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên