ผู้คนสามารถเขียนและบำรุงรักษาโค้ดที่ซับซ้อนและอ่านยากได้อย่างไร [ปิด]


27

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

ผู้คนสามารถเขียนและบำรุงรักษาโค้ดที่ซับซ้อนและอ่านยากได้อย่างไร


1
ฉันคิดว่าพวกเขาไม่ :-D
Pawka

2
@Pawka: ที่ "พวกเขา" ไม่รวมถึงคน SQLite
Frank Shearar

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

1
มีใครเคยเห็นโครงการขนาดใหญ่ที่อ่านง่ายหรือไม่
Jeff Davis

2
การจ้างงานฝึกงาน postdocs ฯลฯ และทำให้พวกเขาทำมัน ...
DarenW

คำตอบ:


19

มีความแตกต่างใหญ่ระหว่างคอมเพล็กซ์และซับซ้อน ลิงค์ต่อไปนี้เกี่ยวกับผลรวมมัน :)

http://codebetter.com/blogs/dru.sellers/archive/2009/09/25/complex-vs-complicated.aspx

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

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

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


31

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

http://sqlite.org/testing.html

ตัวเลขที่ส่ายนั้นสวยมากพวกเขามีรหัสทดสอบประมาณ 640 เท่าของรหัสการผลิต

แก้ไข: คำถามนี้ได้รับการยกขึ้นมาจากความตายดูเหมือนว่า! และอีกไม่กี่ปีต่อมาหน้าเดียวกันก็รายงานว่าพวกเขามีรหัสการทดสอบจำนวน 1177 เท่าของสายการผลิต!


2
ไม่มีใครอื่นนอกจากฉันเห็นว่านี่เป็นปัญหามากกว่าเป็นความภูมิใจ ?
สตีเฟ่น

1
ฉันไม่คิดจริงๆ ฐานข้อมูลจะต้องมีความน่าเชื่อถือก่อนอื่น
ts01

5
@ สตีเฟ่นเหตุใดหลายกรณีทดสอบจะมีปัญหา ?

1
เอวของเวลา การทดสอบมากเกินไปนั้นไม่ดีเท่าการทดสอบเล็กน้อย (IMHO)
Dainius

9
การทดสอบจะเสียเวลาหากครอบคลุมกรณีที่เป็นไปได้ที่รหัสอาจล้มเหลว
Ramhound

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

4

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

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

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

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

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


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

4

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

คำแนะนำของฉัน:

  • แน่ใจว่าคุณเข้าใจภาษาของโครงการ มันไม่พอรู้ภาษา
  • เรียนรู้ทุกรายละเอียดเกี่ยวกับโดเมนก่อนวางโค้ด

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


3

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


1
ฮ่า ๆ ฉันทำงานกับ soemone เช่นนี้ถ้ามีหลายวิธีที่จะทำอะไร (และมีเสมอ) เขาจะเลือกโซลูชันที่ซับซ้อนและซับซ้อนที่สุดเสมอ ฉันไม่คิดว่าเขาจะรู้เรื่องนั้นด้วยซ้ำ
HLGEM

3

ผู้คนสามารถเขียนและบำรุงรักษาโค้ดที่ซับซ้อนและอ่านยากได้อย่างไร

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

รหัสใดต้องใช้เวลาในการทำความเข้าใจ มันเป็นแค่บางคนใช้เวลานานกว่าคนอื่น:)


2

คุณสามารถห่อหัวของคุณรอบ ๆ รหัสฐานใด ๆ ถ้าคุณมี - ความขยันหมั่นเพียรความอดทนและวิธีการที่เป็นระเบียบ - แต่ส่วนใหญ่ความเพียร :-)


1

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


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

1

พวกเขาพยายามเขียนมันในวิธีที่เรียบง่าย แต่ไม่ใช่วิธีที่ง่ายกว่า

ทำอะไรง่ายๆให้มากที่สุดเท่าที่จะทำได้เพื่อให้เข้าใจ / อ่านได้เร็วขึ้นแม้ว่าจะใช้เวลาสักพักก็ตาม


1

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

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

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