Bài viết này tập trung mô tả cho bạn một tấm bản đồ được định nghĩa ở quan điểm cá nhân của tôi. Chắc chắn bạn cũng sẽ có một cách vẽ bản đồ khác. Tuy nhiên, điều đó thực sự cũng không quan trọng. Tôi nghĩ rằng điều  giúp bạn thành công trong cuộc đời sẽ gồm 3 yếu tố:


  • Một mục tiêu
  • Một tấm bản đồ
  • … và sự nỗ lực không ngừng nghỉ của bản thân bạn để đến mục tiêu mình đặt ra.

Có tấm bản đồ – nghĩa là bạn đã có 10% cơ hội thành công. Tôi hy vọng rằng với tấm bản đồ tôi vẽ sẽ giúp bạn tìm được một định hướng phù hợp cho mình.


Những nấc thang


Mỗi công ty phần mềm có một cách phân chia cấp bậc khác nhau với yêu cầu của các vị trí cũng khác nhau. Nhiều bạn sẽ cảm thấy rất bối rối/hoang mang với những yêu cầu đa dạng như vậy. Hệ quả là bạn sẽ không biết mình nên đầu tư cho cái gì trong cuộc đời lập trình đáng yêu và lãng mạn này. Trong những ngày tháng đầu tiên đặt chân vào ngành phần mềm này, tôi cũng hoang mang như bạn vậy. Mãi đến sau này trong quá trình tìm tòi, học hỏi – tôi tự đặt ra cho mình một số thang bậc để làm những bước phấn đấu cho mình ở mỗi giai đoạn trong đời. Ứng với mỗi nấc thang – tôi tự vạch ra những kĩ năng mình cần.


Những nấc thang đó là gì?


Thợ học việc


Thợ học việc là những bạn mới chập chững bước chân vào nghề. Bạn thiếu gần như tất cả mọi thứ như những người mới bắt đầu khác: từ kinh nghiệm lập trình đến quy trình công việc, kĩ năng làm việc nhóm ….


Apprenticeship


Ở giai đoạn này: điều quan trọng nhất mà bạn cần làm đó là trang bị kiến thức để “làm được việc”. Những kiến thức mà bạn cần sẽ bao gồm:


  • Kiến thức nền tảng về lập trình (ngôn ngữ, công cụ lập trình). Bạn đừng lan man với nhiều thứ ngôn ngữ khác nhau. Hãy học tập trung trên ngôn ngữ hay công cụ lập trình bạn cần cho công ty và công việc bạn đang làm.
  • Kiến thức về nghiệp vụ/quy trình: hãy quan sát và học cách xử lý công việc của những anh chị đã làm lâu năm. Cố gắng nắm bắt cách mọi người đang làm để thích nghi thật nhanh với môi trường.
  • Kĩ năng xử lý vấn đề: hãy đặt mình vào bài toán thực tế – suy nghĩ về những giải pháp để làm được những bài toán nhỏ. Cách thức chia vấn đề lớn thành những vấn đề nhỏ và xử lý chúng. Học cách thức giải quyết vấn đề theo nhóm.
  • Kĩ năng làm việc nhóm: hãy học cách trao đổi, thảo luận và phối hợp với nhóm mình đang làm việc để xử lý công việc một cách hiệu quả nhất.

Bạn sẽ cần nhiều sự hỗ trợ từ mọi người xung quanh. Hãy tìm những người mà bạn tin tưởng có thể hướng dẫn bạn, sẵn sàng chia sẻ và giúp đỡ bạn.


Lập trình viên


Bạn trở thành lập trình viên có nghĩa là bạn đã qua giai đoạn học việc. Bạn có thể làm được công việc được giao với ít sự hướng dẫn hơn. Bạn cảm thấy tự tin hơn trong công việc từ cách thức xử lý vấn đề, cách thức trao đổi và phối hợp trong công việc với mọi người.


developer


Ái chà, thật thú vị làm sao! Mình đã qua được giai đoạn khổ ải lúc đầu rồi. Thế mình cần học gì nữa ta?


Trên thực tế mà tôi quan sát: phần lớn các bạn lập trình viên bị lạc lối và mất căn bản chính là từ giai đoạn này. Điều đó xảy ra bởi vì bạn bị rơi vào những cái bẫy dưới đây:


  • Nghĩ rằng mình biết: kiến thức mà bạn biết là một đường tròn. Có rất nhiều thứ bên trong đường tròn đó mà bạn vẫn chưa khám phá. Bên ngoài vòng tròn là một sa mạc bao la của những điều bạn chưa bao giờ nghe. Vì vậy, tôi khuyên bạn nên làm vững kiến thức mình có trước khi đi mở rộng đường tròn kiến thức của mình.
  • Làm mà không hiểu tại sao: bạn rất dễ dàng bị cuốn theo công việc, deadline và vô vàn những điều bận rộn khác như một guồng máy. Bạn chẳng hiểu tại sao mình làm điều này, tại sao người ta đặt ra vấn đề này… Và điều tệ hại nhất là: bạn thậm chí còn không bao giờ nghĩ đến câu hỏi “Tại sao”.

Tôi sẽ viết nhiều và chi tiết cho những điều bạn cần trang bị ở giai đoạn này bởi vì tôi nghĩ rằng: nếu bạn bị mất nền tảng từ nấc thang lập trình viên, nó sẽ giết chết những năm tháng kế tiếp trong sự nghiệp của bạn.


Tôi cần học gì khi là một lập trình viên?


Củng cố về nền tảng ngôn ngữ và những best practices của ngôn ngữ lập trình:


Bạn không được gọi là lập trình viên giỏi nếu bạn không hiểu sâu về cú pháp của ngôn ngữ bạn đang làm việc và cách vận dụng nó để làm cho code của mình thật hiệu quả, ngắn gọn và mang tính biểu đạt cao. Đồng thời, bạn cũng cần phải hiểu thật chi tiết cách mà chương trình được viết bằng ngôn ngữ bạn đang học được biên dịch/thông dịch và vận hành như thế nào.


Cách đây 3 năm, tôi và anh Martin (Ex CTO của Pyramid Consulting) tham gia build up team Atlassian VietNam lúc tôi còn làm ở Pyramid Consulting. Atlassian phỏng vấn  Pyramid Consulting development team cũng như những công ty partner khác mà họ muốn hợp tác. Một câu hỏi làm tôi cảm thấy rất thú vị trong buổi phỏng vấn là: bạn hãy nêu ra 2-3 features mà bạn yêu thích nhất của ngôn ngữ mà bạn đang làm việc. Là một lập trình viên, nếu bạn thật sự giỏi – bạn cần hiểu rất sâu về đặc tả của ngôn ngữ và phải vận dụng nó một cách hiệu quả nhất trên từng dòng code. Nếu bạn không trả lời được câu hỏi này, thì … nên đọc và học lại. Đừng nghĩ rằng mình biết một ngôn ngữ vì … mình đã code được trên nó.


Hiểu và vận dụng những lý thuyết về clean code và refactoring: tôi khuyên bạn nên đọc 2 quyển sách dưới đây:



Đây là 2 quyển sách mà tôi cho rằng khá hay để giúp bạn trang bị những kiến thức về cách để làm cho code của mình sạch và tốt. Tất nhiên, bạn cũng có thể học bằng nhiều cách khác. Ví dụ: đọc code của những thư viện mã nguồn mở cũng là một cách rất hay để học cách họ thiết kế và code (học cả từ cái hay đến cái dở).


Đào sâu về những design pattern phổ biến và vận dụng nó trong code của bạn:


Cách học design pattern đúng là bạn phải hiểu được tại sao người ta đưa ra nó? nên vận dụng nó trong hoàn cảnh nào? Có những trường hợp nào không nên dùng?  Nếu bạn đọc code của những thư viện nguồn mở nổi tiếng/phổ biến, bạn sẽ thấy họ vận dụng rất tinh tế các interface, abstract class và các design pattern rất phổ biến để làm cho code thật dễ bảo trì, mềm dẻo để đáp ứng sự thay đổi.


Đừng nghĩ về các pattern thật cao siêu. Hãy đọc một pattern và thử vận dụng vào những dòng code mà bạn đã từng viết hoặc sắp viết. Bạn sẽ thấy hiệu quả của nó.


Đối với các mảng khác, vd: lập trình nhúng, vi mạch … design pattern được ánh xạ thành những nguyên lý hoặc các best practices mà mọi người thường dùng. Điều quan trọng ở đây tôi muốn nhấn mạnh để bạn phải học, đó là: tìm các thiết kế tốt lặp đi lặp lại để vận dụng trong code của bạn.


Trang bị kiến thức nền về các giao thức và những chuẩn đặc tả:   Giao thức/đặc tả là những chuẩn được các tổ chức quốc tế công nhận. Nó được mô tả thành các đặc tả công nghiệp mà phần mềm, thư viện phải tuân theo.  Khi công nghệ phát triển, người ta bọc lại rất nhiều thứ trong các thư viện và công cụ bạn dùng để làm bạn cảm thấy dễ dàng lập trình. Tuy nhiên, nếu bạn không hiểu cách thức hoạt động của các giao thức, bạn sẽ không thể đưa ra những thiết kế, tư vấn và giải pháp hợp lý. Tệ hơn, nó đem lại chính hệ quả phía trên mà tôi đề cập: bạn làm mà không hiểu tại sao?.


Có rất nhiều thứ xung quanh bạn đều được vận hành dựa theo giao thức. Bạn thử tìm hiểu vài câu hỏi dưới đây và sẽ tìm thấy rất nhiều điều thú vị xung quanh:


  • Khi tôi duyệt một URL trên trình duyệt, điều gì xảy ra ở browser và server? Nó tuân theo giao thức nào?
  • Khi tôi gõ vào một domain trên trình duyệt, điều gì đang xảy ra?
  • Tại sao tôi không ping được một con server mà sếp đưa, trong khi tôi vẫn ssh vào được hoặc domain đang trỏ vào IP của server vẫn đang chạy ngon lành?
  • Điều gì xảy ra khi tôi click vào nút gửi mail? Tại sao email tôi gửi đi luôn vô spam của người nhận?

Tôi không khuyên bạn phải học hết tất cả mọi giao thức mà bạn thấy xung quanh. Bởi vì – nếu bạn học hết thì chắc cả đời cũng không thể xong. Hãy tập trung vào những giao thức gắn với những công việc, vấn đề thực tế bạn đang làm. Ví dụ: bạn làm Front End developer – thì sẽ thật thiếu sót nếu bạn không biết đặc tả của HTML, CSS và cách browser render những thành phần trong đặc tả này.


Điều cuối cùng nên được áp dụng khi bạn ở nấc thang lập trình viên:


Đây chính là một nguyên lý mà tôi thường khuyên các bạn lập trình viên đồng nghiệp. Nó có thể giúp bạn phát triển nhanh hơn những người khác nếu bạn áp dụng nó liên tục trong suốt quá trình làm việc của mình.


Hãy luôn đặt cho mình 3 câu hỏi dưới đây hàng ngày và tìm câu trả lời cho nó:


  • Hỏi tại sao cho bất cứ mọi thứ xung quanh để tìm ra bản chất của vấn đề. Nắm được cốt lõi và nguyên lý, bạn sẽ hiểu được tất cả mọi thứ.
  • Làm sao để tốt hơn? – nhìn lại mọi thứ mình đã và đang làm, tìm cách tối ưu hoá công việc và hiệu suất.
  • Cái gì cần ưu tiên trước? khi bắt tay vào làm bất cứ điều gì, hãy phân tích độ ưu tiên để đảm bảo điều mình làm ra đem lại giá trị đúng vào thời điểm đúng. Bạn có thể sản xuất ra một cái xe hơi, trong khi sếp bạn đang cần demo cái bánh xe trước tiên cho buổi họp khách hàng gần nhất thì cái xe hơi bạn làm ra là vô nghĩa. Biết ưu tiên công việc chính là cách bạn tạo ra dòng chảy giá trị phù hợp với chi phí và công sức đổ ra ít nhất.

Lập trình viên cấp cao


senior-developer


Là một lập trình viên cấp cao, bạn được mong đợi:


  • Có khả năng làm việc độc lập không cần sự hướng dẫn của người khác.
  • Bạn phải là người có khả năng hướng dẫn người khác để làm được việc.
  • Có khả năng tư vấn và xử lý những vấn đề khó.
  • Hiểu những nguyên lý tốt nhất cần phải vận dụng trong kĩ thuật bạn đang làm để đưa ra mẫu cho mọi người tuân theo.

Cái gì ngăn cản một lập trình viên trở thành lập trình viên cấp cao?


Khi bạn đã chạm đỉnh của nấc thang lập trình viên, điểm làm bạn khó vượt qua để đi xa hơn thường rơi vào 2 vấn đề dưới đây:


  • Cách bạn tạo ra dòng chảy giá trị chưa hiệu quả: Mọi người không nhìn thấy sự đóng góp của bạn trong công việc vì giá trị bạn tạo ra không đúng thời điểm hoặc quá phức tạp, quá lâu để có thể nhìn thấy được.
  • Bạn không thể hướng dẫn hoặc đào tạo người khác: điểm này phần lớn xuất phát từ 3 kĩ năng mềm chính mà bạn còn thiếu:
    • Khả năng phân tích và hệ thống hoá vấn đề.
    • Khả năng diễn đạt – trình bày
    • Tự tin. Nếu bạn sửa được 2 điểm trên thì điểm cuối này sẽ không còn.


Là một lập trình viên cấp cao, tôi cần học thêm gì?


Khi ở nấc thang lập trình viên, tôi khuyên bạn phải luôn hiểu bản chất, nắm nguyên lý – trả lời được mọi câu hỏi Tại sao. Vậy thì, ở nấc thang lập trình viên cấp cao – bạn sẽ cần: nắm công nghệ, hiểu cách xử lý các vấn đề cao cấp và trả lời được câu hỏi ‘Làm thế nào’ một cách tinh tế và sâu sắc nhất.


Nhiều người nói rằng tôi cho lời khuyên ngược. Đúng lý ra khi em bập bõm lập trình, em phải làm được (HOW) rồi mới cần hiểu bản chất (WHY). Trên thực tế, tôi hiểu rằng là một lập trình viên trẻ, bạn thích nhìn thấy kết quả rồi mới cần hiểu. Tuy nhiên, bạn luôn luôn bỏ quên giai đoạn hiểu bản chất khi bạn đã thấy kết quả. Đó là cách mà bạn tự giết mình.


Khi là một lập trình viên cấp cao, câu hỏi ‘Làm thế nào’ mà bạn đặt ra để giải quyết là những câu hỏi khó. Nó có thiên hướng về phương pháp luận, thiết kế, kiến trúc nhiều hơn chỉ là những câu hỏi trong một bài toán coding nhỏ.


Ví dụ:


  • Làm sao để tôi deploy được hệ thống nhanh và hiệu quả?
  • Làm sao để làm cho chất lượng delivery của team tốt hơn?
  • Facebook làm sao mà tốc độ xử lý nhanh như điện thế nhỉ?
  • Kiến trúc Stackoverflow như thế nào?
  • Giải quyết real time messaging trên mobile thì nên dùng công nghệ nào?
  • Dựa trên tiêu chí nào để lựa chọn giải pháp X cho vấn đề A?

Tôi sẽ tạm dừng bài viết ở đây để bạn có thể nghiền ngẫm về 3 nấc thang đầu tiên trên đường đi của một lập trình viên. Đồng thời cũng tránh bài viết quá dài. Tôi sẽ viết chi tiết về những nấc thang kế tiếp “Lãnh đạo nhóm” và “Kiến trúc sư phần mềm” ở bài viết sau.