Phần mềm nguồn mở giữa một dư luận thiếu hiểu biết nhưng thích chửi bới

Gần đây rộ lên vụ lùm xùm của app Visafe. Lúc đầu mình không quan tâm lắm, nhưng càng ngày càng thấy nhiều người truyền bá tư tưởng sai lệch về phần mềm nguồn mở nên mình nghĩ phải viết bài này thôi, không thì họ bôi vẽ phần mềm nguồn mở thành một thứ gì đó ích kỷ mất.

Trước tiên, để biết mình có đủ kiến thức để bàn về vấn đề này không thì mình xin giới thiệu, mình theo con đường phần mềm nguồn mở khá lâu rồi (từ 2010 - 2012 gì ấy), thậm chí là một trong số ít những lập trình viên VN đi theo con đường này, đến nỗi nhiều khi cảm thấy mình hơi lẻ loi và khác người. Bản thân mình đã đóng góp code cho hàng chục dự án phần mềm nguồn mở, và các sản phẩm cá nhân của mình cũng đều mở mã nguồn ra hết (https://github.com/hongquan). Mình thậm chí còn có dăm dòng code đóng góp cho sản phẩm của Google và từng được Google gửi thư mời đến dự một hội nghị về phần mềm nguồn mở do Google tổ chức (nhưng chuyến đi đó không thành vì rớt visa).

Ý kiến mà người ta chửi về Visafe là "ăn cắp, sao chép", cho rằng việc "sao chép, đổi tên" là một hành vi xấu xa. Nhưng hỡi ôi, phần mềm gốc mà Visafe sao chép là Adguard, là một phần mềm nguồn mở cơ mà. Trái với quan niệm và tư duy "đóng" của nhiều người, việc "sao chép, sửa đổi" trong phần mềm mã nguồn mở lại là hành vi được khuyến khích. Khuyến khích nên mới mở. Sau khi sao chép, sửa đổi thì bản phái sinh đó cũng phải được mở, công khai để người khác có thể tùy ý sao chép, sửa đổi nó và duy trì mãi. Cho nên tội lỗi của Visafe có hay không là ở việc họ có mở mã nguồn ra trước khi bị tác giả của Adguard "bóc phốt" hay không. Khi phần mềm được "mở mã nguồn", nó được phát hành theo một giấy phép phần mềm nguồn mở cụ thể nào đó, như GPL, Apache, MIT v.v... Trách nhiệm của người sao chép mã nguồn đó như thế nào là tùy theo giấy phép đó quy định. Chẳng hạn giấy phép GPL yêu cầu bản phái sinh cũng được phát hành theo cùng giấy phép GPL. Các giấy phép "thoáng" hơn như Apache, MIT, BSD thì cho "mày muốn làm gì cũng được, miễn là mày ghi tên tao, người làm phần mềm gốc, và ghi nhận tên phần mềm gốc".

...

Trải nghiệm lần đầu viết thư viện Python từ ngôn ngữ biên dịch

Có một người bạn mà mình từng ngồi nhiều cafe để bàn về những công nghệ mới để phục vụ cho dự án công ty. Một câu hỏi mà bạn hay đặt ra là dùng ngôn ngữ lập trình gì tiếp theo. Mình thì khá dày dạn về Python và đã từng xây dựng nền móng cho những dự án Python ở công ty bạn. Tuy nhiên, mình và bạn đều đồng ý là nên mở rộng phạm vi công nghệ để thích ứng với nhiều thể loại dự án khác nhau. Đi tham vấn nhiều nơi, được nghe khen ngợi về Go nên bạn rất muốn một lần được áp dụng Go trong cty của bạn. Còn mình thì, nếu đã chọn một ngôn ngữ biên dịch và phải bỏ thời gian cá nhân ra học thì mình thà chọn Rust hơn. Tất nhiên, ý thức được độ khó của Rust nên mình chả bao giờ muốn đem Rust vào công ty của bạn cả.

Trong khi lý do thường được nêu ra để chọn Go là cú pháp đơn giản, ít keyword, dễ học, thì với mình, độ khó của Rust là thứ đáng để đầu tư. Thà chịu khó ban đầu nhưng gặt hái kết quả tốt về sau. Ngoài ra, điều khiến mình ưu ái Rust hơn Go là ở chỗ Rust không có garbage collector, không có runtime riêng, nên có thể dùng Rust để viết thư viện tầng dưới, phục vụ cho Python và các ngôn ngữ khác được, chưa kể, việc được thiết kế tốt và không có bộ runtime khiến Rust là ngôn ngữ duy nhất (ngoài C) khiến tác giả của Linux muốn thấy nó được ứng dụng vào nhân Linux. Lý do viết thư viện đã được mình hiện thực hóa, bằng một sản phẩm cá nhân là Defity, thư viện dành cho Python và dùng để nhận dạng loại file.

Defity

Hoàn cảnh ra đời

...

Họ tên có phản ánh nguồn gốc dân tộc không?

Vừa rồi nghỉ dịch, ngoài thông tin về dịch lan tràn khắp mạng XH, đây đó nhiều người vẫn tiếp tục những chủ đề chuyên môn của họ, như là mảng lịch sử. Chỉ trong thời gian ngắn mà mình bắt gặp một ý kiến nổi lên hai lần, ấy là có mấy bạn thấy các tên họ của người Việt đều là "gốc Tàu" xong suy luận là người Việt có gốc Trung Quốc.

Mình thì không có ý kiến gì về gốc gác họ tên, lẫn chẳng có ý kiến gì về nguồn gốc người Việt (việc đó khó quá, nên để nhiều ngành khoa học hợp tác làm). Chỉ muốn nói cách suy luận đó là hệ quả của sự "học lệch". Vì chỉ đọc sử Trung Quốc, theo dõi các chuyện văn hóa nghệ thuật của khối Đông Á nên các bạn ấy không ngờ rằng trên đời, việc một dân tộc này dùng họ tên của tiếng dân tộc khác là chuyện thường tình. Ví dụ trong Đông Nam Á này thôi, người Malay thì lấy tên từ tiếng Ả Rập (chẳng hạn thanh niên trong hình là Syed Saddiq bin Syed Abdul Rahman, còn trẻ thế mà đã làm Bộ trưởng của Malaysia rồi), người Philippines thì lấy tên gốc Tây Ban Nha, người Thái Lan, Indonesia thì lấy tên gốc tiếng Phạn (Ấn Độ). Các nước còn lại cũng thường lấy tên có một nửa gốc tiếng Phạn, Pali. Tên họ không phản ánh nguồn gốc dân tộc mà chỉ là kết quả của sự ảnh hưởng văn hóa, những tác động chính trị. Người Malay lấy tên tiếng Ả Rập vì họ cải theo đạo Islam. Người Philippines lấy tên tiếng Tây Ban Nha vì họ rơi vào sự thống trị của thực dân TBN ngay từ khi họ chưa kịp tạo dựng một nhà nước quân chủ thống nhất với nền tảng văn hóa đủ dày. Thái Lan và Indonesia thậm chí có luật bắt buộc công dân phải đặt tên sao cho chỉ được dùng các từ gốc tiếng Phạn, thành thử có nhiều người gốc Hoa nhưng lại có tên Vichai, Sri, Rahman, thay vì những Wong, Tan, Ng như bên Malaysia, Singapore.

Syed Saddiq

Nhân nói về họ tên, có một điều thú vị là không như khối Đông Á, nơi "phần họ" được duy trì từ ông xuống cha, con, cháu, thì trong một số truyền thống văn hóa khác, "họ" chỉ đơn giản là "con ông X" thôi, nên sẽ thay đổi theo thế hệ (dùng tên cha lấp vào phần "họ" của con). Ví dụ như anh chàng bộ trưởng phía trên, theo https://desklib.com/document/a-leader-is-someone-who-can-identify-way/ thì cha ông tên "Syed Andul Rahman" và mẹ ông tên "Sharifah Mahani binti Syed Abdul Aziz". Chữ "bin" ở đây nghĩa là "con trai của ông..." và "binti" là "con gái của ông...". Ngoài ra thì người Myanmar vẫn còn giữ truyền thống là "không có họ".

...

Khởi đầu dự án Python như thế nào để thuận tiện phát triển lên

Thỉnh thoảng mình có mối duyên ghé mắt qua các dự án Python, thấy cách sắp đặt vẫn còn chuệch choạc, không có lợi lắm cho việc phát triển tiếp diễn. Nên sau đây mình chia sẻ một số cách thức, công cụ, thư viện mà bạn nên chuẩn bị từ đầu, để công việc sau đó trở nên thoải mái hơn. Cách sắp đặt này có thể coi là chuẩn trong những năm 2020 này (nhưng có thể trở thành lạc hậu sau 5 năm nữa).

1. Quản lý các gói phụ thuộc

Gói phụ thuộc (dependency) là các thư viện / công cụ bên ngoài mà dự án của bạn cần. Các gói này phải được cài trước khi phần mềm của bạn có thể chạy. Ví dụ bạn làm về khoa học dữ liệu thì sẽ cần NumPy, làm web thì sẽ cần Django v.v... Việc một dự án phụ thuộc vào hàng chục gói thư viện khác là chuyện bình thường. Thông thường các gói này sẽ được liệt kê trong file requirements.txt để khi sao chép dự án sang máy khác thì biết cần cài cái gì. Tuy nhiên, file requirements.txt chỉ là hình thức tối thiểu để quản lý gói phụ thuộc. Nó không đủ để hỗ trợ tình huống phức tạp hơn. Ví dụ dự án của bạn sử dụng thư viện A phiên bản v1 và B phiên bản v2. Sau vài tháng nhu cầu nảy sinh, bạn cần thêm tính năng mới, và để làm tính năng mới, bạn cần đến thư viện C. Tuy nhiên thư viện C này cũng lại phụ thuộc thư viện A, và thư viện C đang có nhiều phiên bản, v1 đến v5, mỗi phiên bản của C sẽ thương thích với một phiên bản A khác nhau. Nếu bạn nhắm mắt chọn phiên bản mới nhất của C thì nó sẽ yêu cầu A v3. Bạn không thể mù quáng nâng cấp A lên v3 vì có thể phần mềm của bạn không tương thích và đứt gãy. Nhưng trong 5 phiên bản của C mà thử từng cái một thì rất cực. Đó là lúc bạn cần một thứ nâng cao hơn file requirements.txt.

Một công cụ hiện đại mà mình hay dùng, và khuyên dùng cho tình huống này là Poetry. Khi bạn cần thêm C vào danh sách phụ thuộc, chỉ cần chạy:

...

API mở cung cấp dữ liệu công cộng Việt Nam

Dạo này tình hình dịch bệnh nghiêm trọng, phải ở nhà cả ngày nên mình tranh thủ làm một bộ API HTTP giúp truy cập dữ liệu mở, công cộng của Việt Nam.

Sản phẩm đầu tiên là API cung cấp dữ liệu tỉnh thành Việt Nam tại provinces.open-api.vn, ra mắt vào tháng trước:

Province API

API này dựa trên một thư viện Python, VietnamProvinces, mà mình đã xây dựng hồi còn làm việc tại SunshineTech.

...