Đây là một câu hỏi rất phổ biến cho những ai còn tò mò và đang chập chững tiếp cận với thế giới lập trình nhưng bị chết trôi bởi quá nhiều nguồn tràn lan trên mạng. Vì đồng thời cũng nhận được kha khá những tin nhắn của mọi người hỏi về vấn đề này, mình nghĩ đây là một dịp tốt để chia sẻ những nguồn hữu ích mà bản thân đã dùng để tự học trong khoảng thời gian đầu.

A. Chọn tư duy đúng để tiếp cận

Nếu bạn tình cờ nghe được một trong 2 lời khuyên nghe khá hợp tình hợp lý như sau:
Myth #1: "Em phải đến trường trước cái đã. Bởi muốn làm game thì phải học về toán vi tích phân (Vector Calculus), muốn xây hệ thống thì phải học đại số Boolean (Boolean Algebra), vân vân và mây mây..."
=> Thực tế: học hỏi một kỹ năng mới là cả một quá trình cần động lực rất lớn để tìm hiểu và tiếp thu. Nếu bạn bắt đầu bằng những thứ khô khan như kiến thức sách vở thay vì phấn khích tìm tòi cách giải quyết những vấn đề thú vị bạn gặp phải trong cuộc sống hằng ngày, việc học sẽ rất nhanh trở nên nhàm chán và khiến bạn dễ bị nản. Việc đến trường có thể sẽ trở nên thiết yếu khi bạn thật sự nghiêm túc với việc kiếm sống bằng lập trình, nhưng để bắt đầu thì không nhất thiết phải đợi đến lúc học xong đại học mới dám làm.
Myth #2: "Anh nghĩ tốt nhất là em nên học ngôn ngữ abc vì nó xyz..."
=> Thực tế: đây là một lời khuyên phần lớn mang tính chất thành kiến và sở thích cá nhân. Hãy tưởng tượng những ngôn ngữ lập trình như những dụng cụ xây nhà được thiết kế cho nhiều mục đích khác nhau. Bạn không thể đóng đinh bằng xẻng, cũng như mong đợi ngôn ngữ ưa thích của người khác có thể giải quyết vấn đề của chính mình. Vì ngôn ngữ lập trình là một công cụ, bạn nên quan tâm đến việc "Học ngôn ngữ này sẽ giúp ích được gì cho vấn đề mình đang cố giải quyết?hơn là "Ngôn ngữ nào là tốt nhất để học?". Hãy học cách lắng nghe những người đi trước, nhưng đừng mù quáng làm theo trong khi chưa hiểu rõ mục đích của mình là gì. Ở phần dưới, mình sẽ nói rõ hơn về cách chọn ngôn ngữ lập trình phù hợp.
Ảnh: Google
Ngôn ngữ lập trình cũng giống như ngôn ngữ con người chúng ta vậy. Bạn có thể biết viết tiếng Pháp, nhưng cần biết nhiều hơn thế để trở thành một nhà văn. Tương tự, bạn có thể biết rõ syntax (cú pháp câu lệnh) của một ngôn ngữ lập trình, nhưng cần biết nhiều hơn thế để giải quyết vấn đề bằng ngôn ngữ đó. Một điểm khác biệt lớn với ngôn ngữ con người là sau khi bạn đã thuần thục được ngôn ngữ lập trình đầu tiên, sẽ dễ hơn rất nhiều để học và hiểu những ngôn ngữ thứ 2, 3, 4... vì: 
(1) Đa số syntax giữa những ngôn ngữ lập trình phổ biến thường khá giống nhau
(2) Trong lúc học ngôn ngữ lập trình đầu tiên, bạn có lẽ đã nắm được những khái niệm cơ bản cần thiết và dần quen với cách tư duy logic có hệ thống
*** Phần này được tham khảo từ video cực kỳ hữu ích của Kevin Cheers:


B. Chọn giáo trình phù hợp để áp dụng

Vì mỗi người có một cách học và tiếp cận kiến thức khác nhau, bạn nên tự làm vài phép thử nho nhỏ để xem cách học nào là phù hợp nhất cho bản thân. Có thể bắt đầu bằng những bước phổ biến được tổng hợp lại cho người mới học lập trình sau đây:

1. Xác định hướng đi

Tìm một (vài) vấn đề / project nhỏ mà bạn quan tâm và thôi thúc muốn giải quyết. Nó có thể là một chương trình phần mềm giúp bạn giải toán nhanh hơn, hoặc một trò chơi giúp bạn học tiếng Anh tốt hơn. Ý tưởng nên bắt đầu từ sự hứng thú vì nó sẽ giúp bạn giữ động lực để học lập trình, đồng thời được áp dụng những kiến thức học được vào thực tế.
(Nếu bí ý tưởng quá thì chọn một trò chơi yêu thích của bạn rồi clone lại cũng được nè)

2. Chọn ngôn ngữ lập trình

Tìm hiểu trên Google xem ngôn ngữ lập trình nào là thích hợp nhất cho project của bạn.

Hoặc dùng website dưới đây để giúp bạn định hướng ngôn ngữ lập trình:
***QUAN TRỌNG:
Anh Hoàng Trần trong phần comment đã đóng góp được một vài ý quan trọng mà mình đã thiếu sót bỏ qua ==> đây là giai đoạn bạn có thể tham khảo nhiều hơn ý kiến của người đi trước (một cách có chọn lọc):
Nếu bạn muốn bước vào ngành này và không biết bắt đầu từ đâu thì có thể nhảy vào thử một ngôn ngữ gì đó phổ thông để làm quen với tư duy lập trình, sau đó khi hiểu hơn rồi thì tùy theo mục đích của mình mà chọn ngôn ngữ cho hợp lý. Khi họ đã hiểu được lập trình là gì, chúng ta mới cho họ tiếp xúc và chọn lấy một con 'đường' họ phù hợp. 
Tuy nhiên, nếu lạm dụng việc "làm quen" này quá thì đúng là sẽ dẫn đến việc biết mỗi thứ một ít và không có đủ kiến thức để tự phát triển. Tốt nhất vẫn là giỏi một hoặc vài thứ, những thứ khác biết ở mức vừa và đủ (cần chứ không bắt buộc), vì trong công việc đôi khi cái mình giỏi nhất không phải cái phù hợp nhất để giải quyết vấn đề. Nhưng để biết rằng cái 'này' hay cái 'kia' có phù hợp nhất hay không thì là cần phải học về nó, tìm hiểu về nó trước đã. 
Với người mới thì việc làm quen với tư duy lập trình đã khá là gian nan rồi, vấn đề ở đây là người mới rất dễ bỏ cuộc. Bài toán lớn nhất khi hướng dẫn một người mới không phải là làm thế nào họ có thể đi làm trong vài tháng, bởi cái cần lo chính là họ sẽ bỏ cuộc trong vài ngày, vài tuần.

3. Chọn nguồn

Hãy cố gắng tìm và cố định một nguồn học có chất lượng cao, thân thiện với người mới học và được nhiều người đi trước gợi ý. Rồi sau đó, bạn có thể chia nhỏ từng phần ra thành mục tiêu để đạt được trong một khoảng thời gian nhất định.
Michael0x2a's Github - Tổng hợp rất nhiều nguồn cho nhiều ngôn ngữ lập trình khác nhau
tiago-atha's Github - Tổng hợp một kho sách miễn phí cho lập trình
FreeCodeCamp - Nhiều khoá học tốt có uy tín và hẳn một cộng đồng lớn để luôn hỗ trợ khi bạn cần. Trên đây cũng có khá nhiều số lượng bài viết hướng dẫn cho người mới mà mình thấy rất hữu ích nữa.
CodeAcademy - Giao diện đẹp để học và tương tác với code nhưng tập trung khá nhiều về mảng lý thuyết
Teach Yourself CS - Tổng hợp và gợi ý nguồn sách cho những khái niệm cốt lõi của Computer Science 
Open Source Society University - Tổng hợp nhiều nguồn học trong một giáo trình đại học online mà bạn có thể tự nghiên cứu ở nhà

Bổ sung nguồn từ các Spidernerds đáng yêu:

Berkeley's CS61A & CS61B - 2 khoá Computer Science căn bản đến từ trường đại học nổi tiếng Berkeley. Cả 2 trang web của khoá học được thiết kế rất rõ ràng và dễ theo dõi. (Husky)
GeeksForGeeks - trang này nổi từ đời đầu 2010~2013, trước đây UI không đẹp nhưng mới đây đã nâng cấp phần giao diện trông ổn hơn rất nhiều. Điểm cộng: cách dàn content phân chia level rõ ràng thành Easy --> Medium --> Hard.. (Jesterϕ)  
TutorialPoint - cũng vừa được tút lại giao diện. Một trong các nguồn có lộ trình phân chia rạch ròi vẫn còn tồn tại, và đồng thời đã cải tiến khá nhiều phần Playground để vọc vạch thực hành. (Jesterϕ)
Learn-Anything - sử dụng logic của Alfred Workflow để hiện gợi ý cho từ khoá người dùng nhập. Để ý góc phải của kết quả tìm kiếm có dấu (-) và (+) ==> đó là rate review của người dùng để đánh giá kết quả nguồn sau khi học để người sau cân nhắc hơn đỡ tốn thời gian. (Jesterϕ)

4. Biết nơi để hỏi

Trong quá trình học, bạn nên tích cực tra khảo trên mạng và hỏi những người đi trước trên những cộng đồng lớn.  
Stack OverFlow (bạn không thể sống thiếu trang này đâu, tin mình đi)

5. Tăng kinh nghiệm

Hoàn thành nhiều projects đa dạng về độ khó khác nhau trong cùng một ngôn ngữ lập trình đó. Hoặc bạn có thể tăng khả năng tiếp cận và giải quyết vấn đề với những câu đố hóc búa đòi hỏi óc phân tích.
***Phần này được tham khảo và dịch từ Reddit (khuyến khích nên đọc bản gốc vì nó chi tiết và sâu hơn rất nhiều bài của mình)


3 SAI LẦM NEWBIE THƯỜNG MẮC PHẢI:

1. Thụ động ngồi xem và đọc tài liệu rồi nghĩ bạn hiểu rõ khái niệm/kiến thức rồi. Điều này rất dễ xảy ra khi nhìn một khái niệm trong lập trình có vẻ dễ hiểu trên lý thuyết nhưng thực tế lại rất khó để thành thạo ở ngoài đời. Cách tốt nhất để tránh trường hợp này là bạn nên tích cực làm, làm và làm thật nhiều bài tập được đưa ra và luôn suy nghĩ cách làm cách nào để viết code tốt hơn.
I hear and I forget. I see and I remember. I do and I understand. 
Confucius
2. Liên tục đổi qua nhiều ngôn ngữ lập trình khác nhau trong khi chưa nắm rõ và thành thạo một cái. Bạn phải luôn nhớ, cốt lõi của lập trình là tư duy giải quyết vấn đề chứ không phải ngôn ngữ, và cả quá trình chỉ có thể được hoàn thiện qua hành động và kinh nghiệm theo thời gian. Việc nhảy lung tung qua nhiều ngôn ngữ dù chưa nắm được những khái niệm cơ bản sẽ làm bạn mất thời gian và đôi khi cả hoang mang nữa.
3. Xong một nguồn học rồi thì nghĩ là mình đã học xong mọi thứ và không cần phải học gì nữa. Sai nhé, có người trong ngành này 5-10 năm rồi nhưng vẫn luôn luôn có cái mới để học, nên đừng rơi vào bẫy tự mãn phổ biến này và giữ cái tâm tò mò muốn học hỏi cái mới. Đây là điểm khác biệt lớn giữa một một người lập trình viên tốt và một người lập trình viên tồi.


Kết

Sau 4 tiếng đồng hồ ngồi lọc và gom một lượng lớn những nguồn mà bản thân đã tìm tòi từ 2 năm trước, tác giả tạm thời hết mana để viết một cái kết đàng hoàng. Anh em nào có nguồn hay thì cứ comment, mình sẽ thêm vào sau nhé :)
Scarlet.

P/S. fun fact: hồi nãy đúng ra mình viết hết bài rồi mà mất wifi + lag máy tính -> mất dữ liệu nên phải ngồi hơn 1 tiếng viết lại, lúc đó ngồi đực mặt nhìn màn hình mà chực chờ như muốn khóc. Hầy, khổ thân con bé...


Đọc thêm: