Có nhiều người hỏi mình rằng “Để làm chủ một ngôn ngữ lập trình thì làm thế nào? Làm sao để học tất cả nhanh nhất?”
Trong quá trình học tập và làm việc, mình đã tìm ra một kinh nghiệm để học các ngôn ngữ mới. Mô hình này sẽ xuyên suốt từ khi bắt đầu cho đến khi trở nên thành thạo ngôn ngữ đó.
Điểm mấu chốt ở đây chính là: cách bạn khái niệm hóa (conceptualization) một vấn đề.
Mình hy vọng qua bài viết này sẽ giúp các bạn thay đổi tư duy và áp dụng hiệu quả vào học một ngôn ngữ lập trình mới.
Trong bài viết này, mình sẽ chỉ đề cập các khái niệm tổng quan của ngôn ngữ lập trình. Còn chi tiết hơn về kỹ thuật của từng ngôn ngữ, các bạn có thể tham khảo các bài viết hướng dẫn học lập trình của mình nhé.
Nội dung chính của bài viết
Ngôn ngữ lập trình là gì?
Trước khi bàn tới các khái niệm to tát và xa xôi, mình sẽ quay lại khái niệm cơ bản nhất.
Vậy ngôn ngữ lập trình là gì?
Đúng như tên gọi của nó, ngôn ngữ là phương tiện để giao tiếp giữa hai thực thể. Nếu là giao tiếp giữa con người với con người thì gọi là ngôn ngữ giao tiếp con người. Còn ngôn ngữ để giao tiếp giữa con người và máy tính. Hay nói chính xác hơn là phương tiện để con người có thể truyền tải ý muốn cho máy tính hiểu và thực hiện.
Nó cũng trải qua quá trình phát triển từ rất lâu rồi. Từ ngôn ngữ máy đơn giản, đến ngôn ngữ bậc cao (Java, C#, PHP…)
Các ngôn ngữ lập trình
Ngày nay, có rất nhiều ngôn ngữ lập trình ra đời. Mỗi ngôn ngữ lập trình lại có thế mạnh riêng của nó.
Chắc hẳn bạn đã nghe đến Java, PHP, Javascript, C#… Nhưng cũng có những ngôn ngữ mà mình tin chắc bạn chưa bao giờ nghe tới: lolcode, Glass, Brainfuck…
Tuy nhiên, để các bạn đỡ lạc lối trên con đường học lập trình và lựa chọn cho sự nghiệp coder sau này. Mình sẽ liệt kê 5 ngôn ngữ lập trình phổ biến và nên học nhất:
- Java
- Javascript
- C#
- Python
- Runy
Để bắt đầu một ngôn ngữ lập trình mới? Hãy bắt đầu với Java
Giống như hầu hết những người phát triển phần mềm đã học lập trình tại các trường học vào những năm 2000.
Phương pháp lập trình đầu tiên mà bạn được tiếp xúc là lập trình hướng đối tượng (OOP). Với ngôn ngữ lập trình đầu tiên thường sử dụng là Java. (Tham khảo ngay bài viết lập trình hướng đối tượng Java)
Việc học ngôn ngữ Java là khá nực cười. Bây giờ nghĩ lại, mình vẫn thấy thực sự khâm phục bản thân vì đã cố gắng và không bỏ cuộc vào thời điểm đó.
Mình đã mất khoảng ba tháng để học Java từ sơ cấp đến nâng cao, và cuốn sách mình học là “Deitel: Java how to program“.
Với cuốn sách này, tác giả Deitel đã viết một cách khá chi tiết, với chủ đề chính là các đối tượng (Object) hoặc sự kế thừa (Inheritance).
Tác giả xây dựng sơ đồ chi tiết để giải thích về đối tượng, về nguyên lý lập trình hướng đối tượng. Mình rất thích những ví dụ của tác giả như dùng hình tượng sư tử để giải thích về tính thừa kế (inherited class).
#Mình đã thu được điều gì từ việc học Java
Qua cuốn sách, Deitel muốn truyền đạt một điều rằng: Để học nhanh một ngôn ngữ, đừng có tìm hiểu chi tiết mọi thứ của ngôn ngữ đó. Thay vào đó, bạn cần phải biết cách khái quát những chi tiết.
Chẳng hạn, mình sử dụng chồng đĩa để giải thích cấu trúc dữ liệu ngăn xếp (stack).
Khái niệm tương tự như vậy được sử dụng để triển khai các stack-frame khi thực thi chương trình. Và tất nhiên back-stack trong Android cũng tương tự.
Ý tưởng chung là như nhau, cứ back-stack thì là vào sau ra trước (Last in – First out). Do đó nên hiểu khái niệm trước khi tìm hiểu chi tiết về cách thực hiện.
Để làm chủ một ngôn ngữ lập trình, hãy thử áp dụng “khái niệm hóa”
Sau khi khái niệm hóa các thứ trong suy nghĩ, điều tiếp theo bạn làm là áp dụng khái niệm này vào việc học.
Bài viết này của mình chính là khái niệm hóa các ngôn ngữ.
Đầu tiên, chúng ta chia ngôn ngữ thành các thành phần cơ bản nhỏ hơn. Thành phần đầu tiên là câu (sentence). “Câu” được khái niệm hóa là khối xây dựng của tất cả các ngôn ngữ, cả ngôn ngữ nói/viết và ngôn ngữ lập trình.
Nếu bạn có thể xâu chuỗi vài câu lại với nhau thành một đoạn văn có nghĩa. Điều đó có nghĩa bạn đã thành thạo trong ngôn ngữ nói/viết.
Quy tắc này cũng được áp dụng cho các ngôn ngữ lập trình. Nếu bạn có thể xâu chuỗi vài dòng mã lệnh với nhau để giải quyết một bài toán nào đó, thì bạn được coi là thông thạo, giỏi ngôn ngữ lập trình đó(đây là chỉ quan điểm của cá nhân mình thôi)
# Sử dụng 5 thành phần chính của câu
Với ngôn ngữ nói/viết, một câu nói thường gồm các thành phần như:
- Danh từ (Noun) / Đại từ (Pronoun): Có thể là chủ thể hoặc đối tượng của câu.
- Động từ (Verb) – đóng vai trò là hành động đang được thực hiện.
- Cụm từ (Phrases) / Biểu thức (Expression): Đóng vai trò như các phần của một câu (cũng là các phần của một dòng mã lệnh).
- Cú pháp (Syntax) / Ngữ nghĩa (Semantics): Đóng vai trò như cấu trúc và quy ước để diễn đạt các câu (cũng như các cấu trúc để viết các dòng mã lệnh).
- Đặc tả ngôn ngữ (Language Specifics): Các đặc trưng đối với ngôn ngữ đó.
Đây là 5 thành phần của một câu trong ngôn ngữ nói/viết thông thường nhưng nếu hiểu kĩ và áp dụng nó vào lập trình thì bạn sẽ thấy có nhiều nét tương đồng.
Dưới đây là 5 rào cản mà mình đã vượt qua để đi từ cơ bản đến nâng cao khi bắt đầu học một ngôn ngữ lập trình mới: ( Trước đó bạn có thể tham khảo top 5 ngôn ngữ lập trình Android mình đã viết ở bài trước)
1. Các danh từ / đại từ
Các danh từ và đại từ được sử dụng trong tiếng Anh để xác định các thực thể (chủ ngữ/đối tượng) của một câu.
Ngôn ngữ lập trình cũng mô tả các đối tượng tương tự như vậy. Trong các khối mã lệnh chúng ta gọi đó là định danh (Identifier). Ví dụ như tên biến, tên hằng số…
Rào cản đầu tiên là xem cách định nghĩa các định danh trong ngôn ngữ. Nghĩa là một định danh như thế nào là hợp lệ trong ngôn ngữ đó.
int myNumber = 12; // java let myNumber = 12 // F# my_number = 12 # python
2. Các động từ
Trong một câu, động từ dùng để chỉ hành động. Có thể hành động đó đã được thực hiện hoặc chưa được thực hiện.
Với ngôn ngữ lập trình, chúng ta cũng định nghĩa hàm hay phương thức tương tự như vậy.
Như vậy rào cản thứ hai để bạn giỏi ngôn ngữ lập trình là phải tìm hiểu cách định nghĩa các hàm bằng ngôn ngữ .
// Java public void addNumbers() { //… add numbers } // JavaScript function addNumbers() { //…add numbers } # Python def add_numbers(): #…addd numbers
3. Các cụm từ / biểu thức
Các cụm từ và biểu thức là một tập hợp con của một câu, nó có thể đứng như một đơn vị riêng của chính nó, mang đến cấu trúc cho câu.
Điều này đồng nghĩa với biểu thức (expression) hoặc câu lệnh (statement) trong ngôn ngữ lập trình, bao gồm cả luồng điều khiển (control-flow).
Như vậy rào cản thứ 3 mà bạn phải tìm hiểu là các câu lệnh hoặc biểu thức hợp lệ
Biểu thức và câu lệnh xác định luồng để thực hiện, gọi là luồng điều khiển (control-flow), bao gồm ternary-expression, if-else, for, while và do-while… Điều may mắn là khái niệm này giống nhau đối với tất cả các ngôn ngữ lập trình.
>> Tham khảo thêm: Code “đẹp trai” và code “xấu gái” – có gì hay ho?
4. Cú pháp và ngữ nghĩa
Cú pháp cho biết cách thức để định nghĩa một câu đúng, được thực hiện bằng cách đánh giá chuỗi các ký tự hoặc chuỗi các từ.
Chẳng hạn như trong tiếng Anh, bạn có các thứ như dấu chấm câu và viết hoa. Ví dụ, xhfrst không phải là từ hợp lệ nhưng cherish là từ hợp lệ, ‘we you cherish‘ không phải là một câu hợp lệ, nhưng ‘we cherish you’ thì lại là câu hợp lệ.
Các ngôn ngữ lập trình cũng tương tự như vậy. Có những thứ làm cho một dòng mã lệnh trở nên không hợp lệ, ví dụ như thiếu dấu chấm phẩy hoặc sử dụng ký tự sai cho định danh.
Rào cản thứ 4 là đánh giá một dòng mã lệnh hợp lệ trong ngôn ngữ lập trình (tức là cú pháp của ngôn ngữ).
int myNumber$ = 12; // Java: syntax error - invalid token '$' var myNumber$ = 12 // JavaScript: valid identifier my_number = 12; # Python: syntax error - invalid token ';'
Đối với ngữ nghĩa, thì đó là sự liên quan đến ý nghĩa ngữ cảnh của câu hoặc tuyên bố được đề cập đến.
Sau khi đánh giá về cú pháp, cần đánh giá ý nghĩa trong ngữ cảnh. Chẳng hạn ‘The tree climbed the boy’ có một cấu trúc hợp lệ hoặc cú pháp chính xác, nhưng lại sai về ý nghĩa.
Lập trình cũng vậy, hầu hết các ngôn ngữ đều có các ngữ nghĩa riêng và việc học nó trở thành rào cản thứ tư đối với bạn.
// java int myNumber = 12; myNumber = "12"; // error # python my_number = 12 my_number = "12" # valid expression
5. Các đặc tả ngôn ngữ giúp bạn giỏi ngôn ngữ lập trình
Các đặc tả ngôn ngữ là những thứ liên quan trực tiếp đến một ngôn ngữ cụ thể.
Chẳng hạn như: danh từ trong tiếng Pháp được chia giới tính. Nhưng điều này lại không có trong tiếng Anh.
Các ngôn ngữ lập trình cũng có những cái riêng gắn liền với nó. Bao gồm các lớp (Class), các kiểu dữ liệu (Data Type) và các cấu trúc dữ liệu (Data Structure)…
Chẳng hạn trong JavaScript có khái niệm về Prototype (nguyên mẫu). Nhưng trong Java thì không. Vì vậy, rào cản thứ năm là bạn phải hiểu và khái niệm hóa những đặc tả về ngôn ngữ.
Vì liên quan đến từng ngôn ngữ cụ thể nên có thể mất nhiều thời gian để khái niệm hóa hơn. Đặc biệt nếu là khái niệm hoàn toàn mới như ngôn ngữ F#.
Tạm kết
Việc trừu tượng hóa sẽ giúp bạn thấy được sự giống nhau giữa các thể hiện khác nhau.
Khi bạn hiểu được và thực hiện được 5 quy tắc trên, bạn sẽ dễ dàng học và làm chủ một ngôn ngữ lập trình mới.
Việc lặp lại quá trình này sẽ khá khó khăn trong lần đầu tiên, nhưng đừng nản chí vội. Bạn cứ lặp lại vài lần thì nó sẽ trở thành bản năng đối với bạn.
Nếu bạn đang muốn học lập trình thì đừng bỏ qua những bài viết này nhé.
- Miễn phí khóa học lập trình Android cơ bản
- React Native cơ bản cho người mới
- Tự học lập trình Android trong 24h
- 4 quy tắc vàng để thay đổi tư duy ứng dụng
Qua bài viết này, mình hi vọng sẽ giúp các bạn có nhìn khác về việc học lập trình. Từ đó thay đổi tư duy và cách học để nhanh chóng thành thạo, giỏi ngôn ngữ lập trình mới. Ý kiến của bạn về cách học lập trình như thế nào? Để lại bình luận bên dưới nhé.
Xin chào, mình đang vật lộn vô cùng vất vả với F# dù chỉ mới bắt đầu nghịch đến if…elif…else và vòng lặp. Nếu có kinh nghiệm về F#, không biết liệu bạn có thể giúp mình được chứ ? (*Mình nghĩ cách học một ngôn ngữ mới tốt nhất đó là học nó bằng một ngôn ngữ đã biết thông qua việc so sánh hai đoạn code tương đương của hai ngôn ngữ. Do đó, mình chỉ nhờ bạn “dịch” (theo đúng nghĩa đen luôn đó) một đoạn code C hoặc C++ sang F# sao cho gần giống nhất… Đọc thêm »
hi,
Bạn đưa code lên đây mình xem có hỗ trợ được không nhé!
Đây là đoạn code mẫu viết bằng C++ mà mình muốn viết trên F#: #include using namespace std; int main(){ int a, b; cout <> Please enter a value for a: “; cin >> a; cout <> Please enter a value for b: “; cin >> b; cout <> The greater number is: ” <=b)*a + (a<b)*b); return 0; } Vì khi viết lại đoạn code trên bằng F# nó – Visual Studio – cứ báo lỗi mà mình không biết làm thế nào để xử lý (chủ yếu vẫn là lỗi về kiểu dữ liệu ấy) nên hi vọng… Đọc thêm »
Hi,
Ở Việt Nam có lẽ gặp được người biết F# hiếm như lá mùa thu. Mình nghĩ bạn có thể tham gia các group ở nước ngoài như: https://www.reddit.com/r/fsharp/
Cảm ơn bạn. Mà đoạn code của mình bình luận ở trên đó không hiểu sao bị trang web này “tự ý” chỉnh lại rất nhiều chỗ.
Khi bạn comment thì bị web mình chỉnh sửa á? Mình thì chắc chắn không sửa rồi
Không hiểu sao ngoài một số chỗ trong đoạn code bị “cắt xén” và thay đổi thì dễ thấy nhất là toán tử “< <" (hai dấu "<" viết liền kề) bị thay bằng ký hiệu tạo bởi dấu "<" và ">" viết liền kề nhau – khó chịu thật.
Mình đang chuẩn bị đổi hướng công việc qua lập trình, lang thang trên mạng thì thấy vntalking.com, cũng có chút gì đó làm động lực.
Cảm ơn bạn rất nhiều về những bài viết rất bổ ích.
Hi. Cám ơn bạn đã ủng hộ 🙂 Hi vọng mình sẽ giúp được bạn trong lúc chuyển đổi quan trọng này