Nên học một hay nhiều ngôn ngữ

Gần đây mình nhận được một số câu hỏi về chuyện “Nên tập trung vào 1 ngôn ngữ hay là học nhiều ngôn ngữ”. Đây là một vấn đề gây khá nhiều tranh cãi trong cộng đồng lập trình viên.

Thật ra, không có câu trả lời đúng cho câu hỏi này! Trong nội dung bài viết, mình sẽ phân tích những điểm lợi/hại của mỗi lựa chọn. Tuy nhiên, lựa chọn cuối cùng vẫn là do bản thân các bạn nhé.

Thật ra, ngay từ đầu các bạn đã đặt sai câu hỏi! Thay vì hỏi “nên học một hay nhiều ngôn ngữ”, các bạn nên hỏi là “nên phát triển bản thân theo chiều rộng (generalist) hay chiều sâu (specialist)?”.

tumblr_inline_msvsmsrbld1qz4rgp

Thế nào là biết rộng? Biết rộng thì được gì?

Nhiều bạn lầm tưởng rằng chỉ biết sử dụng nhiều ngôn ngữ/công nghệ, mình sẽ thành người biết rộng. Điều này chỉ đúng một phần thôi.

Học rộng có nghĩa là: ngoài việc biết sử dụng nhiều ngôn ngữ/công nghệ, bạn còn phải biết một số thứ ngoài lề khác (lấy requirement, thiết kế giao diện, cài đặt server). Nói cho oách là siêu nhân ôm đủ việc, nói mỉa mai tức thì là ku-li gì cũng làm.

Các cụ có câu “một nghề cho chín còn hơn chín nghề”, nhưng câu này có vẻ không đúng lắm với ngành IT. Khi xây dựng một hệ thống phần mềm, nếu có kiến thức rộng, ta sẽ dễ nắm được cách toàn bộ hệ thống vận hành, giú dễ bảo trì, sửa chữa khi có lỗi xảy ra hơn. Ngoài ra, nếu biết rộng, bạn sẽ có nhiều cơ hội việc làm hơn.

Hiện tại, biết rộng đang dần trở thành xu hướng. Bên cạnh Front-end developer, Back-end developer, nay ta có thêm Full-stack developer. Trước kia Dev (phát triển phần mềm) và Operation (vận hành, bảo trì sản phẩm) được tách riêng ra. Gần đây thì lại gộp luôn là DevOps, developer ngoàiviệc code còn phải biết thêm về setup hệ thống.

dev-ops

Thế nào là biết sâu? Biết sâu thì được gì?

Nhiều bạn biết sâu tức là tập trung thời gian vào 1 ngôn ngữ, không học những thứ khác. Thật ra, biết sâu yêu cầu cao hơn nhiều! Biết sâu tức là biết tường tận tường tận mọi ngóc ngách của ngôn ngữ/công nghệ/lĩnh vực nào đó.

Lấy ví dụ JavaScript, biết rộng tức là bạn có thể sử dụng nhiều framework như AngularJS, VueJS, React, … Biết sâu thì đòi hỏi cao hơn. Ngoài việc học/sử dụng framework, bạn còn phải biết về các khái niệm execution stack, lexical scope, closure,… trong Javascript, cách tổ chức code cho 1 project JS lớn, cách optimize khi code chạy chậm.

Nếu thật sự chuyên sâu một ngôn ngữ/công nghệ nào thì bạn sẽ được nhiều công ty săn đón, với lương khá cao. Cứ hỏi mấy bác senior C++ 5-10 năm trở lên xem lương bao nhiêu là biết.

5544288592_56ff8861d5_o

Tại sao lại vậy? Hãy tưởng tượng bạn đang thèm ăn bò bít tết, bạn sẽ chọn nhà hàng A “Phục vụ đầy đủ các món Á Âu”, hay nhà hàng B “Chỉ chuyên bò bít tết”. Dĩ nhiên là nhà hàng B phải không. Nếu cần tuyển chuyên gia cho 1 mảng nào đó, các công ty sẽ ưu tiên người biết sâu hơn.

Tất nhiên bạn cũng sẽ có gặp một số rủi ro. Do chỉ chuyên sâu một ít ngôn ngữ nên có thể bạn sẽ khó tìm được công việc như ý hơn. Ngoài ra, nếu ngôn ngữ/công nghệ của bạn… tử ẹo thì bạn phải bỏ thời gian ra học và chuyên sâu thứ khác.

Ví dụ, các bác chuyên gia Flash và Silverlight (2 công nghệ đã tử ẹo) sẽ rất khó tìm việc, nhưng nếu tìm được thì lương khá cao vì bây giờ ít người rành 2 cái đấy.

Vậy người coder phải làm sao?

Như mình đã nói, bài viết chỉ phân tích và định hướng chứ không thể trả lời cho bạn được. Lời khuyên hữu ích nhất mà mình có thể đưa ra là:

Hãy phát triển kiến thức theo hình chữ T. Học rộng trước, sau đó mới chuyên sâu vào một lĩnh vực.

Kiến thức dạng chữ T tức là bạn sẽ tập trung phát triển kiến thức nền tảng trên nhiều lĩnh vực, sau đó tập trung chuyên sâu vào một ít lĩnh vực mà mình thấy hứng thú.

11
Ảnh minh họa về phát triển kĩ năng

Với các bạn sinh viên, ở giai đoạn đầu, bạn sẽ không biết mình giỏi cái gì, yếu cái gì, cần tập trung vào thứ gì. Vậy thì cứ học rộng trước đi đã. Khi đã có chút kinh nghiệm với nhiều ngôn ngữ/công nghệ, bạn sẽ dễ lựa chọn hướng phát triển cho bản thân hơn.

Một điều cần lưu ý nữa là nếu bạn đam mê startup thì nên ưu tiên “biết rộng”. Ở giai đoạn đầu khởi nghiệp, nhân sự ít, lập trình viên phải có khả năng đa nhiệm, làm đủ việcPhát triển sản phẩm startup đòi hỏi bạn phải thông tuệ nhiều thứ để vận hành hệ thống trơn trụ. Ngược lại, nếu đầu quân cho các công ty lớn, họ sẽ ưu tiên người có kiến thức tập trung, hiểu sâu vấn đề.

Kết luận

 

Điều quan trọng nhất là bạn phải liên tục học tập, biết rộng cũng được, biết sâu cũng được. Nhiều bạn phân vân không biết nên học rộng hay sâu do sợ phí thời gian, kết quả là họ … đứng im một chỗ, không tiến bộ gì cả.

Nếu bạn vẫn chưa rõ mình muốn gì, cứ học đi, đừng ngại tốn thời gian. Cứ tiến về phía trước, rồi sẽ có một con đường mở ra cho bạn.

 

Bonus – Về việc chọn ngôn ngữ

Hãy xem ngôn ngữ như con gái. Một developer giỏi phải biết nhiều ngôn ngữ. Một thanh niên tốt phải có nhiều bạn gái!

Bạn sẽ cần một em gái đảm đang làm vợ, một em dễ thương làm bồ nhí, một số em dễ chăn để chịch khi cần.

Ngôn ngữ cũng thế:

  • Chọn một em mạnh mẽ, nhiều người dùng  (C#, Java) làm ngôn ngữ chính, tập trung đối tốt với em này như vợ.
  • Chọn một em khác nổi tiếng để làm bồ nhí (JavaScript), dành nhiều thời gian tán tỉnh chiều chuộng.
  • Chọn một số em nhanh gọn dễ dãi làm rau (PHP, JavaScript), dùng để code mấy dự án nho nhỏ, lặt vặt.
rs_1024x759-160210114552-1024.Cooper-Hefner-Playboy.jl.021016
Anh giai trong hình biết 4 ngôn ngữ, em tóc vàng ngu ngu chắc là PHP

À, mấy cái ví dụ về rau, vợ và bồ nhí là theo góc nhìn của mình thôi nhé. Tùy theo sở thích mà bạn có thể chọn PHP, JavaScript làm vợ và C++ làm rau. Các bạn nên chung thủy, dành nhiều thời gian cho vợ nhà, nhưng nhớ ngó nghiêng các em hàng xóm và tình hình thế giới ra sao nhé.

Một số góc nhìn của các developer khác:

14 thoughts on “Nên học một hay nhiều ngôn ngữ”

  1. Em cũng đang phát triển kĩ năng theo mô hình chữ T :3 Em có năng khiếu thiết kế và đam mê lập trình web nên cũng rất hứng thú với công việc frontend dev. Hiện tại thì em đã học xong căn bản JS, chủ yếu là thành thạo câu lệnh và chút kiến thức về xử lý mảng, object,… ngoài ra em cũng đã tìm hiểu thêm về callback, promise, scope, closure, theo anh thì em cần trau dồi thêm kĩ năng gì về js để có thể trở thành một backend dev, thậm chí là fullstack? Em có tự tìm hiểu Nodejs nhưng gặp khó khăn với async vì lần đầu em gặp khái niệm này, cơ bản thì hiểu là nó ko thực hiện theo thứ tự … anh đưa lời khuyên giúp em với!

    Like

    1. Tìm hiểu kĩ về callback và promise là em sẽ hiểu rõ async nhé. Trên blog anh có bài viết về callback và promise đấy.

      Để dễ hiểu thì em có thể viết code trong các tutorial và xem code chạy thế nào ;).
      Hồi mới học a cũng gặp khó khăn với async, viết code dùng callback và promise nhiều là hiểu thôi ;).

      Like

Leave a comment