Phỏng vấn IT cần chuẩn bị gì, chuyện từ phía người ngồi hỏi

Phan Anh Tú · ngồi phía bên kia bàn

Ứng viên hôm đó đến sớm mười lăm phút, áo sơ mi ủi phẳng, laptop đã mở sẵn. Câu đầu tiên tôi hỏi là bạn kể lại dự án gần nhất. Bạn ấy nói liền tám phút, rất trôi chảy, như đã tập trước gương nhiều lần. Rồi tôi hỏi: trong dự án đó, phần nào bạn thấy mình làm chưa ổn? Im lặng khá lâu. Bạn ấy chưa từng nghĩ sẽ bị hỏi câu này.

Tôi ngồi ở ghế người phỏng vấn đã nhiều năm, đủ để thấy rằng ứng viên thường chuẩn bị rất kỹ cho câu trả lời mà ít chuẩn bị cho câu hỏi tiếp theo. Phần lớn những gì dưới đây đến từ chỗ đó.

Một quy trình tuyển thường có nhiều vòng hơn bạn nghĩ

Mỗi công ty một kiểu, nhưng tôi thấy các bước dưới đây lặp lại khá đều ở các công ty phần mềm trong nước, từ outsource tới công ty làm sản phẩm. Không phải nơi nào cũng đủ, có nơi gộp vòng kỹ thuật và vòng quản lý làm một buổi.

Vòng Ai hỏi Họ thật sự muốn biết
Gọi điện sàng lọc Nhân sự tuyển dụng Bạn có khớp vị trí, mức mong muốn, thời gian nhận việc
Bài test hoặc coding online Nền tảng chấm tự động hoặc đội kỹ thuật Bạn có tự viết được code chạy đúng không
Phỏng vấn kỹ thuật Tech lead, senior Bạn hiểu sâu tới đâu, nghĩ thế nào khi gặp chỗ lạ
Phỏng vấn với quản lý Trưởng nhóm, quản lý dự án Bạn làm việc với người khác ra sao

Vòng gọi điện hay bị coi nhẹ, nhưng tôi từng thấy ứng viên rớt ngay ở đó vì không nhớ nổi mình đã nộp vào công ty nào. Ghi lại danh sách nơi đã nộp, vị trí, ngày nộp. Nghe đơn giản mà nhiều người không làm.

Vòng kỹ thuật, tôi hỏi gì và mong nghe gì

Khi phỏng vấn kỹ thuật, tôi thường bắt đầu từ CV. Dòng nào ứng viên ghi, tôi hỏi sâu vào dòng đó. Ghi Redis, tôi sẽ hỏi bạn dùng Redis để làm gì và điều gì xảy ra khi Redis chết. Ghi microservices, tôi sẽ hỏi các service gọi nhau thế nào và khi một service chậm thì cả hệ thống bị gì. Vì vậy, việc ôn đầu tiên không phải đi tìm bộ câu hỏi trên mạng, mà là đọc lại CV của chính mình và tự hỏi “tại sao” cho từng dòng. Nếu bạn đang phân vân nên nộp vào vị trí nào, đọc lại các cơ hội trong nghề lập trình trước khi ôn sẽ giúp bạn biết vòng kỹ thuật của từng hướng nặng về phần nào.

Kiến thức nền vẫn bị hỏi, dù bạn đã đi làm vài năm

Cấu trúc dữ liệu, độ phức tạp thuật toán, lập trình hướng đối tượng, cách HTTP hoạt động, transaction và index trong cơ sở dữ liệu. Những thứ này xuất hiện ở hầu hết các buổi phỏng vấn tôi từng ngồi, dù ở mức junior hay senior. Khác biệt là với senior, câu hỏi chuyển từ “đây là gì” sang “khi nào bạn không dùng nó”.

Nhiều bạn luyện trên LeetCode hoặc HackerRank. Tôi thấy có ích, với điều kiện bạn luyện cách nói ra suy nghĩ chứ không chỉ luyện ra đáp án. Làm vừa phải các bài mức dễ và trung bình về mảng, chuỗi, hash map, hai con trỏ, cây, là đủ cho đa số vòng kỹ thuật ở công ty trong nước. Các công ty lớn hơn hoặc làm cho thị trường nước ngoài thì có thể hỏi khó hơn.

Live coding, im lặng là thứ làm bạn mất điểm nhanh nhất

Từ ghế người hỏi: khi ứng viên im lặng gõ code mười phút, tôi không biết họ đang nghĩ đúng hay đang bế tắc. Khi họ nói “em định dùng hash map để đếm, nhưng nếu dữ liệu lớn thì có thể tốn bộ nhớ”, tôi có thể gợi ý, và họ có điểm cho cách nghĩ dù code chưa xong.

Trước khi gõ, hãy nhắc lại đề bằng lời của mình và hỏi về trường hợp biên: mảng rỗng thì sao, có số âm không, dữ liệu có sắp xếp sẵn không. Viết bản chạy được trước, tối ưu sau. Khi xong, tự chạy tay với một ví dụ nhỏ. Tôi đánh giá cao ứng viên tự phát hiện lỗi của mình hơn ứng viên viết đúng ngay nhưng không giải thích được vì sao đúng.

Với vị trí từ middle trở lên, có thể có thêm phần thiết kế hệ thống: thiết kế dịch vụ rút gọn link, hệ thống thông báo, giỏ hàng. Ở phần này không có đáp án đúng. Người hỏi muốn xem bạn có hỏi về quy mô trước khi vẽ không, có nghĩ tới chỗ dễ hỏng không, có biết đánh đổi giữa nhất quán dữ liệu và tốc độ không.

Câu hỏi hành vi không phải là phần để nói cho có

“Kể cho tôi một lần bạn bất đồng với đồng nghiệp về kỹ thuật.”

Câu này tôi hỏi gần như mọi buổi. Câu trả lời kiểu “em chưa bất đồng với ai bao giờ” là câu trả lời tệ, vì nó hoặc không thật, hoặc cho thấy người đó chưa từng đủ quan tâm để có ý kiến riêng. Câu trả lời tốt có bối cảnh, có hai quan điểm, có cách hai bên đi tới quyết định, và có kết quả, kể cả khi kết quả là mình sai.

Nhiều người dùng cấu trúc STAR (tình huống, nhiệm vụ, hành động, kết quả) để chuẩn bị. Nó giúp bạn không lan man. Nhưng đừng đọc như học thuộc. Tôi nghe ra ngay khi ai đó đang đọc kịch bản, và lúc đó tôi sẽ hỏi chệch sang một chi tiết nhỏ để xem câu chuyện có thật không. Hãy chuẩn bị sẵn ba, bốn câu chuyện thật: một lần sửa lỗi gấp trên production, một lần trễ hạn, một lần học công nghệ mới trong thời gian ngắn, một lần bất đồng. Hầu hết câu hỏi hành vi đều quy về một trong mấy chuyện đó.

Những chi tiết nhỏ mà tôi vẫn để ý

Tìm hiểu công ty trước buổi phỏng vấn: họ làm sản phẩm gì, khách hàng là ai, dùng công nghệ gì nếu có công khai. Ứng viên hỏi “bên anh làm về gì ạ” ở cuối buổi là một điểm trừ nhỏ nhưng có thật. Với phỏng vấn online, kiểm tra micro, camera, chia sẻ màn hình và kết nối mạng trước mười phút. Tôi đã mất gần nửa buổi phỏng vấn chỉ vì ứng viên không chia sẻ được màn hình trên Google Meet.

Cuối buổi, khi được hỏi “bạn có câu hỏi nào không”, hãy có ít nhất một câu thật. Hỏi về quy trình review code, về cách đội xử lý sự cố, về một ngày làm việc của vị trí đó. Những câu này cho người phỏng vấn thấy bạn đang hình dung mình làm việc ở đó, chứ không chỉ đang cố qua vòng.

Vài câu ứng viên hay hỏi lại tôi sau buổi phỏng vấn

Hỏi: Không trả lời được một câu kỹ thuật thì có nên đoán không?

Đáp: Nói thẳng là mình không chắc, rồi nói mình sẽ suy luận thế nào hoặc tìm ở đâu. Đoán bừa với giọng tự tin là thứ làm người hỏi mất tin nhất.

Hỏi: Có nên gửi email cảm ơn sau phỏng vấn?

Đáp: Không bắt buộc. Một email ngắn trong ngày, nhắc lại một điểm bạn thấy thú vị trong buổi nói chuyện, không gây hại gì và đôi khi giúp người tuyển dụng nhớ tới bạn.

Hỏi: Bị trượt thì có nên hỏi lý do?

Đáp: Nên hỏi, lịch sự và ngắn gọn. Không phải nơi nào cũng trả lời, nhưng khi có câu trả lời thì đó là thông tin quý hơn mọi bộ câu hỏi ôn luyện.

Bạn ứng viên ở đầu bài, sau khoảng lặng đó, cuối cùng cũng trả lời: phần xử lý lỗi khi gọi API bên thứ ba bạn làm vội, chưa có retry. Câu trả lời không hoàn hảo. Nhưng đó là đoạn tôi nhớ nhất của buổi hôm đó, và là lý do tôi đề xuất cho bạn ấy đi tiếp vòng sau.

Cách viết CV lập trình viên khi người đọc chỉ dành ba mươi giây

Phan Anh Tú · đọc hồ sơ tuyển dụng

Đợt tuyển gần nhất, đội tôi nhận hơn hai trăm hồ sơ cho hai vị trí backend. Tôi và một đồng nghiệp chia nhau đọc vào buổi tối, mỗi người một chồng file PDF. Tôi không bấm giờ, nhưng đọc xong mới thấy mình lướt mỗi CV chưa tới một phút. Cái nào ở lại, cái nào bị gạt, gần như được quyết trong mấy giây đầu.

Nên khi ai đó hỏi tôi cách viết CV lập trình viên, tôi không nói về mẫu đẹp. Tôi kể lại người đọc đã nhìn vào đâu.

Mắt người đọc đi theo đường nào

Thứ tôi nhìn đầu tiên là tên vị trí gần nhất và thời gian làm. Tiếp theo là dòng công nghệ, để xem có khớp với stack của đội không. Rồi tôi nhảy thẳng xuống phần dự án. Phần “mục tiêu nghề nghiệp” dài năm dòng với những câu như “mong muốn được học hỏi và phát triển trong môi trường chuyên nghiệp” thì tôi bỏ qua, và tôi đoán phần lớn người đọc hồ sơ cũng vậy.

Vì thế, phần đầu CV nên trả lời ngay ba điều: bạn là ai trong nghề (backend Java hai năm, hay sinh viên năm cuối học frontend), bạn mạnh công nghệ gì, và đường dẫn tới GitHub hoặc sản phẩm. Một dòng tóm tắt hai câu là đủ.

Từ bàn tuyển dụng: nhiều công ty dùng hệ thống lọc hồ sơ tự động (ATS) trước khi người thật đọc. CV thiết kế nhiều cột, chữ nằm trong ảnh hoặc bảng phức tạp có thể bị đọc sai. File PDF chữ thường, một cột, vẫn là lựa chọn ít rủi ro.

Phần dự án, viết sao cho người khác hình dung được

Đây là chỗ khác biệt lớn nhất giữa CV bị gạt và CV được gọi. CV yếu ghi “Tham gia phát triển hệ thống quản lý bán hàng. Công nghệ: Java, Spring, MySQL”. Đọc xong tôi không biết bạn đã làm phần nào.

CV tốt ghi theo kiểu: hệ thống làm gì, quy mô cỡ nào, bạn phụ trách gì, và có kết quả cụ thể nào. Ví dụ, “Viết module đối soát đơn hàng với cổng thanh toán, chạy theo lô mỗi đêm; chuyển từ quét toàn bảng sang truy vấn theo khoảng thời gian có index, thời gian chạy giảm từ khoảng bốn mươi phút xuống dưới năm phút”. Con số phải là của bạn và bạn phải giải thích được khi bị hỏi, vì người phỏng vấn sẽ hỏi đúng câu đó.

Tôi gọi bạn ấy phỏng vấn chỉ vì một dòng: “tự viết script migrate dữ liệu từ hệ thống cũ, xử lý ba trăm nghìn bản ghi bị trùng mã khách hàng”. Dòng đó cho thấy bạn ấy từng chạm vào việc bẩn thật.

Đồng nghiệp của tôi nói câu trên sau buổi đọc hồ sơ. Với sinh viên chưa đi làm, dự án cá nhân thay chỗ cho kinh nghiệm. Ghi rõ dự án giải quyết vấn đề gì, có link chạy thử hoặc link repo, và nếu có người dùng thật (dù chỉ là lớp bạn hay câu lạc bộ) thì ghi ra. Hai dự án làm kỹ hơn sáu dự án clone theo video.

Nếu bạn đang chuẩn bị ứng tuyển nghề lập trình lần đầu, hãy đọc bản mô tả công việc thật kỹ, rồi sắp xếp dự án sao cho cái liên quan nhất nằm trên cùng. Đổi thứ tự cho từng công ty không phải gian dối, đó là tôn trọng thời gian của người đọc.

Phần kỹ năng, liệt kê ít mà đúng

Tôi rất ngại thấy thanh tiến trình kiểu “Java 90%, Python 80%”. Không ai biết 90% là so với cái gì. Tốt hơn là chia nhóm đơn giản: ngôn ngữ, framework, cơ sở dữ liệu, công cụ, và chỉ ghi những gì bạn dám bị hỏi sâu. Ghi Kubernetes vì từng chạy theo hướng dẫn một lần thì khi bị hỏi về pod và service, buổi phỏng vấn sẽ rất dài.

Tiếng Anh nên ghi thẳng mức thực tế, có điểm TOEIC hay IELTS thì ghi, không có thì mô tả: đọc tài liệu kỹ thuật tốt, giao tiếp cơ bản. Với các công ty làm cho khách nước ngoài, dòng này được đọc kỹ hơn bạn nghĩ.

Những lỗi làm tôi gạt CV nhanh nhất

Lỗi chính tả trong tên công nghệ đứng đầu: “Javascrip”, “Mongo DB”, “ReactJs” viết ba kiểu trong cùng một trang. Nó không phải lỗi lớn, nhưng với một nghề mà gõ sai một ký tự là chương trình không chạy, người đọc khó bỏ qua. Thứ hai là CV dài bốn, năm trang cho người mới hai năm kinh nghiệm; một đến hai trang là vừa. Thứ ba là ảnh chân dung kiểu ảnh cưới và các thông tin không liên quan như chiều cao, tình trạng hôn nhân.

Còn một lỗi khó thấy hơn: link GitHub dẫn tới trang trống hoặc toàn repo fork không sửa gì. Thà không ghi link còn hơn ghi một link làm người đọc thất vọng.

Đêm hôm đó, trong hơn hai trăm hồ sơ, chúng tôi gọi mười bốn người. Tôi xem lại danh sách và thấy không CV nào trong số đó đẹp đặc biệt. Chúng chỉ dễ đọc, và nói rõ người viết đã làm gì bằng chính tay mình.

Lộ trình học lập trình cho người mới, từ dòng code đầu tới ngày đi làm

Phan Anh Tú · người hướng dẫn thực tập

Mỗi đợt thực tập, tôi nhận vài hồ sơ ghi kinh nghiệm bằng một dãy chữ dài: HTML, CSS, JavaScript, React, Node.js, MongoDB, Docker, AWS. Rồi tới buổi phỏng vấn, tôi hỏi một câu đơn giản về vòng lặp hay về cách trình duyệt gửi một request lên server, và nhiều bạn khựng lại. Không phải các bạn lười. Các bạn học theo những lộ trình dài như thực đơn nhà hàng, mỗi món nếm một miếng.

Bài này không phải lộ trình chuẩn. Đó là cách học mà tôi thấy các bạn thực tập trụ lại được ở đội thường đã đi qua, dù mỗi người đi một kiểu.

Ba tháng đầu, chọn một ngôn ngữ rồi đừng đổi

Câu hỏi tôi nghe nhiều nhất là nên học Python hay JavaScript hay Java trước. Câu trả lời thật là cái nào cũng được, miễn đừng nhảy qua lại. Python cú pháp gọn, hợp để làm quen tư duy. JavaScript cho bạn thấy kết quả ngay trên trình duyệt. Java chặt chẽ hơn và còn rất phổ biến ở các hệ thống doanh nghiệp, ngân hàng.

Trong giai đoạn này, thứ cần thuộc không phải framework mà là biến, kiểu dữ liệu, điều kiện, vòng lặp, hàm, mảng và đối tượng. Song song, học Git từ tuần đầu tiên, đẩy mọi bài tập lên GitHub dù nó xấu đến đâu. Tôi từng mở GitHub của một bạn ứng viên và thấy lịch sử commit đều đặn suốt năm tháng, từ bài in tam giác sao tới một ứng dụng quản lý chi tiêu nhỏ. Không có gì ấn tượng về kỹ thuật, nhưng nó cho thấy một người kiên trì.

“Đừng học thêm khóa thứ tư khi bạn chưa tự viết xong một thứ gì không có video hướng dẫn.”

Bẫy lớn nhất của giai đoạn này có tên hẳn hoi: tutorial hell. Bạn xem video, gõ theo, chạy được, thấy mình hiểu. Rồi tắt video đi, mở file trắng, không biết bắt đầu từ đâu. Cách thoát mà tôi thấy có tác dụng là sau mỗi bài học, tự làm lại một biến thể không có hướng dẫn: video làm ứng dụng ghi chú thì bạn làm danh sách mua sắm.

Đến lúc chọn một hướng đi

Sau khi nắm được nền, khoảng tháng thứ tư trở đi, bạn nên chọn một nhánh để đào sâu. Tôi tóm tắt bằng cái bảng dưới đây, đúng với mặt bằng chung tôi thấy ở các đội trong nước, chứ không phải quy chuẩn gì.

Hướng Học tiếp gì Dự án thử nên làm
Frontend HTML, CSS, JavaScript sâu hơn, rồi React hoặc Vue Trang thương mại nhỏ gọi API công khai, có lọc và phân trang
Backend SQL, REST API, một framework như Spring Boot, Express, Django API quản lý đặt lịch có đăng nhập và phân quyền
Mobile Kotlin cho Android, Swift cho iOS, hoặc Flutter Ứng dụng ghi chú có lưu offline và đồng bộ
Kiểm thử Viết test case, Postman, Selenium hoặc Playwright Bộ test tự động cho một trang web có sẵn

Đừng sợ chọn sai. Tôi biết khá nhiều người bắt đầu ở frontend rồi chuyển sang backend sau hai năm, hoặc ngược lại. Phần nền đã học không mất đi. Nếu còn phân vân giữa các nhánh, đọc thêm phần định hướng nghề lập trình sẽ giúp bạn thấy mỗi vị trí làm gì mỗi ngày trước khi bỏ thời gian vào.

Những thứ đi kèm mà khóa học hay bỏ qua

Dù chọn nhánh nào, có vài thứ bạn sẽ đụng tới ngay khi đi làm. Dòng lệnh terminal ở mức cơ bản: di chuyển thư mục, xem log, chạy script. HTTP: mã trạng thái 200, 404, 500 nghĩa là gì, header là gì. Đọc tài liệu chính thức thay vì chỉ tìm video. Mấy thứ này không cần học thành khóa riêng, chỉ cần không né khi gặp.

Một dự án làm đến nơi hơn năm dự án dừng ở bản demo

Các bạn thực tập trụ được ở đội tôi gần như ai cũng có một dự án làm thật lâu. Không phải dự án to, mà là dự án được hoàn thiện: có README ghi cách chạy, có xử lý lỗi khi nhập sai, được triển khai lên một chỗ nào đó để người khác bấm vào xem, và có lịch sử commit cho thấy nó được sửa dần qua nhiều tuần.

Một bạn từng mang tới buổi phỏng vấn ứng dụng đặt sân cầu lông cho nhóm bạn của mình. Ứng dụng đơn giản, giao diện bình thường. Nhưng khi tôi hỏi “nếu hai người cùng đặt một khung giờ thì sao”, bạn ấy kể đã gặp đúng lỗi đó khi nhóm dùng thật, và đã sửa bằng transaction trong database. Câu trả lời đó nặng ký hơn mọi dòng chữ trong CV.

Mấy câu tôi hay được hỏi ở buổi hướng dẫn

Hỏi: Học bao lâu thì đi xin thực tập được?

Đáp: Tùy thời gian bạn bỏ ra mỗi ngày. Tôi thấy người học đều đặn vài tiếng mỗi ngày thường đủ nền để xin thực tập sau khoảng sáu đến chín tháng, nhưng có người nhanh hơn, có người lâu hơn. Đừng đợi đến lúc thấy mình sẵn sàng, vì cảm giác đó hiếm khi tới.

Hỏi: Không có bằng đại học CNTT thì sao?

Đáp: Nhiều công ty vẫn nhận, nhất là các nơi làm sản phẩm hoặc startup, nếu bạn có dự án chứng minh được. Một số tập đoàn hay công ty outsource lớn thì lọc hồ sơ theo bằng cấp khá chặt ở vòng đầu. Vì vậy hãy nộp rộng, đừng chỉ nhắm một kiểu công ty.

Cuối mỗi đợt thực tập, tôi hay hỏi các bạn một câu: nếu được học lại từ đầu, bạn sẽ bỏ cái gì. Câu trả lời lặp lại nhiều nhất là “bỏ bớt khóa học, làm dự án sớm hơn”.

Kỹ năng cần có của lập trình viên mà tôi thấy rõ nhất khi ngồi cạnh họ

Phan Anh Tú · trưởng nhóm phát triển

Có một bạn junior mới vào đội tôi năm ngoái, bài test đầu vào làm rất đẹp. Tuần đầu tiên bạn ấy được giao sửa một lỗi nhỏ ở màn hình thanh toán: nút “Xác nhận” bấm hai lần thì tạo hai đơn. Lỗi này một người quen hệ thống sửa trong nửa buổi. Bạn ấy mất bốn ngày. Không phải vì không biết code, mà vì không biết bắt đầu đọc một codebase mấy trăm nghìn dòng từ đâu, và ngại hỏi.

Tôi kể chuyện đó vì khi người ta liệt kê kỹ năng cần có của lập trình viên, danh sách thường bắt đầu bằng ngôn ngữ và framework. Những thứ ấy cần, nhưng nó chỉ là vé vào cửa. Phần còn lại, thứ quyết định một người có trụ được ở đội hay không, thường ít được viết ra.

Biết một ngôn ngữ thì dễ, biết đọc code người khác mới khó

Tin tuyển dụng nào cũng ghi Java, C#, Python, JavaScript hay Go, kèm vài framework như Spring Boot, .NET, React. Cái đó bạn học được từ khóa học và tài liệu. Nhưng ở công ty, phần lớn thời gian bạn không viết code mới. Bạn đọc code có sẵn, thường do người đã nghỉ việc viết, không có comment, đặt tên biến kiểu data2, tmpList.

Tôi để ý những người đọc code nhanh thường làm vài việc giống nhau. Họ không đọc từ đầu file xuống cuối. Họ tìm điểm vào, ví dụ một API endpoint hay một sự kiện bấm nút, rồi lần theo luồng dữ liệu. Họ dùng tính năng “Go to definition” và “Find all references” của IDE liên tục. Họ chạy thử với debugger, đặt breakpoint để xem giá trị thật thay vì đoán. Và họ dùng git blame để biết dòng code đó ai viết, vào lúc nào, kèm commit message gì, vì nhiều khi lý do của một đoạn code kỳ quặc nằm ngay trong commit ba năm trước.

Nền tảng cơ bản vẫn quay lại cắn bạn

Cấu trúc dữ liệu và giải thuật hay bị coi là thứ chỉ để đi phỏng vấn. Không hẳn. Tôi từng thấy một màn hình báo cáo chạy mất gần một phút chỉ vì ai đó lồng hai vòng lặp tìm kiếm trong danh sách vài chục nghìn phần tử, thay vì dùng một HashMap. Không cần thuộc lòng thuật toán sắp xếp, nhưng cần có cảm giác về độ phức tạp, để khi thấy vòng lặp lồng nhau thì tự thấy gợn.

Cơ sở dữ liệu cũng vậy. Biết viết SELECT thì ai cũng biết. Biết đọc execution plan, hiểu khi nào index được dùng và khi nào không, biết thế nào là N+1 query khi dùng ORM, mấy thứ đó tách người viết được tính năng ra khỏi người viết được tính năng chạy nổi khi dữ liệu lớn.

Debug là một kỹ năng riêng, không phải phần thưởng của sự may mắn

Quan sát lâu, tôi thấy người mới và người có kinh nghiệm khác nhau rõ nhất ở cách xử lý lỗi. Người mới thường sửa theo kiểu thử: đổi chỗ này, chạy lại, chưa được thì đổi chỗ khác. Người có kinh nghiệm dừng lại trước, cố tái hiện lỗi cho ổn định, rồi chia đôi phạm vi nghi ngờ cho tới khi khoanh được chỗ hỏng.

Từ bàn làm việc: một anh senior trong đội có thói quen viết ra giấy giả thuyết trước khi sửa: “Tôi nghĩ lỗi do cache chưa xóa, nếu đúng thì xóa cache sẽ hết”. Sai thì gạch đi, viết giả thuyết tiếp. Trông chậm, nhưng anh ấy hiếm khi sửa một lỗi mà tạo ra lỗi khác.

Đọc log cũng thuộc nhóm này. Một stack trace dài hai trang, người mới thấy hoảng, người quen thì kéo xuống tìm dòng “Caused by” đầu tiên thuộc package của dự án mình. Với hệ thống chạy trên server, biết dùng Kibana, Grafana hay chỉ đơn giản là grep trong file log để lọc theo request ID là việc phải làm hằng tuần.

Người ngoài nghề hay hình dung lập trình viên ngồi gõ code liên tục. Thực tế, một ngày của đa số người trong đội tôi chia ra khá vụn: đọc ticket, hỏi lại BA, tìm hiểu lỗi, review code của người khác, rồi mới tới phần viết. Nếu bạn muốn nhìn rộng hơn xem nghề lập trình gồm những gì trước khi chọn kỹ năng để luyện, hãy để ý rằng phần gõ code mới chỉ là một lát trong cái bánh đó. Debug và đọc hiểu mới là lát dày nhất.

Git và những thói quen nhỏ người khác nhìn vào là biết

Ai cũng biết git commit và git push. Ít người để ý rằng đồng nghiệp đánh giá mình qua những chi tiết rất nhỏ trong Git. Commit message ghi “fix” hay “update” thì người review chẳng biết bạn đã làm gì. Một pull request thay đổi ba mươi file cho một tính năng nhỏ thì không ai muốn review. Rebase sai rồi force push lên nhánh chung thì cả đội mất buổi chiều.

Những người được đội tin tưởng thường chia nhỏ thay đổi, mỗi pull request làm một việc, có mô tả ngắn về lý do và cách kiểm tra. Họ tự chạy test trước khi đẩy lên, không phó mặc cho CI. Họ đọc lại diff của chính mình một lượt trước khi bấm tạo PR, và thường tự bắt được vài dòng log debug còn sót.

Viết test không phải để cho đủ chỉ tiêu

Nhiều đội đặt ngưỡng code coverage, và tôi đã thấy người viết test chỉ để vượt ngưỡng: gọi hàm nhưng không kiểm tra gì. Kỹ năng thật là biết viết test bắt được lỗi, nhất là ở các trường hợp biên như danh sách rỗng, giá trị null, ngày cuối tháng, múi giờ. Lỗi nút “Xác nhận” của bạn junior ở đầu bài, cuối cùng được chặn bằng một test mô phỏng hai request đến cùng lúc.

Phần “mềm” thì không mềm chút nào

Tôi không thích chữ kỹ năng mềm vì nó làm người ta nghĩ đó là phần phụ. Trong thực tế, nhiều lập trình viên giỏi kỹ thuật bị chững lại vì đúng những thứ này.

Em không sợ bị hỏi ngu. Em sợ hỏi rồi mà vẫn không hiểu, rồi phải hỏi lại lần nữa.

Câu đó là của bạn junior kia, nói sau tuần đầu. Biết hỏi là một kỹ năng. Câu hỏi tốt thường có ba phần: mình đang làm gì, mình đã thử những gì, mình kẹt ở đâu. Hỏi như vậy thì người được hỏi trả lời trong hai phút. Hỏi “anh ơi cái này lỗi” thì mất hai mươi phút chỉ để hiểu bối cảnh. Có đội còn có quy tắc ngầm: tự mò ba mươi phút, chưa ra thì hỏi. Lâu hơn thì phí thời gian của chính mình, sớm hơn thì chưa đủ hiểu vấn đề.

Ước lượng thời gian là thứ thứ hai. Khi tech lead hỏi “cái này mấy ngày”, câu trả lời “khoảng hai ngày” mà thực tế mất sáu ngày sẽ làm hỏng cả kế hoạch sprint. Người có kinh nghiệm thường trả lời kèm điều kiện: hai ngày nếu API bên kia đã sẵn, thêm một ngày nếu phải sửa cả phần phân quyền. Và khi thấy sắp trễ, họ báo sớm chứ không đợi tới buổi daily cuối cùng.

Tiếng Anh tôi xếp vào đây luôn, dù nó là kỹ năng nền. Tài liệu chính thức của hầu hết công nghệ viết bằng tiếng Anh, câu trả lời trên Stack Overflow hay GitHub Issues cũng vậy. Không cần nói hay, nhưng đọc nhanh và viết được một mô tả lỗi rõ ràng là đủ khác biệt. Phần đọc và viết chiếm thời gian trong ngày nhiều hơn người ngoài tưởng.

Còn AI thì sao

Năm nay gần như ai trong đội cũng dùng công cụ sinh code, GitHub Copilot hay các trợ lý chat tương tự. Tôi thấy nó làm thay đổi trọng tâm kỹ năng chứ không xóa bỏ chúng. Gõ code nhanh không còn là lợi thế lớn. Đọc hiểu và kiểm tra đoạn code do máy đề xuất thì quan trọng hơn trước, vì máy viết ra code trông rất hợp lý nhưng sai ở chỗ tinh vi: dùng một hàm đã bị deprecate, bỏ qua kiểm tra quyền, xử lý sai múi giờ.

Bạn junior ở đầu bài giờ đã qua một năm. Tuần trước bạn ấy review pull request của một người mới hơn và để lại comment hỏi vì sao không có test cho trường hợp danh sách rỗng. Tôi đọc comment đó và nghĩ, đấy mới là lúc một người thật sự có nghề.

Tôi không có một danh sách đầy đủ, và cũng không tin có ai có. Nhưng nếu phải chọn chỗ để luyện trước, tôi sẽ chọn đọc code của dự án mã nguồn mở mình đang dùng, sửa thử một issue nhỏ có nhãn “good first issue”, và để ý xem người duy trì dự án review mình thế nào. Ở đó có gần đủ mọi thứ kể trên, chỉ là không ai chấm điểm.

Business Analyst trong IT, người dịch giữa phòng họp và đội code

Phan Anh Tú · ghi chép từ dự án

Chín giờ sáng thứ hai, phòng họp nhỏ ở tầng ba. Phía khách hàng có ba người: trưởng phòng kế toán, một chị phụ trách kho và anh IT nội bộ. Phía chúng tôi chỉ có một người cầm laptop và một tập giấy A4 in sẵn sơ đồ quy trình nhập hàng. Người đó là business analyst của dự án. Suốt hai tiếng, cô ấy gần như không nói về công nghệ. Cô hỏi về phiếu nhập, về chuyện ai ký duyệt khi hàng về thiếu, về cái file Excel mà chị kho vẫn mở song song “cho chắc”.

Tôi làm nghề phần mềm đủ lâu để thấy rằng phần lớn dự án hỏng không phải vì code dở. Nó hỏng vì đội làm ra đúng cái được mô tả, trong khi cái được mô tả lại sai. Người làm business analyst trong IT đứng đúng chỗ dễ sai nhất đó.

Họ không viết code, nhưng code nào cũng đi qua tay họ

Nói gọn, business analyst (chuyên viên phân tích nghiệp vụ) là người biến mong muốn của khách hàng thành yêu cầu mà đội kỹ thuật làm được. Nghe đơn giản. Thực tế là khách hàng hiếm khi biết mình muốn gì ở mức đủ chi tiết. Họ nói “cần báo cáo tồn kho”, nhưng tồn kho theo ngày hay theo lô, có tính hàng đang đi đường không, ai được xem số liệu của chi nhánh khác. Mỗi câu hỏi như vậy là một nhánh logic mà nếu bỏ sót thì dev sẽ phải đoán.

Sau buổi họp sáng hôm đó, cô BA ngồi lại gần hết buổi chiều để viết. Đầu ra là vài trang trên Confluence, một sơ đồ BPMN vẽ bằng draw.io và khoảng hai chục user story đưa lên Jira, mỗi cái có phần tiêu chí nghiệm thu (acceptance criteria) ghi rõ trường hợp nào thì đạt. Đến buổi sprint planning hôm sau, đội dev hỏi dồn dập. Có câu cô trả lời ngay, có câu cô ghi lại để hỏi khách.

Ở phòng họp: câu BA hỏi nhiều nhất không phải “anh chị muốn gì” mà là “nếu chuyện này không diễn ra như bình thường thì sao”. Ngoại lệ mới là chỗ tốn công. Luồng chuẩn thì ai cũng tả được.

Ngoài việc viết tài liệu, BA còn đi theo sản phẩm tới cuối. Khi tester báo lỗi mà không rõ đó là lỗi hay là đúng yêu cầu, người ta gọi BA. Khi khách muốn đổi một tính năng giữa chừng, BA là người ngồi tính xem cái đổi đó kéo theo những gì. Đến buổi demo, BA thường là người dẫn khách đi qua từng màn hình, vì họ biết khách sẽ hỏi gì.

Ranh giới với PM và PO khá mờ, và chỗ mờ đó gây không ít va chạm

Ở công ty nhỏ, một người có thể kiêm cả ba vai. Ở công ty outsource lớn, BA thường làm việc với khách nước ngoài qua tài liệu và các cuộc gọi buổi tối. Ở công ty làm sản phẩm, vai trò này nhiều khi bị gộp vào product owner. Tôi thấy người mới vào nghề hay lúng túng vì không biết đâu là việc của mình, nên đã thử tách ra như sau, theo những gì tôi quan sát được ở các đội tôi từng làm cùng.

Vai trò Câu hỏi họ hay trả lời Thứ họ thường cầm trong tay
Business Analyst Hệ thống phải làm gì, trong trường hợp nào Tài liệu yêu cầu, user story, sơ đồ quy trình
Product Owner Làm cái gì trước, cái gì để sau Product backlog và thứ tự ưu tiên
Project Manager Bao giờ xong, tốn bao nhiêu người Kế hoạch, tiến độ, rủi ro, ngân sách
Tech Lead Làm bằng cách nào Kiến trúc, quyết định kỹ thuật

Bảng này chỉ đúng ở mức tương đối. Va chạm hay gặp nhất là giữa BA và tech lead: BA viết yêu cầu theo kiểu đã ngầm chọn sẵn cách làm, tech lead thấy bị lấn sân. Một BA có kinh nghiệm sẽ viết “người dùng cần biết đơn hàng bị trễ trong vòng mười lăm phút”, chứ không viết “gửi push notification qua Firebase”.

Người làm BA giỏi mà tôi biết đều là người hỏi lại rất lì

Kỹ năng hay được nhắc là giao tiếp, tư duy logic, viết tài liệu. Đúng, nhưng chung chung quá. Cụ thể hơn, tôi để ý những BA được đội dev quý thường có vài thói quen giống nhau. Họ không ngại hỏi lại một điều tới lần thứ ba nếu câu trả lời vẫn còn mơ hồ. Họ ghi biên bản ngay trong cuộc họp rồi gửi lại cho khách xác nhận trong ngày. Họ biết đọc SQL đủ để tự truy vấn dữ liệu kiểm tra một giả định, thay vì nhờ dev.

“Khách hàng nói ‘như cũ’ là câu nguy hiểm nhất. Cũ là cũ thế nào?”

Câu trên là của một BA từng làm cùng tôi, nói lúc cả đội đang sửa lại một module vì hiểu sai chữ “như cũ”. Về công cụ, ngoài bộ Jira và Confluence quen thuộc, nhiều người dùng Figma hoặc Balsamiq để vẽ wireframe nhanh khi chữ không đủ diễn tả. UML thì tùy dự án, có nơi bắt buộc use case diagram, có nơi chẳng ai đọc.

Về nền tảng học, tôi gặp BA xuất thân từ đủ ngành: kế toán, quản trị kinh doanh, ngôn ngữ Anh, cả dev chuyển sang. Người từ kế toán thường làm rất ổn ở các dự án ERP vì họ hiểu bút toán. Người từ dev thì nói chuyện với đội kỹ thuật dễ hơn nhưng đôi khi sa đà vào chi tiết kỹ thuật quá sớm. Không có xuất phát điểm nào là lợi tuyệt đối. Nếu bạn đang cân nhắc giữa BA và các hướng khác trong ngành, có thể xem thêm bài về con đường phát triển trong nghề để thấy BA nằm ở đâu trong bức tranh chung của dân phần mềm.

Chứng chỉ thì có bộ của IIBA (International Institute of Business Analysis) gồm ECBA cho người mới, CCBA và CBAP cho người đã có số năm kinh nghiệm nhất định. Tôi thấy nhà tuyển dụng trong nước ít khi bắt buộc, nhưng với các dự án làm cho khách nước ngoài thì có chứng chỉ giúp hồ sơ dễ lọt mắt hơn. Học để lấy khung tư duy thì đáng, học để trang trí CV thì không cần vội.

Đi lên từ BA thì đi đâu

Con đường tôi thấy phổ biến là từ junior BA lên senior, rồi rẽ sang một trong mấy hướng. Có người thành product owner hoặc product manager, vì họ đã quen nghĩ về giá trị sản phẩm. Có người đi sâu vào một mảng nghiệp vụ như ngân hàng, bảo hiểm, logistics và trở thành người mà khách hàng gọi thẳng khi có vấn đề lớn. Một số khác chuyển sang làm presales, viết đề xuất giải pháp cho các gói thầu.

Thu nhập của BA dao động khá rộng, phụ thuộc vào việc làm cho khách trong nước hay nước ngoài, mức tiếng Anh và độ sâu nghiệp vụ. Một BA hiểu sâu về core banking thường được trả khác hẳn một BA làm website giới thiệu doanh nghiệp, dù cùng số năm kinh nghiệm.

Mấy câu người mới hay hỏi tôi

Hỏi: Không biết code có làm BA được không?

Đáp: Được. Nhưng bạn nên hiểu cách một hệ thống web vận hành ở mức cơ bản: client, server, database, API là gì. Không cần viết được, chỉ cần đủ để không hứa với khách những thứ không làm nổi.

Hỏi: Tiếng Anh cần tới mức nào?

Đáp: Với dự án trong nước, đọc hiểu tài liệu là đủ để bắt đầu. Với dự án outsource, bạn sẽ phải viết tài liệu và họp bằng tiếng Anh hằng tuần, nên kỹ năng viết rõ ràng quan trọng hơn phát âm hay.

Hỏi: Nên bắt đầu từ đâu nếu đang làm ngành khác?

Đáp: Thử lấy chính quy trình ở chỗ bạn đang làm, vẽ lại thành sơ đồ, viết vài user story cho một phần mềm tưởng tượng giải quyết nó. Đem bộ tài liệu đó đi phỏng vấn thực tập BA, nó nói nhiều hơn một tấm chứng chỉ.

Buổi họp tầng ba hôm đó kết thúc lúc mười một giờ. Cái file Excel “cho chắc” của chị kho, sau ba tháng, vẫn còn được mở. Cô BA bảo đó là dấu hiệu hệ thống mới chưa giải quyết hết, và ghi nó vào danh sách việc của đợt sau.

Tester QA QC là gì, ngồi cả tuần với những người đi tìm lỗi

Phan Anh Tú · ghi chép nghề

Chị ấy nhập vào ô “Số lượng” con số âm năm. Rồi một trăm nghìn. Rồi chữ “abc”. Rồi dán vào một đoạn văn bản dài ba trang. Ở lần thứ tư, trang giỏ hàng trắng xóa. Chị chụp màn hình, mở Jira, ghi tiêu đề ngắn gọn, kèm các bước tái hiện, môi trường thử, phiên bản trình duyệt, rồi gán cho cậu developer ngồi cách đó hai bàn. Cậu ấy thở dài rất khẽ, đủ để cả dãy nghe thấy.

Khi ai đó hỏi tôi tester QA QC là gì, tôi thường kể lại cảnh trên. Đó là người được trả lương để nghi ngờ phần mềm. Người viết code nghĩ về cách mọi thứ nên chạy, còn tester nghĩ về mọi cách nó có thể hỏng. Hai cái đầu đó cần nhau.

Người ngoài hay gộp QA với QC làm một

Trong tin tuyển dụng ở Việt Nam, chữ “tester”, “QA” và “QC” bị dùng lẫn lộn khá nhiều. Có công ty gọi người chạy test thủ công là QA, có nơi lại gọi là QC. Nhưng nếu hỏi người làm lâu, họ sẽ phân biệt khá rõ.

QC (Quality Control) QA (Quality Assurance)
Nhìn vào đâu Sản phẩm đã làm ra Cách cả đội làm ra sản phẩm
Câu hỏi thường trực Chỗ này có lỗi không? Vì sao lỗi kiểu này cứ lặp lại?
Việc cụ thể Chạy test case, báo bug, kiểm tra lại sau khi sửa Đặt quy trình review, tiêu chí nghiệm thu, chiến lược test
Lúc nào bận nhất Trước mỗi lần phát hành Đầu dự án và sau các sự cố lớn

Ở công ty nhỏ, một người làm cả hai. Ở công ty lớn, thường có nhóm QC làm kiểm thử hằng ngày và một vài người QA lo phần quy trình. Dù được gọi bằng chữ nào, cái chung là họ đứng giữa sản phẩm và người dùng, chặn lỗi trước khi người dùng phải gặp.

Một tuần ở phòng kiểm thử

Tôi từng có dịp ngồi gần một nhóm kiểm thử phần mềm (software tester) trọn một sprint hai tuần. Ngày đầu, họ ít khi test gì. Họ đọc tài liệu yêu cầu, ngồi họp cùng BA và developer, hỏi những câu khiến cả bàn phải dừng lại suy nghĩ. “Nếu người dùng đổi địa chỉ giao hàng sau khi đã thanh toán thì sao?” Câu đó không có trong tài liệu. Cuối buổi, BA phải thêm một mục mới.

Tôi để ý là tester giỏi thường hiểu sản phẩm rộng hơn cả developer, vì họ phải đi qua mọi luồng chứ không chỉ phần mình được giao. Những gì họ cần biết về hệ thống, về cách code được viết và triển khai, trùng nhiều với kỹ năng cốt lõi của nghề lập trình mà tôi có kể ở một bài riêng.

Mấy ngày tiếp theo là viết test case. Mỗi ca kiểm thử ghi rõ điều kiện ban đầu, các bước làm, kết quả mong đợi. Họ chia ra kiểm thử chức năng, kiểm thử giao diện, kiểm thử với dữ liệu biên như số âm, chuỗi rỗng, ký tự tiếng Việt có dấu, emoji. Nhóm này dùng TestRail để quản lý test case và Jira để theo dõi lỗi, nhưng tôi cũng biết nơi chỉ dùng Google Sheets và vẫn làm tốt.

Khi bản build đầu tiên có trên môi trường thử, phòng bắt đầu ồn hơn. Bug được báo, developer sửa, tester kiểm tra lại, đôi khi mở lại vì sửa chỗ này hỏng chỗ khác. Gần ngày phát hành là đợt kiểm thử hồi quy (regression test), chạy lại những luồng chính để chắc rằng thay đổi mới không phá tính năng cũ. Đây là chỗ test tự động phát huy tác dụng nhất.

Có một chuyện ít ai kể là dữ liệu thử. Muốn test luồng hoàn tiền thì phải có đơn hàng đã thanh toán, muốn test tài khoản bị khóa thì phải có tài khoản bị khóa. Nhóm đó giữ một bảng tính riêng ghi các tài khoản thử, mật khẩu, trạng thái, ai đang dùng. Có lần hai người cùng dùng một tài khoản, người này đổi mật khẩu, người kia báo bug “không đăng nhập được”. Mất nửa buổi sáng mới hiểu ra.

Từ phòng kiểm thử: một bug report tử tế có tiêu đề nói rõ chuyện gì sai, các bước tái hiện đánh số, kết quả mong đợi và kết quả thực tế, kèm ảnh hoặc video ngắn. Chị tester trong nhóm đó bảo, nếu developer phải nhắn hỏi lại “chị làm thế nào để ra lỗi này?” thì bug report đó chưa đạt.

Từ bấm tay sang viết script

Nhiều người vào nghề bằng kiểm thử thủ công (manual testing), và đó là cửa vào hợp lý. Nó dạy bạn cách nghĩ như người dùng, cách nhìn ra chỗ lạ. Nhưng sau vài năm, phần lớn tester tôi biết đều học thêm tự động hóa, vì chạy tay một bộ hồi quy vài trăm ca mỗi lần phát hành thì không ai chịu nổi.

Công cụ thì có vài cái tên hay gặp. Selenium vẫn còn được dùng nhiều ở các dự án lâu năm, Playwright và Cypress được các đội mới chuộng hơn. Postman dùng để kiểm thử API, Appium cho ứng dụng di động, JMeter hoặc k6 khi cần kiểm thử hiệu năng. Viết script tự động thì cần biết lập trình ở mức cơ bản, thường là JavaScript, Python hoặc Java, tùy đội.

Tôi muốn nói rõ một điều vì hay nghe hiểu nhầm. Làm tester không phải là “lập trình viên hạng hai”. Một người kiểm thử giỏi phải hiểu nghiệp vụ, hiểu cấu trúc hệ thống, biết đọc log, biết gọi API, biết viết truy vấn SQL để kiểm tra dữ liệu dưới cơ sở dữ liệu. Nhóm kỹ năng đó trùng khá nhiều với những gì developer cần, chỉ khác góc nhìn.

Developer hỏi “nó có chạy không”. Mình hỏi “nó chạy cho ai, trong điều kiện nào, và khi nào thì không”.

Câu đó tôi ghi lại từ một cậu tester trẻ trong buổi chia sẻ nội bộ. Cậu ấy vào nghề từ ngành kinh tế, học qua một khóa ngắn hạn rồi xin vào làm manual tester. Ba năm sau cậu viết script Playwright cho cả đội và đang học thêm về kiểm thử bảo mật.

Về đường đi, có người lên trưởng nhóm kiểm thử (QA lead), có người đi sâu vào tự động hóa thành SDET, kỹ sư phát triển phần mềm trong kiểm thử. Một số chuyển sang BA hoặc quản lý sản phẩm vì đã quá quen với nghiệp vụ. Thu nhập thì chênh nhau khá rõ giữa manual và automation, và còn tùy vào công ty, dự án, ngoại ngữ, nên tôi không đưa con số.

Những gì người mới hay hỏi tôi

Hỏi: Có cần chứng chỉ ISTQB không?

Đáp: Không bắt buộc, nhưng chứng chỉ nền tảng ISTQB Foundation Level giúp bạn nói cùng một ngôn ngữ với người trong nghề, và một số công ty gia công cho khách nước ngoài có đánh giá cao. Nó không thay được kinh nghiệm thực tế.

Hỏi: Người trái ngành có vào được không?

Đáp: Được, và tôi gặp khá nhiều. Kiểm thử thủ công là cửa vào dễ hơn so với lập trình. Bạn nên tự test thử vài trang web hay ứng dụng thật, viết bug report cẩn thận rồi đưa vào hồ sơ, nhà tuyển dụng thường muốn thấy cách bạn nghĩ hơn là bằng cấp.

Hỏi: AI viết test case thay người thì nghề này còn không?

Đáp: Các công cụ AI đã giúp viết nháp test case và script khá nhanh, nhóm tôi kể ở trên cũng dùng. Nhưng việc quyết định nên test cái gì, rủi ro nằm ở đâu, lỗi nào đáng chặn phát hành thì vẫn cần người hiểu sản phẩm. Theo tôi, người chỉ biết bấm theo kịch bản có sẵn sẽ khó hơn, còn người hiểu nghiệp vụ và biết tự động hóa thì vẫn có chỗ.

Mobile developer lập trình di động, kể từ ngăn kéo đầy điện thoại cũ

Phan Anh Tú

Ở góc phòng của nhóm mobile có một cái ngăn kéo mà ai mới vào cũng tò mò. Bên trong là mười mấy chiếc điện thoại, đủ đời: một chiếc iPhone màn hình nhỏ đã sứt góc, vài máy Android tầm trung của ba bốn hãng, một chiếc máy tính bảng dán băng keo ghi “đừng cập nhật hệ điều hành”. Mỗi chiếc là một lý do khiến một bản phát hành từng bị trả về.

Người làm mobile developer, lập trình di động, sống với cái ngăn kéo đó. Họ viết ứng dụng chạy trên điện thoại, thứ bạn tải về từ App Store hay Google Play, và họ phải lo cho nó chạy được trên những thiết bị mà chính họ không bao giờ chọn mua.

Viết cho một cái máy nằm trong túi người khác

Khác với web, ứng dụng di động chạy trên máy của người dùng, với pin của họ, bộ nhớ của họ, mạng 4G chập chờn trong thang máy của họ. Một lập trình viên di động (mobile developer) phải nghĩ đến những chuyện mà người làm web ít khi gặp. App bị hệ điều hành tắt ngầm khi chạy nền thì dữ liệu đang nhập có mất không. Người dùng từ chối quyền truy cập vị trí thì màn hình bản đồ hiện gì. Thông báo đẩy có đến đúng lúc không, hay đến muộn sau khi khuyến mãi đã hết giờ.

Có hai cách làm chính. Cách thứ nhất là viết riêng cho từng nền tảng: Swift và SwiftUI với Xcode cho iOS, Kotlin và Jetpack Compose với Android Studio cho Android. Cách này cho hiệu năng và cảm giác sử dụng sát với hệ điều hành nhất, nhưng tốn hai đội hoặc một người phải giỏi cả hai. Cách thứ hai là đa nền tảng, phổ biến nhất ở các văn phòng tôi biết là Flutter (viết bằng Dart) và React Native (viết bằng JavaScript hoặc TypeScript), một bộ code chạy được cả hai bên.

Không cách nào thắng tuyệt đối. Tôi thấy các startup và công ty gia công hay chọn Flutter hoặc React Native vì ra sản phẩm nhanh. Các ứng dụng ngân hàng lớn, ứng dụng cần đụng sâu vào camera, Bluetooth hay xử lý ảnh thì thường vẫn có đội native riêng. Nếu bạn muốn xem nhánh mobile nằm ở đâu giữa các vị trí khác trong một đội phần mềm, tôi có ghi lại phần kiến thức nền của nghề ở một bài riêng, đọc trước sẽ dễ hình dung hơn.

“Trên web lỡ lỗi thì sửa trong mười phút. Trên app, bản lỗi nằm trong máy người ta cả tuần.”

Đó là điều làm nghề mobile căng hơn hẳn ở khâu phát hành. Mỗi bản cập nhật phải qua vòng duyệt của Apple hoặc Google, thời gian không cố định, có lúc trôi chảy có lúc bị trả về vì một dòng mô tả quyền riêng tư chưa rõ. Và kể cả khi đã duyệt, người dùng không cập nhật ngay. Có người giữ bản cũ hàng năm trời. Vì vậy backend phải tiếp tục phục vụ cả những phiên bản app cũ, và người làm mobile phải nghĩ kỹ trước khi đổi bất cứ thứ gì liên quan đến dữ liệu.

Một tuần trước ngày phát hành

Tôi từng ngồi cạnh một nhóm mobile vào tuần cuối trước khi đưa một bản lớn lên chợ ứng dụng. Thứ Hai họ đóng băng tính năng, chỉ sửa lỗi. Thứ Ba bản thử nghiệm được đẩy qua TestFlight cho iOS và kênh thử nghiệm nội bộ trên Google Play Console cho Android, cả công ty được mời cài thử. Thứ Tư là ngày ngăn kéo điện thoại được mở ra, tester và developer chia nhau cầm từng máy, bấm qua từng luồng.

Ở bàn thử máy: lỗi khó chịu nhất tuần đó nằm trên một chiếc Android tầm trung, bàn phím ảo che mất nút “Xác nhận” ở màn hình nhập mã OTP. Trên máy giả lập thì không thấy. Phải cầm máy thật mới phát hiện được.

Thứ Năm nộp bản lên duyệt. Thứ Sáu cả nhóm ngồi chờ, mở Firebase Crashlytics liên tục để xem tỷ lệ crash của bản thử. Phát hành thì thường làm theo kiểu tung dần, ban đầu chỉ một phần nhỏ người dùng nhận bản mới, thấy ổn mới mở rộng.

Người ở góc phòng đó là ai

Những người làm mobile mà tôi quen thường có tính tỉ mỉ đến mức hơi khó chịu. Họ để ý khi một hiệu ứng chuyển màn hình bị giật nửa nhịp. Họ biết chuyện pin hao nhanh khi app gọi định vị liên tục. Họ đọc kỹ hướng dẫn thiết kế của Apple (Human Interface Guidelines) và Material Design của Google, không phải để chép, mà để biết người dùng mỗi bên quen thao tác thế nào.

Họ cũng phải học liên tục. Mỗi năm Apple và Google đều ra phiên bản hệ điều hành mới, kèm thay đổi về quyền riêng tư, về chạy nền, về thông báo. Có năm cả nhóm mất vài tuần chỉ để sửa app cho khớp với một chính sách mới.

Đường đi sau vài năm khá mở. Có người đi sâu thành chuyên gia iOS hoặc Android, có người học thêm backend để làm fullstack, có người lên trưởng nhóm mobile. Với ai thích tự làm, mảng này còn một lối riêng là tự phát hành ứng dụng của mình lên chợ, dù sống được bằng nó thì không dễ chút nào.

Còn cái ngăn kéo, đến giờ tôi nghe nói nó vẫn ở đó, thêm vài chiếc máy mới, bớt vài chiếc đã chết pin hẳn. Chiếc máy tính bảng dán băng keo thì vẫn chưa ai dám cập nhật.

Backend developer là gì và một đêm trực máy chủ tôi còn nhớ

Phan Anh Tú · người từng trực đêm

Hai giờ mười bảy phút sáng, điện thoại của cậu kỹ sư trực rung lên ba lần liền. Kênh cảnh báo báo thời gian phản hồi của API đặt hàng vọt từ hai trăm mili giây lên tám giây. Cậu mở laptop ngay trên giường, vào Grafana, thấy biểu đồ kết nối tới cơ sở dữ liệu dựng đứng như vách núi. Phía người dùng, ai đang đặt đồ ăn khuya chỉ thấy vòng xoay chờ mãi không dừng.

Tôi kể cảnh đó trước vì nó trả lời câu hỏi backend developer là gì rõ hơn mọi định nghĩa. Họ là những người chịu trách nhiệm cho phần bạn không nhìn thấy: máy chủ nhận yêu cầu, kiểm tra quyền, tính toán, ghi dữ liệu, trả kết quả về. Khi phần đó chạy ổn, không ai nhắc đến họ. Khi nó trục trặc, điện thoại reo lúc hai giờ sáng.

Thứ họ xây là đường ống, không phải mặt tiền

Nếu ví một ứng dụng như một nhà hàng thì frontend là phòng ăn, còn backend là bếp, kho, sổ sách và đường ống nước. Khách gọi món qua giao diện, yêu cầu đi xuống backend dưới dạng một lời gọi API. Backend kiểm tra món còn không, khách có đủ tiền trong ví không, tính phí giao hàng, ghi đơn vào cơ sở dữ liệu, rồi báo cho bếp và tài xế.

Một ngày làm việc của lập trình viên backend (backend engineer) thường xoay quanh vài loại việc. Thiết kế và viết API, thường theo kiểu REST, đôi khi là GraphQL hoặc gRPC khi các dịch vụ nội bộ gọi nhau. Thiết kế bảng dữ liệu, đặt chỉ mục (index) sao cho truy vấn không chậm khi bảng lên vài chục triệu dòng. Viết các tác vụ chạy nền như gửi email xác nhận, xuất báo cáo cuối ngày, đồng bộ dữ liệu với hệ thống của đối tác.

Phần còn lại, và phần này nhiều hơn người ta tưởng, là đọc log, đọc biểu đồ và đọc code cũ. Hệ thống backend sống lâu. Có những dịch vụ tôi từng sửa được viết từ thời người viết nó còn là sinh viên thực tập, giờ người đó đã làm giám đốc kỹ thuật ở công ty khác.

Ngôn ngữ nào cũng được, miễn hiểu thứ bên dưới

Câu hỏi tôi nghe nhiều nhất từ người mới là nên học ngôn ngữ nào. Thành thật thì ở Việt Nam, các văn phòng tôi biết dùng khá phân tán, tùy loại công ty và loại dự án.

Ngôn ngữ / nền tảng Hay gặp ở đâu
Java với Spring Boot Ngân hàng, bảo hiểm, công ty gia công cho khách Nhật và châu Âu
C# với .NET Phần mềm doanh nghiệp, hệ thống nội bộ
Node.js (JavaScript/TypeScript) Startup, sản phẩm cần ra nhanh, đội fullstack
Go Dịch vụ cần chịu tải lớn, fintech, thương mại điện tử
Python với Django hoặc FastAPI Dự án dữ liệu, AI, công cụ nội bộ
PHP với Laravel Website thương mại, agency, hệ thống quản trị nội dung

Ngôn ngữ chỉ là lớp ngoài. Thứ phân biệt người làm backend lâu năm với người mới là họ hiểu những gì nằm dưới. Cơ sở dữ liệu quan hệ như PostgreSQL hay MySQL, giao dịch (transaction) và khóa dòng hoạt động thế nào. Bộ nhớ đệm như Redis giúp gì và gây rắc rối gì khi dữ liệu cũ không được xóa đúng lúc. Hàng đợi tin nhắn như RabbitMQ hay Kafka dùng khi nào. Docker để đóng gói, và với hệ thống lớn hơn thì Kubernetes để chạy hàng chục bản sao cùng lúc.

Tôi từng phỏng vấn một bạn viết Java rất nhanh nhưng không giải thích được vì sao truy vấn của mình chậm khi bảng lớn lên. Bạn ấy không sai khi chọn Java. Bạn ấy chỉ chưa từng nhìn vào kế hoạch thực thi (execution plan) của câu SQL mình viết.

Ai muốn thấy backend nằm ở đâu so với frontend, mobile, kiểm thử và phân tích nghiệp vụ thì có thể đọc thêm bài tôi viết về các vị trí trong nghề lập trình, ở đó tôi kể về từng chỗ ngồi trong một văn phòng phần mềm.

Đêm hôm đó kết thúc thế nào

Quay lại cậu kỹ sư trực đêm. Sau hai mươi phút dò log, cậu tìm ra nguyên nhân: một tác vụ xuất báo cáo được ai đó đổi lịch chạy từ bốn giờ sáng sang hai giờ, và nó khóa đúng bảng mà API đặt hàng cần ghi vào. Cậu tạm dừng tác vụ, kết nối thông trở lại, biểu đồ hạ xuống. Sáng hôm sau cả nhóm ngồi viết báo cáo sự cố (postmortem), không đổ lỗi cho ai, chỉ ghi lại chuyện gì xảy ra, vì sao không phát hiện sớm, và sẽ thêm cảnh báo gì.

Lúc đó em chỉ nghĩ, may mà mình đã đọc log từ trên xuống chứ không đoán bừa rồi khởi động lại máy chủ.

Cậu ấy kể vậy trong buổi họp sáng, giọng vẫn còn ngái ngủ. Tôi nghĩ đó là bài học quý hơn mọi khóa học. Backend không chỉ là viết code đúng. Nó là viết code mà khi sai thì để lại đủ dấu vết cho người khác lần ra, là thêm log ở đúng chỗ, là đặt cảnh báo trước khi người dùng phải gọi tổng đài.

Thói quen của người làm lâu thường rất cụ thể. Họ viết test cho phần tính tiền trước khi viết code. Họ hỏi “nếu dịch vụ bên kia không trả lời thì sao” trong mọi buổi thiết kế. Họ không tin dữ liệu từ phía người dùng gửi lên, kể cả khi frontend đã kiểm tra rồi. Và họ ghét nhất là những thay đổi được đẩy lên lúc năm giờ chiều thứ Sáu.

Bảo mật cũng nằm trên vai backend nhiều hơn người ta nghĩ. Mật khẩu phải được băm, không lưu dạng thô. Truy vấn phải tham số hóa để tránh SQL injection. Token đăng nhập phải có hạn dùng. Danh sách OWASP Top 10 là thứ tôi hay khuyên người mới đọc ít nhất một lần, vì phần lớn lỗi bảo mật tôi gặp trong đời đi làm đều nằm trong đó.

Đường đi của người làm phía sau

Lộ trình thường bắt đầu bằng việc sửa lỗi nhỏ và viết API đơn giản dưới sự kèm cặp của người đi trước. Vài năm sau, bạn được giao thiết kế cả một dịch vụ, tự quyết định bảng dữ liệu và cách các thành phần nói chuyện với nhau. Lên senior, bạn bắt đầu nghĩ về cả hệ thống: chỗ nào là điểm nghẽn, chỗ nào hỏng thì kéo sập mọi thứ, chi phí máy chủ hàng tháng là bao nhiêu và có đáng không.

Từ đó, có người đi tiếp lên kiến trúc sư phần mềm, có người rẽ sang DevOps hoặc SRE (site reliability engineer) vì thích lo chuyện vận hành, có người sang kỹ sư dữ liệu (data engineer) vì đã quen với cơ sở dữ liệu và các luồng xử lý. Một số làm quản lý. Tôi thấy backend là chỗ xuất phát khá rộng cửa cho nhiều hướng đi sau này.

Thu nhập thì như mọi nhánh khác, khác nhau rất nhiều theo công ty, mảng nghiệp vụ, ngôn ngữ và khả năng tiếng Anh. Tôi không đưa con số ở đây vì nó dễ gây hiểu lầm hơn là giúp ích.

Mấy câu tôi hay bị hỏi

Hỏi: Không giỏi Toán có làm backend được không?

Đáp: Được, với phần lớn công việc thường ngày. Bạn cần tư duy logic, hiểu độ phức tạp thuật toán ở mức cơ bản và biết vì sao một vòng lặp lồng nhau trên dữ liệu lớn lại chậm. Toán sâu chỉ cần khi làm các mảng như mật mã, tối ưu hóa định tuyến hay học máy.

Hỏi: Nên học SQL hay NoSQL trước?

Đáp: Theo tôi là SQL. Phần lớn hệ thống nghiệp vụ vẫn dựa trên cơ sở dữ liệu quan hệ, và hiểu được join, index, transaction rồi thì chuyển sang MongoDB hay các loại khác dễ hơn nhiều so với chiều ngược lại.

Hỏi: Có phải làm backend thì phải trực đêm?

Đáp: Không phải nơi nào cũng vậy. Công ty làm sản phẩm chạy 24/7 như thanh toán, giao đồ ăn, sàn thương mại thường có lịch trực xoay vòng. Công ty gia công theo dự án hoặc làm phần mềm nội bộ thì ít hơn hẳn. Nên hỏi thẳng chuyện này khi phỏng vấn.

Frontend developer là gì, chuyện của người canh từng pixel trên màn hình

Phan Anh Tú · ghi chép nghề

Cô ấy phóng to màn hình lên 400%, rồi lấy thước đo của Figma đặt cạnh cái nút “Thanh toán”. Lệch bốn pixel so với bản thiết kế. Không ai trong phòng để ý, trừ cô và cậu designer ngồi đối diện, người vừa nhắn tin hỏi “chỗ này em làm theo bản cũ à?”. Đó là một buổi chiều rất bình thường của một frontend developer.

Tôi hay được hỏi frontend developer là gì, thường bởi người thân hoặc sinh viên năm nhất. Câu trả lời ngắn là người dựng phần mà bạn nhìn thấy và chạm vào trên một trang web: nút bấm, ô nhập liệu, menu, ảnh, hiệu ứng khi kéo trang. Câu trả lời dài hơn thì thú vị hơn nhiều, và nó nằm ở những gì diễn ra phía sau cái nút lệch bốn pixel kia.

Họ là người dịch bản vẽ thành thứ bấm được

Một bản thiết kế trong Figma chỉ là hình ảnh. Nó không biết khi người dùng nhập sai email thì phải hiện chữ đỏ ở đâu, không biết khi mạng chậm thì nút có xoay vòng chờ không, cũng không biết màn hình điện thoại năm inch thì cột bên phải sẽ đi đâu. Người làm frontend (lập trình viên giao diện) phải trả lời hết những câu đó bằng code.

Công việc trong một tuần

Đầu tuần thường là nhận ticket. Một màn hình mới, một form đăng ký, hoặc sửa lỗi “trên Safari bị vỡ khung”. Họ mở bản thiết kế, chia nó thành các thành phần nhỏ (component) như thẻ sản phẩm, thanh tìm kiếm, hộp thoại xác nhận. Một component viết tốt có thể dùng lại ở hai chục chỗ.

Giữa tuần là nối giao diện với dữ liệu thật. Lúc này frontend phải ngồi cùng người làm backend, thống nhất API trả về trường nào, tên gì, khi lỗi thì mã lỗi ra sao. Tôi đã thấy không ít cuộc tranh cãi chỉ vì một bên đặt tên userName, bên kia mong username. Nghe buồn cười nhưng sửa ở giai đoạn muộn thì tốn công thật.

Cuối tuần, nếu may mắn, là kiểm thử trên nhiều trình duyệt và thiết bị. Chrome, Safari, Firefox, một chiếc iPhone cũ, một chiếc Android giá rẻ của phòng QA. Cái điện thoại Android cũ đó là nỗi ám ảnh của nhiều người, vì trang chạy mượt trên MacBook có thể giật từng nhịp trên nó.

Bộ đồ nghề

Nền móng vẫn là ba thứ cũ: HTML để dựng khung, CSS để trang trí và sắp xếp, JavaScript để xử lý tương tác. Bây giờ hầu hết các đội dùng thêm TypeScript để bắt lỗi kiểu dữ liệu sớm hơn. Trên nền đó là framework, phổ biến nhất ở các công ty tôi biết là React, sau đó là Vue và Angular. Next.js hay Nuxt được dùng khi cần trang tải nhanh và thân thiện với công cụ tìm kiếm.

Thứ họ dùng Để làm gì
Figma Đọc bản thiết kế, lấy màu, khoảng cách, font
VS Code Viết code, hầu như ai cũng dùng
Chrome DevTools Soi phần tử, xem request mạng, đo hiệu năng
Lighthouse Chấm điểm tốc độ, khả năng truy cập của trang
Git, GitHub/GitLab Quản lý phiên bản, review code
Tailwind CSS hoặc Sass Viết CSS nhanh và gọn hơn

Nếu muốn thấy frontend đứng ở đâu giữa các nhánh còn lại như backend, mobile hay kiểm thử, tôi có viết một bài tổng quan nghề lập trình kể kỹ hơn về từng chỗ ngồi trong một văn phòng phần mềm.

Bốn pixel không phải chuyện nhỏ

Người ngoài nghe chuyện cãi nhau vì bốn pixel hay cười. Nhưng trong một trang thanh toán, nút lệch có thể khiến người dùng bấm nhầm vào nút “Quay lại”. Nhiều lần như vậy, đơn hàng rơi rớt mà không ai hiểu vì sao.

“Người dùng không bao giờ khen giao diện đẹp. Họ chỉ bỏ đi khi nó khó dùng.”

Một trưởng nhóm frontend tôi quen hay nói vậy với người mới. Anh ấy bắt cả đội tự mở trang bằng chế độ mạng 3G giả lập trong DevTools mỗi khi xong một tính năng. Ai làm trang nặng quá, ảnh không nén, gói JavaScript phình lên vài megabyte, sẽ tự thấy xấu hổ khi nhìn thanh tải chạy mãi không xong.

Có một mảng mà ở Việt Nam ít người để ý là khả năng truy cập (accessibility). Nút có nhãn để trình đọc màn hình đọc được không, màu chữ có đủ tương phản cho người mắt kém không, dùng bàn phím có đi hết được form không. Các dự án làm cho khách hàng Nhật, Úc hay châu Âu thường kiểm phần này khá kỹ, và người frontend biết làm thì có thêm một điểm cộng rõ ràng.

Ở bàn code: người mới hay học framework trước khi hiểu JavaScript thuần. Đến lúc gặp lỗi liên quan đến bất đồng bộ, từ khóa this, hoặc vòng đời của component, họ không biết lỗi nằm ở React hay ở chính ngôn ngữ. Tôi thấy ai chịu ngồi vài tuần với JavaScript gốc thì về sau đỡ khổ hơn nhiều.

Ai hợp với chỗ ngồi này

Tôi để ý những người làm frontend lâu năm thường có một điểm chung: họ khó chịu khi thấy thứ gì đó xấu hoặc khó dùng. Không nhất thiết phải biết vẽ. Nhưng nhìn một trang web mà chữ dính sát lề, nút bé xíu trên điện thoại, họ thấy ngứa mắt và muốn sửa.

Họ cũng phải chịu được việc bị góp ý liên tục. Designer góp ý về khoảng cách, product manager góp ý về luồng, tester gửi lỗi kèm ảnh chụp màn hình, khách hàng gửi email “chữ to lên chút được không”. Frontend là chỗ mọi người đều nhìn thấy, nên cũng là chỗ ai cũng có ý kiến.

Về đường đi, sau vài năm người làm frontend có thể đi sâu vào hiệu năng và kiến trúc phía giao diện, học thêm backend để thành fullstack, hoặc chuyển sang mobile với React Native vì cùng gốc JavaScript. Một số người tôi biết rẽ sang thiết kế sản phẩm vì nhận ra mình thích nghĩ về trải nghiệm người dùng hơn là viết code. Không hướng nào sai cả.

Thu nhập thì tôi không nêu con số. Nó lệ thuộc nhiều vào việc bạn làm cho công ty nào, dự án trong nước hay nước ngoài, có thạo TypeScript và một framework lớn không, và tiếng Anh tới đâu. Chênh lệch giữa hai người cùng ba năm kinh nghiệm có thể rất lớn.

Chiều hôm đó, cô frontend sửa xong bốn pixel, đẩy code lên, rồi nhắn cho cậu designer một chữ “xong”. Cậu gửi lại một sticker con mèo giơ ngón cái. Ở nghề này, đôi khi đó là lời khen đáng giá nhất trong ngày.

Nghề lập trình viên, nhìn kỹ từ bên trong một văn phòng phần mềm

Phan Anh Tú · làm phần mềm hơn mười năm

Chín giờ kém năm, tầng bốn của một tòa nhà văn phòng ở quận Tân Bình còn thưa người. Cậu kỹ sư ngồi gần cửa sổ đã mở laptop, hai màn hình phụ sáng lên, một bên là Slack đỏ chấm thông báo, một bên là bảng Jira với cột “In Progress” dài hơn cột “Done”. Cậu chưa gõ dòng code nào. Việc đầu tiên trong ngày của cậu là đọc lại ba bình luận review mà đồng nghiệp ở Đà Nẵng để lại lúc mười một giờ đêm qua.

Tôi đã ngồi ở những chỗ như thế hơn mười năm, từ lúc còn viết PHP cho một trang bán điện thoại đến khi dẫn một nhóm tám người làm hệ thống thanh toán. Người ngoài hay hình dung nghề lập trình viên là cảnh gõ phím liên tục trên nền đen chữ xanh. Thực tế thì gõ phím chiếm ít thời gian hơn họ nghĩ nhiều.

Phần lớn thời gian là đọc, không phải viết

Một lập trình viên (software developer) mới vào nghề thường bất ngờ vì mình phải đọc code của người khác nhiều đến vậy. Một sản phẩm đã chạy vài năm có thể có hàng trăm nghìn dòng mã, viết bởi những người đã nghỉ việc từ lâu. Muốn thêm một nút “Xuất hóa đơn” nhỏ, cậu kỹ sư kia phải lần theo luồng dữ liệu qua bốn năm tệp, hiểu tại sao có một hàm tên calcTotal2 nằm cạnh calcTotal, và đoán xem sửa hàm nào thì không làm hỏng màn hình báo cáo của phòng kế toán.

Rồi đến họp. Buổi họp đứng mười lăm phút lúc chín rưỡi, mỗi người nói hôm qua làm gì, hôm nay làm gì, đang kẹt chỗ nào. Có hôm buổi họp đó kéo thành bốn mươi phút vì hai người tranh luận nên lưu ngày giờ theo múi giờ nào. Nghe thì vụn vặt, nhưng chính những chuyện như thế làm hệ thống sập vào lúc ba giờ sáng nếu không ai chịu cãi cho ra lẽ.

Phần viết code thật sự thường dồn vào buổi chiều, khi văn phòng yên hơn. Tôi biết nhiều người đeo tai nghe chống ồn suốt ba bốn tiếng, ai gọi cũng chỉ giơ tay ra hiệu đợi. Sau đó là viết test, đẩy code lên GitHub hoặc GitLab, mở pull request, chờ người khác review. Bị yêu cầu sửa lại hai ba lần là chuyện thường, không ai coi đó là bị chê.

“Code chạy được mới là nửa việc. Nửa còn lại là để người sau đọc mà không chửi mình.”

Câu trên tôi nghe từ một anh trưởng nhóm cũ, và mãi về sau mới hiểu hết. Code chạy được là điều kiện tối thiểu. Thứ phân biệt người làm lâu với người mới là code của họ dễ sửa, dễ đọc, có tên biến tử tế và có ghi chú ở những chỗ đáng ghi.

Nghề này có nhiều ngã rẽ hơn người ta tưởng

Khi ai đó nói “tôi làm IT”, câu đó gần như không nói lên điều gì. Trong cùng một công ty phần mềm, người ngồi bàn bên trái có thể cả ngày căn chỉnh khoảng cách giữa hai cái nút trên giao diện, còn người bên phải lại chỉ nhìn log máy chủ và biểu đồ CPU. Họ đều được gọi là lập trình viên, nhưng công việc hằng ngày khác nhau như thợ sơn với thợ điện trong cùng một công trình.

Tôi gom lại vài nhánh hay gặp trong các văn phòng phần mềm ở Việt Nam theo những gì mình đã chứng kiến, kèm thứ mà người làm nhánh đó dùng nhiều nhất:

Nhánh Ngày thường làm gì Công cụ hay gặp
Frontend Dựng giao diện web theo bản thiết kế, xử lý tương tác của người dùng HTML, CSS, JavaScript, TypeScript, React, Vue, Figma
Backend Viết API, xử lý dữ liệu, giữ cho máy chủ chịu được tải Java, Go, Node.js, Python, PostgreSQL, Redis
Mobile Làm ứng dụng iOS, Android, đưa bản cập nhật lên chợ ứng dụng Swift, Kotlin, Flutter, React Native
Kiểm thử (QA/QC) Tìm lỗi trước khi người dùng tìm ra, viết kịch bản test Jira, Postman, Selenium, Playwright
DevOps Dựng đường triển khai tự động, theo dõi hạ tầng Docker, Kubernetes, GitHub Actions, AWS
Phân tích nghiệp vụ (BA) Ngồi với khách hàng, viết yêu cầu cho đội kỹ thuật Confluence, sơ đồ luồng, bảng tính

Bảng này đơn giản hóa khá nhiều. Ở công ty nhỏ, một người có thể ôm cả frontend lẫn backend, người ta gọi là fullstack. Ở công ty lớn thì ngược lại, có người chỉ chuyên tối ưu tốc độ tải trang hoặc chỉ lo phần đăng nhập. Tester và BA thì không phải lúc nào cũng viết code, nhưng họ ngồi cùng phòng, dự cùng cuộc họp và chịu chung áp lực khi sản phẩm sắp ra mắt.

Nếu đang phân vân nên nhìn thị trường tuyển dụng thế nào, tôi thường bảo người mới cứ mở các tin đăng thật ra đọc, xem nhà tuyển dụng đang cần ngôn ngữ nào, yêu cầu mấy năm kinh nghiệm, ở thành phố nào.

Một chỗ tôi hay gửi cho mấy bạn sinh viên năm cuối là trang tổng hợp việc làm CNTT – phần mềm, đọc chừng hai chục tin là thấy rõ công ty đang thiếu người ở mảng nào.

Người giỏi nghề không nhất thiết là người gõ nhanh

Có một cô kỹ sư backend tôi từng làm cùng, gõ phím chậm đến mức đồng nghiệp hay trêu. Nhưng mỗi khi hệ thống trục trặc, cả nhóm đều quay sang hỏi cô. Cô có thói quen đọc log từ đầu đến cuối thay vì đoán, và ghi lại mọi giả thuyết vào một tệp văn bản trước khi thử sửa. Kiểu người như vậy hiếm, và các trưởng nhóm thường nhớ rất lâu.

Về chuyên môn, người làm nghề nào cũng cần một nền tảng chung. Đó là hiểu cấu trúc dữ liệu và giải thuật ở mức đủ dùng, biết Git để làm việc nhóm, biết đọc tài liệu tiếng Anh, và biết viết câu lệnh SQL cơ bản. Tôi chưa gặp lập trình viên nào làm lâu năm mà không phải đọc tài liệu tiếng Anh hằng ngày, từ trang hướng dẫn của thư viện đến các luồng thảo luận trên Stack Overflow hay GitHub Issues.

Phần ít được nói đến hơn là kỹ năng diễn đạt. Một ticket mô tả lỗi rõ ràng, có các bước tái hiện, có ảnh chụp màn hình, tiết kiệm cho cả nhóm cả buổi sáng. Một tin nhắn “cái này lỗi rồi anh ơi” thì ngược lại. Tôi từng thấy người viết code rất ổn nhưng lên cấp chậm chỉ vì không ai hiểu họ đang làm gì.

Từ bàn làm việc: mấy năm gần đây hầu như ai cũng dùng trợ lý AI như GitHub Copilot hay các công cụ chat để viết nháp code. Nó nhanh thật, nhưng tôi thấy người mới hay chép nguyên khối mà không hiểu, đến lúc lỗi thì không biết bắt đầu sửa từ đâu. Người dùng nó khéo là người đọc lại từng dòng như đang review code của đồng nghiệp.

Còn chuyện tiếng Anh, không cần nói trôi chảy mới đi làm được. Nhưng nếu muốn làm cho khách hàng nước ngoài, tham gia họp với đội ở Nhật hay Úc, thì kỹ năng nghe nói sẽ quyết định khá nhiều việc bạn được giao phần nào của dự án.

Đường lên cấp thường không thẳng

Ở hầu hết công ty, nấc thang trông khá giống nhau trên giấy. Thực tập sinh, rồi fresher, junior, middle, senior. Sau senior thì đường bắt đầu tách làm hai.

Một hướng là đi sâu vào kỹ thuật, thành tech lead rồi kiến trúc sư phần mềm (software architect). Người theo hướng này vẫn viết code, nhưng phần lớn thời gian dành cho việc quyết định hệ thống nên chia thế nào, chọn công nghệ gì, chỗ nào có thể chịu lỗi và chỗ nào thì không. Hướng kia là quản lý con người, thành trưởng nhóm, engineering manager, rồi có thể lên cao hơn. Người theo hướng này viết code ít dần, có tuần không mở trình soạn thảo lần nào.

Tôi đã chứng kiến không ít người chọn sai rồi quay lại. Một anh bạn lên làm quản lý được hai năm thì xin trở về làm kỹ sư chính, vì anh nhớ cảm giác giải được một bài toán khó hơn là ngồi sắp lịch họp. Công ty đó cũng đồng ý, và tôi nghĩ đó là một công ty biết giữ người.

Thời gian để đi từ junior lên senior thì không có con số cố định. Có người mất ba năm, có người bảy năm vẫn loay hoay. Thứ đẩy nhanh nhất mà tôi thấy là được ném vào một dự án thật, có người dùng thật, có lỗi thật vào giữa đêm. Làm hai năm ở một chỗ toàn sửa giao diện cũ thì kinh nghiệm cũng chỉ là một năm lặp lại hai lần.

Có tuần tôi chỉ sửa được đúng một lỗi. Nhưng đó là cái lỗi làm hai nghìn đơn hàng bị trừ tiền hai lần.

Câu trên là lời một cậu kỹ sư trẻ kể trong buổi tổng kết dự án mà tôi dự. Cậu nói với giọng hơi ngại, như sợ bị cho là làm ít. Thật ra cả phòng đều biết tuần đó cậu làm việc nặng nhất.

Về thu nhập, tôi không đưa con số vì nó chênh lệch rất mạnh. Người làm cho công ty gia công phần mềm, công ty sản phẩm trong nước và công ty nước ngoài có mặt bằng khác nhau. Ngôn ngữ, mảng nghiệp vụ, thành phố và khả năng ngoại ngữ cũng kéo con số lên xuống. Cách hợp lý là xem tin tuyển dụng có ghi khoảng lương ở đúng vị trí, đúng số năm kinh nghiệm của mình, rồi hỏi thẳng người đang làm.

Những thứ ít ai kể trước khi bạn vào nghề

Có những đêm điện thoại rung lúc hai giờ sáng vì máy chủ báo lỗi. Nhiều công ty có lịch trực (on-call) xoay vòng, tuần đó ai trực thì ngủ cũng phải để điện thoại cạnh gối.

Rồi chuyện học liên tục. Framework bạn học năm ba đại học có thể đã lỗi thời khi bạn đi làm được ba năm. Tôi không nói là phải chạy theo mọi thứ mới, vì phần lớn trào lưu sẽ qua đi. Nhưng cứ vài năm, người làm nghề phải tự hỏi mình còn đang dùng công cụ mà thị trường cần hay không.

Một điều nữa là ngồi nhiều. Lưng, cổ tay, mắt. Mấy anh chị làm hơn chục năm mà tôi quen ai cũng có một bệnh nghề nghiệp nhỏ, người thì đau vai gáy, người phải đeo nẹp cổ tay. Một cái ghế tử tế và thói quen đứng dậy mỗi giờ nghe có vẻ không liên quan đến nghề, nhưng nó ảnh hưởng đến việc bạn còn làm được bao lâu.

Cuối cùng là cảm giác mình không đủ giỏi, thứ mà dân trong nghề hay gọi đùa là “hội chứng kẻ mạo danh”. Tôi gặp nó ở cả người mới lẫn người đã làm mười năm. Ngồi cạnh một đồng nghiệp giải bài toán trong mười phút trong khi mình mất cả ngày, ai cũng từng chạnh lòng. Thứ giúp tôi vượt qua là nhìn lại code mình viết một năm trước. Nếu thấy nó tệ, nghĩa là mình đã khá hơn.

Ai hợp với nghề này

Tôi không tin có một kiểu tính cách “sinh ra để làm lập trình”. Tôi đã làm cùng người hướng nội ít nói lẫn người nói cả buổi không dứt, người học Toán chuyên lẫn người học xong cử nhân Ngữ văn rồi mới chuyển ngành. Điểm chung của những người trụ được lâu là họ chịu được cảm giác bế tắc. Có những lỗi phải mất hai ngày mới tìm ra nguyên nhân, và nguyên nhân hóa ra chỉ là một dấu phẩy.

Người trái ngành vào nghề ngày nay không hiếm. Có người học qua các khóa ngắn hạn, có người tự học qua tài liệu miễn phí rồi làm vài dự án nhỏ đưa lên GitHub. Con đường này khó hơn và hồ sơ thường bị lọc kỹ hơn ở vòng đầu, nhưng tôi biết vài người đi được. Họ đều có sản phẩm cụ thể để cho nhà tuyển dụng xem, chứ không chỉ có chứng chỉ.

Nếu bạn đang ở ngưỡng cửa, cách thử rẻ nhất là tự làm một thứ nhỏ cho chính mình. Một trang web ghi chi tiêu, một bot nhắc lịch uống thuốc cho bố mẹ, một công cụ đổi tên hàng loạt tệp ảnh. Làm xong mà thấy vui, và lúc kẹt vẫn muốn ngồi gỡ tiếp thay vì bỏ đi, thì có lẽ nghề này hợp với bạn. Còn nếu chỉ vì nghe nói ngành này dễ kiếm việc, tôi khuyên nên dành vài tháng thử trước khi bỏ tiền vào một khóa học dài.

Sáu giờ chiều, cậu kỹ sư gần cửa sổ đóng laptop. Pull request của cậu đã được duyệt, ba bình luận hôm qua đã sửa xong. Ngày mai lại có ticket mới trên Jira. Nghề này là vậy, ít khoảnh khắc lớn, nhiều ngày nhỏ cộng lại.