M00 — Lập trình là gì?
← Bắt đầu | Tiếp theo → 01 - Cài đặt môi trường
Mục tiêu module
- Hiểu chương trình máy tính thực chất là gì
- Phân biệt được ngôn ngữ compiled (biên dịch) và interpreted (thông dịch)
- Hiểu vì sao Python phù hợp với người mới
- Hiểu sự khác biệt căn bản giữa SQL (thứ bạn đã biết) và Python
Thời lượng: ~4 giờ | Tuần: 1 | Không có code — chỉ đọc và ghi chú
1. Chương trình máy tính là gì?
1.1. Định nghĩa
Một chương trình (program) là một danh sách các chỉ thị (instruction) mà máy tính thực hiện tuần tự để biến dữ liệu đầu vào thành kết quả đầu ra.
Mô hình cơ bản nhất của mọi chương trình:
graph LR A[INPUT<br/>Dữ liệu vào] --> B[PROCESS<br/>Xử lý] B --> C[OUTPUT<br/>Kết quả ra]
Ví dụ đời thường — một chương trình tính lương:
| Thành phần | Nội dung |
|---|---|
| Input | Lương cơ bản, số ngày công, số ngày nghỉ |
| Process | Lương thực lĩnh = (Lương cơ bản / 26) × Số ngày công − Bảo hiểm |
| Output | Số tiền lương thực lĩnh |
Toàn bộ 26 tuần tới, bạn chỉ đang học cách mô tả phần PROCESS cho máy tính hiểu.
1.2. Máy tính “ngu” đến mức nào?
Đây là điều quan trọng nhất người mới cần chấp nhận:
Máy tính không suy luận, không đoán ý
Máy tính chỉ làm đúng những gì bạn viết, không làm những gì bạn nghĩ trong đầu. Nó không tự hiểu “ý anh là…”. Sai một dấu chấm phẩy, sai một chữ hoa/thường → chương trình dừng.
Ví dụ: nếu bạn muốn máy pha một ly cà phê, bạn không thể nói “pha cho tôi ly cà phê”. Bạn phải viết:
1. Lấy 1 cái ly
2. Đong 20 gram bột cà phê
3. Đun 200ml nước đến 92 độ C
4. Đổ nước vào phin
5. Chờ 5 phút
6. Nếu còn nước trong phin thì chờ thêm 2 phút, ngược lại sang bước 7
7. Bỏ phin ra
Chú ý bước 6 — có chữ “nếu… thì… ngược lại”. Đó chính là câu lệnh if/else mà bạn sẽ học ở 06 - Cấu trúc rẽ nhánh (if-elif-else).
2. Ngôn ngữ lập trình là gì?
2.1. Vấn đề: máy tính chỉ hiểu số 0 và 1
CPU (Central Processing Unit — bộ xử lý trung tâm) chỉ hiểu machine code (mã máy) — các dãy nhị phân như:
10110000 01100001
Con người không thể viết phần mềm bằng thứ này. Vì vậy người ta tạo ra programming language (ngôn ngữ lập trình) — thứ ngôn ngữ trung gian: đủ gần với ngôn ngữ tự nhiên để người viết được, đủ chặt chẽ để máy dịch được.
2.2. Ba tầng ngôn ngữ
| Tầng | Tên gọi | Ví dụ | Đặc điểm |
|---|---|---|---|
| Thấp nhất | Machine code (mã máy) | 10110000 | Máy hiểu trực tiếp, người không đọc nổi |
| Trung gian | Assembly (hợp ngữ) | MOV AL, 61h | Gần mã máy, cực khó viết |
| Cao | High-level language (ngôn ngữ bậc cao) | Python, C#, Java, SQL | Gần tiếng Anh, dễ viết |
Python là ngôn ngữ bậc cao — nghĩa là bạn viết những câu gần giống tiếng Anh, và có một phần mềm khác lo việc dịch xuống mã máy.
3. Compiled vs Interpreted — Python thuộc loại nào?
Đây là khái niệm nền tảng, cần hiểu kỹ.
3.1. Compiled language (ngôn ngữ biên dịch)
Compiler (trình biên dịch) đọc toàn bộ mã nguồn, dịch một lần thành file thực thi (.exe trên Windows), rồi mới chạy.
graph LR A[Mã nguồn<br/>program.c] --> B[Compiler] B --> C[File thực thi<br/>program.exe] C --> D[Chạy]
- Ví dụ: C, C++, Rust, Go
- Ưu: chạy rất nhanh
- Nhược: phải biên dịch lại mỗi khi sửa code; lỗi cú pháp phải sửa hết mới chạy được
3.2. Interpreted language (ngôn ngữ thông dịch)
Interpreter (trình thông dịch) đọc mã nguồn và thực thi từng lệnh một, ngay tại thời điểm chạy.
graph LR A[Mã nguồn<br/>program.py] --> B[Interpreter<br/>python.exe] B --> C[Chạy trực tiếp]
- Ví dụ: Python, JavaScript, PHP
- Ưu: sửa code là chạy được ngay, rất tiện để học và thử nghiệm
- Nhược: chậm hơn ngôn ngữ biên dịch
3.3. Python nằm ở đâu?
Python là interpreted language. Chính xác hơn, Python thực hiện 2 bước:
- Dịch mã nguồn
.pythành bytecode (mã trung gian, file.pycnằm trong thư mục__pycache__) - Python Virtual Machine (máy ảo Python) thực thi bytecode đó
Vì sao bạn cần biết điều này?
Vì nó giải thích 3 thứ bạn sẽ gặp:
- Bạn phải cài Python lên máy thì file
.pymới chạy được (khác với.exechạy được ngay).- Bạn sẽ thấy thư mục lạ tên
__pycache__xuất hiện — đừng hoảng, đó là bytecode Python tự tạo để chạy nhanh hơn lần sau.- Nhiều lỗi trong Python chỉ lộ ra khi chạy tới dòng đó, không lộ ra ngay từ đầu.
Điểm 3 rất quan trọng. Ví dụ file này:
print("Dòng 1 chạy được")
print("Dòng 2 chạy được")
prnit("Dòng 3 gõ sai tên hàm")Khi chạy, Python sẽ in ra dòng 1 và dòng 2 trước, rồi mới báo lỗi ở dòng 3. Ngôn ngữ biên dịch sẽ chặn ngay từ đầu, không in gì cả.
4. Python khác SQL như thế nào?
Đây là phần dành riêng cho bạn, vì bạn đã quen T-SQL/PostgreSQL. Hiểu được sự khác biệt này sẽ tiết kiệm cho bạn hàng chục giờ bối rối.
4.1. Declarative vs Imperative
| SQL | Python | |
|---|---|---|
| Kiểu ngôn ngữ | Declarative (khai báo) | Imperative (mệnh lệnh) |
| Bạn viết gì | Mô tả cái bạn muốn | Mô tả các bước để làm ra nó |
| Ai quyết định cách làm | Query optimizer của DBMS | Chính bạn |
Ví dụ minh họa — Lấy 5 khách hàng có doanh số cao nhất
Trong SQL, bạn nói muốn gì:
SELECT TOP 5 MaKH, SUM(ThanhTien) AS DoanhSo
FROM ChiTietHoaDon
GROUP BY MaKH
ORDER BY DoanhSo DESC;Bạn không hề nói cho SQL Server biết phải duyệt bảng thế nào, dùng thuật toán sắp xếp nào. Query optimizer tự quyết.
Trong Python, bạn phải nói làm thế nào:
# Đây là code minh họa, tuần 13 bạn sẽ tự viết được
doanh_so = {} # Bước 1: tạo chỗ chứa kết quả
for dong in chi_tiet_hoa_don: # Bước 2: duyệt từng dòng
ma_kh = dong["MaKH"]
doanh_so[ma_kh] = doanh_so.get(ma_kh, 0) + dong["ThanhTien"] # Bước 3: cộng dồn
ket_qua = sorted(doanh_so.items(), key=lambda x: x[1], reverse=True) # Bước 4: sắp xếp
top_5 = ket_qua[:5] # Bước 5: lấy 5 phần tử đầuCú sốc đầu tiên của dân SQL học Python
Bạn sẽ thấy Python “dài dòng” và “thủ công”. Đó là cảm giác đúng — và cũng chính là sức mạnh của Python: bạn kiểm soát được từng bước, làm được những việc SQL không làm nổi (gọi API, đọc file Excel, gửi email, vẽ biểu đồ…).
4.2. Bảng đối chiếu khái niệm
| Khái niệm SQL | Tương đương gần nhất trong Python | Học ở module |
|---|---|---|
| Một dòng (row) trong bảng | dict — từ điển khóa/giá trị | 09 - Dict và Set |
| Một bảng (table) | list chứa nhiều dict | 08 - List và Tuple |
NULL | None | 03 - Biến và kiểu dữ liệu |
WHERE | Câu lệnh if bên trong vòng lặp | 06 - Cấu trúc rẽ nhánh (if-elif-else) |
ORDER BY | Hàm sorted() | 08 - List và Tuple |
Con trỏ CURSOR | Vòng lặp for | 07 - Vòng lặp (for-while) |
INT, VARCHAR, BIT | int, str, bool | 03 - Biến và kiểu dữ liệu |
| Stored Procedure | def — hàm | 10 - Hàm (Function) |
TRY...CATCH | try...except | 11 - Xử lý lỗi (Exception) |
Biến @x (khai báo DECLARE) | Biến x (không cần khai báo trước) | 03 - Biến và kiểu dữ liệu |
Xem đầy đủ ở So sánh Python và SQL.
4.3. Ba khác biệt dễ gây nhầm nhất
| # | SQL | Python |
|---|---|---|
| 1 | Không phân biệt hoa/thường ở từ khóa (SELECT = select) | Phân biệt tuyệt đối. Print khác print, sai là lỗi |
| 2 | Kết thúc câu lệnh bằng ; | Không cần ;. Xuống dòng là hết lệnh |
| 3 | Khối lệnh bằng BEGIN...END | Khối lệnh bằng thụt lề (indentation). Thừa/thiếu dấu cách là lỗi |
Điểm 3 là thứ gây sốc nhất. Xem chi tiết ở 02 - Chương trình đầu tiên và cú pháp nền tảng.
5. Vì sao chọn Python?
5.1. Ưu điểm
| Ưu điểm | Giải thích |
|---|---|
| Cú pháp gần tiếng Anh | if age > 18: print("Người lớn") — đọc gần như câu tiếng Anh |
| Không cần khai báo kiểu | Viết x = 5 là xong, không cần int x = 5 |
| Thư viện khổng lồ | PyPI (Python Package Index) có hơn 500.000 gói thư viện dùng sẵn |
| Đa mục đích | Web, dữ liệu, tự động hóa, AI, tool nội bộ — cùng một ngôn ngữ |
| Cộng đồng lớn | Gõ lỗi lên Google gần như chắc chắn có người đã gặp |
5.2. Nhược điểm (cần biết để không kỳ vọng sai)
| Nhược điểm | Ảnh hưởng tới bạn |
|---|---|
| Chạy chậm hơn C/C++/C# | Không ảnh hưởng gì với công việc xử lý dữ liệu, viết tool |
| Không phù hợp làm ứng dụng desktop lớn | Nếu cần làm phần mềm Windows lớn, C# vẫn hợp hơn |
| Kiểu dữ liệu động dễ gây lỗi khi dự án lớn | Khắc phục bằng type hints — học sau khi xong lộ trình này |
5.3. Triết lý Python — The Zen of Python
Python có một “bản tuyên ngôn” chính thức, gọi là PEP 20 — The Zen of Python. Sau khi cài Python (tuần 2), gõ lệnh này để xem:
import thisVài dòng quan trọng nhất, dịch sang tiếng Việt:
- Beautiful is better than ugly — Đẹp tốt hơn xấu
- Explicit is better than implicit — Rõ ràng tốt hơn ngầm định
- Simple is better than complex — Đơn giản tốt hơn phức tạp
- Readability counts — Tính dễ đọc là quan trọng
- There should be one — and preferably only one — obvious way to do it — Nên có một, và tốt nhất là chỉ một, cách hiển nhiên để làm việc đó
Nguồn chính thức: https://peps.python.org/pep-0020/
PEP là gì?
PEP = Python Enhancement Proposal (Đề xuất Cải tiến Python). Đây là các tài liệu chính thức quy định mọi thay đổi và quy ước của Python. Hai PEP bạn sẽ gặp nhiều nhất:
- PEP 8 — quy chuẩn viết code (đặt tên biến, thụt lề, khoảng trắng)
- PEP 20 — triết lý Python
Toàn bộ PEP: https://peps.python.org/
6. Python 2 và Python 3 — Đừng nhầm
Trên mạng vẫn còn rất nhiều bài viết cũ dùng Python 2. Python 2 đã ngừng hỗ trợ hoàn toàn từ 01/01/2020.
Dấu hiệu nhận biết code Python 2 (cần bỏ qua):
print "Xin chao" # ❌ Python 2 — không có dấu ngoặc
raw_input("Nhap ten: ") # ❌ Python 2 — Python 3 dùng input()Code Python 3 đúng:
print("Xin chao") # ✅
input("Nhap ten: ") # ✅Quy tắc lọc thông tin
Khi tìm tài liệu trên Google, luôn thêm từ khóa
python 3và kiểm tra năm xuất bản. Bài viết trước 2020 rất dễ là Python 2.
7. Thực hành bắt buộc (không cần máy tính)
Bài 1 — Viết thuật toán bằng tiếng Việt
Viết ra giấy các bước để máy tính làm những việc sau. Yêu cầu: chi tiết đến mức người không biết gì cũng làm theo được.
- Tính tiền điện, biết: 50 số đầu giá 1.800đ/số, từ số 51 trở đi giá 2.500đ/số.
- Xác định một năm có phải năm nhuận không.
- Tìm số lớn nhất trong một danh sách 10 số.
Gợi ý cho bài 1
1. Nhận vào: số điện tiêu thụ (gọi là SoDien) 2. Nếu SoDien <= 50 thì: TienDien = SoDien × 1800 3. Ngược lại thì: TienDien = 50 × 1800 + (SoDien − 50) × 2500 4. In ra TienDien
Giữ lại 3 tờ giấy này. Đến tuần 9–10, bạn sẽ viết lại chúng bằng code Python thật.
Bài 2 — Đối chiếu với SQL
Viết một câu SQL bất kỳ bạn hay dùng trong công việc. Sau đó liệt kê: câu SQL đó đang mô tả kết quả mong muốn ở chỗ nào, và có chỗ nào nó mô tả các bước thực hiện không?
Bài 3 — Ghi chú tổng kết
Mở Nhật ký học tập - Template, trả lời bằng lời của mình:
- Interpreted language khác compiled language ở chỗ nào?
- Vì sao Python phân biệt chữ hoa chữ thường mà SQL thì không quan trọng?
- Sau module này, điều gì làm tôi thấy khó hình dung nhất?
8. Tự kiểm tra
- Tôi giải thích được “chương trình máy tính là gì” cho người ngoài ngành nghe
- Tôi phân biệt được compiler và interpreter
- Tôi biết vì sao file
.pycần cài Python mới chạy được - Tôi hiểu SQL là declarative còn Python là imperative
- Tôi biết Python 2 đã lỗi thời và cách nhận biết code Python 2
9. Tài liệu chính thức
| Nguồn | Nội dung | Link |
|---|---|---|
| Python.org — What is Python? | Giới thiệu tổng quan chính thức | https://www.python.org/doc/essays/blurb/ |
| PEP 20 — The Zen of Python | Triết lý thiết kế Python | https://peps.python.org/pep-0020/ |
| Python Glossary | Từ điển thuật ngữ chính thức | https://docs.python.org/3/glossary.html |
| Python FAQ — General | Câu hỏi thường gặp | https://docs.python.org/3/faq/general.html |
Tiếp theo → 01 - Cài đặt môi trường