menu

Lập trình là gì và như thế nào?

Đăng lúc 23/08/2017, trong chuyên mục Lập trình nói chung

Bài viết dành cho những ai chưa từng phải tiếp xúc với việc lập trình (coding) và chẳng biết nó là gì, bắt đầu từ đâu, ý tưởng của nó như thế nào.

Ngôn ngữ máy tính

Lập trình thực chất là cách bạn dạy máy tính thực hiện một chuỗi các lệnh nào đó. Nó cũng tương tự như việc bạn bảo một đứa trẻ nấu món trứng chiên

  1. Đầu tiên là chuẩn bị các nguyên liệu.
  2. Kế đến là đập trứng cho vào chén hoặc tô.
  3. Rồi thêm gia vị, khuấy đều.
  4. Tìm một cái chảo sạch bắt lên bếp.
  5. Cho dầu ăn vào chảo và bật cho bếp nóng lên.
  6. Sau khi dầu nóng thì chế trứng trong chén vào.
  7. Khi nào chín thì tắt bếp.

Dạy cho máy tính cũng y như vậy nhưng “đứa trẻ máy tính” hoàn toàn không thể tự nó tư duy. Ví dụ ở bước 2 bạn kêu đứa trẻ “đập trứng”. Bạn dùng câu tương tự với máy tính thì nó sẽ không hiểu phải làm gì. Đứa trẻ biết tư duy nên nó sẽ hiểu là phải lấy tay cầm trứng, rồi đập nhẹ vào một vật cứng hoặc dùng vật cứng đập vào trứng,… Máy tính hoàn toàn không thể tự nghĩ ra những điều đó.

Nói chuyện với máy tính

Cũng như con người, muốn giao tiếp được với máy tính, bạn phải biết được ngôn ngữ của nó. Có nhiều ngôn ngữ máy tính khác nhau (cũng như con người có nhiều ngôn ngữ khác nhau vậy), đa phần các ngôn ngữ đều đảm bảo có những thứ cơ bản giống nhau, cũng giống ngôn ngữ con người phải đảm bảo có đủ chủ ngữ, đại từ nhân xưng, đại từ quan hệ, ngữ pháp ra sao,…

Ngôn ngữ máy tính

Lập trình thực chất là bạn chuyển tải từ ngôn ngữ con người sang ngôn ngữ máy tính. Việc học lập trình là bạn đang học cách chuyển tải ngôn ngữ con người sang ngôn ngữ máy để máy tính hiểu, đồng thời học luôn cách sai khiến máy tính làm theo nhu cầu của mình.

Các loại ngôn ngữ máy (ngôn ngữ lập trình)

Có thể nói thế giới máy tính giống y như thế giới con người vậy. Chúng ta giao tiếp bởi nhiều ngôn ngữ khác nhau, có ngôn ngữ khó học như tiếng Trung Quốc, tiếng Nhật thì cũng có những ngôn ngữ dễ học như tiếng Anh. Máy tính cũng như thế. Có những ngôn ngữ máy rất gần gũi với ngôn ngữ con người của chúng ta nên chúng ta rất dễ học, ngược lại có những ngôn ngữ khác xa hoàn toàn.

Những ngôn ngữ phổ biến nhất trong năm 2015 Những ngôn ngữ lập trình phổ biến nhất năm 2015 (nguồn).

Những ngôn ngữ khó học có ưu điểm là dễ giao tiếp với máy. Ta có thể diễn đạt hầu như tất cả mọi ý của ta, máy đều hiểu, nói một lần trực tiếp là nó hiểu. Ngược lại những ngôn ngữ càng giống ngôn ngữ con người thì phải đi một đường vòng lớn mới có thể làm cho máy tính hiểu được ý chúng ta, khiến thời gian xử lý các tác vụ cũng chậm đi đôi chút. Cái gì cũng có cái hại và cái lợi riêng của nó.

Thường chúng ta tiếp xúc với thế giới ngôn ngữ máy là các ngôn ngữ gần gũi với con người. Các bài viết trên TTH cũng sẽ chọn các loại ngôn ngữ này.

Nên học ngôn ngữ lập trình nào đầu tiên?

Với tôi thì tôi tiếp xúc với ngôn ngữ lập trình Pascal đầu tiên năm lớp 10 (2005). Tuy nhiên có vẻ nó đã quá lỗi thời. Một số bạn thì lại tiếp xúc với C/C++ đầu tiên và gần như ai học lập trình đều phải học ngôn ngữ này, có thể học trước hoặc học sau.

Mỗi ngôn ngữ có một lợi thế và “đất sống” riêng. Do đó trong thế giới lập trình, có rất nhiều ngôn ngữ cùng tồn tại!

Một lựa chọn nữa sau khi tôi tham khảo trên mạng thì người ta khuyên nên học Python vì cấu trúc nó đơn giản, ngôn ngữ gần giống ngôn ngữ tự nhiên của chúng ta.

TTH sẽ chọn Python làm ngôn ngữ tự học đầu tiên. Tuy thế, tùy theo nhu cầu công việc và học tập của bạn, bạn có thể học các ngôn ngữ khác, không nhất thiết phải tuân thủ theo như TTH gợi ý. Bài viết này là nói về ý tưởng chung nhất, không nói riêng ngôn ngữ nào cả.

Những thứ cơ bản của các ngôn ngữ lập trình và cách nó hoạt động

Có 5 thứ cơ bản của một ngôn ngữ lập trình (tham khảo thêm tại đây). Hầu như ngôn ngữ nào cũng phải đảm bảo đủ 5 cái sau đây và khi lập trình, bạn sẽ sử dụng chúng để “nói” với máy tính điều bạn muốn nó làm.

  1. Biến (Variable)
  2. Cấu trúc điều khiển (Control structure)
  3. Cấu trúc dữ liệu (Data structure)
  4. Cú pháp (Syntax)
  5. Công cụ (Tools)

Cụ thể hơn, những cái trên là gì? Trang web mà tôi tham khảo ở trên nó dành hẳn một bài viết riêng cho từng loại, rất dài. Ở đây tôi không muốn bạn phải tốn nhiều thời gian như thế trong khi chỉ muốn biết lập trình là gì!

  • face Variable (biến)

    Biến là những “cá thể chứa thông tin” mà bạn sử dụng trong lúc lập trình. Ví dụ bạn muốn kiểm tra xem khi người ta nhập vào một số thì liệu số ấy là số chẵn hay số lẻ? Bạn phải định nghĩa một “biến”, tạm đặt tên là x. Biến x này sẽ chưa đựng số mà người dùng nhập vào cũng như mỗi khi bạn cần sử dụng đến nó thì bạn chỉ việc sử dụng ký tự x này và xem nó như là “số mà người dùng nhập vào”.

    Có nhiều loại biếh khác nhau, tôi sẽ có một bài khác chi tiết hơn để nói về nó, tạm thời bạn chỉ cần biết ý tưởng là thế.

  • face Control structure (cấu trúc điều khiển)

    Nói ngắn gọn, cấu trúc điều khiển là cách mà đoạn code của bạn sẽ thực hiện sau khi bạn cho “chạy nó”. Khi bạn nhấn nút “run” để bắt đầu cho đoạn code (chương trình) của bạn chạy thì cơ bản nó sẽ chạy từ trên xuống dưới, từ trái qua phải, cái này gọi là code flow (dòng mã). Điều này cũng giống như việc bạn đọc một quyển sách từ đầu, từng trang, ở từng trang thì bạn đọc từ trên xuống dưới và từ trái sang phải. Đến những dòng, ví dụ “hãy sang trang thứ 100 để xem cái gì gì đó” thì bạn lại lật đến trang thứ 100 và đọc tiếp, đọc đến hết ý đó thì thôi và quay lại. Dòng code khi chạy cũng giống như vậy, sẽ có những dòng code bảo là phải nhảy đến một đoạn khác để chạy hoặc lặp lại đoạn vừa chạy xong,…

    Cấu trúc điều khiển là cách mà ngôn ngữ định hình ra để điều khiển dòng chảy của các đoạn code khi nó được chạy.

  • face Data structure (cấu trúc dữ liệu)

    Nếu như variable là một “cá thể” chứa thông tin riêng rẻ thì data structure sẽ cho bạn cách để có thể lưu trữ và sử dụng một lượng khổng lồ các cá thể ấy. Hãy thử tưởng tượng bạn cần xử lý một khối lượng thông tin cực lớn, danh bạ của một doanh nghiệp chẳng hạn. Không thể nào bạn lại lưu mỗi thành phần trong danh bạ bởi một variable nào đó vì nó sẽ rất tốn thời gian, câu chữ, đoạn code sẽ rất dài,… Cấu trúc dữ liệu trong ngôn ngữ lập trình sẽ “chỉ” cho bạn cách sắp xếp và tổ chức lại chúng. Kiểu như bạn có rất rất nhiều tập tin pdf trong máy để xem, nó sẽ giúp bạn hệ thống lại chúng, để chúng vào những nơi dễ gọi tên, dễ tìm kiếm khi cần đến.

  • face Syntax (cú pháp)

    Cú pháp là gì? Thật khó có thể định nghĩa nhưng hãy ví dụ, tôi ghi [email protected] thì bạn nghĩ ngay tới email hay trang web? Câu sẽ lời sẽ là email. Tại sao não bộ của bạn biết đó là email mà không phải là một trang web? Vì não bộ biết nó đã tuân theo một cú pháp của email. Đấy, cú pháp trong ngôn ngữ lập trình cũng vậy, có rất rất nhiều cú pháp khác nhau trong ngôn ngữ lập trình, đó là những cách sắp xếp các câu lệnh, ký hiệu này nọ với những ý nghĩa khác nhau để khi nhìn vào, máy tính hiểu ngay ra rằng “à, thằng lập trình này đang muốn nói đến cái đó”. Y như việc não bạn “à, thằng này đang nói đến email”.

  • face Tools (công cụ)

    Có lẽ cái này là dễ hiểu nhất với bạn. Bạn hiểu công cụ trong thực tế là gì thì trong ngôn ngữ lập trình nó cũng y chang vậy. Tools là những đoạn mã, cấu trúc,… có sẵn trong ngôn ngữ ấy nhằm hỗ trợ bạn lúc lập trình sao cho tiện và nhanh nhất có thể.

Một ví dụ cụ thể

Tôi sẽ xét một ví dụ đơn giản. Ở đây tôi không dùng ngôn ngữ cụ thể nào mà chỉ xét một cách chung nhất bằng cách sử dụng những thứ cơ bản của một ngôn ngữ lập trình.

Kiểm tra tính chẵn/lẻ của một số

Bạn hãy viết một chương trình (hoặc một đoạn mã) để kiểm tra xem số mà người dùng nhập vào là số chẵn hay số lẻ? Cụ thể hơn, bạn sẽ yêu cầu người dùng nhập một số. Sau khi người ấy nhập xong, bạn phải xuất ra màn hình kết quả số đó là số chẵn hay số lẻ.

Những thứ có sẵn trong ngôn ngữ lập trình

Đầu tiên là những câu lệnh có sẵn bạn có thể dùng:

  • xuất-ra-màn-hình: giúp bạn xuất ra màn hình những gì bạn ghi trong dấu ngoặc kép (“”)
  • đọc-kết-quả-từ-bàn-phím-và-gán-vào-biến: giúp bạn đọc thứ mà người dùng gõ từ bàn phím.
  • nếu A thì B ngược-lại-thì C: nếu điều kiện A thỏa thì sẽ thực hiện lệnh B, ngược lại sẽ thực hiện lệnh C.
  • Các phép toán cộng, trừ, nhân, chia, chia hết,…

Giải thuật (thuật toán)

Giải thuật (algorithm) là phương pháp/ý tưởng bạn vận dụng những thứ có sẵn của một ngôn ngữ lập trình để giải quyết yêu cầu bài toán. Các lập trình viên hơn nhau ở điểm này. Giải thuật tốt sẽ giúp máy tính hiểu nhanh hơn, làm nhanh hơn. Ngược lại thì sẽ rất chậm hoặc sai.

Đối với bài toán kiểm tra tính chẵn lẻ của một số, tôi gợi ý một giải thuật thế này. Ta sẽ lấy số mà người dùng nhập vào chia cho 2, nếu nó chia hết thì kết luận là số chẵn, ngược lại là số lẻ.

Ví dụ người dùng nhập vào số 4. Áp dụng cách trên, tôi lấy 4 chia cho 2, hết nên kết luận 4 là số chẵn.

Để có thể minh họa giải thuật một cách trực quan, dân lập trình sử dụng một biểu đồ thể hiện ý tưởng, cái này người ta gọi là lưu đồ (flow chart). Bên dưới là một lưu đồ minh họa giải thuật ở trên.

Lưu đồ giải thuật tìm tính chẵn lẻ của một số

Đoạn code

xuất-ra-màn-hình "Vui lòng nhập vào một số"
đọc-kết-quả-từ-bàn-phím-và-gán-vào-biến x
nếu x chia hết 2 thì
  xuất-ra-màn-hình "x là số chẵn"
ngược-lại-thì
  xuất-ra-màn-hình "x là số lẻ"

Cách máy tính “chạy đoạn code”

Cần nhớ rằng, sau khi bạn nhấn nút “chạy” thì máy tính sẽ bắt đầu đi từ trên xuống dưới trong đoạn code của bạn, đến chỗ nào mà nó có thể nhận dạng được ngôn ngữ của nó thì nó sẽ hiểu và thực thi y như vậy.

  • Đầu tiên nó sẽ gặp xuất ra màn hình, nó hiểu và liền hiển thị lên màn hình câu “Vui lòng nhập vào một số”.
  • Kế đến người dùng gõ lách cách gì đó, nó mặc kệ vì nó không quan tâm nhưng nó sẽ chạy đến dòng thứ hai trong đoạn code trên và gặp câu nó hiểu là đọc kết quả từ bàn phím và gán vào biến. Ah há, thằng người nó kêu mình đọc và gán kết quả vào, ok thôi. Thế là máy tính dành cho biến x đúng giá trị mà bạn vừa nhập.
  • Xong, nó đọc tiếp dòng tiếp theo và gặp nếu,….
  • ….

Đó là cách máy tính hoạt động.

Cách học?

Hai cách học một ngôn ngữ lập trình MỚI

Giả sử bạn đã biết thế nào là lập trình, cũng đã từng lập trình được với một ngôn ngữ nào đó rồi. Bây giờ bạn cần học một ngôn ngữ lập trình mới thì làm sao? Thường có hai cách

  1. Làm theo hướng dẫn để tạo một sản phẩm cụ thể.
  2. Học từ bước đầu tiên tới cuối cùng.

Cách 1 cho bạn cảm giác làm được một cái gì đó ngay lập tức, nhanh và khiến bạn cảm giác mình đã học được ngôn ngữ ấy. Nhược điểm là bạn học nửa vời và khó sáng tạo thêm cái mới.

Cách 2 ngốn rất nhiều thời gian của bạn, thường được áp dụng trong hầu hết các giáo trình dạy code. Tuy nhiên sẽ cho quả ngọt sau khi hoàn thành vì bạn đã nắm vững hầu như tất cả và sẵn sàng ứng dụng vào thực tế.

Thường người ta kết hợp cả hai cách trên cùng một lúc với nhau. Đó là bởi vì các ngôn ngữ lập trình thường có cấu trúc tương tự, chỉ khác cách khai báo, dòng lệnh. Thêm nữa là quỹ thời gian bạn có không cho phép bạn đi từ đầu đến cuối. Tôi cũng thường học theo cách 1 trong quá trình làm việc của mình, tuy nhiên tôi khuyên bạn như thế này

  • Nên học theo cách 2 một ngôn ngữ mới và cơ bản khi bạn mới chập chững vào con đường lập trình.
  • Sau đó tùy theo nhu cầu và tính chất quan trọng hay không của dự án, công việc mà bạn áp dụng cách 1 để học ngôn ngữ mới. Nhớ là phải ghi chú trong quá trình sử dụng cách này để học. Cách này có lợi thế là các nhu cầu của bạn sẽ dễ dàng tìm kiếm câu trả lời trên internet.
  • Biết mình sẽ gắn bó với ngôn ngữ nào, ngôn ngữ là sẽ đi theo sự nghiệp của bạn. Từ đó hãy học ngôn ngữ đó theo cách 2.

Bắt tay vào học một ngôn ngữ mới?

Khi bắt tay vào học một ngôn ngữ mới, bạn cần làm gì?

  1. Mục đích. Thường bạn phải biết vì sao bạn lại chọn ngôn ngữ đó hoặc phải biết ngôn ngữ đó có thể đáp ứng như cầu gì, dùng vào đâu.
  2. Tài liệu tham khảo. Tìm một nguồn thật đáng tin cậy và dễ hiểu nhất để “bám theo” đấy mà học. Ví dụ, ngày xưa khi tôi tự học về lập trình thiết kế web, tôi đã bám theo trang web w3schools. Nếu một ngôn ngữ có bộ tham khảo riêng của nó quá tốt, ví dụ như matlab thì bạn hoàn toàn không cần dùng gì khác.
  3. Phải biết chỗ hỏi. Khi học lập trình có rất nhiều thứ bạn không biết hoặc không thể dựa vào tài liệu tham khảo đang đọc để tự giải quyết. Hãy Google cái mà bạn không biết (tốt nhất bằng tiếng Anh). Nếu không tìm được, hay hỏi trực tiếp trong các group facebook hoặc lên trang stackoverflows về ngôn ngữ mà bạn đang học (có rất nhiều!).
  4. Học đi đôi với hành. Đừng bao giờ có cái tâm lý “học lý thuyết trước rồi thực hành sau”. Hãy tìm một ứng dụng (từ nhỏ đến lớn) để làm trong quá trình học code. Nó sẽ giúp hình thành tư duy và thói quen sử dụng ngôn ngữ ấy trong thực hành cho bạn, đồng thời sẽ giúp bạn nhớ lâu hơn.
  5. Ghi chú. Bạn phải luôn có một quyển/note ghi chú riêng cho mình và phải làm sao để dễ dàng tìm kiếm nhất khi cần. Nếu sử dụng MacOS, tôi gợi ý bạn dùng trình ghi chú Quiver (có phí). Nếu dùng các hệ điều hành khác hoặc không muốn trả phí, tôi khuyên bạn nên viết blog Jekyll/dùng Markdown (ví dụ như blog này) vì nó dễ dàng soạn thảo, hỗ trợ tìm kiếm nhanh khi cần. Trong trường hợp bạn ngại công khai nó, hãy cấm Google và các trình tìm kiếm khác tìm đến trang web của bạn.

infoBài viết chủ yếu nói về ý tưởng, tuy nhiên sẽ không tránh khỏi sai sót. Hy vọng bạn sẽ góp ý để tôi hoàn thiện hơn. Cảm ơn bạn!

programming
python
matlab
c++
Top