To learn a programming language in depth - Làm thế nào hiểu sâu một ngôn ngữ

Bài viết này nhằm mục đích chia sẻ cách mình học một ngôn ngữ được sâu hơn, đây là bài viết tiếp theo của bài viết “Cách mà tôi học một công nghệ mới”, bạn có thể đọc lại tại đây

Chú ý : Bài viết sẽ dùng ngôn ngữ C# làm ví dụ, các cách học ngôn ngữ khác bạn có thể áp dụng tương tự và có thể có những công cụ tương đương bạn có thể tìm hiểu thêm nhé!

Bắt đầu thôi!

Đầu tiên, phải nói là khi bạn biết một ngôn ngữ nào đó một cách căn bản rồi, bạn có thể đào sâu gốc rễ ngôn ngữ đó bằng cách tìm hiểu cách thức hoạt động phía sau của ngôn ngữ đó. Điều này sẽ giúp bạn có thể control ngôn ngữ này một cách dễ dàng hơn, bạn có thể đánh giá được hiệu năng, điểm mạnh điểm yếu giữa các ngôn ngữ, hay có thể nắm được một cách nhanh chóng khi ngôn ngữ đó update version thêm một vài features mới mỗi năm.

Thường thì sẽ có 2 cách học, học theo chiều ngang và học theo chiều sâu. Việc bạn nắm bắt được rất nhiều công nghệ, hay nhiều thành phần của một công nghệ (học theo chiều ngang) sẽ giúp bạn hiểu rộng hơn, hiểu được bức tranh lớn một cách tổng quát, đánh giá nhanh được công nghệ trước khi dấn thân vào học cũng như sử dụng. Tuy nhiên đến một thời điểm nào đó bạn nên tập trung vào một công nghệ nào đó được cho là bạn yêu thích nhất, đào sâu tường tận gốc rễ của nó (học theo chiều dọc), điều này sẽ giúp cho bạn đạt một cảnh giới thượng thừa, từ đó master và đi lên với chính công nghệ đó trong công việc cũng như quyết định tương lai của bạn. Cách học này mình đặt tên cho nó là học theo kiểu chữ T, mình nghĩ học mở rộng trước rồi sau đó đi sâu vào một thứ nắm thật chắc nó thì sẽ giúp bạn có thể đứng vững dễ dàng hơn trong công việc.

Quay lại vấn đề cách mà mình tìm hiểu những insight trong một ngôn ngữ như sau:

Đối với C# chẳng hạn, mình thường lên trang https://referencesource.microsoft.com/ để đọc code core của C# cũng như .Net. Điều này giúp mình hiểu được style code, hay bản chất thực sự của các thư viện hay framework mình sử dụng. Đôi khi mình còn học được cả cách học handle exceptions (những trường hợp ngoại lệ nữa). Từ đó khi sử dụng mình có thể biết được những trường hợp nào thư viện giúp mình check (kiểm tra) những trường hợp nào thư viện bỏ sót để mình có thể hiểu và vá được những limitation của thư viện hay framework đó.

Ví dụ trong hình, mình sử dụng thư viện System.Web với hàm DataConnection khi tra reference thì mình nhìn thấy họ handle trong class DataConnectionHelper là một hàm static với cách kiểm tra userName và domainName như thế nào, hiểu được họ chỉ validate độ dài userName và domainName là 256 ký tự thôi, vậy đặt trường hợp lớn hơn hoặc nhỏ hơn số ký tự đó thì sẽ xảy ra vấn đề gì. Khi gặp một ký tự đặc biệt hay ký tự encoding như tiếng nhật thì nó có văng exception không? Từ đó khi sử dụng thư viện này mình phải suy nghĩ có nên handle những trường hợp ngoại lệ cho những case này không?

Bên cạnh đó, mình có thể tìm hiểu được tính năng mới của net framwork 4.7 khác gì 4.8, C# 6.0 khác gì C# 9.0 khi nó mới công bố xuất bản.

Công cụ thứ 2 mà mình dùng để học code behind đó là LinqPad (https://www.linqpad.net/). Đây là một công cụ có thể giúp bạn dịch ngược đoạn code của bạn sâu tận bên trong đến cả ngôn ngữ máy. Nó hiển thị theo dạng cây rất dễ nhìn và trực quan. Phân tích syntax khá hay họ giúp bạn hiểu tường đoạn mà bạn viết ngôn ngữ bậc cao xuống đến tầng biên dịch. Bạn có thể dump tất cả đoạn code bạn đọc được ở đâu đó xem nó hoạt động như thể nào từ đó hiểu và nắm sâu hơn cách thức hoạt động.

Ngoài việc phân tích code ra thì công cụ ngày còn có thể chuyển những đoạn code Linq mà bạn code ở ngôn ngữ bậc cao sang dạng T-Sql mà tầng cơ sở dữ liệu thực thi (Điều này giúp bạn dễ dàng viết code Linq hơn và tối ưu hơn khi so sánh các cách chạy và build câu query ở tầng ORM như thế nào là đạt.

Tất cả đều có ví dụ ngay chính trên công cụ này. Còn một điều nữa là mình thường dùng nó để kiểm tra đoạn code của bản thân đã tối ưu hay chưa bằng cách benchmark đo hiệu năng của block code của bản thân.

Cách học cuối cùng của mình chính là qua sách, bạn có thể tìm ngay trên chính công cụ trên cũng gợi ý sách cho bạn đọc miễn phí, hoặc bạn có thể tìm kiếm các ngôn ngữ gắn thêm cụm từ “Depth”, “Nutshell” và có thể học một cách bài bản chính thống sâu xa tận gốc rễ của một công nghệ nhé

Trên đây là cách học sâu của bản thân mình, hi vọng có thể giúp ích được phần nào giúp bạn. Nếu bạn có thêm cách học nào mới thì có thể để lại dưới phần bình luận bên dưới nhé!

Tham khảo thêm các ngôn ngữ khác:

Javascript: https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide/In_depth

Java: https://docs.oracle.com/javase/9/docs/api/overview-summary.html

C/C++: https://www.cplusplus.com/reference/

#ntechdevelopers

8 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?