การศึกษาว่าโปรแกรมเมอร์สามารถเข้าใจโค้ดในภาษาที่ไม่คุ้นเคยได้ดีเพียงใด [ปิด]


15

มีการศึกษาอย่างจริงจังหรือไม่ว่าโปรแกรมเมอร์ที่มีประสบการณ์และรู้ภาษา X สามารถเข้าใจโค้ดที่เขียนโดยโปรแกรมเมอร์ที่มีความสามารถโดยใช้ภาษา Y สำหรับภาษาที่มีการใช้กันอย่างแพร่หลายเช่น X และ Y หรือไม่?

แน่นอนว่าโลกแห่งความเป็นจริงไม่ใช่เรื่องง่ายนักเนื่องจากโปรแกรมเมอร์รู้เพียงภาษาเดียว สิ่งที่เราอยากรู้คือ: ถ้าเราทำโครงการของเราพูด C # และสักวันหนึ่งนักฟิสิกส์บางคนที่รู้เพียงฟอร์แทรนและอัลกอลมองไปที่มันจะเหมาะสมกับพวกเขามากแค่ไหน? ส่วนทางคณิตศาสตร์ของมันอาจอ่านได้ดีสำหรับพวกเขาหากพวกเขาไม่สนใจสิ่งที่พวกเขาเป็นเครื่องหมายวรรคตอนแบบสุ่ม - ish หรือผู้เชี่ยวชาญ Python จะสามารถหาข้อบกพร่องในสคริปต์ Ruby ที่ฉลาดของฉันได้หรือไม่

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

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


1
ฉันไม่รู้ว่ามีการศึกษาใด ๆ หรือไม่ แต่จากประสบการณ์ส่วนตัวของฉันฉันบอกว่าใช่ฉันสามารถเข้าใจโปรแกรมโดยไม่ทราบภาษา
superM

2
สิ่งนี้จะขึ้นอยู่กับคู่ภาษา: เลือก C # เทียบกับ Java - และคุณจะได้รับความคุ้นเคยทันที เลือก Algol vs. C - แล้วคุณจะคุ้นเคยกับสูตรชีทหน้าเดียว ขอให้โชคดีในการเลือก C vs. Prolog หรือ Whitespace vs. Ada - มันน่าหงุดหงิด ภาษาไม่ได้เป็นเพียงสิ่งเดียวที่ทำความเข้าใจกับโปรแกรม: ผู้เชี่ยวชาญ C ที่เชี่ยวชาญในการออกแบบฝังตัวพยายามที่จะเข้าใจรหัส MFC ที่เขียนใน C เป็นภาพที่ค่อนข้างเสียใจ (นี่เป็นประสบการณ์มือแรก)
dasblinkenlight

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

คำตอบ:


9

เห็นได้ชัดว่ามันขึ้นอยู่กับระดับความสัมพันธ์ระหว่างภาษากับแต่ละอื่น ๆ ตัวอย่างเช่นหากคุณมีพื้นหลัง C หรือ C ++ และได้เขียนโปรแกรม C # หรือ Java บางอย่างแล้วคุณควรอ่านและเข้าใจภาษาอื่น ๆ ของสองภาษานั้น ๆ (Java หรือ C #) หากคุณรู้จัก Lisp อย่างดีโครงการก็ไม่น่าจะมีปัญหาอะไรมาก ฉันเคย debugged โปรแกรม PHP โดยไม่ต้องมีความรู้เกี่ยวกับ PHP เพียงแค่มีความรู้จาก C, C ++ และ Perl ฉันค่อนข้างแน่ใจว่าเมื่อใดที่โปรแกรมนั้นจะถูกเขียนใน Haskell หรือ Smalltalk ซึ่งจะยากยิ่งกว่าสิ่งอื่นที่เป็นไปไม่ได้สำหรับฉัน

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

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

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


6

ไม่แน่ใจเกี่ยวกับการอ้างอิงการศึกษาที่ดำเนินการทางวิชาการ แต่การตั้งชื่อวิธีการเรียนและฟังก์ชั่นในภาษา C # / C ++ / Java / Python หรืออื่น ๆ ที่อธิบายได้ด้วยตนเองควรช่วยให้เข้าใจพื้นฐานของโค้ดได้ง่าย

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

แนวทางการตั้งชื่อที่ใช้ใน. NET Framework และการตั้งชื่อทั่วไปที่ใช้ใน. NET เป็นการอ้างอิงที่ดีในการมองเช่นกัน


การออกแบบ API ที่ดีและอนุสัญญาการตั้งชื่อช่วย แต่แม้อนุสัญญาการตั้งชื่อตามภาษามักจะ 'ดื้อดึง' ในวิธีที่ใช้เฉพาะกับภาษานั้น ข้าง C # / Java (ซึ่งเกือบจะเหมือนกัน) ภาษาส่วนใหญ่ทำงานในหลักการที่แตกต่างกันซึ่งมีเวิร์กโฟลว์และการใช้งานเฉพาะสำหรับภาษานั้น ตัวอย่างเช่นในภาษาที่ไม่เป็นไปตามโมเดลเฟรมเวิร์กหลักขนาดใหญ่คุณจะพบกับระบบนิเวศขนาดใหญ่ของแพ็คเกจที่รวมเข้าด้วยกันโดยใช้ตัวจัดการแพคเกจทั่วไป
Evan Plaice

3

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

โดยส่วนตัวฉันพบคำถามที่เกี่ยวข้องน่าสนใจยิ่งขึ้น: เมื่อมีข้อผิดพลาดในโค้ด (เช่นโปรแกรมเมอร์ X คิดว่าเขาเขียนsomeFunction(x, y)แต่เขาเขียนอย่างอื่นจริงๆ) มันยากแค่ไหนสำหรับนักพัฒนาที่สองที่จะระบุข้อผิดพลาด โปรแกรมเมอร์ X ที่ดีจะทำให้เห็นได้อย่างชัดเจนว่าเขาต้องการให้คอมพิวเตอร์ทำอะไรและมันจะอ่านง่าย อย่างไรก็ตามถ้าเขาทำผิดพลาดมันอาจเป็นเรื่องใหญ่ สิ่งที่ต้องการบั๊ก C ++ ต่อไปนี้:

int x = getCorrectValueForX();
if (x = 2)
   doSomethingWhenXIsTwo();

อาจเป็นเรื่องยากที่จะตรวจพบโดยเฉพาะอย่างยิ่งเว้นแต่คุณจะรู้ภาษา


1

มันไม่เพียง แต่ขึ้นอยู่กับโปรแกรมเมอร์เช่นเดียวกับที่คนอื่นพูด แต่ยังขึ้นอยู่กับความคล้ายคลึงกันระหว่างภาษาทั้งในด้านไวยากรณ์ปรัชญาและการนำไปใช้

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

ถ้าคุณเรียนรู้ C ฉันคิดว่ามันสมเหตุสมผลที่จะคาดหวังว่าคุณจะได้รับโฟลว์ควบคุมจาก C #, Java หรือ C ++ เป็นต้นมันจะยากกว่าในการถอดรหัส VB ​​เพราะความแตกต่างของไวยากรณ์หรือ JavaScript เนื่องจากการปิด, การพิมพ์ที่อ่อนแอและฟังก์ชั่นการสั่งซื้อที่สูงขึ้น (ฉันรู้ว่าคุณสามารถทำสิ่งนี้ได้ใน C แต่มันไม่ค่อยจะวุ่นวาย) ฉันจะไม่คาดหวังว่าคุณจะสามารถแก้ไขข้อบกพร่อง Lisp, F #, R หรือพระเจ้าห้ามประกอบเพราะสิ่งเหล่านี้ใช้กระบวนทัศน์การเขียนโปรแกรมที่แตกต่างอย่างสิ้นเชิง

TL; DR ไม่เพียงมีความสำคัญในการจดจำไวยากรณ์ส่วนใหญ่เวลาที่คุณสามารถถอดรหัสการประกาศหรือการเรียกใช้เมธอด แต่การที่จะสามารถเข้าใจเหตุผลที่อยู่เบื้องหลังว่าทำไมโปรแกรมที่ถูกเขียนขึ้นมานั้น .

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