Chuyện học ngôn ngữ của chàng trai 28 tuổi thông thạo 10 thứ tiếng
Bài đăng này đã không được cập nhật trong 2 năm
Một câu chuyện về tấm gương hiếu học của chàng trai không phải thủ khoa cũng chả phải thần đồng nhưng vẫn có thể học được 10 thứ tiếng trôi chảy (nhờ tài bốc phét kinh thiên động địa dưới đây).
First things first
Xin chào các bạn, và mình vẫn là Minh Monmen, chàng trai 28 tuổi thông thạo 10 thứ tiếng mà lều báo vừa giật tít ở trên đây. Chỉ tiếc là 10 thứ tiếng này hông phải ngoại ngữ (vì ngoại ngữ mình rất kém, chỉ biết tiếng Anh cơ bản thôi) mà là 10 ngôn ngữ lập trình. Tất nhiên là nếu chỉ xét cái gọi là ngôn ngữ trong ngành công nghệ này thì nó nhiều lắm, từ ngôn ngữ biểu diễn (markup language), ngôn ngữ lập trình (programing language), ngôn ngữ truy vấn (query language),... nên kể ra hết thì cũng hơi vô duyên. Ở đây mình sẽ chỉ kể lại 10 ngôn ngữ lập trình mà mình đã học và quan trọng hơn là tại sao mình lại học nó cũng như học nó để làm gì.
Bài viết này không chứa nhiều kiến thức công nghệ mà chỉ là trải nghiệm cá nhân và những điều mình đã học được thôi nhé.
Mối tình đầu Pascal
Mình biết tới Pascal từ năm lớp 6, khi trường Ams đưa lập trình vào giảng dạy cho học sinh cấp 2 một cách khá nghiêm túc. Đây là lần đầu tiên mình biết tới lập trình, và cũng là lúc mình bắt đầu có ước mơ trở thành lập trình viên.
Ước mơ này serious nhé, cuối năm lớp 6 mình còn viết hẳn 1 bài văn tưởng tượng mình về thăm trường 20 năm sau khi tốt nghiệp, khi đó mình bước xuống từ chiếc xe Camry và đang làm lập trình viên cho một công ty ở Đức. (Giờ cũng gần 20 năm trôi qua rồi mà mình chỉ làm được lập trình viên thôi còn công ty Đức với cả xe Camry đâu thì chưa có thấy ).
Chính vì serious nên mình học tập khá đàng hoàng, không lấy lệ cho qua như các bạn nên cũng thường xuyên trở thành người làm bài cho cả lớp chép. Có thể là với các bạn khác thì Pascal khá khô cứng, không có gì hay ho mấy nên dù có thích lập trình cũng chưa chắc đã thích Pascal đâu.
Mình cũng không phải ngoại lệ. Tuy nhiên mình cũng có một sở thích khác là môn âm nhạc và nghe piano. Mình thích đàn piano và thích cảm giác ngồi đánh đàn piano như một nghệ sĩ (mặc dù từ bấy tới giờ cũng chưa bao giờ học đàn) nên lúc nào cũng ước có một cây piano để nghịch. Và Pascal là ngôn ngữ đầu tiên biến ước mơ đánh piano của mình thành sự thật. Mình đọc được một bài tập Pascal về việc tạo một phần mềm dùng các phím chữ cái để tạo ra âm thanh theo từng nốt nhạc. Từ đó mình đã mày mò học hết mọi thứ về Pascal chỉ để tạo ra phần mềm đánh piano đó, ngoài ra còn tạo ra rất nhiều phần mềm khác tự động chơi nhạc theo các bài nhạc trong sách nhạc luôn.
Đây là lần đầu tiên mình lồng ghép được một sở thích cá nhân vào môn học, nên cảm giác học mọi thứ đều cực kỳ có hứng thú. Pascal cũng là ngôn ngữ lập trình có tính chặt chẽ rất rất cao, nên 4 năm học Pascal giúp mình luyện được thành thạo những mảnh ghép cơ bản của lập trình như biến (var), hằng (const), thủ tục (procedure), hàm (function), các lệnh điều khiển (if else, loop,...) và tư duy lập trình (luồng chương trình chạy ra sao, debug thế nào,...).
Nếu bạn nào sau này theo IT mà không trải qua thời gian học kỹ về những thứ này qua Pascal hay C++ thì khi bước vào công việc sẽ ít nhiều bị ngợp, kiểu chỉ trôi theo hướng dẫn chứ ít khi có khả năng chuyên sâu như static analysis (hiểu phần mềm mà không cần chạy) hay advanced debugging,... Khi làm cũng ít nhiều bị sót các trường hợp cần xử lý trong code nữa.
Cơ duyên với Visual Basic
Sau Pascal thì mình biết đến Visual Basic (VB). Cái này thì cũng là mình tự học thôi chứ không phải được học ở trường nữa. Khoảng năm lớp 9 là lúc mình bắt đầu chán cái màn hình xanh xanh dở hơi của Pascal rồi, cũng kiểu làm được sản phẩm về đồ họa (game rắn săn mồi, bóng nhảy), sản phẩm âm thanh (phần mềm chơi piano, play nhạc mono). Kiểu lên đến đỉnh cao rồi mình bắt đầu có ước muốn làm một phần mềm có giao diện người dùng xịn xò trên win chứ không phải trên dos nữa.
Sau kha khá thời gian tìm hiểu thì mình bắt đầu học Visual Basic 6.0 trong bộ Visual Studio. Tất nhiên là trong bộ này thì vẫn còn 1 ngôn ngữ khác là Visual C++ nữa nhưng mình thích Visual Basic hơn vì cú pháp của nó phần lớn là từ khóa chứ không phải ký hiệu. Với 1 người dành 4 năm học Pascal thì vẫn là quen thuộc với cú pháp từ khóa hơn là mấy cái dấu ngoặc ngoặc khó nhìn của họ nhà C.
Ôi cái cảm giác đang code mấy cái chương trình đời Tống trên màn hình đen ngòm của pascal, rồi tự tưởng tượng ra menu các kiểu mà chuyển sang kéo thả winform từ button tới menu rồi checkbox nó thật sự là phê chữ ê kéo dài các bạn ạ. Cảm giác mở ra 1 chân trời mới và làm được những thứ mình sử dụng hàng ngày luôn vậy. Tất nhiên là mình không có học chay mà thường có một mục đích để vừa học vừa làm một cái gì đó luôn. Chắc nếu mà các bạn biết đến cái kẹp ghim này thì cũng có tuổi thơ dữ dội phết này:
Và phần mềm đầu tiên với tên gọi là Monmen Animation Studio (MAS) là một phần mềm cho phép tạo ra các kịch bản animation từ thư viện các nhân vật animation có sẵn của Microsoft. Các nhân vật sẽ được lên kịch bản hành động, nói, di chuyển,... để tạo ra một thông điệp nào đó (mà phần lớn là dùng để tỏ tình với bạn gái).
Tất nhiên là người dùng của mình khi đó khá hạn chế, chỉ có mình và một vài đứa bạn mình share chơi chơi thui. Nhưng việc làm một sản phẩm từ A-Z đã giúp mình không chỉ học được về thiết kế giao diện, lập trình hướng sự kiện mà còn cả các công đoạn bên lề như đóng gói phần mềm, tạo bộ cài đặt, tạo file portable,... Nói chung là tất cả mọi việc để phần mềm của bạn tới được tay người dùng. Sau MAS thì mình trải qua một thời gian khá dài không nghĩ ra gì để làm. Kiểu cảm giác mình có thể code được rồi nhưng chưa tìm được idea nào để làm nó bị bứt rứt khó chịu lắm ấy, giống như mình sống chả có cái mục đích gì vậy.
Phần mềm thứ 2 thì là 1 phần mềm về quản lý password (tương tự 1Password hay Lasspass, Keepass bây giờ ấy), mình học về local db, bảo mật, mã hóa rồi can thiệp process đang chạy các kiểu luôn:
Phần mềm thứ 3 và cũng là cuối cùng với Visual Basic thì hoàn thiện hơn, phần mềm này được mình code trên VB.NET trong thời gian đang là sinh viên. Xuất phát từ nhu cầu cập nhật điểm số, tính điểm lấy bằng từ trang QLDT chậm chạp của nhà trường, mình đã tìm hiểu và tạo ra QLDT Toolkit - một phần mềm cho phép tự động lấy các thông tin về lịch học, lịch thi, điểm tổng kết các môn, quản lý và đặt mục tiêu học tập,... dành cho sinh viên KTQD (NEU).
Version 1:
Version 2:
Version 3:
Thật sự là cho tới khi làm QLDT Toolkit thì mindset về lập trình và làm sản phẩm của mình mới hình thành một cách nghiêm túc. Trải qua mấy năm phát triển, mình đã cho ra đời 3 version lớn (và hàng chục bản vá), có tới hơn 20K lượt download trên mediafire và hơn chục ngàn người dùng là sinh viên NEU. Lúc ấy mình vừa phải học thêm code, vừa nghĩ thêm tính năng, vừa quảng bá ứng dụng trên các hội nhóm sinh viên, vừa tiếp nhận và xử lý ý kiến của người dùng,... Có lẽ đây là quãng thời gian mà mình cảm thấy có sức sống và mục đích nhất trong quãng đời sinh viên ngắn ngủi (có hơn 3 năm) của mình.
Làm ra một sản phẩm đã khó, nhưng làm ra một sản phẩm được người dùng đón nhận còn khó hơn rất nhiều. Khó nhưng mà xứng đáng lắm nhé, QLDT Toolkit của mình bắt đầu chỉ từ một file Excel nhưng đã dẫn mình qua nào là framework VB.NET mới, rồi crawler, inline browser, HTTP request, Database, read/write file, UI/UX, ... và nhiều thứ khác. Ngoài ra thì nó còn giúp một sinh viên kinh tế suýt lạc lối như mình nhìn được rõ bản thân mình là ai, mình mạnh điều gì và có thể làm điều gì nữa.
Duyên nợ với PHP
Mình đến với PHP từ khoảng lớp 10, hồi đó thì các diễn đàn (forum) đang rất thịnh hành chứ làm gì đã tới lượt mạng xã hội như facebook đâu. Mình muốn tạo ra một diễn đàn dành riêng cho lớp mình nên đã mày mò tìm hiểu về vBulletin (mã nguồn diễn đàn phổ biến nhất hồi đó), rồi tìm hiểu cách setup 1 trang web, hosting, domain,... Lúc đó thì cũng chưa học PHP hẳn hoi đâu mà chỉ là xem 1 số cú pháp PHP cơ bản để có thể sửa được config và giao diện của vBulletin thôi. Cái mà mình học được nhiều nhất khi đó là việc làm sao để một trang web hoạt động, từ việc đăng ký hosting cho tới đăng ký domain, rồi config database mysql, upload bằng ftp,...
Tính ra thì mình cũng deploy năm bảy cái forum khác nhau cho lớp, cho trường, cho 1 ban nhạc nghiệp dư mà mình không hề quen biết trong tận HCM (anh em trong ấy cứ mời mình vô chơi suốt để cảm ơn). Rảnh rỗi thì lại nghiên cứu thêm nhạc nền, tuyết rơi bằng HTML, đổi theme, tạo chatbox, ranking, top board,...
Mặc dù làm hết vBulletin tới phpBB nhưng khéo kiến thức PHP của mình còn chưa đủ để viết một cái for loop. Mãi cho tới năm cuối đại học, khi bắt đầu triển khai version 4 cho QLDT Toolkit, cũng chính là phiên bản web không cần download thì mình mới học PHP một cách tử tế và làm một sản phẩm hẳn hoi chứ không phải chỉ cài cắm config. Mặc dù con web QLDT toolkit của mình khi đó code rất tù, nhưng điều mà mình cảm thấy tự hào nhất là việc nó vẫn có tới hơn chục ngàn người dùng. Và cứ mỗi mùa thi xong là số lượng người dùng lại tăng đột biến khiến mấy cái hosting miễn phí của mình cứ chết lên chết xuống. Cảm giác đợt đó mình phải đăng ký tới 30 cái tài khoản hosting free ở mấy chục nhà cung cấp khác nhau để có thể deploy lại web mỗi khi nó chết.
PHP lúc đó là một ngôn ngữ gần như làm bá chủ trong việc làm web. Từ các sản phẩm deploy sẵn như vBulletin, phpBB, wordpress, drupal,... cho tới việc support của hosting. Lựa chọn học PHP với mình cũng là từ những sản phẩm mà mình làm ra thôi. Sau này đi làm thì công việc đầu tiên của mình cũng là với PHP, nhưng nghiêm túc và chuyên nghiệp hơn nhiều so với những thứ mình tự làm trước đây.
Cho tới hiện tại thì dù mình không còn code chính PHP nữa nhưng PHP vẫn xuất hiện trong rất nhiều thành phần sản phẩm mình làm (phần lớn là CMS do tốc độ code CRUD và admin dashboard rất nhanh). Thế nên thi thoảng mình vẫn phải đá qua đá lại PHP tý với anh em đấy chứ không bỏ hẳn PHP được đâu.
C++, C# và Java
Mình học họ nhà C (C++, C#) và ông lớn Java trong thời gian học Aptech. Đây cũng là những ngôn ngữ mình không học vì mục đích làm sản phẩm như mấy ngôn ngữ trên mà chỉ là trong chương trình học có thì học thôi. Tuy nhiên vì mình đã trải qua việc làm một sản phẩm thực tế và học ngôn ngữ chỉ vì sản phẩm rồi nên hiểu được rằng đây là cơ hội rất quý giá để mình có thể học lại những điều cơ bản từ đầu. Nếu là một người chưa làm sản phẩm, bạn có thể thấy việc luyện mấy bài toán kiểu cộng trừ nhân chia, tìm nghiệm phương trình, hay 10 bài code thiếu nhi là chả có ý nghĩa gì mấy. Nhưng với mình thì khác, mình gần như là người duy nhất làm mọi bài tập về C++ mà mình gặp để nâng cao khả năng code và tư duy logic của mình.
Java thì rõ ràng là để mình có mindset về OOP rồi. Mình cũng gần như không làm sản phẩm nào bằng Java cả (trừ cái đồ án tốt nghiệp quản lý thư viện =))). Đơn giản là vì có một cảm giác khá là không hợp với ngôn ngữ này. Nó kiểu nặng nề quá, rồi kiểu cách rườm rà quá. Các bạn có thể đọc thêm về cuộc trốn chạy của mình với Java ở đây: Tôi và hành trình trốn chạy khỏi... Java
Còn C# thì là một ngôn ngữ điển hình của việc xử lý đa luồng. Mình cũng tin rằng kiến thức về multi-threading là điều cần chú ý nhất với ngôn ngữ này, và đây cũng là kiến thức mình tập trung học nhiều nhất khi học C#. Làm sao để xử lý 1 event mà không bị blocking main thread (hay là làm treo giao diện)? Oimeoi mind blown luôn ạ. Cảm giác cái đầu óc đơn luồng của mình nó chưa đủ thread để thẩm thấu được mấy cái kiến thức đa luồng phức tạp ấy. Cho nên sau khi đi tham quan 1 công ty cũng làm C# là Kiotviet thì mình cũng từ bỏ việc phát triển sự nghiệp với ngôn ngữ này.
Đùa thôi, mình không thích theo C# đơn giản là vì code trên Windows với thằng Visual Studio nặng trịch. Xài Linux 2 năm thấy hết muốn về win rồi nên cũng không có hứng theo C# luôn.
Một thoáng python
Sau PHP, ngôn ngữ tiếp theo mà mình học để làm Backend phải kể đến Python. Lúc đó mình đang làm một dự án xử lý dữ liệu lớn cho Appota, và dù có bịt tai thì cũng phải nghe được anh em đồn thổi về việc Python tốt như nào trong các tác vụ xử lý dữ liệu và crawl. Anh sếp của mình khi đấy mặc dù code iOS nhưng lại là một vọc thủ chính hiệu, chuyên nghịch ngầm với crawler (hồi đấy anh còn chỉ mình 1 chiếc crawler xvi****.com của ảnh cơ). Thế là mình bắt đầu học python để làm 1 hệ thống ETL (Extract-Transform-Load) dữ liệu từ các DB hoạt động về DB analytic (Chính là hệ thống trong bài viết này: Hệ thống analytic "sương sương" từ dữ liệu 30 triệu người dùng)
Với cú pháp khá dễ hiểu và dễ tiếp cận, cùng với việc cũng quen với việc học nhiều ngôn ngữ lập trình rồi nên mình chỉ mất 1 thời gian ngắn để làm quen và bắt tay vào code hệ thống job chạy ngầm với python luôn. Điều mà mình cảm thấy khó chịu nhất khi làm việc với python đấy là việc handle string với các ký tự đặc biệt và các ký tự có dấu của các ngôn ngữ thật sự là rất tù. Kiểu cảm giác mình phải để ý tới cái encode character hơi nhiều (trong khi các ngôn ngữ khác phần lớn là handle tự động). Cộng thêm với việc mình khá chỉn chu trong việc format code tự động và có style code khá tường minh, do đó nhìn thằng python nó format các block code chỉ bằng tab thì thấy khó chịu vô cùng, kiểu cảm giác không yên tâm lắm khi mà chỉ cần lỡ tab 1 cái hay bỏ tab 1 cái là đoạn code đã có 1 ý nghĩa khác (trong khi các ngôn ngữ có ngoặc ít khi bị kể cả là viết dồn hết vào 1 dòng).
Nếu đọc code python của mình thì các bạn sẽ thường thấy mình viết kiểu này:
Rất là nhiều từ khóa pass
đúng không? đây là cách để mình đánh dấu hết hàm, hết for, hết if để nhìn code cho dễ chứ không nó cứ díu vào nhau à. Mà đây còn là mình đang đặt tab là 4 space đó nhé, các bạn đặt 2 space nó còn díu vào nhau nữa cơ.
Tất nhiên là học python mình cũng chỉ tập trung vào 2 cái mà thời đó nó nổi nhất, 1 là SQLAlchemy dùng trong job ETL của mình, và 2 là scrapy dùng để crawl dữ liệu. Thế nhưng khi dữ liệu của mình càng phát triển, các field với kiểu dữ liệu càng phức tạp, có nhiều ký tự lạ, unicode, null,... thì đoạn ETL bằng python của mình càng ngày càng lỗi nhiều. Thế là mình bắt đầu nung nấu ý tưởng về việc tái cấu trúc ETL bằng 1 ngôn ngữ khác.
Javascript for backend với NodeJS
Mình biết đến Javascript thì tất nhiên là từ hồi lớp 10 khi bắt đầu dựng forum rồi. Thế nhưng gọi là học hành tử tế về Javascript (JS thuần ấy) thì phải đến thời gian mình đi học Aptech. Hồi đó kỳ đầu được học HTML CSS JS nên cô giáo đưa cho bọn mình 1 trang web học basic cực kỳ hữu ích là Codecademy. Các khóa học trên trang này thì chủ yếu theo hướng vừa học vừa tương tác với code để hoàn thành các bài học nên rất dễ hiểu và dễ nhớ. Mặc dù đối với những bạn đã học quen ngôn ngữ lập trình thì học theo Codecademy bị hơi chậm, nhưng đối với những newbie chưa biết gì thì nó cực kỳ dễ tiếp cận vì được thiết kế step by step.
Các bạn cứ học thử mà xem, mặc dù chậm nhưng mà rất chắc. Những thứ các bạn học được về fudamental của ngôn ngữ sẽ trở thành kiến thức theo bạn mãi mãi luôn. Cũng nhờ học trên đó mà mình học JS tương đối chắc, từ những cú pháp cơ bản cho tới những concept phức tạp về đơn luồng, event-loop, async await hay promise - vốn là những kiến thức rất khó mà có khi hỏi một bạn làm mấy năm với js cũng chưa chắc đã hiểu rõ.
Mặc dù biết làm JS từ thời jquery các kiểu, nhưng mình chỉ có cơ hội làm NodeJS khi team analytic của mình có thêm 1 anh senior NodeJS tham gia. Mặc dù tham gia dự án không lâu nhưng ông anh này đã dùng NodeJS khắc phục được ngay điểm yếu trong hệ thống ETL bằng python của mình là việc không quản lý được cronjob và thường xuyên gặp vấn đề với character encoding. Lúc này hệ thống ETL version 2 chạy bằng NodeJS của mình và ảnh ra đời. Với việc dùng 1 thư viện queue rất nổi tiếng của Node khi đó là kue, cùng với character encoding được handle một cách tự động thì việc viết các job ETL mới của tụi mình rất đơn giản.
Có thể chỗ này các bạn sẽ thắc mắc lựa chọn của mình khi Python vốn được áp dụng nhiều cho các hệ thống xử lý dữ liệu, còn Node thì không do thằng Node không mạnh về tính toán như python mà chỉ mạnh IO đúng không. Không sao nhé vì job ETL của mình gần như không có việc tính toán mấy mà chủ yếu làm việc về IO khi phải kéo data từ chỗ nọ qua chỗ kia, có biến đổi thì cũng nhẹ nhàng tình cảm thôi nên là Node vẫn xử lý tốt nhé.
Thế nhưng việc dùng NodeJS của mình vẫn chỉ dừng lại ở background job, còn đâu các hệ thống API hay Web thì vẫn dùng PHP. Phải mãi cho tới khi mình chuyển sang công ty thứ 2, được giao trọng trách xây dựng một hệ thống thương mại điện tử theo mô hình Micro-services thì mình mới thật sự bỏ PHP để sang code fulltime với Node. Đây là lựa chọn rất khó khăn đối với mình bởi đây là lần đầu mình chuyển công việc khi đã có 2 năm kinh nghiệm chuyên sâu với PHP trong nhiều hệ thống mà giờ phải bắt đầu lại từ con số 0 với một stack công nghệ mới (gần như) hoàn toàn.
Động lực duy nhất để mình lựa chọn từ bỏ PHP và học lại từ đầu là vì khi đó mình bắt đầu biết tới Micro-services, docker và kubernetes. Đó là thời đầu 2018 khi mà Micro-services mới chỉ là một kiến trúc mơ hồ còn kubernetes chỉ là một từ khóa xa lạ. Thế nhưng vì mình không chỉ làm dev mà có học thêm cả ops nên mình hiểu rõ docker và k8s sẽ là nền tảng triển khai ứng dụng của tương lai, và PHP trong môi trường container và phân tán không còn phù hợp nữa khi vừa nhiều thành phần, lại vừa không đáp ứng đủ performance. Và mình đã bắt đầu con đường micro-services của mình với NodeJS.
Một số điểm mình thích khi làm việc với NodeJS:
- Đủ nhanh để đáp ứng các hệ thống từ nhỏ tới lớn (lớn vừa vừa =)))), tham khảo thêm bài nè của mình nè: API NodeJS của tôi đã handle peak traffic như thế nào?
- Đủ gọn nhẹ để chạy với container: không bị cài đặt môi trường phức tạp như PHP, ngoài ra cũng chạy app với process chính phù hợp với container
- Đủ flexible để đáp ứng các hệ thống có business phát triển nhanh: Tức là khi các bạn cần thêm 1 feature mới, 1 field mới,... hoặc datatype của các bạn ban đầu hơi hỗn loạn thì node đáp ứng rất tốt mà không cần tốn quá nhiều công sửa code. Đây là điểm khá giống với PHP về tốc độ phát triển.
- Cộng đồng đủ to (nếu không muốn nói là to nhất) để bạn muốn làm gì cũng có thằng đã làm sẵn thư viện cho cái đó rồi.
Vũ khí bí mật Golang
Mình khá happy với NodeJS trong phần lớn các bài toán mà mình có động vào. Từ nhỏ tới to, từ monolithic tới microservice, từ triển khai VM cho tới K8S. Thế nhưng mình vẫn quyết định học thêm Golang. Không phải vì golang nó là ngôn ngữ hot trend mới nổi mà vì khi làm với các hệ thống lớn thì sẽ phát sinh ra rất nhiều bài toán đặc biệt mà mình không thể giải quyết bằng NodeJS (hoặc giải quyết được nhưng không hiệu quả).
Các bạn có thể đọc thêm bài viết này để hiểu mình đã dùng golang vào việc gì:
- Bài toán "Super fast API" với Golang và Mongodb.
- Nghệ thuật xử lý background job phần 3: Push hàng triệu notification mỗi giờ
Nôm na là mình đã gặp những bài toán về logic thì rất đơn giản, nhưng cần đáp ứng performance rất cao và tải rất lớn. Khi này thì những ưu điểm của NodeJS như flexible, phát triển nhanh, async io,... không phát huy được quá nhiều tác dụng. Mình cần một ngôn ngữ theo hướng compiled, có khả năng đáp ứng tải cao với tài nguyên thấp. Và tất nhiên Golang hiện lên như một ứng cử viên vô cùng sáng giá.
Quá trình học golang của mình thì khá nhanh, cũng trong vài ngày thôi và mình bắt tay vào xây dựng 2 service phía trên luôn. Tất nhiên là khi bạn có mindset của 8 ngôn ngữ khác rồi thì học một ngôn ngữ mới khá nhanh thôi. Mình lướt qua 1 vòng Go tour để nắm về cú pháp và các kiểu dữ liệu cơ bản, sau đó chủ yếu tập trung tìm đọc về các best practice và code style của go để dựng 1 project go đúng chuẩn. Tất nhiên là ban đầu thì gần như mình bê nguyên cấu trúc project NodeJS của mình sang Go với tên gọi và cách tổ chức các thành phần giống nhau hoàn toàn. Deadline dí tên lửa vào mông mà không làm thế sao nhanh được. Tuy nhiên sau vài dự án golang, cùng với việc được một người anh làm go khá đỉnh chóp ở LineVN chỉ cho mấy đường cơ bản thì mình đã hiểu được kiến trúc của Go hướng đến sự đơn giản, không có mấy thứ OOP hay interface, abstraction lằng nhằng mà tập trung vào implement trực tiếp để tối ưu performance.
Golang cũng có một điểm yếu mà mấy người mới học không biết, chính là nếu dùng Go để làm web bình thường thì cực kỳ vất vả =))) Nhất là với những project có logic phức tạp lại phát triển nhanh thì dev bằng Golang rất là cực luôn. Cứ thử làm mấy cái CRUD các thứ với Go mà xem. Đến cả lấy result từ DB cũng phải tự binding bằng tay chứ không có tự động sẵn đâu nhé =)). Phần vì nó là ngôn ngữ có static typed, phần vì nó phải compile ra binary nên code của bạn sẽ không thể flexible và phụ thuộc runtime như NodeJS được. Tất nhiên đây cũng là điểm mạnh của nó, khi hạn chế ít lỗi runtime hơn vì check từ khi build, nhưng với mình thì code hardcore như thế sẽ phù hợp hơn với những bài toán đơn giản cần performance cao mà thôi.
Chính vì vậy Golang được xếp vào hàng vũ khí bí mật của mình, tức là chỉ mang ra xài những khi thật sự cần thiết thôi chứ không phải cứ bạ đâu cũng mang ra xài các bạn nhé. Mình thấy có rất nhiều bạn mới vào nghề bị các trung tâm dạy golang dụ dỗ dùng Go thì mạnh thế này xịn thế kia, rồi học Golang xong là mọi bài toán đều mang ra xài. Bull shit thôi, Golang nó nhanh thật đấy nhưng chỉ khi người dùng nó (chính là các bạn đấy) có kinh nghiệm code tốt và tối ưu thôi, kiểu ô tô chỉ chạy nhanh khi có người biết lái, chứ còn các bạn không biết lái mà phải đẩy xe thì sao nhanh bằng đi xe đạp được.
Nếu các bạn muốn bắt đầu với Micro-services hay docker, k8s thì mình nghĩ học NodeJS sẽ là cách tiếp cận phổ thông và hiệu quả hơn. Hãy để dành Golang cho những bài toán thật sự cần nó. Nhé!
Ngôn ngữ thứ 10: Tiếng AI
Chỗ này thì mình không kể thêm các ngôn ngữ khác mà mình biết kiểu bash bủng nữa mà sẽ đề cập tới 1 ngôn ngữ của tương lai mà mình vẫn đang học: Tiếng AI, tức là ngôn ngữ để đối thoại với AI.
Chắc anh em cũng biết sự bá đạo của ChatGPT trong những ngày gần đây về việc nó thông minh và hiểu biết ra sao, kể cả là về kiến thức thông thường hay chuyên môn công nghệ mà cụ thể là code. Mình cũng nhận thấy điều đó, và nhận ra tương lai đây sẽ là sự thay thế khá đáng kể cho nhiều công việc mình đang làm. Cái mà mình cần học để thích nghi bây giờ chính là cách diễn đạt một bài toán, một vấn đề một cách cụ thể sao cho con AI nó hiểu được và nó làm giúp mình đúng cái mình cần. Việc này cũng giống như hồi xưa mình học ngôn ngữ Google để có thể tìm kiếm một cách hiệu quả những vấn đề mình gặp phải vậy.
Hôm qua mình đã nhờ nó viết cho mình 1 chiếc status để đăng lên Facebook, và đây có lẽ đúng là suy nghĩ của mình.
Tổng kết
Như các bạn đã thấy, mình đã trải qua vô số ngôn ngữ lập trình. Mỗi một ngôn ngữ đều được mình học với mục đích xác định và áp dụng luôn chứ không phải chỉ học chơi chơi để đó. Việc này cũng giống như việc bạn đọc sách vậy. Phải có mục đích thu được điều gì từ cuốn sách thì các bạn mới có thu hoạch, còn không thì quyển sách đó cũng chỉ lướt qua mà chẳng đọng lại gì trong bạn cả.
Còn trong cuộc đời developer có lẽ ai cũng cần 4 loại ngôn ngữ để làm 4 loại công việc khác nhau, với mình thì là:
- Ngôn ngữ fudamental, dùng để học mindset lập trình: Pascal, C++, Java...
- Ngôn ngữ để làm CRUD, CMS, simple and easy: PHP
- Ngôn ngữ dùng hàng ngày, đáp ứng vừa đủ nhiều nhu cầu: NodeJS
- Vũ khí đặc biệt, dùng cho bài toán chuyên biệt: Golang
Thế nhưng dù biết bao nhiêu ngôn ngữ thì cũng không quan trọng bằng việc các bạn có thể Use the right tool for the right job không. Hãy để lại comment và upvote nếu thấy câu chuyện của mình thú vị nhé!
All rights reserved