ข้อดีและข้อเสียของการเรียนรู้การเขียนโปรแกรมเชิงหน้าที่ก่อนกระบวนทัศน์อื่นคืออะไร
ข้อดีและข้อเสียของการเรียนรู้การเขียนโปรแกรมเชิงหน้าที่ก่อนกระบวนทัศน์อื่นคืออะไร
คำตอบ:
ปัญหาที่สำคัญอย่างหนึ่งก็คือถ้าคุณเริ่มต้นด้วยภาษาอย่าง Haskell ทุกอย่างจะดูไม่ถึงขนาด
สุจริตฉันคิดว่าเริ่มต้นด้วยภาษาเช่น Haskell หรือรูปแบบจะเป็นความคิดที่ดี
(ฉันยอมรับว่าฉันเป็นคนติดภาษาที่ใช้งานได้) แก้ไข:
ตกลงสิ่งที่ฉันชอบเกี่ยวกับทั้งสองภาษา:
Schemeใช้ภาษาที่ง่ายมากและสร้างจากภาษาที่มีประสิทธิภาพสำหรับการพัฒนา นอกจากนี้ SICP ยังเขียนเกี่ยวกับรูปแบบที่ทำให้การเรียนรู้ที่นั่นคุ้ม โครงการเป็นเรื่องเกี่ยวกับสิ่งที่ง่ายที่สุดที่คุณสามารถจินตนาการได้ว่าอาจเป็นภาษาที่สมบูรณ์
Haskell สิ่งที่เพิ่มขึ้นอย่างแท้จริงสำหรับฉันคือระบบการพิมพ์ ข้อบกพร่องมากมายที่ฉันเห็นในภาษาอื่นเป็นเพราะการพิมพ์ผิดประเภทปรากฏขึ้นที่ใดที่หนึ่ง ใน Haskell นั้นแทบจะเป็นไปไม่ได้ ความคิดของภาษาสันหลังยาวก็มีบางสิ่งที่ยอดเยี่ยมหลุดออกมาจากมัน ตัวอย่างเช่นคุณสามารถสร้างโครงสร้างข้อมูลที่ไม่มีที่สิ้นสุดใน Haskell แล้วสร้างเฉพาะส่วนที่คุณต้องการ
ข้อได้เปรียบที่ใหญ่ที่สุดของการเรียนรู้ภาษาที่ใช้งานได้ก่อนเรียนรู้ OOP lang คือทักษะการเขียนโปรแกรมของคุณได้รับการพัฒนาก่อนแล้วคุณจะสามารถเข้าใจแนวคิด OOP ได้อย่างง่ายดาย หากคุณเริ่มต้นด้วยภาษา OOP คุณจะต้องเรียนรู้สองสิ่งพร้อมกัน: "คิดเกี่ยวกับรหัส" และ "คิดถึง OOD" มันสามารถทำให้เสียสมาธิ เริ่มฝึกภาษาที่ใช้งานได้และพัฒนาทักษะการเขียนโปรแกรมของคุณ จากนั้นเรียนรู้ OOP และกระบวนทัศน์อื่น ๆ เนื่องจาก OOP ถูกออกแบบมาเพื่อชดเชยการเขียนโปรแกรมเชิงโครงสร้างมันจะง่ายกว่าที่จะเข้าใจว่าทำไม นั่นคือเหตุผลที่หลักสูตร CS เริ่มต้นด้วย C จากนั้นไปที่ C ++
สำหรับคำถามเกี่ยวกับวิธีการเรียนรู้การเขียนโปรแกรมโดยเริ่มจากฟังก์ชั่นการเขียนโปรแกรมสองข้อแนะนำแบบคลาสสิก:
สิ่งแรกและที่เห็นได้ชัดคือโครงสร้างและการตีความแบบดั้งเดิมของโปรแกรมคอมพิวเตอร์โดย Abelson และ Sussman ซึ่งยังคงเป็นหนึ่งในการแนะนำ CS ที่ดีที่สุดที่นั่นและได้รับการสอนจากมุมมองการทำงานโดยใช้ Scheme มันมีอยู่ในออนไลน์เต็มรูปแบบ หากคุณไม่ได้เริ่มต้นที่นี่คุณควรมาที่นี่เป็นบางจุด
ข้อความล่าสุดที่ครอบคลุมพื้นที่ส่วนใหญ่ในระดับเดียวกันและเน้นไปที่วิศวกรรมซอฟต์แวร์คือวิธีการออกแบบโปรแกรมโดย Matthew Felleisen และกลุ่มอื่น ๆ จากทีม Racket / PLT ซึ่งใช้ภาษาของ Racket โครงการ มันยังออนไลน์เช่นเดียวกับความคืบหน้าในรุ่นที่สอง หนังสือเล่มนี้มีข้อได้เปรียบที่ออกแบบมาเพื่อใช้กับสภาพแวดล้อมการเขียนโปรแกรม DrRacket ซึ่งให้ส่วนต่อประสานที่เป็นมิตรมากสำหรับผู้เริ่มต้นและผู้เชี่ยวชาญในการทดลองใช้โค้ด
เกี่ยวกับคำถามของเหตุผลที่เริ่มต้นด้วยการเขียนโปรแกรมการทำงานผมอยากจะชี้ไปที่บล็อกบ๊อบฮาร์เปอร์ Carnegie Mellon เพิ่งปรับปรุงหลักสูตร CS ของพวกเขาเพื่อสอนการเขียนโปรแกรมการทำงานก่อนและ Harper ได้ครอบคลุมความคืบหน้าของพวกเขาระเบิดในบล็อกของเขา ในฐานะที่เป็นหนึ่งในผู้อยู่เบื้องหลังคำจำกัดความของ Standard ML เป็นที่ชัดเจนว่าเขาสำหรับการย้ายครั้งนี้และเขาได้ระบุเหตุผลที่ดี
ท้ายที่สุดฉันขอเตือนการเรียนรู้ Haskell ก่อน แต่คนอื่นอาจไม่เห็นด้วย ในขณะที่วิธีการที่บริสุทธิ์ของ Haskell ต่อ FP จะสร้างนิสัยที่ดีอย่างแน่นอน แต่การเน้นภาษาในการคำนวณแบบขี้เกียจไม่จำเป็นต้องเป็นการจับคู่ที่ดีสำหรับผู้เริ่มต้น หนึ่งในสิ่งแรกและสิ่งที่สำคัญที่สุดที่คุณจะต้องเรียนรู้ที่จะทำในฐานะโปรแกรมเมอร์คือการให้เหตุผลว่าโปรแกรมของคุณทำอะไรโดยดูจากแหล่งที่มา ฉันเป็นประสบการณ์ของฉันที่ความเกียจคร้านของ Haskell ทำให้ทั้งสองกิจกรรมเหล่านี้ค่อนข้างท้าทายสำหรับโปรแกรมเมอร์ที่มีประสบการณ์แม้ว่า Your Mileage May Vary
ข้อได้เปรียบหลัก (หรือไม่ใช่ข้อเสีย) ของการเริ่มต้นด้วย FP คือแนวคิดส่วนใหญ่สามารถนำไปใช้กับการเขียนโปรแกรมที่จำเป็นเช่นกัน Realm of Racketใช้วิดีโอเกมแบบอะนาล็อกเพื่อสอนทั้งแนวคิดเชิงหน้าที่และเชิงบังคับและนักเรียนที่อุทิศตนไม่เพียง แต่เป็นเกมใช้งาน (npi) เท่านั้น แต่ยังมีความเข้าใจเกี่ยวกับเงื่อนไขการวนซ้ำวนซ้ำ ADTs และการออกแบบที่ขับเคลื่อนด้วยเหตุการณ์ แนวคิดเหล่านี้แพร่หลายในการเขียนโปรแกรมสมัยใหม่และมีการใช้อย่างต่อเนื่อง
สิ่งที่สำคัญยิ่งกว่าคือการเรียนรู้วิธีการเข้ารหัส abstractionsซึ่ง FP มีความยอดเยี่ยมด้วยการใช้ฟังก์ชันลำดับสูงและชนิดข้อมูล วิธีการออกแบบโปรแกรมใช้วิธีการที่ไม่ซ้ำกันโดยการสอนผ่านการเหนี่ยวนำ ตัวอย่างเช่นนักเรียนเรียนรู้วิธีการfold
ทำงานโดยดูที่รหัสเพื่อรับทั้งผลรวมและผลงานของรายการการค้นหาสิ่งที่พวกเขามีเหมือนกันและได้รับการนำไปใช้เอง
OOP ที่เทียบเท่ากับข้างต้นอาจเกี่ยวข้องกับสิ่งใดสิ่งหนึ่งต่อไปนี้: อินเทอร์เฟซคลาสนามธรรม generics ฟังก์ชั่นหรือ (ถ้าคุณทำผิด) singletons ในขณะที่สิ่งเหล่านี้เป็นรูปแบบการออกแบบที่ยอมรับได้อย่างสมบูรณ์ใน Java แต่ IMHO พวกเขาไม่ได้อยู่ในหลักสูตรเบื้องต้นและให้บริการเพียงเพื่อทำให้งงงวยหลักการพื้นฐาน แม้ในขณะที่บางคนที่ได้รับการแนะนำให้รู้จักกับภาษา FP "สาย" ฉันสามารถพูดได้ว่าการนำทางทะเลที่เปลี่ยนแปลงตลอดเวลาของ OOP นั้นทำได้ง่ายขึ้นอย่างมากโดยมีจุดยึดที่แข็งแรง
RACKETEERS
ถ้าคุณต้องการที่จะซื้อดินแดนของแร็กเกตลองคูปองนี้: ไม่แน่ใจว่าเมื่อมันหมดอายุขออภัย
ฟังก์ชั่นการเขียนโปรแกรมทำให้สิ่งต่าง ๆ ง่ายขึ้นมาก ในภาษา OOP คุณต้องจัดการกับการจัดการสถานะข้ามหลายเธรดโดยไม่ทำให้สถานะนั้นเสียหาย ในภาษาที่ใช้งานได้เมื่องานส่วนใหญ่ที่ทำเสร็จแล้วทำโดยฟังก์ชั่นที่บริสุทธิ์คุณไม่ต้องกังวลกับมัน
ในแง่ของความเร็ว / ประสิทธิภาพฉันไม่ได้เป็นนักจัดรายการตัวจริง แต่การทำงานไม่ได้หมายความว่าจะช้าและโครงสร้างของภาษาเชิงฟังก์ชั่นนั้นไม่ค่อยเกี่ยวข้องกับเรื่องความเร็ว ไวยากรณ์ของภาษาที่ใช้งานแตกต่างกันมากเช่นความแตกต่างระหว่าง Clojure และ Haskell Clojure นั้นเร็วมากและสามารถเข้าถึง (และบางครั้งเกิน) ความเร็วของ Java ด้วยการปรับแต่งตามความเป็นจริง
ดังนั้นทุกอย่างขึ้นอยู่กับสิ่งที่คุณกำลังมองหา
ฉันคิดว่าความพร้อมของสื่อการเรียนรู้ตัวอย่างโค้ดที่ดีและที่ปรึกษามีความสำคัญมากเมื่อเรียนรู้ภาษาการเขียนโปรแกรม ขึ้นอยู่กับสถานการณ์ของคุณคุณอาจมีพี่เลี้ยงที่สามารถสอนคุณได้ ฯลฯ แต่ฉันคิดว่าทรัพยากรด้านภาษาที่ใช้งานได้มีน้อยมากเมื่อเทียบกับภาษากระแสหลัก หมายความว่าคุณจะก้าวหน้าช้ากว่าการเรียนรู้ภาษาหลัก แต่ถ้าคุณไม่รีบแล้วนี่ไม่ใช่ปัญหา
บางทีเหตุผลที่สำคัญที่สุดในการพิจารณาการเรียนรู้ภาษาโปรแกรมการทำงานคือความเข้าใจในประเภทข้อมูลพีชคณิต การทำแผนที่จิตจะช่วยในการสร้างแบบจำลองความสัมพันธ์ระดับ OO และแม้กระทั่งการออกแบบฐานข้อมูล
การมุ่งเน้นไปที่ระบบมัลติคอร์ / มัลติโปรเซสเซอร์นั้นเน้นการใช้อัลกอริธึมแบบขนานซึ่งสามารถแสดงให้ชัดเจนและกระชับยิ่งขึ้นใน FP สาขาภาษาแลมบ์ดามีแนวโน้มที่จะเห็นการใช้งานเพิ่มขึ้นอย่างมากในอีกหนึ่งถึงสองทศวรรษ
แต่ก็มีข้อผิดพลาดทั่วไปอยู่บ้าง การเชื่อว่า FP นั้นง่ายกว่านั้นเป็นความผิดพลาดครั้งใหญ่เนื่องจากการคำนวณพื้นที่และเวลาที่ซับซ้อนรวมถึงการส่งหลักฐานการหยุดชะงักอาจมีความท้าทายมากขึ้นในแคลคูลัสแลมบ์ดาโดยเฉพาะในภาษาที่รองรับการประเมินแบบขี้เกียจ
ดังนั้นเรียนรู้ทั้งสอง! หรืออาจจะดีกว่า: ก่อนอื่นเรียนรู้ภาษาที่รวบรวมทั้งสองอย่างเช่น Scala หากคุณไม่สนใจเสื้อยืดผูกเนคไทและสำเนียงดัตช์เล็กน้อยคุณอาจพบว่าการบรรยาย FP โดยดร. Erik Meijerมีประโยชน์ซึ่งอยู่ใน MSDN