Tại sao nên học ErLang
White

vanduc1102 viết ngày 30/06/2015

Bài viết dịch từ : http://videlalvaro.github.io/2014/02/why-you-should-learn-erlang.html

Với tất cả các lùm xùm về việc WhatsApp bị mua lại bởi Facebook, mọi người đang phát điên lên vì Erlang. Ngay cả các nhà tuyển dụng cũng đang sử dụng nó như một chiêu bài mới để thu hút các kỹ sư. Vì vậy, như đã nói, tôi không viết bài này để nói về lý do tại mọi người nên tìm hiểu Erlang?

Hãy nhớ đây không phải là một bài blog về làm thế nào để viết một chương trình bằng Erlang, cũng không phải là một nỗ lực của fan hâm mộ nói rằng Erlang là tốt hơn so với ngôn ngữ X. Vì vậy, vui lòng không tranh luận về vấn đề đó tại đây. Ngoài ra, tôi không nghĩ rằng tôi sẽ cung cấp nhiều code mẫu, vì tôi nghĩ rằng nó không quan trọng với nội dung của bài viết này.

LÝ DO

Tôi viết bài này từ câu hỏi sau đây: Liệu tôi có phải lập trình bằng Erlang trong công việc của tôi không, nếu không, học Erlang có giúp tôi trở thành lập trình viên tốt hơn hay không? Từ những câu hỏi đơn giản này, sau đây là những lý do mà bạn nên học Erlang.

GÁN GIÁ TRỊ CHO BIẾN MỘT LẦN

Điều đầu tiên đặt biệt trong Erlang đối với tôi đó là “biến” thì không thay đổi.Trong Erlang nếu bạn đã gán giá trị cho “biến” thì nó không thể thay đổi. Nếu bạn đã từng sử dụng các ngôn ngữ thủ tục (imperative) như Java, PHP, .Net, Python ….Thì việc này sẽ thay đổi rất nhiều trong cách nghĩ của bạn.Bởi vì trong chương trình của chúng ta chúng ta sử dụng phép gán và thay đổi giá trị của biến rất nhiều.

Bây giờ, điều gì đặc biệt từ tính năng đó của Erlang,Thực ra đó là sự loại trừ trước cho bạn khỏi phải làm những việc dư thừa. Hãy nhớ lại xem bạn đã phải theo dõi trong suốt thời gian hoạt động của một biến khi bạn đang debug sản phẩm,Khi mà tại 3:03PM sau khi thực hiện 20 yêu cầu, giá trị của biến đang là “true” thay vì đó là “false” , liệu giá trị đó có đúng không? Bạn có cảm thấy hứng thú khi phải làm việc đó nhiều lần để tìm ra lỗi không? Không, và tôi cũng vậy.

Với Erlang điều đó trở lên dễ dàng bởi vì đơn giản là bạn không thể thay đổi giá trị của biến sau khi bạn đã gán giá trị cho nó.Dần dần thì bạn cũng phải học cách thích nghi với điều đó,để thấy được điều đó và các giải thuật có thể được hiện thực mà không dùng tới việc thay đổi giá trị của biến.Và bạn sẽ nhận ra được là thực sư thì bạn không cần tới nhiều biến đến vậy, và càng ít thì càng tốt.

Cho tới một ngày bạn quay trở lại với công việc của bạn và bắt đầu lập trình với ngôn ngữ thủ tục (Imperative Language), bạn sẽ bắt đầu nhìn thấy rằng có thể biến này thay đổi tại đây là không cần thiết.Và rằng việc thay đổi một đối tượng ở một chỗ vị trí nào đó có thể làm cho mã của bạn trở nên khó hiểu.Và rằng việc đóng gói đã khiến cho bạn tự làm khó mình, khi mà bạn truyền một đối tượng vào một phương thức và phương thức đó đã thay đổi đối tượng của bạn theo một cách không nên xảy ra. Như vậy, nếu bạn có kinh nghiệm với Erlang bạn sẽ thay đổi được bản năng khi lập trình, bạn sẽ biết được chỗ nào sẽ nguy hiểm khi thay đổi trạng thái của một đối tượng hoặc một biến. Đối với tôi đó là điều tuyệt vời nhất mà tôi học được từ “gán giá trị cho biến một lần”. Hãy nhớ rằng tôi không muốn tranh cãi về những giải thuật đã được thực hiện trong ngôn ngữ thủ tục (IL) mà nó có vấn đề về hiệu suất và phải thưc hiện bằng thay đổi giá trị biến.Tôi chỉ muốn nói rằng lập trình với Erlang sẽ giúp bạn dễ dàng hơn khi trong việc phát hiện mã của bạn sẽ nảy sinh vấn đề về sau này.

SO TRÙNG MẪU (PATTERN MATCHING)

So trùng mẫu là một trong những phần đặc biệt của Erlang mà ngôn ngữ khác không có, Ví dụ, Erlang không có vòng lặp, Nhưng mà bạn có thể tạo ra một vòng lặp bằng cách làm như sau:

do_n(F,N) → do_n(F,o,N,[]).
do_n(_F,N,N,Acc) → Acc; do_n(F,Count,N,Acc) → do_n(F,Count+1,N,[F(Count)|Acc).

Phần khai báo đầu tiên của hàm là do_n(F,N) giống như khái báo một interface cho hàm do_n/4 sẽ sử dụng 4 đối số. Chúng ta truyền một hàm vô danh F cho do_n và một số N là số lần mà chúng ta muốn gọi hàm F. Ví dụ do_n(F,0,10,[]) sẽ yêu cầu hàm do_n bắt đầu đếm từ 0 và dừng lại ở 10.

Trong phần thứ hai, chúng ta có hàm đệ quy với mở đầu (header), đó là: hai hàm được định nghĩa là sẽ gọi phục thuộc vào giá trị của đối số. Mỗi khi hàm được gọi thì biến đếm (count) sẽ được tăng, và phần thứ hai của hàm sẽ được gọi.Như vậy chúng ta không thấy mệnh đề điều kiện (IF) nào để kiểm tra điều kiện biến đếm lơn hơn 10 cả.

Phần mở đầu thứ nhất được viết như sau do_n(_F, N, N, Acc) có nghĩa là chỉ thực hiện hàm này khi đối số thứ 2 và thứ 3 giống nhau.Như vậy khi hàm được gọi thì đối số thứ nhất sẽ là bất cứ thứ gì mà nó được truyền vào, đối số thứ 2 sẽ là 10, cho tới khi nào count có giá trị là 10 tại một thời điểm nào đó thì nội dung của hàm F sẽ không bao giờ được gọi.

Đối với tôi điều đơn giản của hàm này làm cho việc học Erlang trở nên có giá trị hơn hết.( Tìm hiểu thêm về tính năng này trong ứng dụng thực tế từ RabbitMG tại đây ).

Bên cạnh đó, mô hình kết hợp của Erlang đi kèm với "destructuring". Một tính năng tuyệt vời mà sẽ làm cho bạn phát điên khi mà bạn cần phải truy cập sâu vào một cấu trúc dữ liệu lồng nhau trong một ngôn ngữ khác họ Erlang. Một khi bạn học cách bạn sử dụng nó, bạn có thể sẽ mở một bản kiến nghị trực tuyến để mong mỏi hàng ngày rằng các ngôn ngữ lập trình khác nên sớm có tính năng này.

ACTOR MODEL

Sẽ hàng triệu tiến trình nhỏ kết hợp nên hệ thống của bạn, làm việc một cách hòa hợp để đạt được một giải pháp, nghe đã đủ tuyệt vời để bắt đầu học Erlang chưa. Chế độ tính toán này được gọi là mô hình diễn viên ( Actor Model ), được giới thiệu bởi Carl Hewitt trong bài báo nổi tiếng của ông: A Universal Modular ACTOR Formalism for Artificial Intelligence.

Các khái niệm về các tiến trình giám sát lẫn nhau; tiến trình sẽ tự động tắt nếu một tiến trình hàng xóm đã chết; tiếng trình được phân lập từ mỗi khác và không thể làm hỏng trạng thái của tiến trình khác; và nhiều hơn thế nữa, là những lý do khá thú vị để đi sâu vào Erlang để xem tất cả những điều này là gì, và biết rằng cách chúng dùng Lập Trình Hướng Đối Tượng (OOP) có lẽ nên làm theo cách của Erlang, với các đối tượng hoàn toàn bị cô lập mà giao tiếp với nhau bằng phương pháp truyền thông điệp (message passing). Tìm hiểu mô hình diễn viên sẽ cho phép bạn cải thiện cách bạn hiểu OOP.

CÁC CÚ PHÁP

Có rất nhiều phàn nàn về cú pháp của Erlang. Vâng, vâng, nếu bạn đến từ các ngôn ngữ gia đình của ALGOL, thì tất nhiên nó là lạ, tôi đồng ý với bạn là vậy, nhưng nếu bạn muốn tìm hiểu cái gì mới, tôi nghĩ cú pháp của Erlang là để nhắc nhở bạn "Hey! Tôi không nghĩ rằng nghĩa của một điều gì đó là do bạn nghĩ nó như thế(Hey! I don’t think that thing means what you think it means)" , trong tất cả. Đối với một ngôn ngữ mà đi kèm với một mô hình hoàn toàn mới như lập trình đồng thời (concurrent programming), tôi nghĩ rằng một cú pháp mới lạ cũng là một điều thú vị.

THAM KHẢO

Một số nguồn cho việc học tập Erlang:

Tôi đã học Erlang từ cuốn sách này: Programming Erlang: Software for a Concurrent World.

Tôi đã viết bài này từ cuốn sách này và từ các tài liệu chính thức: OTP Design Principles..

Tôi đã học về Mnesia (cơ sở dữ liệu Erlang) từ đây: Mnesia User’s Guide..

Sau đó, cuốn sách Erlang and OTP in Action sẽ dạy cho bạn rất nhiều về việc xây dựng các ứng dụng đáng tin cậy với Erlang.

Là một dự án để tìm hiểu Erlang, tôi đã cố gắng để tạo ra một bản sao Redis trong Erlang. Tôi đã không bao giờ được xuất bản dự án đó, nhưng tôi đã học được rất nhiều từ nó.

Cuối cùng tôi đã nối với RabbitMQ như vậy từ thời gian để thời gian tôi sẽ đọc mã nguồn chỉ để tìm hiểu thêm về Erlang. Bạn có thể tìm đọc một số tài liệu ở đây và ở đây, và slide trình bày ở

.

KẾT LUẬN

Nói tóm lại, lý do tại sao bạn nên tìm hiểu Erlang? Nó sẽ làm cho bạn ý thức hơn về tất cả những nơi mà mã của bạn bị thay đổi trạng thái, và có lẽ có một các thực hiện tốt hơn mà không cần tới sự thay đổi đó. Hãy nhớ rằng càng viết function tinh khiết (pure) chừng nào thì hàm luôn đó sẽ luôn trả về giá trị tương tự chừng đó nếu chúng ta sử dụng cùng các đối số, dễ dàng hơn khi chứng minh đoạn mã đó đúng, ví dụ khi chúng ta kiểm tra unit test. Erlang có khái niệm về mô hình kết hợp. Điều này nghĩa là sẽ thay đổi cách bạn hiểu code, và sẽ làm cho bạn tự hỏi tại sao ngôn ngữ mà bạn đã chọn không hỗ trợ tính năng này. Các mô hình diễn viên (Actor model ) sẽ cung cấp cho bạn một cái nhìn mới về đóng gói (encapsulation) và có thể làm cho bạn nghĩ rằng đối với OOP chúng ta đã làm cho đến nay chỉ là đặt namespace cho các collections của các functions liên quan. Cuối cùng cú pháp sẽ giúp bạn điều hướng để vượt qua sự khó hiểu của các khái niệm mới, nó sẽ nhắc nhở bạn rằng những gì trông giống như thế này nhưng thực sự phải là thế kia. ( looks like this is actually that).

Tôi hy vọng điều này đã được hữu ích trong việc đưa ra lý do tại sao bạn quyết định để tìm hiểu Erlang. Một lần nữa, tôi không muốn viết một bài hướng dẫn về Erlang, nhưng chỉ để làm nổi bật một số tính năng nổi bật của nó, sẽ khồng làm uổng phí thời gian của bạn khi bạn học một ngôn ngữ mới như Erlang. Tôi chắc rằng những quan điểm mới về lập trình sẽ giúp ích rất nhiều cho bạn trong công việc hiện tại và tương lai.

Cảm ơn Google Dịch rất nhiều đã giúp mình hoàn thành bài dịch này.
Mình mới tập dịch, các bạn đọc thấy phần nào chưa phù hợp, để comment bên dưới cho mình sửa lại. Cám ơn nhiều.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

vanduc1102

3 bài viết.
1 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
7 2
Trong AngularJS Chúng ta có thể sử dụng ngClass để kiểm tra điều kiện khi sử dụng Class trong CSS : javascript ngclass="{true:'displaybutton', ...
vanduc1102 viết 3 năm trước
7 2
White
2 8
Mình đang làm một RESTful server, dùng RESTEasy trên Java. Server này sẽ lưu trữ các tập tin như hình ảnh và PDF vào trong CSDL. Yêu cầu là khi đ...
vanduc1102 viết 3 năm trước
2 8
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
1 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!