golang

Mọi người thường hỏi tôi tại sao tôi lại quyết định viết phần lớn mã mới của mình bằng Go. Tôi bắt đầu lập trình vào tháng 11 năm 2011 khi đang theo học tại Hacker School. Vào thời điểm đó, concurrency(lập trình đồng thời) là 1 chủ đề rất nóng ở trường tôi. Và chúng tôi cố gắng nhiều cách để viết mã concurrency. Một nhóm chúng tôi đã tham gia và với sự trợ giúp của Brubeck, một framework để thực hiện lập trình concurrency với Python, đây có lẽ là cách ít khó khăn nhất để thực hiện concurrency trong ứng dụng web Python mà tôi đã tìm thấy. Hãy tua lại một chút, bởi vì bối cảnh ở đây đặc biệt quan trọng để hiểu tại sao tôi chọn Golang, vì nó giải thích tại sao nó lại hấp dẫn tôi. Có thể trải nghiệm của bạn có thể rất khác.

Lần đầu tiên tôi viết mã lập trình đồng thời bằng java trong 1 cuốn sách có tên là  Killer Game Programming in Java, nhưng tôi không học được nhiều, thay vào đó chọn vọc với ActionScript vì tôi muốn mọi người có thể nhìn thấy công việc của tôi và các ứng dụng Java khiến tôi vô cùng xấu hổ. Một thời gian sau, tôi sử dụng ngôn ngữ lập trình ChucK và bắt đầu viết máy đánh trống cho Novation Launchpad, đó là một bài toán concurrency rất thú vị để cố gắng giải một cách chính xác và tôi rất ấn tượng với mô hình concurrency của ChucK. Nhưng những điều này không nằm trong mong muốn lập trình web của tôi, vì tôi muốn làm gì đó một cách chuyên nghiệp hơn. Đối với lập trình web, sự phát triển của tôi lần lượt theo các ngôn ngữ ASP.NET -> PHP -> Python.

Khi bắt đầu là một lập trình viên Python, tôi đã nhìn thấy ánh sáng. Tất cả các ngôn ngữ bằng 1 lý do nào đó đều kém hơn, và với tư cách là 1 lập trình viên Python, tôi thuộc loại top những idol lập trình, trong khi những lập trình viên khác không hiểu được các thuật toán cơ bản như sắp xếp nổi bọt, các bài toán đơn giản. Họ đang cố gắng biến mình thành những pháp sư, ngồi ở trong hang động và hì hục vào những bài toán không tồn tại, những lập trình viên điên khùng đang cố gắng làm thời gian trở nên hoang phí. Sau tất cả, tôi chọn Python làm ngôn ngữ để lập trình đồng thời. Nó là 1 ý tưởng tốt, phải không?

Ồ, không hẳn là chính xác lắm. Với tư cách là 1 người lập trình sử dụng Django, nó không thực sự đơn giản và dễ dàng để sử dụng những request dưới nền background trên mỗi trang. Có người gợi ý tôi dùng Celery, nhưng tôi không thích nó chút nào. Một hàng đợi làm nhiệm vụ phân tán? Cái gì cơ? Tôi chỉ muốn request dưới background mà không muốn người dùng phải chờ đợi. Tôi không cần 1 máy tính đủ khỏe toàn diện. Toàn bộ những gợi ý cài đặt từ supported brokers làm tôi cảm thấy rùng mình. Tôi không muốn cài đặt bất cứ Demo nào cả, tôi chỉ cần gửi Email dưới nền background mà thôi.

Sau đó thì tôi tìm thấy gevent. Chờ đã, nó là cái gì vậy? Một con khỉ chuyên đi vá lỗi ư? Trông nguy hiểm thế? Đó không phải là mục tiêu tầm thường của những con người ở Rubyland sao? Tôi là 1 lập trình viên Python và tôi không muốn 1 con khỉ đi vá lỗi cho tôi. Những hãy nhìn những con số, tất cả các lập trình viên giỏi hơn tôi đều bảo nó tốt, do vậy tôi sẽ lắc đầu. Nhưng nó thật sự không hấp dẫn tôi. Ngay cả ví dụ đầu tiên cũng trông rườm rà:

Có một điều gì đó trong tôi nói rằng sử dùng những thư viện cũ kỹ để áp dụng tạo ra những quy trình mới thật sự không ổn. Tôi có thể đọc hiểu code tốt trong lần đầu, nhưng đối với tôi quy trình kiểm soát của nó không rõ ràng. Nó không phải là 1 hệ thống tốt hơn so với 1 vòng lặp. Và ý tưởng tôi sẽ chia nhỏ code của mình bằng những hàm nhỏ cũng không ổn vì sự hỗ trợ hàm lambda yếu của Python thật sự khiến tôi khó chịu. Và có gì trong thư viện socket đó? Còn các thư viện khác thì sao? Ý bạn là tôi phải dùng nó ư? Một con khỉ đi vá những input/output của các chức năng mà tôi đã sử dụng thư viện cơ sở để triển khai, theo ý tôi, có điều gì đó đang báo tôi rằng nó thực sự là rắc rối trong mảnh đất huyền thoại của Python.

Vì vậy, cần nhắc lại là có thể sử dụng lập trình đồng thời bằng Python, nhưng nó thật sự khó khăn, nó chia rẽ các lập trình viên có kinh nghiệm thành các phe phái khác nhau(Twisted là tốt hơn! Không, Tornado tốt hơn! Chờ đã, cả hai thằng đều ngu ngốc, hãy sử dụng Brubeck!), và gây nhầm lẫn cho lập trình viên còn thiếu kinh nghiệm. Concurrency là có thể trong Python, nhưng nó hoàn toàn không phải tính năng dễ dàng của Python.

Tại thời điểm này, bạn có thể khuyên tôi rằng “Ê hãy sử dụng node.js, mọi thứ sẽ được giải quyết”. Có rất nhiều điều để nói về node.js. Javascript hỗ trợ tốt các anonymous function, và nói thật, tốt hơn nhiều so với Python. Tôi cũng đánh giá cao rằng vòng lặp event trong node.js là rõ ràng. Đó là một thiết kế tốt. Tôi cũng đánh giá cao rằng tất cả các thư viện được viết với mô hình đồng thời này; không có câu hỏi về việc liệu một thư viện hiện có tương thích hay không, bởi vì câu trả lời luôn là có.

Nhưng khái niệm đặt mọi thứ vào 1 single thread luôn luôn là sai với tôi. Sử dụng Callback-passing làm lập trình đồng thời biến code trông giống như 1 món súp hổ lốn. Thế còn cluster module? Tôi rất vui vì khái niệm đồng thời được đặt lên hàng đầu, nhưng bây giờ quan điểm lập trình song song parallelism đang được củng cố. Nếu bạn đang không hiểu chúng nó khác nhau như nào,  Concurrency is not Parallelism là 1 bài viết giành cho bạn. Nó không giống như xử lý đa lõi vượt trội, bộ vi xử lý đa lõi đã tồn tại trong nhiều năm. Rằng tôi phải cố gắng sử dụng chúng có vẻ như là một sai lầm. Và làm cách nào để biết rằng công việc sẽ được phân phối cho tất cả các lõi theo cách đồng đều hợp lý? ngay cả khi tôi tìm ra cách thoát khỏi tư duy đơn luồng? Những bài toán dạng này là những bài toán thú vị, nhưng trong bối cảnh muốn viết một chương trình, chúng làm ta phân tâm.

Bây giờ quay lại khoảng thời gian mà tôi đang học ở Hacker School,  Pat Crosby – cựu CTO của okcupid, người thông minh toàn diện, viết 1 ứng dụng gọi là Langalot, nó giống như 1 ứng dụng đa ngôn ngữ dưới dạng web, dịch các ngôn ngữ trên máy chủ khi bạn đang gõ chúng. Nó thực sự là 1 ứng dụng rất nhanh. Tôi đã đặt 1 câu hỏi trên FAQ là “Tại sao nó nhanh như vậy?” Và câu trả lời là “Nó được viết bằng Go”, và đó là lần đầu tiên tôi thực sự thấy một ứng dụng có thể sử dụng được viết bằng Go. Tôi hỏi Pat anh ấy cảm thấy thế nào về điều đó, và anh ấy đã nói rất thuận lợi về ngôn ngữ này, và nói rằng anh ấy rất hài lòng với điều đó nên đã quyết định xây dựng công ty khởi nghiệp mới của mình, StatHat, hoàn toàn bằng Go. Tôi có xu hướng là thử những thứ đang được sử dụng bởi những người trong lĩnh vực có kinh nghiệm hơn tôi, đặc biệt nếu họ là những người mà tôi biết. Đối với tôi, sự chứng thực của Pat là một động lực đủ mạnh để khiến tôi cố gắng và anh ấy gợi ý tôi xem qua  A Tour of Go, và tôi đã không bao giờ phải hối hận.

Tôi sẽ kết thúc bài viết này bằng 2 ví dụ. Đầu tiên là ứng dụng node.js, tôi sử dụng cluster module, và ứng dụng thứ 2 viết bằng Go:

Ứng dụng bằng node.js:

Ứng dụng bằng Go:

Bài viết gốc: https://jordanorelli.com/post/31533769172/why-i-went-from-python-to-go-and-not-nodejs

Code Toàn Bug

Code nhiều bug nhiều!

Leave a Reply

Your email address will not be published. Required fields are marked *