11/10/2018, 21:20

Lựa chọn Golang cho dự án tiếp theo

Tôi vốn xuất thân là Java Developer, nhưng do đợt khủng hoảng kinh tế thế giới nên đã chuyển sang làm PHP Developer để kiếm cơm. Sau khoảng 4 năm làm PHP, các dự án tôi làm nhìn chung là dễ về mặt công nghệ, không có gì cao siêu cả. Tuy nhiên dạo gần đây, một số dự án bắt đầu khó dần, PHP bộc lộ ...

Tôi vốn xuất thân là Java Developer, nhưng do đợt khủng hoảng kinh tế thế giới nên đã chuyển sang làm PHP Developer để kiếm cơm. Sau khoảng 4 năm làm PHP, các dự án tôi làm nhìn chung là dễ về mặt công nghệ, không có gì cao siêu cả. Tuy nhiên dạo gần đây, một số dự án bắt đầu khó dần, PHP bộc lộ khá nhiều nhược điểm. Tôi nghĩ mình có thể dễ dàng Scale PHP với các dự án về CRM hay ERP, nhưng phát sinh lần này là các bài toán xử lý CCU (Concurrentcy) lớn. Vì cũng muốn học thêm cái gì mới, nên tôi quyết định chọn một ngôn ngữ khác để thực hiện âm mưu của mình. Sau khi tham khảo 1 số ông bạn và tìm trên Google, tôi có được danh sách vài ngôn ngữ được Recommend như JS (NodeJS), Java - tất nhiên, Groovy, Scala, Elixir và Golang. NodeJS và Java thì tôi cũng có làm qua rồi, tuy nhiên tôi không có cảm tình với NodeJS lắm, Java thì quá phức tạp nếu tôi cần một ai đó vào giúp đỡ, Scala thì khó học. Elixir, có vẻ ngon, hiệu năng tốt, CCU thì tuyệt vời vì nó dựa trên máy ảo của Erlang, nhưng lại khá lạ với Việt Nam, tìm người giúp chắc phọt máu. Grooy cũng khá tốt, cú pháp đơn giản, chậm hơn 1 chút so với Java và cũng chạy rên JVM, nhưng thôi, tôi có cảm tình với Golang rồi, nói nhiều cũng vô ích.

  • Golang là ngôn ngữ con đẻ của Google, giống như C# của Microsoft. Nó được thiết kế bởi Ken Thompson, thánh nhân của Bells Lab, tác giả của một số thứ khá "vãi" như Unix, B-Lang, UTF-8 và giờ là Go. Ông cũng là bạn nối khố của Dennis Ritchie - tác giả ngôn ngữ C, hồi còn ở Bells Lab. Tiếc là bác Dennis Ritchie đã mất từ năm 2011 rồi. Chuyện về 2 bác này thì cũng "vãi" không kém. Trong dự án thiết kế hệ điều hành Unix, 2 bác thấy các ngôn ngữ hiện tại gặp nhiều nhược điểm trong việc xây dựng một hệ điều hành, thế là 2 bác nhà ta phát triển luôn ngôn ngữ C và sử dụng nó để Code ra Unix Kernel, cái mà cho tới ngày nay, cái máy MacOS của tôi vẫn còn sử dụng. Kể vậy để bạn biết là Golang không phải là 1 dân chơi nghiệp dư, có số má và con ông cháu cha đàng hoàng.
  • Golang được phát triển từ 2007 và giới thiệu năm 2009 nên nó là một tân binh khá mới mẻ. Theo một thông tin mà tôi cũng không nhớ là đọc ở đâu thì tính tới 2017, 80% các hệ thống Backend của Google được Code bằng Golang, hiển nhiên vì Google phát triển Golang không phải để cho vui.
  • Golang là ngôn ngữ nguồn mở, đúng hơn là trình biên dịch của nó là mã nguồn mở. Repo của nó https://github.com/golang/go
  • Golang có trình biên dịch Cross Platform, cũng "Write one, run everywhere" như Java nhưng không cần phải biên dịch ra Byte code như Java. Tốc độ biên dịch rất nhanh.
  • Golang dựa một phần trên ngôn ngữ Pascal huyền thoại, nên các cháu thiếu niên học xong chương trình lớp 11 là có thể tiếp cận Golang ngon lành.

Vô vàn thứ, từ viết Shell Script, cho tới làm hệ điều hành. Thường thì người ta sẽ dùng Golang để làm Backend System hay các API hiệu năng cao. Golang cũng có thể sử dụng để làm Machine Learning. Golang khá phù hợp trong việc xây dựng Backend và các phần mềm liên quan tới System. Ví dụ như Docker là một phần mềm khá nổi tiếng được viết bằng Golang từ rất sớm. Trong cuốn The Go Programing Language, tác giả có viết rằng.

"Go is especially well suited for building infrastructure like networked servers, and tools and systems for programmers, but it is truly a general-purpose language and finds use in domains as diverse as graphics, mobile applications, and machine learning"

Đại thể thì nó khá giống C trong khoản lập trình hệ thống, nhưng lại đơn giản hơn, hỗ trợ nhiều thư viện trong lập trình các mục đích khác. Ngoài ra Golang có Garbage Collection như Java (hiểu nôm na là quản lý bộ nhớ tự động, không phải cấp phát thủ công như C), các Thread được tạo bằng Golang cũng tốn ít bộ nhơ và tài nguyên hơn so với C hay Java. Nhìn chung mình chỉ muốn nói là Golang khá ngon cơm.

Học Golang khó mà dễ, mình học Golang trong 1 tuần bằng việc đọc cuốn The Go Programing Language, của Brian W. Kernighan, tác giả cuốn The C Programing Language huyền thoại. Tất nhiên đó mới chỉ là những thứ cơ bản, concept của Golang, để thành thục được nó mình cần thời gian luyệt tập thêm. Với các bạn đã học C và Pascal rồi, tiếp cận Golang sẽ khá nhanh, cá nhân mình thấy Golang dễ tiếp cận hơn Java từ bước cài đặt cho tới tiến hành Code. Ngoài ra khi học Golang, bạn không phải tiếp cận ngay với OOP như Java, bạn có thể Code theo dạng Function như C, về cấu trúc dữ liệu cũng có nhiều nét tương đồng với C. Golang thực sự mạnh ở vấn đề CCU, nhưng đây cũng là một vấn đề khá khó và hóc búa, mình nghĩ nếu bạn chỉ học Golang để làm Web thì nó cực đơn giản, thậm chí còn đơn giản hơn nhiều khi mình học JS để làm NodeJS. Theo một so sánh vui trên mạng thì tài liệu từ trang chủ của Golang đâu đó cỡ 197 trang, còn cuốn "Javascript Definitive Guide" là hơn 1000 trang, cũng đủ thấy Golang có cú pháp ngắn gọn thế nào.

Mình bắt đầu Golang với cuốn The Go Programing Language vì nó viết khá chi tiết và đầy đủ các vấn đề cơ bản của mọi ngôn ngữ, như cú pháp, kiểu dữ liệu, quản lý bộ nhớ, con trỏ, hiệu năng... Tuy nhiên trên mạng hiện giờ có vô số nguồn mà bạn có thể học Golang, tốt nhất chính là trang chủ https://golang.org/. Nếu muốn học nhanh, bạn có thể tham khảo TUT trên https://www.tutorialspoint.com/go/. Về sách có thể đọc cuốn The Go Way, nhưng nó khá dài và có thể bạn cũng không cần tiếp cận hết mọi kiến thức trong đó. Nếu bạn nào quan tâm tới xây dựng hệ thống phân tán với Golang như mình, thì đây là một số tài liệu mà mình định đọc trong thời gian tới.

  1. Mastering Concurrency in Go
  2. Building Microservices
  3. Building Microservices with Go
  4. Cloud Native Go.

Còn bạn muốn làm Web chơi chơi với Golang thì chỉ cần học cơ bản về Go và tìm hiểu 1 Framework nào đó như Begoo, Revel hay Iris.

0