การเขียนโปรแกรมวรรณกรรมมีอุดมคติที่ดี ทำไมคุณถึงคิดว่าสิ่งนี้ไม่สำคัญ เป็นเพราะมันล้มเหลวในการส่งมอบ?
การเขียนโปรแกรมวรรณกรรมมีอุดมคติที่ดี ทำไมคุณถึงคิดว่าสิ่งนี้ไม่สำคัญ เป็นเพราะมันล้มเหลวในการส่งมอบ?
คำตอบ:
ครั้งแรกที่ฉันเห็นมันในหนังสืองานเขียนของ Knuth และคิดว่ามันดูเรียบร้อย จากนั้นฉันพยายามใช้การแสดงการเขียนโปรแกรมวรรณกรรมเพื่อทำความเข้าใจกับสิ่งที่เกิดขึ้นในโปรแกรมและพบว่ามันยากกว่าที่คิด อาจเป็นได้ว่าฉันคุ้นเคยกับการทำรายการโปรแกรมมากเกินไป แต่มันก็ดูสับสน
จากนั้นฉันก็ดูที่ซอร์สโค้ดและนั่นทำให้ฉันปิดไปแล้ว ฉันต้องเรียนรู้ที่จะเขียนโปรแกรมด้วยวิธีการใหม่ทั้งหมดโดยมีการโต้ตอบน้อยลงระหว่างข้อความในโปรแกรมและสิ่งที่คอมไพเลอร์เห็นและไม่เห็นประโยชน์ที่ตรงกัน
นอกจากนี้ผู้คนสามารถเขียนข้อโต้แย้งที่ยาวนานและน่าเชื่อถือได้ว่ารหัสนั้นกำลังทำ X เมื่อจริง ๆ แล้วทำ Y และฉันก็พบความคิดเห็นที่ทำให้เข้าใจผิด ฉันพัฒนาความชื่นชอบในการอ่านรหัสเพื่อดูว่ามันทำอะไรเร็วพอสมควร การเขียนโปรแกรมทางวรรณกรรมนั้นเป็นสิ่งที่ตรงกันข้าม
ฉันจะตำหนิผลเครือข่าย เพื่อให้ผู้อื่นแก้ไขรหัสและเอกสารของคุณพวกเขาจะต้องสามารถเข้าใจได้
สิ่งนี้จะผลักดันผู้คนให้อยู่ห่างจากสิ่งอื่นเช่น cweb / noweb เพราะการใช้พวกเขาจะทำให้คุณต้องเรียนรู้ TeX และไวยากรณ์ของโปรแกรมเฉพาะด้านบนของภาษาโปรแกรมที่คุณใช้สำหรับโครงการ สิ่งนี้สามารถมองเห็นได้ว่าเป็นการเสียเวลามากโดยเฉพาะอย่างยิ่งหากพวกเขาไม่ต้องการการเรียงพิมพ์ทางคณิตศาสตร์ใด ๆ ที่เป็นการจับรางวัลครั้งใหญ่สำหรับ TeX ในตอนแรก (และสำหรับโปรแกรมเมอร์แอปพลิเคชั่นจำนวนมากพวกเขาไม่ต้องการมันจริงๆ) แทนที่จะชอบความเห็น XML ของ Visual Studio เพราะมันได้รับความนิยมและเป็นที่ยอมรับ
สถานที่ที่ฉันได้เห็นการเขียนโปรแกรมความรู้ออกไปอยู่ในการคำนวณทางวิทยาศาสตร์ / สถิติที่โปรแกรมเมอร์ส่วนใหญ่มีการฝึกอบรมที่สำคัญ (ปริญญาเอกหรือที่รู้จัก) ในวิชาคณิตศาสตร์ CS หรือสถิติและจึงเป็น famliiar กับ LaTeX เอกสารที่พวกเขาเขียนมีแนวโน้มที่จะรวมสูตรที่ซับซ้อนจำนวนมากซึ่งเขียนได้ดีที่สุดใน TeX และพวกเขามีแนวโน้มที่จะเขียนโปรแกรมใน R สัดส่วนของโปรแกรมเมอร์ R ที่รู้เรื่อง SWeave นั้นสูงกว่าแน่นอนมาก สัดส่วนของโปรแกรมเมอร์ C ที่รู้เกี่ยวกับ cweb
org-mode
มันมีประโยชน์มากและฉันคิดว่ามันมากง่ายต่อการเข้าใจ (ไม่พูดถึงการจัดการ ) มากกว่าเว็บหรือ NOWEB เพียงอย่างเดียว ส่วนที่สำคัญของรหัสคือความสามารถในการอ่านและสามารถอ่านได้ (cf github.com/vermiculus/stack-mode )
ฉันรู้สึกทึ่งกับแนวคิดของการเขียนโปรแกรมวรรณกรรมในช่วงปลายยุค 90 ในขณะที่เรียนอยู่และฉันก็ยังรู้สึกทึ่งกับวิธีการเขียนโปรแกรม Knuths และการเรียงพิมพ์ ไม่มีอะไรนอกจากจะทำดีที่สุด
ระบบการเขียนโปรแกรมวรรณกรรมที่ Knuth ได้ออกแบบนั้นมีมากเกินกว่าที่จะพบได้ทันทีคือมันเอาชนะข้อบกพร่องมากมายในภาษาการเขียนโปรแกรมพื้นฐานซึ่งเครื่องมือสร้างรหัสที่สร้างขึ้นจากเอกสารต้นฉบับของ Knuths คือ Pascal มาตรฐาน
สำหรับผู้ที่โชคดีพอที่จะไม่ลอง Standard Pascal นี่เป็นไฮไลท์บางส่วน
ทุกสิ่งเหล่านี้โดยทั่วไปหมายความว่า Knuth ต้องการภาษาโปรแกรมที่ดีกว่า (ดังนั้นเขาจึงคิดค้นภาษาหนึ่ง) และใช้ภาษา Pascal เป็นภาษาแอสเซมบลี
ภาษาสมัยใหม่ส่วนใหญ่สามารถทำสิ่งเหล่านี้ได้โดยไม่ต้องใช้ความพยายามมากนักดังนั้นการลบส่วนใหญ่ของงานที่ Literate Programming ต้องแก้ไข
นอกจากนี้ภาษาสมัยใหม่ยังมีความหมายที่ชัดเจนซึ่งทำให้สามารถใส่รหัสลงไปได้
ดังนั้นสิ่งที่เหลืออยู่? ความสามารถในการสร้างรูปแบบเรียงพิมพ์ของเอกสารจากซอร์สโค้ดและที่มีอยู่ในปัจจุบัน
แค่คิดว่า JavaDoc - Java runtime API อาจเป็นชิ้นส่วนที่ใหญ่ที่สุดของการเขียนโปรแกรม Literate ที่มีอยู่ในวันนี้ (ยกเว้นว่ารหัสไม่ได้นำเสนอจริง แต่ COULD ได้รับถ้า Java ถูกเปิดแหล่งที่มาจากจุดเริ่มต้น) ดูตัวอย่างการนำเสนอของเฟรมเวิร์กคอลเล็กชันบนhttp://download.oracle.com/javase/6/docs/api/java/util/Collection.html
ฉันเชื่อว่ามีระบบที่คล้ายกันสำหรับ. NET และโปรแกรมหลักอื่น ๆ
To make it possible to have a single-pass compiler, all declarations had to come in a certain order.
คำสั่งการประกาศเช่นนั้นจะทำให้การออกแบบคอมไพเลอร์ง่ายขึ้น แต่ก็ไม่ได้เปิดใช้งาน / ป้องกันการคอมไพล์แบบพาสครั้งเดียว ตัวอย่างเช่น Delphi ไม่มีข้อ จำกัด ในการสั่งซื้อ แต่ก็ยังคงเป็นคอมไพเลอร์ Pascal แบบพาสด์เดียวอย่างเคร่งครัด
สิ่งหนึ่งที่ฉันค้นพบเมื่อฉันอ่านบทเขียนในยุค 90 คือว่ามันดึงดูดผู้คนที่มีความปรารถนาอย่างแรงกล้าที่ต้องการจะทำสิ่งที่ถูกต้องอย่างแน่นอน - และนั่นก็เกี่ยวข้องกับการเขียนระบบการเขียนโปรแกรมด้วยตนเอง noweb เป็นความพยายามที่ดีที่จะตัดสิ่งนั้นออกโดยการจัดหาตัวหารร่วมน้อยที่สุดให้ทุกคนถึงแม้ว่าฉันจะใช้เวลาส่วนใหญ่ในการพัฒนาเครื่องพิมพ์ที่น่ารักสำหรับมัน ...
ปัญหาอีกอย่างก็คือมันต่อต้านการว่องไวจริงๆ ในบางวิธีการชะลอตัวเป็นสิ่งที่ดีเพราะมันบังคับให้คุณคิดล่วงหน้าและทำสิ่งต่างๆให้ถูกต้องตั้งแต่ครั้งแรก ในทางกลับกันการจัดทำเอกสารอย่างพิถีพิถันในขณะที่คุณไปหมายความว่ามีอุปสรรคขนาดใหญ่เพื่อ refactoring รหัสของคุณ และถ้าคุณรอจนกว่ารหัสของคุณจะแข็งตัวก่อนที่คุณจะ LP-ify คุณจะได้งานเอกสารที่ใช้เวลาหลายวันซึ่งสามารถหยุดคุณในแทร็กได้
ในความคิดเห็นที่ต่ำต้อยของฉัน บริษัท หลายแห่งมีวัฒนธรรมที่ตรงข้ามกับวัตถุประสงค์ของการเขียนโปรแกรม: พวกเขาต้องการผลลัพธ์ที่เร็วขึ้น (พวกเขาจะร้องไห้เกี่ยวกับคุณภาพเมื่อแอปอยู่ในการผลิต) จากประสบการณ์ของฉันเจ้านายของฉันปฏิเสธที่จะเข้าใจว่าผลลัพธ์ที่เร็วขึ้นไม่ได้หมายความว่า "โปรแกรมที่ทำงานได้ในวันรุ่งขึ้นหลังจากที่ฉันขอ" สำหรับพวกเขาหากนักพัฒนาไม่ได้ยุ่งกับการพิมพ์บนแป้นพิมพ์เขาจะไม่ทำงานคือ "เสียเวลาในการออกแบบโดยไม่รู้สึก" ใช่ฉันรู้ว่าเจ้านายของฉันเป็น arsehole
ผู้เขียนโค้ดไม่ได้เป็นภาษาอังกฤษ
โคเดอร์ไม่ชอบเขียนเอกสารเพราะมันไม่ได้ช่วยให้โค้ดรันได้
โคเดอร์ไม่เก่งในการเขียนเอกสารเพราะมันเป็นสื่อที่ไม่ดีในการแสดงความคิดเห็น
ความรู้เกี่ยวกับการเขียนโปรแกรมดูเหมือนจะเป็นความคิดของการจัดทำเอกสารไปยังระดับถัดไปที่รหัสมีความคิดเพิ่มเติม อาจจะใช้งานได้ แต่สำหรับ coder ส่วนใหญ่ดูเหมือนว่าเอกสารที่น่ารังเกียจ
สาเหตุหลักมาจากคนที่โง่มาก ประจักษ์พยานที่ชัดเจนซึ่งเป็นกระแสที่ไม่รู้จบของการเดาและความเข้าใจผิดที่แสดงออกโดยคนหนุ่มสาวเกี่ยวกับธรรมชาติของเทคนิคง่าย ๆ นี้
ผู้คนใช้ LP เป็น: (a) วิธีการจัดทำเอกสาร (b) วิธีการเขียนเรียงความที่จำเป็นต้องใช้ทักษะหรือความสามารถพิเศษ (c) เพียงแค่ไม่มีเงื่อนงำ - ในฐานะผู้สร้างโปรแกรมแก้ไขการเขียนโปรแกรม Leo โดยการยอมรับของเขาเอง ฯลฯ เป็นต้น
LP คือ: (1) การเขียนโปรแกรมด้วยการผสมผสานของรหัสและวลีในภาษามนุษย์ (= ใด ๆ ) ซึ่งภายหลังจะยืนสำหรับส่วนอื่น ๆ ของรหัสและ / หรือวลีที่รวมอยู่ด้วย นี่คือสิ่งที่ผู้เขียนตำราการเขียนโปรแกรมจำนวนมากทำ .. และ (2) เป็นตัวประมวลผลง่าย ๆ ที่ขยายวลีเหล่านั้นในมนุษย์ (ซึ่งกลายเป็นชื่อของรูทีนย่อยที่รวมอยู่) เพื่อคลี่คลายผลลัพธ์ ล่าม). มิฉะนั้นจะสามารถขยายข้อความที่เขียนด้วยยูทิลิตี้ขนาดเล็กอีกอันเพื่อรวมสัญลักษณ์การจัดรูปแบบเพื่อเปลี่ยน "แหล่งข้อมูล" ให้เป็นข้อความที่อ่านได้ในรูปแบบที่ดี
คนหนุ่มสาวไม่เคยลองใช้ความคิดที่เรียบง่ายอย่างนี้และอาจจินตนาการหรือจินตนาการถึงเหตุผลปลอม ๆ ว่าทำไมพวกเขาถึงไม่ลองหรือทำมัน
โดยพื้นฐานแล้วแนวคิดหลักของการเขียนโปรแกรม "in pseudocode" ที่เขียนด้วยภาษามนุษย์แล้วขยายด้วยยูทิลิตี้ตัวประมวลผลอย่างง่าย HELPS MANAGE ATTENTION (จำกัด ซึ่งเป็นปัญหาหลักสำหรับโปรแกรม longish ใด ๆ ) เช่นการพับโค้ดหรือการแบ่งส่วนของโปรแกรม เป็นฟังก์ชั่น / รูทีนย่อยจำเป็นสำหรับคุณที่จะไม่สูญเสียรายละเอียด แต่ก็ไม่จำเป็นทั้งหมดสำหรับการดำเนินการของเครื่อง
มี 2 แง่มุมของการเขียนโปรแกรมความรู้ที่ผมมีไม่ปรารถนาถูกรวมเข้าไปในการเขียนโปรแกรมหลัก - ภาพฝังตัว (เช่นแผนภาพการออกแบบ) และตัวชี้ความพยายามก่อนหน้านี้และอื่น (เช่น "เหตุผลที่มันเป็นเช่นนี้เป็นเพราะฉันพยายามวิธีอื่น ๆ นี้และ มันไม่ทำงานเพราะ ... ") ทั้งสองด้านสามารถจัดการได้กับความคิดเห็นของ doc และ URIs
เพราะตรรกะของโปรแกรมไม่ทำงานเหมือนที่เราพูด โปรแกรมมีโฟลว์และเงื่อนไขและลูปที่ระบุไว้เป็นอย่างดี
หลังจากเขียนโค้ดเป็นจำนวนมากฉันคิดว่าในแง่เหล่านี้ สมองของฉันเปลี่ยนปัญหาเป็นโดเมนเป้าหมายของโค้ดที่สามารถเรียกทำงานได้ และมันมีประสิทธิภาพมากขึ้นสำหรับฉันที่จะเขียนลงในภาษาการเขียนโปรแกรมปกติกว่าต้องทำขั้นตอนการแปลงพิเศษเพื่อให้โปรแกรมของฉันรู้
ในความเป็นจริงฉันเชื่อว่าโปรแกรมของฉันมีความรู้แล้ว ... ตัวระบุการพูดชื่อฟังก์ชั่นที่ดีความคิดเห็นที่ฉันทำแฮ็กเกอร์บางอย่างซึ่งฉันจะไม่เข้าใจตัวเองทันทีหลังจากผ่านไปสองสามเดือน
เพื่อสรุป: โค้ด Java ของฉันมีความรู้มากกว่าตัวมันเองเนื่องจากการเขียนโปรแกรม "รู้แจ้ง" ทุกตัวต้องการที่จะเป็น
ฉันมาเขียนโปรแกรมด้วยวิธีอื่น ๆ - ฉันฝันว่าจะมีการจัดระเบียบโค้ดให้เหมาะกับความคิดของฉันไม่ใช่ตามที่คอมไพเลอร์ต้องการ ฉันพบว่าลีโอเกือบจะเหมาะสำหรับจุดประสงค์นี้ นอกจากนี้ยังรองรับการติดตามการเปลี่ยนแปลงของไฟล์ภายนอก ไฟล์เหล่านี้ไม่จำเป็นต้องมีมาร์กอัปพิเศษใด ๆ ดังนั้นฉันสามารถใช้ Leo สำหรับตัวเองโดยไม่จำเป็นต้องให้ผู้อื่นในทีมรู้ คุณลักษณะนี้ - "@ ต้นไม้เงา" - มีแนวโน้มดีมากถึงแม้จะเป็นรถบั๊กกี้ แต่ก็ต้องการลูกตามากขึ้น และมันยังแก้ไขปัญหา "โอ้ไม่ทุกอย่างในไฟล์เดียว" ด้วยการจัดระเบียบทุกอย่างให้เป็นโครงร่างแบบต้นไม้และรองรับไฟล์ภายนอก
สำหรับฉันตรงกันข้ามกับชื่อ "การเขียนโปรแกรมความรู้" ไม่เกี่ยวกับเอกสารเลย ฉันไม่มีเอกสารมากกว่านี้มาก่อน มันเกี่ยวกับการมีโครงสร้างที่ช่วยให้ฉันไม่หลงทาง ฉันขอสาบานโดยเฉพาะอย่างยิ่งเมื่อจัดการไฟล์ JSP behemoth (และแม้ว่า Leo จะมีจุดประสงค์เบื้องต้นสำหรับ Python เป็นหลักและไม่สนับสนุนภาษา JSP - ฉันต้องแยกไฟล์ไปที่ Tree Leo ด้วยตนเอง!)
ฉันเห็นว่ามันเป็นเครื่องมือการสอนที่มีค่าซึ่งสามารถเขียนวิทยานิพนธ์ลงบนโค้ดได้และจากนั้นเกร็ดเล็กเกร็ดน้อยของรหัสการทำงานสอดแทรกอยู่ในนั้นเพื่อสั่งให้ผู้อ่านรู้ว่าอะไรคืออะไร
นอกสภาพแวดล้อมทางการศึกษาล้วนๆฉันคิดว่ามีเพียง Knuth เท่านั้นที่เข้าใจวิธีใช้งานได้ดีที่สุด
มันเลวร้ายที่สุดในโลก - คุณต้องเขียนโปรแกรมคอมพิวเตอร์ที่ถูกต้องและเจาะจงสูงในภาษาที่ไม่เฉพาะเจาะจง = อังกฤษ ดังนั้นคุณต้องเขียนมันอย่างระมัดระวังโดยใช้วลีที่ถูกต้องดังนั้นคุณอาจจะแค่เขียนโค้ด