Làm thế nào để nhanh thành thạo bất kỳ ngôn ngữ lập trình nào?

2
399

code-coding-computer-879109-compressed

Có nhiều người hỏi mình rằng “Làm thế nào để bạn biết tất cả các ngôn ngữ này?”, và câu hỏi đó thường được hỏi bởi các bạn lập trình viên mới. Trong quá trình học tập và làm việc, mình đã tìm ra một mô hình để học các ngôn ngữ. 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 việc học tập.

“Khái niệm hóa là cách chúng ta định nghĩa, tổng quát hóa một vấn đề hoặc nhiều vấn đề. Từ đó, chúng ta có thể hình dung và có cái nhìn toàn diện hơn”

Trước khi chúng ta bắt đầu, mình muốn bạn hiểu rằng mình sẽ nói các vấn đề trong ngôn ngữ lập trình ở mức độ tổng quan mà không đi vào chi tiết từng khái niệm lập trình.

Tất cả 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à ngôn ngữ lập trình đầu tiên thường sử dụng là Java.

Việc học ngôn ngữ Java là khá nực cười, bây giờ nghĩ về điều này, mình vẫn thấy thực sự khâm phục bản thân vì đã tiếp tục 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’.

Điều mình học hỏi được từ cuốn sách này đó là 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). Ông xây dựng các sơ đồ chi tiết để giải thích đối tượng từ lớp (class), và sử dụng sư tử trong thế giới động vật để giải thích lớp thừa kế (inherited class) từ lớp cơ sở (base class).

Mình đã học được điều gì từ việc học Java

Rào cản mà Deitel tạo ra đã được mình vượt qua một cách dễ dàng bằng cách ngừng tìm hiểu rằng mọi thứ được thực hiện cụ thể chi tiết như thế nào, mà bắt đầu bằng cách tóm tắt chủ đề thành một khái niệm. 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à cũng được sử dụng để triển khai back-stack trên các thiết bị Android. Ý tưởng chung là như nhau, 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.

Ý tưởng về khái niệm hóa từ 0 đến 100

Sau khi khái niệm hóa các thứ trong suy nghĩ của mình, đ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 ngôn ngữ. 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 sẽ là câu (sentence), đượ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 ngôn ngữ lập trình đó (đây là chỉ quan điểm của cá nhân mình thôi)

5 thành phần chính của câu

Cũng giống như ngôn ngữ nói/viết thông thường, chúng ta sẽ thử phân tích các thành phần của một câu gồm có:

  1. Danh từ (Noun) / Đại từ (Pronoun) — có thể là chủ thể hoặc đối tượng của câu.
  2. Động từ (Verb) – đóng vai trò là hành động đang được thực hiện.
  3. 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).
  4. 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).
  5. Đặ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 ngôn ngữ 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ừ sơ cấp đến trung cấp khi bắt đầu học một ngôn ngữ lập trình mới.

#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.

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ữ đó. Ví dụ:

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. Trong ngôn ngữ lập trình, chúng ta cũng định nghĩa hàm hoặc phương thức tương tự như vậy. Như vậy rào cản thứ hai mà bạn cần vượt qua là phải tìm hiểu cách định nghĩa các hàm bằng ngôn ngữ lập trình mà bạn đang học.

// 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ệ trong ngôn ngữ lập trình.
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.

#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. Ngôn ngữ 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ữ

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ư với tiếng Pháp thi danh từ đượ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ó, có thể 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ữ.

Mặc dù đây là rào cản cuối cùng khi bạn học một ngôn ngữ mới từ cơ bản đến trung cấp. Nhưng hãy nhớ rằng, vì nó liên quan đến 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ác thành phần khác ở trên, đặc biệt nếu nó là khái niệm hoàn toàn mới như F# Quotations. Còn các rào cản ở trên lại là cơ bản trong tất cả các ngôn ngữ lập trình, do đó bạn chỉ cần tìm hiểu một lần.

Kết luận

Việc trừu tượng những điều trên thành các khái niệm sẽ giúp bạn thấy được sự giống nhau giữa các implementations khác nhau. Việc vượt qua năm rào cản này có thể giúp bạn dễ dàng học và thành thạo bất kì ngôn ngữ lập trình mới nào.

Tóm lại, quá trình gồm 5 bước:

  1. Tìm hiểu cách đặt tên các định danh.
  2. Tìm hiểu cách định nghĩa các hàm và các phương thức.
  3. Tìm hiểu các biểu thức và các câu lệnh định nghĩa luồng điều khiển của ngôn ngữ lập trình.
  4. Tìm hiểu một cú pháp như thế nào là hợp lệ, các ngữ nghĩa và quy ước của ngôn ngữ.
  5. Tìm ra đặc ta ngôn ngữ, chẳng hạn các cấu trúc dữ liệu, sự trừu tượng hóa (giao diện)…

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.

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 với một ngôn ngữ lập trình mới. Đừng quên comment nếu thấy bài viết có ích nhé

2
Bình luận. Đặt câu hỏi cũng là một cách học

avatar
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
Hoang Tony
Member
Hoang Tony

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.