Thứ Sáu, 24 tháng 7, 2009

Tại sao nên học Haskell?

Dù bạn là một system programmer làm việc chủ yếu với C/C++, một web programmer C#/ASP.NET hay PHP, một "enterprise programmer" (dân Java thích dùng những từ hổ báo kiểu thế này) với giải pháp Struts/Hibernate/Spring hay GWT, một client-side developer với CSS/Javascript/JQuery ... tôi cũng dám khẳng định, bạn sẽ nhận thấy giá trị của việc tìm hiểu Haskell là lớn hơn thời gian và công sức bỏ ra cho nó.

Coders chúng ta luôn biết tự search tài liệu và tự tìm tòi. Tuy vậy, tôi viết bài viết này với hy vọng tiết kiệm thời gian cho bạn bằng cách chọn lọc và đề xuất phương pháp tối ưu nhất thông qua kinh nghiệm của bản thân. Cho dù trình Haskell của tôi còn thấp vì thời gian tiếp cận không lâu, nhưng cũng chính vì thế mà tôi còn nhớ khá rõ quá trình tìm hiểu của mình, qua đó dễ dàng chia sẻ với các bạn.


Có quá nhiều công nghệ trong ngành của chúng ta đến nỗi không một ai đủ khả năng tìm hiểu hết. Do đó, để bắt kịp với tiến độ của ngành, chúng ta buộc phải biết cách lướt qua và chọn lọc: lướt qua để có cái nhìn tổng quát về bức tranh toàn cảnh, chọn lọc để xác định mảnh nào trong bức tranh đó mình cần phải đầu tư thời gian.

Hệ thống tiêu chuẩn chọn lọc của những người khác nhau là khác nhau. Đối với một coder tự do như tôi, tôi chọn lọc bằng cách dự đoán về khả năng mà một công nghệ có thể thay đổi cách tư duy của mình. Tuy nhiên trong quá trình tiếp cận Haskell, tôi nhận định, ngôn ngữ này sẽ tỏ ra hữu ích cho đa số coders chúng ta vì những nguyên nhân sau:

Haskell là purely functional programming language

Khi một ngôn ngữ hay một công nghệ nào đó đưa ra một phương pháp lập trình hoàn toàn mới, khả năng cao là nó đáng để tìm hiểu. Gần 20 năm trước, C++ đáng để tìm hiểu so với C bởi lẽ C++ đã chỉ ra thế nào là OOP. 20 năm sau, C++ vẫn đáng để tìm hiểu so với Java khi lúc này C++ lại chỉ ra thể nào là static polymorphism (C++ template) thay vì dynamic polymorphism (Java Generic) ;)

Một ngôn ngữ cũng sẽ trở nên quan trọng nếu nó làm tiền đề cho việc phát minh ra những design patterns mới. Xét theo tiêu chí này, Java cũng đã từng là một ngôn ngữ quan trọng khi có khá nhiều design patterns bắt nguồn từ nó, đơn cử như dependency injection của Martin Fowler.

Gần đây, xu hướng áp dụng các kỹ thuật functional programming (FP) đang tái xuất hiện trong giới lập trình, mà tiêu biểu là sự ra đời của Scala. Scala có thể xem như một sự kết hợp giữa Java và các kỹ thuật lập trình được ưu chuộng nhất hiện nay, trong đó bao gồm những phát kiến mới của các ngôn ngữ động như Python và Ruby, cũng như rất nhiều ý tưởng khác lấy từ FP.

Đối với tôi, Scala không hẳn là một ngôn ngữ được chọn lọc - nó quá cồng kềnh và chưa đủ sâu sắc, không khác là mấy so với các web frameworks của Java hiện nay. Thế nhưng sự ra đời của nó đã cho thấy FP đang trở lại và chiếm ưu thế trong xu hướng phát triển của ngành lập trình. Và mặc dù một tập hợp nhỏ các kỹ thuật FP đã được tích hợp trong không ít các ngôn ngữ khác nhau như Python, Ruby, Scala, nhưng sẽ tập trung hơn nếu ta tiếp cận với FP thông qua 1 ngôn ngữ thuần FP - Haskell là 1 ngôn ngữ như thế.

Haskell có syntax đẹp nhất

Ta định nghĩa hàm sum để tính tổng các phần tử trong 1 list như sau trong Haskell:

sum [] = 0
sum (x:xs) = x + sum xs

Tôi thích sử dụng những ví dụ đơn giản như thế này để đánh giá độ súc tích và độ sáng sủa trong cú pháp của một ngôn ngữ mới. Tuy Common Lisp hay Scheme đều là FP, nhưng cá nhân tôi thực sự có cảm tình với syntax của Haskell. Theo tôi, đó là một hệ thống syntax được thiết kế rất khoa học để cân bằng giữa độ dễ hiểu, độ ngắn gọn, và khả năng mở rộng trong ứng dụng lớn.

Haskell đang trở thành xu thế

Việc có ngày càng nhiều người sử dụng Haskell có nghĩa là nó sẽ còn phát triển để thỏa mãn nhu cầu của số đông và compiler của nó sẽ sinh code ngày một tốt hơn để đáp ứng những đòi hỏi về performance trong các ứng dụng thực tế.

Nhớ lại điều gì đã xảy ra với Ruby, cho dù bản thân ngôn ngữ Ruby có hay ho đến đâu nhưng nếu không có sự tồn tại của Rail thì rất có khả năng nó sẽ mãi mãi chỉ là một "toy language" - một ngôn ngữ đồ chơi chỉ dùng để giải trí và không được áp dụng trong công nghiệp.

Cho đến nay, Haskell đã vượt qua ngưỡng cửa "toy language" và đã được sử dụng để implement những ứng dụng nghiêm túc nhất, từ web applications cho đến operating systems.

Tốc độ lớn mạnh của Haskell là rất đáng kinh ngạc và điều đáng chú ý là nó không hề được marketing rầm rộ như Java khi xưa. Còn nhớ cách đây 5-10 năm, đã có ngày càng nhiều người sử dụng Java vì sự xuất hiện của hàng loạt các vị trí tuyển dụng Java programmers (Sun -> các công ty liên kết với Sun -> rồi lan tỏa dần), sau đó là việc áp dụng Java như một bộ môn trong giảng dạy, cùng với hàng loạt tools mới có vẻ cool viết trên và viết cho Java (Eclipse, NetBeans, IDEA), cũng như rất nhiều các kênh tin tức và blogs giải thích tại sao họ lại yêu Java đến thế. Đối với Haskell, người ta tìm hiểu và sử dụng đơn giản chỉ vì họ yêu thích nó.


Tôi có một châm ngôn: mỗi khi chán lập trình, hãy học một ngôn ngữ mới. Trong bài tiếp theo, tôi sẽ tiếp tục chia sẻ với các bạn quá trình tìm hiểu ngôn ngữ vô cùng mới mẻ và thú vị này :)