Nhập môn Tư duy Lập trình/Làm tay trước khi làm máy — giải ba ca rồi mới rút quy luật
18/31
Bài 18 / 31~13 phútTừ đề bài tới thuật toánMiễn phí lượt xem

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ồiGiả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ạtTự 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ướcCa 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áchRút ra quy luật rồi mới viết bước cho máy chạy hàng loạt
💡 Cách nhớ

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ướcViệc làmKết quả
1Cộng ba điểm: 5 cộng 7 cộng 921
2Chia cho 3 bạntrung bình bằng 7
3So 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

🖊️ Thử đoán

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.

Kết quả

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ướcViệc làmKết quả
1Cộng ba điểm: 10 cộng 0 cộng 515
2Chia cho 3 bạntrung bình bằng 5
3So 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:

Sơ đồ: dòng tiêu đề ghi đề đếm xem có bao nhiêu bạn có điểm trên điểm trung bình của lớp; ba hộp ngang hàng, hộp ca 1 ghi 5, 7, 9 trung bình 7 ra 1 bạn, hộp ca 2 màu cam ghi 8, 8 trung bình 8 ra 0 bạn, hộp ca 3 ghi 10, 0, 5 trung bình 5 ra 1 bạn; ba mũi tên cùng đổ xuống một hộp nhấn màu xanh ghi quy luật rút ra sau ba ca gồm phải biết trung bình trước khi đếm nên duyệt danh sách hai lượt, và trên là chặt nên bằng đúng trung bình thì không tính

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ả

📚 Đào sâu (không bắt buộc)

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

Tự kiểm tra
0/6 câu đã trả lời
  1. Q1
    Ca 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?
  2. Q2
    Vì 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?
  3. 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?
  4. Q4
    Vớ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.
  5. Q5
    Vì 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?
  6. Q6
    Bả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

Đặt 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

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