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 0 | n^2Level 1 | nLevel 2 | log(n)Level 3 | |
Computer Science | ||||
data structures | Không biết sự khác nhau giữa Array and LinkedList | Có thể giải thích và sử dụng Arrays, LinkedLists, Dictionaries,… trong quá trình làm việc lập trình | Biế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 Queues | Có 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 |
algorithms | Không biết cách tìm giá trị trung bình của 1 mảng số int | Biết thuật toán cơ bản về sắp xếp, tìm kiếm, truy xuất | Hiể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 programming | Khô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 control | Tạ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), SVN | Sử 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 automation | Chỉ biết build từ IDE | Biết cách build từ command line | Biết cách build từ script | Có 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 testing | Nghĩ rằng tất cả công việc test là của bộ phận tester | Luôn viết unit test cho mỗi đoạn code viết ra | Viế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 decomposition | copy paste code từ chỗ này sang chỗ khác để giải quyết bài toán | có 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át | Sử 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 |
communication | Khô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ệp | Có 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 file | không biết cách tổ chức code trong 1 file | các method được gom nhóm lại theo khả năng truy cập | code được nhóm thành các vùng (#region), có comment cụ thể và references đến các source files khác | code 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 folder | Về cơ bản đã chia các folder theo logic code | Binary, 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 nhau | Tê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.Martin | Code 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 coding | Khô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 Class | Kiể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 ra | Có 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 handling | chỉ code cho những trường hợp chạy đúng | biế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ách | Codes 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. |
IDE | Chỉ sử dụng IDE để soạn thảo code | Có 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ơn | Sử dụng các phím tắt để các thao tác hay sử dụng nhanh hơn | Tự tạo các phím tắt riêng cho bản thân |
API | Thường xuyên phải đọc lại doc để xem lại API | Nhớ được các API được sử dụng nhiều | Nhớ được hầu hết API và cách chúng hoạt động | Viế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 |
framework | Không sử dụng framework ngoài | Có 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. |
requirements | Code 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 giao | Hiểu hoàn toàn về yêu cầu và những thành phần khác có liên quan | Có thể đề xuất thay đổi/bổ sung tài liệu để hoàn chỉnh hơn |
database | Nghĩ 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ản | Thiết kế CSDL thành thạo, tuân theo các quy chuẩn | Quả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 experience | Imperative 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 types | Functional, added bonus if they understand lazy evaluation, currying continuations | Concurrent (Erlang, Oz) and Logic (Prolog) |
platforms with professional experience | 1 | 2-3 | 4-5 | 6+ |
years of professional experience | 1 | 2-5 | 6-9 | 10+ |
Knowledge | ||||
tool knowledge | Chỉ 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 Studio | Dù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 Monitor | Tự viết tools |
languages exposed to | Imperative 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 types | Functional, added bonus if they understand lazy evaluation, currying, continuations | Concurrent (Erlang, Oz) and Logic (Prolog) |
codebase knowledge | Không bao giờ nhìn vào codebase | Có hiểu biết cơ bản về codebase, các thành phần và cách xây dựng nên | Có kiến thức tốt về codebase, đã từng fix 1 số bugs, viết thêm 1 số feature thêm vào | Tự viết codebase cho anh em khác có thể dựa vào đó làm |
Knowledge of upcoming technologies | Không biết sắp tới có công nghệ gì sắp ra mắt | Có 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 internals | Không biết gì | Có hiểu biết cơ bản về Android Architect | Hiểu về cách giao tiếp giữa các Layer của Android Architect với core, hardware | Tự viết tools dịch ngược file apk, đục sources |
books | Xem 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 |
blogs | Có 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 podcasts | Tự 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ác | Tự 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.
(*2)https://topdev.vn/blog/lap-trinh-vien-co-nen-hoc-assembly-khong/
(*3)https://vimentor.com/vi/lesson/bo-nho-ao-virtual-memory