3 điểm bởi GN⁺ 2023-11-28 | 1 bình luận | Chia sẻ qua WhatsApp
  • Trình định dạng mã JavaScript Prettier cho rằng khi logic định dạng đã gần đạt tới mức ổn định, họ có thể thúc đẩy cạnh tranh về hiệu năng thông qua một bản triển khai tương thích dựa trên Rust
  • Ngày 9 tháng 11, Prettier treo thưởng 10.000 USD với điều kiện vượt qua 95% bộ test, và nhờ có thêm đóng góp từ CEO Vercel Guillermo Rauch cùng napi.rs, tổng số tiền đã lên tới 22.500 USD
  • Biome đã nhận tiền thưởng sau khoảng 3 tuần nhiều người cùng nâng mức tương thích, và trong quá trình đó phạm vi tương thích thực tế với Prettier cũng nhanh chóng được mở rộng
  • Trong quá trình khớp các bài test, nhiều lỗi và quyết định đáng nghi của Prettier cũng bị phát hiện, nhờ đó phía Prettier có thêm căn cứ cụ thể để cải thiện
  • Prettier trước nay duy trì việc trả 1.500 USD mỗi tháng cho 2 maintainer từ tiền quyên góp, nhưng hiện ngân sách chỉ còn runway 8 tháng, nên đang cần thêm tài trợ

Biome nhận tiền thưởng của Prettier

  • Prettier là một trình định dạng mã JavaScript được dùng rộng rãi nhờ xử lý cẩn thận rất nhiều cách viết mã khác nhau của người dùng
  • Logic định dạng đã ở trạng thái vững chắc, và họ cho rằng khi phần ternaries được phản ánh đầy đủ thì sẽ đạt tới một giai đoạn thỏa đáng
  • Nhiệm vụ tiếp theo là cải thiện hiệu năng
    • Prettier vốn không phải là công cụ quá nhanh, nhưng vẫn đủ nhanh cho hầu hết các trường hợp sử dụng
    • Để không dậm chân tại chỗ, họ thúc đẩy cải thiện theo cách cạnh tranh thân thiện
  • Điều kiện tiền thưởng và người tham gia

    • Ngày 9 tháng 11, họ đưa ra $10k bounty cho dự án viết bằng Rust nếu dự án đó vượt qua 95% bộ test của Prettier
    • Guillermo Rauch, CEO của Vercel, đóng góp thêm cùng số tiền đó, nâng tổng lên 20.000 USD
    • napi.rs bổ sung thêm 2.500 USD
    • Phía Algora đã tạo một landing page cho chương trình tiền thưởng
  • Kết quả đạt được của Biome

    • Dự án Biome đã nhận được tiền thưởng
    • Trong khoảng 3 tuần, khoảng 12 người đã cùng tham gia cải thiện mức độ tương thích
    • Chi tiết có trong full report của Biome
    • Trong quá trình khớp các bài test, nhiều bugs and questionable decisions của Prettier cũng được phát hiện, và Prettier nhờ đó có thể cải thiện

Áp lực do cạnh tranh hiệu năng tạo ra

  • Lý do nhóm Prettier treo tiền cho dự án khác là để tạo ra cạnh tranh về hiệu năng
    • Prettier từng giữ vị thế áp đảo trong lĩnh vực trình định dạng mã JavaScript
    • Do thiếu cạnh tranh, động lực cải thiện hiệu năng và sửa nhiều edge case là không lớn
  • Giờ đây Biome đã có một bản triển khai vừa tương thích với Prettier vừa nhanh hơn nhiều, và người dùng có thể chuyển sang dùng
  • Fabio Spampinato nhân dịp thử thách này đã profile Prettier CLI một cách nghiêm túc và phát hiện nhiều điểm kém hiệu quả cực đoan
    • Các vấn đề đó dự kiến sẽ được sửa trước cuối năm

Tiền quyên góp và ngân sách bảo trì của Prettier

  • Tiền thưởng của Prettier và hoạt động vận hành liên tục của dự án có thể thực hiện được nhờ những khoản tài trợ lớn từ nhiều cá nhân và công ty
  • Các khoản tài trợ chính từ doanh nghiệp

    • Indeed: 20.000 USD
    • Frontend Masters: 10.850 USD
    • Sentry: 10.529 USD
    • Salesforce: 10.025 USD
    • Airbnb: 8.426 USD
    • Cybozu: 6.086 USD
  • Các khoản tài trợ chính từ cá nhân

    • Shintaro Kaneko: 1.635 USD
    • Suhail Doshi: 1.000 USD
    • icchiman: 500 USD
    • Mariusz Nowak: 270 USD
    • Benoît Burgener: 270 USD
    • Jeremy Combs: 270 USD
    • f_subal: 230 USD
    • Nhờ các khoản tài trợ này, trong 2 năm qua Prettier đã trả 1.500 USD mỗi tháng cho hai người để tiếp tục phát hành các bản release
    • Fisker Cheung và Sosuke Suzuki đảm nhiệm vai trò này
    • Với ngân sách hiện tại, dự án chỉ còn runway 8 tháng, nên đang cần thêm tài trợ
    • Nếu bạn đã dùng Prettier và nhận được lợi ích từ nó, bạn có thể quyên góp tại https://opencollective.com/prettier
    • Open Collective hỗ trợ rất nhiều cho việc vận hành dự án
    • Maintainer có thể đăng ký mà không cần cung cấp thông tin cá nhân
    • Nó hoạt động như một ngân hàng và có thể nhận, gửi tiền trên toàn thế giới
    • Tài liệu thuế được xử lý phù hợp
    • Prettier đã huy động tổng cộng 110.000 USD và đã phân bổ lại 75.000 USD
    • Khoản tiền thưởng lần này chỉ là một lần, nhưng mục tiêu là tiếp thêm năng lượng cho hệ sinh thái định dạng mã để tạo ra trải nghiệm lập trình viên tốt hơn

1 bình luận

 
GN⁺ 2023-11-28
Các ý kiến trên Hacker News
  • Tôi cũng tò mò vì sao nhóm Prettier lại tài trợ cho một dự án khác, nhưng câu trả lời chưa thật sự thuyết phục
    Lẽ ra chỉ cần treo tiền thưởng cho việc cải thiện Prettier; không rõ vì sao lại tạo ra một dự án cạnh tranh để tạo động lực cải thiện Prettier
    Tôi cũng thắc mắc liệu mục tiêu cuối cùng có phải là đóng Prettier và chuyển sang công cụ dựa trên Rust hay không; trông như đang làm một hệ sinh thái vốn đã rối lại bị chia nhỏ thêm một cách không cần thiết

    • Có vẻ có ba lý do khiến việc này trở thành một dự án riêng thay vì tiền thưởng cải thiện Prettier
      Thứ nhất, viết formatter bằng Rust có bản chất khác với cải thiện codebase của Prettier. Prettier không được viết bằng Rust, và Rust đã được chứng minh là một lựa chọn vững chắc để triển khai formatter, nên mục tiêu tự thân gần với việc viết một formatter bằng Rust hơn
      Thứ hai, $20k để viết một formatter Rust thuộc sở hữu của Prettier thì không hấp dẫn. Với một lập trình viên giỏi, số tiền đó chỉ tương đương khoảng 100 giờ làm việc, không đủ để hoàn thành dự án; nhưng nếu phần thưởng là một dự án do chính họ sở hữu thì hấp dẫn hơn nhiều
      Thứ ba, nếu Prettier sở hữu dự án thắng cuộc, trách nhiệm bảo trì cũng sẽ thuộc về nhóm Prettier. Nhóm tạo ra ban đầu sẽ ít có động lực tiếp tục duy trì, cạnh tranh cũng biến mất, khiến hệ sinh thái kém sôi động hơn
    • Từ góc nhìn của người bảo trì mã nguồn mở, điều tôi quan tâm hơn không phải là mọi người dùng triển khai cụ thể của mình, mà là vấn đề được giải quyết
      Việc ai đó dùng mã của tôi cũng không trực tiếp mang lại lợi ích gì; tôi làm việc để tạo ra một giải pháp có thể tiếp cận được. Nếu tôi có đam mê với việc định dạng mã JS, thì có lẽ tôi sẽ khá vui khi ai đó giải quyết vấn đề đó theo cách nhanh hơn
    • Có khác biệt lớn giữa “chúng ta là bên thống trị hiện tại và lập trình viên JavaScript không có lựa chọn thay thế dùng được” với “phía Rust đã làm được và đã có một lựa chọn thay thế khá khả thi”
      Việc này trông giống vấn đề thoát khỏi điểm tối ưu cục bộ. Bạn có thể nhìn vào nút thắt hiệu năng lớn nhất và nói rằng có thể cải thiện, nhưng nếu không có đối tượng so sánh khách quan tốt hơn thì rất khó chắc chắn
      Bắt chước là lời khen chân thành nhất, và bản thân việc chứng minh rằng một vấn đề khó cũng có thể được giải bằng ngôn ngữ khác đã tạo ra giá trị trong quá trình cạnh tranh
      Nếu không có lựa chọn thay thế thực sự thì cũng không có cạnh tranh trọn vẹn. Nếu một triển khai Rust chỉ bỏ qua dưới 5% test suite mà vẫn nhanh hơn, thì khi so với triển khai chuẩn, nó cho ta biết rất nhiều về giới hạn lý thuyết của vấn đề này
      Tôi không hiểu sâu lĩnh vực này, nhưng tôi cho rằng luôn có giá trị vô hình khi có một triển khai tương tự bằng ngôn ngữ khác
    • Khi những người có góc nhìn và ý định khác nhau triển khai, các hướng cải thiện mới có thể lộ ra
      https://biomejs.dev/formatter/#differences-with-prettier
      Biome không đi theo các quyết định giống Prettier mà đã tìm ra nhiều điểm bất tiện nơi họ tách hướng, và chỉ riêng điều đó đã đủ cho thấy giá trị của phát triển song song
    • Một cách tiếp cận với các ràng buộc và gánh nặng khác có thể tìm ra những vùng cải thiện mà dự án gốc không nhìn thấy
      Có thể vì nó không bị mắc kẹt trong cái gọi là lối tư duy kiểu Prettier
  • Có vẻ nhiều người nêu lý do nhưng lại không xem xét phần này: “Trong khi khớp tất cả các bài test, dự án Biome đã phát hiện nhiều lỗi và quyết định đáng ngờ của Prettier, nhờ đó có thể cải thiện chúng”
    Với tôi, điều đó có nghĩa là nhờ một triển khai khác, họ có thể sanity check triển khai của chính mình

  • Tôi thật sự rất háo hức trước tin này
    Tốc độ nhóm Biome đạt 95% tương thích với Prettier nhanh đến đáng kinh ngạc https://github.com/biomejs/biome/issues/720
    Nhờ Rust, có thể tăng đáng kể tốc độ định dạng JavaScript, tương tự xu hướng của Python formatter ruff
    Bài viết không nhắc đến, nhưng Wasmer cũng treo tiền thưởng $2.500 cho việc biên dịch Biome sang WASIX, và thật thú vị khi thấy nhóm đó làm việc cho mục tiêu này
    Hy vọng Biome sẽ sớm chạy được trên Wasmer: https://wasmer.io/, https://wasix.org/, https://console.algora.io/challenges/prettier

    • Đây là lần đầu tôi thấy WASIX; đọc qua thì nó trông như sự tái sinh của JVM
      Tôi tự hỏi liệu cách hiểu này có đúng không. Nếu nó có thể truy cập hệ thống và không phải một sandbox thực sự, tôi không hiểu lợi ích của việc chạy mã trên WASIX là gì
    • Tôi tò mò liệu có ai biết lý do muốn làm cho Biome có thể biên dịch sang WASIX không
  • Cải thiện tốc độ thì lúc nào cũng đáng hoan nghênh, nhưng ước gì Prettier bớt áp đặt hơn một chút
    Đặc biệt là liên quan đến độ dài dòng, nó không chịu để yên định dạng của tôi. Code được định dạng bằng Prettier khó đọc hơn nhiều so với code chưa định dạng, và đây là vấn đề tôi không gặp ở các formatter khác như rustfmt

    • Tôi tò mò liệu có ví dụ nào cho thấy code Prettier khó đọc hơn nhiều không
      Tôi không gặp vấn đề đó mấy và khá hài lòng với Prettier
    • Không biết bạn đã thử tùy chọn print width chưa: https://prettier.io/docs/en/options.html#print-width
    • Vấn đề thật sự của Prettier là nó gần như đã trở thành chuẩn trên thực tế
      Cá nhân tôi hoàn toàn không thích Prettier nhưng lại thích Svelte, và formatter chính thức của Svelte, theo tôi biết, dùng Prettier. Vì vậy tôi dùng Prettier cho Svelte, và một vài thứ khác cũng vậy
      Nếu là tình huống người dùng được chọn công cụ, nguyên tắc “rất áp đặt, nếu muốn cấu hình thì đi chỗ khác” có thể rất tuyệt. Nhưng khi nó trở thành lựa chọn gần như duy nhất đối với một nhóm người dùng nhất định, nó nên cho phép cấu hình nhiều hơn một chút
    • Liên quan đến độ dài dòng, Prettier còn có các tác dụng phụ tinh vi hơn, nên tôi tránh các formatter quá áp đặt
      Prettier thay đổi diff theo những cách không mong muốn
      Nếu bạn xóa một thành viên trong destructuring assignment và làm dòng ngắn xuống dưới giới hạn độ dài, diff có thể không phải 0/-1 mà là +1/-5. Reviewer khó nhìn ngay ra chính xác thứ gì đã bị bỏ đi giữa 5 dòng bị xóa và 1 dòng được thêm
      Nếu bạn cố sửa một lỗi chính tả trong commit trước đó bằng interactive rebase của Git, Prettier có thể định dạng lại cả khối code khiến các commit tiếp theo không áp dụng được
      Sau khi cấu hình pre-commit hook để chạy Prettier, hãy thử chỉ stage một phần thay đổi trong file xem, sẽ lại có những vấn đề thú vị. Tôi xin kiếu
    • Đồng ý. Thậm chí tôi còn muốn nói xa hơn rằng nếu Prettier chưa từng tồn tại thì đã tốt hơn
  • Tôi vẫn bực vì nhiều plugin eslint đã loại bỏ các linter đang hoạt động ổn và thay bằng Prettier
    Prettier quá cưỡng ép, khó suy luận, và là thêm một công cụ nữa mà tôi chưa từng muốn có

    • Các rule style bị loại bỏ đã được port sang một dự án mới: https://eslint.style/guide/why
    • Mục đích của những công cụ như vậy chính là chấm dứt tranh luận về style
    • Tôi không rõ trong trường hợp nào bạn cần “suy luận” về Prettier
      Tôi chỉ nghĩ đến việc thỉnh thoảng có vấn đề merge conflict
  • Đúng là có xu hướng port sang Rust, nhưng vì Prettier chạy mỗi lần lưu nên cải thiện tốc độ sẽ khá đáng kể
    Tôi sẽ sớm thử Biome, và xin chúc mừng dự án Biome

    • Tôi chưa từng cảm thấy độ trễ khi Prettier chạy trên một file đơn lẻ
      Hiệu năng chỉ trở nên quan trọng khi chạy format trên toàn bộ repository
      Với sử dụng tương tác, nên dùng một process chạy lâu và đã được warm-up, khi đó thời gian khởi động Node không còn quan trọng. Lý tưởng nhất là type checking, linting, highlighting và formatting nằm trong cùng một language service, thực hiện parsing gia tăng theo từng phím gõ và cập nhật AST dùng chung
    • Việc này khiến tôi nhớ đến cơn sốt ruff trong cộng đồng Python
      Tôi kỳ vọng các cải thiện về hiệu quả và tốc độ có tác động rộng
    • Tôi khuyên dùng công cụ lint-staged để Prettier chỉ chạy trên các file đã thay đổi mỗi lần lưu, chứ không chạy toàn bộ
      Trong các dự án lớn, khác biệt là rất lớn
  • “Giờ đây chúng ta có thể tập trung vào khía cạnh quan trọng tiếp theo: hiệu năng. Prettier vốn dĩ chưa bao giờ thật sự nhanh, nhưng đủ nhanh cho hầu hết mục đích sử dụng. Điều này luôn khiến tôi không hài lòng, nên tôi muốn làm gì đó. Còn cách nào tốt hơn cạnh tranh thân thiện? Ngày 9 tháng 11, tôi treo tiền thưởng $10k cho một dự án Rust vượt qua 95% test suite của Prettier”
    Tôi không hiểu việc một thứ được viết bằng Rust thì hiệu năng tốt hơn tự động suy ra như thế nào. Hoàn toàn có thể chỉ cần transpile codebase hiện tại sang Rust rồi nhận thưởng

    • Khi thấy từ “chỉ cần”, tôi thường nghĩ việc tiếp theo sẽ không hề đơn giản
      Vì nếu thật sự đơn giản thì chẳng cần phải thêm từ bổ nghĩa đó
      Trong trường hợp này, tôi không rõ transpile một codebase JavaScript sang Rust có đơn giản không. Hai ngôn ngữ có mô hình tư duy, thư viện sử dụng và cách viết code khá khác nhau, và dù có JS-to-Rust transpiler tồn tại, tôi nghi ngờ liệu nó có đủ vững chắc để dùng cho một codebase cỡ Prettier không
    • Rust mang tính idiomatic thường nhanh hơn 5–10 lần so với code JavaScript/TypeScript trông tương tự mà không cần tối ưu hóa gì đặc biệt
      Còn tùy tác vụ và không phải lúc nào cũng vậy, nhưng các loại parser xử lý nhiều thao tác chuỗi chắc chắn thuộc nhóm này
    • Trong xử lý chuỗi, Rust nhanh hơn JS rất nhiều
      https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/fasta.html
      https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/knucleotide.html
    • Câu trả lời tôi nhận được từ vjeux là: “Dạo này có nhiều công cụ web nhanh được viết bằng Rust”
      https://twitter.com/Vjeux/status/1722769322299609565
      Tôi không thấy thuyết phục, và có vẻ vjeux đã chạy theo trào lưu Rust
  • Dự án chiến thắng, Biome, là một fork hoặc bản đổi tên của dự án Rome do Sebastian McKenzie, tác giả Babel, khởi xướng vài năm trước
    Có vẻ sebmck đã vắng mặt khoảng một năm qua, và vì nhiều quyền truy cập tài nguyên của dự án chỉ do anh ấy nắm giữ nên các contributor không thể cập nhật, dẫn đến việc fork
    Mong anh ấy vẫn ổn, và ngoài chuyện đó ra, tôi mừng vì dự án Biome có vẻ đang tiến triển tốt

  • Không rõ vì sao nhất thiết phải là Rust
    Chỉ cần “nhanh hơn” thôi không được sao? Bản triển khai bằng Rust có thực sự nhanh không? Tôi cũng nghi ngờ liệu những thứ như an toàn bộ nhớ hay rò rỉ có thật sự quan trọng đối với một chương trình như Prettier hay không

    • Đặc biệt trên HN có nhiều người lên tiếng mạnh mẽ cho rằng Rust hiện là ngôn ngữ nhanh nhất và an toàn nhất
      Vì vậy ở một mức độ nào đó, đây có thể là một thử thách treo thưởng kiểu “nếu đã nói vậy thì hãy tự chứng minh đi”
  • Tôi tò mò không biết benchmark của Biome có ở đâu không
    Chính xác thì hiệu năng tốt hơn Prettier bao nhiêu?

    • Tôi tìm thấy một phần ở đây: https://github.com/biomejs/biome/blob/main/benchmark/README.md
      Họ tuyên bố là 25 lần, nhưng số liệu đã cũ, nên không biết hiện tại khi đã bổ sung nhiều tính năng thì có còn tin nguyên như vậy được không. Dù vậy, nếu vẫn ở gần mức đó thì đó là một thành tựu rất lớn