Làm sao để trở thành một Software Engineer tốt hơn?
Hầu hết lập trình viên đều trải qua một giai đoạn "chững lại" (plateau). Đó là lúc bạn đã thành thạo một framework, có thể nhắm mắt cũng dựng được một API CRUD, làm task nào cũng xong. Bạn cảm thấy mình đã giỏi, nhưng sâu thẳm bên trong, bạn biết mình chưa chạm đến tầm vóc của một Kỹ sư phần mềm (Software Engineer) thực thụ.
Vậy đâu là lằn ranh khác biệt? Dưới góc nhìn của một người đã va vấp nhiều với các hệ thống kiến trúc phức tạp, mình sẽ viết cho bạn một bản draft "hạng nặng" về chủ đề này nhé
Lời mở đầu: Cái bẫy của sự "Hoàn thành Task"
Trong 2-3 năm đầu sự nghiệp, KPI lớn nhất của chúng ta là: "Code chạy được, task được move sang cột Done".
Nhưng nếu 5 năm, 10 năm sau bạn vẫn giữ tư duy đó, bạn sẽ mãi chỉ là một "thợ gõ code" (Coder). Bạn nhận đầu vào là ticket Jira, và nhả đầu ra là những dòng code giải quyết đúng bề nổi của vấn đề.
Một Software Engineer giỏi không chỉ giải quyết vấn đề của hiện tại, mà còn lường trước những thảm họa của tương lai. Họ không code bằng đôi tay, họ code bằng "Mental Model" (Mô hình tư duy). Dưới đây là 4 sự chuyển dịch bắt buộc nếu bạn muốn tiến lên một đẳng cấp mới.
1. Ngừng ám ảnh về Cú pháp (Syntax) - Hãy ám ảnh về "Trạng thái" (State) và "Dòng chảy" (Data Flow)
Junior cãi nhau xem C++ hay Go xịn hơn, Laravel hay Node.js viết nhanh hơn. Senior không quan tâm điều đó, vì ngôn ngữ chỉ là công cụ.
Sự khác biệt thực sự nằm ở cách bạn nhìn luồng dữ liệu. Lấy một ví dụ thực tế cực kỳ "xương xẩu": Tích hợp phần mềm với thiết bị phần cứng vật lý.
Giả sử bạn làm hệ thống bán vé tự động (AFC). Khách hàng quẹt thẻ, cổng Gate mở, nhưng ngay lúc đó rớt mạng. Dữ liệu chưa kịp đẩy lên server.
- Thợ code: Bối rối, viết mấy vòng lặp retry cơ bản, bỏ mặc rủi ro sinh ra "Orphan Transactions" (giao dịch mồ côi không khớp dữ liệu).
- Kỹ sư: Nhìn thấy bức tranh về tính nhất quán (Consistency). Họ lập tức thiết kế cơ chế đồng bộ offline, quản lý trạng thái giao dịch bằng máy trạng thái (State Machine), đảm bảo tính Idempotency (gọi 1 hay 100 lần kết quả vẫn là 1) để khi mạng có lại, tiền của khách không bị trừ hai lần.
Hãy ngừng nhìn code như những dòng lệnh tuần tự. Hãy nhìn nó như một dòng chảy dữ liệu qua các hệ thống.
2. Nhìn thấu phần chìm của tảng băng: Infrastructure và System Design
Bạn viết một câu query bằng ORM chạy mất 10ms. Bạn tự mãn. Nhưng khi bảng dữ liệu đó phình to lên 50 triệu dòng, query đó mất 5 giây và kéo sập cả hệ thống.
Một kỹ sư giỏi phải hiểu rõ bên dưới những dòng code cao siêu kia, máy tính đang làm gì.
- Bạn cấp phát bộ nhớ (Memory Allocation) ra sao? Bạn có hiểu cách con trỏ hoạt động hay cách nạp chồng toán tử (operator overloading) tác động đến hiệu năng không?
- Database của bạn lưu trữ xuống ổ đĩa vật lý theo cấu trúc nào (B-Tree, LSM Tree)?
- Khi index không còn cứu được hệ thống, bạn đã chuẩn bị kiến thức về phân mảnh dữ liệu (Sharding) hay triển khai các kiến trúc scale database phân tán như Vitess chưa?
Đừng coi Database hay Server là những chiếc "hộp đen". Cạy nó ra và xem nó vận hành thế nào.
3. Code không phải để máy đọc, Code là để NGƯỜI đọc
Một dòng code bạn viết ra hôm nay, trong 5 năm tới sẽ có hàng chục kỹ sư khác phải đọc lại, bảo trì và sửa chữa nó.
Kỹ sư tồi viết code quá thông minh (clever code) khiến người khác không hiểu nổi. Kỹ sư giỏi viết code nhàm chán nhưng rõ ràng (clean code).
Nhưng kỹ năng giao tiếp không chỉ nằm ở trong code. Nó nằm ở cách bạn làm việc với con người. Khi hệ thống sập do lỗi thiết bị từ đối tác, bạn có thể phân tích log, viết một bản Incident Report (Báo cáo sự cố) rành mạch, chuyên nghiệp, đủ sức thuyết phục và phối hợp với các Vendor phần cứng (như Hitachi hay các đối tác lớn) để cùng giải quyết vấn đề thay vì đùn đẩy trách nhiệm không? Kỹ năng mềm và sự thấu hiểu tâm lý làm việc nhóm chính là chất bôi trơn cho mọi dự án lớn.
4. Tò mò về Business (Nghiệp vụ Kinh doanh)
Lý do số 1 khiến một tính năng bị đập đi làm lại không phải vì code lỗi, mà vì Dev không hiểu đúng nghiệp vụ.
Đừng bao giờ nhận một cái API spec và cắm đầu vào code ngay. Hãy hỏi:
- "Tại sao user lại cần tính năng này?"
- "Nếu dữ liệu đầu vào bị sai, quy trình vận hành thực tế ngoài đời sẽ xử lý ra sao?"
Khi bạn hiểu được logic kinh doanh, hiểu được tâm lý và hành vi của người dùng cuối, bạn sẽ tự nhiên biết cách thiết kế cấu trúc dữ liệu sao cho linh hoạt nhất. Bạn trở thành đối tác của team Product, thay vì chỉ là một cỗ máy dịch yêu cầu thành code.
Tóm lại
Trở thành một Software Engineer tốt hơn không phải là học thêm 3 cái framework mới. Đó là sự thay đổi hoàn toàn về tư duy:
- Từ Syntax sang System Design.
- Từ Hoàn thành task sang Đảm bảo tính bền vững.
- Từ Làm việc với máy sang Giao tiếp với người.
Đường đi sẽ rất "khoai", đầy những bản report sự cố dài ngoằng và những đêm debug hệ thống phân tán, nhưng phần thưởng ở cuối con đường hoàn toàn xứng đáng.
All rights reserved