วิธีจัดการกับความเข้าใจผิดเกี่ยวกับ“ การปรับให้เหมาะสมก่อนกำหนดเป็นรากของความชั่วทั้งหมด”?


26

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

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

ความพยายามครั้งก่อน

สองสามครั้งฉันได้ลองเสนอราคาที่สมบูรณ์จาก Donald Knuthเพื่ออธิบายว่า "การปรับให้เหมาะสมก่อนกำหนดไม่ดี" ↛ "การเพิ่มประสิทธิภาพทั้งหมดไม่ดี":

เราควรลืมเกี่ยวกับประสิทธิภาพเล็กน้อยพูดถึง 97% ของเวลา: การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด แต่เราไม่ควรพลาดโอกาสที่สำคัญ 3%

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


10
ครั้งสุดท้ายที่คุณมีการสนทนาคุณวัดได้หรือไม่ว่าการแสดงจะไม่ดีโดยการนำไปปฏิบัติที่บริสุทธิ์ไร้เดียงสาหรือไม่? หรืออย่างน้อยก็ทำการประมาณคร่าวๆเกี่ยวกับเวลาทำงานที่คาดหวัง ถ้าไม่มีคนอื่นเหล่านั้นอาจถูกต้องอย่างสมบูรณ์กับความเห็นของพวกเขาคุณไม่มีทางรู้
Doc Brown

12
@errantlinguist: หากโปรแกรม "ช้าเหมือนกากน้ำตาล" จริงๆแล้วคุณควรจะสามารถตรวจสอบ Knuth's "สำคัญ 3%" ได้อย่างง่ายดายและดังนั้นจึงทำให้ข้อโต้แย้งใด ๆ กับการเพิ่มประสิทธิภาพของมัน และถ้าคุณตรวจไม่พบ ... คุณก็ยังไม่ทำการบ้านและคุณยังไม่พร้อมที่จะปรับให้เหมาะสม ดังนั้นจึงไม่ชัดเจนว่าปัญหาอยู่ตรงไหน
Nicol Bolas

6
@errantlinguist: หากคุณแสดงหลักฐานของส่วนของรหัสว่าเป็นปัญหาด้านประสิทธิภาพที่สำคัญสำหรับแอปพลิเคชันและแอปพลิเคชันโดยรวมนั้นช้ากว่าที่จำเป็นต้องมีและพวกเขายังคงปฏิเสธความต้องการในการแก้ไขรหัส ไม่เป็นไร คุณกำลังติดต่อกับคนที่ไม่สามารถให้เหตุผลตามหลักฐานได้และไม่มีเหตุผล
Nicol Bolas

6
@errantlinguist: คำถามสำคัญ: ลูกค้าบ่นว่าแอปพลิเคชันในพื้นที่นั้นช้าหรือไม่
Gort the Robot

5
ฉันลงคะแนนให้ปิดเพราะ OP ชัดเจนเพียงมองหาใครสักคนที่จะตรวจสอบความคิดเห็นมากกว่าที่จะตอบคำถามจริง ฉันไม่คิดว่าสิ่งนี้จะ (หรือควร) เปิดอยู่ในที่ทำงานอย่างใดอย่างหนึ่ง
BlueRaja - Danny Pflughoeft

คำตอบ:


35

ดูเหมือนว่าคุณกำลังมองหาทางลัดที่จะไม่ลองใช้ "การปฏิบัติที่ไร้เดียงสาที่บริสุทธิ์ที่สุด" อันดับแรกและใช้วิธีการแก้ปัญหาที่ซับซ้อนกว่าเดิมโดยตรงเพราะคุณรู้ล่วงหน้าว่า น่าเสียดายที่สิ่งนี้ไม่ค่อยได้ผล - เมื่อคุณไม่มีข้อเท็จจริงที่ยากลำบากหรือมีข้อโต้แย้งทางเทคนิคเพื่อพิสูจน์ว่าการปฏิบัติที่ไร้เดียงสานั้นหรือจะช้าเกินไปคุณอาจผิดมากที่สุดและสิ่งที่คุณทำคือการปรับให้เหมาะสมก่อน และการพยายามโต้เถียงกับ Knuth นั้นตรงกันข้ามกับการมีข้อเท็จจริงที่หนักหน่วง

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

"การดำเนินการจะไร้เดียงสา O (n³) และ n มีขนาดใหญ่กว่า 100.000 นั่นจะทำงานบางวันในขณะที่การดำเนินการที่ไม่ให้ไร้เดียงสาจะทำงานใน O (n) ซึ่งจะใช้เวลาเพียงไม่กี่นาที"

เฉพาะเมื่อมีข้อโต้แย้งดังกล่าวอยู่ในมือคุณจะมั่นใจได้ว่าการเพิ่มประสิทธิภาพของคุณจะไม่เกิดขึ้นก่อนเวลาอันควร

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

จากประสบการณ์ของฉันกรณีหลังนี้หายาก - โดยทั่วไปแล้วกรณีหนึ่งสามารถใช้โซลูชันที่เรียบง่ายไร้เดียงสาซึ่งเข้าใจได้ง่ายกว่าและมีข้อผิดพลาดน้อยกว่าที่ซับซ้อนกว่า แต่อาจเร็วกว่า

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


15
@errantlinguist: บางทีฉันไม่ได้ทำให้ตัวเองชัดเจนหรือว่ามันไม่ใช่สิ่งที่อยากได้ยิน? คำแนะนำของฉันคือ: อย่าลองใช้ * ข้อโต้แย้งเชิงปรัชญา "ของ Knuth เกี่ยวกับ" 3% "หรือ" 97% "ให้เป็นจริงมิฉะนั้นเพื่อนร่วมงานของคุณอาจจะถูกต้องที่สุดที่ข้อโต้แย้งประสิทธิภาพของคุณไม่เหมาะสม
Doc Brown

4
@errantlinguist: ในกรณีที่คุณอธิบายไว้ในความคิดเห็นของคุณต่อคำตอบของ Karl Bielefeld ดูเหมือนว่าคุณจะมีข้อโต้แย้งทั้งหมดที่ด้านข้างของคุณโดยไม่จำเป็นต้องใช้ "ประสิทธิภาพ" ฉันจะไปอีกขั้นหนึ่งแล้วพูดว่าถ้าคุณทะเลาะกันเรื่องการแสดงในกรณีเช่นนี้คุณทำผิดพลาดครั้งใหญ่เพราะเพื่อนร่วมงานของคุณพูดถูก: การแสดงโดยทั่วไปไม่สำคัญ ให้เหตุผลเกี่ยวกับความเรียบง่ายความสามารถในการอ่านความสามารถในการบำรุงรักษาบรรทัดของโค้ดที่น้อยลง แต่ไม่ใช่ (!) เกี่ยวกับประสิทธิภาพ อย่าเสนอโอกาสให้พวกเขาใช้ Knuth กับคุณ
Doc Brown

2
@errantlinguist: ไม่ต้องฝังมัน - ใส่แง่มุมเหล่านั้นไว้ในโฟกัสเมื่อมันถูกต้องว่ามุมมองเหล่านั้นควรอยู่ในโฟกัสและไม่ใช้ประสิทธิภาพเป็นอาร์กิวเมนต์เมื่อคุณไม่สามารถพิสูจน์ได้ว่ามันสร้างความแตกต่างที่สำคัญสำหรับผู้ใช้
Doc Brown

2
@errantlinguist: ฉันไม่แน่ใจว่าคุณจะบรรลุข้อสรุปนั้นได้อย่างไร คำตอบของ Doc Brown ดูเหมือนชัดเจนอย่างสมบูรณ์: คุณตัดผ่านข้อโต้แย้งที่ไม่เกิดผลเหล่านี้ที่คุณมีกับเพื่อนร่วมงานของคุณโดยการติดข้อความที่เป็นข้อเท็จจริงเกี่ยวกับสิ่งที่เป็นและไม่ได้รับการยอมรับ
jl6

1
นี่เป็นคำแนะนำที่ดีสำหรับการเขียนโปรแกรมขนาดเล็ก แต่การละเลยคำถามด้านประสิทธิภาพในระดับของการออกแบบสถาปัตยกรรมอาจทำให้ทีมต้องล้มตายลงได้นานเพราะมันอาจจะทำเสร็จก่อนที่มันจะถูกบังคับให้เผชิญหน้ากับปัญหา และไม่มีการรับประกันว่างานนั้นจะสามารถนำมาใช้ซ้ำได้มากเมื่อปัญหาเป็นสถาปัตยกรรม (ฉันเคยเห็นมันฆ่าผลิตภัณฑ์) ฉันรู้ว่าคุณมีข้อยกเว้นในคำตอบของคุณ แต่ต้องรู้ว่ามันยังใช้คุณยังต้องถามคำถาม และแม้แต่การถามคำถามก็เห็นได้ชัดว่าเป็นการสาปแช่งต่อเพื่อนร่วมงานของนักธุระกิจ
sdenham

18

ถามตัวคุณเองว่า:

  • ซอฟต์แวร์ไม่ตรงตามข้อกำหนดประสิทธิภาพหรือไม่?
  • ซอฟต์แวร์มีปัญหาเรื่องประสิทธิภาพหรือไม่

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

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

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

ในที่สุดซอฟต์แวร์ส่วนใหญ่ไม่จำเป็นต้องปรับให้เหมาะสมอย่างมาก เฉพาะในอุตสาหกรรมเฉพาะบางแห่งเท่านั้นที่มีความสำคัญอย่างยิ่ง ดังนั้นเวลาส่วนใหญ่สามารถใช้ไลบรารีและกรอบงานที่มีอยู่แล้วเพื่อผลที่ดี


4
ในขณะที่ข้อมูลที่ดีนี้ไม่ได้ตอบคำถามของฉันเกี่ยวกับวิธีการทำงานกับคนที่ทำให้การสนทนาในนาทีที่เกี่ยวข้องกับการแสดง
เดินทางที่หลงผิด

7
ฉันเห็นด้วยกับสิ่งทั้งหมดยกเว้น "ในอุตสาหกรรมเฉพาะไม่กี่แห่งเท่านั้นที่มีความสำคัญอย่างรวดเร็ว" ฉันคิดว่าคุณดูถูกดูแคลนจำนวนซอฟต์แวร์ที่มีปัญหาด้านประสิทธิภาพจากมุมมองของลูกค้า
Gort the Robot

@StevenBurnap: ใช่ - มีเว็บแอปพลิเคชั่นในป่าซึ่งจริง ๆ แล้วไม่ช้าใช่ไหม - ฉันต้องการเห็นหนึ่งในวิทยาศาสตร์เดียวกัน
เดินทางที่หลงผิด

1
google.com ค่อนข้างเร็ว :-P
Gort the Robot

ลองใช้ google.com ในการเชื่อมต่อมือถือ EDGE ใช่มันเป็นกรณีที่ไร้สาระ แต่มันจะไม่เร็วอย่างแน่นอน ;) (
ปุ่

7

วิธีการทำงานกับคนที่ขัดขวางการอภิปรายในนาทีที่เกี่ยวข้องกับการแสดง?

เริ่มต้นด้วยหลักการที่ใช้ร่วมกันที่สร้างขึ้นในทิศทางกลยุทธ์ของกลุ่มของคุณ

หลักการของฉัน:

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

หากผู้บริโภคของคุณเป็นลูกค้าลูกค้าของคุณจะบอกคุณว่าคุณต้องการรหัสที่เร็วขึ้นหรือไม่

อย่างไรก็ตามมีทางเลือกที่รู้จักกันดีกว่าในรหัสที่สามารถทำได้ ฉันอยากทำให้ถูกต้องในร่างแรกของฉันด้วยเหตุผลหลายประการ:

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

สมมติว่าความต้องการการปรับให้เหมาะสมนั้นถูกต้อง

สมมติว่านี่เป็นส่วนสำคัญอย่างแท้จริงของรหัสของคุณที่ต้องการเพิ่มประสิทธิภาพคุณสามารถบอกคำอุปมาเรื่องSchlemiel the Painterหรือเน้นย้ำส่วนที่เหลือของใบเสนอราคา:

"โปรแกรมเมอร์เสียเวลาจำนวนมากที่คิดหรือกังวลเกี่ยวกับความเร็วของส่วนที่ไม่สำคัญของโปรแกรมและความพยายามเหล่านี้อย่างมีประสิทธิภาพมีผลกระทบเชิงลบอย่างมากเมื่อพิจารณาการดีบั๊กและการบำรุงรักษาเราควรลืมประสิทธิภาพเล็กน้อย 97% ของเวลา: การปรับให้เหมาะสมก่อนกำหนดเป็นรากฐานของความชั่วร้ายทั้งหมดแต่เราไม่ควรปล่อยให้โอกาสของเราผ่านไปในช่วงวิกฤตที่ 3% " - Donald Knuth

ชั่งน้ำหนักค่าใช้จ่ายของความซับซ้อนเพิ่มเติม

บางครั้งมีค่าใช้จ่ายจริงในแง่ของการบำรุงรักษาของความซับซ้อนที่เพิ่มขึ้น ในกรณีนี้คุณอาจทำให้การใช้งานที่สองในฟังก์ชั่นที่แตกต่างกันหรือ subclass และใช้ unittests เดียวกันกับมันเพื่อให้ไม่มีคำถามที่ถูกต้อง ในภายหลังหากคุณโปรไฟล์รหัสของคุณและพบว่าการใช้งานไร้เดียงสาเป็นปัญหาคอขวดคุณสามารถสลับในรหัสปรับปรุงของคุณและปรับปรุงโปรแกรมของคุณได้อย่างชัดเจน

ความเป็นผู้นำ

บางครั้งปัญหาก็คืออัตตา - บางคนค่อนข้างจะใช้รหัสย่อยหรือ buggy แทนที่จะให้คนอื่นถูกกว่าพวกเขา คุณอาจต้องการหลีกเลี่ยงการทำงานกับคนเหล่านี้

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


6

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

แทนที่จะมุ่งเน้นที่โครงการในมือชิ้นส่วนของซอฟต์แวร์ที่คุณกำลังพัฒนาพร้อมกับเพื่อนร่วมงานที่คุณไม่เห็นด้วย เป็นสิ่งที่ต้องการสำหรับการทำงานที่ยอมรับได้สำหรับชิ้นส่วนของซอฟต์แวร์นี้หรือไม่? ช้ากว่านี้ไหม จากนั้นปรับให้เหมาะสม

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

โดยทั่วไปมีความเป็นไปได้สองอย่างเกี่ยวกับการปรับให้เหมาะสม:

  1. รหัสที่ได้รับการปรับปรุงนั้นสั้นกว่าง่ายกว่าที่จะเข้าใจและง่ายต่อการบำรุงรักษา

  2. รหัสที่ได้รับการปรับให้เหมาะสมนั้นซับซ้อนกว่าที่จะเข้าใจใช้เวลาในการเขียนและทดสอบนานกว่านี้หรือจะซับซ้อนกว่าในการเปลี่ยนแปลงในอนาคตหากความต้องการเปลี่ยนแปลงในวิธีที่ไม่คาดคิด

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


ฉันเห็นด้วยอย่างยิ่งกับประโยคเริ่มต้นของคุณ อย่างไรก็ตามฉันค่อนข้างมั่นใจว่าซอฟต์แวร์บางส่วนอาจ "ช้าลงอย่างน่ารำคาญสำหรับกรณีการใช้งานที่ตั้งใจ" โดยไม่ต้องระบุข้อกำหนดด้านประสิทธิภาพไว้อย่างชัดเจนในลักษณะเป็นทางการ
Doc Brown

@DocBrown: แน่นอน แต่ในกรณีใด ๆ มันเป็นลูกค้าที่ตัดสินใจว่ามันช้าเกินไปหรือไม่ไม่ใช่นักพัฒนา
JacquesB

ฉันไม่เคยเจอข้อกำหนดทางธุรกิจที่ระบุความต้องการด้านประสิทธิภาพอย่างชัดเจน
เดินทางที่หลงผิด

@errantlinguist: จากประสบการณ์ของฉันมันเป็นเรื่องธรรมดาในธุรกิจที่เน้นลูกค้าเช่นร้านค้าออนไลน์ แต่สำหรับเครื่องมือและแอปพลิเคชันสำหรับใช้ภายใน บริษัท ประสบการณ์ผู้ใช้มักจะไม่เกี่ยวข้องกับเจ้าของโครงการ
JacquesB

4

ฉันคิดว่าข้อความเต็มในบริบทนั้นเป็นประโยชน์ ฉันจะคัดลอกจากโพสต์ที่ฉันทำใน Reddit ในหัวข้อ:

ไม่ต้องสงสัยเลยว่าจอกของประสิทธิภาพนั้นนำไปสู่การละเมิด โปรแกรมเมอร์เสียเวลาจำนวนมากที่คิดหรือกังวลเกี่ยวกับความเร็วของส่วนที่ไม่สำคัญของโปรแกรมและความพยายามเหล่านี้อย่างมีประสิทธิภาพมีผลกระทบทางลบอย่างมากเมื่อพิจารณาการดีบักและบำรุงรักษา เราควรลืมเกี่ยวกับประสิทธิภาพเล็กน้อยพูดถึง 97% ของเวลา:การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด

แต่เราไม่ควรพลาดโอกาสที่สำคัญ 3% โปรแกรมเมอร์ที่ดีจะไม่ได้รับการกล่อมด้วยเหตุผลดังกล่าวเขาจะฉลาดที่จะดูรหัสวิกฤติอย่างรอบคอบ แต่หลังจากได้รับการระบุรหัสแล้ว

- Donald Knuth, การเขียนโปรแกรมแบบมีโครงสร้างพร้อมไปที่ Statement ,แบบสำรวจการคำนวณของคอมพิวเตอร์ ACM, Vol 6, No. 4, Dec. 1974, p.268

ประเด็นและความหมายคือมีสิ่งที่สำคัญกว่าที่คุณต้องกังวลมากกว่าการให้ความสำคัญกับการเพิ่มประสิทธิภาพเร็วเกินไป แน่นอนว่าคุณควรพิจารณาโครงสร้างข้อมูลและอัลกอริธึมของคุณอย่างรอบคอบ (เป็น 3%) แต่คุณไม่ควรกังวลว่าการลบจะเร็วกว่าโมดูโล (นี่คือ 97%) จนกว่าจะเห็นได้ชัดว่าการเพิ่มประสิทธิภาพระดับต่ำ จำเป็น

อดีตคือไม่จำเป็นต้องเพิ่มประสิทธิภาพในแง่ที่ว่าเพื่อนร่วมงานของคุณมีความคิด แต่มันคือการเพิ่มประสิทธิภาพในความรู้สึกที่ไม่ดีเลือกขั้นตอนวิธีและโครงสร้างข้อมูลมีความด้อย


2
หนึ่งอาจเพิ่มที่ Knuth ชัดเจนไม่คิดว่าการวิเคราะห์ความซับซ้อนเวลาของอัลกอริทึมและการเลือกตัวเลือกการออกแบบบนพื้นฐานนั้นคือการเพิ่มประสิทธิภาพก่อนวัยอันควร
sdenham

3

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

หากคุณได้รับการต่อต้านประเภทนี้เกี่ยวกับรหัสของคนอื่นมักเป็นเพราะคุณกำลังแนะนำให้ทำงานซ้ำจำนวนมาก ในกรณีเหล่านี้คุณจำเป็นต้องมีการวัดจริงเพื่อแสดงให้เห็นว่ามันคุ้มค่ากับความพยายามหรืออาจลองเข้าไปมีส่วนร่วมก่อนหน้านี้ในช่วงการออกแบบก่อนที่จะเขียนโค้ด คุณต้องพิสูจน์ว่ามันอยู่ใน 3% หากเราเขียนโค้ดทั้งหมดที่ไม่ตรงกับที่เราชอบเราจะไม่ทำให้สำเร็จ


แต่น่าเสียดายที่ฉันได้ทำกรณีตรงข้ามที่ฉันใช้เช่นDequeจากห้องสมุดมาตรฐาน Java เพื่อแทนที่ตรรกะจำนวนมากที่สร้างขึ้นรอบ ๆ การArrayListใช้เป็นกองซ้อนในขณะที่ทำงานกับรหัส ... และสิ่งนี้ถูกทำเครื่องหมายสำหรับ การเปลี่ยนแปลงในการตรวจสอบ ในคำอื่น ๆ วิจารณ์อยากจะมีรหัสอื่น ๆ Dequeอีกมากมายซึ่งยังเป็นที่ช้าลงและมีแนวโน้มมากขึ้นที่จะเป็นโรคจิตเพราะเขาไม่คุ้นเคยกับ
เดินทางที่หลงผิด

3
การไม่เต็มใจที่จะเรียนรู้สิ่งที่อยู่ในภาษาของคุณเป็นเวลา 10 ปีเป็นทัศนคติที่เป็นพิษสำหรับโปรแกรมเมอร์และเป็นปัญหาที่ลึกกว่าที่คุณอธิบายไว้ในตอนแรก โดยส่วนตัวแล้วในสถานการณ์เช่นนี้ฉันจะปฏิเสธคำแนะนำและส่งต่อไปยังฝ่ายบริหารหากจำเป็น
Karl Bielefeldt

5
@errantlinguist: เมื่อผู้ตรวจทานของคุณแนะนำวิธีการแก้ปัญหาที่แย่กว่านั้น (นั่นหมายถึงซับซ้อนกว่า) แทนการทำความสะอาดที่เรียบง่ายคุณควรโต้แย้งเกี่ยวกับเรื่องนี้ อย่าโต้แย้งเกี่ยวกับประสิทธิภาพ! อย่างจริงจังไม่เคยแม้แต่จะใช้คำว่า "ประสิทธิภาพ" ในการสนทนานั้น โต้แย้งเพียงความสามารถในการอ่านและการบำรุงรักษาเท่านั้น และหากผู้ตรวจสอบยืนยันในรหัสที่ไม่ดีของเขาให้เพิ่มขึ้น
Doc Brown

+1 ไม่แน่ใจว่าเพราะเหตุใดคำตอบนี้จึงมี downvote แทนที่จะเป็น upvotes และเป็นคำตอบที่ยอมรับ มันแสดงให้เห็นทั้งสองวิธีในการจัดการกับปัญหารวมถึงการวิเคราะห์ว่าปัญหาพื้นฐานที่แท้จริงคืออะไร (นั่นคือไม่มีใครต้องการที่จะบอกรหัสของพวกเขาจะต้องเขียนใหม่อย่างรุนแรง)
Andres F.

2

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

สิ่งนี้นำไปสู่ความพยายามที่สูญเปล่า เพียงแค่ดูรหัสและพูดว่า "ฉันสามารถทำให้เร็วขึ้น!" นำไปสู่ความพยายามมากมายทำให้บางสิ่งเร็วขึ้นซึ่งเร็วพอในตอนแรก คุณอาจพบความภาคภูมิใจในการบอกตัวเองว่าคุณทำโค้ดเร็วขึ้นสี่เท่า แต่ถ้ารหัสนั้นเป็นการคำนวณที่เกิดขึ้นในการกดปุ่มและใช้เวลา 10 มิลลิวินาทีในตอนแรกก่อนที่จะแสดงต่อผู้ใช้ที่เป็นมนุษย์ จะให้แช่ง

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

นี่ไม่ได้หมายความว่าคุณควรปิดสมองของคุณ ไม่ได้หมายความว่าคุณควรเก็บบันทึกลูกค้า 10,000 รายการในรายการที่เชื่อมโยงโดยลำพัง คุณควรเข้าใจถึงผลกระทบต่อประสิทธิภาพการทำงานของสิ่งที่คุณทำในใจและปฏิบัติตาม แต่แนวคิดก็คือคุณไม่ได้ใช้เวลาเพิ่มเติมในการพยายามทำให้เร็วขึ้น คุณเพียงแค่เลือกตัวเลือกที่มีประสิทธิภาพมากขึ้นจากตัวเลือกที่เท่ากัน


นี่ไม่ได้หมายความว่าคุณควรปิดสมองของคุณ ไม่ได้หมายความว่าคุณควรเก็บข้อมูลลูกค้า 10,000 รายการในรายการที่เชื่อมโยงโดยลำพัง > ในขณะที่ฉันเห็นด้วยกับคุณ 100% ว่าฉันได้เห็นรายการเชื่อมโยงที่ใช้ในวิธีนั้นและได้รับแจ้งว่า "ไม่ต้องแตะ"
เดินทางที่หลงผิด

ในขณะที่ข้อมูลที่ดีนี้ไม่ได้ตอบคำถามของฉันเกี่ยวกับวิธีการทำงานกับคนที่ทำให้การสนทนาในนาทีที่เกี่ยวข้องกับการแสดง
เดินทางที่หลงผิด

3
น่าเศร้าสิ่ง "รายการที่เชื่อมโยงเดียวดาย" ไม่ใช่ตัวอย่างแบบสุ่ม แต่เป็นสิ่งที่ฉันพบเจอเป็นการส่วนตัว
Gort the Robot

1

คุณสามารถทำสิ่งต่าง ๆ ในทางที่ผิดหรือทำสิ่งที่ถูกวิธี

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

ไม่จำเป็นต้องปรับให้เหมาะสมก่อนเวลาหากคุณก) ทราบว่าจะช่วยในอนาคตหรือข) รู้ว่าเส้นทางที่ไม่ดีจะนำไปสู่ปัญหาที่ตามมา มันเหมือนเกมหมากรุกจริงๆ

ฉันคิดว่าผู้คนมักจะต้องการทำสิ่งที่ถูกต้องแทนที่จะทำผิด ใช้สิ่งนี้เมื่อคุณพูดคุยกลยุทธ์ทางเลือกกับเพื่อนของคุณ


5
ไม่เคยมี "วิธีที่ผิด" หรือ "ทางที่ถูกต้อง" โดยทั่วไปมีวิธีการมากมายในการต่อเนื่องจาก "พระเจ้าของฉันสิ่งนี้จะวิ่งได้อย่างไร!" ถึง "John Carmack และ Donald Knuth ไม่สามารถทำให้ดีขึ้นในขณะที่จับคู่การเขียนโปรแกรม"
Gort the Robot

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

" ฉันคิดว่าผู้คนมักจะต้องการทำสิ่งที่ถูกต้องแทนที่จะทำผิด " - ปัญหาคือว่ามีความคิดเห็นที่แตกต่างกันมากเกี่ยวกับสิ่งที่ถูกหรือผิด บางคนถึงกับเริ่มสงครามศักดิ์สิทธิ์เกี่ยวกับเรื่องนี้ (ในความหมายที่แท้จริง)
JensG

1

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

ให้ความสำคัญกับการเขียนโปรแกรมจริงไม่ต้องเสียเวลากับข้อโต้แย้งที่ยาวเกินกว่าสิ่งที่คุณเพิ่งรู้สึกว่า "เร็วขึ้น" หากคุณเห็นใครบางคนกำลังเขียนวิธีการที่เรียกว่าหนึ่งครั้งต่อคำขอในเว็บแอปและมันมีความซับซ้อนของเวลา O (n ^ 2) เมื่อคุณรู้ว่ามันเป็นปัญหาเวลา O (log (n)) แน่นอนถ้าเป็นเช่นนั้น ไม่มีเกมง่ายๆไปข้างหน้า

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


ฉันแก้ไขชุดคำตอบและเติมเนื้อหาให้มากขึ้นผู้ลงคะแนนสามารถเพิ่มความคิดเห็นได้ไหม? :)
sara

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

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