Trang chủ Program KHUNG NĂNG LỰC CHO DEVELOPER – COMPETENCY MATRIX

KHUNG NĂNG LỰC CHO DEVELOPER – COMPETENCY MATRIX

bởi Dan Tran Dinh

Junior hay Senior? 

Đây là câu hỏi không chỉ mình mà khá nhiều anh em cũng có chung thắc mắc. Như nào thì được gọi là Junior, như nào được gọi là Senior? Liệu rằng số năm kinh nghiệm có phải là một thang đo để xác định cấp bậc này hay không? Và làm như nào để trở thành Senior trong ngành?

Sau một thời gian tìm hiểu, mình đã tìm ra một phương pháp để có thể tìm câu trả lời cho câu hỏi trên. Phương pháp có tên: Khung năng lực (Competency matrix).

Khung năng lực

Định nghĩa: Khung năng lực là bảng mô tả tổ hợp các kiến thức, kĩ năng, thái độ của một cá nhân tại vai trò làm việc.

Áp dụng khung năng lực, anh em có thể biết rõ hơn việc mình đang ở “level” nào trong ngành, và để tiến tới level tiếp theo thì sẽ cần những kiến thức gì.

Bài viết hôm nay mình sẽ giới thiệu Khung năng lực của Sijin Joseph dành riêng cho Developer, nội dung được tham khảo từ quyển DevUp của tác giả Nguyễn Hiển.

Sijin Joseph phân chia năng lực và kỹ năng của một Dev thành 4 cấp độ theo big annotation. Các cấp độ này có thể hiểu là mức độ trường thành của một Dev. Các kiến thức và kỹ năng của một Dev được tổ chức thành các nhóm:

  • Computer Science: những kiến thức căn bản, bao gồm cấu trúc dữ liệu và giải thuật.
  • Software Engineering: kiến thức và kỹ năng xây dựng phần mềm
  • Programming: kĩ năng giải quyết vấn đề và hiện thực hóa ý tưởng qua việc lập trình
  • Experience: kinh nghiệm thực tế trên một nền tảng, công nghệ hoặc một lĩnh vực cụ thể
  • Knowledge: năng lực liên tục cập nhật và chia sẻ kiến thức

Bài viết đã được lược dịch theo quan điểm của cá nhân mình trên nền tảng kinh nghiệm với UnityEngine, anh em khác có thể tham chiếu sang công nghệ riêng mà anh em sử dụng. Bài viết có rất nhiều keyword của ngành công nghệ thông tin bằng tiếng Anh nên mình sẽ giữ nguyên văn (vì dịch ra tiếng Việt nghe rất củ chuối)

Các tài liệu tham khảo mình sẽ để ở cuối bài, có đánh dấu (*x) với x là tài liệu tương ứng với từ khóa trong nội dung đó.

2^nLevel 0n^2Level 1nLevel 2log(n)Level 3
Computer Science
data structuresKhông biết sự khác nhau giữa Array and LinkedListCó thể giải thích và sử dụng Arrays, LinkedLists, Dictionaries,… trong quá trình làm việc lập trìnhBiết được công sức và thời gian khi triển khai các cấu trúc dữ liệu như Array vs LinkedLists.Có thể giải thích và ứng dụng hashtableBiết cách sử dụng Stack, Priority QueuesCó kiến thức về các cấu trúc dữ liệu nâng cao như B-trees, Binomial and Fibonacci heap, AVL/Red Black trees, Splay Trees, Skip Lists
algorithmsKhông biết cách tìm giá trị trung bình của 1 mảng số intBiết thuật toán cơ bản về sắp xếp, tìm kiếm, truy xuấtHiểu và áp dụng được Cây, đồ thị, giải thuật tham lam, thuật toán chia để trịCó khả năng nhận biết và code quy hoạch động, đồ thị, giải tích số, nhận biết được các bài toán NP
system programmingKhông biết thế nào là Compiler, Linker, Interpreter (*1)Hiểu cơ bản về Compilers, Linkerm Interpreters.Biết được assembly code là gì cách chúng giao tiếp với phần cứng (hardware). (*2)Có hiểu biết 1 chút về bộ nhớ ảo và paging. (*3)Hiểu về kernel mode vs user mode, multi threading, synchronization primitives, biết được chúng đọc mã assembly code như nào.Hiểu về cách hoạt động của networks, network protocols, socket level programming.Hiểu tất cả các lớp của chương trình, bao gồm phần cứng (CPU + Memory + Cache + Interrupts + microcode), binary code, assembly, static and dynamic linking, compilation, interpretation, JIT compilation, garbage collection, heap, stack, memory addressing…
Software Engineering
source code version controlTạo ra các Folder Backup theo thời gian (hồi sinh viên mình cũng làm theo cách này)Biết dùng CVS (Concurrent Version System), SVNSử dụng thành thạo SVN, biết các thao tác chia branch, merge,…Có kiến thức về hệ thống quản lí mã nguồn phân tán. Đã dùng thử Bzr/Mercurial/Darcs/Git
build automationChỉ biết build từ IDEBiết cách build từ command lineBiết cách build từ scriptCó thể setup để build system từ script, viết tài liệu, tạo các release notes và đánh tag trong các trình source control
automation testingNghĩ rằng tất cả công việc test là của bộ phận testerLuôn viết unit test cho mỗi đoạn code viết raViết code theo tư tưởng TDD (Test driven development)Hiểu và có khả năng setup hệ thống auto test
Programming
problem decompositioncopy paste code từ chỗ này sang chỗ khác để giải quyết bài toáncó khả năng phân tách yêu cầu thành nhiều function nhỏcó khả năng viết các function/object có tính tái sử dụng cao và giải quyết được những bài toán tổng quátSử dụng cấu trúc dữ liệu và giải thuật hợp lý, viết ra những đoạn code có khả năng đóng gói để giải những bài toán tương tự ở nơi khác
communicationKhông thể diễn đạt suy nghĩ/ý tưởng với đồng nghiệpĐồng nghiệp có thể hiểu được những gì bạn nói.Có khả năng giao tiếp với đồng nghiệpCó thể hiểu và truyền đạt những suy nghĩ / thiết kế / ý tưởng một cách rõ ràng và linh hoạt trong nhiều trường hợp
code organization within a filekhông biết cách tổ chức code trong 1 filecác method được gom nhóm lại theo khả năng truy cậpcode được nhóm thành các vùng (#region), có comment cụ thể và references đến các source files kháccode có header, có summary (thường dùng để tóm tắt nội dung của đoạn code đó), có comment. Về tổng thể thì nhìn code rất sạch đẹp
source tree organizationĐặt tất cả file trong cùng 1 folderVề cơ bản đã chia các folder theo logic codeBinary, Libs, Docs, Build, third-party plugin được xếp vào các thư mục thích hợp, không có phụ thuộc vòng tròn lẫn nhauTên thư mục và cách tổ chức thư mục cung cấp thông tin chi tiết về thiết kế của hệ thống.
code readabilityĐặt các tên dạng đơn giảnVí dụ: int x, string y,….Đặt tên các files, variables, class, method đúng với định nghĩa và mục đích sử dụng. Tuân thủ naming convention. Phần này anh em có thể tham khảo chương 2, quyển Clean code của tác giả Robert C.MartinCode không bốc mùi, phần này anh em tham khảo trong https://sourcemaking.com/ về cách nhận biết và cách xử líNhư bên trái, nhưng làm tốt hơn 😀
defensive codingKhông hiểu quan điểm này là gìKiểm tra tất cả dữ liệu đầu vào để đảm bảo đúng.Ví dụ C# có Assert ClassKiểm tra các return value (xem có đúng với mong muốn không, ví dụ bị null), kiểm tra các exception có khả năng xảy raCó thư viện riêng để kiểm tra, viết các unit test có thể tái tạo các trường hợp gây lỗi để xử lí.
error handlingchỉ code cho những trường hợp chạy đúngbiết cách dùng try/catch, throw exception cho các đoạn code có khả năng gây lỗiĐảm bảo error/exception không làm chương bị bị force stop. Các connections và memory được dọn dẹp đúng cáchCodes có thể phát hiện các exception trước khi nó có thể xảy ra. Duy trì chiến lược xử lí exception nhất quán trong tất cả các layers of code. Đưa ra các hướng dẫn về xử lí exception cho toàn bộ system.
IDEChỉ sử dụng IDE để soạn thảo codeCó tìm hiểu về giao diện của IDE, biết cách sử dụng các menu để làm việc hiệu quả hơnSử dụng các phím tắt để các thao tác hay sử dụng nhanh hơnTự tạo các phím tắt riêng cho bản thân
APIThường xuyên phải đọc lại doc để xem lại APINhớ được các API được sử dụng nhiềuNhớ được hầu hết API và cách chúng hoạt độngViết lib bao phủ các API, đơn giản hóa cách sử dụng những API phức tạp bằng những method dễ hiểu hơn. Có thể tìm ra những chỗ mà API viết thiếu và viết thêm để bù vào
frameworkKhông sử dụng framework ngoàiCó biết về những framework ngoài platform nhưng chưa sử dụngĐã sử dụng thành thạo ít nhất 1 framework ngoài.Ví dụ với Unity có những framework ngoài sau được cộng đồng đánh giá cao: StrangerIOC, Zenject, NGUI,…Tự viết framework.
requirementsCode dựa theo yêu cầu trong tài liệu được bàn giaoĐưa ra những câu hỏi về những thông tin bị bỏ sót trong tài liệu được giaoHiểu hoàn toàn về yêu cầu và những thành phần khác có liên quanCó thể đề xuất thay đổi/bổ sung tài liệu để hoàn chỉnh hơn
databaseNghĩ rằng Excel là một cơ sở dữ liệu (CSDL)Có kiến thức cơ bản về CSDL, chuẩn hóa, có thể viết các câu lệnh SELECT đơn giảnThiết kế CSDL thành thạo, tuân theo các quy chuẩnQuản trị CSDL, tối ưu hiệu suất của CSDL, viết được các câu lệnh truy vấn nâng cao, hiểu cách CSDL được lưu trữ
Experience
languages with professional experienceImperative or Object Oriented (*4)Imperative, Object oriented and declarative (SQL), added bonus if they understand static vs dynamic typing, weak vs strong typing and static inferred typesFunctional, added bonus if they understand lazy evaluation, currying continuationsConcurrent (Erlang, Oz) and Logic (Prolog)
platforms with professional experience12-34-56+
years of professional experience12-56-910+
Knowledge
tool knowledgeChỉ sử dụng IDE chính như Visual Studio, Eclipse,…Biết 1 số các tool, IDE khác để thay thếVí dụ Jetbrain Rider thay thế cho Visual StudioDùng tốt các tool editors, debuggers, IDEs, open sources alternatives,…Ví dụ một số tool giúp xem log như: Android Device Monitor, Process MonitorTự viết tools
languages exposed toImperative or Object Oriented (*4)Imperative, Object Oriented and declarative (SQL), added bonus if they understand static vs dynamic typing, weak vs strong typing and static inferred typesFunctional, added bonus if they understand lazy evaluation, currying, continuationsConcurrent (Erlang, Oz) and Logic (Prolog)
codebase knowledgeKhông bao giờ nhìn vào codebaseCó hiểu biết cơ bản về codebase, các thành phần và cách xây dựng nênCó kiến thức tốt về codebase, đã từng fix 1 số bugs, viết thêm 1 số feature thêm vàoTự viết codebase cho anh em khác có thể dựa vào đó làm
Knowledge of upcoming technologiesKhông biết sắp tới có công nghệ gì sắp ra mắtCó nghe nói về những công nghệ sắp ra mắtĐã tải các phiên bản thử nghiệm về vọc và đọc 1 số bài viết, hướng dẫn về công nghệĐã dùng các phiên bản thử nghiệm, tự build thử 1 số thứ hay ho và chia sẻ với những người khác
platform internalsKhông biết gìCó hiểu biết cơ bản về Android ArchitectHiểu về cách giao tiếp giữa các Layer của Android Architect với core, hardwareTự viết tools dịch ngược file apk, đục sources
booksXem các series học trong 21 ngày, 24 giờ trên Youtube,…Đọc các sách: Code complete, Don’t make me think, Mastering regular ExpressionsĐọc các sách: Design patterns, Peopleware, Programming Pearls, Algorithm Design manual, Pragmatic Programmer, Mythical Man MonthĐọc các sách: Structure and Interpretation of Computer Programs, Concepts Technologies, Models of Computer Programming, Art of Computer Programming, Database Systems, Thinking forth, Little Schemer
blogsCó nghe nói tới nhưng không có thời gian theo dõiĐọc các blog về tech/ programming / software engineering, thường xuyên nghe podcastsTự làm blog cá nhân, lưu lại trong đó những bài viết/chia sẻ hay từ những người khácTự làm blog cá nhân, chia sẻ những hiểu biết và suy nghĩ của bản thân về công việc, ngành nghề,…

Đây là nguyên văn phiên bản tiếng anh, anh em bấm vào đây để tham khảo.

Tổng kết

Trong tất cả các kĩ năng bên trên, mình thấy một trong những kĩ năng quan trọng nhất là giao tiếp. Kĩ năng này không nên được đánh giá thấp. Có nhiều anh em dev nghĩ rằng lập trình là việc làm độc lập với máy tính và không cần giao tiếp nhiều. Điều này có thể đúng ở những công ty lớn có các bộ phận được chia rõ ràng. Còn với môi trường doanh nghiệp startup như hiện tại, việc một dev giao tiếp với các bộ phận khác (trao đổi thông tin, làm rõ yêu cầu, feedback,…) có thể chiếm nhiều thời gian hơn là giao tiếp với máy tính. 

Về câu chuyện chức danh Junior hay Senior theo mình thấy không quá quan trọng,chỉ cần tập trung vào những thứ có thể chuyển giao được và mang lại giá trị; hành động và kết quả mới định nghĩa con người chúng ta, không phải hệ thống chức danh.

Tài liệu tham khảo cho các thuật ngữ trong bài.

(*1)https://calavikevin.wordpress.com/2016/07/13/su-khac-nhau-giua-interpreter-compiler-va-code-script-program/

(*2)https://topdev.vn/blog/lap-trinh-vien-co-nen-hoc-assembly-khong/

(*3)https://vimentor.com/vi/lesson/bo-nho-ao-virtual-memory

(*4)https://stackoverflow.com/questions/17826380/what-is-difference-between-functional-and-imperative-programming-languages

Nhấn để đánh giá bài viết!
[Số đánh giá: 1 Trung bình: 5]

Có thể bạn quan tâm

Để lại bình luận