Photo by Sabrianna on Unsplash

Bạn đã thử Elixir chưa



Đây sẽ là một chuyên mục mới của Blog, nói qua một chút thì mình là một người rất thích ngôn ngữ lập trình nói chung, nên mình thường dành thời gian rảnh để thử nghiệm ngôn ngữ mới. Trong phần này, mình sẽ phân tích và nói về trải nghiệm với ngôn ngữ lập trình trong tiêu đề. Để giới hạn lại số lượng ngôn ngữ, mình sẽ chọn những ứng viên ít được biết đến hơn, và giành ít nhất 1 tháng để sử dụng chúng.

Ngôn ngữ đầu tiên mình muốn chia sẽ là Elixir, thực ra mình cũng chỉ sử dụng nó thời gian gần đây sau khi chuyển qua công ty mới. Ngoài lý do đây là ngôn ngữ mà mình phải dùng trong dự án thì mình tin rằng nó xứng đáng được Viral hơn hiện tại.

Phân tích

Tổng quan

Elixir là Dynamic Typed Language, nên trải nghiệm của nó có thể so sánh như bạn Code Javascript vậy rất Flexible do bạn không cần phải lo lắng về kiểu dữ liệu. Ngoài ra với cú pháp đơn giản và ít Keyword, phần nào giúp nó có cảm giác giống Python.

Thậm chí Elixir còn tiện tới mức support cả Compiler hay Script luôn để bạn chọn😮. Ví dụ, những module thông thường bạn sẽ dùng Compiler với đuôi file là .ex, ngược lại những file config hay test thì sẽ là Script với đuôi file là .exs.

Elixir có nền móng là Erlang và chạy trên EVM, nên cũng kế thừa những đặc điểm của ngôn ngữ tiền nhiệm. Bạn có thể deploy Elixir mà không bị downtime, nghe có vẻ bình thường nhưng nếu bạn từng chạy những dự án lớn bằng Java thì mỗi khi Deploy, server sẽ bị downtime tới vài phút nên cực kì không phù hợp với kiểu phát triển Agile.

Thêm một điểm mà mình cực kì thích của Elixir là document mà họ viết cực kì tốt, thậm chí theo trải nghiệm cá nhân là tốt hơn cả document của Rust hay Go.

Document

Functional language

Elixir là Functional Language, nên tương tự như những người anh em khác, nó cũng Follow theo những quy tắc sau:

  • Pure Function
  • Function là First-Class
  • Immutable Variable

Tuy vậy so với Haskell cũng là Functional Language thì Elixir mang lại cảm giác thân thiện hơn đáng kể cho Dev. Nó support những kiểu dữ liệu như Map, List, Tuple rất cần thiết khi làm việc với Request, Response ra JSON, hay làm việc với việc query DB.

Concurrent

Kế thừa từ Erlang, Elixir cũng là một ngôn ngữ mạnh về Concurrent. Với thư viện cực kỳ lớn là OTP gồm nhiều cách implement Concurrent khác nhau. Tương tự như goroutine của Go, Elixir cũng spawn thành các process là các Virtual Thread nên rất nhẹ, thậm chí bạn có thể spawn hàng ngàn process với Elixir và app vẫn không bị crash.

Pattern Match

Tương tự như Haskell, Elixir cũng hỗ trợ Pattern Match để làm việc với Function hiệu quả hơn. Nếu bạn không biết, nó tương tự như việc viết một hàm và bạn switch case các trường hợp vậy.

Ngoài ra, trong những trường hợp phức tạp hơn, Elixir cũng có công cụ Guard để match. Nó giúp Code bạn dễ đọc hơn, giảm trường hợp lồng Switch case hoặc If else gây ra Indentation Hell.

Pipe operator

Thực tế thì trước Elixir mình chưa từng dùng ngôn ngữ nào có Pipe operator cả (Bash không tính nha 😁). Sếp mình khá thích operator này nên Force mình sử dụng và nói thật thì nó có tính gây nghiện các bạn à.

Nó không chỉ giúp Code clean hơn, do nó giúp bạn xem được qui trình data được xử lý từng bước thay vì đi ngược lại như những ngôn ngữ thông thường.

10"
|> String.to_integer()
|> IO.puts()
console.log(parseInt(10))

Atom

Mình không chắc đây là điểm cộng hay điểm trừ nữa, nhưng nó giúp Elixir khác biệt so với những ngôn ngữ còn lại nên mình bổ sung vào. Theo một nghĩa nào đó Atom giống như String vậy các bạn :true, true, “true”. Nói về ưu điểm của cách làm này thì nó giúp bạn Handle lỗi, tương tự như Rust có Result còn Go thì bạn check nil cho err vậy.

{:ok, "foobar"} = Base.decode64("Zm9vYmFy")

Nhưng nó cũng có một vấn đề, không phải lúc nào Atom và String cũng tương đương nhau, các thư viện có thể sẽ trả về String hoặc Atom tuỳ cách họ xử lý. Nên nếu bạn chưa có nhiều kinh nghiệm với Elixir sẽ dễ gặp lỗi khi nhầm lẫn giữa Atom và String trong map.

Mix

Tương tự như NPM của Nodejs, Elixir sử dụng Mix để quản lý package cũng như chạy các lệnh. Điều này giúp bạn không cần phải ghi nhớ quá nhiều lệnh khác nhau từ các Package mà chỉ cần dùng Mix và sub-command. Ví dụ như bạn muốn tạo một Project bình thường.

mix new project1

Còn nếu bạn muốn tạo Project bằng thư viện Phoenix.

mix phx.new project1

Framework

Tuy không phải là ngôn ngữ quá nổi tiếng nhưng Elixir lại sở hữu những Framework thực sự rất chỉnh chu, đầy đủ thậm chí có thể so sánh với Express.js, Spring, Lavarel về tính năng.

Phoenix

Có thể xem đây như Express.js trong Node.js vậy nó có đầy đủ những thứ bạn cần, support tốt các tính năng cơ bản để Code web server. Ngoài ra Phoenix cũng rất nhanh khi nhiều lần nằm trong top Web Framework chạy nhanh nhất.

Ngoài ra Phoenix cũng hướng Dev sử dụng các Best Practice như việc quản lý Secret bằng biến môi trường. Tập trung Configuration của các Package lại vào 1 vài file, phân chia Configuration theo môi trường như Dev, Prod, Test.

Phoenix đi kèm với bộ lệnh để dùng với Mix, như tạo Project, tạo các file Schema, build, release cực kì tiện lợi. Nên Phoenix năm nay thậm chí đứng nhất về Framework được yêu thích nhất trên Stack Overflow

Phoenix

Ecto

Bạn có thể tưởng tượng đây như Mongoose của Nodejs vậy, Ecto giúp bạn tạo Schema và kết nối với Postgres, Mysql. Giống như Phoenix, Ecto cũng hướng Dev tới các Best Practice như tạo inserted at, updated at column. Ecto cũng yêu cầu bạn tạo file migration và lịch sử các lần chỉnh sửa để các thành viên trong team có thể chạy lệnh migration được.

Tương tự Phoenix, Ecto cũng đi kèm với những lệnh để làm việc hiệu quả hơn ví dụ như.

mix ecto.create
mix ecto.gen.migration
mix ecto.migrate
mix ecto.reset

Tổng kết

Mình nghĩ Elixir là 1 ngôn ngữ tốt, phù hợp nếu bạn muốn chuyển từ Javascript hay Python sang một ngôn ngữ Functional. Elixir cũng cực kỳ tốt khi áp dụng vào các dự án Web với Framework mạnh và những tính năng thích hợp để sử dụng trong môi trường Production.