Bạn đang là kiểu lập trình viên nào?

694

Hiện nay, thị trường phần mềm đa phần yêu cầu ứng viên phải thành thạo ít nhất một ngôn ngữ hay framework nào đó. Tuy nhiên, ngôn ngữ lập trình liệu có còn là yếu tố tiên quyết khi ta xem hồ sơ của một lập trình viên?. Khái niệm một lập trình viên hiện đại đã đi xa hơn cả ngôn ngữ lập trình hay công cụ. Ở bài viết này, tôi sẽ phân biệt lại một số kiểu kỹ năng, giải thích yếu tố khiến ngành công nghiệp phần mềm trở nên phức tạp và những yếu tố phi kỹ thuật mà các lập trình viên cần có để có thể có một sự nghiệp thành công.

Giới thiệu

Image title

Với tính chất công việc và trách nhiệm của mình, tôi đã tham gia vào rất nhiều cuộc phỏng vấn ứng viên tại môt công ty phần mềm. HRs và cả người tuyển dụng nữa đã hỏi tôi về cái nhìn đối với một người là dân kỹ thuật từ góc nhìn của chính một dân kỹ thuật. Cụ thể những câu hỏi đó là như sau:

  • Bạn phân biệt dân kỹ thuật theo kiểu nào?
  • Làm thế nào để bạn đối chiếu nhưng yêu cầu trong Job Description với một CV?
  • Bạn có tìm kiếm một cái gì khác hơn không hay chỉ là câu trả lời cho những câu hỏi kỹ thuật?

Bài viết dưới đây sẽ phân loại các khuông mẫu kỹ năng cơ bản cho một lập trình viên và một phép ẩn dụ con đường sự nghiệp của một kỹ sư phần mềm với một đại lộ.

Phân loại lập trình viên

Chuyên gia/Specialist/Expert

Image title

Chuyên gia là người thông thạo về một lĩnh vực nào đó

Một chuyên gia sở hữu những đặc điểm sau:

  • Kỹ năng chuyên sâu về một lĩnh vực nào đó
  • Phạm vi kiến thức hẹp, kiến thức về những lĩnh vực bên ngoài là hạn chế.

Ví dụ

  • Kỹ sư hệ thống như Java core, hệ thống nhúng..
  • Quản trị hệ thống (DBA).
  • Chuyên gia kiểm thử performance

Nhược điểm

  • Tốn nhiều chi phí tuyển dụng
  • Phần lớn những người thuộc dạng này thường cảm thấy buồn chán khi mà công việc hiện tại không đủ hấp dẫn đối với họ. Điều đó dẫn đến việc họ sẽ có xu hướng rời công ty để tìm công việc khác hấp dẫn hơn.
  • Khó tìm kiếm và thuyết phục họ về với đội của mình.

“Biết tuốt”/Generalist

Image title

Đây là dạng người đối lập với những chuyên gia, họ có một vốn kiến thức rộng và bao quát ở nhiều lĩnh vực.

Họ có những đặc điểm riêng biệt sau:

  • Phạm vi hiểu biết rộng nhưng kỹ năng ở từng lĩnh vực không chuyên sâu
  • Phản ứng nhanh nếu vấn đề năm trong phạm vi, ngược lại thiếu tự tin khi vấn đề nằm ở ngoài giới hạn hiểu biết của mình

Ví dụ:

  • Sinh viên mới ra trường
  • Nhân viên kinh doanh (từ góc nhìn của một người làm kỹ thuật).
  • Những nhà quản lý còn thiếu kinh nghiệm.
  • Nhà tuyển dụng (từ góc nhìn của một người làm kỹ thuật).

T-Shaped

Image title

“T-shaped” là một cụm từ để mô tả chiều rộng và chiều sâu kỹ năng, kiến thức của một người.

Kiểu người  T-shaper bao gồm những đặc tính sau:

  • Có kiến thức chuyên sâu ở ít nhất một lĩnh vực, và có thể giải quyết vấn đề một cách ngon lành ở lĩnh vực đó.
  • Nắm bắt sâu ở rất nhiều lĩnh vực và biết cách giao tiếp, đối thoại, trao đổi về những lính vực đó

Đây là một dạng lập trình viên rất được ưa chuộng tại những dự án áp dụng theo quy trình Agile ( tâp trung xây dựng một team gồm những thành viên có thể làm việc ở nhiều lĩnh vực khác nhau).

Image title

Một điểm mạnh nữa là sự xuất hiện của kiểu lập trình viên T-shaper sẽ giúp bù đắp được những lỗ hổng khi mà có một thành viên hay một chuyên gia về một mảng nào đó rời team.

Image title

Và cuối cùng điểm mà họ được yêu thích nhất đó chính là tính cơ động, với khả năng giao tiếp tốt, suy nghĩ tích cực và kỹ năng đưa ra nhiều giải pháp.

Kiểu đa di năng/Versatilist

Image title

Đây là kiểu chuyên gia/ speacialist nhưng có thể chuyển sang vai trò khác một cách dễ dàng. Trái ngược với kiểu Biết tuốt, ở mỗi vai trò họ đều có kinh nghiệm và kiến thức sâu, có thể đưa ra giải pháp tối ưu.

Ví dụ

  • Kỹ sư lập trình có kinh nghiệm thực sự trong nhiều năm
  • Tech Leader
  • Những quản lý đi lên từ vị trí kỹ sư.

Expert vs. Generalist vs. Versatilist

Biểu đồ dưới đây thể hiện sự so sánh giữa 3 kiểu lập trình viên, trục y thể hiện độ chuyên sâu về kỹ năng, kiến thức, trục x thể hiện mức độ đa năng, phạm vi vai trò mà người đó có thể đảm nhận được.

Image title

Lập trình viên Full Stack

Image title

Một lập trình viên full-stack có thể đảm nhiệm công việc ở mọi mức độ kỹ thuật trong phạm vi “stack” của họ. Có rất nhiều người không biết rằng full-stack là một khái niệm đặc biệt và mỗi một lập trình viên full-stack đều phụ thuộc vào mảng stack của họ.

Ví dụ về mảng Stacks

  • LAMP, i.e. Linux, Apache, MySQL, PHP
  • MEAN,i.e. MongoDB, ExpressJS, AngularJS, NodeJS•
  • Microservices, Containerization*, REST, *JS

Ma trận năng lực / Competence Matrix

Ma trận năng lực dùng để kiểm tra xem thành viên của team có đủ khả năng để thực hiện một task bất kỳ hay không. Thường thì ma trận sẽ thiết kế theo hai trục ngang và dọc. Một trục là những thành viên trong team, trục còn lại là những kỹ năng, công nghệ liên quan đến dự án.

Sau đó, từng thành viên trong team tự đánh giá bản thân mình, và kết quả sẽ được đặt ở vị trí mà mọi người đều có thể nhìn thấy.

Image titleImage title

Bảng ma trận năng lực có thể giúp bạn tìm ra được những điểm nhấn về khung kỹ năng, từ đó có thể đưa ra được những quyết định điều chỉnh nhân sự chính xác hơn.

Mô hình đường cao tốc/Highway Metaphor

Image title

Mô hình đường cao tốc là một thuật ngữ riêng mà tôi nghĩ ra để phân biệt các kiểu lập trình viên ở trên. Ý tưởng đến từ sự đa dạng của cuộc sống hàng ngày của chúng ta. Cuộc sống là một quá trình thích ứng đa dạng và không có câu trả lời nào là hoàn hảo cho mỗi người.

Image title

Do vậy, tôi bắt đầu nhìn vào cuộc đời lập trình viên theo một cách tương tự. Như một con đường cao tốc, chúng ta có rất nhiều làn để đi, mỗi làn đều có một giới hạn tốc độ, tải trọng, trở ngại và những ưu tiên riêng. Bên cạnh đó, chúng ta có thể thêm hoặc gỡ bỏ làn đường. Tất cả đều tùy thuộc vào chúng ta và chỉ có chúng ta có thể lựa chọn được con đường phù hợp nhất để đầu tư thứ quý giá nhất của mình vào đó: thời gian.

Theo cách nhìn của tôi, thì sự nghiệp của một kỹ sư phần mềm có một số làn đường quan trọng như sau:

Image title

 

  • Ngôn ngữ lập trình/Language.
  • Thị trường ngách/Domain.
  • Kiến trúc dự án/Architecture.
  • Hướng công nghệ/Technology focus.
  • Công nghệ./Technologies
  • Lưu trữ dữ liệu./Storage
  • Định dạng dữ liệu/ Data format
  • Caching.
  • Search engines.
  • Engineering practices.
  • Testing.
  • DevOps.

Ngôn ngữ lập trình/Programming Languages

Image title

Ngôn ngữ lập trình có thể phân thành nhiều loại khác nhau, ví dụ như kiểu static hay dynamic, kiểu strong hay weak. Nếu bạn thành thạo một ngôn ngữ, hãy chuyển hướng sang ngôn ngữ khác, điều này sẽ giúp làm mở rộng tầm nhìn của bạn, đồng thời giúp bạn nhìn rõ được điểm yếu và điểm mạnh của ngôn ngữ mình đang dùng.

Techtalk via Techmaster

CHIA SẺ