Có nhiều bạn từng hỏi tôi làm sao để trở thành một lập trình viên giỏi và làm sao để có thể đáp ứng nhu cầu tuyển dụng của các doanh nghiệp. Bạn biết đấy, tôi đã từng là một lập trình viên, và trong suốt bảy năm qua, một trong những công việc chính của tôi là phỏng vấn các bạn kỹ sư lập trình từ cấp bậc junior cho đến kiến trúc sư phần mềm. Số lượng các bạn được tôi phỏng vấn trong bảy năm có lẽ lớn hơn con số 2000 người khá nhiều, và bởi vì tôi là một người chuyên về quản lý và phát triển con người (CNTT) nên những lời khuyên của tôi sẽ có ít nhiều giá trị với các bạn lập trình viên và tôi mong rằng chúng sẽ giúp cho các bạn định hướng và phát triển được sự nghiệp lập trình viên cho riêng mình.
Bạn biết không, trở thành lập trình viên nghĩa là bạn sẽ tham gia vào quá trình phát triển phần mềm, hay nói cách khác, bạn sẽ cùng với mọi người phân tích yêu cầu và xây dựng giải pháp giải quyết những vấn đề về mặt kinh doanh cho khách hàng (hoặc do chính bạn). Vì vậy việc đầu tiên bạn phải có tư duy của một người luôn mong muốn giúp đỡ mọi người giải quyết những vấn đề của họ bằng cách xây dựng phần mềm giúp họ có thể thực hiện nhanh hơn, hiệu quả hơn và tự động hóa chu trình giải quyết một vấn đề cụ thể nào đó. Ví dụ như, nếu bạn xây dựng môt ứng dụng nội bộ hỗ trợ cho công ty quản lý nhân viên và giúp cho nhân viên của công ty có thể tạo ra các không gian làm việc ảo với nhau (chia sẻ tài liệu, chat, thực hiện một số quy trình trong công ty) chẳng hạn. Bạn sẽ phải đặt mình vào vị thế của người dùng và suy nghĩ cho họ để làm sao có thể xây dựng được phần mềm đủ tốt, ít lỗi và tiện dụng cho người sử dụng, bởi suy cho cùng, một phần mềm không được người dùng ủng hộ và sử dụng thì chỉ là một phần mềm vô nghĩa mà thôi. Khi bạn có tư duy như vậy rồi, bạn sẽ làm việc với thái độ thực sự nghiêm túc và tập trung vào việc xây dựng sản phẩm phần mềm sao cho nó thực sự có ý nghĩa với người dùng.
Thứ hai, khi xây dựng một phần mềm, bạn thường không làm việc một mình mà thay vào đó bạn sẽ làm việc cũng với những người khác trong nhóm bao gồm lập trình viên, QC, business analysts (phân tích yêu cầu phần mềm), quản lý dự án và các vị trí khác nữa. Quá trình viết phần mềm là một quá trình làm việc tập thể đòi hỏi có sự hợp tác chặt chẽ và cần phải đảm bảo chất lượng sản phẩm. Mặc dù nếu phần mềm có lỗi, bạn vẫn có thể sửa được bằng cách thay đổi mã nguồn, nhưng chi phí cho việc thay đổi luôn đắt, và ảnh hưởng của những sai sót khi lập trình đến việc kinh doanh hoặc sử dụng phần mềm của người dùng rất lớn, nên bạn cần phải làm việc với sự tập trung cao độ, cẩn thận và phải luôn hợp tác với các thành viên khác để đảm bảo việc xây dựng phần mềm đạt tiêu chuẩn cao, đúng mục đích, dễ mở rộng và dễ bảo trì. Tôn trọng, lắng nghe, phản biện và biết làm việc theo nhóm là những đặc tính mà một người lập trình viên giỏi cần phải có. Nếu bạn muốn xây dựng những thứ lớn lao, bạn không thể chỉ làm một mình.
Xây dựng phần mềm giống như quá trình xây dựng một tòa nhà với những thiết kế nền móng, xây tường, lắp đặt hệ thống điện – nước – báo cháy – mạng và hoàn thiện nội thất, để có thể tạo ra một phần mềm đầy đủ công năng và dễ sử dụng, và vì vậy quá trình lên kế hoạch thực hiện phần mềm là quá trình tốn kém về thời gian và đòi hỏi có sự đầu tư kỹ càng trong khâu lên kế hoạch, và mặc dù xây dựng phần mềm là một quá trình thay đổi và sửa chữa liên tục chứ không như thiết kế chết của việc xây dựng nhà cửa, nhưng bạn không thể xây dựng một phần mềm phức tạp nếu không có thiết kế tốt. Nói như vậy có nghĩa rằng, bạn cần phải có tư duy của nhà thiết kế và xây dựng kiến trúc phần mềm nếu bạn muốn tự mình xây dựng một sản phẩm phần mềm, và đồng thời bạn cũng phải có khả năng đọc và hiểu bản thiết kế nếu bạn xây dựng phần mềm theo thiết kế của người khác. Kiến trúc sư xây dựng thiết kế một tòa nhà bằng cách tạo ra nhiều bản thiết kế cho những mục tiêu khác nhau, còn kiến trúc sư phần mềm thiết kế bằng các tài liệu kỹ thuật, và trên tất cả mã lệnh cũng chính là thiết kế, nếu bạn không có khả năng đọc và hiểu kiến trúc của phần mềm bằng cách đọc mã kết hợp với đọc tài liệu, bạn sẽ phát triển những tính năng không đúng thiết kế, bạn có thể phá hỏng khả năng dễ phát triển và dễ bảo trì của phần mềm, cũng như bạn hoàn toàn có thể tạo ra những lỗi và lỗ hổng không đáng có trong phần mềm. Mỗi người kỹ sư phần mềm nên có khả năng tự thiết kế và xây dựng một phần mềm nhỏ, hoàn chỉnh, đóng gói và phân phối sản phẩm. Hoặc nếu bạn xây dựng một ứng dụng nền tảng web, bạn cần phải đi đủ các khâu và triển khai đến người dùng. Khi làm đầy đủ các công việc đó, bạn mới có tư duy đủ tốt để đọc và hiểu thiết kế và code của những người khác. Đâu là là tố chất quan trọng của một lập trình viên để đảm bảo thiết kế tốt được thực thi? Theo tôi, đó là tính kỷ luật và tính nhất quán. Bạn tham gia vào quá trình xây dựng một sản phẩm công nghệ đòi hỏi kỹ thuật cao, nên tính kỷ luật và sự nhất quán trong khi làm việc là tiêu chuẩn hàng đầu. Một kỹ sư lập trình giỏi phải là một người khắc khe với công việc của chính mình và của những người khác. Nếu không có tư duy như vậy bạn sẽ góp phần xây ra những sản phẩm phần mềm như những căn nhà dột tự nóc vậy đó.
Làm lập trình viên cũng như làm nghệ nhân làm mộc, nếu bạn muốn làm ra được tủ bàn đẹp hiệu năng cao, bạn phải có kỹ năng tốt. Bạn không thể làm ra sản phẩm xịn sò nếu bạn không có các kỹ năng cơ bản tốt được. Vì vậy, khi bạn làm lập trình viên, việc đầu tiên bạn cần làm được đó là hiểu sâu sắc về nguyên vật liệu mình sử dụng, và luyện tập thường xuyên với các công cụ hỗ trợ quá trình làm việc. Bạn cần phải rành ngôn ngữ lập trình được sử dụng, hiểu rõ những phần nền tảng của ngôn ngữ và các framework để xây dựng nên phần mềm và đặc biệt, bạn phải sử dụng các công cụ mình có một cách hiệu quả bao gồm ứng dụng bàn giao tiếp (terminal), IDE (môi trường phát triển phần mềm), hệ điều hành (OS), version control (quản lý các phiên bản mã lệnh)… Nếu bạn là thợ mộc, bạn cần phải thao tác giỏi với cưa, bào, đục đẽo, nếu không khéo léo và thành thục, bạn dễ đứt tay và làm hỏng tác phẩm. Còn nếu bạn là lập trình viên, bạn cần sử dụng tốt các công cụ và môi trường, nếu không bạn có thể tạo ra các tai họa tiềm tàng hoặc tốn rất nhiều thời gian để xử lý đống rác do chính bạn tạo ra. Một lập trình viên giỏi là một lập trình viên có nền tảng kỹ thuật tốt, biết rõ trong tay mình có gì và cách sử dụng chúng, nếu bạn sử dụng một framework để xây dựng phần mềm nhưng không hiểu cấu trúc tổ chức và các tiện ích của framework đó cung cấp, bạn sẽ không sử dụng hết công năng của chúng. Bạn đừng chê những người tuyển dụng khó tính khi hỏi sâu về các công cụ bạn đã từng sử dụng, bởi điều đó cho thấy khả năng khai thác công cụ của bạn và mức độ lành nghề của bạn. Dân kỹ thuật nếu muốn hiểu nhau thì phải xài những thuật ngữ chuyên môn chung, nếu bạn không biết về chúng, có nghĩa là có khả năng cao bạn không biết, vì thế đừng chỉ lập trình theo quán tính, hãy vừa học vừa làm, đọc sách báo nhiều để tiếp thu kiến thức nền tảng và thực hành để xác tín tính hiệu quả của những điều mình học được. Nếu bạn không nói được về những gì mình đã làm, khả năng cao bạn chỉ là “thợ học việc” mà thôi.
Một người lập trình viên cũng có phần giống thợ máy (mechanics), thợ máy có rất nhiều công cụ, mỗi khi làm việc họ có vài va ly công cụ, và họ phải hiểu cách sử dụng chúng, không những vậy, với mỗi loại máy móc khác nhau, họ cần phải trang cấp một bộ công cụ chuyên dụng cho loại thiết bị đó và phải đọc kỹ hướng dẫn sử dụng. Mỗi khi có một dòng sản phẩm mới ra, họ lại phải cập nhật và làm mới mình bằng cách học những kỹ thuật mới, bạn không thể chăm sóc dòng xe mới của Vingroup nếu không học về chúng và có bộ công cụ chuyên dụng dành cho chúng. Làm phần mềm cũng y như vậy, nghĩa là bạn luôn phải trang cấp kiến thức và bộ công cụ cho những dự án mới, hoặc để nâng cấp phần mềm đã có. Kỹ năng học là một kỹ năng quan trọng bậc nhất mà các kỹ sư lập trình cần có. Họ cần có khả năng nắm bắt kiến thức mới nhanh, tự tạo cho mình các dự án để xây dựng kỹ năng và áp dụng chúng vào những dự án phức tạp hơn. Làm lập trình viên thì không nên mong đợi sẽ mãi chỉ làm trên một ngôn ngữ lập trình hoặc một framework cụ thể, mà thay vào đó hãy chấp nhận rằng việc liên tục cập nhật kiến thức mới là đương nhiên. Và dĩ nhiên, học một bộ công cụ mới hay một framework mới sẽ ít tốn thời gian hơn bởi các framework đều thường có thiết kế tương tự nhau, vì vậy chả có gì phải sợ hãi khi phải học cái mới. Thứ kỹ năng quan trọng nhất mà một người lập trình viên nên có đó là kỹ năng học tập, làm sao để học nhanh, nắm bắt nhanh và có thể thực hành được ngay. Khi người lập trình đã học và hiểu, thì lúc đó việc luyện tập để tạo kỹ năng sẽ rất suôn sẻ. Hiểu biết và luyện tập mới sinh ra sự hứng thú dài hạn với thứ mà bạn làm.
Thế giới lập trình là một thế giới tri thức với vô vàn công cụ để lập trình viên có thể lựa chọn và sử dụng, nhưng nếu không có sự hiểu biết về các chủ đề được quan tâm chính trong giới lập trình, các lập trình viên sẽ không nắm được danh sách công cụ, và đến khi cần chọn công cụ để thực hiện công việc, họ trở nên bế tắc vì thiếu thông tin và không đủ tự tin để chọn lựa công mình cần hoặc cũng có thể họ tự tin thái quá dẫn đến việc chọn sai phương pháp / công cụ thực hiện. Nghĩa là, đã là lập trình viên thì phải là những người “học rộng, hiểu sâu”, biết nhiều thứ mà họ biết rằng họ chưa biết, và có khả năng hấp thụ lượng tri thức lớn một cách nhanh chóng để có thể hiểu biết sâu sắc về công cụ / framework mà họ đang sử dụng.
Bản thân tôi, tôi không đánh giá cao những bạn quá nhiều năm kinh nghiệm nhưng không mô tả được những vấn đề họ đã gặp trong quá trình phát triển phần mềm. Người thực sự giỏi là người chuyên đứng ra giải quyết sự cố, thế nên họ sẽ nhớ nhiều về những sự cố mà họ giải quyết. Nếu bạn từng ngã gãy tay một lần, tôi dám chắc bạn sẽ không bao giờ quên được trải nghiệm đó vì nó sẽ ấn tượng sâu sắc đến họ. Sự trưởng thành của một lập trình viên đến từ những thành công lẫn thất bại mà họ trải qua. Vì thế, đừng quá an toàn chọn con đường dễ dàng, thay vào đó hãy mạo hiểm chọn những dự án xương xẩu và học tập từ những dự án đó. Ở bất cứ loại dự án nào, người lập trình viên giỏi đều có thể tìm ra được những bài học sâu sắc dành cho họ, bởi vậy, mới có câu chuyện một người chỉ mới bốn năm kinh nghiệm đã trở thành kiến trúc sư phần mềm, nhưng lại có những người khác làm tới mười mấy năm vẫn chỉ được coi là lập trình viên hạng lông. Năm 2012, sau khi có 9 tháng kinh nghiệm làm lập trình viên (Java), tôi đã được ba công ty tuyển làm Technical Architect cho các dự án .NET, và tôi hoàn toàn chinh phục được team của mình về năng lực của bản thân, bởi tôi vốn là người luôn có sự chuẩn bị.
Một lập trình viên giỏi luôn là một lập trình viên hài hòa giữa các hạn chế về mặt tài nguyên và mong muốn phát triển được sản phẩm tốt nhất, nghĩa là, họ luôn muốn tạo ra được những sản phẩm tốt nhất trong khả năng có thể đáp ứng của bản thân và của cả team. Họ sẽ không “làm quá” và cũng sẽ không “làm phơn phớt”, họ sẽ làm vừa đủ, không đưa những thiết kế rườm rà, không biến việc làm phần mềm trở thành công việc của nhà khoa học nghiên cứu chế tạo tên lửa. Họ biết sử dụng phương pháp hợp lý cho một vấn đề cụ thể. Không ai bán một ly cafe cóc mà lại tốn nhiều thời gian pha chế và kỹ lưỡng như một ly cafe bán ở quán cafe năm sao, và không ai lại thiếu chỉn chu khi bán một tách cafe có giá 150 ngàn cả. Linh hoạt, thích ứng với hoàn cảnh và đưa ra giải pháp phù hợp với ngân sách đầu tư chính là đặc điểm mà lập trình viên giỏi phải có.
Cuối cùng, một lập trình giỏi phải nên là một nghệ sỹ, nghĩa là, họ phải có khả năng sáng tạo dựa trên những thứ sẵn có chứ họ không nên sao chép rập khuôn. Lập trình phần mềm cũng giống như công việc của một nhà thiết kế quần áo, họ phải có khả năng thiết kế và may được những bộ quần áo phù hợp phom dáng và che đi khuyết điểm của người đặt may, và muốn làm được điều đó họ cần phải có tri thức và sự sáng tạo. Và khi làm việc một cách sáng tạo, người lập trình viên giỏi sẽ luôn tìm thấy được niềm vui trong quá trình làm việc của mình và như vậy họ sẽ ít khi cảm thấy chán nản và luôn thấy việc lập trình thật vui.
Bạn ơi, nếu bạn là lập trình viên và bạn đã đọc đến đây, tôi mong rằng bạn sẽ tìm thấy những gợi ý hữu ích từ những điểm mà tôi đã nêu. Lập trình viên là một nghề sáng giá và đòi hỏi nhiều sự đầu tư hơn nhiều ngành khác, và chính vì đó, người lập trình viên mới có được thu nhập cao hơn so với mặt bằng lao động. Và nếu bạn thực sự muốn sống hạnh phúc với nghề, bạn cần biến nó thành niềm vui và tận hưởng những giờ phút hăng say bên những dòng code. Chúc bạn thành công với sự nghiệp lập trình của mình!
Sài Gòn, ngày 18 tháng 06 năm 2020