Điều gì tạo nên một lập trình viên xuất sắc
(steady-study.super.site)Đây là bài viết tương ứng với phần 1 của Hướng dẫn thực chiến để nâng cao thành quả và năng lực cho kỹ sư frontend junior từng được trình bày tại Infcon 2023. Có thể xem đây là phần tiếp nối về mặt tinh thần của bài từng đăng trên GeekNews trước đây
Lộ trình sự nghiệp kỹ sư frontend: 3 hướng chuyên môn dành cho junior.
Một kỹ sư xuất sắc là người như thế nào?
Trong bài luận văn năm 2015 <What Makes a Great Software Engineer?>, Li Paul Luo đã đề xuất 5 điều kiện thiết yếu tạo nên một kỹ sư xuất sắc. Phương pháp nghiên cứu như sau.
- Phân tích rất nhiều nghiên cứu trước đó về giáo dục, năng lực, hành vi cần thiết đối với lập trình viên
- Phỏng vấn chuyên sâu 59 lập trình viên tại Microsoft từ level 2 trở lên, tức là những người đã được công nhận năng lực ở một mức độ nhất định. Từ đó rút ra 54 ứng viên cho các đặc tính cá nhân mà lập trình viên nên có (tính cách, kiến thức, hành vi, v.v.)
- Khảo sát hơn 2.000 lập trình viên của Microsoft. (Sau khi mô tả chi tiết từng đặc tính) đặt câu hỏi: “Nếu một lập trình viên lành nghề không có đặc tính này, bạn có đánh giá người đó là một lập trình viên xuất sắc không?”
- Phân tích kết quả khảo sát và phỏng vấn tiếp theo với người trả lời
- Dựa trên kết quả phân tích khảo sát và phỏng vấn tiếp theo, phỏng vấn bổ sung 40 đối tượng cộng tác chính với lập trình viên (artist, người lập kế hoạch nội dung, data scientist, designer, kỹ sư điện, v.v.)
Tôi đã sắp xếp lại 5 điều kiện thiết yếu mà tác giả đề xuất theo thứ tự và cách diễn giải hơi khác một chút, đồng thời bổ sung suy nghĩ của riêng mình.
1. Viết ra mã nguồn tốt (Be a competent coder)
So với “một coder có năng lực”, “mã nguồn tốt” là mục tiêu phù hợp hơn để theo đuổi.
Năng lực coding là năng lực quan trọng nhất với junior. Tuy nhiên, khi đã vượt qua một ngưỡng nhất định, đầu tư vào các năng lực khác sẽ hiệu quả hơn. “Ngưỡng nhất định” này khác nhau tùy từng người và từng tổ chức.
Tôi xem tiêu chí để đánh giá năng lực coding của junior là: “1) có quan điểm nhất quán của riêng mình về chất lượng code, 2) viết code đáp ứng yêu cầu của khách hàng, 3) với tốc độ nhanh, 4) ít bug, và 5) dễ đọc”.
2. Rèn luyện ra quyết định dựa trên căn cứ (Practice informed decision-making)
Để phát triển năng lực ra quyết định, sẽ có lợi hơn nếu tập trung cải thiện quy trình ra quyết định thay vì chỉ nhìn vào kết quả. Bởi vì kết quả có thể được quyết định bởi những yếu tố ngoài ý chí của ta.
Và “dựa trên căn cứ” nghĩa là dựa trên dữ liệu, nhưng không diễn giải dữ liệu theo định kiến hoặc vội vàng kết luận. Đặc biệt, nếu có thông tin mới, dù không thấy thoải mái, tốt hơn là xem xét lại phán đoán cũ thay vì hợp lý hóa nó.
Đặc biệt khi debug, nếu bạn nghĩ vấn đề nằm ở library hay trình duyệt chứ không phải ở mình, thì phần lớn là bạn sai. Ngay cả khi đó thực sự là lỗi của trình duyệt đi nữa, nếu cứ quy mọi vấn đề tương tự cho trình duyệt, bạn có thể bỏ qua cả những lỗi nghiêm trọng thực ra do chính mình gây ra, nên cần cẩn trọng.
Một cách để tránh định kiến và sự vội vàng là cởi mở tiếp nhận nhiều góc nhìn bên ngoài. Hít thở một nhịp, rồi thử xem bạn bè, đồng nghiệp, khách hàng, đối thủ, cấp trên và nhiều kiểu người khác đang diễn giải vấn đề ra sao, khi đó định kiến của bản thân sẽ khó duy trì hơn.
Tất nhiên, khi con người bị stress thì rất khó hành xử lý trí. Tổ chức cũng vậy. Vì thế, các tổ chức khôn ngoan cố ý chừa khoảng đệm trong lịch trình và tài nguyên, còn các cá nhân khôn ngoan thì học cách quản lý stress thông qua thiền chẳng hạn.
Để thường xuyên luyện tập ra quyết định dựa trên căn cứ, bạn cần sở hữu nhiều căn cứ tốt. Nên xây dựng một hệ thống để những nguồn thông tin đa dạng và chất lượng đi ngang qua môi trường xung quanh mình, chẳng hạn đăng ký newsletter, tham gia cộng đồng, tham gia nhóm study.
3. Giúp đồng nghiệp ra quyết định hiệu quả (Enable others to make decisions efficiently)
Lập trình viên xuất sắc chia sẻ thông tin và kinh nghiệm để giúp đồng nghiệp trưởng thành, nâng cao năng suất của team, và cuối cùng giúp tổ chức đưa ra quyết định tốt hơn.
Vậy junior nên làm gì? Thay vì cố tạo thành quả ngay lập tức, junior nên trưởng thành bằng cách đặt câu hỏi; đó cũng là cách giúp đồng nghiệp và giúp tổ chức. Hãy vượt qua nỗi sợ bị đánh giá thấp, bị từ chối và làm phiền người khác để đặt những câu hỏi có ngữ cảnh đầy đủ. Ta thường nghĩ phải xây dựng niềm tin trước thì mới có thể bộc lộ sự dễ tổn thương như vậy, nhưng nghiên cứu thực tế lại cho thấy điều ngược lại. Khi đôi bên cho thấy điểm yếu của mình và can đảm chấp nhận rủi ro, nền tảng của sự tin tưởng được hình thành rất nhanh.
Việc bộc lộ sự dễ tổn thương cũng có cách làm cho hiệu quả. Phải đưa đủ ngữ cảnh vào. Junior thường có vấn đề A nên thử cách B, rồi khi C không hoạt động tốt trong quá trình đó thì chỉ hỏi về C. Làm như vậy thì phần lớn chỉ nhận được câu trả lời rất cục bộ, mà ngay cả khi có câu trả lời đó rồi, việc giải quyết vấn đề cũng không tiến triển bao nhiêu. Ngược lại, tôi thường thấy rằng khi xác lập đúng A thì B tự động lộ ra và C trở nên không còn cần thiết.
Để khuyến khích việc đặt câu hỏi, cần xây dựng văn hóa tổ chức coi trọng cao sự dễ tổn thương và tính minh bạch. Lúc này, việc đặt giá trị mặc định trong tổ chức là gì rất quan trọng, vì giá trị mặc định ảnh hưởng rất lớn đến nhận thức và hành vi của con người.
Ở khía cạnh này, những công cụ Public by Default như Slack hay Notion, nơi bạn phải hành động nếu muốn ẩn đi, tốt hơn những công cụ Private by Default như Email hay Google Docs, nơi bạn phải hành động nếu muốn chia sẻ. “Cứ thoải mái nhắn hoặc nói chuyện với tôi bất kỳ lúc nào, chỉ trừ lúc này thôi (Do Not Disturb)” tốt hơn “Bạn có thể tự do đến nói chuyện với tôi vào khung giờ này (Open Hours)”.
4. Tối đa hóa giá trị hiện tại của công việc (Maximize current value of your work)
Một lập trình viên xuất sắc cần cả tư duy hệ thống (dự đoán những phần có thể thành vấn đề về sau hoặc cách yêu cầu sẽ thay đổi, rồi triển khai theo góc nhìn dài hạn) lẫn khả năng hành động ngay (đừng đứng yên để chỉ phân tích; dù sợ sự bất định vẫn cứ lao vào làm để nhận phản hồi).
Đặc biệt trong startup, vế sau có lợi hơn, nhưng nếu nghiêng quá cực đoan thì lại bất lợi. Hãy tập trung vào thực thi nhanh, nhưng cũng nên biến thành thói quen những hành động chỉ cần thêm chút nỗ lực mà mang lại lợi ích lớn. Ví dụ ở cấp vi mô, dù chỉ có một giá trị cũng đừng hardcode mà hãy tách nó ra thành biến; hoặc dù hiện tại chỉ có hai giá trị, nếu đó là kiểu tùy chọn vượt ra ngoài phạm vi một component thì nên dùng Mode thay vì giá trị Boolean. Ví dụ ở cấp vĩ mô là thói quen nghĩ xem mình đang thực thi để kiểm chứng giả thuyết nào, và sẽ dùng dữ liệu nào để kiểm chứng trước khi bắt tay làm.
Cuối cùng, giá trị công việc được tối đa hóa khi ta có thể chủ động linh hoạt di chuyển giữa tư duy hệ thống và hành động ngay.
5. Học tập hiệu quả và liên tục (Continuously learn)
Học cách học một cách hiệu quả là điểm khởi đầu của mọi sự trưởng thành. Càng làm sớm càng tốt, vì đây là hành động tạo ra lợi ích kép.
Suy cho cùng, học tập là để mở rộng hiểu biết của bản thân và thay đổi cuộc sống. Nhưng không gì đảm bảo tri thức cũ vẫn còn hiệu lực ở hiện tại, nên luôn cần nỗ lực cập nhật bằng thông tin mới.
Tuy nhiên, không phải cứ nhiều thông tin là tốt. Giống như big data chưa được tinh lọc, có những thông tin chỉ gây cản trở nếu tồn tại. Vì vậy, ta cần tăng tỷ lệ “tín hiệu” thay vì “nhiễu” — tức những thông tin không chính xác hoặc không liên quan đến vấn đề của mình. Theo tôi, ví dụ về tín hiệu tốt là những insight giúp tạo điểm kết nối với kiến thức sẵn có của tôi ở ngoài domain chuyên môn của mình, hoặc những bằng chứng cho thấy có thể tôi đã sai trong một điều kiện cụ thể nào đó.
Học tập hiệu quả có thể được tóm gọn bằng câu hỏi: “Làm thế nào để mỗi ngày tôi có thể trưởng thành hiệu quả hơn một chút?” Câu trả lời là lặp đi lặp lại việc 1) tìm ra điều mình thực sự cần ngay trong thực tế hiện tại, 2) chỉ học đúng lượng cơ sở lý thuyết vừa đủ có liên quan, và 3) áp dụng ngay lập tức những gì vừa học để tự nhận phản hồi.
Vậy làm sao biết hiện tại mình cần gì trong thực tế? Bạn có thể viết nhật ký để phát hiện những vấn đề mình gặp trong đời sống hằng ngày, hoặc thử nỗ lực làm tốt hơn những hoạt động đã chiếm nhiều thời gian của mình trong một tuần vừa qua. Ví dụ, nếu là người đang chuẩn bị xin việc thì có lẽ bạn sẽ thường xuyên tham gia study, nên việc nghiên cứu cách học nhóm hiệu quả sẽ rất hữu ích. Những việc càng làm thường xuyên thì cơ hội học tập càng nhiều, và khi cải thiện được thì chất lượng cuộc sống cũng tăng mạnh hơn.
Nên áp dụng thế nào - góc nhìn của junior và senior
Junior nên tự đối chiếu từng mục tiêu này, đặc biệt là các tri thức và hành vi được mô tả trong “viết mã nguồn tốt” và “học tập hiệu quả, liên tục”, để xem bản thân phù hợp đến đâu. Sau đó tập trung phát triển những năng lực còn thiếu.
Còn nếu là senior, bạn có thể dùng chúng cho đánh giá tuyển dụng và đánh giá hiệu suất. Hãy suy nghĩ xem nên dựa vào tín hiệu nào để xác định ứng viên đã có đủ những năng lực này hay chưa. Khi dẫn dắt để nâng cao năng lực cho junior, có lẽ cũng có thể áp dụng theo cách tương tự.
Và những năng lực này, chỉ cần thay “viết mã nguồn tốt” bằng năng lực chuyên môn của một domain cụ thể, thì cũng trở thành tiêu chí tốt để đánh giá bất kỳ vai trò nào. Vì thế trên thực tế, tại XL8, dù là PM, designer hay developer, khi tuyển người, onboarding và đưa feedback, họ đều cố gắng dùng các tiêu chí này làm chuẩn đánh giá năng lực, và đã thấy hiệu quả khá lớn.
Những điểm cần lưu ý khi áp dụng
Cả 5 năng lực này đều bổ trợ lẫn nhau. Chúng đan kết với nhau, nên lấy chỉ một năng lực làm mục tiêu để phát triển thật tốt có thể không hiệu quả lắm. Nói ngược lại, nếu làm tốt chỉ một năng lực thì việc làm tốt hơn các năng lực khác cũng có thể trở nên dễ dàng hơn.
Và nghiên cứu này, giống như các nghiên cứu khác, không phải chân lý tuyệt đối. Đương nhiên nó có giới hạn, và cũng cần tính đến việc nó đã đi qua cách diễn giải của tác giả bài luận văn lẫn cách diễn giải của tôi.
Ngoài ra, vì tiêu đề của bài luận văn là 'What Makes a Great Software Engineer?', nên có thể bạn sẽ nghĩ rằng chỉ cần có đủ 5 năng lực này là sẽ trở thành một lập trình viên xuất sắc, tức là coi đó là điều kiện đủ. Nhưng thực tế, điều được nghiên cứu là “nếu thiếu cái này thì không thể gọi là một lập trình viên xuất sắc”, tức điều kiện cần. Vì vậy, coi chúng là mục tiêu tốt, là định hướng, hoặc là các điểm trung chuyển thì hoàn toàn ổn, nhưng không nhất thiết phải xem đó là đích đến cuối cùng.
Nên áp dụng thế nào - góc nhìn của lập trình viên frontend
Để áp dụng 5 năng lực này trong bối cảnh phát triển frontend, có thể tự đặt ra những câu hỏi như sau.
- Mã nguồn tốt trong domain frontend là gì? Làm thế nào để viết code tốt hơn?
- Để ra quyết định tốt hơn trong domain frontend thì cần thu thập những căn cứ nào và theo cách nào?
- Trong domain frontend, việc giúp đồng nghiệp ra quyết định hiệu quả có ý nghĩa gì?
- Làm thế nào để đo lường giá trị hiện tại của công việc trong domain frontend? Làm thế nào để tối đa hóa nó?
- Muốn học tri thức về domain frontend một cách liên tục và hiệu quả thì phải làm sao?
Thứ ra đời trong lúc suy nghĩ về cách trả lời những câu hỏi đó chính là Lộ trình sự nghiệp kỹ sư frontend. Nó phân chia vai trò mà tổ chức kỳ vọng ở lập trình viên frontend thành các track chuyên về web/sản phẩm/vận hành, rồi giải thích những đặc điểm chính cùng ưu nhược điểm của từng track. (Trong bài trình bày tại Infcon, phần này đã bị lược bỏ hoàn toàn; tôi dự định sẽ bổ sung và giải thích kỹ hơn trong một bài riêng.)
Lộ trình này cũng có thể được dùng trong bối cảnh của junior và senior.
Ví dụ, các junior frontend có thể dùng nó khi tìm việc như sau: sau khi nắm được tình trạng của công ty qua tìm hiểu trước hoặc câu hỏi phỏng vấn, có thể nghĩ rằng: “Ở tổ chức mà mình muốn vào, họ đang cần kiểu chuyên môn như thế này. Nếu mình phát triển tốt chuyên môn này và thể hiện nó rõ ràng, khả năng được tuyển sẽ cao hơn.”
Còn nếu là senior thì có thể dùng theo kiểu: “Tổ chức của chúng ta hiện đang thiếu người có kiểu chuyên môn này. Vậy hãy giúp bạn này phát triển chuyên môn đó. Đồng thời, hãy tuyển bằng cách nhận diện tốt những người có chuyên môn này.” Tức là dùng nó để phát triển thành viên và tuyển dụng.
Dĩ nhiên, cũng như bài luận văn ở trên, cần ghi nhớ rằng 3 track này bổ trợ cho nhau, không phải chân lý tuyệt đối và cũng không phải đích đến cuối cùng.
Trở thành một lập trình viên senior xuất sắc
Trong Lộ trình sự nghiệp kỹ sư frontend, tôi cũng có nhắc ngắn gọn suy nghĩ của mình về cách trở thành một lập trình viên senior xuất sắc.
- Người kiên trì phát triển 5 năng lực thiết yếu bằng cách trung thành với những điều cơ bản sẽ trở thành một senior giỏi.
- Đôi khi, một hành động làm gương của đồng nghiệp có tác động lớn hơn vô số lời nói của người lãnh đạo chính thức. Người thể hiện được khả năng lãnh đạo ngay cả khi không ở vai trò leader cuối cùng cũng sẽ được giao vai trò đó.
- Trong bất kỳ hoàn cảnh nào, dù nhận một việc nhỏ đến đâu, những người tạo ra tác động lớn rồi sau đó sẽ được giao những việc lớn hơn.
1 bình luận
Vì chuyển thẳng từ Notion nên có vẻ link
'Lộ trình sự nghiệp kỹ sư frontend'ở phía sau đã bị chèn thành link của Notion rồi. Hu hu https://steady-study.super.site/frontend-engineer-career-roadmap Chính là link này.