Chuẩn bị thi PCAP: từ Node.js sang Python bài bản
Kinh nghiệm ôn thi PCAP (Certified Associate in Python Programming) của một developer đi lên từ Node.js: cấu trúc đề thi, cách ôn, những bẫy dễ sai nhất có code minh hoạ, và mẹo cho ngày thi.
- Career
- Tutorials
Mấy năm nay mình viết backend chủ yếu bằng Node.js và TypeScript. Từ giữa năm 2026, công việc mới cần Python nhiều hơn: mình bắt đầu ship tính năng bằng FastAPI và Django REST Framework. Viết Python chạy được thì không khó, nhưng mình muốn hiểu ngôn ngữ một cách bài bản chứ không chỉ "dịch" thói quen JavaScript sang. Vì vậy mình đặt mục tiêu cuối năm là lấy chứng chỉ PCAP.
Mình đã ôn xong và sắp thi. Bài này ghi lại những gì mình chuẩn bị, những phần dễ sai nhất, và vài lời khuyên cho ai đang tính thi.
PCAP là gì#
PCAP – Certified Associate in Python Programming là chứng chỉ của Python Institute (OpenEDG), ở cấp độ thứ hai trong lộ trình:
PCEP (Entry) ─▶ PCAP (Associate) ─▶ PCPP1 ─▶ PCPP2 (Professional)PCAP kiểm tra bạn có hiểu Python ở mức một developer làm việc hằng ngày hay không: module và package, exception, chuỗi, lập trình hướng đối tượng, generator, closure, xử lý file. Bài thi không yêu cầu framework nào, chỉ có ngôn ngữ và thư viện chuẩn.
Thông tin kỳ thi PCAP-31-03 tại thời điểm mình viết bài:
| Mục | Chi tiết |
|---|---|
| Số câu | 40 câu, chọn một hoặc nhiều đáp án |
| Thời gian | 65 phút (cộng khoảng 10 phút đọc và đồng ý NDA) |
| Điểm đạt | 70% |
| Lệ phí | Khoảng 295 USD một lần thi |
| Hình thức | Pearson VUE (tại trung tâm hoặc thi online có giám sát) |
Những con số này có thể thay đổi giữa các phiên bản đề, nên hãy kiểm tra lại trên trang chính thức của Python Institute trước khi đăng ký.
Đề thi gồm những phần nào#
Đề chia thành năm nhóm kiến thức. OOP chiếm tỷ trọng lớn nhất, nên đó là phần mình dành nhiều thời gian nhất:
| Phần | Tỷ trọng (khoảng) | Nội dung chính |
|---|---|---|
| Modules & Packages | 12% | import, from … import, __name__, sys.path, __init__.py, math, random, platform |
| Exceptions | 14% | try/except/else/finally, thứ bậc exception, raise, assert, tự định nghĩa exception |
| Strings | 18% | Bất biến, slicing, các phương thức chuỗi, so sánh, ord/chr |
| Object-Oriented Programming | 34% | Class, instance, thuộc tính, kế thừa, MRO, super(), name mangling, introspection |
| Miscellaneous | 22% | List comprehension, lambda, map/filter, closure, generator, file I/O |
Mình đã ôn như thế nào#
Mình ôn trong khoảng tháng 6 và tháng 7, tầm 5 giờ mỗi tuần, chủ yếu buổi tối:
- Học theo khoá có cấu trúc. Mình theo một lộ trình trên LinkedIn Learning để đi lần lượt từng phần. Khoá miễn phí Python Essentials 2 trên OpenEDG cũng bám sát đề thi và là lựa chọn rất tốt.
- Code song song với học. Mỗi khái niệm mình đều gõ thử trong REPL. Với PCAP, dự đoán output là kỹ năng chính, và chỉ có tự chạy code mới luyện được.
- Áp dụng vào việc thật. Mình đang viết API bằng FastAPI và Django REST, nên nhiều thứ như exception tuỳ chỉnh, generator, cấu trúc package đều gặp hằng ngày. Học xong một phần là dùng ngay.
- Làm đề thử và ghi lại câu sai. Mỗi câu sai mình ghi vào một file riêng, kèm lý do. Danh sách đó cuối cùng trở thành tài liệu ôn quý nhất.
Những chỗ dễ sai nhất#
Phần lớn câu hỏi PCAP có dạng "đoạn code này in ra gì". Các bẫy dưới đây là những câu mình hay sai nhất. Mọi output đều đã được chạy thử bằng Python 3.
Default argument là mutable. Giá trị mặc định chỉ được tạo một lần, khi định nghĩa hàm:
def add(item, bucket=[]):
bucket.append(item)
return bucket
add(1)
print(add(2)) # [1, 2]Gán là tham chiếu, slicing là bản sao:
a = [1, 2, 3]
b = a # cùng một list
c = a[:] # bản sao nông
b.append(4)
print(a, c) # [1, 2, 3, 4] [1, 2, 3]Biến class và biến instance:
class Counter:
count = 0
def __init__(self):
Counter.count += 1
self.count = 10 # tạo biến instance, che biến class
x = Counter(); y = Counter()
print(Counter.count, x.count) # 2 10Name mangling. Thuộc tính bắt đầu bằng hai dấu gạch dưới bị đổi tên thành _TênClass__tên:
class Secret:
def __init__(self):
self.__key = 42
s = Secret()
print(hasattr(s, "__key"), s._Secret__key) # False 42Đa kế thừa và MRO. Python tìm phương thức theo thứ tự MRO: từ trái sang phải, nhưng class cha chung luôn đứng sau tất cả class con của nó:
class A:
def who(self): return "A"
class B(A):
def who(self): return "B"
class C(A):
def who(self): return "C"
class D(B, C): pass
print(D().who()) # B
print([k.__name__ for k in D.__mro__]) # ['D', 'B', 'C', 'A', 'object']Thứ tự các nhánh except. Nhánh đầu tiên khớp sẽ chạy. Đặt exception cha trước thì nhánh con không bao giờ được chạy tới:
try:
1 / 0
except ArithmeticError:
print("ArithmeticError") # chạy nhánh này
except ZeroDivisionError:
print("ZeroDivisionError") # không bao giờ tớiClosure bắt biến, không bắt giá trị (late binding):
fs = [lambda: i for i in range(3)]
print([f() for f in fs]) # [2, 2, 2]Muốn giữ giá trị tại thời điểm tạo, dùng default argument: lambda i=i: i.
Generator chỉ chạy một lần:
def gen():
for i in range(3):
yield i * i
g = gen()
print(next(g), list(g), list(g)) # 0 [1, 4] []Chuỗi là bất biến, và so sánh theo mã Unicode, nên chữ hoa đứng trước chữ thường:
print("abc" * 2) # abcabc
print("Python"[::-1]) # nohtyP
print("a,b,,c".split(",")) # ['a', 'b', '', 'c']
print("-".join("abc")) # a-b-c
print("B" < "a") # TrueMẹo cho ngày thi#
- Đọc kỹ đề, đặc biệt câu chọn nhiều đáp án. Đề sẽ ghi rõ cần chọn bao nhiêu đáp án. Chọn thiếu hay thừa đều mất điểm cả câu.
- Trace code trên giấy nháp. Với câu có vòng lặp, ghi giá trị từng biến qua mỗi bước thay vì đoán.
- Để ý từng ký tự. Một dấu : trong slicing, một lần gọi print thiếu ngoặc, is khác ==, / khác //. Đề thường bẫy ở những chi tiết nhỏ như vậy.
- Quản lý thời gian. 65 phút cho 40 câu là khoảng 1,5 phút mỗi câu. Câu nào khó thì đánh dấu, làm câu khác rồi quay lại.
- Kiểm tra máy trước nếu thi online. Webcam, kết nối mạng, phòng yên tĩnh, bàn trống. Chạy bài kiểm tra hệ thống của Pearson VUE trước ngày thi.
Chứng chỉ có đáng không#
Chứng chỉ không làm bạn thành developer giỏi hơn chỉ sau một đêm, và nhà tuyển dụng vẫn quan tâm tới việc bạn đã làm được gì hơn. Nhưng với mình, PCAP có ba giá trị thật:
- Lấp lỗ hổng kiến thức. Mình đã viết Python được một thời gian, nhưng chỉ khi ôn thi mới thật sự hiểu MRO, name mangling hay vì sao default argument mutable lại nguy hiểm.
- Tạo một mục tiêu có hạn chót. "Học Python cho kỹ" thì dễ trì hoãn mãi. "Thi PCAP cuối tháng 10" thì không.
- Ghi nhận bên ngoài cho một kỹ năng mới. Với người chuyển từ một ngôn ngữ khác sang, đó là bằng chứng rằng mình hiểu Python một cách bài bản, không chỉ biết dùng framework.
Mình sẽ cập nhật kết quả sau khi thi. Nếu bạn cũng đang ôn PCAP và muốn trao đổi, cứ nhắn mình.
Enjoyed this? Get the next one by email.
Keep reading
What's up with the future of IT and programming: The cool stuff and the tricky bits
This piece is all about what's next for the IT world, especially for the coding gurus out there. Cool new tech stuff like AI, machine learning, VR, blockchain, and IoT are going to open up a whole bunch of job opportunities and make a difference in all sorts of areas. But here's the kicker - if you want to do well in this space, you've gotta keep on learning and stay up-to-date with the latest and greatest.
Start learning programming from scratch: Necessary steps and advice
Hey there! This article's gonna show you all the steps you need to start learning programming from zero, no sweat. We'll walk you through picking a programming language, finding study materials, and getting in some good practice. Plus, we'll show you how to join the programming community and connect with other folks who are just as into this stuff as you are.