อะไรคือแนวคิดการเขียนโปรแกรมที่ฉันควรจะมีความเข้าใจอย่างลึกซึ้งเกี่ยวกับงานฝีมือของฉัน (การเขียนโปรแกรม)? [ปิด]


13

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

โปรดทราบว่าที่ฉันใส่ ฯลฯ เป็นที่ที่คำถามของฉันอยู่ ฉันเพิ่งอ่านโพสต์ทางอินเทอร์เน็ตที่เขียนว่า 9 จาก 10 โปรแกรมเมอร์ไม่สามารถอ้าปากค้างโปรแกรมได้!

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

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


3
โพสต์ของ Jeff Atwood ไม่ได้เกี่ยวกับความรู้ด้านการเขียนโปรแกรมอย่างลึกซึ้ง ... มันเกี่ยวกับความจริงที่ว่าหลายคนขาดความเข้าใจพื้นฐานขั้นพื้นฐานบางอย่างเกี่ยวกับการเขียนโปรแกรมและการขาดความเข้าใจพื้นฐานขั้นพื้นฐานเหล่านั้น
Robert Harvey

2
ฉันไม่เข้าใจว่าทำไมคำถามนี้จึงถูกปิด มันเป็นคำถามที่ติดดาว 5 ครั้งและมีคำตอบที่เป็นประโยชน์มากมาย นี่คือข้อมูลประเภทหนึ่งที่ฉันต้องการเจอ - เพียงเพราะไม่มีคำตอบง่ายๆไม่ได้หมายความว่าข้อมูลนั้นไม่คุ้มค่าบางที programmers.stackexchange.com จำเป็นต้องประเมินเกณฑ์การปิดคำถามอีกครั้ง
Rocklan

@LachlanB ฉันโหวตให้เปิดใหม่อีกครั้ง ... ต้องการคะแนนอีก 4 เพื่อให้สำเร็จ
Michael Brown

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

คำตอบ:


18

รายการนี้เป็นการเริ่มต้น ... คุณกำลังถามคำถามใหญ่!

  • วิธีการชี้แจงและจดบันทึกสิ่งที่ลูกค้าต้องการ ("ข้อกำหนด") นี่คือศิลปะในตัวของมันเอง หากคุณสามารถทำได้งานเขียนโปรแกรมของคุณจะดีขึ้นมาก
  • วิธีการประมาณและวางแผนโครงการ ผู้คนจะถามคุณเกี่ยวกับการประมาณการเตรียมพร้อม
  • วิธีตรวจทานรหัสของคนอื่นอย่างสร้างสรรค์
  • รูปแบบการออกแบบ นี่เป็นเรื่องใหญ่ แต่อย่าใช้มากเกินไปเพื่อประโยชน์ของมัน
  • เรียนรู้ความแตกต่างระหว่างข้อผิดพลาดปัญหาและการร้องขอคุณสมบัติ
  • ติดตามความเคลื่อนไหวของเฟรมเวิร์ก / ไลบรารี คุณไม่จำเป็นต้องใช้พวกเขา แต่คุณต้องรู้ว่าพวกเขาทำอะไรและเป็นมืออาชีพ หากบางสิ่งดูเหมือนยากเกินไปก็อาจเป็นวิธีที่ง่ายกว่ามากในการทำสิ่งต่าง ๆ
  • วิธีจัดทำเอกสารอัลกอริธึมที่ซับซ้อนในผังงานหรือเพียงเขียนเป็นภาษาอังกฤษ อย่าคาดหวังว่าใครบางคนจะใช้เวลา 2 วันในการสร้างรหัสของคุณ
  • วิธีจัดระเบียบโครงสร้างรหัสของคุณเพื่อให้คนอื่นสามารถเข้าใจได้
  • วิธีแสดงความคิดเห็นรหัสของคุณ
  • วิธีเขียนการทดสอบหน่วย
  • รู้ว่าเกิดอะไรขึ้นภายใต้ประทุน เช่นกำลังเรียกเว็บเซอร์วิส - มันกำลังทำอะไรอยู่?
  • วิธีการแยกตรรกะออกเป็นคลาสต่างๆ
  • วิธี refactor code
  • เรียนรู้ส่วนสำคัญของภาษาการเขียนโปรแกรมไม่กี่อย่าง คุณจะประหลาดใจในสิ่งที่คุณสามารถเรียนรู้จากพื้นที่อื่น
  • วิธีบอกโปรแกรมเมอร์คนอื่น ๆ ว่าต้องเขียนอะไร
  • อธิบายวิธีการจัดการสิ่งที่คุณทำและสาเหตุ
  • เช่นเดียวกับปีเตอร์กล่าวว่าวิธีการแก้ปัญหา ฉันเห็นด้วยกับทุกสิ่งที่เขาพูดโปรแกรมเมอร์จริง debug ไม่ใช่แค่เดา
  • วิธีการทำงานกับความบ้าคลั่ง มีอยู่มากมายที่นั่น
  • วิธีรับสิ่งที่ทำ ทฤษฎีทั้งหมดในโลกจะไม่ช่วยคุณถ้าคุณทำสิ่งที่ไม่สามารถทำได้

ฉันตอบคำถามอื่นตามบรรทัดที่คล้ายกัน (มีเนื้อหาที่คล้ายกัน) ที่นี่:

เคล็ดลับแนวทางชี้ให้จำสำหรับการแสดงรหัสมืออาชีพ?


1
+1: รับสิ่งที่เสร็จสิ้นแล้ว! สองสามปีที่ผ่านมาฉันโพสต์พูดจาโผงผางที่บอกว่านี่เป็นลักษณะที่กำหนดของวิศวกร - พวกเขาทำสิ่งต่างๆให้เสร็จ บางครั้งมันไม่สวยและบางครั้งคุณจะต้องย้อนกลับไปทำซ้ำ แต่ในตอนท้ายของวันพวกเขาก็ทำสิ่งต่าง ๆ เสร็จ!
Peter Rowell

@PeterRowell: คุณอาจพบว่าสิ่งนี้น่าอ่าน: brandonsavage.net/when-to-write-bad-code
Marjan Venema

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

@MarjanVenema: ใช่ฉันเห็นด้วยกับเขาอย่างสมบูรณ์ ย้อนกลับไปในยุค 80 ฉันได้รับมอบหมายให้เขียนสเป็คสำหรับบรรณาธิการใหม่เพื่อขออนุมัติก่อนที่ฉันจะเริ่มเขียนโค้ด ฉันจ้องไปที่หน้าจอว่างเปล่าที่น่ากลัวกว่าสัปดาห์พยายามหาวิธีอธิบายสิ่งที่ฉันไม่เข้าใจ ผู้จัดการของฉันแสดงความไม่พอใจกับการขาดความก้าวหน้าของฉัน หลังจากวันหยุดสุดสัปดาห์ 3 วันเขามีร่างจดหมายบนโต๊ะทำงาน เขาถามว่าเกิดอะไรขึ้นและฉันก็บอกว่าฉันเขียนบรรณาธิการในช่วงสุดสัปดาห์และจากนั้นก็เขียนสเป็คของสิ่งที่ฉันทำงาน ฉันเขียนรหัสบางส่วน แต่ส่วนใหญ่จะเป็น refactor / cleanup
Peter Rowell

1
@YannisRizos - ฉันสนใจที่จะเขียนบล็อกเกี่ยวกับเรื่องนี้ คุณต้องการส่งอีเมลพร้อมแนวทางหรือฉันควรเขียนอะไรบางอย่าง
Rocklan

22

ภายใต้หัวข้อ " ฯลฯ " มีบางสิ่งบางอย่างที่สามารถใช้เวลา 50% หรือมากกว่า

เรียนรู้วิธีการแก้ไขข้อบกพร่อง

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

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

ข้อผิดพลาดหลายอย่างไม่สำคัญ แต่พวกเขาอาจมองเห็นได้ยากเพราะคุณ "รู้" ว่าโค้ดควรเป็นอะไร ... ยกเว้นว่าไม่ใช่ ค้นหาเพื่อนเพื่ออธิบาย ขอให้พวกเขาเป็น "คนงี่เง่าที่มีความเชี่ยวชาญ": ใครบางคนที่ไม่รู้จักรหัสของคุณ แต่คนที่คุณรู้ว่าคุณไม่สามารถทำให้ BS ผ่านมาได้ อย่าแปลกใจถ้าคุณอธิบายให้พวกเขาฟังคุณหยุดและพูดว่า "และคุณก็สามารถ ... เห็น ... เห็นไหมว่า ... sh * t. ขอบคุณ"

ข้อบกพร่องที่ไม่น่าสนใจต้องใช้คลังแสงของเทคนิค คลาสสิกที่สามารถจับแมลงที่เกี่ยวข้องกับจังหวะเวลาได้อย่างรวดเร็วคือ Wolf Fence ในอลาสกา มีหมาป่าอยู่ที่ไหนสักแห่งในอลาสกา สร้างรั้วตัดรัฐครึ่ง หมาป่าอยู่ทางไหน ตัดข้างนั้นครึ่งหนึ่ง นวดแล้วล้างซ้ำ การทำเช่นนี้ 20 ครั้งในสถานที่ที่เลือกไว้อย่างดีในรหัสจะช่วยลดพื้นที่ที่ข้อผิดพลาด (wolf) สามารถเป็น 1/1048576 ฆ่าหมาป่าตัวนั้น

เคล็ดลับ: มองหาคลื่น handwaves ทั้งทางร่างกายจิตใจหรือสิ่งอื่นใด ทันทีที่คุณ (หรือเพื่อนร่วมงานของคุณ) สะดุ้ง / โอน / ลดความสนใจที่จ่ายให้กับส่วนของรหัสไปบ้ากันโดยสิ้นเชิง เนื่องจากพื้นที่ที่คุณเพิ่งรู้ว่าบั๊กไม่สามารถทำได้แม้ว่าคุณจะใช้เวลาหลายชั่วโมง / วันในการค้นหาสิ่ง d * mn และยังหามันไม่ได้ ... นั่นเป็นตำแหน่งที่น่าจะเป็นที่สุดสำหรับบั๊ก ไม่มีใครได้รับ'บาย' , ไม่มีใคร (รวมถึงเครื่อง, ระบบปฏิบัติการ, คอมไพเลอร์หรือคุณ ) ได้รับ "ความเคารพ" มีข้อบกพร่อง ระยะเวลา จบประโยค ตอนนี้ไปฆ่าสิ่ง d * mn

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


คุณอาจสนใจSaff Squeezeเทคนิคที่อธิบายโดย Kent Beck ซึ่งใช้การทดสอบและการปรับโครงสร้างใหม่สำหรับการดีบัก: Hit 'em High, Hit' em Low : การทดสอบการถดถอยและ Saff Squeeze โดย Kent Beck สถาบัน Three Rivers (Abstract: ถึง แยกข้อบกพร่องอย่างมีประสิทธิภาพเริ่มต้นด้วยการทดสอบระดับระบบและแบบอินไลน์และพรุนอย่างต่อเนื่องจนกว่าคุณจะมีการทดสอบที่เล็กที่สุดที่เป็นไปได้ที่แสดงให้เห็นข้อบกพร่อง) มันฟังดูคล้ายกับ Wolf Fence ของคุณโดยใช้การทดสอบและความสามารถ
Jörg W Mittag

1
คำตอบที่ยอดเยี่ยม - ทุกคนสามารถเขียนโค้ดดีบักโปรแกรมเมอร์จริงได้
Rocklan

@ JörgWMittag: ฉันเป็นแฟนตัวยงของการทดสอบการถดถอยอัตโนมัติ ฉันใช้มันครั้งแรกในโครงการเครื่องมือค้นหาย้อนกลับไปในช่วงกลางยุค 80 และฉันก็ตกใจ (ตกใจ!) ในสิ่งที่จะหลุดออกไปหลังจากสิ่งที่ดูเหมือนจะเป็นการเปลี่ยนแปลง "เล็กน้อย" กับโค้ดที่ดูไร้เดียงสา (หมายเหตุ: นี่คือ 200,000 + SLOC ของ C และปัญหาการจัดการหน่วยความจำเป็นความหายนะของการดำรงอยู่ของเรา)
Peter Rowell

3

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

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

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

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

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


2

YAGNI : "ใช้สิ่งต่าง ๆ เสมอเมื่อคุณต้องการสิ่งเหล่านี้จริง ๆ ไม่เคยเมื่อคุณคาดหวังว่าคุณต้องการมัน"

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


1

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

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

แก้ไข:

หากคุณไม่เชื่อเรื่องนี้และคุณลงคะแนนฉันฉันเชื่อว่าคุณไม่ทราบว่าคุณมีความมุ่งมั่นที่จะทำมันเป็นเวลา 20 ปี ฉันรู้ว่าฉันทำเพราะฉันยอมรับสิ่งนี้ ;)


0

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

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

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


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