🧠 Tư duy lập trình
Chia nhỏ vấn đề lớn thành việc vừa sức: cách nghĩ của người lập trình
Trong bài
Chia nhỏ vấn đề là tách một việc lớn, rối, chưa biết bắt đầu từ đâu thành nhiều việc nhỏ, mỗi việc đủ rõ để làm ngay. Người lập trình gọi đó là phân rã (decomposition), và đây thường là bước đầu tiên khi viết bất kỳ phần mềm nào. Bạn không cần máy tính để luyện: dọn phòng, gói bánh chưng hay tổ chức sinh nhật đều dùng đúng cách nghĩ này.
Vì sao việc lớn làm ta đứng hình
Thử nghe câu: "Con dọn phòng đi." Nhiều bạn đứng giữa phòng, nhìn quanh, rồi không biết làm gì trước. Không phải vì lười. Câu "dọn phòng" quá to: nó gồm hàng chục động tác nhỏ mà chưa ai liệt kê ra. Não người chỉ giữ được cùng lúc một số ít thứ trong đầu, nên trước một việc mơ hồ, ta dễ bị ngợp.
Giờ đổi câu khác: "Nhặt hết quần áo dưới sàn bỏ vào giỏ." Việc này rõ, làm được ngay, và biết khi nào là xong. Đó chính là một việc vừa sức. Nghệ thuật chia nhỏ là biến một câu to thành một danh sách những câu như thế.
Chia nhỏ theo hình cái cây
Cách dễ nhất là vẽ việc lớn ở trên cùng, rồi hỏi: "Để xong việc này, cần xong những việc gì?" Mỗi câu trả lời là một nhánh. Với từng nhánh, lại hỏi câu đó lần nữa, cho tới khi nhánh nào cũng là việc vừa sức.
Ví dụ với việc "Dọn phòng":
- Dọn sàn
- Nhặt quần áo bẩn vào giỏ
- Nhặt đồ chơi, sách vở xếp lên kệ
- Quét sàn
- Dọn bàn học
- Xếp sách theo môn
- Gom bút vào ống bút
- Bỏ giấy nháp không dùng vào thùng rác
- Dọn giường
- Gấp chăn
- Xếp gối
Việc to ban đầu giờ thành tám việc nhỏ. Không việc nào khó. Và bạn có thể đánh dấu từng việc khi xong, thấy rõ mình đã đi được bao xa. Cảm giác "xong một nhánh" giúp có thêm sức làm nhánh tiếp theo.
Bốn câu hỏi để chia cho đúng
Chia nhỏ không có nghĩa là băm càng vụn càng tốt. Chia quá vụn thì danh sách dài lê thê, mất công quản lý. Bốn câu hỏi sau giúp biết mình chia đã vừa chưa:
| Câu hỏi | Nếu trả lời "không" |
|---|---|
| Đọc lên có biết ngay phải làm gì không? | Việc còn to, chia tiếp |
| Có biết khi nào là xong không? | Viết lại cho có điểm kết thúc rõ, ví dụ "quét hết sàn" thay vì "dọn sàn qua qua" |
| Một người có làm được một mình không? | Có thể cần tách tiếp, hoặc ghi rõ việc này cần hai người |
| Các việc con có che hết việc cha không? | Đang sót: làm hết việc con mà việc cha vẫn chưa xong |
Câu hỏi cuối hay bị bỏ qua. Nếu chia "Dọn phòng" mà quên nhánh "Mở cửa sổ cho thoáng", bạn làm xong cả danh sách nhưng phòng vẫn bí. Người lập trình gặp chuyện này suốt: mọi phần nhỏ đều chạy, ghép lại vẫn thiếu một thứ không ai nhận làm.
Ví dụ gần gũi: gói bánh chưng ngày Tết
Gói bánh chưng là một việc lớn mà nhiều gia đình Việt làm mỗi năm một lần. Nếu chỉ nói "Năm nay nhà mình gói bánh chưng" thì chẳng ai biết bắt đầu từ đâu. Ông bà, bố mẹ thường vẫn chia việc như thế này, dù không ai gọi tên là "phân rã":
- Chuẩn bị nguyên liệu: mua gạo nếp, đỗ xanh, thịt lợn, lá dong, lạt; đong đủ số lượng theo số bánh định gói.
- Sơ chế: ngâm gạo nếp, ngâm và đồ đỗ, ướp thịt, rửa và lau khô lá dong, chẻ lạt.
- Gói bánh: xếp lá vào khuôn, lần lượt cho gạo, đỗ, thịt, đỗ, gạo; gấp lá, buộc lạt.
- Luộc bánh: xếp bánh vào nồi lớn, đổ nước ngập, đun nhiều giờ liền và châm thêm nước sôi khi cạn. Phần đun bếp và nồi nước sôi luôn do người lớn đảm nhận.
- Vớt và ép: vớt bánh, rửa qua nước lạnh, ép cho chặt và ráo nước.
Để ý vài điều thú vị. Bước 2 có những việc làm cùng lúc được: một người ngâm gạo, một người rửa lá. Bước 3 phải chờ bước 2 xong. Bước 4 thì kéo dài, chỉ cần một người canh. Cách chia này cho biết ngay ai làm gì, việc nào phải chờ việc nào. Trẻ con trong nhà thường được giao lau lá hoặc giúp đong gạo: những việc nhỏ, an toàn, có điểm kết thúc rõ.
Người lập trình chia nhỏ phần mềm thế nào
Một ứng dụng bản đồ trên điện thoại được viết bởi nhiều nhóm. Không ai ngồi viết "ứng dụng bản đồ" một mạch. Họ chia thành: phần vẽ bản đồ lên màn hình, phần tìm địa chỉ, phần tính đường đi, phần đọc vị trí của điện thoại, phần đọc chỉ dẫn bằng giọng nói. Mỗi phần lại chia nhỏ tiếp. Phần tính đường đi chẳng hạn, gồm đọc dữ liệu đường phố, tìm đường ngắn nhất, ước thời gian theo tình trạng giao thông.
Ba lợi ích lớn
- Chia người: mỗi nhóm lo một phần, làm song song, không giẫm chân nhau.
- Dễ tìm lỗi: khi đường đi bị tính sai, chỉ cần soi phần tính đường, không phải lật cả ứng dụng.
- Dùng lại: phần "đọc vị trí điện thoại" viết một lần, dùng được cho cả ứng dụng thời tiết, ứng dụng gọi xe.
Thoả thuận giữa các phần
Khi chia việc cho nhiều người, phải thống nhất chỗ nối: phần này đưa cho phần kia cái gì, ở dạng nào. Trong bếp, người đồ đỗ phải biết đỗ cần nghiền nhuyễn hay để nguyên hạt, nắm thành viên hay rải đều. Nếu không hỏi, đỗ xong vẫn phải làm lại. Trong phần mềm cũng vậy, và lập trình viên gọi chỗ nối đó là "giao diện" giữa các phần.
Chia để trị: khi việc nhỏ giống hệt việc lớn
Có một kiểu chia nhỏ đặc biệt mà các nhà khoa học máy tính rất thích, gọi là chia để trị. Ở kiểu này, mỗi phần nhỏ lại là đúng bài toán ban đầu, chỉ có điều bé hơn.
Ví dụ: cô giáo cần xếp 40 bài kiểm tra theo thứ tự tên trong danh sách lớp. Cô chia đôi chồng bài, đưa mỗi nửa cho một bạn xếp. Mỗi bạn lại chia nửa của mình cho hai bạn khác. Khi chồng chỉ còn vài tờ thì xếp ngay được. Sau đó các bạn ghép các chồng đã xếp lại với nhau, lần lượt lấy tờ đứng trước trong hai chồng. Việc ghép hai chồng đã có thứ tự dễ hơn nhiều so với xếp một chồng lộn xộn. Đây là ý tưởng của thuật toán sắp xếp trộn, có trong bài về sắp xếp của danh mục này.
Thử làm: lên kế hoạch buổi dã ngoại của lớp
Hoạt động này làm theo nhóm 4–6 bạn, mất khoảng 30 phút, chỉ cần giấy khổ lớn và bút màu.
- Viết ở giữa trên cùng tờ giấy: "Buổi dã ngoại của lớp ở công viên gần trường".
- Cả nhóm nghĩ những nhánh lớn, ví dụ: đi lại, đồ ăn uống, hoạt động, an toàn, dọn dẹp. Viết mỗi nhánh một màu.
- Với mỗi nhánh, hỏi "cần làm gì để nhánh này xong?" và viết các việc con bên dưới.
- Chia tiếp cho tới khi mỗi việc đều đọc lên là biết ngay phải làm gì. Kiểm bằng bốn câu hỏi ở bảng trên.
- Đánh dấu những việc phải chờ việc khác (ví dụ "mua đồ ăn" phải chờ "biết bao nhiêu bạn đi").
- Cuối cùng, mỗi bạn nhận vài việc và ghi tên mình bên cạnh.
Sau khi xong, nhìn lại: nhánh nào chia dễ, nhánh nào khó? Thường nhánh "an toàn" bị bỏ quên hoặc chia sơ sài. Đây là lúc rủ thầy cô hoặc bố mẹ góp ý, vì người lớn hay nghĩ ra những việc trẻ chưa gặp bao giờ, như mang số điện thoại phụ huynh, mang túi sơ cứu, hẹn điểm tập trung khi lạc nhau.
Những lỗi hay gặp khi chia việc
- Chia theo cái dễ thấy, bỏ cái khó thấy: ai cũng nhớ "mua bánh kẹo", ít ai nhớ "mang túi đựng rác".
- Việc con quá mơ hồ: "chuẩn bị đồ" vẫn là một việc to. Chuẩn bị đồ gì, cho bao nhiêu người?
- Không ghi việc nào chờ việc nào: mọi người hăng hái làm cùng lúc, rồi phát hiện phải làm lại vì bước trước chưa xong.
- Chia xong không ai nhận: danh sách đẹp nhưng không có tên người làm thì vẫn chỉ là danh sách.
Câu hỏi thường gặp
Phân rã vấn đề trong tư duy máy tính là gì?
Phân rã là tách một vấn đề lớn thành các phần nhỏ hơn, mỗi phần đủ đơn giản để giải quyết riêng. Đây là một trong bốn kỹ năng thường được nhắc đến khi nói về tư duy máy tính, cùng với nhận ra mẫu lặp lại, trừu tượng hoá và viết thuật toán.
Chia nhỏ đến mức nào thì vừa?
Chia tới khi mỗi việc đọc lên là biết ngay phải làm gì và biết khi nào là xong. Nếu một việc còn khiến bạn phải hỏi "bắt đầu từ đâu", hãy chia tiếp. Nếu danh sách dài tới mức khó theo dõi, có thể gom các việc rất nhỏ lại thành một.
Chia để trị khác chia nhỏ thông thường thế nào?
Chia nhỏ thông thường tách việc lớn thành những việc khác nhau, như mua đồ, nấu, dọn. Chia để trị tách bài toán thành những bài toán giống hệt nó nhưng nhỏ hơn, giải từng cái rồi ghép kết quả lại, như chia đôi chồng giấy để mỗi người xếp một nửa.
Làm sao dạy con biết chia nhỏ việc?
Bắt đầu từ việc thật trong nhà: thay vì nói "dọn phòng", cùng con liệt kê các việc nhỏ và để con tự đánh dấu khi xong. Dần dần để con tự chia. Hỏi "để xong việc này cần làm những gì?" thay vì nói luôn đáp án.
phân rã vấn đềchia nhỏ công việcchia để trịtư duy máy tínhgói bánh chưnglập kế hoạchsơ đồ câylàm việc nhómkỹ năng tự lập