Kĩ sư phần mềm (software engineer) giỏi thì phải như thế nào?

Đây là nhận định chủ quan sau 1 thời gian làm 1 software engineer ở nhiều môi trường, cũng như qua trải nghiệm phỏng vấn & tiếp xúc với rất nhiều bạn engineers.
Người làm phần mềm/KHMT có 3 loại

21765647_10155120438718163_8907557714371157560_o

1- Người làm nghiên cứu (Computer Scientist) – thường làm việc ở trường ĐH và các viện nghiên cứu, thường có Master hoặc PhD. Thường kiến thức chuyên sâu CS rất tốt, và tư duy problem solving cao. Họ thường không tham gia lập trình các dự án phần mềm lớn nên code thường không đẹp và sẽ gây nhiều khó khăn cho dự án, nhưng nếu focus của họ là nghiên cứu chuyên sâu thì không vấn đề gì cả.

2- Application Developer – thường chuyên viết ứng dụng web, mobile, tuy nhiên họ thường thiếu các kiến thức về Computer Science, Algorithms, Data Structures, vv. Một phần có thể do các bạn không có điều kiện được tiếp xúc vì ít người dạy, một phần thì do hầu hết tính chất công việc đang làm ở VN không cho
các bạn cảm thấy những cái này quan trọng.

3- Software Engineer – là người có cái nhìn tổng quát tốt về mọi thứ, vừa có kiến thức vững về computer science như người làm nghiên cứu, vừa có khả năng lập trình cực tốt. Đây là loại mà các công ty phần mềm như Google, Facebook, Twitter luôn muốn tuyển vào.

Người làm nghiên cứu thì tiếp tục nghiên cứu vì đó là đam mê của họ. Còn người ở Application Developer nên/cần phải phát triển lên được level của Software Engineer, vì đó đơn giản là con đường phát triển mà các bạn phải lên tới được.

Theo cảm nhận chủ quan mình thấy thì Vietnam mình có nhiều người ở level Application Developer, nhưng rất ít bạn ở mức độ Software Engineer level.
Do vậy nhìn ngoài vào thì ai cũng nói ở VN có nhiều programmers, nhưng đến khi vào rồi thì phỏng vấn rất nhiều nhưng rất khó kiếm được bạn vừa ý.

(disclaimer: tên đặt ra có tính chất khái quát hoá, ko hàm chỉ title thực tại của các bạn tại công việc hiện tại)

Vậy trở thành software engineer giỏi (Google/Facebook engineer level) thì cần những gì?

21993146_10155120438818163_3120151265607844923_o

Đây là 1 biểu đồ các kiến thức nền tảng (fundamentals) mà mình tổng quát ra được, nhằm giúp các bạn định vị tốt hơn những điều các bạn đang có/cần bổ sung.

Nửa trên là những kiến thức thực tế cần thiết khi đi làm, bao gồm hiểu công nghệ, hiểu quy trình phát triển phần mềm, và kĩ thuật lập trình (clean coding, code refactoring, vv)

Nửa dưới là những kiến thức gốc/computer science mà các bạn cần nắm. Cần lưu ý là mình muốn nhấn mạnh tầm quan trọng của “Technical Framework of Thinking”, hay 1 cách khác là tư duy problem solving, tư duy system design.

Tư duy này là khả năng kết nối những kiến thức lẻ độc lập (lego blocks) mà các bạn học được bên dưới với nhau để đưa ra hướng giải quyết vấn đề.

Để ý thấy là thường các bạn Application Developer sẽ tập trung và nửa trên, và các bạn nghiên cứu sẽ tập trung vào nửa dưới.

Một cái nữa mình có cảm giác là ở VN các bạn nghĩ system architect, system design là 1 vị trí độc lập,
lên level 1 hồi mới tới được.

Quan điểm của mình là đây là tư duy mà một software engineer nào đề cần phải có, nếu chưa có thì bạn chỉ ở mức thợ thôi chứ không phải là kĩ sư.

Nếu bạn phỏng vấn vào các vị trí software engineer của Facebook/Google, bạn sẽ thấy những câu hỏi phỏng vấn đều sẽ test tổng quát hết những kiến thức nêu trên (trừ khi bạn là sinh viên mới ra trường, lúc đó câu hỏi pv sẽ xoay quanh lập trình thuật toán & cấu trúc dữ liệu).

Bạn có và chưa có gì trong những components của diagram trên?

Bài viết gốc của tác giả Huy Nguyen trên facebook


Leave a Reply

Your email address will not be published. Required fields are marked *