người ta hỏi từ năm 2016 rồi anh ơi, chắc giờ lên master luôn rồi đó
Học thành thạo 1 ngôn ngữ mất khoảng thời gian bao lâu?
Forum sạch sẽ toàn những con người có tâm hồn đẹp không gây war nào các sếp. Mỗi người nhịn 1 tí đi nào
ôi sợ thật, thanh niên này đi làm bị sếp nhắc vài câu chắc bay vào múc ông sếp đó luôn quá ! hiu hiu …
chưa chắc trình độ bạn giờ đã bằng người ta đâu mà lên mặt ghê vậy. Đào mộ topic ngta từ tận mấy năm trước mới chập chững vào nghề để đánh giá hiện tại cũng ghê đấy hả bạn không não
Thôi nào. Không gây war nào các bác ơi. Forum học tập mà. Sao lại gây war vậy
:v, thanh niên lập gần chục topic đi than về cú pháp các ngôn ngữ đi khuyên người khác “cú pháp ngôn ngữ không khác biệt mấy”. Y như kiểu “ta sẽ dẫn ngươi đến kho báu mà ta không bao giờ có được” (Trích Agenger)
Hi Nguyên,
Cảm ơn cậu về câu hỏi của cậu. Cho phép tớ trả lời câu hỏi của cậu nhé!
Lưu ý: đây là câu trả lời dựa trên quan điểm cá nhân tớ. As usual, feel free to disagree and any contribution is welcome.
Tớ sẽ chia thành các mức nhé!
Beginner
Thông thường, để sử dụng 1 ngôn ngữ lập trình để viết chương trình, cậu cần:
- Học cú pháp viết 3 cấu trúc điều khiển: tuần tự, rẽ nhánh, lặp
- Học cú pháp khai báo biến, mảng
- Học cách build và run chương trình
- Học cách debug chương trình
- Học cú pháp viết hàm/chương trình con
- Naming convention của ngôn ngữ và coding standard. Nó quan trọng đấy, đừng đánh giá thấp nó nhé!
Với hiểu biết đó, cậu có thể viết chương trình sử dụng ngôn ngữ lập trình đó rồi.
Tùy vào kiến thức đã có, cùng với tốc độ học hỏi của cậu, cậu có thể mất khoảng một vài ngày tới 1 tuần (nhanh, khi cậu đã có nhiều hiểu biết về 1 ngôn ngữ khác) hay mất vài tháng tới cả năm (nếu cậu cảm thấy cần nhiều thời gian luyện tập).
Cậu có thể tự nhận mình biết ngôn ngữ này khi cậu đạt được những điều trên.
Intermediate
Tuy nhiên, để cậu sử dụng được ngôn ngữ hiệu quả, cậu cần thêm một chút kiến thức:
- Core library. Mỗi ngôn ngữ sẽ có hỗ trợ các core library, như collection, I/O, network…
- Cách tổ chức chương trình (ở mức cơ bản, không phải ở mức framework). Tùy mô thức lập trình (programming paradigm), hoặc ngôn ngữ lập trình, mà cậu có cách tổ chức chương trình khác nhau (trong C cậu có thể viết các thư viện con chẳng hạn).
Thường thì cậu có thể tìm thấy guideline ở các diễn đàn, hoặc đọc các chương trình do kỹ sư/lập trình viên chuyên nghiệp viết. - Học cách sử dụng các tính năng riêng biệt của ngôn ngữ ở mức cơ bản. Mỗi ngôn ngữ có 1 tính năng/cú pháp đặc biệt khác nhau.
- Học 1 số công nghệ liên quan tới ngôn ngữ đó ở mức basic. Tức là cậu có thể học 1 hay vài framework/library, hiểu ở mức có thể build/run/test/debug cơ bản.
Có thể có ý kiến cho rằng Framework/library không thuộc phạm trù ngôn ngữ lập trình. Ý kiến đó đúng, tuy nhiên, quan điểm cá nhân tớ thì ngôn ngữ lập trình là công cụ giải quyết vấn đề, vậy nên học cách sử dụng công cụ cũng đồng nghĩa với việc nên học những phần mở rộng của công cụ đó để sử dụng nó tốt nhất. Đó là lý do tớ đề cập tới framework/library ở đây.
Ở giai đoạn này, cậu sẽ cần rất nhiều thời gian để luyện tập. Rất nhiều người dừng lại ở giai đoạn này và không tiến tiếp, do đã nghĩ mình đã hiểu đủ dùng về ngôn ngữ này: viết được các tool, chương trình nhỏ, sử dụng được 1 vài thư viện và framework liên quan…
Tớ nghĩ mức này được tính là mức “thành thạo” mà cậu có đề cập tới, do ở mức này, cậu đã đủ kiến thức đi làm rồi. Thường cậu mất khoảng một vài năm để luyện tập ở mức này. Nếu như cậu có nhiều kinh nghiệm với các ngôn ngữ khác, nó có thể được rút ngắn đi rất nhiều.
Tớ có thể dừng lại ở đây, nhưng tớ sẽ đi tiếp thêm chút, coi như tư liệu tham khảo cho cậu.
Pre-advance
Ở mức này, thường cậu cần có nhiều hiểu biết hơn về ngôn ngữ đó.
- Best practice của ngôn ngữ. Mỗi ngôn ngữ có 1 design riêng, có 1 cách dùng tốt nhất riêng, sử dụng được ngôn ngữ ở mức này sẽ giúp cậu có khả năng design 1 chương trình tối ưu trên ngôn ngữ đó.
Có thể 1 số ý kiến sẽ đưa mục này ở mức Intermediate. Cá nhân tớ nghĩ, ở mức intermediate có thể biết 1 chút về best practice, nhưng chưa có nhiều trải nghiệm sử dụng nó ở mức intensive. - Kiến thức về compiler/interpreter/memory management/runtime environment… Với kiến thức này, cậu có thể đưa ra các solution để cải thiện performance cho hệ thống của cậu ở mức rất cao và sâu (tớ không nói là có hiệu quả không nha ).
- Hiểu biết sâu và rộng về các thư viện/framework. Điều đó có nghĩa là cậu có thể sử dụng được ngôn ngữ lập trình để hoàn thành rất nhiều task khác nhau.
- Các kiến thức về kiến trúc của ngôn ngữ mà cậu đang làm việc. Cậu có thể biết ở 1 mức nào đó.
Tớ cố gắng liệt kê nó theo cách generic nhất có thể, cover nhiều khía cạnh nhất có thể, tuy nhiên, tớ nghĩ với mỗi ngôn ngữ sẽ có những đặc trưng khác nhau, nên việc liệt kê ra những thứ chuyên sâu cho tất cả các ngôn ngữ sẽ tương đối khó.
Ở mức này, cậu đã có đủ kiến thức để tự gọi mình là specialist, có thể sử dụng ngôn ngữ lập trình để hoàn thành nhiều task khác nhau, có thể design 1 chương trình tốt, đồng thời có thể giải quyết đa số các vấn đề kỹ thuật trong khi implement sử dụng ngôn ngữ lập trình này.
Tuy nhiên, cũng khó có thể nói cậu có thể tham gia các dự án lớn có yêu cầu kỹ thuật phức tạp hay không, vì thực ra cậu cần nhiều hơn kiến thức về ngôn ngữ lập trình + các công nghệ đi kèm theo ngôn ngữ lập trình để giải quyết các yêu cầu kỹ thuật của 1 dự án lớn. Cơ mà tin tốt là nếu cậu ở mức này, cậu cũng thường đã có nhiều kinh nghiệm làm việc ở industry level, nên cũng thường có cả kiến thức chuyên sâu về cách xây dựng 1 hệ thống phức tạp rồi.
Ngoài ra, cậu cũng có thể bắt đầu tham gia đóng góp vào xây dựng ngôn ngữ lập trình/xây dựng các framework/library hỗ trợ cho ngôn ngữ đó ở mức này.
Về mặt thời gian, tớ nghĩ cậu có thể rèn luyện, thử thách bản thân từ 3 - 5 năm hoặc lâu hơn để đạt được mức này.
Advance
Disclaimer: Tớ không tự nhận mình có hiểu biết ở mức advance của bất cứ ngôn ngữ lập trình nào, thế nên những điều dưới đây có lẽ sẽ dựa trên những điều tớ quan sát được hơn là những trải nghiệm của tớ. Vậy nên, tớ sẽ rất biết ơn nếu có ai đó góp ý để tớ bổ sung thêm dưới đây.
Tớ cũng sẽ không đưa ra bất cứ list nào ở phần này, chỉ đưa ra mô tả chung chung để cậu hình dung được thôi.
Ở mức này, cậu sẽ có hiểu biết rất sâu về các ngôn ngữ lập trình, bao gồm cả từng thành phần trong kiến trúc của ngôn ngữ lập trình đó. Cậu đủ kiến thức để trở thành những người đứng đầu cộng đồng, những người có thể đưa ra các lời khuyên cho việc cải thiện và phát triển các tính năng mới cho ngôn ngữ lập trình.
Cậu có thể thiết kế ra những solution cho những vấn đề kỹ thuật phức tạp nhất (nói hẹp trên ngôn ngữ lập trình và các thư viện/framework đi kèm), đóng góp rất lớn cho business cũng như cho community.
Để đạt tới mức này, điều kiện cần là cậu có cả thập kỷ hoặc hơn, điều kiện đủ là cậu phải bỏ ra rất nhiều effort để học hỏi, rèn luyện.
Tớ hi vọng, với những điều tớ chia sẻ trên đây, sẽ giúp cậu có cái nhìn rộng hơn về quá trình học 1 ngôn ngữ ở các cấp độ.
Tớ không thể đảm bảo cho những điều tớ đưa ra là chính xác, nên một lần nữa, tớ luôn chào đón những đóng góp mang tính xây dựng, hi vọng nó là 1 tài liệu tốt cho mọi người tham khảo.
Hope it helps!
Bình tĩnh nào sếp ơiiiiiiiiiiiiiiiiiiii
nhìn ông lúc nào cũng trả lời có tâm ghê luôn á, đầy đủ rõ ràng <3
Em cảm ơn anh rất nhiều. Như anh nói mỗi ngôn ngữ đều có 1 tính năng riêng biệt để làm 1 việc khác nhau. Anh có thể lấy ví dụ cụ thể cho em 1 chút đc ko ạ. Giả sử như C hay C++ có thuận lợi gì và thường đc sử dụng làm gì ấy ạ. Em có đọc qua 1 số topic về việc dùng ngôn ngữ nào để viết app ngôn ngữ nào để viết game nhưng gần như ko ai nói tại sao lại thế cả.
Học theo đúng giáo trình trong trường đại học thì sẽ bắt đầu học với các ngôn ngữ back-end trước VD : java, C++,… bạn sẽ bất đầu làm hàng nghìn bài tập giải phương trình bậc 2, tính tuổi cha, tuổi con, tìm min max trong ma trận, mảng, … toàn bộ đều trên màn hình console, cả học OOP cũng demo trên màng hình console nốt khiến dễ chán nản, không biết học xong để làm gì. theo mình để không bị chán nản thì bạn nên học làm giao diện trước VD : học HTML, CSS để làm web tĩnh, học java Swing, fx để làm giao diện app, sau khi làm xong giao diện rồi bạn sẽ tự có động lực để học tiếp làm sao cho giao diện này hoạt động được, các button xử lý được từ đó học sâu hơn. newbie mới học mà làm ra được sản phẩm nhìn thấy được sẽ có hứng thú học hơn. Lúc đó bạn học vì nhu cầu bản thân cần học để nghịch, để tạo phần mềm cho mình dùng chứ không phải bị nhà trường ép buộc ! ahihihi
Hi Nguyên,
Tớ hiểu thắc mắc của cậu.
Thường những tính năng riêng biệt đó không nằm ở cú pháp, nó nằm nhiều hơn ở kiến trúc của nó (là outcome của ý đồ thiết kế ra ngôn ngữ đó).
Tớ sẽ lấy ví dụ:
- C và Cpp được thiết kế để dịch ra assembly và mã máy, điều đó khiến performance của chương trình build bằng C/Cpp rất tốt. Nếu cậu cần giải quyết các task liên quan tới tốc độ thực thi, cậu nên sử dụng 2 ngôn ngữ này. Ví dụ: hệ thống nhúng (cậu cần chương trình nhanh và nhẹ), 1 chương trình sort yêu cầu tốc độ tốt (cậu có thể viết phần sort bằng C và liên kết với chương trình bằng ngôn ngữ khác), hay hệ quản trị cơ sở dữ liệu, hoặc các game trên thiết bị di động (cần nhẹ và performance cao).
- Perl được thiết kế để xử lý text với tốc độ cao thay cho
sed
vàawk
, có bộ dịch được viết bằng C. Vậy nên những hệ thống xử lý trên text, như các hệ thống sinh email, hệ thống tinh chỉnh dữ liệu tài chính, hệ thống phân tích log và tạo cảnh báo khi có lỗi dựa trên log… thường được implement với Perl. - (1 phút cho quảng cáo) Java được thiết kế với tiêu chí “build once, run everywhere”, vậy nên các ứng dụng cần chạy trên đa nền tảng có thể được cân nhắc implement với Java. Ngoài ra, JVM của Java có tốc độ rất tốt, và Garbage collector của Java được implement với hiệu quả rất cao, do đó những hệ thống enterprise thường có back-end viết trên Java để tận dụng những điểm mạnh đó.
JVM của Java và lượng thư viện dồi dào của Java là lý do cho 1 số ngôn ngữ vẫn chạy trên JVM, như Scala, Groovy, Clojure, Kotlin (giờ đã có native)… - Javascripts được design để chạy trên browser với JIT compiler tốc độ cao. Đó là lý do cậu thấy ngôn ngữ này dominate trên browser.
- LUA script hay được sử dụng để làm game mobile một phần do tốc độ nhanh, bộ dịch của nó tương đối nhỏ để có thể đưa thẳng vào điện thoại. Nó cũng được sử dụng trên Redis với lý do tương tự.
Đó là 1 vài ví dụ để demo cho việc “mỗi ngôn ngữ có 1 tính năng riêng biệt”. Tớ nghĩ danh sách này có lẽ sẽ còn dài, hi vọng một ngày nào đó cậu có thể đóng góp thêm một số điểm nữa trong danh sách này, trong quá trình học tập của cậu
Hope it helps!
Pattern ở chủ đề này là 'Một người bình thường học chăm chỉ một lĩnh vực nào đó thì nó đều dễ ở thời gian đầu, bạn có thể đạt được nó trong thời gian rất ngắn. Nhưng khi lên cao bạn sẽ mất thời gian dài và có thể bị dừng lại quanh một điểm gọi là cực hạn của năng lực (limitation point).
Vì mức cực hạn của mỗi người là khác nhau, nên khó định nghĩa được khoảng thời gian bao lâu thì một người master 1 lĩnh vực.
Có 1 câu minh hoạ là: ‘100 dặm đường, đi 99 dặm mới đi được một nửa’. Ý nghĩa ẩn dụ ở đây là, 1 dặm cuối = 1 nửa nên về chất thì 1 dặm cuối ko giống 99 dặm đầu, nó khó hơn rất rất nhiều. Cũng có thể mở rộng dặm cuối tới vô hạn - tức để đi hết được 1 dặm cuối là ko có thước đo.
Giải pháp:
Bạn phải đảm bảo duy trì được tần suất học tập, ít nhất ko để nó bị thụt lùi là đc.
Học 1 phần vì đam mê và 1 phần vì góp phần xây dựng xã hội mới đúng chứ ạ
cảm ơn sếp nhiều nha
Tui nghi ông La biblioteca library là robot AI, các bạn có ai đồng ý hông? Người thật lên đây toàn xả rác, còn him không xả rác => robot
Hì hì,
Cảm ơn cậu nhé, tớ sẽ ghi nhận đó là lời khen
Cơ mà tớ cũng thi thoảng có trash talk ở 1 vài topic, nên tớ chưa phải robot AI rồi
Không ai say mà nhận mình say.
Không ai điên mà nhận mình điên.
Không AI nào nhận mình là AI.
Chắc là rơi vào khoảng 3 năm.