รหัสลบคืออะไร?


340

ฉันอ่านบทความ Wikipedia เกี่ยวกับ Douglas McIlroyและพบข้อความที่กล่าวถึง

"ฮีโร่ที่แท้จริงของการเขียนโปรแกรมคือผู้ที่เขียนโค้ดเชิงลบ"

นั่นหมายความว่าอย่างไร?


15
หนึ่งในวันที่มีประสิทธิผลที่สุดของฉันคือการทิ้งโค้ด 1,000 บรรทัด - Ken Thompson
Radu Potop

คำตอบ:


501

มันหมายถึงการลดบรรทัดของรหัสโดยการลบซ้ำซ้อนหรือใช้โครงสร้างที่รัดกุมมากขึ้น

ดูตัวอย่างเรื่องเล็ก ๆ ที่มีชื่อเสียงนี้จากทีมนักพัฒนา Apple Lisa เดิม:

เมื่อทีมงานลิซ่าผลักดันให้เสร็จสิ้นซอฟต์แวร์ของพวกเขาในปี 2525 ผู้จัดการโครงการเริ่มต้องการให้โปรแกรมเมอร์ส่งรายงานแบบฟอร์มรายสัปดาห์เกี่ยวกับจำนวนบรรทัดของรหัสที่พวกเขาเขียน Bill Atkinson คิดว่ามันโง่ สำหรับสัปดาห์ที่เขาเขียนการคำนวณตามภูมิภาคของ QuickDraw ให้เร็วขึ้นหกเท่าและสั้นกว่า 2,000 บรรทัดเขาวาง "-2000" ลงในแบบฟอร์ม หลังจากนั้นไม่กี่สัปดาห์ผู้จัดการหยุดขอให้เขากรอกแบบฟอร์มและเขาก็ปฏิบัติตามด้วยความยินดี


257
ความสมบูรณ์แบบเกิดขึ้นไม่ใช่เมื่อไม่มีสิ่งใดเพิ่มเข้ามาอีกต่อไป แต่เมื่อไม่มีสิ่งใดเหลือให้เลือก - Antoine de Saint-Exupéry
systempuntoout

7
#LOC เป็นตัวชี้วัดคุณภาพโค้ดที่ดีหรือไม่ ฉันสามารถ 'ลดขนาด' โค้ด C หรือ C ++ ใด ๆ และลดจำนวนบรรทัดลงได้อย่างมาก แต่มันก็เป็นฝันร้ายที่จะต้องรักษา
JBRWilkinson

8
@systempuntout - และจากนั้นก็มี "(ทฤษฎีทางวิทยาศาสตร์) ของ Einsten ควรจะง่ายที่สุดเท่าที่จะทำได้ แต่ไม่ง่ายกว่า"
Jonathan Day

32
ไม่มีอะไรทำงานได้เร็วขึ้นหรือมีความน่าเชื่อถือมากกว่าหรือต้องการการบำรุงรักษาน้อยกว่ารหัสที่ไม่มี "หากมีข้อสงสัยให้ทำเขื่อนออกมา!"
TMN

4
@JBRWilkinson: ฉันจะบอกว่ามี "จุดหวาน" เกี่ยวกับความกะทัดรัดรหัส โดยทั่วไปจะสั้นกว่าดีกว่า แต่มีจุดเมื่อรหัสสามารถเติบโตสั้นเกินไปและไม่ง่ายที่จะถอดรหัสไปยังโปรแกรมเมอร์อื่น
GordonM

131

มีใบเสนอราคาของ Bill Gates ตามบรรทัดของการวัดประสิทธิภาพการทำงานของโปรแกรมเมอร์โดยสายของรหัสเป็นเหมือนการวัดความก้าวหน้าของอากาศยานโดยน้ำหนัก

ฉันต้องการเพิ่มว่าตัวชี้วัด LOC ได้สนับสนุนการใช้ภาษาที่ยืดเยื้อมานานและคิดทบทวนการสร้างวงล้อใหม่เพื่อให้ตรงกับโควต้า


30
ใช่นั่นเป็นปัญหาของการชี้วัดใด ๆ ทันทีที่คุณใช้พวกเขาเพื่อตัดสินประสิทธิภาพของผู้คนพวกเขาจะเริ่มเล่นเกมตัวเลข

5
มีใครบ้างที่เคยใช้ LOC เป็นตัวชี้วัดประสิทธิภาพหรือไม่ ฉันเคยเห็นมันใช้สำหรับสิ่งต่าง ๆ เช่น "เรากำลังพูดถึงข้อผิดพลาดของโครงการที่นี่ได้อย่างไร"
Michael Borgwardt

5
@Michael: ใช่ น่าเสียดายใช่
Michael Petrotta

4
เรากำลังพูดถึง Bill G. คนเดียวกันซึ่งมี บริษัท ที่อุปมาอุปมัยนั้นผลิตเครื่องบินไอพ่น 10,000 GTON ได้หรือไม่ :)
Daniel Mošmondor

37
โปรแกรมเมอร์คนหนึ่งเขียนโค้ดสำหรับคอมพิวเตอร์ออนบอร์ดของ Space Shuttle บอกฉันว่าเขาต้องคำนึงถึงน้ำหนักของซอฟต์แวร์ด้วย! ซอฟต์แวร์นี้เป็นของจริง (เงินนั้นจ่ายให้) มันเป็นรถรับส่ง; ต้องคำนึงถึงน้ำหนักของทุกสิ่งที่อยู่บนกระสวย ตัวอย่างแรกของการวัดประสิทธิภาพการทำงานของโปรแกรมเมอร์ด้วยน้ำหนักของรหัส (ไม่ได้รับอนุญาตให้เป็นศูนย์ดังนั้นเขาจึงระบุ 0.00001 กรัมและทั้งหมดเป็นที่น่าพอใจ)
Mark Lutton

118

ตอนที่ฉันอยู่มัธยมและใช่เรามีคอมพิวเตอร์ย้อนกลับไปในยุค 70 แม้ว่าเราจะต้องทำให้พวกมันออกมาจากหนังสัตว์โดยใช้มีดหิน - ครูคณิตศาสตร์คนหนึ่งทำการแข่งขันเขียนโปรแกรม กฎคือโปรแกรมที่ชนะจะเป็นโปรแกรมที่สร้างเอาต์พุตที่ถูกต้องและมีผลิตภัณฑ์ที่เล็กที่สุดของบรรทัดของเวลารันไทม์ของโค้ด นั่นคือถ้าโปรแกรมของคุณใช้รหัส 100 บรรทัดและวิ่งเป็นเวลา 5 วินาทีคะแนนของคุณคือ 500 ถ้ามีคนเขียนโค้ด 90 บรรทัดและวิ่งเป็นเวลา 6 วินาทีคะแนนของเขาคือ 540 คะแนนต่ำชนะเช่นกอล์ฟ

มันทำให้ฉันเป็นระบบการให้คะแนนที่ยอดเยี่ยมซึ่งให้รางวัลทั้งความกระชับและประสิทธิภาพ

แต่รายการที่ตรงกับเกณฑ์การชนะทางเทคนิคนั้นถูกตัดสิทธิ์ ปัญหาคือการพิมพ์รายการของจำนวนเฉพาะทั้งหมดน้อยกว่า 100 รายการที่ถูกตัดสิทธิ์ไปบางสิ่งเช่นนี้ (นักเรียนส่วนใหญ่ใช้ BASIC ย้อนหลัง):

100 print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,"
110 print "67, 71, 73, 79, 83, 87, 89, 91, 97"

นักเรียนที่เขียนรายการนั้นชี้ให้เห็นว่าไม่เพียง แต่จะสั้นและมีประสิทธิภาพมากเท่านั้น แต่อัลกอริธึมควรเป็นที่ประจักษ์แก่ทุกคนที่มีความรู้เกี่ยวกับการเขียนโปรแกรมแม้แต่น้อย


10
หลักฐานเพิ่มเติมที่แสดงว่าการนับบรรทัดของโค้ดเป็นตัวชี้วัดที่สามารถเล่นได้มาก :-)

44
โปรแกรมพื้นฐานนั้นยอดเยี่ยม! มันค่อนข้างจะโกรธที่ครูตัดสิทธิ์โปรแกรม ท้ายที่สุดตารางการค้นหา (ซึ่งโปรแกรมคล้ายกับ) สามารถพบได้ในการเขียนโปรแกรมในโลกแห่งความเป็นจริง
Noctis Skytower

6
ครูที่ฉลาดอาจยอมรับโปรแกรมพื้นฐานนี้และใช้เพื่อเน้นความสำคัญของการใช้ SRS ให้ถูกต้อง เตือนฉันถึงโค้ชทีมเบสบอลที่รู้สึกท้อแท้กับทีมของเขาที่จะแสดงให้พวกเขาเห็นว่าเขาเล่นยังไงเขาเอาแบ็ตตีสามครั้งติดต่อกันและไม่ยอมแพ้เขาตะโกนให้ทีมของเขา "ดู! ***** กำลังเล่นอยู่ตอนนี้รับค้างคาวและเล่นอย่างถูกต้อง! " ทำให้ฉันนึกถึงคนที่เขียนว่า "การสร้างเห็นผู้สร้างและหน้าแดง" และได้รับรางวัลการประกวดเรียงความเรื่อง 'ไวน์'
Nav

3
@Nav: เตือนฉันถึงเรื่องราวที่คล้ายกันซึ่งเริ่มต้นด้วยวิธีเดียวกัน จากนั้นโค้ชจะโยนลูกบอลขึ้นไปในอากาศแกว่งและคิดถึง เขาโยนมันไปในอากาศอีกครั้งแกว่งและคิดถึง เขาโยนมันขึ้นไปในอากาศเป็นครั้งที่สามและแกว่งไปมา จากนั้นเขาก็พูดกับทีมว่า "ดูสินั่นเป็นวิธีที่คุณควรทอย!" (ผมมีความคิดว่าเรื่องนี้อาจจะต้องทำอย่างไรกับการพัฒนาซอฟต์แวร์ no.)
เจ

13
ฉันจะอารมณ์เสียถ้าฉันถูกตัดสิทธิ์สำหรับเรื่องนี้ ปัญหาที่กำหนดขึ้นแล้วควรได้รับการแก้ปัญหาที่กำหนดไว้ใช่ไหม? เมื่อฉันเขียนแอพ 'Hello World' ฉันไม่ได้เขียนโค้ดเพื่อตรวจสอบว่าฉันสะกด 'Hello' ถูกต้องหรือไม่
Kirk Broadhurst

34

มันเป็นลิ้นในแก้ม หากมีค่าใช้จ่ายคุณ $ N ต่อบรรทัดที่เข้ารหัสแล้วการเข้ารหัส "เส้นลบ" จะเป็นผู้ชนะแน่นอน

ซึ่งหมายความว่าในฐานะที่เป็นคำแนะนำในทางปฏิบัติรหัสขนาดเล็กที่ทำงานให้สำเร็จนั้นดีกว่ารหัสขนาดใหญ่ที่ทำสิ่งเดียวกันทุกอย่างเท่าเทียมกัน


2
ฉันเห็นว่าคุณมาจากไหน แต่รหัสรอยเท้าขนาดเล็กที่กระชับและเข้าใจง่ายนั้นแทบจะไม่เกิดขึ้นเลยในคราวเดียว โดยทั่วไปจะเขียนเพื่อให้ทำงานได้ (หลายบรรทัด) เพิ่มประสิทธิภาพสำหรับความเร็ว (น้อยกว่าหนึ่งบรรทัด) และปรับแต่งเพื่อการบำรุงรักษา / อ่านง่าย ต้นทุนที่แท้จริงพร้อมผลตอบแทนการลงทุนที่ยาวนานเป็นขั้นตอนที่สองและสามดังนั้นพวกเขาจึงมักจะข้ามไปโดยสิ้นเชิง มันเหมือน "มีราคาถูกเร็วและดี - คุณเลือกได้สองแบบ"

2
ที่จริงแล้ว IME การปรับให้เหมาะสมสำหรับการดูแลรักษา / การอ่านสามารถเพิ่ม LOC ได้จริงเนื่องจากการเขียนรหัสใหม่เพื่อทำให้การจัดทำเอกสารด้วยตนเองมีแนวโน้มมากขึ้น

1
@Visage: "... สิ่งอื่น ๆ ที่เท่าเทียมกัน"
Ira Baxter

ประเด็นคือฉันคิดว่าสิ่งอื่น ๆ ทั้งหมดไม่สามารถเท่าเทียมกันระหว่างรหัสย่อและรหัส verbose
Tomas Narros

เหตุผลที่บรรทัดรหัสเฉลี่ยมีค่าใช้จ่าย $ N เป็นเพราะคุณใช้เวลาเขียนXบรรทัดเป็นครั้งแรก จากนั้นทำซ้ำหลาย ๆ ครั้งเพื่อลดผลิตภัณฑ์ขั้นสุดท้ายตามYบรรทัด ดังนั้น(X-Y)สายที่เหลือดูเหมือนจะมีราคาแพงมากเพราะการสังหารหมู่การปรับโครงสร้างนั้นได้ตัดสิ่งที่เหลือไว้ทั้งหมดออกไป

27

การเขียนโปรแกรมเดียวกันในรหัสน้อยเป็นเป้าหมายสำหรับทุกคน

หากโปรแกรมนำโค้ด LOC 200 ตัวและฉันเขียนมันใน 150 ฉันจะเขียน -50 LOC ดังนั้นฉันจึงเขียนโค้ดเชิงลบ


3
นอกจากนี้การเขียน LOC ให้น้อยลงก็หมายความว่าคุณสามารถทำผิดพลาดน้อยลงและตรวจจับได้ง่ายขึ้น
ลูกา

3
ไม่เป็นความจริงสำหรับ Haskell และภาษาอื่น ๆ ที่สามารถบีบอัดเป็นสัญญาณรบกวนแบบสุ่ม :)
Macke

1
แน่นอนว่าจุดของฉันไม่ใช่ "การบีบอัดรหัส" แต่การเขียนอัลกอริทึมที่มีประสิทธิภาพที่มีค่าน้อยใน LOC :) +1 สำหรับคุณแสดงความคิดเห็น
LucaB

9

คำตอบของ Thiloน่าจะแม่นยำที่สุดในอดีต แต่การเปรียบเทียบ "รหัสเชิงลบ" นั้นอาจรวมถึงประสิทธิภาพและการใช้หน่วยความจำซึ่งเป็นรางวัลที่พยายามเลื่อนการดำเนินการหรือการจัดสรรบางสิ่งจนกว่าจะจำเป็นจริงๆ

"การผัดวันประกันพรุ่งจ่าย" ความคิดนี้สร้างสัจพจน์แบบลิ้น - แก้ม - แก้มเช่น "การไม่ทำอะไรเลยเร็วกว่าทำอะไร", "รหัสที่เร็วที่สุดคือรหัสที่ไม่เคยลงมือทำ" และ "ถ้าคุณสามารถทำให้มันนานพอ คุณอาจไม่จำเป็นต้องทำ "(หมายถึงการเลื่อนเวลาของการดำเนินการที่มีราคาแพงจนจำเป็นต้องใช้จริง)

เทคนิคหนึ่งในการตระหนักถึงโค้ดที่เป็นลบคือการท้าทายสมมติฐานเริ่มต้นและคำจำกัดความของปัญหา หากคุณสามารถกำหนดโดเมนปัญหา / อินพุตให้ใหม่ได้ซึ่ง "ปัญหาเหนียว # 3" นั้นเป็นไปไม่ได้อย่างเด็ดขาดคุณไม่ต้องเสียเวลาหรือต้องจัดการกับปัญหาเหนียว # 3 คุณได้ตัดรหัสโดยปรับการออกแบบให้เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.