4 điểm bởi GN⁺ 2023-10-20 | 1 bình luận | Chia sẻ qua WhatsApp
  • Thử thách BitTorrent của CodeCrafters hướng dẫn bạn tự triển khai giao thức chia sẻ tệp P2P và tải xuống các tệp được công khai sử dụng
  • Lộ trình học bắt đầu từ giải mã bencode, rồi tiếp tục với phân tích tệp .torrent, tính toán info hash, tìm peer, handshake và tải từng mảnh
  • Nội dung gồm tổng cộng 19 bước, kết hợp 11 bước BitTorrent cơ bản và 8 bước Magnet Links
  • Có thể xem miễn phí cấu trúc các bước và hướng dẫn, nhưng gửi mã và xem lời giải thì cần CodeCrafters Membership
  • Nếu muốn trải nghiệm miễn phí trước, bạn có thể chọn thử thách miễn phí của tháng này là Build your own Shell

Mục tiêu triển khai BitTorrent client

  • Build your own BitTorrent là một thử thách của CodeCrafters, xem BitTorrent như một giao thức chia sẻ tệp P2P để phân phối dữ liệu quy mô lớn và yêu cầu bạn tự triển khai nó
  • Mục tiêu cuối cùng là tạo ra một BitTorrent client có thể tải xuống các tệp được công khai sử dụng thông qua giao thức BitTorrent
  • Trong quá trình đó, bạn cũng sẽ học cách giao thức BitTorrent và tệp .torrent hoạt động

Cấu trúc các bước và độ khó

Điều kiện sử dụng

  • Thử thách này yêu cầu CodeCrafters Membership
    • Có thể học miễn phí toàn bộ cấu trúc thử thách và hướng dẫn từng bước
    • Cần membership để gửi mã và xem lời giải
  • Nếu muốn một thử thách miễn phí, bạn có thể thử Build your own Shell, hiện đang được cung cấp miễn phí trong tháng này

1 bình luận

 
GN⁺ 2023-10-20
Ý kiến trên Hacker News
  • Xin chào! Tôi là Sarp, người tạo ra thử thách Build your own BitTorrent của Codecrafters
    Kể một chút về bối cảnh: sau khi bị sa thải khỏi công việc ở FAANG, tôi gần như không còn động lực quay lại, và bắt đầu tìm một dự án lập trình thú vị để khơi lại hứng thú coding
    Trong thời gian sống kiểu digital nomad, tôi phát hiện Codecrafters trên Nomadlist, và thích cách đẩy code lên Git để vượt qua các bài test theo từng bước. Cách tiến triển được game hóa giúp tôi tập trung, và tôi có thể đào sâu hơn vào những phần mềm mình vẫn dùng như SQLite, Git, Redis. Tôi cũng học Go từ đầu để làm các thử thách
    Khi đã hoàn thành mọi thử thách trên site và không còn việc gì để làm, tôi quyết định xây dựng client BitTorrent, một trong những ý tưởng được bình chọn nhiều
    Khi làm client BitTorrent, tôi đã học được rất nhiều thứ như giao thức BitTorrent, cấu trúc file torrent, các vấn đề về encoding, pipelining các request mạng, URL encoding cho giá trị nhị phân, cách dùng channel trong Go, v.v.
    Tôi muốn nhận feedback về thử thách này, và sẵn sàng trả lời mọi câu hỏi

    • Các tracker chỉ dành cho người được mời thường đặt quy định khá nghiêm ngặt về việc client torrent nào được/không được dùng trên tracker riêng tư của họ. Tôi tò mò không biết có thể vượt qua rào cản này thế nào để được chấp nhận rộng rãi hơn
    • Tôi tò mò bạn đã học cách tạo client BitTorrent như thế nào. Tôi thích ý tưởng của Codecrafters hoặc những cuốn sách hướng dẫn tự tay xây dựng thứ gì đó, nhưng nếu không tìm được điểm bắt đầu thì lúc nào cũng khó
    • Đúng lúc tôi vừa bắt đầu một dự án liên quan đến BitTorrent. Có lẽ tôi sẽ không tự triển khai client, nhưng cũng có thể; ít nhất thì tôi cần triển khai việc tạo file .torrentmagnet link, nên đang học một chút về giao thức
      Thấy thứ này được đăng lên khá thú vị, và có thể sẽ giúp tôi tiến triển
    • Nhìn vào đoạn “Khi đã hoàn thành mọi thử thách trên site và không còn việc gì để làm, tôi quyết định xây dựng client BitTorrent, một trong những ý tưởng được bình chọn nhiều”, tôi thắc mắc hiện giờ bạn có đang được Codecrafters tuyển dụng không
    • Không chắc đây có phải feedback về chính thử thách không, nhưng tôi hơi tiếc vì không thể thêm dependency vào Cargo.toml
      Tôi muốn thử giải một phần thử thách bencode bằng nom; có thể đó là lựa chọn hơi quá tay, nhưng tôi định làm cho vui, còn hiện tại thì không thể
      Nếu lo ngại tải hoặc thời gian chạy của remote builder, sẽ rất tốt nếu có cách chạy test case ở local để tránh vấn đề này
  • Jon Gjengset[1] hiện đang live coding bằng Rust cùng thử thách này trên kênh YT của anh ấy[2]
    [1]: https://thesquareplanet.com/
    [2]: https://www.youtube.com/watch?v=jSTkEPPiULs

    • À, đó là tôi đây!
      Link tốt hơn là https://www.youtube.com/watch?v=jf_ddGnum_4, có đánh dấu chương và đã cắt bỏ đoạn mất điện ở giữa :p
    • Với những người bị chặn YouTube, cũng có bản sao livestream trên Twitch
      [0] https://www.twitch.tv/videos/1954769913
    • Xem anh ấy code thật đáng kinh ngạc. Tôi tự hỏi liệu có những chuyên gia code bằng Python nào khác tương tự không, ngoài Rust
  • Tôi không hiểu vì sao lại cần đăng nhập. Đây là tutorial trả phí à?
    Tutorial miễn phí thì có ở đây
    JS - https://allenkim67.github.io/programming/2016/05/04/how-to-m...
    GO - https://blog.jse.li/posts/torrent/
    Python - https://markuseliasson.se/article/bittorrent-in-python/

    • Các tutorial ở đây cũng có thể hữu ích
      https://github.com/codecrafters-io/build-your-own-x
    • Đây không phải tutorial hay khóa học, mà là một dự án hướng dẫn từng bước, trong đó mỗi bước đều có bài test phía server đi kèm
  • Rốt cuộc vì sao họ lại yêu cầu quyền truy cập tài khoản GitHub của tôi mà không giải thích gì cả?

    • Công bằng mà nói thì họ ghi là chỉ yêu cầu quyền đọc email, nhưng tôi cũng không đi tiếp sau bước đó
    • Tôi nghĩ một trong những lý do là Codecrafters là site học tập, và họ không tự host code của người dùng mà lưu trên GitHub. Bài này nói về một dự án trên Codecrafters
      Dù vậy họ vẫn nên giải thích vì sao cần
    • Có vẻ họ chỉ dùng GitHub làm nhà cung cấp xác thực, chứ không đưa ra lựa chọn thay thế như đăng ký bằng email thông thường. Thường thì các site kiểu này cung cấp nhiều lựa chọn
    • Cần cho xác thực. Link gốc dẫn tới app.codecrafters.io, còn codecrafters.io là trang marketing :)
    • Cấu trúc là nếu bạn đẩy code của thử thách lên Git của mình, một số test sẽ được chạy trên phần triển khai đó
  • Lạ là phần upload lại bị thiếu. Nếu là peer thì đó là các bên tham gia ngang hàng, nên dữ liệu phải chảy hai chiều. Nếu không thì BitTorrent sẽ không hoạt động

    • Đúng vậy. Ban đầu chúng tôi loại nó ra để thu hẹp phạm vi thử thách, vì đã có 11 bước nên khá dài rồi
      Chúng tôi dự định thêm chức năng upload như một phần mở rộng của thử thách, và đây là một trong những ý tưởng mở rộng được cộng đồng bình chọn nhiều
    • Đúng, “Seeding files” là một tính năng mở rộng: https://app.codecrafters.io/vote/challenge-extension-ideas?c...
      Hiện vẫn chưa được hỗ trợ nhưng sẽ sớm có, và các phần mở rộng mới đang được thêm dựa trên bình chọn của người dùng
  • Nếu bạn dùng JavaScript thì có WebTorrent do Feross tạo ra, đưa giao thức này vào ngay trong một tab trình duyệt
    Codebase của nó thật sự rất dễ đọc. Nhiều lập trình viên giỏi viết code hơn là đọc code, nhưng nếu muốn rèn luyện kỹ năng đọc code thì tôi chưa thấy nhiều nơi nào tốt để bắt đầu hơn codebase WebTorrent. Về độ thú vị khi đọc, tôi xếp nó ngang tầm redis
    https://github.com/webtorrent/webtorrent

  • Tôi thật sự rất thích ý tưởng này! Trước đây tôi muốn học Erlang còn bạn tôi muốn học Crystal, nên chúng tôi đã rủ nhau thử làm các client hoàn toàn tùy chỉnh để có thể chia sẻ file với nhau
    Khi đã gửi nhận file được bằng giao thức cơ bản và vài phần mở rộng, cảm giác rất vui. Gọi những phần mở rộng đó là BEP có đúng không nhỉ?
    Đây có lẽ là cách học ngôn ngữ mới mà tôi thích nhất, vì nó đủ đơn giản để hiểu và triển khai

    • CodeCrafters cũng có hỗ trợ Crystal. Bạn có thể làm Build your own Redis
  • Càng qua từng năm, những ý tưởng dự án nhỏ khiến tôi háo hức càng ít đi, và đây là một trong số đó
    Đây là lần đầu tôi nghe về CodeCrafters, nhưng tôi thích các ý tưởng thử thách mang tính học thuật như xây dựng cơ sở dữ liệu. Sẽ rất hay nếu có cả xây dựng compiler

  • Tôi nhớ đến bài viết về việc tạo BitTorrent client bằng Go: https://blog.jse.li/posts/torrent/

  • Vài năm trước ở công ty cũ, chúng tôi đã tạo và hỗ trợ một Linux live OS tùy chỉnh để nhân viên dùng trên các netbook giá rẻ
    Để phân phối bản cập nhật, chúng tôi tự xây một máy chủ torrent nội bộ từ đầu và dùng nó để phát hành các bản cập nhật image
    Đó là một trong những trải nghiệm đầu tiên của tôi khi xây dựng phần mềm theo chuẩn và làm cho nó hoạt động với các client mặc định, nên là một quá trình học hỏi rất tốt