mấy thứ đại học không dạy về vận hành hệ thống
đại học dạy thuật toán, cấu trúc dữ liệu, cách viết compiler. không dạy cách deploy service mà nó không tắt giữa đêm, cách debug container docker đang crash, hay làm gì khi jenkins tự nhiên không chạy.
mấy thứ tôi học được từ 2 năm deploy code lên production.
đầu tiên là docker. container chạy ngon tới lúc nó không chạy nữa. exit code 137 là dấu hiệu OOM — kernel kill process vì hết RAM. lần đầu gặp tôi mất 2 tiếng mới hiểu.
giờ tôi luôn set memory limit cho container. docker không có limit mặc định, một container ăn hết RAM kéo mấy container khác chết theo. k8s thì có resource limit, docker thường phải tự thêm.
tiếp theo là jenkins. tôi không ghét jenkins, nhưng hiểu tại sao nhiều người ghét. vấn đề không phải nó phức tạp — mà là sự phức tạp đó không có chủ đích, tích tụ qua 15 năm.
vài rule tôi tự đặt: pipeline phải nằm trong Jenkinsfile trong repo, không config trên UI. lúc nào cũng bật timestamps với color. không dùng input trong pipeline. luôn clean workspace đầu mỗi build.
cái quan trọng nhất mà ít người nói tới là rollback. ai cũng bàn về chiến lược deploy, ít ai bàn về cách quay lại. trong production, rollback quan trọng hơn deploy. deploy hỏng không sao, miễn rollback được.
cách đơn giản nhất tôi dùng: tag image docker theo ngày, deploy bằng cách update tag, lỗi thì quay về tag cũ. database migration thì luôn làm backwards-compatible — thêm column nullable trước, deploy code xử lý null, backfill data, rồi mới thêm constraint.
cuối cùng là linux terminal. kỹ năng tôi dùng nhiều nhất mà trường không dạy. du, ss, strace, journalctl — mấy câu lệnh này cứu tôi nhiều lần. bạn có thể đi cả sự nghiệp không cần biết strace, nhưng ngày bạn cần nó vì một process treo không có log, bạn sẽ ước mình học sớm hơn.
trường cho tôi lý thuyết, production cho tôi sẹo. lý thuyết quan trọng, nhưng sẹo mới theo bạn lâu.
nếu bạn đang là sinh viên: mua con raspberry pi hoặc xài laptop cũ, cài linux, chạy service, bẻ nó, sửa nó. terminal không phán xét.