TopDev

Các lỗi mà lập trình viên hay mắc phải khi lập trình tool, job và prosess

minhdev 📖 18 phút đọc 💬 2 phản hồi

Dưới đây là tổng hợp đầy đủ – chi tiết – thực tế các lỗi mà lập trình viên hay mắc phải khi viết tool, job, process (background jobs, batch, scheduled task, worker…). Danh sách này bao gồm cả lỗi logic, kỹ thuật, hiệu năng và vận hành.



I. Lỗi về luồng xử lý (Process / Thread / Worker)

1. Không kiểm soát số lượng thread/process#

  • Tạo quá nhiều thread → treo server, hết RAM.

  • Không dùng thread pool, executor.

  • Job chạy song song nhưng tranh chấp tài nguyên.

2. Deadlock / Race Condition#

  • Nhiều thread truy cập chung một tài nguyên nhưng không lock.

  • Dùng synchronized sai chỗ.

  • Lock chéo (A lock B → B lock A → chết).

3. Không xử lý timeout#

  • Gọi API/DB mà không set timeout → job treo mãi.

  • Không có circuit breaker.

4. Không retry hoặc retry không giới hạn#

  • Không retry → job fail.

  • Retry vô hạn → loop vô tận, spam DB, spam API.



II. Lỗi liên quan đến dữ liệu & database

5. Không commit/rollback transaction#

  • Transaction mở nhưng không đóng → lock DB → gây treo.

6. Lấy quá nhiều dữ liệu 1 lần#

  • Dùng SELECT * lấy hàng triệu row → vỡ RAM.

  • Lỗi không phân trang → batch không kiểm soát.

7. Xử lý trùng dữ liệu#

  • Job chạy 2 lần → xử lý cùng một record → tạo data ảo.

8. Không có cơ chế “idempotent”#

  • Gọi lại job nhiều lần → kết quả sai (ví dụ tính tiền nhiều lần).


III. Lỗi trong lập trình tool / batch

9. Không kiểm soát thời gian chạy của job#

  • Job 1h chạy hết 2h → chồng lên job tiếp theo → crash.

10. Không log hoặc log quá nhiều#

❌ Không log: không biết lỗi ở đâu ❌ Log quá nhiều: đầy ổ cứng ❌ Không phân mức log: info/warn/error

11. Hardcode configuration#

  • URL DB, API key viết trực tiếp trong code.

  • Không dùng cấu hình (.env, config file).

12. Không validate input#

  • Tool nhận file CSV → không kiểm tra format → fail toàn bộ.

13. Không catch exception đúng chỗ#

  • Để exception văng ra làm chết toàn bộ process.

  • Catch chung chung nhưng không xử lý triệt để.

14. Không kiểm tra file tồn tại / quyền truy cập#

  • Xử lý file nhưng không check file tồn tại → lỗi runtime.


IV. Lỗi về hiệu năng & tài nguyên

15. Rò rỉ bộ nhớ (Memory Leak)#

  • Mở stream/connection rồi không đóng.

  • Lưu cache không clear.

  • Dùng thư viện lớn trong vòng lặp.

16. Đọc file lớn vào RAM 1 lần#

  • File 10GB mà đọc nguyên file → OOM.

  • Không dùng streaming.

17. Không kiểm soát CPU#

  • Vòng lặp vô hạn.

  • Dùng thuật toán không tối ưu.



V. Lỗi khi dùng job scheduler (cron, Quartz, Spring Scheduler, Jenkins)

18. Cron chạy sai giờ#

  • Lỗi múi giờ.

  • Cron pattern sai.

19. Job chạy nhưng không có thông báo#

  • Không gửi email/slack khi job fail.

  • Không có monitoring job.

20. Không khóa job khi đang chạy#

  • 2 job chạy song song → conflict.

  • Thiếu cơ chế distributed lock (Redis, DB, Quartz).



VI. Lỗi khi triển khai (deploy & vận hành)

21. Không tách môi trường DEV / TEST / PROD#

  • Dùng API key thật trong dev.

  • Gửi thông báo thật khi test.

22. Không chuẩn bị cơ chế restart / resume#

  • Job fail giữa chừng → chạy lại từ đầu.

  • Không có checkpoint.

23. Không làm job “stateless”#

  • Job phụ thuộc vào state trong RAM → restart là mất.


VII. Lỗi quản lý file / thư mục / input-output

24. Không kiểm tra encoding#

  • CSV UTF-8 đi vào tool Latin1 → lỗi chữ.

25. Không xử lý ngoại lệ khi ghi file#

  • Dung lượng disk full → ghi hỏng.


VIII. Lỗi bảo mật

26. Lộ API key / token trong log#

  • Log cả header Authorization → lộ token.

27. Không giới hạn quyền#

  • Tool có thể đọc/xóa toàn bộ file mà không cần quyền.


🔥 IX. Lỗi logic nghiệp vụ

28. Job không dừng đúng cách#

  • Dùng Thread.sleep() lung tung.

  • Không có cơ chế graceful shutdown.

29. Lặp vô tận do quên tăng index#

while (i < size) { // thiếu i++ }

30. Không test kỹ trước khi chạy thật#

  • Không dùng dữ liệu mẫu.

  • Test trực tiếp trên production.

2 phản hồi

  1. minhdev #1

    Dưới đây là TÀI LIỆU CHUẨN HOÀN CHỈNH dành cho DEV – PM – VẬN HÀNH khi làm việc với Tool – Job – Process – Batch – Scheduler. Bạn có thể dùng tài liệu này để đào tạo team, chuẩn hoá quy trình, hoặc đưa vào wiki nội bộ.



    📘 **TÀI LIỆU CHUẨN VẬN HÀNH TOOL & JOB

    Dành cho DEV – PM – Vận hành**



    1. MỤC ĐÍCH TÀI LIỆU

    • Chuẩn hoá quy trình xây dựng và vận hành tool/job/process.

    • Giảm lỗi, tránh sự cố production.

    • Tạo sự phối hợp rõ ràng giữa DEV – PM – VẬN HÀNH.

    • Đảm bảo job chạy ổn định, an toàn và có khả năng phục hồi.



    2. KHÁI NIỆM CƠ BẢN

    Thuật ngữ Định nghĩa
    Tool Chương trình chạy theo yêu cầu (CLI/desktop/web).
    Job / Batch Tác vụ xử lý nền, chạy schedue hoặc thủ công.
    Process Tiến trình chạy độc lập, có thể song song hoặc background.
    Worker Tiến trình xử lý hàng đợi (queue).
    Scheduler Bộ lập lịch chạy job theo giờ (cron, Quartz…).
    Idempotent Chạy lại nhiều lần vẫn ra kết quả giống nhau, không gây lỗi dữ liệu.


    3. TRÁCH NHIỆM CỦA TỪNG BÊN

    3.1. Trách nhiệm DEV#

    • Thiết kế, viết code tool/job/process theo tiêu chuẩn.

    • Viết log rõ ràng, có phân cấp (INFO/WARN/ERROR).

    • Tối ưu hiệu năng, tránh memory leak, deadlock.

    • Đảm bảo job idempotent.

    • Tạo file config độc lập theo môi trường.

    • Viết tài liệu hướng dẫn sử dụng (README).

    • Viết tài liệu deploy.

    • Bàn giao job kèm:

      Diagram luồng xử lý

      • Input/output mẫu

      • Danh sách lỗi thường gặp

      • Cách restart/resume

      • Các cảnh báo cần monitoring



    3.2. Trách nhiệm PM#

    • Xác định yêu cầu business.

    • Kiểm tra logic đầu vào/đầu ra job.

    • Phê duyệt lịch chạy job (time window).

    • Kiểm tra tài liệu DEV bàn giao.

    • Thống nhất với vận hành về rủi ro và biện pháp dự phòng.

    • Kiểm thử quy trình end-to-end.



    3.3. Trách nhiệm VẬN HÀNH#

    • Deploy job đúng tài liệu DEV cung cấp.

    • Theo dõi log, monitoring, cảnh báo.

    • Kiểm tra job chạy đủ điều kiện trước khi chạy thật.

    • Khắc phục sự cố theo checklist chuẩn.

    • Báo cáo và ghi log sự cố theo quy trình.

    • Không chỉnh sửa code hoặc config khi không được DEV phê duyệt.



    4. QUY TRÌNH CHUẨN KHI XÂY TOOL/JOB



    4.1. Giai đoạn phân tích (PM – DEV)

    • Xác định nghiệp vụ cần xử lý.

    • Phân loại job:

      Định kỳ

      • Theo yêu cầu

      • Một lần duy nhất

    • Xác định:

      Input

      • Output

      • Dữ liệu bị tác động

      • Rủi ro khi chạy job

    • PM phê duyệt yêu cầu.



    4.2. Giai đoạn thiết kế (DEV)

    DEV phải cung cấp:

    1. Kiến trúc job#

    • Flow data

    • Luồng xử lý

    • Cơ chế retry

    • Cơ chế idempotent

    • Cơ chế checkpoint (nếu job dài)

    • Cơ chế lock (tránh chạy song song)

    2. Thiết kế logging#

    • Log start & end

    • Log số lượng xử lý

    • Log lỗi chi tiết

    • Log cảnh báo (như timeout, chậm, retry nhiều)

    3. Thiết kế config#

    • File .env hoặc YAML

    • Không hardcode

    • Cho phép điều chỉnh mà không cần build lại code

    4. Thiết kế giám sát#

    • Email khi fail

    • Slack/Telegram alert

    • Dashboard monitoring job



    4.3. Giai đoạn lập trình (DEV)

    DEV phải đảm bảo:

    1. Code phải có các chuẩn sau:#

    • Xử lý lỗi đầy đủ try/catch.

    • Retry tối đa 3 lần.

    • Timeout với API/DB.

    • Không chặn main thread dài.

    • Sử dụng batch/stream để xử lý dataset lớn.

    • Đảm bảo không mất dữ liệu.

    2. Không mắc lỗi sau:#

    • Memory leak

    • Deadlock

    • Lỗi xử lý trùng

    • Lặp vô hạn

    • Gọi API mà không catch exception



    4.4. Kiểm thử (DEV – PM)

    DEV phải cung cấp test:#

    • Test đơn vị (unit test).

    • Test với dữ liệu giả lập.

    • Test trường hợp lỗi.

    • Test job chạy không ảnh hưởng hệ thống khác.

    PM phải:#

    • Kiểm thử logic dữ liệu.

    • Kiểm tra kết quả output.



    4.5. Bàn giao cho vận hành (DEV → Ops)

    DEV phải bàn giao:

    • File deploy

    • Tài liệu hướng dẫn cài đặt

    • Cách chạy job

    • Cách stop / resume

    • Case lỗi thường gặp

    • Checkpoint/recovery (nếu job dài)

    • Cảnh báo cần theo dõi

    • Câu lệnh kiểm tra process



    4.6. Deploy & chạy thử (Ops)

    OPS phải:

    • Deploy đúng môi trường.

    • Test thử job phiên bản staging/dev.

    • Kiểm tra quyền truy cập DB.

    • Kiểm tra dung lượng RAM/CPU/disk.

    • Kiểm tra firewall, kết nối API.

    • Chạy thử 1 job mẫu.



    4.7. Chạy thật (Production)

    OPS phải:

    • Kiểm tra điều kiện trước khi chạy:

      DB có backup chưa

      • Dữ liệu đầu vào chuẩn chưa

      • Có người chịu trách nhiệm giám sát không

    • Chạy job theo đúng thời gian yêu cầu.

    • Theo dõi:

      Log

      • CPU/RAM

      • Số lượng record đã xử lý

    • Nếu lỗi:

      Ghi lại log lỗi

      • Báo ngay cho DEV/PM

      • Không restart khi chưa được DEV xác nhận



    5. CHECKLIST CHUẨN (Dùng cho tất cả các team)



    5.1. CHECKLIST CHO DEV

    Trước khi bàn giao:#

    • Code có log đầy đủ

    • Code không hardcode

    • Có config riêng từng môi trường

    • Có tài liệu hướng dẫn

    • Job đảm bảo idempotent

    • Có retry cơ bản

    • Có timeout

    • Có cảnh báo khi fail

    • Test trên dữ liệu thật (sample data)



    5.2. CHECKLIST CHO PM

    • Yêu cầu nghiệp vụ rõ ràng

    • Review logic đầu vào/đầu ra

    • Xác định rủi ro và biện pháp

    • Phê duyệt lịch chạy

    • Kiểm thử lại job sau khi DEV test



    5.3. CHECKLIST CHO VẬN HÀNH

    • Nắm rõ điều kiện chạy job

    • Đã test trên môi trường staging

    • Backup DB trước khi chạy

    • Theo dõi log real-time khi job chạy

    • Gửi báo cáo sau khi job hoàn thành

    • Báo lỗi ngay nếu job chạy quá thời gian



    6. QUY TRÌNH XỬ LÝ SỰ CỐ (Incident Handling)

    • Ops phát hiện lỗi → Ghi log lỗi → Thông báo DEV & PM.

    • DEV phân tích:

      Lỗi logic

      • Lỗi DB

      • Lỗi môi trường

    • PM quyết định:

      Chạy lại job

      • Rollback dữ liệu

      • Dừng toàn hệ thống (nếu nghiêm trọng)

    • DEV fix bug & gửi patch.

    • OPS deploy lại.

    • PM xác nhận kết quả.



    7. MẪU BÁO CÁO JOB CHẠY

    Tên job: Môi trường: Thời gian chạy: Số bản ghi xử lý: Số lỗi: Thời gian hoàn thành: Kết quả: Thành công / Thất bại Ghi chú thêm:



    8. BONUS: SƠ ĐỒ QUY TRÌNH TƯƠNG TÁC DEV – PM – OPS

    PM → Viết yêu cầu → DEV phân tích & thiết kế → PM duyệt → DEV code → DEV test → PM test → DEV bàn giao → OPS deploy → OPS test → Chạy production → OPS giám sát → Báo cáo PM & DEV

  2. minhdev #2

    Dưới đây là CHECKLIST ĐẦY ĐỦ – HOÀN CHỈNH – CHUYÊN NGHIỆP để bạn hoặc team DEV sử dụng khi viết bất kỳ tool / job / batch / process / worker nào.

    Có thể copy đưa vào Notion, Wiki, Jira, Confluence hoặc in ra để kiểm tra từng mục.



    CHECKLIST VIẾT TOOL / JOB / PROCESS CHUẨN CHO DEV



    I. CHECKLIST PHÂN TÍCH (Requirement)

    ✔ 1. Xác định rõ loại job#

    • Job chạy định kỳ (cron)

    • Job chạy theo sự kiện

    • Job chạy thủ công

    • Job chạy một lần duy nhất

    ✔ 2. Xác định phạm vi xử lý#

    • Input là gì?

    • Output là gì?

    • Dữ liệu nào bị thay đổi?

    • Dữ liệu nào nhạy cảm?

    • Rủi ro nếu job sai?

    ✔ 3. Yêu cầu nghiệp vụ đầy đủ#

    • Định nghĩa rõ rule xử lý

    • Điều kiện chạy

    • Điều kiện không được chạy

    • Những case đặc biệt



    II. CHECKLIST THIẾT KẾ

    ✔ 4. Thiết kế flow xử lý#

    • Flowchart / Sequence Diagram

    • Các bước xử lý rõ ràng

    • Có điểm checkpoint nếu job dài

    ✔ 5. Thiết kế an toàn dữ liệu#

    • Idempotent (chạy lại không gây trùng dữ liệu)

    • Lock tránh chạy song song

    • Transaction rõ ràng

    • Có rollback khi sai

    ✔ 6. Thiết kế hiệu năng#

    • Xử lý theo batch (limit 100/500/1000)

    • Streaming xử lý file lớn

    • Không load toàn bộ dữ liệu vào RAM

    • Index DB phù hợp

    ✔ 7. Thiết kế cơ chế retry#

    • Retry tối đa 3 lần

    • Retry exponential backoff

    • Chỉ retry lỗi mạng, không retry lỗi logic

    ✔ 8. Thiết kế timeout#

    • API timeout

    • DB timeout

    • Job timeout tổng thể

    ✔ 9. Thiết kế logging#

    • Log start / end

    • Log ID bản ghi

    • Log lỗi chi tiết

    • Có phân quyền log (INFO / WARN / ERROR)

    • Không log password/api-key

    ✔ 10. Thiết kế cấu hình#

    • Config qua file .env / YAML

    • Không hardcode

    • Có config DEV – TEST – PROD riêng

    ✔ 11. Thiết kế cảnh báo / monitoring#

    • Gửi email khi job fail

    • Gửi Telegram/Slack/SMS khi lỗi

    • Gửi cảnh báo khi job chạy lâu hơn dự kiến

    • Dashboard theo dõi job



    III. CHECKLIST LẬP TRÌNH

    ✔ 12. Viết code chuẩn#

    • Try/catch đầy đủ

    • Không try/catch trống

    • Không throw exception chung chung

    • Không sử dụng Thread.sleep() không cần thiết

    • Không tạo thread tự do → dùng thread pool

    ✔ 13. API call chuẩn#

    • Có timeout

    • Có retry

    • Kiểm tra response đầy đủ

    • Không để job treo chờ API

    ✔ 14. Database chuẩn#

    • Query có pagination

    • Có transaction

    • Không SELECT *

    • Không update toàn bảng khi thiếu điều kiện

    • Với dữ liệu lớn → dùng cursor/streaming

    ✔ 15. Đọc/ghi file#

    • Kiểm tra file tồn tại

    • Kiểm tra quyền truy cập

    • Ghi theo stream

    • Đóng file/stream đúng cách

    ✔ 16. Đảm bảo không memory leak#

    • Close connection đúng cách

    • Không lưu object lớn vào list mà chưa clear

    • Loop xử lý phải giải phóng tài nguyên

    ✔ 17. Kiểm tra idempotent#

    • Nếu chạy lại → không tạo data trùng

    • Không xử lý lại record đã xử lý

    • Có trường trạng thái (pending → processing → done)

    ✔ 18. Kiểm tra lock#

    • Dùng Redis lock / DB lock để tránh chạy song song

    • Có cơ chế unlock khi job fail



    IV. CHECKLIST TESTING

    ✔ 19. Test tính năng#

    • Test input hợp lệ

    • Test input thiếu

    • Test input sai format

    • Test dữ liệu boundary (0 record, 1 record, 100k record)

    ✔ 20. Test lỗi#

    • Mất kết nối DB

    • API timeout

    • Dữ liệu lỗi format

    • Gặp ngoại lệ giữa chừng

    ✔ 21. Test hiệu năng#

    • Test với 1k record

    • Test với 100k record

    • Test job chạy lâu

    • Test chạy song song 2 job

    ✔ 22. Test phục hồi#

    • Stop job giữa chừng → chạy lại

    • Resume từ checkpoint

    • Không xử lý trùng khi chạy lại



    V. CHECKLIST BÀN GIAO (DEV → OPS/PM)

    ✔ 23. DEV phải bàn giao#

    • Source code

    • File build

    • Tài liệu hướng dẫn chạy

    • Tài liệu cấu hình

    • Danh sách input/output

    • Mẫu file input test

    • Case lỗi thường gặp

    • Hướng dẫn rollback

    • Dashboard giám sát job



    VI. CHECKLIST TRIỂN KHAI & VẬN HÀNH (OPS)

    ✔ 24. Trước khi chạy job#

    • Kiểm tra môi trường

    • Kiểm tra kết nối API/DB

    • Kiểm tra dung lượng RAM/CPU

    • Kiểm tra dung lượng ổ cứng

    • Kiểm tra file input

    • Backup DB (nếu job quan trọng)

    ✔ 25. Khi chạy job#

    • Theo dõi log real-time

    • Theo dõi CPU/RAM

    • Theo dõi số lượng bản ghi xử lý

    • Có người trực giám sát

    ✔ 26. Khi job lỗi#

    • Ghi lại thời điểm lỗi

    • Ghi log lỗi

    • Không chạy lại khi chưa có hướng dẫn DEV

    • Gửi báo cáo cho DEV/PM

    ✔ 27. Sau khi chạy job#

    • Kiểm tra dữ liệu đã đúng chưa

    • Xuất file kết quả

    • Gửi báo cáo hoàn thành

    • Lưu lại log job



    VII. CHECKLIST AN TOÀN DỮ LIỆU

    ✔ 28. Không được:#

    • Xóa dữ liệu thật nếu chưa backup

    • Chạy job trên PROD mà không kiểm tra

    • Chỉnh sửa code trên production

    • Sửa file config mà không ghi lại biên bản

    ✔ 29. Bắt buộc:#

    • Có người chịu trách nhiệm giám sát

    • Có kế hoạch rollback

    • Ghi log tất cả thay đổi cấu hình

    • Theo dõi dashboard cảnh báo



    VIII. CHECKLIST HOÀN THIỆN TÀI LIỆU

    ✔ 30. Tài liệu phải có:#

    • Mục đích job

    • Mô tả flow xử lý

    • Input / Output

    • Cách chạy

    • Hướng dẫn rollback

    • Checkpoint / resume

    • Thời gian chạy dự kiến

    • Người chịu trách nhiệm

    • Các rủi ro

    • Các cảnh báo cần theo dõi



    🎉 READY TO USE

    Checklist trên đủ chi tiết để đảm bảo bất kỳ tool/job nào viết ra đều ổn định, an toàn, không lỗi và dễ vận hành.

Bài liên quan trong #Học Lập Trình

✓ Đã sao chép link