เกณฑ์การเลือกภาษาสำหรับหลักสูตรการเขียนโปรแกรมครั้งแรก


35

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

คำถามของฉันคือ:

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

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


คำถามนี้ได้รับแรงบันดาลใจจากคำถามอื่นซึ่งถือว่านอกหัวข้อ: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language


1
เธรดที่เปิดขึ้นเกี่ยวกับว่าคำถามนี้อยู่ในหรือนอกหัวข้อ: meta.cs.stackexchange.com/questions/362/…
เดฟคลาร์ก

7
<คว้าข้าวโพดคั่ว> เพื่อถอดความOtto Neugebauer : ไม่มีภาษาโปรแกรมแรกที่มนุษย์รู้จักที่สามารถทำลายทุกคน
JeffE

3
@Raphael: ผมคิดว่าการตอบสนองของ Dijkstra มีแนวโน้มที่จะเป็น " ทุกภาษาโปรแกรมแรกที่รู้จักกันคนมีความสามารถในการทำลายทุกคน."
JeffE

2
@ edA-qamort-ora-y ใช่แล้วพวกเขาควรจะได้สัมผัสกับกระบวนทัศน์การเขียนโปรแกรมหลายอย่าง ไม่นั่นไม่สามารถทำได้ในหลักสูตรแรก
vonbrand

3
เรามีSMLเพียงเพราะไม่น่าที่นักเรียนคนใดรู้ภาษานั้นมาก่อน ความสมดุลนี้นักเรียนทุกคนมากหรือน้อยในระดับเดียวกันเพื่อเริ่มหลักสูตร
Markus Malkusch

คำตอบ:


14

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

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

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

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

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

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

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

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

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

อีกครั้งภาษาที่เหมาะกับรายการนี้ขึ้นอยู่กับว่าคุณพยายามสอนอะไร!


4
มีการแยกการออกแบบวงจรระหว่าง VHDL และ Verilog
avakar

@avakar: อ๊ะอึ ฉันจะแก้ไขสิ่งนี้ในคำตอบของฉันขอบคุณสำหรับการชี้ให้เห็น!
Pedro

อ่าอ่านเรื่องนี้และคิดว่ามันเป็นหนึ่งในอาจารย์ของฉัน +1 สำหรับ Oberon ตราบใดที่มีการเปิดใช้งานสวิตช์คำหลักตัวพิมพ์เล็กโดยอัตโนมัติ เจ็บปวดเหลือเกินที่จะเขียนWHILE expr DO stmts ENDฯลฯ
Callum Rogers

3
+1 สำหรับ "เป้าหมายของหลักสูตรของคุณคืออะไร" และหมายเหตุเพิ่มเติมหนึ่งในเป้าหมายที่พบบ่อยที่สุดแม้ว่าจะไม่ได้สะกดก็คือการให้ข้อมูลพื้นฐานสำหรับสิ่งอื่น ๆ (หลักสูตรและการฝึกงาน) ซึ่งมีการเขียนโปรแกรมเป็นสิ่งที่จำเป็นต้องมี
AProgrammer

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

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

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

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


คุณสามารถเริ่มต้นด้วยชุดย่อยอย่างง่าย ๆ พูดว่า Java เป็นคนแรกที่จะแสดงรูปแบบขั้นตอน จากนั้นคุณเปิดกล่องแพนดอร่าและแสดงให้เห็นว่าหน้าตาเหมือนกันกับ OOP
ราฟาเอล

3
@Raphael: มันเป็นไปไม่ได้ที่จะหลีกเลี่ยงpublic static void main()ใน Java ซึ่งจะต้องอยู่ในบริบทของบางคลาส สิ่งนี้ทำให้ Java น้อยกว่าอุดมคติในฐานะภาษาแรก แต่แน่นอนว่าสิ่งกีดขวางนั้นไม่ดีเกินไป
Dave Clarke

IDE ที่ดีสามารถเลื่อนเวลาได้public static void main()เป็นเวลานาน BlueJ เป็นตัวอย่างที่ดีของ IDE ที่ช่วยให้นักเรียนสามารถเขียนโปรแกรมโดยไม่ต้องใช้mainที่ใดก็ได้ในนั้น
Barry Brown

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

11

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

ฉันไม่เห็นด้วยกับแนวคิดของ @ Kaveh ว่าความเกี่ยวข้องของอุตสาหกรรมนั้นสำคัญ อาจเป็นโบนัส แต่มีความสำคัญเล็กน้อยที่นี่ ด้วยรากฐานที่มั่นคงในหลักการ CS การเรียนรู้ภาษา "อุตสาหกรรม" ในหลักสูตรต่อมาจะค่อนข้างง่าย

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


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

@Kaveh: ฟังดูเหมือนหลักสูตรของมหาวิทยาลัยเทคนิคสำหรับฉัน
Raphael

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

3
@Kaveh: ภาษาที่ออกแบบมาสำหรับการทำสิ่งต่าง ๆ ในโลกแห่งความเป็นจริงไม่จำเป็นต้องเหมาะสมที่สุดสำหรับแนวคิดการสอนหรือการพัฒนาทักษะ เป้าหมายแตกต่างกันมาก
JeffE

1
@Kaveh: ฉันไม่เคยเขียนว่าความรู้เกี่ยวกับภาษาที่ใช้ในอุตสาหกรรมมีความสำคัญ สิ่งที่ฉันหมายถึงคือการใช้ภาษาการเขียนโปรแกรมแรกที่แข็งแกร่งหลักสูตรต่อมาจะไม่มีปัญหาในการสอนนักเรียนเกี่ยวกับสิ่งที่พวกเขาจะทำจริง ๆ เมื่อพวกเขาสำเร็จการศึกษา เป็นส่วนหนึ่งของการสอนหลักสูตรเบื้องต้นหลายหลักสูตรด้วยตนเอง (ในฐานะ TA) ฉันจะบอกว่าทักษะที่คุณเรียนรู้ไม่มีอะไรที่เหมือนกับวิชาที่ต้องการในอุตสาหกรรม (มีเวลาน้อยเกินไปสำหรับเรื่องนั้น) หากเป็นกรณีนี้ฉันคิดว่ามันดีกว่าที่จะให้แนวคิดที่ดีแก่พวกเขาเพื่อให้พวกเขาสามารถเป็นโปรแกรมเมอร์ที่ดีขึ้นไม่ใช่แค่ $ LANGUAGE-โปรแกรมเมอร์
evilcandybag

8

ข้อกังวลหลักของฉันคือความเป็นสากลในแง่ที่ว่าการเรียนรู้ภาษาโปรแกรมนี้ควรทำให้นักเรียนสามารถจัดการภาษาการเขียนโปรแกรมส่วนใหญ่ได้

เท่าที่ฉันเสียใจเกณฑ์นี้ไม่รวมภาษาที่ใช้งานได้จริง นอกจากนี้ยังใช้กับหลักสูตรที่ไม่ควรใช้คุณสมบัติที่แปลกใหม่ของภาษา

... แต่นี่เป็นเพียงสามัญสำนึก


1
ด้วยพระใน Haskell มีหลักฐานว่าเกณฑ์นี้ไม่สามารถใช้กับภาษาที่ใช้งานได้จริงอีกต่อไป
Dave Clarke

@DaveClarke: monads เป็นวิธีที่ดีมากในการทำสิ่งที่ไม่ทำงาน แต่มันมีความเสี่ยงหรือไม่ที่จะเรียนรู้สิ่งนี้เป็นครั้งแรกด้วยค่าใช้จ่าย monad แทนที่จะเป็นโดยตรง (อาจไม่ใช่ฉันไม่รู้!)
jmad

2
@jdam: คุณอาจจะพูดถูก ปัญหาไม่ได้อยู่ใน monads ต่อ se แต่ในทั่วไปและความยากลำบากในการนำเสนอข้อความผิดพลาดที่ดีให้โปรแกรมเมอร์ Heliumรุ่น Haskell แก้ไขปัญหาเหล่านี้และใช้กับนักเรียนปีแรกได้สำเร็จ
Dave Clarke

@DaveClarke: ว้าวฉันไม่ได้ยินเลย เยี่ยมมาก! น่าเสียดายในขณะที่มันมีประโยชน์มากสำหรับการเรียนรู้ Haskell แต่ไม่ได้แก้ปัญหาที่อาจไม่ช่วยให้เรียนรู้ภาษาอื่น
jmad

4
@Ben: ความรู้สึกของฉันคือการจัดการหน่วยความจำด้วยตนเองเป็นสิ่งที่เฉพาะเจาะจงในบางภาษาในปัจจุบัน (และคุณเรียนรู้ในกรณีเฉพาะเหล่านี้) มากกว่าสิ่งพื้นฐานของการเขียนโปรแกรม หากคุณไม่เห็นด้วยกับสิ่งนั้นฉันคิดว่ามันจะชี้ไปที่ C (หรือ C ++)
jmad

8

เมื่อเลือกภาษาการเขียนโปรแกรมแรกมีปัญหามากมายที่ต้องพิจารณา หลายสิ่งเหล่านี้ได้รับการพิจารณาในคำตอบข้างต้น ฉันเพิ่มอีก 3 รายการเนื่องจากเป็นส่วนหนึ่งของคำตอบของฉันสำหรับคำถามที่ปิด ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ) ซึ่งเดิมเป็นแรงบันดาลใจให้กับคำถามนี้ . ฉันได้คัดลอกคำตอบของฉันที่นี่ (และแก้ไขแล้ว) ตามนโยบายปัจจุบันของการลบคำถามที่ปิด

ต่อไปนี้เป็น 3 จุดที่ควรพิจารณาโดยใช้ภาษาการเขียนโปรแกรมไม่กี่ตัวอย่าง

การเขียนโปรแกรมในขนาดใหญ่เทียบกับการเขียนโปรแกรมในขนาดเล็ก

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

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

โดยการเขียนโปรแกรมในขนาดใหญ่ฉันหมายถึงการเขียนโปรแกรมขนาดใหญ่ที่สร้างจากส่วนประกอบ / คลาสจำนวนมากซึ่งสร้างอยู่ด้านบนของ API ด้วย GUI ฐานข้อมูลซึ่งอาจอยู่ในการกำหนดค่าไคลเอนต์ - เซิร์ฟเวอร์

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

ภาษาการเขียนโปรแกรมเช่น C ++ มีคุณสมบัติมากมายที่จะช่วยในการเขียนโปรแกรมขนาดใหญ่ แต่มันยากที่จะนั่งลงและเริ่มเขียนโปรแกรมที่ง่ายมาก Java คล้ายกัน

ในทางกลับกันภาษาเช่น Python, Ruby, Scheme หรือ Haskell ทำให้การเขียนโปรแกรมโดยตรงง่ายขึ้นมาก

ระดับสูง vs ระดับต่ำ

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

ภาษาระดับสูงกว่าเช่น Python ช่วยให้แสดงแนวคิดได้ง่ายขึ้นในแง่ของโดเมนปัญหา

Staticallly Typed vs Dynamically Typed

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

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

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

คนอื่น ๆ

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


เห็นด้วยอย่างเต็มที่
vonbrand

1
ฉันมีการตั้งค่าของฉันเองเกี่ยวกับการโต้แย้ง "ประเภทคงที่เทียบกับแบบไดนามิก" อย่างไรก็ตามในโปรแกรม CS ทั่วไปตราบใดที่ทั้งสองได้รับการสอนเป็นบางจุดฉันเชื่อว่าคำสั่งไม่สำคัญมากนัก หากมีการนำเสนอเหรียญเพียงด้านเดียวนั่นเป็นปัญหาใหญ่สำหรับฉัน
Chi

8

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

แต่ตอนนี้สำหรับเกณฑ์โดยพลการ

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

ความร่ำรวย : ภาษาต้องสมบูรณ์เพียงพอสำหรับแนวคิดทั้งหมดที่คุณต้องการสอน ตัวอย่างเช่นหากคุณต้องการพูดคุยเกี่ยวกับฟังก์ชั่นที่มีลำดับสูงกว่าคุณต้องใช้ภาษาที่ฟังก์ชั่นเป็นค่าเช่นภาษาที่ใช้งานได้หรือ Scala

การขยายขีดความสามารถ : โอกาสที่นักเรียนของคุณจะไม่ได้เรียนรู้ภาษาด้วยตนเองมากกว่าที่คุณแสดงให้พวกเขาเห็น ดังนั้นคุณต้องการภาษาที่คุณเลือกเพื่อขยายขอบเขตการเรียน: พวกเขาต้องเขียนแบบฝึกหัดสัตว์เลี้ยงของคุณตอนนี้ แต่อาจโจมตีโครงการขนาดกลางในภายหลัง Java และภาษาที่มี Ecosphere คล้ายกันเป็นตัวเลือกที่ดีที่นี่

การสนับสนุนเครื่องมือ : สิ่งนี้เกี่ยวข้องกับความสามารถในการขยาย หากคุณคาดหวัง / ต้องการให้นักเรียนของคุณมีประสิทธิผลในการใช้ภาษาดังนั้น IDEs ที่ดีต้องมีผู้จัดการและห้องสมุดที่มีอยู่ กระสุนอินเทอร์แอคทีฟ (Ruby, Scala) ก็เป็นสิ่งที่ดีเช่นกันโดยเฉพาะสำหรับ starters เครื่องมือต้องทำงานบนแพลตฟอร์มหลักทั้งหมดด้วย

เอกสาร : คุณอาจไม่ต้องการสอนภาษา แต่ให้นักเรียนสอนตัวเองด้วยคำแนะนำ (นามธรรม) ของคุณ ดังนั้นเอกสารที่ดีจึงเป็นสิ่งสำคัญ เนื้อหาที่เป็นที่นิยมและสร้างภาษาก็คือเอกสารที่ดีกว่า ตัวอย่างเช่นเอกสารประกอบของ Scala ค่อนข้างยากจน (แต่ปรับปรุง) เครื่องมืออย่างHoogleนั้นเป็นข้อดี

ความพร้อมใช้งาน : มีผู้สอนที่ใช้ Matlab หรือ Visual C ++ พิจารณาว่าไม่ใช่ทุกคนที่อาจมีใบอนุญาตหรือเครื่องที่สามารถเรียกใช้โปรแกรมที่จำเป็น คุณควรใช้ภาษาฟรีที่ทำงานบนแพลตฟอร์มที่หลากหลาย

ความสะอาด : คุณอาจต้องการกำหนดรูปแบบความคิดของนักเรียน ภาษาที่ยุ่งกว่าพวกเขาจะคิด; ฉันจะไม่เสนอ PHP ในหลักสูตร ภาษาไดนามิกโดยทั่วไปมีข้อเสียที่นี่: บางครั้งพวกเขาอนุญาตให้ส่งเสริมและนิสัยที่ไม่ดี

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


For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ... หรือ C หรือ Pascal ซึ่งทั้งคู่มีตัวชี้ฟังก์ชั่นอยู่ตลอดไป จริง ๆ แล้วภาษาหลักเท่านั้นที่จะปิดตัวลงคือ Java
Mason Wheeler

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

6

คำถามที่น่าสนใจ; ฉันชอบความสำคัญของคุณเกี่ยวกับเกณฑ์วัตถุประสงค์ เราต้องการน้องใหม่ที่จะเรียนรู้:

แนวคิดการเขียนโปรแกรม : ภาษาโปรแกรมแรกต้องรองรับ: การเรียกใช้ฟังก์ชันการวนซ้ำการเรียกซ้ำ

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

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

ความจริงที่ว่าไลบรารีที่มีการเขียนไว้ล่วงหน้านั้นมีอยู่สำหรับสิ่งต่าง ๆ เช่น sort () และวิธีใช้งาน - เช่นความจริงที่ว่าไม่จำเป็นต้องเขียนทุกอย่างตั้งแต่เริ่มต้น

เกณฑ์อื่น ๆ สำหรับภาษาแรก :

ตีความ (ข้อเสนอแนะอย่างรวดเร็วช่วยให้กระบวนการเรียนรู้)

สภาพแวดล้อมแบบโต้ตอบซึ่งความเร็วการเรียนรู้การทดสอบและการดีบัก

ซอร์สโค้ดคุณภาพสูงมีไว้ให้นักเรียนอ่านในภาษานั้น

"ง่ายต่อการอ่าน", "ไวยากรณ์ที่ใกล้เคียงกับภาษาธรรมชาติ" (เพื่อให้ง่ายต่อการอ่านและให้คะแนนซอร์สโค้ด)

พกพา (ทำงานบน Mac OS, Windows, Unix) มีการใช้ซอฟต์แวร์อย่างน้อยหนึ่งภาษาฟรี

รวดเร็วในการสอน "gotchas น้อย" - ตัวอย่างเช่น "[I] t อาจเร็วกว่าที่จะสอนผู้เริ่มต้น Python และ Java เป็นอันดับแรกแทนที่จะใช้ Java เป็น OOPL ตัวแรก" - "การเปรียบเทียบภาษาโปรแกรมเชิงวัตถุ" และกฎของTelescope

Matthias Felleisen ได้พัฒนาภาษาการเขียนโปรแกรมพร้อมข้อความแสดงข้อผิดพลาดที่เหมาะสำหรับผู้เริ่มต้น เขาเน้นว่าการเลือกใช้ภาษานั้นไม่สำคัญเท่ากับการสอนวิธีการออกแบบที่ดี ในความเป็นจริงเขาเห็นหลักสูตร CS แรกเป็นวิชาศิลปศาสตร์การสอนการคิดเชิงวิพากษ์การแก้ปัญหาและการใส่ใจในรายละเอียด

เกณฑ์สำหรับภาษาโปรแกรมที่สอง

สิ่งที่เราต้องการให้นักเรียนเรียนรู้ แต่อาจจะรอภาษาโปรแกรมที่สอง:

ภาษา "ที่เกี่ยวข้อง" ที่เป็น "ไม่ลึกลับเกินไป"; สิ่งที่ "เป็นที่นิยมในอุตสาหกรรม"

ทฤษฎีความซับซ้อน: วิธีการจดจำงานที่เป็นไปไม่ได้ด้วยเทคโนโลยีปัจจุบัน

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

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

แก้ไข: ฉันคิดว่ามันน่าผิดหวังที่โพสต์บทสรุปของบางสิ่งที่ฉันเขียนโดยความร่วมมือกับคนอื่น ๆ หลายคน "อาจไม่ใช่บทความทางกฎหมาย"

ดังนั้นฉันจึงเพิ่มการอ้างอิงที่เป็นทางการมากขึ้นในลิงก์ที่ไม่เป็นทางการก่อนหน้าของฉันพยายามที่จะปฏิบัติตามการใช้งานอย่างเป็นธรรมและปัญหาลิขสิทธิ์อื่น ๆ ของวิกิ

คำตอบนี้เป็นบทสรุปของภาษาแรกของน้อง (Anon 2011) ที่เก็บข้อมูลรูปแบบพอร์ตแลนด์

(อานนท์ 2011) นักเขียนนิรนามและอีกมากมายหลายคน "Freshmans ภาษาแรก" พื้นที่เก็บข้อมูลแบบพอร์ตแลนด์ วันที่ 27 กันยายน 2011 http://c2.com/cgi/wiki?FreshmansFirstLanguage


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

1
@Raphael แหล่งที่มาคือวิกิ (อาจมีผู้เขียนหลายคน) หากผู้แต่ง (ผู้ร่วมเขียนคนใดคนหนึ่ง) ของเนื้อหานี้ไม่ต้องการให้รวมไว้ที่นี่เขาควรส่งการแจ้งลบเนื้อหา DMCA ไปยัง [ที่อยู่ติดต่อที่ระบุไว้ที่ด้านล่างของหน้านี้] (mailto: team+cs@stackexchange.com) . นอกจากนี้ข้อมูลไม่ได้รับการคุ้มครองโดยลิขสิทธิ์เฉพาะวิธีการแสดงข้อมูลเท่านั้น การปรับเปลี่ยนเล็กน้อยและการลบ WordsRunTogetherWikiWikiStyle จะช่วยปรับปรุงคำตอบนี้และขจัดความเสี่ยงจากการละเมิดลิขสิทธิ์
Gilles 'หยุดความชั่วร้าย'

1
+ คำตอบที่ดี แต่ฉันมีนิดหน่อยที่จะเลือก - โปรไฟล์ ไม่มีทฤษฎีอยู่เบื้องหลังพวกเขา - เพียงแค่ "ความรู้ทั่วไป" โดยทั่วไปไม่ได้ชื่นชมในหมู่นักวิชาการว่ามีปัญหามากมายที่พวกเขาไม่พบและเทคนิคอื่นก็ทำได้ ตรวจสอบลิงค์นี้
Mike Dunlavey

5

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

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

เกณฑ์ที่สามจะเป็นหลักสูตรที่นักเรียนจะเข้าเรียนในปีต่อ ๆ ไป หลักสูตรโดยเฉพาะอย่างยิ่งหลักสูตรที่ต้องการไม่ได้ออกแบบมาเอง แต่เป็นการประสานงานกับหลักสูตรอื่น

สุดท้ายที่ฉันนึกได้ตอนนี้ก็เหมือนกับคำตอบของ jmad ภาษาควรให้ความสะดวกในการเรียนรู้ภาษาสำคัญอื่น ๆ มันควรจะรวยพอที่จะหยิบภาษาที่สำคัญขึ้นมาได้ง่าย (ที่นี่หมายถึงความสำคัญสำคัญจากมุมมองของนักเรียน)

ฉันคิดว่ามหาวิทยาลัยหลายแห่งเปลี่ยนการแนะนำหลักของพวกเขาเป็นหลักสูตรการเขียนโปรแกรมจาก Java / C ++ / C เป็น Python แม้ว่าพวกเขาอาจให้การแนะนำการเขียนโปรแกรมในภาษาอื่น ๆ เป็นครั้งคราว (มักจะเป็นวิชาเอกที่ไม่ใช่วิทยาการคอมพิวเตอร์เช่น C สำหรับวิชาเอก แม้ว่าพวกเขาอาจแสดงความยืดหยุ่นหากผู้สอนต้องการทดลองสอนภาษาอื่นเป็นระยะ ๆ


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

1
@Ben: ประโยชน์ในอุตสาหกรรมมีความสำคัญเป็นพิเศษหากนักเรียนไม่ได้ไปเรียนวิชาเอกใน CS ที่ฉันมาจากคนจำนวนมากไปทำงานด้านชีววิทยาหรือวิทยาศาสตร์อื่น ๆ และเนื่องจากพวกเขาไม่มีเวลาเรียนรู้หลายภาษาการเรียนรู้สิ่งที่พบได้ทั่วไปในระบบนิเวศของพวกเขาเช่น Python น่าจะมีประโยชน์มากกว่า ML, Java หรือ C.
hugomg

1
การพูดในฐานะคนจากอุตสาหกรรม (อุตสาหกรรมหนึ่งโดยเฉพาะไม่จำเป็นต้องเป็นตัวแทน) ฉันไม่คิดว่าความเกี่ยวข้องของอุตสาหกรรมเป็นปัจจัยเมื่อพูดถึงโปรแกรมเมอร์ระดับ 1 ในอนาคต การสัมผัสกับกระบวนทัศน์หลายอย่างทำให้โปรแกรมเมอร์ดีขึ้นแม้ว่าในโดเมนของฉัน (การเขียนโปรแกรมแบบฝัง) ส่วนใหญ่เราใช้ C. รายละเอียดของภาษาสามารถเรียนรู้ด้วยตนเอง แต่แนวคิดทั่วไปได้รับการสอนที่ดีขึ้นในโรงเรียน สำหรับโปรแกรมเมอร์ที่ไม่ได้ตั้งใจ (เช่นนักวิทยาศาสตร์) ลำดับความสำคัญแตกต่างกัน - แต่การเน้นที่ฟอร์แทรนมากเกินไปอาจทำให้ผู้คนไม่สนใจ Numpy เมื่อนั่นคือสิ่งที่พวกเขาควรใช้
Gilles 'หยุดความชั่วร้าย' ใน

5

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

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

แม้ว่าบทความอื่น ๆ เหล่านี้จะเสนอเกณฑ์ที่ยอดเยี่ยม แต่ฉันต้องการใช้ภาษาใดภาษาหนึ่งเพื่อแสดงให้เห็นว่า 'ประชุมตามเกณฑ์' เป็นอย่างไร

บางส่วนของความกังวลเหล่านี้ได้รับการแก้ไข (ดีกว่าฉันจะพยายามที่จะ) ในบล็อกโพสต์โจ Spolsky ของมีดหมอ JavaSchools การเลือกภาษาเช่น Java หรือ Python จะปิดผ่านสองแนวคิด (และสำคัญที่สุด) ที่ยากขึ้นใน CS; คือตัวชี้และการเรียกซ้ำ

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

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

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

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

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

อย่างไรก็ตามให้เหตุผลว่า Ruby เป็นภาษาเกริ่นนำ ...

  • Ruby แม้ว่าจะไม่ได้รับการปรับให้เหมาะกับการโทรหาง ดังนั้นมีที่
  • ทับทิมเป็นกระบวนทัศน์ที่หลากหลาย แม้ว่ามันจะเป็นภาษาเชิงวัตถุล้วนๆ แต่ก็ยังรวบรวมการเขียนโปรแกรมที่ใช้งานได้รวมถึงการฝึกฝนล้อที่ได้รับการฝึกฝนมาจากภาษา C เปรียบเทียบสิ่งนี้กับ Python ซึ่งเป็นภาษาเชิงโพรซีเดอร์ที่มี OO แบบ tacked-on บางตัว (แม้ว่าสลักเกลียวกำลังแสดงอยู่) และองค์ประกอบการทำงานบางอย่าง (ซึ่ง BDFL ของ Python พยายามซ้ำ ๆ )
  • CRuby (aka MRI หรือ 'Ruby Classic') เขียนและขยายเป็น C คุณสามารถสอนนักเรียนเกี่ยวกับพอยน์เตอร์การจัดการหน่วยความจำและเทพเจ้าที่น่ากลัวmalloc()โดยสอนให้พวกเขาขยายภาษาใน C
  • แม้จะคิดว่าเป็นภาษาแบบไดนามิกระดับสูงคุณสามารถสอนโครงสร้างข้อมูลประเภทและอื่น ๆ ได้มากมาย มีห้องสมุด (อัญมณี) สำหรับทุกสิ่งที่คุณสามารถจินตนาการได้จากต้นไม้สีแดงดำไปจนถึงการทำสิ่งแปลก ๆ ด้วยการพิมพ์เป็ด

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

อย่างไรก็ตาม ... นั่นคือ US $ .02 ฉันไม่ได้พยายามเกลี้ยกล่อมให้คุณใช้ Ruby, ใจคุณ ... เพียงแค่ใช้มันเป็นแบบอย่างของคุณสมบัติที่จะมองหาในภาษาสำหรับการสอนหลักสูตรเบื้องต้น


2
"ฉันเชื่อมั่นอย่างยิ่งว่า Python เป็นพื้นฐานใหม่" - คัดลอกมา "สองแนวคิดที่ยากขึ้น (และสำคัญที่สุด) ใน CS; คือพอยน์เตอร์และการเรียกซ้ำ" - ฉันไม่เคยเรียนภาษาที่เกี่ยวข้องกับพอยน์เตอร์อย่างชัดเจนและฉันไม่เคยพลาดอะไรเลย เมื่อฉันเรียนรู้วิธีการทำงานของคอมไพเลอร์พอยน์เตอร์ที่อธิบายได้เร็วพอ
Raphael

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

3
ฉันยังเชื่อว่า Python เป็นพื้นฐานใหม่ แต่ทำไมการโต้แย้งกับ Python
JeffE

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

1
@DaveClarke: มันเยื้องกับช่องว่างซึ่งมากกว่าที่ทำขึ้นสำหรับผู้ที่
ราฟาเอล

5

ภาษาโปรแกรมแรกของฉันคือภาษาแอสเซมบลีของเล่น ประการที่สองคือ Fortran ในระหว่างนั้นฉันได้รับการสอนสัญกรณ์ "อัลกอริทึม" ซึ่งเป็น Algol 60 โดยประมาณฉันเปิดออกค่อนข้างโอเค ในความเป็นจริงฉันคิดว่าสิ่งที่ฉันสอนนั้นสมบูรณ์แบบมาก

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

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

ภาษาโปรแกรมแรกที่ดีที่สุดควรเป็นสิ่งที่ง่ายที่สุดและชัดเจนที่สุดเท่าที่จะเป็นไปได้เพื่อให้นักเรียนสามารถมุ่งเน้นไปที่การคิดอย่างชัดเจน น่าเสียดายที่ความเรียบง่ายและชัดเจนของการประกอบ Fortran และ Algol 60 นั้นไม่มีที่ใดเทียบได้กับภาษาโปรแกรมที่ทันสมัยที่สุด Haskell เป็นข้อยกเว้นที่ดี แต่ Haskell จะทำให้ภาษาโปรแกรมที่สองในอุดมคติของฉันไม่ใช่ภาษาแรก Eiffel หรือ Oberon อาจจะพอดีกับใบเสร็จ


5

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

เราชอบด้วยเหตุผลเหล่านี้

  1. Python ไม่ใช่ภาษาที่มีรูปแบบอิสระ มันบังคับให้นักเรียนเขียนโค้ดในบล็อกโดยใช้การเยื้อง (ในฐานะที่เป็นบันทึกด้านเทคนิคเราใช้โปรแกรมแก้ไขข้อความเป็นกลุ่มและใส่ [ set tabstop=4 set et] ใน. vimrc เพื่อกำจัดปัญหาที่น่ารำคาญและเพื่อให้การเยื้องรหัสเป็นที่สังเกตได้ แต่ไม่ทำให้เกิดแนวดิ่งที่น่าเกลียดเกินไป) นักเรียนของเราคุ้นเคยกับการเห็นโครงสร้างลำดับชั้นของโปรแกรมที่คั่นด้วยช่องว่าง เป็นผลให้นิสัยการจัดรูปแบบของพวกเขามีแนวโน้มที่จะดีมากเมื่อพวกเขาเขียนโปรแกรมในภาษาอื่น ๆ

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

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

  4. Python เป็นเครื่องมือที่นักเรียนมักใหญ่ใฝ่สูงไม่เจริญ มันมีห้องสมุดที่ซับซ้อนที่โฮสต์ของสิ่งที่มีประโยชน์ เป็นเครื่องมือสร้างสรรค์ที่ทรงพลังที่ผู้เริ่มต้นสามารถเข้าถึงได้

  5. Python นั้นฟรีและรันบนแพลตฟอร์มหลักทั้งหมด โรงเรียนของเราเป็นสภาพแวดล้อมระบบปฏิบัติการที่แตกต่างพร้อมเครื่องทุกประเภท เราไม่ต้องกังวลกับอาการปวดหัวเช่นปัญหาความเข้ากันได้ มันจะทำงานบนคอมพิวเตอร์ทุกเครื่อง

  6. Python มีเอกสารที่ยอดเยี่ยม เราสนับสนุนให้นักเรียนของเราสำรวจคนจรจัดและสีนอกเส้น พวกเขาเรียนรู้เกี่ยวกับการใช้เอกสาร Python ในช่วงต้นและมักจะจบลงด้วยการสำรวจสิ่งดีๆนอกห้องเรียน

เรายินดีเป็นอย่างยิ่งกับงูหลาม


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

ไม่ได้มีคำสั่งซื้อเฉพาะ มันเป็น "และ"
ncmathsadist

3

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

(คำตอบที่โยกย้ายจากhttps://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ )


1

TL; DR:ไม่มีทางที่จะไม่มีอคติตอบคำถามนี้เพราะไม่มีวัตถุประสงค์พื้นฐานสำหรับเกณฑ์ที่อยู่เบื้องหลังมัน มันเหมือนกับพลเป็นความพยายามที่จะอภิปรายถ้าสีฟ้ามีอคติเป็น "ดีกว่า" สีแดงกว่าหรือถ้าวานิลลาไอศครีมอคติ "รสชาติ" กว่าช็อคโกแลต


ฉันคิดว่ามีโพสต์ที่ยอดเยี่ยมอยู่แล้ว แต่ฉันจะเพิ่ม 2 เซนต์ของฉันเอง

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

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

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

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

สิ่งนี้นำไปสู่คำถามถัดไป

เกณฑ์สำหรับเกณฑ์เหล่านี้คืออะไร

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

ตัวอย่างเช่นทำไมไม่

  • ประสิทธิภาพ:เวลาดำเนินการและหน่วยความจำรอยเท้าสามารถวัดได้จริง
  • ขนาด:จำนวนคำสงวนน้อยที่สุดที่เป็นไปได้จะทำให้ภาษาเรียนรู้ได้ง่ายขึ้น
  • ชุดคุณลักษณะ:ชุดคุณสมบัติที่รองรับที่กว้างขึ้น (เช่น lambdas, generics, การวางแนววัตถุ, การบรรทุกเกินพิกัดเป็นต้น) จะช่วยให้คุณสามารถสอนแนวคิดเพิ่มเติมโดยไม่ต้องสลับภาษาและกลับไปที่ตารางที่หนึ่ง
  • ความสามารถในการทำงานร่วมกัน:ภาษาที่ทำให้ง่ายต่อการทำงานกับภาษาอื่นและระบบดั้งเดิม (เช่น Win32 API จาก C # หรือ Python ฯลฯ ) สามารถยกระดับเป็นการลงทุนระยะยาวที่ดีกว่าเป็นต้น

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

สรุปได้ว่าไม่มีเกณฑ์ที่เป็นวัตถุประสงค์สำหรับเกณฑ์ มันเหมือนกับพลเป็นความพยายามที่จะอภิปรายถ้าสีฟ้ามีอคติเป็น "ดีกว่า" สีแดงกว่าหรือถ้าไอศครีมวานิลลาเป็นอคติรสชาติกว่าช็อคโกแลต

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

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