Kinh Nghiệm Học Coding Dành Cho Dân Trái Ngành

5370
Tác giả: Mai Trần
Dành cho những bạn không phải dân IT nhưng vì dòng đời xô đẩy mà đâm đầu vào con đường coding.

Điểm bắt đầu

Hãy tìm lấy cho mình một động cơ, vì sao bạn muốn học coding? Tớ muốn học từ rất lâu rồi, lúc đầu chỉ cho vui, nhưng khi nhìn thấy khối kiến thức khổng lồ thì hoảng và bỏ cuộc luôn sau tutorial video đầu tiên. Tớ chỉ bắt đầu học coding nghiêm túc sau khi nhập học chương trình Thạc sĩ Data Science ở Đức, trước đó tớ học Cử nhân Kinh tế Đối Ngoại ở FTU Hà Nội và Thạc sĩ Economics & Institutions ở Uni Marburg. Lúc bắt đầu, kiến thức về coding của tớ đúng là con số Không tròn trĩnh, tới mức còn không biết gì về “data types/variable types” các kiểu. Khi đó, tớ mới chỉ tiếp xúc với phần mềm thống kê Stata và viết các câu lệnh theo kiểu mẫu có sẵn, với syntax siêu đơn giản.

Hành trình

Có động cơ rồi thì bạn phải tìm cách thu xếp thời gian và lên kế hoạch, thậm chí chiến thuật cho hành trình của mình. Mục tiêu của bạn là gì? Bạn muốn hoàn thành mục tiêu trong bao lâu? Cái thuận lợi của tớ (hay là bất lợi không biết nữa) là vì bài tập trên trường cứ chất đống lên nên phải nhảy bổ vào học ngấu nghiến để giải quyết vấn đề, không có thời gian mà trăn trở học như thế nào. Các môn học trong chương trình Data Science được dạy bởi Khoa Toán và Khoa CNTT của trường. Và điều đó có nghĩa là bọn tớ “được” ưu ái học các môn Toán với dân Thạc sĩ Toán và học các môn CNTT với dân Thạc sĩ CNTT. Với nhiều bạn thì điều đó không thành vấn đề vì vốn các bạn đã là dân Toán/IT, thậm chí đi làm dev dăm năm rồi, chỉ có một phần nhỏ là dân trái ngành như tớ, bao gồm Kinh tế, Tài chính, Tâm Lý học, Kĩ thuật điện,… Do lúc đó em bé nhà tớ mới được năm tháng, nên tớ quyết định học hết các môn Toán trước (vì vốn cấp Ba học chuyên Toán nên tớ mới bắt đầu như vậy cho dễ), rồi mới chuyển sang các môn IT.
Vì khoa Toán chủ yếu dùng R nên tớ bắt đầu viết thuật toán với R, rồi mới tới Python, Java, mấy ngôn ngữ command line của Linux như bash, awk các kiểu, rồi thêm pyspark lúc học môn Big Data Analytics. Bên cạnh lập trình, thuật toán, tớ còn được học thêm khá kĩ về phần database, cả relational với ngôn ngữ truy vấn SQL lẫn non-relational database với các ngôn ngữ truy vấn kiểu NoSQL. Dĩ nhiên là trình độ coding của tớ tới giờ vẫn còn gà lắm, nhưng so với ngày mới lò dò bước vào lớp “Java for dummies” thì tớ đã vỡ lẽ ra kha khá rồi nên thôi thì cứ viết tổng hợp kinh nghiệm lại, biết đâu có ai đó cần.

Kinh nghiệm

Ngày trước, khi còn ở Việt Nam, tớ từng hỏi một bạn đi du học Pháp rằng liệu bạn có áp dụng được kiến thức đã học vào công việc không. Bạn ấy nói một câu mà tớ nhớ mãi, đó là việc đi học không phải để học hết các kiến thức mình cần, mà là để học được “cách học”. Quả đúng như thế, nhất là khi công nghệ thay đổi không ngừng thì kiến thức nhà trường dạy rất nhanh trở nên lạc hậu. Không quan trọng việc chúng ta đã học được bao nhiêu ngôn ngữ, mà quan trọng là chúng ta phải tìm ra cách học phù hợp với mình, hiệu quả với công việc mình đang làm!
Việc học coding nhìn chung cần sự kiên nhẫn, ham học hỏi, tư duy logic, cẩn thận. Biết tiếng Anh là một lợi thế. Tớ tạm chia việc học một ngôn ngữ ra làm ba chặng như sau:

1. Khởi động:

Trình độ cơ bản thì bắt đầu với syntax chung, data types, operators, conditions, loops là ổn, có thể viết được đủ thứ để chạy chương trình được rồi. Đây là phần khung xương, hơi nhàm chán nhưng cực kì quan trọng, có thể xem như khi bạn học ngữ pháp của một ngôn ngữ mới vậy đó. Lúc này, bạn sẽ được học sâu hơn về tầm quan trọng của từng dấu chấm phẩy, lùi dòng, ngoặc đơn, ngoặc kép, viết comment như thế nào. Hồi mới học Java, tớ viết vài dòng là hỏng lên hỏng xuống, đôi lúc chỉ vì mở mà quên đóng ngoặc hoặc đóng ngoặc sai chỗ ấy (dễ xảy ra khi copy code từ đâu đó về rồi tự xào nấu lại). Lúc debug đọc log mà đến phát khóc vì chả hiểu nó nói lỗi ở đâu. R và Python thì ít khi dùng tới các dấu ngoặc hơn, nhưng phải tuân thủ lùi dòng. Đối với dân Data Science nói riêng thì hai ngôn ngữ này có đủ thư viện cho thống kê, mô hình, đồ thị các kiểu nên ít khi tớ phải tự viết packages mới, hay thậm chí là tạo class mới như khi sử dụng Java. Tớ đã học trình độ cơ bản trên những trang sau:
https://www.tutorialspoint.com: trang này có giải thích đơn giản, ngắn gọn, có nhiều ví dụ với hướng dẫn chi tiết, lại chia làm các phần nhỏ, có từ basic tới advanced nên dễ chia dễ trị. Các bài học cũng được sắp xếp theo thứ tự hợp lý. Sau đó, tùy vào nhu cầu mà bạn học lên hướng advanced cho phù hợp.
https://Coding: trang này là cứu cánh của cuộc đời tớ hồi mới học Java. Trên đó có những đề bài nhỏ với mục đích giúp chúng ta luyện tư duy lập trình. Chẳng hạn, đây là một đề bài ngắn dành cho Java mang tính khởi động.
Hồi đó, tớ thường dùng tư duy toán để giải quyết vấn đề. Thêm một ví dụ nữa, đề bài dưới đây bảo tính tổng các số liên tiếp tới n thì tớ nghĩ ngay tới việc tính n(n+1)/2 và không tài nào hiểu nổi sao lại phải dùng “for loop” làm gì. Dĩ nhiên tư duy toán của tớ không sai, nhưng sẽ không dùng cách đó để tính tổng cho một dãy số bất kì không cách đều nhau, bởi vậy, cách tư duy lập trình là dùng cách tính increment để tổng quát hóa bài toán lên. Rất buồn cười là tư duy toán cũng khiến tớ ngứa cả mắt khi nhìn “đẳng thức” increment sum = sum + num (hình dưới). Mãi tới khi giải rất nhiều đề bài trên codingbat thì tớ mới quen được với một kiểu tư duy giải quyết vấn đề mới. Nhờ thế mà tớ đã bắt đầu hình thành phản xạ trong giải quyết các bài toán nhỏ.
https://www.geeksforgeeks.org/python-programming-examples/: tớ cũng hay đọc trên trang này, nhưng chưa luyện bài tập trên đó bao giờ. Ở đây có thêm nhiều ví dụ, chương trình nhỏ để bạn luyện cách viết code cũng như tư duy. Còn nhiều trang khác gợi ý những đề bài, dự án nhỏ với cả đáp án mẫu cho chúng ta lắm, google là ra thôi.
Bên cạnh những trang trên thì tớ hay tận dụng 10-15 phút mỗi ngày để học thêm trên app điện thoại SoloLearn. Tớ học toàn bộ lý thuyết python trên bản miễn phí này, và thi thoảng vào đấu challenges cho vui, vừa để khỏi quên kiến thức.
  Tail Call Optimization là gì? Và tại sao bạn không cần quan tâm đến nó?

2. Vượt chướng ngại vật và tăng tốc:

Đây chắc là lúc bạn thấy ngán, vì nhiều thứ phải học quá và nhìn lên đỉnh núi thấy cao vời vợi. Bạn thấy mình cứ quên trước quên sau, thậm chí lẫn lộn nếu như học vài ngôn ngữ một lúc và lúng túng khi gặp vấn đề mới. Không sao đâu, đây là chuyện bình thường. Cũng giống như khi học ngoại ngữ, bạn không cần biết hết mọi từ vựng để có thể sử dụng được, mà cần tới đâu thì dùng tới đấy. Đây là lúc bạn nên chọn một hướng để học lên advanced. Nếu như công việc đòi hỏi bạn làm gì thì bạn đi theo hướng đó. Như tớ chẳng hạn, phần lớn thời gian tớ viết data pipeline, data modelling với pyspark, khi cần giải quyết vấn đề gì mới trong pipelining thì tớ google và gần như lúc nào cũng tìm thấy đáp án trên các diễn đàn như https://stackoverflow.com/. tớ hay đọc cách mọi người giải quyết vấn đề trên này, theo nhiều hướng khác nhau và quay trở lại đọc thêm trong documentation cũng như các ví dụ khác để học cách sử dụng một cách linh hoạt. Lại phải nói thêm là không phải lúc nào documentation cũng dễ hiểu, bạn nhất định phải nắm chắc các khái niệm cơ bản ở bước 1 để đọc hiểu documentation của ngôn ngữ hay từng package dễ dàng hơn.
Sau này, công việc đòi hỏi tớ phải thiết kế web app, vì vậy tớ tự đọc sách thêm về html, css và javascript. Vốn html và css không phải ngôn ngữ lập trình nên nó lại đòi hỏi kiểu tư duy khác. Tớ hay đọc sách, bạn thích thì có thể coi tutorials trên youtube. Khi nắm được khái niệm mấu chốt rồi thì tớ cứ dựa vào documentation mà làm thôi.

3. Về đích:

chắc chẳng có lúc nào được gọi là về đích cả. Học ngôn ngữ nào cũng thế, học cho chắc, cho thành thạo một ngôn ngữ còn hơn là biết mỗi thứ một tí mà chẳng có tư duy giải quyết vấn đề gì cả. Hồi mới học java trên trường thì thầy dạy cả các khái niệm về object-oriented, rồi lên luôn advanced mà không để ý gì tới bọn beginner như tớ. Khi đó tớ thấy khá là chơi vơi vì đọc phần giải thích trừu tượng mấy lần vẫn chả hiểu gì. Mãi tới khi tớ lấy hết sức can đảm thú thật với thầy rẳng em chẳng hiểu gì hết thì thầy mới tổ chức thêm lớp phụ đạo Java for dummies ngoài giờ. Ấy là lần đầu tiên tớ được chứng kiến tận mắt tư duy lập trình là như thế nào. Thầy ra đề bài viết trò chơi Tic Tac Toe (giống kiểu chơi cờ ca-rô). Sau đó, thầy bắt đầu đặt các câu hỏi nhỏ để bọn tớ phát triển ý tưởng: lấy gì làm bàn cờ, làm sao biết được ai đánh dấu ở đâu, các đối thủ luân phiên chơi như thế nào, trò chơi kết thúc khi nào, và xắn tay áo lên viết từng class mẫu cho bọn tớ. Lúc đó tớ mới hiểu ra sức mạnh của object-orientation và về nhà viết một mạch hết trò chơi ấy. Đến hôm thứ ba, tớ đã có thể tự viết code cho một trò chơi khác (Connect Four) và thầy rất hào hứng bảo tớ phải gửi package đấy lên diễn đàn của lớp (nhưng chắc chả ma nào thèm xem). Đến đây, tớ chỉ muốn nói rằng, dù không có cái đích nào nhưng chúng ta tạm có thể coi như đã về đích khi ta hiểu được những khái niệm trụ cột của một ngôn ngữ, hình thành được tư duy coding, phản xạ khi đối diện với những đề bài cơ bản, và có thể tự học lên mức advanced bằng cách đọc hiểu documentation cũng như các ví dụ cụ thể. À, một lần sếp trên cơ quan gọi pizza về rồi cả nhóm bọn tớ mỗi đứa cầm một miếng bánh pizza ngồi châu đầu bên máy tính của sếp cùng debug, ấy là lúc tớ cảm thấy mình trở thành dân geek thực sự rồi đấy!
Tóm lại, tớ thấy học ngôn ngữ lập trình cũng như học ngoại ngữ ấy, phải sử dụng thì mới ngấm, mới khiến nó thành của mình được, còn cứ ngồi ngâm cứu mấy chương sách, hay bao nhiêu tutorials mà không tự viết chương trình nào, không đâm đầu vào bao nhiêu bugs rồi hí hoáy debug thì khó ngấm vào người lắm. Thôi, bạn còn chờ gì nữa mà không xắn tay áo nhảy vào luôn đi. Have fun coding!
Bài viết gốc được đăng tải tại Blog Mai knows
Có thể bạn quan tâm: