เทคนิคการเขียนโปรแกรมทั่วไปเพื่อเพิ่มความเร็วในการเขียนโปรแกรม


20

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

สิ่งนี้นำไปสู่คำถามเทคนิคการเข้ารหัสแบบใดที่มีอยู่ให้ใช้ในงานจริง


26
ฉันเดาว่าเทคนิคที่คุณใช้ในการแข่งขันการเขียนโปรแกรมอาจไม่มีส่วนเกี่ยวข้องกับเทคนิคที่คุณใช้ในงานจริง
Doug T.

1
ฉันไม่ได้ถามหาเทคนิคในการทำงานจริงฉันกำลังขอเทคนิคในการแข่งขันเขียนโปรแกรม
marktani

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

1
ทำไมคุณไม่ควรใช้ memsets เพื่อสร้างอาร์เรย์ไดนามิก
James

3
อย่าใช้ c ++ ใช้ภาษาระดับสูงสุดที่คุณสามารถ
Kevin

คำตอบ:


52

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

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

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


21
คุณจริงจังไหม TDD สำหรับการประกวดการเขียนโปรแกรม?
Codism

1
@Codism: คำถามถูกขยายเพื่อรวมเทคนิคที่ใช้กับการพัฒนาซอฟต์แวร์ปกติ
Dima

2
TDD ช่วยทำให้โค้ดของฉันดีขึ้น แต่ก็ไม่เคยช่วยให้ฉันเขียนรหัสได้เร็วขึ้น สภาพแวดล้อมการเขียนโปรแกรมแบบโต้ตอบ (เช่น Groovy console, Lisp REPL และอื่น ๆ ) เป็นโปรแกรมประหยัดเวลาที่ใหญ่ที่สุดในประสบการณ์ของฉัน
พฤหัสบดี

3
-1 สำหรับ TDD นั่นทำให้รู้สึกว่าโครงการเป็นระยะยาวไม่ใช่การแฮ็กสั้น
TheLQ

1
@TheLQ เพียงเพราะคุณอยากจะใช้เวลาทั้งหมดในการใช้ดีบักเกอร์ไม่ได้หมายความว่า TDD เป็นคำแนะนำที่ไม่ดี
byxor

29

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


+1 - ฉันเห็นด้วยกับสิ่งนี้ทั้งหมด การรู้วิธีเขียนโค้ดอย่างรวดเร็วใน STL นั้นมีขนาดใหญ่มากในการแข่งขันประเภทนี้
Jordan Parmer

23

ฉันมีส่วนร่วมอย่างสม่ำเสมอในการแข่งขัน ACM หวังว่าเคล็ดลับเหล่านี้จะช่วยคุณ:

  • ตามที่คนอื่น ๆ พูดให้คุ้นเคยกับภาษาใน C ++ โดยเฉพาะอย่างยิ่ง STL มันมีทั้งฟังก์ชั่นทั่วไปที่คุณต้องการใช้ (binary_search, min, max) และโครงสร้างข้อมูลที่แข็งแกร่งเพื่อประหยัดเวลาของคุณ (สแต็กเพื่อหลีกเลี่ยงการเรียกซ้ำ คิวสำหรับ BFS แม้ priority_queue สำหรับ Dijkstra ถ้าคุณชอบแบบนั้น)

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

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

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

  • มีความสนุกสนาน


6
+1 เพื่อทำความเข้าใจปัญหาก่อนที่จะพิมพ์ มิฉะนั้นคุณจะเสียเวลาของทีม (การแข่งขัน ACM คือ 3 คนคอมพิวเตอร์หนึ่งเครื่อง)
Codism

คำตอบที่ดี :)
Jared Farrish

13

ฟังดูเหมือนว่าฉันจะรู้แค่ C แต่ไม่ใช่ C ++ เลย คำถามเหล่านี้สามารถตอบได้อย่างง่ายดายโดยผู้ที่มีความรู้พื้นฐานในการใช้ภาษา

ตัวอย่างจะใช้มาโครเพื่อรับค่าต่ำสุดของสอง ints

แค่ใช้ฟังก์ชั่น std::minมีอยู่แล้ว.

หรือใช้ memsets เพื่อเริ่มต้นอาร์เรย์

std::array<T, N> เริ่มต้นเนื้อหาของมันแล้ว

เทคนิคการเข้ารหัสแบบใดที่มีอยู่ให้ใช้ในงานจริง

ขั้นตอนแรกคือการรู้ภาษาที่คุณใช้


ฉันพยายามทำความรู้จักภาษาที่ใช้นั่นคือสาเหตุที่ฉันถามคำถามนี้! ขอขอบคุณสำหรับการป้อนข้อมูลเกี่ยวกับเรื่องนี้
marktani

7
โอ้ ฉันต้องเข้าใจผิดคำถามของคุณแล้ว ฉันจะแนะนำหนังสือ เราขอนำเสนอหนังสือที่มีค่าควรอ่านเท่านั้นแทนที่จะเป็นหนังสือที่สอนเรื่องขยะซี
DeadMG

10

นอกจากการรู้ภาษาให้รู้จักเครื่องมือของคุณโดยเฉพาะโปรแกรมแก้ไขของคุณ ฉันได้รับการเข้ารหัสมานานกว่า 15 ปีอย่างมืออาชีพและฉันได้เห็นโปรแกรมเมอร์ที่ดีอย่างอื่นชะลอตัวลงเพราะคำสั่งแก้ไขเดียวที่พวกเขาใช้เป็นปุ่มเคอร์เซอร์และ crtl-x / c / v ..

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

การรู้จักตัวแก้ไขของคุณสามารถเร่งเวลาในการพัฒนาได้อย่างมาก


1
สาธุ ฉันแค่ทำงานกับคนใหม่ที่เร็วมาก ... และใช้เสียงเรียกเข้า มันใช้งานได้สำหรับเขาเพราะเขาใช้เวลาในการเรียนรู้วิธีใช้งาน
gbjbaanb

นอกจากนี้ ... หากตัวแก้ไขของคุณไม่รองรับคุณสมบัติเกือบทุกอย่างที่ระบุไว้ที่นี่ - ค้นหาตัวแก้ไขที่ดีกว่า
Abhi Beckert

สัมภาษณ์ใน Google เอกสาร ... ประสบการณ์ที่เลวร้ายที่สุดด้วยเหตุนี้
UmNyobe

6

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

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

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


+1 สำหรับYAGNI
Reinstate Monica

4

มีคำตอบมากมายแล้วฉันยังต้องการเพิ่มความคิดเห็นของฉัน

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

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


ลงคะแนนด้วยนิ้วชี้ :)
mlvljr

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

2

การพัฒนาซอฟต์แวร์เป็นหนึ่งในกิจกรรม 80-20 แบบคลาสสิก - นั่นคือที่ 80% แรกของงานใช้เวลา 20% ของเวลาและ 20% สุดท้ายของงานใช้เวลา 80% ของเวลา

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

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

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


-2

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

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


3
ผมไม่ได้เป็นหนึ่งใน downvoters แต่ผมถือว่าพวกเขาอาจ -1'd คุณเพราะคำถามที่เกี่ยวกับการเขียนโปรแกรมได้เร็วขึ้นใน C
Gordon Gustafson

9
VB6? อย่างจริงจัง? คุณมาจากอดีตหรือเปล่า
Konamiman

2
@ Konamiman: เฮ้ใช่ฉันเป็น ฉันไม่สามารถบอกได้ว่าเขาหมายถึง "ฉันกำลังเตรียมการในการเขียนโปรแกรม C ++" หรือ "ฉันกำลังเตรียมตัวสำหรับการประกวดการเขียนโปรแกรม C ++" แหมชิปอยู่ที่พวกเขาอาจ ถึงกระนั้นก็ไม่มีอะไรเต้นสภาพแวดล้อม RAD ที่รวดเร็วมากสำหรับการแข่งขันการเขียนโปรแกรมซึ่งทุก ๆ วินาทีมีความหมาย
ไบรอัน Boettcher

ฉันแก้ไขคำถามเพื่อความกระจ่าง
marktani

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