Học Code như thế nào cho tốt?

Học Code như thế nào cho tốt?

Giới thiệu 

Xin tự giới thiệu mình là một lập trình viên có hơn 15 kinh nghiệm lập trình và 10 năm kinh nghiệm phát triển phần mềm. Thời cấp 3 và đại học, mình cũng từng có giải quốc gia và ACM/ICPC. Khi đi làm, đã trải qua các vị trí, từ lập trình viên, cho tới team lead, rồi kĩ sư giải pháp, kinh qua các sản phẩm phần mềm từ nhúng tới web, từ desktop tới mobile. Nói vậy ko phải để khoe, nói vậy chỉ để anh em có thêm niềm tin vào những kinh nghiệm mà mình muốn chia sẻ hôm nay. Bổ sung thông tin của mình ở đây Chàng Cuder đi yêu lập trình

Các quan điểm dưới đây là mang tính cá nhân và chủ quan, có thể hợp có thể ko hợp với bạn hoàn toàn, nhưng mình nghĩ ít nhất có vài phần đúng

Một số Đặc điểm nghề IT và lập trình

  • Về thị trường, mình dự đoán ngành IT vẫn phát triển mạnh, ít nhất là trong 5 tới 10 năm nữa. Hiện tại, theo 1 số báo cáo mà bạn dễ dàng tìm trên mạng, thì vẫn thiếu khoảng 500 000 nhân sự CNTT cho tới năm 2025. Đặc biệt, nhân sự CNTT cao cấp, nhiều năm kinh nghiệm thì mình thấy Việt Nam vẫn thiếu khá nhiều. Do ngành CNTT của nước mình vẫn còn non trẻ, số lượng người làm trong nghề chưa đủ lâu và nhiều, nên mình vẫn chủ yếu làm các thứ nhỏ, dễ. Chắc chắn rất ít thậm chí là không có những dự án lớn tầm vĩ mô và đông người dùng như #GG, #FB hay #windows
  • Về thu nhập, nghề IT có mặt bằng lương trung bình so vs các ngành nghề khác thì là cao. Tuy nhiên tuổi nghề thì khá ngắn. Ở Việt Nam, mấy bạn lập trình tới 30 - 40 tuổi đã muốn bỏ nghề, lí do là không nghĩ được nữa. Vấn đề này sẽ thảo luận ở 1 chỗ khác, nhưng nhìn chung là tuổi nghề ngắn hơn bình thường
  • Tính đa quốc gia, làm nghề IT và đặc biệt là lập trình thì có cơ hội làm đa quốc gia, xuyên lục địa là khá lớn. Kể cả ko đi nước ngoài, thì việc bạn làm từ xa trao đổi vs Tây qua internet cũng là khá lớn. Điều đó đồng nghĩa với việc, bạn cần phát triển về ngôn ngữ cũng như hiêu thêm văn hoá của các quốc gia khác (nếu bạn có cơ hội làm việc cùng họ)
  • Thay đổi chóng vánh, Một đặc điểm quan trọng đó là ngành CNTT thay đổi chóng cả mặt. Bạn ngừng cập nhật CNTT một thời gian thì trở thành người tối cổ rồi. Có những công nghệ, nền tảng, ngày hôm nay khi bạn nói chuyện, nó đang là số 1, là thế. Ngay ngày mai, đã có những công nghệ nền tảng khác tối tân hơn thời mình đi học chưa có ví dụ như #cloud. Mobile lúc đó vẫn là những cục gạch có sẵn game rắn săn mồi và chưa có khái niệm #facebook. Vậy mà bây giờ FB có cả tỷ người dùng, game trên điện thoại thì đẹp như laptop. Đấy, vậy là biết CNTT thay đổi nhanh cỡ nào rồi nhé.

Phẩm chất quan trọng để học code và nguyên tắc cần nhớ

Do một số đặc điểm về nghề bên trên, mình nghĩ 4 tính cách sau là quan trọng nhất:

  1. Kiên nhẫn: Kiên nhẫn là số 1. Nếu ko bền bỉ, đủ độ gan lì, thì khi code gặp bug bạn sẽ bị nó tát 1 phát chết luôn. Mình từng ngồi lỳ 8 tiếng để tìm ra đc lỗi sai trong 1 chương trình có vài nghìn dòng lệnh hoặc có lúc mất 1 tuần lễ để tìm ra 1 lỗ hổng trong phiên bản driver cài trên Linux. Nếu ko đủ kiên nhẫn, bạn cũng ko đủ năng lực để học thêm các kiến thức mới lạ và thay đổi từng ngày đâu.
  2. Ham học: Do CNTT thay đổi liên tục nên để trở thành 1 coder giỏi, yêu cầu tiếp theo là bạn cần ham học. bạn vừa học xong kiến thức mà bạn cho là cần, thì lại có 1 mớ kiến thức mới tiếp theo.
  3. Tự học: Tài liệu CNTT và lập trình muốn ngon thì chỉ có trên mạng và đa phần là tiếng Anh. Khi nó trở thành xu thế ở Việt Nam, thì ở nước ngoài đã là lạc hậu. Vậy nên bạn nên tự học nó thông qua internet, sẽ đc tiếp cận kiến thức, xu thế mới và đầy đủ
  4. Cẩn thận: Coder thì nhiều ông code rất ẩu. Code xong để mặc thằng test. Những ông thi ACM thì đa phần cẩn thận, vì sai 1 TC thì đi tong cả bài. Nhưng Dev mà mình quen thì khá nhiều người làm rất ẩu, dẫn tới có khá nhiều bug vớ vẩn trong khi tích hợp. CodeLearn Learning ra đời yêu cầu các bạn làm hết testcase mới được điểm, chính là rèn bạn đức tính trên.

4 nguyên tắc nằm lòng:

  1. Thực hành quan trọng hơn lý thuyết
  2. Dự án quan trọng hơn đoạn mã: sau khi code những đoạn mã nhỏ, bạn nên chú trọng vào việc tạo ra 1 sản phẩm, module hoàn chỉnh.
  3. Đồng đội quan trọng hơn một mình.
  4. Một ngôn ngữ quan trọng hơn nhiều ngôn ngữ: không có ý nói nhiều ngôn ngữ là không tốt, nhưng ở thời điểm đầu tiên (dưới 3 năm kinh nghiệm và trừ khi bạn làm Dev fullstack) thì bạn nên học và hiểu sâu 1 ngôn ngữ.

Làm thế nào để học Code tốt?

  1. Code hàng ngày: bài tập, dự án. Cá nhân mình kể cả hiện tại, ngày nào cũng vào phần luyện tập ở CodeLearn làm ít nhất 2 bài, và nếu có thêm thời gian thì code thêm một phần nào đó cho dự án CodeLearn (chứ ko phải toàn đi chém gió đâu)
  2. Tự gỡ lỗi: nhiều bạn gặp lỗi 5 phút là bỏ cuộc và hỏi toán loạn. Khuyên bạn nên tự debug (bằng text hoặc bằng trình gỡ lỗi), bạn sẽ học được cực nhiều từ việc này
  3. Chạy code mẫu và hiểu từng dòng: nhiều khi bạn copy cả đoạn code mẫu mà ko hiểu đc nội dung của từng đoạn nhỏ hay từng dòng. Khuyên bạn nên đọc hiểu, và xoá thử từng dòng để xem code thay đổi ra sao (nếu ko hiểu)
  4. Code lại các sản phẩm: chọn 1 số sản phẩm, dự án mà bạn thích rồi làm lại nó. Đừng có mải mê với những đoạn code nho nhỏ không quá 100 dòng nữa

    Hãy thử làm lại những game cơ bản như dò mìn, pikachu, sudoku, hãy làm thử những website có đầy đủ đăng nhập, xử lý dữ liệu và bán hàng như các trang thương mại điện tử, hay làm những ứng dụng trên windows đơn giản như notepad thử xem.

    Thời đại học, năm 2 mình hoàn thiện game rắn săn mồi hoàn toàn bằng C++ (dù nó xấu dễ sợ, mình code mất 1 tuần). Tới năm 4, nhóm mình được thầy yêu cầu code lại các product như: notepad, file explore (quản lý file) và game cờ vua 
  5. Đọc sách lập trình: Sách là tinh hoa, đứng trên vai người khổng lồ, nhìn sẽ đúng hướng và đi xa hơn.
  6. Tăng cường thảo luận:Tìm hiểu và thảo luận trên các diễn đàn, hỏi đáp thắc mắc những thứ mà bạn ko thể tìm thấy trong sách hay mãi mà ko hiểu
  7. Lựa chọn ngôn ngữ: Tuỳ vào mục tiêu sản phẩm và định hướng nghề nghiệp, hãy chọn cho mình 1 ngôn ngữ phù hợp để phát triển, học hỏi lâu dài. Nếu muốn làm web thì đừng chọn C++. Nếu muốn làm nhúng hay mobile app thì đừng chọn PHP

    Bảng bên dưới là danh sách các ngôn ngữ thông dụng và mục đích phát triển sản phẩm (số liệu 2017), hãy chọn ngôn ngữ phù hợp cho mục đích phát triển sp của bạn (web hay mobile hay embedded?)

Không được bỏ qua thuật toán:

Mình nhận đc nhiều câu hỏi liên quan tới việc có cần học thuật toán hay ko. Nói thật là 1 số job và nghề lập trình, bạn không cần học thuật toán. Nhưng quan điểm cá nhân là nên học bởi:

  1. Học thuật toán để rèn tư duy logic và cách giải quyết vấn đề. Hồi trước mặc dù phần mềm của mình ko dùng thuật toán, nhưng mình vẫn lên các trang code để luyện thuật toán và tư duy. Nó giống như 1 bài luyện tập thể dục cho não, giúp bạn tư duy sáng sủa và mạch lạc
  2. Đối với các bài toán tối ưu và hệ thống lớn thì chắc chắn là cần thuật toán. Nếu bạn làm cái này mà ko có tí thuật toán là khó khăn
  3. Nếu bạn để ý kĩ, các cty nổi tiếng như Amazon hay google khi tuyển dụng luôn có bài tập kiêm tra về cấu trúc dữ liệu và giải thuật. Do đó, thành thạo món này, bạn sẽ có cơ hội làm việc ở công ty nổi tiếng. Các bạn tham khảo bài viết giải thích chi tiết hơn về Thuật toán là gì? Học thuật toán làm quái gì?

Học ở đâu?

  • Website: có nhiều website, nhưng mình nghĩ a e mới học vào https://CodeLearn.io là ngon. Sản phẩm Việt Nam, nội dung phù hợp (quảng cáo tí)
  • Đọ sách
  • Github.com: lên xem các dự án mẫu mà học code, hoặc nếu đóng góp đc code của bạn vào các cái trên đó thì thật tuyệt vời
  • Forums: https://stackoverflow.com/  https://www.quora.com/ là 2 forum lớn, bạn có thể học nhiều từ đây
  • Tham gia công ty, dự án sớm cũng là 1 cách học. Khuyên bạn nên đi thực tập từ năm thứ 3 hoặc thứ 4 (đừng đợi ra trường rồi mới đi làm nhé)

Lộ trình?

Cá nhân mình khi dạy hay kèm cặp các bạn mới học, mình đưa ra lộ trình chung như thế này:

  • Trong 3 tháng đầu tiên chỉ học 1 ngôn ngữ lập trình, cùng với rèn luyện cấu trúc dữ liệu và giải thuật (code hết bằng cái ngôn ngữ lập trình vừa học)
    Nếu làm web, bạn nên học thêm 1 môn là cơ sở dữ liệu. các khoá học cơ bản, bọn mình đều đã có sẵn ở đây. Nếu bắt đầu và theo lập trình lâu dài, mình khuyên bạn chọn Java hoặc C++ dù nó khó hơn Python hay JS. Tuy nhiên, kiến thức về ngôn ngữ bạn sẽ hiểu rõ hơn nhiều
  • Ba tháng tiếp theo, từ 3 môn cơ bản trên, hãy tự chọn và làm lại 1 tới 3 sản phẩm. Sản phẩm này có thể đơn giản, nhưng nó phải là 1 thứ tương đối hoàn thiện giống như sản phẩm ở bên ngoài. Nó có thể là 1 ứng dụng mobile, một website hay 1 ứng dụng máy tính. Cái này giúp ích cho bạn khá nhiều về sau. Ví dụ như đi phỏng vấn, bạn có thể đưa sản phẩm này ra. Làm sản phẩm sẽ giúp bạn rèn luyện cả khả năng thiết kế, tư duy đưa ra yêu cầu và có trải nghiệm của 1 người dùng tốt hơn so với việc làm các bài tập có yêu cầu rõ ràng, có đầu ra đầu vào cụ thể (ng khác thiết kế giúp bạn hết rồi)
  • Ba tháng nữa, hãy cố gắng đi xin và thực tập ở 1 công ty phần mềm. Làm sản phẩm thực tế, sẽ giúp bạn có những trải nghiệm tuyệt vời.
  • Và sau 3 tháng này, lộ trình trên coi như kết thúc. Bạn có thể tự học, tự làm dựa vào những gì bạn đã có, và tiến dần tới con đường Lập trình viên chuyên nghiệp

Tạm kết

Vậy là chỉ với một năm rèn luyện bạn đã có thể định hình và bước đi trên con đường của mình. Và đừng quên chia sẻ kiến thức này cho những người bạn đang và bắt đầu học CNTT nha