Đây là bài viết tôi dịch từ trang Quora.com. Cá nhân tôi đã lập trình Scala trong khoảng 5 tháng và thử học Golang trong 5 ngày. Cảm nhận, đánh giá khá giống với tác giả Nick Snyder.

Chú ý Techmaster đang tuyển giảng viên lập trình các công nghệ khác nhau. Dạy là một cách học hiệu quả nhất, bạn nào quan tâm xin đọc bài này.

Tôi đã từng lập trình Go tại Google và lúc rảnh rỗi còn Scala tại LinkedIn. Cả hai ngôn ngữ đều là những ngôn ngữ hiện đại được thiết kế ưu tiên hàng đầu cho lập trình đồng thời (concurrency). Sau đây là chia sẻ dựa trên kinh nghiệm của tối viết phần mềm phục vụ lượng lớn người dùng.

Go là một ngôn ngữ được thiết kế có chủ ý, tinh ngọn để dịch ra mã máy. Thiết kế có chủ ý (opinionated) khác với thiết kế để trở thành ngôn ngữ đa dụng kiểu như Java.

Scala là ngôn ngữ phức tạp, học thuật, hướng đến lập trình hàm, hướng đối tượng, biên dịch và chạy trên Java Virtual Machine.

Nên học ngôn ngữ lập trình Scala hay Go?

Đối với bất kỳ dự án nào cần mở rộng ra số lượng lớn lập trình viên, tôi sẽ chọn Go hơn là Scala bởi tính đơn giản của nó.

Trước khi tôi giải thích chi tiết, tôi có vài quan sát chung như sau:

  • Code ngắn hơn thường dễ đọc hơn. Tuy nhiên code quá vắn tắt thì trở nên khó đọc.
  • Code được đọc lại nhiều lần hơn là viết.
  • Code tồn tại (được copy & paste hoặc kế thừa hoặc tái sử dụng) lâu hơn chúng ta vẫn nghĩ.
  • Người kiểm thử hoặc bảo trì code thường không phải là tác giả đầu tiên.
  • Khi đội lập trình đông lên, trình độ chung của lập trình viên đọc, viết, bảo trì, kiểm thử code thường là loanh quanh ở mức độ làng nhàng.

Lập trình còn bao hàm việc trao đổi, chia sẻ, phối hợp giữa lập trình viên và đồng nghiệp hoặc những người sẽ đọc code, chứ không chỉ giữa lập trình viên và trình biên dịch/thông dịch.

Mô tả thiết kế của ngôn ngữ

Mô tả thiết kế ngôn ngữ lập trình Java phiên bản 8 dạy 780 trang PDF

Mô tả thiết kế ngôn ngữ Scala là 181 trang PDF

Mô tả thiết kế ngôn ngữ Go trên web nếu in ra cỡ 51 trang PDF

Định nghĩa mô tả thiết kế ngôn ngữ khác với việc học và dùng nó như thế nào. Nhưng nó cũng tương đương với cần bao thời gian để học và làm chủ ngôn ngữ lập trình đó.

RISC vs CISC ~ Tập lệnh rút ngọn vs Tập lệnh phức tap

Go cung cấp một tập nhỏ các thành phần căn bản vuông vắn để kết hợp với nhau theo những cách đơn giản. Học một số thành phần từ đơn giản để lập trình được ngay. Còn Scala cung cấp một bộ đồ nghề khủng với nhiều loại kiểu, cú pháp. Lập trình viên Scala phải học một số lượng lớn khái niệm, kiểu, hiểu rõ khi nào, dùng cái gì tối ưu nhất. Đối khi dùng đúng, số lượng dòng code còn ít hơn so với Go lang rất nhiều.

Tài liệu

Go rõ ràng là dễ học hơn bởi những nhà thiết kế Go chủ ý muốn nó đơn giản. Hãy xem tài liệu hướng dẫn

Dạo qua

http://docs.scala-lang.org/tutor...
vs
http://tour.golang.org/#1
http://golang.org/doc/effective_...

Hỏi đáp

http://docs.scala-lang.org/tutor...
vs
http://golang.org/doc/faq

Thư viện chuẩn:

http://www.scala-lang.org/api/cu...
vs
http://golang.org/pkg/

Khả năng thể hiện

Scala khả năng thể hiện (nhiều chiêu thức) hơn Golang rất nhiều. Đặc điểm của Go đó là nó không có quá nhiều tính năng. Ngôn ngữ đơn giản, ít tính năng nhiều khi hay bị đánh giá thấp.
http://golang.org/doc/faq#Why_do...

Liệu có thực sự là Golang ít khả năng thể hiện hơn Scala
Thưa không!
Khả năng biểu hiện trong ngôn ngữ lập trình hiểu là cách hiệu quả truyển tải ý nghĩ - cảm xúc. Nó không có nghĩa là ngôn ngữ phải có thật nhiều tính năng. Trong thực tế, khả năng diễn đạt của mã nguồn phụ thuộc phần lớn vào người viết nó hơn là ngôn ngữ được dùng.

Mã nguồn quá cô đặc ảnh hưởng hiệu quả biểu hiện

Hiệu ứng game Sim City

SimCity Official Website

Nếu có 2 người đồng thời chơi game SimCity, xây dựng thành phố trên một khu vực giống hệt nhau, sau vài giờ họ sẽ tạo ra hai thành phố hoàn toàn khác biệt. Tại sao vậy? Bởi Sim City giống như một hộp cát đồ chơi (sandbox), ở đó có quá nhiều lựa chọn đến mức 2 người rất ít có khả năng tạo ra 2 chuỗi quyết định giống nhau. Scala cũng là một hộp cát như vậy. Bên cạnh tập phong phú các chức năng lập trình hiện đại như lập trình hướng hàm, lập trình hướng đối tượng, Scala còn cho phép lập trình viên tạo ra tính năng mới ví dụ operator mới, cú pháp mới, phương thức đa hình, annotation mới, kiểu mới....

Mọi thứ trong tầm kiểm soát cho đến khi các lập trình chia sẻ các hộp cát với nhau, người này không thể hiểu người kia đã viết gì hoặc phải dành thời gian nhiều hơn người kia viết code rất nhiều để đọc !

Phong cách code thông nhất

Go là ngôn ngữ duy nhất mà tôi biết có khả năng giảm thiểu tranh cãi về phong cách code bằng cách cung cấp công cụ để định dạng code theo quy tắc phổ biến.
http://golang.org/cmd/gofmt

Code cô đặc

Code cô đặc giống như bạn viết một mật thư bằng các ký tự mã hóa trên một mẩu giấy rất nhỏ. Scala code cũng tựa như vậy, nó cô đặc, nhiều cú pháp lạ, quy tắc phức tạp khiến cho học nhập môn vô cùng khó khăn. Nhìn tổng thể, tư tưởng của Scala là càng cô đọng càng tốt, hoặc lập trình Scala chuyên nghiệp có xu hướng đến xúc tích lên gân thái quá.

Ví dụ

Để lấy user id từ một cookie, cần bao nhiều kiến thức về ngôn ngữ để bạn có thể hoàn thành tác vụ này?

  • Điều gì xảy ra nếu cookie không tồn tại?
  • Điều gì xảy ra nếu cookie không có định dạng đúng của số?
  • Điều gì xảy ra nếu cookie lưu số âm?

Scala

import play.api.mvc.RequestHeader 

def getUserId()(implicit request: RequestHeader) = {
  request.cookies.get("uid").map(_.value.toLong).filter(_ > 0)
}

Golang

import (
  "fmt"
  "http"
  "strconv"
)
 
func getUserId(r *http.Request) (int64, error) {
  c, err := r.Cookie("uid")
  if err != nil {
    return 0, err
  }
  i, err := strconv.ParseInt(c.Value, 10, 64)
  if err != nil {
    return 0, err
  }
  if i <= 0 {
    return 0, fmt.Errorf("invalid user id")
  }
  return i, nil
}

Trong trường hợp này, Scala gọn hơn nhiều, nhưng điều tôi muốn nói ở đây là mã Go thì trực quan, đặt đâu cũng hiểu, còn mà Scala phải cần có hoàn cảnh cụ thể để hiểu thấu đáo.

Ha~y $#%! roo~ rafng hown cos duwowjc khoong?

Kinh nghiệm thực tế, code trực quan có nhiều điểm lợi

  • Dễ đọc cho người mới học hoặc không phải tác giả đọc
  • Tuy có thể nhiều dòng lệnh, nhưng có thể dễ dàng sửa đổi từng đoạn nhỏ để kiểm thử
  • Bắt lỗi từng đoạn lệnh, in ra màn hình tiện hơn nhiều
  • Dễ viết test case kiểm thử
  • Dễ đặt breakpoint để gỡ rối. Bạn thử debug đoạn lệnh gồm nhiều hàm nối nhau của Scala thử xem nào.

Vậy đã rõ, cô đọng hơn, nhiều tính năng ngôn ngữ hơn không phải lúc nào cũng chiếm ưu thế nhé.

Tốc độ thực thi

Khi lập trình, chúng ta quan tâm đến hiệu suất viết mã, hiệu suất đọc và chỉnh sửa mã bởi người khác. Còn chạy thực tế, tốc độ thực thi cũng rất quan trọng. Theo kinh nghiệm của tôi, Golang biên dịch nhanh hơn, và tốn ít bộ nhớ hơn Scala. Tham khảo so sánh tốc độ thực thi, bộ nhớ, CPU giữa Go và Java. Scala xấp xỉ Java. Do đó các bạn có thể liên hệ dễ dàng Go và Scala.

Công bằng đánh giá

Tôi đã học Go trước khi tôi học Scala do đó phải công nhận rằng tôi nghiêng về Go. Phản ứng đầu tiên khi dùng Go là cú pháp hơi xấu (như C++) nhưng học Go sẽ như thế này:

Ngôn ngữ lập trình Go

Tôi học Scala I learned Scala vì nhu cầu cần thiết và đã quen với nó, và bắt đầu thích nó phần nào, nhưng trải nghiệm học Scala kiểu như thế này

Ngôn ngữ lập trình Scala