Lập trình

Nhập môn lập trình - 9 cảnh giới thú vị mà bạn có thể khám phá

Huy Erick

Bài viết được sự cho phép bởi tác giả Nguyễn Trung Thành Bài viết này là những chia sẻ từ đáy lòng của một kỹ sư/giảng viên với nhiều năm kinh nghiệm trong nghề lập...

Bài viết được sự cho phép bởi tác giả Nguyễn Trung Thành

Bài viết này là những chia sẻ từ đáy lòng của một kỹ sư/giảng viên với nhiều năm kinh nghiệm trong nghề lập trình. Khi bạn bắt đầu nhập môn lập trình , thì bài viết này sẽ định hướng cho bạn biết con đường tích lũy kinh nghiệm lập trình nhiều chông gai nhưng cũng rất thú vị phía trước.

Bài viết chia là 2 phần chính:

Phần 1: Nhập môn lập trình

Thường thì người giỏi thật sự thì có lẽ họ ít chia sẻ kinh nghiệm tối cao. Người ta gọi là bí kíp gia truyền. Mà chỉ người được chỉ định mới có thể truyền thụ. Mà khi chia sẻ thì họ lại thường chia sẻ những kinh nghiệm phổ biến.

Bản thân mình cũng vậy, nhưng trong bài viết này mình chia sẻ những quan niệm hơi khác người một chút.

#1. Nền tảng ngành CNTT của Việt Nam

Để học tốt ngành CNTT, bạn phải có đủ 5 yếu cốt cốt lõi sau:

  1. Tư duy
  2. Kỹ năng IT
  3. Kiến thức chuyên môn (lập trình, Toán học, Vật lý…).
  4. Đam mê
  5. Ngoại ngữ

5 yếu tố trên gộp lại thành 1 thứ gọi là “cốt cách”, “tư chất”.

Điều này giải thích một chuyện mà bạn thường hay thấy: có vài bạn học lập trình suốt 2 năm liền mà trình độ không bằng được vài bạn học lập trình trong… vài tháng.

Đơn giản là sự khác nhau ở “tư chất” và sự cần cù kiên trì mỗi người.

Để giải thích 5 yếu tố trên vừa dễ mà vừa khó. Dễ là vì bạn nào đọc cũng hiểu cả. Khó là vì để cho bạn hiểu đúng được ý nghĩa sâu xa thì không phải đơn giản.

Bạn có thể hiểu đơn giản như sau:

Giả sử 4 yếu tố đầu tiên bạn rất giỏi, nhưng bạn không giỏi yếu tố cuối cùng (tiếng Anh). Vì vậy mà bạn không thể leo lên mức cảnh giới thượng thừa mà mãi mãi bị giới hạn ở 1 mức nào đó.

Bạn chỉ đạt cảnh giới cao khi nội lực đầy đủ. Lấy hình trên minh họa chẳng hạn, với “minimum” là ngôn ngữ tiếng Anh.

#2. Coder là gì? Coder khác với Software Engineer chỗ nào?

Coder hiểu đơn giản là những người viết các đoạn mã để xây dựng các phần mềm. Đây là cách gọi dân dã kiểu tá điền. Tức là Coder là người viết code, và chỉ biết mỗi code thôi.

Với ý nghĩa ban đầu là coder là người chỉ thực hiện viết code. Nhưng với yêu cầu nhân lực ngày nay, thì coder gần giống với ý nghĩa Software Engineer.

Tức là người Coder không chỉ biết viết code theo chỉ thị, mà họ cần phải biết về thiết kế hệ thống, biết viết test case, biết làm việc nhóm, trao đổi với khách hàng… rất nhiều kĩ năng kèm theo.

#3. Copy code đúng cách

Thường thì đa số các bài viết chia sẻ kinh nghiệm lập trình họ đều nói rằng không được phép copy code của người khác, copy code là ngu, là gà, copy code là vô đạo đức, v.v.

Dĩ nhiên mình đồng ý hoàn toàn, vì “copy code” đối với đa số người là “lấy code của người khác mang về làm bài làm của mình”.

Còn với mình, thì quan niệm “copy code” đúng với ý nghĩa thuần túy của nó: “copy một đoạn code từ tài liệu, sau đó dán vào bài của mình, chạy thử”.

Vậy thì điều đó có gì khác nhau ? Rất khác. Khi mình tìm kiếm tài liệu, chạy thử code, để tiếp thu nhanh nhất thì mình phải copy code thấy được kết quả ngay, dễ dàng hình dung ra vấn đề.

Điều này rõ ràng tốt hơn việc “gõ code từ từ (không copy) để hiểu từng câu lệnh, gõ quá trời quá đất, chạy thử, ôi mẹ ơi 69 lỗi, thiếu thư viện tè le. Biết vậy khỏi gõ code chi cho mệt người tốn sức”.

Khi mình “copy code” thuần túy, mình sẽ thấy ngay kết quả, điều đó tạo động lực và cảm hứng. Từ đó bắt đầu chạy debug từ từ, dần dần hình dung ra vấn đề và hiểu được, sử dụng được. Đó là 1 trong những bí kíp tối thượng của mình khi học lập trình.

#4. Biết nhìn xa trông rộng

Nghe có vẻ khá là hoa mỹ nhưng thực tế là vậy.

Khi làm một đồ án (bài tập siêu lớn), các bạn của mình thường hay nhào vào code ngay, code được chức năng nào hay chức năng đó để kiếm điểm. Còn mình thì không.

Mình dành đến gần 50% thời gian làm đồ án cho sự chuẩn bị, chuẩn bị về mọi thứ. Mình học những công nghệ liên quan đồ án, tìm hiểu kĩ các hàm, code thử vài tính năng nho nhỏ để hiểu. Sau đó mình bắt đầu lên ý tưởng, thiết kế hệ thống class (lập trình hướng đối tượng).

Mình phải thiết kế làm sao mà phải mở rộng được tối đa các chức năng. Ví dụ đồ án yêu cầu chức năng vẽ hình cơ bản, nhưng mình thiết kế làm sao mà có thể dễ dàng mở rộng ra thành “vẽ hình phức tạp, vẽ hình mà chèn thêm được chữ”.

Việc làm IT Fresher dành cho bạn

#5. Code đúng là một chuyện - Code để có thể tái sử dụng lại là chuyện khác

Giai đoạn nhập môn lập trình rất mệt, phải liên tục điều chỉnh cho hoàn thiện, nhưng bù lại khi cái lõi đã xong, thì giờ đến lúc mình sướng, bạn mình khổ. Bạn mình khổ vì nhào vào code liền, giờ code như 1 đống rác đọc chả hiểu gì (xin lỗi, dùng từ hơi xúc phạm).

Vì code miễn sao ra đúng chức năng là ok nên “làm được trước đã rồi tính tiếp”. Vì vậy bạn mình thường sẽ bị bế tắc về sau. Còn mình thì giai đoạn sau rất thoải mái, mở rộng tính năng tối đa, giựt điểm về ngon lành.

Mấu chốt quan trọng ở đây là phải biết nhìn xa trông rộng. Nền tảng đó là cấu trúc dữ liệu và giải thuật, phương pháp lập trình hướng đối tượng, tư duy hướng đối tượng. Dùng các mẫu thiết kế Hướng đối tượng làm cho code của mình hay hơn, chuyên nghiệp hơn.

Phần 2: 9 cảnh giới từ thấp đến cao trong giới lập trình

Nhằm đơn giản hóa vấn đề, mọi code minh họa trong bài sử dụng ngôn ngữ C/C++.

Cảnh giới 1: Nhập môn lập trình (beginner)

Mới bước vào ngành CNTT và lập trình thì ai ai cũng phải “nhập môn”, làm quen. Vì vậy mà nhiều khi code rất là trẻ trâu. Code đọc khó hiểu, tệ hơn là thụt dòng loạn xạ không có quy tắc.

Cảnh giới 2: Biết sử dụng hàm, thư viện chuẩn có sẵn

Có một điều trớ trêu thay là dù bạn học các ngành về khoa học kĩ thuật hay là về khoa học xã hội, thì vẫn len lỏi đâu đây một yếu tố gọi là “học thuộc lòng”.

Tất nhiên, với các ngành khoa học xã hội thì điều đó dễ dàng nhận ra, môn Văn chẳng hạn, học bài phát điên luôn. Còn với khoa học kĩ thuật thì sao ? Liệu có học bài không ?

Với quan điểm của mình, một trong những bước đệm để bạn giỏi lên là phải học thuộc càng nhiều hàm, càng nhiều thư viện càng tốt, giống như học từ vựng tiếng Anh ấy.

Điều này đôi khi nghe có vẻ phi lý, vì sao ta lại học thuộc lòng ?

Đơn giản vì ta đang muốn giải quyết nhanh một vấn đề, sao ta lại tốn công sức viết thủ công các hàm trong khi thư viện đã có sẵn, gọi 1 phát là xong ?

Ta sẽ tiết kiệm được thời gian, công sức để tập trung vào vấn đề chính nhiều hơn. Nhiều khi mình lo viết hàm phụ mà hàm phụ bị lỗi, gây rối, mất tập trung, xuống tinh thần.

Ghi chú: Chỉ khi bạn vững thuật toán cơ bản thì mới xài hàm để tiết kiệm thời gian.

Lấy ví dụ minh họa: Kiểm tra xem một số nguyên dương có phải số đối xứng hay không?

Ví dụ như số 121 là số đối xứng, số 123 thì không phải, số 9009 là số đối xứng, v.v

Bạn có thể nhận thấy sự khác biệt giữa các cảnh giới trong việc sử dụng hàm và thư viện chuẩn có sẵn. Việc hiểu rõ cú pháp và nguyên lý hoạt động của các hàm sẽ giúp code của bạn mượt mà và hiệu quả hơn.

Cảnh giới 3: Tinh thông hàm, thư viện, nguyên lý

“Tinh thông” hoàn toàn khác với chuyện “biết biết một chút”.

Khi bạn hiểu rõ được cú pháp các hàm xử lý, bạn sẽ dễ dàng ứng dụng nó để xử lý bài toán tốt nhất. Lấy lại ví dụ “xác định số đối xứng”.

Khi bạn chưa hiểu rõ hàm strcmp, strrev, strcpy thì bạn chỉ hiểu đơn giản là nó giúp mình làm cái này, cái kia. Nhưng khi bạn hiểu rõ được cú pháp của hàm đó, nguyên lý xử lý của hàm đó, thì bạn có thể áp dụng để làm cho code mượt mà hay hơn như hình ở trên.

Cảnh giới 4: Cấu trúc dữ liệu và thuật toán

Đây là một lợi thế của những bạn từng học “đội tuyển Tin học” đi thi Học sinh giỏi cấp tỉnh, thành phố/quốc gia/Olympic.

Bạn sẽ ứng dụng những cấu trúc dữ liệu & thuật toán để giải quyết một vấn đề ở mức độ tối ưu (tối ưu về tốc độ là chính). Nó cũng sẽ tích lũy một phần kiến thức vào kinh nghiệm lập trình.

Có những thứ ở cuộc sống rất là trừu tượng, khi mang nó vào biểu diễn trong lập trình thì phải nói là 1 thảm họa khủng khiếp. Vì bình thường ta chỉ khai báo các biến, sử dụng các hàm có sẵn để xài, vậy thôi.

Ví dụ: hệ thống bản đồ. Làm sao mà các lập trình viên có thể mô phỏng lại bản đồ trên máy tính, và có thể giúp ta tìm đường đi ngắn nhất giữa 2 địa điểm nào đó?

Google Maps là 1 ví dụ rất điển hình. Nếu ta chỉ khai báo biến, sử dụng các hàm có sẵn như nhập số, tách chuỗi, ghép chuỗi, v.v thì liệu có thể làm được điều này?

Cấu trúc dữ liệu giúp ta giải quyết vấn đề triệt để

Nhờ những cấu trúc, dữ liệu cơ bản như số nguyên, số thực, mảng, v.v người ta kết nối chúng, tập hợp lại (trong struct, class) rồi áp dụng một quy tắc hoạt động đặc biệt.

Vậy là có thể hình thành nên 1 cấu trúc dữ liệu. Từ đó giúp ta giải quyết vấn đề cực kì hay và ngọt, mà lại hiệu quả nữa.

Đi kèm với cấu trúc dữ liệu, đó là thuật toán. Cấu trúc dữ liệu quyết định thuật toán. Thuật toán giúp bạn tư duy tốt hơn. Bạn cần phải luyện tập nhiều với thuật toán.

Cảnh giới 5: Phương pháp lập trình Hướng đối tượng

Cảnh giới được nâng lên tối thượng hay không cũng là nhờ phương pháp lập trình Hướng đối tượng.

Khi có tư duy lập trình hướng đối tượng, bạn sẽ nhìn mọi vật, sự việc lên 1 tầm cao mới. Khác xa với con mắt của người bình thường.

Phương pháp lập trình Hướng đối tượng (PP LT HĐT) giúp bạn tiết kiệm thời gian, công sức. Bạn có thể tái sử dụng code, mở rộng phần mềm một cách nhanh chóng. Nếu áp dụng tốt phương pháp lập trình này và cấu trúc dữ liệu/thuật toán thì bạn có thể nói là rất vững cơ bản rồi đó.

Cảnh giới 6: Engine, framework, thư viện, đa nền tảng

Khi học, bạn học từ dưới đáy lên cao thì mới có thể đạt được cảnh giới. Khi bạn học ở trên rồi bạn đào sâu xuống dưới thì thường rất khó và gần như không thể.

5 cảnh giới trước là bạn đang ở đáy, và đến cảnh giới này là bạn bắt đầu học lên mức “ứng dụng thực tế”.

Bạn sử dụng các engine, framework, thư viện có sẵn để làm nên 1 chương trình hoàn thiện, có giao diện đàng hoàng, tung ra ngoài thị trường. Bạn có thể va chạm nhiều với MVC, MVP, XML, database, Windows Form, WPF, Kotlin cho Android, v.v

Tưởng tượng như 5 cảnh giới trước là bạn luyện nội công vững vàng. Thì ở cảnh giới này bạn học ngoại công để thể hiện ra ngoài.

Khi có nội công vững, ngoại công tốt thì thiên hạ nhìn vào biết bạn là cao thủ, thiên hạ khiếp sợ.

Học chuyên sâu cũng là một cách

Một số bạn học sâu thì lại có quan niệm khác. Các bạn học sâu thì đào xuống phía dưới chớ không lên trên. Bạn sử dụng các thư viện xử lý thread, xử lý va chạm Vật lý chẳng hạn. Đó cũng là một điều tốt.

Xa hơn nữa là bạn tính toán chuyện đa nền tảng. Làm sao bạn viết code 1 lần mà biên dịch được trên nhiều nền tảng Windows, Android, iOS, Linux… (với ngôn ngữ C/C++ chẳng hạn) ???

Cơ bản nhất là sử dụng macro. Sau đây mình sẽ minh họa khi bạn đạt cảnh giới macro. Mình sẽ lấy lại ví dụ về việc “nhập vào một số nguyên dương, kiểm tra xem đó là số đối xứng hay không”.

Mình đã chia sẻ kinh nghiệm từ khi nhập môn lập trình mà mình đã trải nghiệm lúc học lập trình cho người chưa biết gì. Hy vọng sẽ giúp ích được cho các bạn!

Đừng bỏ qua việc làm IT tất cả level có trên TopDev nhé!

1