Monday, September 2, 2019

NÊN HỌC MỘT HAY NHIỀU NGÔN NGỮ => học chữ T

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.
REPORT THIS AD

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 stacklexical 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:

LÀM THẾ NÀO ĐỂ TRỞ THÀNH WEB DEVELOPER – PHẦN 2

Ở phần trước, mình đã chia sẻ đôi điều về vị trí Web Developer, những hướng phát triển chung cũng như lộ trình học mà các bạn nên làm theo.
Ở phần này, chúng ta sẽ đi sâu hơn vào những kiến thức từ cơ bản đến nâng cao mà các bạn cần phải biết và trau dồi nhé!
Những kiến thức mình nêu ra trong bài được chia làm 2 phần là cơ bản  nâng cao:
  • Cơ bản là những kiến thức bạn cần có để có thể làm được việc ở những vị trí nhập môn như fresher, junior. Những kiến thức này không nhiều và không khó, bạn có thể tự học trong 1-6 tháng (xem nguồn cuối bài)
  • Nâng cao là những kiến thức bạn nên có để phát triển lên các vị trí cao hơn như senior, software architecture… Những kiến thức này khá rộng và nhiều, khó tự học. Bạn phải học bằng cách đọc nhiều sách, học nhiều, sau đó thử áp dụng và trải nghiệm chúng trong dự án thực tế.
  • Những kiến thức về framework, công nghệ rất dễ thay đổi, mau hết hạn. Nắm vững kiến thức nền sẽ khiến bạn học framework/công nghệ dễ hơn. Ngoài ra, nếu tập trung học chuyên sâu một công nghệ, bạn sẽ trải nghiệm được nhiều kiến thức rất hay và lạ.

Kiến thức mảng Front-end

Cơ bản
REPORT THIS AD

Tuy nhiên, để dễ xin việc, bạn nên lận lưng cho mình một số kiến thức về:
  • Một số library/framework JS nào đó như jQuery, AngularJS, ReactJS
  • Một framework CSS, hiện Bootstrap đang là framework nổi tiếng nhất
  • Kĩ năng cắt PSD và chuyển thành HTML/CSS
HTML/CSS/JS là bộ ba mà front-end developer nào cũng phải biết
Nâng cao
  • ES6, Design Pattern,
  • Mô hình MVC và MVVM
  • Asynchronous Code (callbackpromise, async/await)
  • Unit Test (Jasmine, Mocha, Karma, Jest)
  • Code Performance
  • JS Framework: VueJS, ReactJS, AngularJS. Tới tầm này thì việc học một ngôn ngữ mới là chuyện không hề khó!
Chuyên sâu CSS
  • Module và Naming convention: SMACSS, BEM
  • Animation, Border, Shadow
  • Layout: Flexbox, CSS Grid
  • CSS Preprocessor như Styllus LESS, SASS
  • CSS Framework: Foundation, Bootstrap, Materialize, SemanticUI….
NodeJS được dùng để viết code ở phía back-end. Tuy nhiên, những công cụ front-end hiện tại đều sử dụng NodeJS và npm để build, minify, bundle.
Do đó bạn cần biết thêm về npm và các tool liên quan:
  • NodeJS và npm
  • Cấu trúc project, chia code thành module
  • Webpack/Gulp/Grunt
  • Babel
  • ESLint
Hiện tại, các công cụ của front-end dev đều dựa trên NodeJS
Bonus thêm
  • Responsive Design
  • Design cơ bản tới nâng cao
  • Biết UI/UX cơ bản để có thể làm việc với designer, tạo ra trải nghiệm tốt nhất cho người dùng

Back-end

Cơ bản
  • Cấu hình server và deploy: Tomcat, Nginx, ISS, Apache
  • Mô hình MVC & RestAPI
  • Database Query và Design (SQL Database)
  • Thuật toán: BigO, Stack, Queue, Hash Table, Tree
  • Clean Code
  • CMS (WordPress, Joomla, …) cho các bạn PHP
Để đi phỏng vấn và xin việc, bạn cũng chỉ cần thành thạo 1 ngôn ngữ và có kinh nghiệm sơ với một framework.
Một lưu ý nhẹ là đôi khi back-end developer cũng phải biết chút xíu về HTML, CSS để làm công việc của front-end nhé.
Nâng cao
Học ngôn ngữ back-end gì?
Khác với front-end, chỉ có HTML/CSS/JS, bạn có thể chọn một trong nhiều ngôn ngữ để viết back-end như C#, Java, PHP, Python,…
Theo kinh nghiệm tìm việc và số liệu từ các trang tuyển dụng, ba ngôn ngữ back-end có số lượng tuyển dụng lớn nhất hiện tại là: Java, C# và PHP. Các ngôn ngữ như Python, Ruby có lượng job ít hơn, lương thì nhỉn hơn đôi chút vì khó tìm lập trình viên hơn.
Đa phần các ngôn ngữ đều tương tự nhau. Để thành thạo một ngôn ngữ là chuyện khá mất thời gian, nhưng để có thể làm việc được với một ngôn ngữ, bạn chỉ cần nắm những điều sau:
  • Syntax của ngôn ngữ
  • Các API và thư viện cơ bản
  • Package Manager
  • Một hai Framework phổ biến
  • Unit Test Framework

Đôi lời về Full-stack Developer

Như mình đã nói ở bài trước Full-stack Developer là những con người đa năng, hai tay hai súng, có khả năng chơi luôn cả 2 từ front-end tới back-end. Đôi khi họ còn kiêm luôn cả vị trí System Design và DevOps.
Lương của Full-stack thường nhỉnh hơn Front-End và Back-end một chút vì họ phải nắm nhiều trọng trách hơn. Điều này không có nghĩa là Full-stack giỏi hơn Front-end hay back-end. Full-stack có kiến thức rộng hơn, còn front-back có kiến thức sâu hơn, không cái nào giỏi hơn cái nào!
Nhiều bạn mới học lập trình hay đặt mục tiêu là trở thành full-stack developer. Theo mình, trở thành full-stack thật sự rất khó, kiến thức phải rộng, và phải thường xuyên cập nhật nhiều thứ.
Do đó, các bạn mới học đừng nên đặt mục tiêu là trở thành full-stack. Bản thân mình từng làm back-end trước, sau đó mới dần dần tìm hiểu về front-end DevOps, Cloud.
Full-stack không có nghĩa là giỏi hơn front-end hay back-end

Học ở đâu, học thế nào?

Theo kinh nghiệm của mình, cách tốt nhất để học công nghệ nói chung là:
  • Nhập môn: Học theo kiểu interactive, vào codeacademyfreecodecamp để code trực tiếp theo hướng dẫn, vừa code vừa học. Cách này rất vui, dễ nhớ lại không gây nhàm chán.
  • Nhập môn: Học môn số khoá nhập môn trên itclass, pluralsight… và một số trang khác. Do có video nên các bạn có thể nghe giảng và làm theo, khá dễ học. Tuy nhiên nhiều khoá học khá dài nên dễ gây buồn ngủ.
  • Nâng cao: Kiếm sách công nghệ về đọc và code theo. Cá nhân mình hay dùng cách này. Cách này hơi mệt, dễ buồn ngủ. Tuy nhiên, trong sách có những kiến thức hệ thống, kiến thức chuyên sâu mà bạn sẽ không tìm được trên web hay video.
  • Nâng cao: Cái quan trọng nhất là học xong phải làm. Hãy dùng kiến thức bạn đã học để code một project đơn giản. Khi làm, gặp sự cố, hãy Google tìm cách giải quyết, bạn sẽ mò ra được nhiều thứ hay ho lắm đấy.
Có rất nhiều cách để học lập trình web: web, ebook, video, điển hình như w3schools

Vài lời khuyên cuối

Bài viết cũng dài rồi nên xin tổng kết bằng đôi lời khuyên cho các bạn:
  • Khi không biết nên học gì, hãy đọc… quảng cáo tuyển dụng
  • Học chuyên sâu, học cho vững kiến thức nền chứ đừng vội học framework hay công nghệ
  • Học kiểu chữ T: Biết rộng và chuyên sâu một thứ
  • Không ngại tự học, đừng gắn chặt mình với một ngôn ngữ hay công nghệ. Bạn code được C# thì cũng học được Java, học được PHP để mà code
  • Học hỏi không ngừng trên pluralsight, medium, quora
  • Tìm hiểu sơ về DevOp: Docker, CI, CD
  • Tìm hiểu sơ về Cloud: Azure, AWS
Hi vọng hai phần của bài viết sẽ giúp ích cho các bạn trên con đường bắt đầu trở thành web developer. Nếu có thắc mắc gì, các bạn cứ thoải mái hỏi trong phần comment nhé!

Bonus

Các bạn có thể xem clip livestream của mình và Codeaholicguy, hoặc xem slide tổng kết trong phía dưới nhé.

LÀM THẾ NÀO ĐỂ TRỞ THÀNH WEB DEVELOPER – PHẦN 1

Bạn có muốn biết cách tự học để trở thành web developer?
Bạn có muốn biết những kiến thức cần có, những điều cần học?
Bạn muốn biết thêm về công việc và lương của web developer?
Hãy đọc thật kĩ series 2 phần này nhé! Series sẽ chia sẻ về vị trí web developerlộ trình học tập, cùng với những kiến thức bạn cần có để trở thành một web developer thực thụ.

Web Developer làm gì? Dễ xin việc không? Lương cao hay thấp?

Web Developer tức là lập trình viên Web, công việc của Web developer đương nhiên là … lập trình ra ứng dụng Web.
Thời đại của Web đã bắt đầu từ rất lâu, kéo dài đến nay đã được vài chục năm. Mặc dù hiện tại là thời đại smartphone, web vẫn có một chỗ đứng nhất định bên cạnh mobile app. Dễ thấy là các hệ thống từ lớn (Facebook, Google, Youtube) đến nhỏ (web doanh nghiệp, shop online) đều nằm trên nền Web.
Bà Tám bán xôi cần web bán xôi, bé M bán kem trộn cần web bán kem trộn, công ty BKAV sản xuất thịt chó cần hệ thống quản lý thịt chó xuyên lục địa. Lẽ đương nhiên, nhu cầu làm web cao thì số lượng công việc cho web developer cũng rất nhiều.
Nhu cầu tuyển dụng Web Developer khá nhiều, lương không hề thấp!
Dạo sơ một số trang như TopIT, có thể thấy có đến hơn 300 job cho Web Developer. Mức lương dĩ nhiên cũng không hề tệ, từ 500$ tới 2000$ tuỳ theo trình độ và kinh nghiệm của bạn.
REPORT THIS AD

Đọc đến đây, các bạn đã hào hứng muốn tìm hiểu thêm về vị trí Web Developer chưa nào? Hãy đọc tiếp để xem ngành này có những hướng phát triển nào, cần đầu tư vào những kĩ năng gì nhé!

Front-end, Back-end hay Full-stack?

Số lượng Web Developer trên thị trường không hề ít, chất lượng thì thượng vàng hạ cám, vàng thau lẫn lộn. Hiện tại, nếu muốn làm web developer, bạn có thể chọn 1 trong 3 hướng để phát triển:
  • Front-end: Front-end là những gì người dùng nhìn thấy và tương tác. Nó là “mặt tiền” của một trang web. Nếu bạn thích thiết kế, muốn gần gũi với người dùng thì bạn có thể đặt mục tiêu trở thành một front-end developer.
  • Back-end: Back-end là những thứ người dùng không nhìn thấy, nhưng giúp cho hệ thống hoạt động trơn tru. Dữ liệu của người dùng, thuật toán phân tích … đều nằm ở back-end. Nếu front-end là lớp sơn, lớp vỏ của một ngôi nhà thì back-end chính là giàn giáo, xương sườn của ngôi nhà đó. Công việc này phù hợp với những bạn thích suy nghĩ logic, thích làm việc với hệ thống và cơ sở dữ liệu.
  • Full-stack: Full-stack Developer là những con người đa năng, hai tay hai súng, có khả năng chơi luôn cả 2 từ front-end tới back-end. Đôi khi họ còn kiêm luôn cả vị trí System Design và DevOps. Trách nhiệm cao, kiến thức cần nắm nhiều nên lương của họ cũng nhỉnh hơn các vị trí khác đôi chút. 
Các bạn có thể xem lại về front-end và back-end trong bài viết “Kĩ năng cần có của web developer” nhé!

Lộ trình học tập để trở thành web developer

Một tin vui cho bạn là: Để trở thành Web Developer không hề khó, nếu kiên trì thì ai cũng học được. Bạn có thể bắt đầu từ con số 0, hoặc với chút ít kiến thức căn bản về lập trình.
REPORT THIS AD

Đây là một lộ trình học tập khá đơn giản, các bạn có thể tham khảo để làm theo:
  1. Học kiến thức nền về Web và Networking
  2. Học cơ bản về cả back-end lẫn front-end (học mới biết cái nào hợp với bạn)
  3. Chọn một hướng phát triển mà bạn thấy hứng thú
  4. Học một hai framework front-end hoặc back-end thông dụng
  5. Tạo ra sản phẩm nho nhỏ bằng cách áp dụng kiến thức đã học
  6. Đi phỏng vấn để xin thực tập và đi làm
  7. Vừa làm vừa học tiếp những kiến thức nâng cao
  8. Áp dụng kiến thức nâng cao vào công việc
  9. Tuỳ vào cơ duyên và khả năng học tập, có thể bạn sẽ thành phun tắc developer
  10. Làm lâu, nhiều kinh nghiệm, lên lương lên chức
Phía trên là lộ trình khá đơn giản mà các bạn có thể làm theo
Những kiến thức này đa phần đều có trên mạng, nên các bạn có thể dễ dàng tự học và không cần học đại học hoặc ra trung tâm. Bạn có thể lên freecodecamp, hoặc vào các trường dạy code miễn phí để học.

Kiến thức nền mà mỗi Web Developer phải có

Đây là những kiến thức nền mà bất kì Web Developer nào cũng phải biết, cho dù bạn có phát triển theo hướng nào đi nữa.
  • Source Control: Git/TFS/SVN
  • AJAX / Web API
  • RESTful API / HTTP method
  • Cơ bản về Networking
  • Clean Code, viết code tách bạch rõ ràng
  • Thuật toán và cấu trúc dữ liệu
Muốn biết mình nắm rõ cơ bản về web và networking hay chưa, bạn hãy thử trả lời câu hỏi sau: Điều gì xảy ra khi ta gõ địa chỉ web vào thanh trình duyệt và bấm Enter?
Đây là một câu hỏi thường hay gặp khi bạn đi phỏng vấn vị trí Web Developer. Tuỳ vào câu trả lời, người ta sẽ đánh giá được kiến thức cơ bản và chuyên sâu của ứng viên.
Các bạn tự tìm hiểu rồi trả lời nhé, mình không có đáp án mẫu đâu 😉

Tạm kết

Ở bài này, mình đa chia sẻ về lương lậu và công việc của vị trí web developercác hướng phát triển cũng như những kiến thức nền cần phải nắm.


 phần sau, mình sẽ nói chuyên sâu hơn về những kĩ năng mà bạn cần trau dồi để khi đi theo hướng front-end hay back-end; kĩ năng cần có để đi phỏng vấn, xin việc; cùng với đôi lời khuyên để phát triển bản thân trên con đường làm Web Developer. Các bạn nhớ đón xem nhé!