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


16

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

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


คุณใช้ IDE หรือไม่
Woot4Moo

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

ใช้ภาษาที่มี REPL
Robert Harvey

คุณมีเพื่อนร่วมงานที่คุณสามารถถามและเรียนรู้จาก?
985366

คำตอบ:


25

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

ต้องการการโต้ตอบกับเซิร์ฟเวอร์ภายนอกและไม่สามารถใช้ระบบอัตโนมัติได้เนื่องจากการรับรองความถูกต้องสถาปัตยกรรมซอฟต์แวร์หรือความซับซ้อน

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

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


12

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

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

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


2
+1 ไม่มีปัญหาที่ไม่สามารถแก้ไขได้ด้วยเชลล์สคริปต์ในปริมาณที่เพียงพอ
Tom Anderson

1
ฉันจะไม่อยู่ในทีมที่ไม่ใส่ใจกับการพัฒนาความเร็ว
วินไคลน์

@ Tom ยกเว้นชั้นมากเกินไปของ abst - เอ้อเชลล์สคริปต์;)
ปานามา

ไม่ได้คุณเพียงแค่เขียนเชลล์สคริปต์ซึ่งล้อมรอบเชลล์สคริปต์อื่น จากนั้นมีเชลล์สคริปต์เพียงสคริปต์เดียวเท่านั้น เชื่อฉัน.
Tom Anderson

3
+1: การปรับปรุงความเร็วของการแก้ไข -> รวบรวม -> โหลด -> เรียกใช้ -> แก้ไขข้อบกพร่อง -> แก้ไขเป็นสิ่งที่ดีที่สุดเพียงอย่างเดียวที่คุณสามารถทำได้เพื่อเพิ่มความเร็วในการผลิตรหัส เมื่อฉันทำงานที่ Tymshare เรามีผู้ชายคนหนึ่งที่อ้างสิทธิ์ (ถูกต้อง) ว่ารหัสของเขาทำงานอย่างถูกต้องในการลองครั้งแรก 87% ของเวลา ในทางกลับกันฉันเขียนโค้ดเหมือนฉันใช้ยาคาเฟอีนลิงเวลาตี 1 (ซึ่งฉันเป็น) ฉันทำผิดข้อผิดพลาดมากมาย แต่ฉันไม่ได้กังวลเกี่ยวกับพวกเขาเพราะฉันรู้ว่าคอมไพเลอร์จะจับพวกเขา ในตอนท้ายของวันฉันอาจมีประสิทธิผลมากกว่าเขาถึง 3 ถึง 5 เท่า
Peter Rowell

8

การทดสอบอัตโนมัติจะไม่แทนที่การตรวจสอบและทำความเข้าใจ

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


5

คุณได้ให้คำตอบแล้ว: I usually make a lot of syntax errors and logic errors

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

ฉันมีสิ่งเดียวกันเมื่อฉันเปลี่ยนจาก PHP เป็น Java ฉันต้องเรียนรู้การดีบักแทนที่จะพิมพ์ตัวแปรและกด F5 ในเบราว์เซอร์ ...


2
เราทุกคนทำผิดพลาดโง่เป็นครั้งคราวพวกเขาจะเกิดขึ้นน้อยลงตามเวลาและประสบการณ์
maple_shaft

@maple_shaft thats จริง แต่เมื่อเขาบอกว่าmake a lot ofมันดูเหมือนว่าเขาควรจะลงทุนพลังงานของเขาที่จะปรับปรุงมัน
WarrenFaith

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

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

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

4

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

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


2

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


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

@maple ดีฉันไม่ทำมันเองอีกต่อไป แต่ไม่เหมือนใคร Nah - ทุกคนสามารถเขียนรหัสเส็งเคร็งและรหัสการค้าส่วนใหญ่จะลึกและเส็งเคร็งลึก อย่างไรก็ตามชอบหรือไม่เป็นพื้นฐานสำหรับสังคมของเรา
Neil Butterworth

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

2

การทดสอบหน่วย โปรแกรมจำลอง / จำลอง

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

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

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

ตอนนี้ฉันไม่ได้เริ่มต้นโครงการใด ๆ โดยไม่ต้องคิดก่อนผ่านการดำเนินการตามขั้นตอนการทดสอบ - การทดสอบหน่วยการจำลองสถานการณ์จำลองข้อมูลตัวอย่าง ฯลฯ


1

ฉันมักจะทำข้อผิดพลาดทางไวยากรณ์และข้อผิดพลาดเชิงตรรกะมาก

การใช้ Linter อาจช่วยคุณได้บ้าง

ฉันอยู่ในสถานการณ์ที่คล้ายคลึงกับนายจ้างคนก่อนหน้าของฉัน ฐานรหัสของเรามีขนาดใหญ่มากและเพื่อทำการเปลี่ยนแปลงใด ๆ ที่ฉันต้องทำรหัสให้คอมไพล์แล้วแทนที่.classไฟล์ในเซิร์ฟเวอร์ dev จากนั้นรีสตาร์ท dev-Sever ด้วยสคริปต์รีสตาร์ท และสำหรับความกลัวของฉันมันจะใช้เวลาประมาณครึ่งชั่วโมงเพื่อรับเซิร์ฟเวอร์ dev อีกครั้ง

หลังจากนั้นฉันก็พบว่าการดีบักแบบรีโมทนั้นเป็นไปได้ที่ dev-server

ดังนั้นนี่คือสิ่งที่ฉันทำเพื่อเพิ่มประสิทธิภาพกระบวนการของฉัน

  • รอบแรกเริ่มต้นของการดีบักแบบรีโมตทำให้ฉันเห็นการไหลของรหัสที่แน่นอนและค่า / สถานะของตัวแปรที่แน่นอน

  • วางแผนว่าจะเปลี่ยนแปลงอย่างไรและจะทำอย่างไร

  • ทำการเปลี่ยนแปลงแล้วเปรียบเทียบส่วนต่าง

  • การแคชผิดพลาดโดยใช้ linter หรือโดยการคอมไพล์

  • การให้ฮอตฟิกซ์โดยแทนที่.classไฟล์และรีสตาร์ท

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

นอกจากนี้การใช้ IDE ที่มีภาวะแทรกซ้อนอัตโนมัติที่ดีสามารถช่วยลดความผิดพลาดในการพิมพ์ได้อย่างมาก

หวังว่านี่จะช่วยได้

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