JavaScript สิบเอ็ดบรรทัดทำให้เกิดปัญหาอินเทอร์เน็ต การยกเลิกเผยแพร่หนึ่งครั้ง
22 มีนาคม 2016, 21:30 UTC: นักพัฒนาคนหนึ่งยกเลิกการเผยแพร่แพ็กเกจ npm ทั้งหมด 273 รายการของเขา หลังจาก npm ได้มอบชื่อแพ็กเกจ "kik" ให้กับ Kik ซึ่งเป็นแอปส่งข้อความ ที่ตัวแทนสิทธิบัตรของ Kik เคยขู่ว่า "ทนายความจะมาเคาะประตูบ้านคุณ" หนึ่งใน 273 แพ็กเกจนั้นคือ left-pad: โค้ดสิบเอ็ดบรรทัดที่ใช้เพิ่มช่องว่างด้านหน้าสตริง ซึ่งถูกดาวน์โหลด 2.5 ล้านครั้งต่อเดือน ภายในไม่กี่นาที การสร้าง Babel, React และ Node ล้มเหลวทั่วโลก หลายร้อยครั้งต่อนาที เกิด fork ขึ้นภายในสิบนาทีและไม่ได้เปลี่ยนแปลงอะไรเลย เนื่องจาก Babel ดึง left-pad ผ่าน line-numbers ซึ่งระบุเวอร์ชัน 0.0.3 ไว้แน่นอน เวลา 23:55 npm กู้คืนเวอร์ชันที่ถูกลบจากการสำรองข้อมูล — นับเป็นการ "un-un-publish" ครั้งแรกในประวัติของ registry — และหนึ่งสัปดาห์ต่อมาได้ประกาศใช้กฎการยกเลิกเผยแพร่ภายใน 24 ชั่วโมง การวิเคราะห์หลังเกิดเหตุ จากบัญชีของ npm เองและอีเมลที่ Kik เผยแพร่: registry ที่อนุญาตให้ผู้เขียนคนใดก็ได้ลบเวอร์ชันใดก็ได้โดยไม่มีการตรวจสอบผู้ที่พึ่งพา, โครงสร้างแบบ transitive ที่ถูกแก้ไขแบบสดๆ ในทุกการติดตั้ง, และไม่มี lockfile โดยปริยาย Git blame: 60 npm / 25 Kik / 15 พฤติกรรมการพึ่งพา Verdict on the fix: SHIP IT.
22 มีนาคม 2016, 21:30 UTC: นักพัฒนาคนหนึ่งยกเลิกการเผยแพร่แพ็กเกจ npm ทั้งหมด 273 รายการของเขา หลังจาก npm ได้มอบชื่อแพ็กเกจ "kik" ให้กับ Kik ซึ่งเป็นแอปส่งข้อความ ที่ตัวแทนสิทธิบัตรของ Kik เคยขู่ว่า "ทนายความจะมาเคาะประตูบ้านคุณ" หนึ่งใน 273 แพ็กเกจนั้นคือ left-pad: โค้ดสิบเอ็ดบรรทัดที่ใช้เพิ่มช่องว่างด้านหน้าสตริง ซึ่งถูกดาวน์โหลด 2.5 ล้านครั้งต่อเดือน ภายในไม่กี่นาที การสร้าง Babel, React และ Node ล้มเหลวทั่วโลก หลายร้อยครั้งต่อนาที เกิด fork ขึ้นภายในสิบนาทีและไม่ได้เปลี่ยนแปลงอะไรเลย เนื่องจาก Babel ดึง left-pad ผ่าน line-numbers ซึ่งระบุเวอร์ชัน 0.0.3 ไว้แน่นอน เวลา 23:55 npm กู้คืนเวอร์ชันที่ถูกลบจากการสำรองข้อมูล — นับเป็นการ "un-un-publish" ครั้งแรกในประวัติของ registry — และหนึ่งสัปดาห์ต่อมาได้ประกาศใช้กฎการยกเลิกเผยแพร่ภายใน 24 ชั่วโมง การวิเคราะห์หลังเกิดเหตุ จากบัญชีของ npm เองและอีเมลที่ Kik เผยแพร่: registry ที่อนุญาตให้ผู้เขียนคนใดก็ได้ลบเวอร์ชันใดก็ได้โดยไม่มีการตรวจสอบผู้ที่พึ่งพา, โครงสร้างแบบ transitive ที่ถูกแก้ไขแบบสดๆ ในทุกการติดตั้ง, และไม่มี lockfile โดยปริยาย Git blame: 60 npm / 25 Kik / 15 พฤติกรรมการพึ่งพา Verdict on the fix: SHIP IT.
อ่านฉบับลายลักษณ์อักษร (ภาษาอังกฤษ) ↗
วิดีโอนี้ครอบคลุมอะไรบ้าง
- 11 มีนาคม: ตัวแทนสิทธิบัตรของ Kik ขอให้ Azer Koçulu เปลี่ยนชื่อ `kik`; หนึ่งชั่วโมงต่อมา: ทนายความ "จะมาเคาะประตูบ้านคุณและจะปิดบัญชีของคุณ"; Azer: 30,000 ดอลลาร์; Kik ส่งอีเมลหาฝ่ายสนับสนุน npm
- 18–20 มีนาคม: ซีอีโอของ npm โอนชื่อแพ็กเกจให้กับ Kik ("คาดว่าจะเกี่ยวข้องกับ kik.com อย่างสมเหตุสมผล"); Azer ขอให้ลบโมดูลทั้งหมดของเขา
- 22 มีนาคม, 21:30–23:55 UTC: 273 แพ็กเกจถูกยกเลิกการเผยแพร่; left-pad@0.0.3 เกิด 404 ในโปรเจกต์ Babel, Atom, Node; fork 1.0.0 ปรากฏขึ้นที่ 21:42; ซีทีโอของ npm ทวีต "un-un-publishing" ที่ 23:03; 0.0.3 กลับมาจากการสำรองข้อมูลที่ 23:55 — 2.5 ชั่วโมง
- 23 และ 29 มีนาคม: การวิเคราะห์หลังเกิดเหตุของ npm ("เราทำพลาด") และนโยบายใหม่: ยกเลิกการเผยแพร่ได้ภายใน 24 ชั่วโมงเท่านั้น, และมีตัวยึดความปลอดภัยสำหรับชื่อที่ถูกลบ (72 ชั่วโมงตั้งแต่ปี 2020)
บทถอดเสียงที่แปลแล้ว
แปลจากการบรรยายภาษาอังกฤษต้นฉบับ เสียงและคำบรรยายที่มีให้จะควบคุมโดย YouTube
0:00 นักพัฒนาคนหนึ่งลบ JavaScript สิบเอ็ดบรรทัด และภายในไม่กี่นาที Babel, การสร้าง React และ Node ก็ล้มเหลวทั่วโลก หลายร้อยครั้งต่อนาที ฟังก์ชันนั้นคือ left-pad มันเติมช่องว่างให้กับสตริง และภายในเย็นวันนั้น npm ก็ทำในสิ่งที่ เคยบอกว่าทำไม่ได้: เผยแพร่เวอร์ชันที่ถูกลบอีกครั้ง มันเกิดขึ้นได้อย่างไร ทำไมจึงเป็นไปได้ และใครเป็นผู้รับผิดชอบ นี่คือ The Daily Diff, การวิเคราะห์หลังเกิดเหตุ วันที่ 11 มีนาคม ตัวแทนสิทธิบัตรของ Kik แอปส่งข้อความ
0:26 ส่งอีเมลถึง Azer Koçulu: เปลี่ยนชื่อแพ็กเกจ npm ของคุณ, kik เป็นแบรนด์ของเรา Azer ตอบว่าไม่ หนึ่งชั่วโมงต่อมา: ทนายความด้านเครื่องหมายการค้าของเรากำลังจะมาเคาะประตูบ้านคุณและ จะปิดบัญชีของคุณ Azer เรียกราคา สามหมื่นดอลลาร์ และ Kik ส่งต่ออีเมลไปที่ฝ่ายสนับสนุน npm วันที่ 18 มีนาคม ซีอีโอของ npm ตัดสินว่าใครก็ตามที่พิมพ์ npm install kik คาดหวังว่าจะได้แอปส่ง
0:48 ข้อความ และโอนชื่อแพ็กเกจให้ Azer ขอให้ลบทุกอย่างที่เป็นของเขา สองวันต่อมาเขาก็ทำเอง: สองร้อยเจ็ดสิบสามแพ็กเกจ 22 มีนาคม, 21:30 UTC ทุกการสร้างที่เรียกใช้ left-pad ได้รับ 404 สิบนาทีต่อมาคนแปลกหน้าก็เผยแพร่ซ้ำเป็น 1.0.0 และไม่มีอะไรเปลี่ยนแปลง เพราะ Babel และ Atom โหลดผ่านแพ็กเกจที่ชื่อว่า line-numbers ซึ่งต้องการเวอร์ชัน 0.0.3 อย่างแน่นอน
1:13 เวลา 23:03 ซีทีโอของ npm ทวีต: un-un-publishing เวลา 23:55, 0.0.3 กลับมาจากข้อมูลสำรอง สองชั่วโมงครึ่ง ทำไมคนคนหนึ่งถึงทำเช่นนี้ได้ สามเหตุผล ทุกเวอร์ชันบน npm สามารถถูกลบได้โดยผู้เขียน ทันที โดยไม่มีการตรวจสอบว่าใครพึ่งพามันอยู่บ้าง สอง, การพึ่งพาเป็นแบบ transitive: Babel ไม่รู้ว่า left-pad มีอยู่ มันรู้แค่ line-numbers, และโครงสร้างทั้งหมดจะถูกแก้ไขแบบสดๆ ในทุกการติดตั้ง
1:36 สาม, ในปี 2016 ไม่มีอะไรที่ตรึงโครงสร้างนั้นไว้โดยปริยาย; lockfiles เป็นแบบเลือกใช้ ดังนั้นทุกการรัน CI จึงถามอินเทอร์เน็ตซ้ำว่าโค้ดสิบเอ็ดบรรทัดมีลักษณะอย่างไร หนึ่ง registry ที่ไม่มีใครบริหารจัดการและพึ่งพามัน git blame. npm, หกสิบเปอร์เซ็นต์: การวิเคราะห์หลังเกิดเหตุของตัวเองระบุว่าการยกเลิกการเผยแพร่ที่ไม่จำกัด เป็นสาเหตุของปัญหา และพูดว่า เราทำพลาดไป Kik, ยี่สิบห้าเปอร์เซ็นต์: ตัวแทนสิทธิบัตร ไม่ใช่ทนายความ ขู่ว่าจะมีทนายความมาเคาะประตูเรื่องชื่อที่ Kik ตัดสินใจแล้วว่าจะไม่ใช้ พฤติกรรมการพึ่งพา, สิบห้าเปอร์เซ็นต์: ทุกคนที่ npm-install โค้ดสิบเอ็ดบรรทัดแทน
2:06 ที่จะพิมพ์มัน รวมถึง Kik ด้วย ซึ่งการสร้างของพวกเขาก็ล้มเหลวเช่นกัน ขอบเขตความเสียหาย: สองร้อยเจ็ดสิบสามแพ็กเกจถูกดึงออกไป หนึ่งในนั้นถูกดาวน์โหลดสองล้านห้าแสนครั้งต่อเดือน การแก้ไขใช้เวลาสองชั่วโมงครึ่ง; ฟังก์ชันนั้นใช้โค้ดสิบเอ็ดบรรทัด บน Hacker News, โพสต์ที่ถามว่าเราลืมวิธีเขียนโปรแกรมไปแล้วหรือยัง ได้คะแนนหนึ่งพันเจ็ดร้อยคะแนน ส่วนใหญ่มาจากคนที่การสร้างของพวกเขายังคงล้มเหลว คำตัดสิน, การวิเคราะห์หลังเกิดเหตุ: SHIP IT.
2:26 npm กู้คืนจากข้อมูลสำรอง, โพสต์การวิเคราะห์หลังเกิดเหตุในวันถัดมา และภายในหนึ่งสัปดาห์ได้ประกาศใช้กฎที่ยังคงมีอยู่: คุณสามารถยกเลิกการเผยแพร่ได้ ยี่สิบสี่ชั่วโมง หลังจากนั้นคุณต้องคุยกับคน วันจันทร์: commit lockfile ของคุณ และถ้าฟังก์ชันมีความยาวสิบเอ็ดบรรทัด มันเป็นย่อหน้า ไม่ใช่การพึ่งพา ส่งเหตุการณ์ที่คุณยังไม่ได้รับอนุญาตให้พูดถึงมาให้ฉัน ในความคิดเห็น หรือที่ the daily diff dot dev และนั่นคือ The Daily Diff สำหรับวันนี้
2:48 ผม Niko จาก Axrisi Merge อย่างมีความรับผิดชอบ
แหล่งที่มา
- npm, Inc., "kik, left-pad, and npm" (Mar 23, 2016)blog.npmjs.org
- npm, Inc., "changes to npm's unpublish policy" (Mar 29, 2016)blog.npmjs.org
- Azer Koçulu, "I've Just Liberated My Modules" (Mar 22, 2016; archive copy)web.archive.org
- Mike Roberts (Kik), "A discussion about the breaking of the Internet" — the full e-mail thread (Mar 23, 2016; archive copy)web.archive.org
- Laurie Voss (npm CTO) on X, Mar 22, 2016, 23:03 UTCx.com
- left-pad 0.0.3 on the npm registry (the eleven lines)registry.npmjs.org
- Hacker News, Mar 22, 2016 — "I've Just Liberated My Modules" (1,573 points)news.ycombinator.com
- Hacker News, Mar 23, 2016 — "NPM and Left-Pad: Have We Forgotten How to Program?" (1,725 points)news.ycombinator.com
- Hacker News, Mar 29, 2016 — "Changes to Npm's unpublish policy" (320 points)news.ycombinator.com
- The Register, Mar 23, 2016 — "How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript"www.theregister.com



