4 คะแนน โดย GN⁺ 2023-10-20 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ชาเลนจ์ BitTorrent ของ CodeCrafters ครอบคลุมกระบวนการลงมือสร้าง โปรโตคอลแชร์ไฟล์แบบ P2P เพื่อดาวน์โหลดไฟล์ที่เปิดให้ใช้งานสาธารณะ
  • ลำดับการเรียนรู้เริ่มจาก การถอดรหัส bencode ต่อด้วยการพาร์สไฟล์ .torrent, การคำนวณ info hash, การค้นหา peer, handshake และการดาวน์โหลดชิ้นส่วนไฟล์
  • ประกอบด้วยทั้งหมด 19 ขั้นตอน โดยรวม 11 ขั้นตอน BitTorrent พื้นฐาน และ 8 ขั้นตอนของ Magnet Links
  • สามารถดูโครงสร้างขั้นตอนและคำแนะนำได้ฟรี แต่ต้องมี CodeCrafters Membership สำหรับ การส่งโค้ด และการดูโซลูชัน
  • หากต้องการทดลองฟรีก่อน สามารถเลือกชาเลนจ์ฟรีประจำเดือนนี้คือ Build your own Shell ได้

เป้าหมายของการสร้างไคลเอนต์ BitTorrent

  • Build your own BitTorrent เป็นชาเลนจ์ของ CodeCrafters ที่มอง BitTorrent เป็น โปรโตคอลแชร์ไฟล์แบบ P2P สำหรับกระจายข้อมูลปริมาณมาก และให้ลงมือสร้างด้วยตัวเอง
  • เป้าหมายสุดท้ายคือการสร้าง ไคลเอนต์ BitTorrent ที่สามารถดาวน์โหลดไฟล์ที่เปิดให้ใช้งานสาธารณะผ่านโปรโตคอล BitTorrent ได้
  • ระหว่างทางจะได้เรียนรู้ทั้งโปรโตคอล BitTorrent และวิธีการทำงานของ ไฟล์ .torrent

โครงสร้างขั้นตอนและระดับความยาก

เงื่อนไขการใช้งาน

  • ชาเลนจ์นี้ต้องใช้ CodeCrafters Membership
    • สามารถเรียนรู้โครงสร้างชาเลนจ์ทั้งหมดและคำแนะนำในแต่ละขั้นตอนได้ฟรี
    • ต้องมีสมาชิกภาพสำหรับการส่งโค้ดและการดูโซลูชัน
  • หากต้องการชาเลนจ์ฟรี สามารถลอง Build your own Shell ซึ่งเปิดให้ใช้ฟรีในเดือนนี้ได้

1 ความคิดเห็น

 
GN⁺ 2023-10-20
ความคิดเห็นจาก Hacker News
  • สวัสดีครับ! ผมชื่อ Sarp เป็นคนสร้างชาเลนจ์ Build your own BitTorrent ของ Codecrafters
    ขอเล่าที่มาสักหน่อย หลังจากถูกเลิกจ้างจากงานที่ FAANG ผมแทบไม่มีแรงจูงใจอยากกลับไปทำงานแบบนั้นอีก และเริ่มมองหาโปรเจกต์เขียนโปรแกรมสนุก ๆ ที่จะช่วยปลุกความสนใจในการโค้ดดิ้งกลับมา
    ระหว่างใช้ชีวิตแบบดิจิทัลโนแมด ผมเจอ Codecrafters บน Nomadlist และชอบรูปแบบที่ให้ push โค้ดขึ้น Git เพื่อผ่านการทดสอบทีละขั้น วิธีดำเนินความคืบหน้าแบบ gamification ช่วยให้มีสมาธิ และทำให้ได้เจาะลึกซอฟต์แวร์ที่เคยใช้อยู่แล้วอย่าง SQLite, Git, Redis มากขึ้น ผมยังเรียน Go ใหม่เพื่อทำชาเลนจ์ด้วย
    พอทำชาเลนจ์ทั้งหมดบนไซต์เสร็จจนไม่มีอะไรให้ทำแล้ว ผมจึงตัดสินใจสร้าง ไคลเอนต์ BitTorrent ซึ่งเป็นหนึ่งในไอเดียที่มีคนโหวตเยอะ
    ระหว่างสร้างไคลเอนต์ BitTorrent ผมได้เรียนรู้อะไรมากมาย ทั้งโปรโตคอล BitTorrent, โครงสร้างไฟล์ทอร์เรนต์, ปัญหาเรื่อง encoding, การทำ pipelining ของ network request, การ URL encode ค่าบายินารี, การใช้ channel ใน Go ฯลฯ
    อยากได้ฟีดแบ็กเกี่ยวกับชาเลนจ์ และยินดีตอบคำถามครับ

    • แทร็กเกอร์แบบเชิญเท่านั้นมักจะกำหนดค่อนข้างเข้มงวดว่าใน private tracker ของตัวเองใช้ไคลเอนต์ทอร์เรนต์ตัวไหนได้หรือไม่ได้บ้าง อยากรู้ว่าจะข้ามอุปสรรคนี้ได้อย่างไรถ้าต้องการให้มีการใช้งานกว้างขึ้น
    • อยากรู้ว่าเรียนรู้วิธีสร้างไคลเอนต์ BitTorrent มาอย่างไร ผมชอบไอเดียของ Codecrafters หรือหนังสือที่นำทางให้สร้างบางอย่างเอง แต่ถ้าจับจุดเริ่มต้นไม่ได้ก็ลำบากเสมอ
    • บังเอิญเพิ่งเริ่มโปรเจกต์เกี่ยวกับ BitTorrent พอดี คงไม่ได้ลงมือ implement ไคลเอนต์เอง แต่ก็อาจจะทำก็ได้ และอย่างน้อยต้อง implement การสร้าง ไฟล์ .torrent กับ magnet link เลยกำลังเรียนรู้โปรโตคอลอยู่บ้าง
      น่าสนใจที่มีสิ่งนี้โผล่มา และอาจช่วยให้เดินหน้าต่อได้
    • จากประโยคที่ว่า “พอทำชาเลนจ์ทั้งหมดบนไซต์เสร็จจนไม่มีอะไรให้ทำแล้ว ผมจึงตัดสินใจสร้างไคลเอนต์ BitTorrent ซึ่งเป็นหนึ่งในไอเดียที่มีคนโหวตเยอะ” เลยสงสัยว่าตอนนี้ได้ทำงานกับ Codecrafters แล้วหรือเปล่า
    • ไม่แน่ใจว่าเป็นฟีดแบ็กเกี่ยวกับตัวชาเลนจ์ไหม แต่เสียดายนิดหน่อยที่เพิ่ม dependency ใน Cargo.toml ไม่ได้
      ผมอยากลองแก้บางส่วนของชาเลนจ์ bencode ด้วย nom ซึ่งอาจจะเกินจำเป็น แต่ตั้งใจลองเล่นสนุก ๆ และตอนนี้ทำไม่ได้
      ถ้ากังวลเรื่องโหลดของ remote builder หรือเวลาในการรัน ก็น่าจะมีวิธีให้ รัน test case ในเครื่อง local เพื่อหลีกเลี่ยงปัญหานี้ได้
  • Jon Gjengset[1] กำลัง ไลฟ์โค้ดชาเลนจ์เดียวกันด้วย Rust บนช่อง YT[2] ของเขาอยู่
    [1]: https://thesquareplanet.com/
    [2]: https://www.youtube.com/watch?v=jSTkEPPiULs

    • อ้อ นั่นผมเองครับ!
      ลิงก์ที่ดีกว่าคือ https://www.youtube.com/watch?v=jf_ddGnum_4 มีการใส่ chapter และตัดช่วงไฟดับตรงกลางออกแล้ว :p
    • สำหรับคนที่เข้า YouTube ไม่ได้ มีสำเนาไลฟ์สตรีมบน Twitch ด้วย
      [0] https://www.twitch.tv/videos/1954769913
    • การดูเขาเขียนโค้ดนั้นน่าทึ่งมาก อยากรู้ว่ามี ผู้เชี่ยวชาญที่โค้ดด้วย Python แบบนี้อีกไหม นอกจาก Rust
  • ไม่เข้าใจว่าทำไมต้องล็อกอินด้วย นี่เป็น บทเรียนแบบเสียเงิน เหรอ?
    บทเรียนฟรีอยู่ที่นี่
    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/

    • บทเรียนที่อยู่ที่นี่ก็น่าจะมีประโยชน์เช่นกัน
      https://github.com/codecrafters-io/build-your-own-x
    • นี่ไม่ใช่บทเรียนหรือคอร์ส แต่เป็นโปรเจกต์แบบมีคำแนะนำทีละขั้น โดยแต่ละขั้นมี การทดสอบฝั่งเซิร์ฟเวอร์ ประกอบ
  • ไม่เข้าใจเลยว่าทำไมจู่ ๆ ถึงขอ สิทธิ์เข้าถึงบัญชี GitHub ของผมโดยไม่มีคำอธิบายอะไร

    • พูดอย่างเป็นธรรม มันระบุว่าขอสิทธิ์อ่านอีเมลเท่านั้นก็จริง แต่ผมเองก็ไม่ได้ไปต่อหลังจากขั้นตอนนั้นเหมือนกัน
    • เหตุผลหนึ่งน่าจะเป็นเพราะ Codecrafters เป็นไซต์เรียนรู้ และไม่ได้โฮสต์โค้ดของผู้ใช้เอง แต่ เก็บไว้บน GitHub บทความนี้พูดถึงโปรเจกต์หนึ่งใน Codecrafters
      ถึงอย่างนั้นก็ควรอธิบายว่าทำไมถึงจำเป็น
    • ดูเหมือนจะใช้ GitHub เป็นเพียงผู้ให้บริการยืนยันตัวตน โดยไม่ได้ให้ทางเลือกอย่างการสมัครด้วยอีเมลทั่วไป ปกติไซต์แบบนี้มักมีหลายตัวเลือก
    • จำเป็นสำหรับการยืนยันตัวตน ลิงก์ต้นฉบับไปที่ app.codecrafters.io ส่วน codecrafters.io เป็นหน้า marketing :)
    • โครงสร้างคือถ้าเอาโค้ดชาเลนจ์ขึ้น Git ของตัวเอง ก็จะมีการรันการทดสอบบางอย่างกับ implementation นั้น
  • น่าแปลกที่ส่วนอัปโหลดหายไป ถ้าเป็น peer ก็หมายถึงผู้เข้าร่วมที่เท่าเทียมกัน ดังนั้นข้อมูลควรไหลได้ทั้งสองทาง ไม่อย่างนั้น BitTorrent ก็คงทำงานไม่ได้

    • ใช่ ตอนแรกตัดออกเพื่อจำกัดขอบเขตของชาเลนจ์ เพราะตอนนี้ก็มี 11 ขั้นตอนแล้ว ค่อนข้างยาวอยู่
      มีแผนจะเพิ่ม ฟีเจอร์อัปโหลด เป็นส่วนขยายของชาเลนจ์ และเป็นหนึ่งในไอเดียส่วนขยายที่ชุมชนโหวตกันมาก
    • ใช่ “Seeding files” เป็นฟีเจอร์ส่วนขยาย: https://app.codecrafters.io/vote/challenge-extension-ideas?c...
      ตอนนี้ยังไม่รองรับ แต่จะเปิดให้ใช้เร็ว ๆ นี้ และส่วนขยายใหม่ ๆ จะเพิ่มตามผลโหวตของผู้ใช้
  • ถ้าใช้ JavaScript ก็มี WebTorrent ที่ Feross สร้างไว้ ซึ่งนำโปรโตคอลนี้เข้าไปทำงานในแท็บเบราว์เซอร์ได้
    โค้ดเบสอ่านได้ดีมาก นักพัฒนาหลายคนเขียนโค้ดเก่งกว่าอ่านโค้ด ถ้าอยากฝึกทักษะการอ่านโค้ด ผมไม่ค่อยเห็นที่ไหนเหมาะสำหรับเริ่มต้นเท่าโค้ดเบสของ WebTorrent ในแง่ความสนุกในการอ่าน ผมจัดให้อยู่ระดับเดียวกับ redis
    https://github.com/webtorrent/webtorrent

  • ชอบไอเดียนี้มาก! เมื่อก่อนผมอยากเรียน Erlang และเพื่อนอยากเรียน Crystal เลยคุยกันว่าจะลองทำให้แชร์ไฟล์กันได้ด้วยไคลเอนต์ที่คัสตอมเองทั้งหมด
    ตอนที่ทำให้รับส่งไฟล์กันได้ด้วยโปรโตคอลพื้นฐานและส่วนขยายบางอย่าง สนุกมาก ส่วนขยายพวกนั้นเรียกว่า BEP ใช่ไหม?
    น่าจะเป็นวิธีเรียนภาษาใหม่ที่ผมชอบที่สุด เพราะมันเรียบง่ายพอให้เข้าใจและนำไป implement ได้

    • CodeCrafters ก็รองรับ Crystal ด้วย สามารถทำ Build your own Redis ได้
  • ยิ่งเวลาผ่านไป ไอเดียโปรเจกต์เล็ก ๆ ที่ทำให้ตื่นเต้นก็ยิ่งน้อยลง แต่ไอเดียนี้เป็นหนึ่งในนั้น
    เพิ่งเคยได้ยิน CodeCrafters เป็นครั้งแรก แต่ชอบ ไอเดียชาเลนจ์เชิงวิชาการ อย่างการสร้างฐานข้อมูลเอง ถ้ามีสร้างคอมไพเลอร์ด้วยก็น่าจะดี

  • นึกถึงบทความที่สร้าง BitTorrent client ด้วย Go: https://blog.jse.li/posts/torrent/

  • หลายปีก่อนที่บริษัทเก่า ผมเคยสร้างและดูแล Linux live OS แบบคัสตอมให้พนักงานใช้บนเน็ตบุ๊กราคาถูก
    เพื่อแจกจ่ายอัปเดต เราสร้างเซิร์ฟเวอร์ทอร์เรนต์ภายในขึ้นมาเองตั้งแต่ศูนย์ และใช้มันแจกจ่ายอัปเดตอิมเมจ
    เป็นหนึ่งในประสบการณ์แรก ๆ ที่ได้ทำซอฟต์แวร์ให้เป็นไปตามมาตรฐานและใช้งานร่วมกับไคลเอนต์พื้นฐานได้ จึงเป็นกระบวนการเรียนรู้ที่ดี