วิธีแก้ไขสำเนา / วางรูปแบบ?


16

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

ไม่ใช่เรื่องง่ายที่จะป้องกันสิ่งนี้เนื่องจากฐานรหัสเปิดให้ทั้ง บริษัท ผู้คนจำนวนมากทำงานเกี่ยวกับเรื่องนี้

ตอนนี้ความยุ่งเหยิงมีอยู่แล้ววิธีที่ดีที่สุดในการลบความซ้ำซ้อนเหล่านั้นโดยไม่ทำลายมากเกินไปคืออะไร?


3
สิ่งที่น่ารำคาญที่สุดคือเมื่อโค้ดได้รับการคัดลอก / วางจากบางเว็บไซต์แล้วแม้แต่ความคิดเห็นก็ไม่ได้ถูกลบทิ้ง ดังนั้นคุณสามารถค้นหา: "// ขอบคุณสำหรับคาร์โล" ... และเมื่อคุณชี้ไปที่พวกเขาพวกเขาก็หัวเราะแล้วพูดว่า: "ทิ้งมัน!))" นั่นไม่ใช่มืออาชีพและเศร้า !!!
CoffeeCode

2
ไม่เพียง แต่ที่ปรึกษาเท่านั้น
AndersK

คำตอบ:


14

ส่วนหนึ่งของคำตอบคือRefactoring

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

อีกส่วนหนึ่งคือการศึกษา

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

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

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


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

@Sergio Tapia - จริง แต่คุณไม่สามารถ refactor โดยไม่ได้ ยินดีต้อนรับสู่ความเป็นจริงประมาณปี 2011
Scott Whitlock

1
@Sergio ถ้าคุณหมายความว่าการทดสอบหน่วยรหัสเดิมยากฉันไม่สามารถตกลงเพิ่มเติม ฉันยินดีที่จะขยายประโยคที่ยกมาเป็น "ก่อนอื่นคุณควรเริ่มงานที่ยากลำบากและเครียดในการเขียนการทดสอบหน่วย ... " :-) อย่างไรก็ตามถ้าคุณหมายความว่าตั้งแต่การทดสอบหน่วยยากเราควรลองโดยไม่ทำ ฉันไม่เห็นด้วยอย่างยิ่ง (อิงจากประสบการณ์จริงไม่ใช่ทฤษฎี) ไม่มีถนนในการรักษารหัสดั้งเดิม
PéterTörök

9

ในฐานะส่วนหนึ่งของการศึกษาอย่าง @Peter กล่าวว่าคุณสามารถแนะนำตัวตรวจจับการคัดลอกและวางอย่างPMDและใช้เป็นส่วนหนึ่งของงานสร้างของคุณเพื่อช่วยในการบังคับใช้ส่วนนี้ของมาตรฐานการเข้ารหัสของคุณ

ตรวจสอบให้แน่ใจว่าโครงการเข้ารหัสมาตรฐานของคุณครอบคลุมรูปแบบนี้เพื่อให้คุณมีพื้นฐานในการเริ่มการสนทนา


1
ฉันชอบสิ่งนี้สิ่งที่ดี!
ozz

เป็นไปได้หรือไม่ที่จะต้องปฏิบัติตามมาตรฐานการเข้ารหัสในสัญญาของผู้รับเหมา
อาร์มันด์

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

ขอบคุณหลังจากโพสต์ของคุณฉันยังพบclonedigger.sourceforge.netสำหรับ Python / Java
LennyProgrammers

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

8

ผู้คน (ที่ปรึกษา) รู้สึกว่าถูกกดเพื่อปล่อยคุณลักษณะโดยเร็วที่สุด

คุณไม่มีปัญหาทางเทคนิคคุณมีปัญหาสังคม แน่นอนคุณมีปัญหาด้านการจัดการ

ไม่ใช่เรื่องง่ายที่จะป้องกันสิ่งนี้เนื่องจากฐานรหัสเปิดให้ทั้ง บริษัท ผู้คนจำนวนมากทำงานเกี่ยวกับเรื่องนี้

"ฐานรหัสเปิดให้ทั้ง บริษัท " ไม่ใช่ปัญหา ไม่เป็นไร

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

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

คุณต้อง

  1. เริ่มต้นที่ด้านบนด้วยผู้จัดการที่เสริมรางวัล คุณต้องเปิดเผยแนวปฏิบัติปัจจุบันและบันทึกต้นทุนและความเสี่ยง คุณต้องเสนอทางเลือกอื่นที่ช่วยลดต้นทุนและความเสี่ยง

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

  3. คุณจะต้องช่วยผู้จัดการให้เครดิตแนวทางใหม่ซึ่งจะทำให้พวกเขาดูดีและคุณจะถูกเพิกเฉย

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


1
+1 โดยเฉพาะอย่างยิ่งสำหรับ "คุณจะต้องช่วยผู้จัดการให้เครดิตแนวทางใหม่ซึ่งจะทำให้พวกเขาดูดีและคุณจะถูกเพิกเฉย" เตรียมตัวให้ดีกว่านี้บ่อยเกินไปนี่คือความเป็นจริง :-(
PéterTörök

@ PéterTörök: มีคนยอมแพ้เรื่องนี้มากเกินไป พวกเขาไม่ได้รวบรวมข้อเท็จจริงเกี่ยวกับปัญหาที่เกิดจากการคัดลอก / วางหรือพวกเขาไม่ได้ทำเรื่องเพื่อการจัดการอีกครั้งและอีกครั้ง
S.Lott

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

@ Lenny222: ความคิดเห็นของคุณสมเหตุสมผลเล็กน้อย "เป็นปัญหาที่ไม่มีใครสนใจสามารถแก้ไขได้ทุกเวลาเร็ว ๆ นี้" เป็นคำถามที่ชัดเจน ความคิดเห็นนี้หมายความว่าอย่างไร อะไรหายไปจากคำตอบ? คุณต้องการอะไรอีก
S.Lott

นี่จะเป็นกระบวนการการศึกษาต่อเนื่อง
JeffO

5

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

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

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

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

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


อยากรู้อยากเห็นคุณพบสิ่งที่เหมือนกันหรือไม่?
JeffO

@Jeff - ใช่ไม่กี่ แต่รูปแบบส่วนใหญ่แสดงให้เห็นว่าการทำซ้ำเป็นผลมาจากคนที่ต้องการรหัสห้องสมุด (ควร) อะไรทำสิ่งที่แตกต่างกันเล็กน้อย
Tim Post

5

ฉันเห็นด้วยกับคำตอบที่ได้รับจนถึง คุณควร:

  • สร้างการทดสอบหน่วย
  • ปรับปรุงโครงสร้าง
  • ให้ความรู้
  • ใช้ความพยายามในมาตรฐานการเข้ารหัสและตรวจจับการละเมิด

แต่ในอีกแง่หนึ่งคุณต้องดูว่าอะไรทำให้คนลอกเลียนแบบและแก้ไข

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

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

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

อ่านแนวทางการออกแบบกรอบ

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


3

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

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


2

ฉันกังวลกับปัญหาเดียวกันที่นี่และสิ่งที่ฉันทำคือ: อย่าพยายามหลีกเลี่ยงสิ่งนั้นล่วงหน้าเพียงแค่สร้างใหม่เมื่อมันแย่เกินไป

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


2

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

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

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


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

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

1

วิธีเดียวที่จะกำจัดรหัสคัดลอก / วางคือ (IMHO) การตรวจสอบรหัสมีบุคคล (หรือมากกว่า) เพื่อตรวจสอบรหัสและเมื่อพวกเขาพบรหัสที่ดูเหมือนว่าจะมาจากการกระทำการคัดลอก / วางปล่อยให้โปรแกรมเมอร์ refactor


1

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

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

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