มีประโยชน์ในการรวบรวมรหัสของคุณตามที่คุณไป?


183

ฉันเพิ่งได้สัมภาษณ์งานซึ่งพวกเขาให้เวลาฉันหนึ่งชั่วโมงในการเขียนรหัสจริง มันไม่ได้เป็นจำนวนมากอาจน้อยกว่า 100 บรรทัด หลังจากนั้นประมาณ 45 นาทีฉันก็รวบรวมวิ่งแล้วก็ไปทำงาน ฉันอาจใช้เวลา 5-10 นาทีในการรวบรวมข้อผิดพลาดและข้อผิดพลาดเล็กน้อย แต่โดยรวมแล้วมันราบรื่นมาก (บังเอิญฉันได้รับข้อเสนอจากพวกเขา)

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

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

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

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

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

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

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


54
ไม่ว่าจะเป็นหรือว่านิสัยของฉันถูกเรียกว่านิสัยที่ไม่ดีโดยผู้ที่มีนิสัยที่แตกต่างกัน
CaptainCodeman

9
@DocBrown การเปรียบเทียบนั้นถูกต้องหากเป้าหมายสุดท้ายมีผลิตภัณฑ์ที่ถูกต้อง โปรแกรมที่ "รัน" ไม่ดีไปกว่าโปรแกรมที่รันไม่ถูกต้อง คุณไม่สามารถคาดหวังการคอมไพล์เพื่อตรวจสอบรหัสของคุณได้มากกว่าที่คุณคาดหวังว่าจะมีการตรวจสอบการสะกดคำเพื่อแก้ไขข้อผิดพลาดทางไวยากรณ์ของคุณ
CaptainCodeman

7
ไม่ว่าการรวบรวมจะรบกวนกระบวนการทำงานของคุณเป็นอย่างมากและขึ้นอยู่กับภาษาสภาพแวดล้อมการสร้างขนาด / ความซับซ้อนของโครงการเป็นต้น IMO มีแนวโน้มที่จะเป็นปัญหาสำหรับโครงการขนาดใหญ่แบบดั้งเดิม
pjc50

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

9
ควรกล่าวถึงด้วยว่าสำหรับบางภาษาและ IDE (Java / [Eclipse | NetBeans | etc], C # / Visual Studio, ... ), IDE ได้รวบรวมข้อมูลทุกอย่างในพื้นหลังแบบเรียลไทม์เมื่อคุณพิมพ์ใน เอฟเฟกต์ให้ผลตอบรับทันทีกับคุณว่าคุณทำผิด เราหวังว่านักพัฒนา IDE จะมีงานวิจัยบางส่วนที่สนับสนุนวิธีการคอมไพล์ตามที่คุณต้องการ
Ogre Psalm33

คำตอบ:


223

มีประโยชน์จริงๆหรือไม่ในการรวบรวมเมื่อคุณไปด้วย?

นั่นคือ มันให้ความคิดเห็นย้อนกลับที่สั้นลงซึ่งโดยทั่วไปเมื่อออกแบบ (UI, การเขียนซอฟต์แวร์, การออกแบบภาพ ฯลฯ ... ) เป็นสิ่งที่ดี

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

หากต้องการยืมตัวอย่างของคุณสมมติว่าคุณเขียนโปรแกรมด้วยภาษา C และลืม}บางโปรแกรมที่อยู่ตรงกลางของโปรแกรม

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

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


ตอนนี้ใช่แล้วผลลัพธ์ที่ได้จะเหมือนกัน แต่คุณเสียเวลาไปกับการสร้างประโยคที่คอมไพเลอร์คอยช่วยเหลือคุณ - ระยะเวลาที่สั้นลงอย่างมากถ้าคุณคอมไพล์เมื่อคุณไปด้วยกัน


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

12
@CaptainCodeman - ฉันจะบอกว่ามีข้อผิดพลาดในการคอมไพล์ที่ต้องการให้คุณขุดผ่านโค้ดจำนวนมาก สิ่งนี้เป็นจริงมากขึ้นสำหรับฐานโค้ดขนาดใหญ่และชุดการเปลี่ยนแปลงที่ใหญ่
Oded

29
บางครั้งคอมไพเลอร์ให้คุณไขปริศนาแทนคำใบ้เช่นข้อผิดพลาดแม่แบบ gcc
pjc50

14
@ pjc50: แน่นอน (ซึ่งง่ายต่อการจัดการโดยไม่เปลี่ยนแปลงหลายสิ่งหลายอย่างพร้อมกันก่อนการรวบรวมครั้งต่อไปดังนั้นคุณจะรู้ว่าสิ่งที่คุณเปลี่ยนไปในที่สุด)
Doc Brown

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

108

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

ต้องบอกว่า "รวบรวมตามที่คุณไป" ดูเหมือนว่าฉันเป็นนิสัยสถานการณ์ คุณอาจถูกตราหน้าว่าเป็น "กระตุก" อย่างเท่าเทียมกันในการรวบรวมบ่อยกว่าอคติส่วนตัวของผู้สัมภาษณ์ ดูเหมือนว่า nitpicking ไม่มีใครชอบที่จะยอมรับว่าผีตายโหงได้acedทดสอบ; เคล็ดลับเกล็ดของการเจรจาต่อรองเงินเดือน

ระบบการสร้างไม่ได้ทั้งหมดรวดเร็ว ผมทำงานบน (C ++) โครงการที่ทำให้จะใช้เวลาเพียงแค่ 30 วินาทีstat 'ทิ้งทุกอย่างเพื่อตรวจสอบว่ามันจำเป็นในการสร้างหรือไม่และไฟล์ส่วนใหญ่จะใช้เวลาไม่กี่นาทีในการสร้างถ้าคุณได้ทำการเปลี่ยนแปลง เราลังเลที่จะทำสิ่งนี้บ่อยกว่าทุก ๆ 10-15 นาที บางคนอาจไม่ต้องสงสัยเลยว่าเรื่องเล็ก ๆ น้อย ๆ เมื่อรวบรวมเกี่ยวข้องกับการใช้การ์ดเจาะและนำพวกเขาไปยังอาคารอื่น ...

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


25
เมื่อคุณนำหมัดการ์ดของคุณไปที่ sysops เพื่อโหลดตรวจสอบให้แน่ใจว่าคุณไม่เคยทิ้งมันเพราะการใส่กลับเข้าไปในลำดับที่ถูกต้องคือ PitA ตัวจริง! อาสำหรับวันที่เครื่องมือแก้จุดบกพร่องที่สำคัญคือวงยืดหยุ่น
gbjbaanb

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

อืมมม แค่อยากบอกว่าไฟล์ C ++ ที่เขียนได้ดีนั้นไม่ควรใช้เวลาในการรวบรวมมากกว่าสองสามวินาที ถ้านานกว่านี้จะเป็นรหัสที่ไม่ดี และถ้ามันใหญ่เกินไปที่ทำให้เกิดปัญหาฉันจะยืนยันว่าแอปพลิเคชันนั้นใหญ่เกินไป "My" ทำให้ไม่เคยมีปัญหาและอยู่ไกลแม้กระทั่งเมื่อรวบรวม Linux
phresnel

2
มันเป็น 1.5 ล้าน LOC เมื่อฉันจากไป โปรดทราบว่า Linux คือ C ไม่ใช่ C ++; เทมเพลตดูเหมือนจะช้าใน gcc และหากคุณทำสิ่งที่ฉลาดและมีประโยชน์ที่เกิดขึ้นช้าในการรวบรวมไม่มีวิธีง่ายๆในการรวบรวมคอมไพเลอร์เพื่อคำนวณว่ามันคืออะไร
pjc50

21
@gbjbaanb ฉันคิดว่ามันจะดีกว่าถ้าจะพูดว่า "วันที่การควบคุมแหล่งสัญญาณเป็นวงยืดหยุ่น" ;)
JasonMArcher

35

ดังนั้นคำถามของฉันคือ: มีสิ่งที่ฉันพลาดหรือไม่?

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

รวบรวมฐานรหัส (ทั้งหมดในเวลาเดียวกัน) เป็นครั้งแรก (คิดว่า "โครงการที่มี 20 ไฟล์") จะบังคับให้คุณเปลี่ยนบริบทจากสิ่งที่คุณกำลังคิด (เช่น "ค่านี้ถูกตั้งค่าเป็น 5 ที่นี่จากนั้นใน for loop blablabla และอัลกอริธึมที่ซับซ้อนให้ค่าที่ถูกต้องในการส่งคืน ") กับปัญหาการคอมไพล์ที่ไม่เกี่ยวข้องกับสิ่งที่คุณกำลังคิดอย่างสมบูรณ์ (ชื่อไฟล์ / โมดูล / ฟังก์ชัน / pre-conditions / syntax / ตัวแปรที่แตกต่างกัน) )

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

มีประโยชน์จริงๆหรือไม่ในการรวบรวมเมื่อคุณไปด้วย?

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

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

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

มันแพร่กระจายโดยชุมชนซอฟต์แวร์เช่นกัน แต่ก็มีเหตุผลที่ดีอยู่เบื้องหลัง

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

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

ฉันจะจินตนาการว่าคนที่ inteviewed คุณได้ข้อสรุปที่คล้ายกัน ("คุณไม่ค่อยมีประสบการณ์ในฐานรหัสขนาดใหญ่")


1
"รวบรวมและเปลี่ยนแปลงสิบ" - สถานการณ์มากมายที่นี่เป็นหน่วยที่เล็กที่สุดที่มีความหมายและน่าลอง เช่นการเพิ่มพารามิเตอร์ใหม่ให้กับฟังก์ชันและไซต์การโทรทั้งหมด
pjc50

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

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

1
@JensG ที่ดูเหมือนจะเป็นการเข้าใจผิดแบบลอจิคัล: นี่ไม่ได้เกี่ยวกับการเลือกระหว่างรหัสที่คอมไพล์และโค้ด shitty แต่เกี่ยวกับประโยชน์ที่เป็นไปได้ของการรวบรวมมากกว่าหนึ่งครั้ง
Jorg

1
ฉันสงสัยว่าการอ้างว่าการทำลายสมาธิหลายสิบครั้งในระยะเวลาอันสั้นเพื่อแก้ไขข้อผิดพลาดทางไวยากรณ์เดียวนั้นเร็วกว่าการทำลายมันเพียงครั้งเดียวและแก้ไขข้อผิดพลาดทางไวยากรณ์หลายสิบครั้งในครั้งเดียว นั่นไม่ใช่วิธีการสลับบริบทในการคำนวณ (เรากำลังพยายามปรับให้เหมาะสมสำหรับปริมาณงานหลังจากทั้งหมดที่นี่) และฉันได้ทำงานในโครงการที่มีรหัส C ++ ประมาณ 500k ที่พัฒนามานานกว่าทศวรรษดังนั้นฉันหวังว่าเราจะไม่ดึงการ์ดที่ขาดประสบการณ์ออกมา
Voo

26

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

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

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

หากคุณไม่ได้เป็นแฟนของการรวบรวมซ้ำอย่างต่อเนื่องคุณอยู่ใน บริษัท ที่ดี นี่คือ Donald Knuth:

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


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


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

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

2
I hit ctrl-S about once every 30 seconds. ฉันอาจบันทึกสองครั้งบ่อย ๆ ฮ่า ๆ มันเป็นนิสัยที่ไม่ดีจริงๆ บางครั้งฉันจะบันทึกในบรรทัดกลางของรหัสแล้วบันทึกอีกครั้งในตอนท้ายของมัน เมื่อใดก็ตามที่ฉันหยุดคิดเป็นวินาทีและไม่พิมพ์ฉันบันทึก
Cruncher

21

มีข้อดีในการรวบรวมตามที่คุณไป แต่ฉันเห็นด้วยอย่างมากว่าการทำงานเป็นกลยุทธ์การเข้ารหัสที่ใช้ได้

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

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


5
+1 สำหรับเน้นการเชื่อมต่อระหว่างข้อผิดพลาดทางความหมายและ Sytactic
Doc Brown

15

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

แต่คุณจะทดสอบโค้ดของคุณอย่างไรเมื่อคุณไม่คอมไพล์ด้วย?

กรณีที่รุนแรงคือการพัฒนาที่ขับเคลื่อนด้วยการทดสอบ (TDD) เห็นได้ชัดว่า TDD ไม่ทำงานกับกลยุทธ์ของคุณเนื่องจาก TDD หมายถึงรอบสั้นมากของการทดสอบการเขียนรวบรวม (ควรล้มเหลว) เขียนรหัสรวบรวมอีกครั้งเรียกใช้การทดสอบแก้ไขข้อบกพร่องรวบรวมอีกครั้ง refactor รวบรวม -again, run-test และอื่น ๆ ...

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


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

@CaptainCodeman: ฉันคิดว่าเมื่อเขียนโค้ด 100 บรรทัดควรมีชิ้นส่วนเล็ก ๆ ซึ่งสามารถทดสอบแยกต่างหากได้ โดยทั่วไปโค้ด 100 บรรทัดหมายถึงบางสิ่งระหว่างฟังก์ชัน 4 ถึง 15 ฟังก์ชั่น (หรือ> 20 ถ้าคุณใช้รหัสในสไตล์ของ Bob Martin)
Doc Brown

5
@CaptainCodeman: ใน TDD ไม่เคยมี "ไม่มีความหมาย" ในการทดสอบ ตัวอย่างคลาสสิกคือคุณต้องการที่จะเขียนคลาสใหม่ (ให้เรียกว่าฟู) สิ่งแรกที่คุณต้องทำคือการสร้างการทดสอบหน่วยและการเขียนnew Foo();ซึ่งจะไม่สามารถรวบรวมได้อย่างชัดเจนเนื่องจากคุณยังไม่ได้เขียนคำจำกัดความของคลาส ใน TDD นั้นเป็นเหตุผลที่ถูกต้องในการรันคอมไพเลอร์ - มันพิสูจน์ว่าการทดสอบหน่วยของคุณใช้งานได้ (โดยการล้มเหลว)
slebetman

@slebetman: ขอบคุณสำหรับความคิดเห็นที่เป็นประโยชน์ ฉันต้องการเพิ่มว่า IMHO นี้ไม่ จำกัด TDD เมื่อเขียนโค้ด 100 บรรทัดจะมีบางสิ่งที่มีความหมายที่จะทดสอบในระหว่างนั้นถ้าคุณทำ TDD หรือไม่
Doc Brown

14

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

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

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

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


8

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

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

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


ที่น่าสนใจนี้เป็นเหตุผลที่ดีที่จะรวบรวมเป็นประจำแม้ว่ารวบรวมช้า จุดดี.
sleske

3

สำหรับการรวบรวมโค้ดโปรแกรมเมอร์ที่มีประสบการณ์เพียงพอจะไม่เป็นปัญหาคอขวด

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

ฉันเขียนโค้ดเป็นประจำทุกวันโดยไม่ต้องคอมไพล์จากนั้นฉันจะรวบรวมและแก้ไขข้อผิดพลาดทางไวยากรณ์และคำเตือนเกี่ยวกับรายงานคอมไพเลอร์ก่อนที่จะส่งรหัสของฉัน (พร้อมด้วยข้อความที่ระบุว่า"ต้องมีการทดสอบ!" ) ฉันไม่มีปัญหาในการล้างโค้ด C หรือ C ++ 1,000 บรรทัดในเวลาเพียงไม่กี่นาที

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

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

ป.ล. - ถ้าฉันเฝ้าดูโค้ดคุณโดยอ่านมันฉันก็จะจ้างคุณทันที นั่นคือสิ่งที่มืออาชีพทำทุกครั้ง


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

@par ขอบคุณสำหรับคำตอบของคุณ; เป็นเรื่องดีที่รู้ว่าฉันไม่ใช่คนเดียวที่รหัสเช่นนี้!
CaptainCodeman

3
@CaptainCodeman ฉันทราบดีว่าข้อผิดพลาดทางตรรกะนั้นร้ายกาจยิ่งกว่าข้อผิดพลาดของคอมไพเลอร์ แต่มันเป็นการยืนยันของเขาเกี่ยวกับคอมไพเลอร์ที่ไม่สามารถบอกคุณเกี่ยวกับรหัสที่หายไปที่ฉันต้องการที่จะโต้แย้ง ยกเว้นว่าคุณตั้งใจเขียนโค้ดที่ไม่ถูกต้อง (หรือไม่สมบูรณ์) ที่รวบรวม ... แต่การเอาชนะข้อโต้แย้งที่ว่าข้อผิดพลาดที่คอมไพเลอร์ไม่สามารถตรวจจับได้นั้นเป็นปัญหาที่แท้จริงของ IMO Heck ฉันยังใช้คอมไพเลอร์เพื่อย้ายคาเร็ตไปยังบรรทัดที่ฉันต้องเขียนโค้ดต่อไป แต่บางทีฉันขี้เกียจมาก
Ian Goldby

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

1
@par ฉันขอโทษสำหรับความผิดที่เห็นได้ชัดจากความคิดเห็นของฉัน - มันไม่ได้ตั้งใจและแน่นอนฉันไม่ได้ตั้งใจที่จะบิดเบือนความจริงในสิ่งที่คุณพูด ฉันเห็นตอนนี้ว่าเมื่อคุณเขียนโค้ดที่ไม่สมบูรณ์ซึ่งยังคงคอมไพล์คุณได้ทำการฝึกฝนเพื่อให้แน่ใจว่าจะไม่สามารถลืมได้โดยการเพิ่ม #warning หรือ TODO นั่นเป็นเทคนิคที่ถูกกฎหมาย สิ่งสำคัญที่เราทั้งคู่เห็นพ้องกันคือรหัสที่คอมไพล์ แต่ไม่ได้ทำงานนั้นอันตรายกว่าโค้ดที่ไม่ได้รวบรวม
เอียนโกลด์บาย

3

ไม่มันไม่มีเหตุผลที่จะหยุดยั้งการคอมไพล์จนกว่าคุณจะได้ทำโค้ดในจำนวนที่เพียงพอ (และ 'จำนวนที่เพียงพอ' นั้นขึ้นอยู่กับ coder และโค้ดที่กำลังเขียน)

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

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

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


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

@DougM - ตามาก
gbjbaanb

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

2

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

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


1

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

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

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

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

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

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

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

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

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

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

ข้อได้เปรียบอีกประการหนึ่งคือเมื่อทำงานกับรหัสของคุณหากคุณเก็บมันไว้หรือรวบรวมใกล้ตลอดเวลาคุณจะได้รับประโยชน์จากคุณสมบัติ IDE ที่ใช้ความหมายจำนวนมาก (การเปลี่ยนชื่ออย่างปลอดภัยการเปลี่ยนโครงสร้างใหม่การค้นหาการใช้สัญลักษณ์ ... ) .

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


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

1

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

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

จากนั้นก็มีการเขียนโค้ดที่รวบรวม

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

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


นั่นทำให้รู้สึกมาก ในความเห็นของฉันผู้พัฒนาที่ดีควรสามารถเขียนโค้ดลงบนกระดาษได้ทั้งวันและเมื่อถึงตอนท้ายของวันให้พิมพ์รหัสนั้น
CaptainCodeman

1

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

บริษัท ต่างๆในทุกวันนี้ไม่เพียง แต่สนใจในผลิตภัณฑ์สำเร็จรูปเท่านั้น พวกเขาต้องการรู้ว่ามันเป็น "ภายใต้การควบคุม" มาตลอด สำหรับพวกเขา "การได้รับความสนุกครึ่งหนึ่ง"


สิ่งนี้ดูเหมือนจะไม่เสนออะไรที่สำคัญกว่าสิ่งที่โพสต์ไว้ในคำตอบก่อนหน้า 16 คำตอบ
gnat

2
ขอบคุณ แต่เรากำลังพูดถึงการสูญเสียชนิดใด? แน่นอนว่าถ้าคุณไม่ได้ทำอะไรที่รุนแรงอย่างที่เขียนโดยไม่ตั้งใจในภาษาที่ผิดคุณจะไม่ต้องเขียนโค้ดใด ๆ อีกเลยเพราะข้อผิดพลาดในการคอมไพล์
CaptainCodeman

@CaptainCodeman: มันทำให้ บริษัท รู้สึกดีขึ้นและเป็นรูปแบบของ "การประกันภัย" นั่นคือค่าใช้จ่าย แต่ทำให้คนส่วนใหญ่ (รวมถึงผู้จัดการ) "นอนหลับได้ดีขึ้นในเวลากลางคืน"
Tom Au

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

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

1

คำตอบอื่น ๆ ที่นี่มีการป้องกันที่ดีสำหรับการรวบรวมบ่อยครั้งในงานแต่เนื่องจากคำถามของคุณอยู่ตรงกลางการสัมภาษณ์ฉันต้องการที่จะแก้ไขปัญหามุมของมัน

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

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

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


0

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

ในการทดสอบชิ้นเล็ก ๆ เหล่านี้คุณต้องรวบรวม

อาจเป็นไปได้ว่าผู้สัมภาษณ์สับสนสถานการณ์นี้ด้วยโปรแกรมขนาดเล็กที่ไม่ได้ออกแบบมาในลักษณะนี้


0

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

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


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