Dữ liệu FDE TimesViệc làm FDE đang mở 863▼55 Thay đổi số việc đang mở trong 7 ngày, so sánh cùng phạm vi: không tính việc của các công ty mới được theo dõi tuần nàyMới trong 7 ngày 71Công ty đang tuyển 181Nhận làm từ xa 24%Lương trung vị (Mỹ) $200kTuyển nhiều nhất Palantir 95
中文EN

Tờ báo của nghề Forward Deployed Engineer

Sách & khoá học

Tuần học đáng giá nhất với FDE trong khoá Python miễn phí của Harvard

Tuần 5 của CS50P dạy assert, pytest và đóng gói code, nền tối thiểu cho code chạy trên dữ liệu khách và sẽ được người khác tiếp quản.

Chia sẻLinkedInFacebookX

Tóm tắt nhanh

  • CS50P do David J. Malan dạy, học liệu miễn phí qua OpenCourseWare, không có điều kiện tiên quyết, mỗi tuần 3–9 giờ.
  • Với người muốn làm FDE, các tuần đáng học kỹ nhất là ngoại lệ, unit test với pytest, File I/O và regex.
  • Kỳ học hiện tại kết thúc ngày 30/6/2027 và bài làm từ phiên bản cũ có thể không được tính, nên hãy học xong trong kỳ này.
Dòng thời gian dọc gồm mười tuần của CS50P, đánh số từ 0 đến 9. Tuần 5, Unit test, được tô màu cam và ghi chú là tuần quan trọng nhất, với nội dung assert, pytest, package. Các tuần 3 (Ngoại lệ), 6 (File I/O) và 7 (Regex) được tô màu xanh mòng két, nghĩa là nên học kỹ. Các tuần còn lại để màu xám.
Trong mười tuần của CS50P, tuần 5 dạy assert, pytest và đóng gói code. Đây là nền tối thiểu của FDE. Các tuần 3, 6 và 7 nên học kỹ cùng tuần 5. Nguồn: giáo trình CS50P, cs50.harvard.edu/python.

Giáo trình CS50P đánh số từ tuần 0 đến tuần 9. Với người muốn làm FDE, tuần nên học kỹ nhất không phải tuần OOP hay tuần thư viện mà là Tuần 5, nơi David J. Malan dạy assert, AssertionError, pytest và cách gom code thành package bằng __init__.py.

Lý do nằm ở chính công việc. Code bạn viết ở chỗ khách hàng sẽ chạy trên dữ liệu không do bạn tạo ra, và người khác sẽ phải tiếp quản nó khi bạn đã rời dự án.

Vì thế, một nền Python có test, có xử lý lỗi đàng hoàng là điều kiện tối thiểu của FDE, không phải điểm cộng. CS50P dạy đúng nền đó.

Ai dạy, và học bằng cách nào?

Tên đầy đủ của khoá là CS50’s Introduction to Programming with Python, trang chính thức ở cs50.harvard.edu/python. Harvard giới thiệu Malan là Gordon McKay Professor of the Practice of Computer Science. Ông đứng lớp CS50 từ năm 2007.

Theo Harvard PLL, khoá học dài 9 tuần, tự học theo tốc độ riêng, mỗi tuần 3–9 giờ. Giáo trình có mười bài giảng, đánh số từ 0 đến 9. Học liệu xem miễn phí qua OpenCourseWare; muốn lấy chứng chỉ, dù miễn phí hay có phí, bạn phải đăng ký tài khoản edX.

Khoá học không yêu cầu kinh nghiệm lập trình, cũng không bắt bạn chứng minh đã học khoá nào trước đó. Kỳ hiện tại bắt đầu ngày 1/1/2026, hạn chót chung là 30/6/2027 và không có hạn nộp riêng cho từng bài.

Có một điểm cần để ý: khi có phiên bản mới, bài làm từ phiên bản cũ có thể không được tính. Vì vậy, đừng để dở dang sang năm sau.

Mười bài giảng ghép lại thành một việc FDE quen thuộc

Mười bài giảng lần lượt gồm hàm và biến, điều kiện, vòng lặp, ngoại lệ, thư viện, unit test, File I/O, regex, OOP và phần Et Cetera, rồi đến đồ án cuối khoá. Nếu đọc từng tuần riêng lẻ, đây chỉ là một danh sách quen thuộc. Ghép lại thì chúng khớp với một việc rất đời thường của FDE.

Hãy thử hình dung khách hàng gửi bạn một file CSV xuất từ hệ thống cũ. Cột ngày có chỗ ghi “2026-03-01”, có chỗ ghi “01/03/2026”, và vài dòng chứa chữ thay vì ngày.

Để xử lý file này, bạn cần File I/O (tuần 6) để đọc file, regex (tuần 7) để nhận ra hai định dạng, và ngoại lệ (tuần 3) để xử lý dòng hỏng mà chương trình không bị sập.

import re

def parse_date(s):
    if m := re.fullmatch(r"(\d{4})-(\d{2})-(\d{2})", s):
        y, mo, d = m.groups()
    elif m := re.fullmatch(r"(\d{2})/(\d{2})/(\d{4})", s):
        d, mo, y = m.groups()
    else:
        raise ValueError(f"Ngày không hợp lệ: {s}")
    return f"{y}-{mo}-{d}"

Bước còn lại là tuần 5: viết test để chốt cách hàm này phải hoạt động, trước khi đem nó chạy trên dữ liệu thật.

import pytest
from parse import parse_date

def test_hai_dinh_dang():
    assert parse_date("2026-03-01") == "2026-03-01"
    assert parse_date("01/03/2026") == "2026-03-01"

def test_dong_hong():
    with pytest.raises(ValueError):
        parse_date("hôm qua")

Lỗi hay gặp: regex khớp, nhưng ngày vẫn sai

Hai test trên đều qua, nhưng hàm vẫn có lỗ hổng. Đưa vào “99/99/2026”, regex khớp ngon lành vì \d{2} chỉ kiểm tra có hai chữ số, và hàm trả về “2026-99-99” như thể đó là một ngày thật.

Đây là lỗi điển hình khi mới dùng regex: regex kiểm tra hình dạng của chuỗi, không kiểm tra ý nghĩa. Cách sửa là để thư viện chuẩn xác nhận ngày, rồi viết test cho đúng trường hợp đã lọt lưới.

import re
from datetime import date

def parse_date(s):
    if m := re.fullmatch(r"(\d{4})-(\d{2})-(\d{2})", s):
        y, mo, d = m.groups()
    elif m := re.fullmatch(r"(\d{2})/(\d{2})/(\d{4})", s):
        d, mo, y = m.groups()
    else:
        raise ValueError(f"Ngày không hợp lệ: {s}")
    date(int(y), int(mo), int(d))  # dòng mới: ném ValueError nếu ngày không tồn tại
    return f"{y}-{mo}-{d}"

Và một test mới cho đúng trường hợp vừa lọt lưới:

def test_ngay_khong_ton_tai():
    with pytest.raises(ValueError):
        parse_date("99/99/2026")

Bài tập cho bạn: khách hàng vừa gửi thêm các dòng kiểu “1/3/2026”, không có số 0 đứng đầu. Hãy viết test trước cho đầu ra “2026-03-01”, thêm một test bảo đảm “31/02/2026” bị từ chối, rồi mới sửa regex và phần định dạng đầu ra cho đến khi mọi test đều qua.

Ba ý nên mang theo sau khoá học

Ý đầu tiên: lỗi là chuyện bình thường. Ghi chú bài giảng tuần 0 của khoá viết rằng bug là một phần tự nhiên của việc lập trình, là vấn đề để bạn giải quyết, và khuyên người học đừng nản.

Với FDE, lời khuyên đó mang một nghĩa cụ thể hơn: dữ liệu hỏng sẽ luôn xuất hiện, nên chỗ raise ValueError ở trên là một quyết định thiết kế, không phải đoạn code vá tạm.

Ý thứ hai: test là cách bạn thoả thuận với chính mình và với người tiếp quản code. Các test ở trên mô tả chính xác những gì hàm chấp nhận và những gì nó từ chối. Khi khách hàng gửi thêm định dạng mới, bạn thêm một dòng assert rồi mới sửa code, nhờ vậy biết chắc mình không làm hỏng các định dạng cũ.

Ý thứ ba: code để lại cho người khác dùng phải được đóng gói. Tuần 4 dạy cách dùng thư viện, tuần 5 dạy cách tự tạo package với __init__.py. Một script đặt trong thư mục Downloads khác hẳn một package mà kỹ sư phía khách hàng có thể import và chạy test sau khi bạn rời dự án.

Ai nên học, và học theo thứ tự nào?

Nếu bạn đã có 2-8 năm làm việc với Java, C# hay JavaScript, có thể đi lướt tuần 0–2 trong một hai buổi tối.

Hãy để dành thời gian cho tuần 3, 5, 6 và 7, và làm hết bài tập của các tuần đó, kể cả những bài trông có vẻ dễ.

Người mới bắt đầu thì nên học theo đúng thứ tự, vì khoá học được thiết kế cho cả người chưa từng lập trình.

Đồ án cuối khoá là phần nên đầu tư nhiều nhất. Hãy chọn một bài toán giống việc thật ở chỗ khách hàng, ví dụ công cụ làm sạch file export như ví dụ trên, có thư mục test và README hướng dẫn chạy. Khi viết CV, hãy mô tả nó như một dự án (“xử lý N định dạng dữ liệu, có pytest”), đừng chỉ ghi tên khoá học.

Về chứng chỉ, CS50 cấp miễn phí một chứng chỉ của riêng mình. Ngoài ra còn có chứng chỉ verified trên edX, có tính phí, mà bạn có thể dùng làm bằng chứng với nhà tuyển dụng.

Dù chọn loại nào, khi ứng tuyển vị trí FDE, bạn nên coi repo đồ án là bằng chứng chính, còn chứng chỉ chỉ là phần phụ. Hãy để thư mục tests/ lên tiếng thay bạn.

CS50P sẽ không biến bạn thành FDE. Điều nó giúp được là để lần đầu nhận file dữ liệu lộn xộn từ khách hàng, phản xạ đầu tiên của bạn là viết test, chứ không phải chạy thử rồi cầu may.

Bài này có hữu ích không?

Dùng cùng trợ lý AIHỏi Claude ↗Hỏi ChatGPT ↗
7 nguồn
Đọc tiếp trên lộ trình · Chặng 1: Nền tảngVì sao The Pragmatic Programmer hợp với FDE làm việc một mình ở kháchLời khuyên “mang phương án đến, đừng mang lời bào chữa” là cách FDE báo tin xấu khi không có trưởng nhóm nào đứng ra đỡ lời.