เหตุใดจึงต้องมีการเขียนโปรแกรมที่จำเป็นมากกว่าการเขียนโปรแกรมที่ใช้งานได้? [ปิด]


13

ความเป็นมา:ฉันเป็นผู้สนับสนุนการเขียนโปรแกรมฟังก์ชั่นที่ทำงานที่ร้าน VB.NET ซึ่งรูปแบบจิตที่แพร่หลายคือการเขียนโปรแกรมที่จำเป็น การเป็นรากฐานของระบบของเราคือ WinForms ฉันสามารถเข้าใจได้ว่าเราจะไม่หนีจากการเขียนโปรแกรมที่จำเป็นทั้งหมด แต่ฉันก็ยังพยายามใช้ FP (หลัก ๆ ผ่าน Linq) ทุกที่ที่ทำได้เพราะฉันเชื่อในข้อดีของมัน

อาร์กิวเมนต์ & การโต้แย้งแย้งกับ FP

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

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

    • _Counter-argument: ส่วนใหญ่แม้ว่าฉันจะไม่ได้มีปัญหากับเรื่องนี้เพราะฉันคิดว่ารูปแบบการทำงานนั้นมีความชัดเจนในการอ่านและเมื่อมีข้อผิดพลาดเกิดขึ้นในห่วงโซ่การทำงานฉันมักจะเห็นปัญหาทันที

คำถามของฉัน

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

สิ่งที่ฉันไม่เข้าใจคือความยากลำบากในการโน้มน้าวใจผู้อื่นจากข้อดีของ FP

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

สิ่งที่ฉันพยายามทำความเข้าใจคือสิ่งที่ทำให้นักพัฒนาไม่ชอบ FP

ฉันต้องการเห็นคำตอบจากคนที่มีประสบการณ์เกี่ยวกับ FP เป็นอย่างมาก แต่ตัดสินใจเลือกสไตล์ที่จำเป็น อะไรทำให้การตัดสินใจอยู่กับความจำเป็นแทนที่จะใช้ฟังก์ชั่น


นี่คือตัวอย่างเพิ่มเติมที่เน้นความแตกต่างระหว่างการเขียนโปรแกรมที่จำเป็นและมีประโยชน์

ฉันเขียนSelectedRowsวิธีการของตารางของเราใน Linq เช่น:

Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
    Get
        Return Me.ugrBase.Selected.Rows.
            OfType(Of Infragistics.Win.UltraWinGrid.UltraGridRow)().
            Select(Function(ugr) ugr.ListObject).
            OfType(Of DataRowView)().
            Select(Function(drv) drv.Row).
            ToArray
    End Get

อย่างไรก็ตามโค้ดรูปแบบนี้ทำให้นักพัฒนาของเราบางคนรู้สึกไม่สบายใจและโอกาสในการขายของเราจึงเขียนใหม่ให้คุ้นเคยมากขึ้น:

Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows
    Get
        Dim plstRows As New List(Of DataRow)
        For Each bugrLoop As Infragistics.Win.UltraWinGrid.UltraGridRow In Me.ugrBase.Selected.Rows
            If bugrLoop.ListObject IsNot Nothing Then
                plstRows.Add(CType(bugrLoop.ListObject, DataRowView).Row)
            End If
        Next
        Return plstRows.ToArray()
    End Get

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

มันเป็นช่วงการเรียนรู้ที่เป็นปัญหาโดยเฉพาะอย่างยิ่งเมื่อทำงานกับคนที่รู้แค่ "เพียงพอ" ในหลายภาษา หากเชี่ยวชาญในภาษาใดภาษาหนึ่งฉันมั่นใจว่า FP จะเป็นความพยายามครั้งแรกที่ดีกว่า จากนั้นหากมีความไร้ประสิทธิภาพ (ประสิทธิภาพการทดสอบหน่วย) หนึ่งอาจชัดเจนมากขึ้นในการใช้งานของพวกเขา
vol7ron

คำตอบ:


11

โปรแกรมการทำงานเป็นเพียงซับซ้อนเกินไปสำหรับโปรแกรมเมอร์มือใหม่ หนึ่งในภาพประกอบคือภาพนี้ซึ่งนักเรียนประกาศว่าระเบียบ 30-LOC นั้นง่ายและเข้าใจได้ง่ายกว่าเมื่อเปรียบเทียบกับอนาล็อกสี่สาย FP

(นี่เป็นเวอร์ชันดั้งเดิมของตัวอย่าง FP เนื่องจากคำตอบในลิงก์ได้รับการแก้ไขเมื่อเร็ว ๆ นี้เพื่อให้อ่านง่ายขึ้นเล็กน้อย)

return this.Data.Products
    .Where(c => c.IsEnabled)
    .GroupBy(c => c.Category)
    .Select(c => new PricesPerCategory(category: c.Key, minimum: c.Min(d => d.Price), maximum: c.Max(d => d.Price)));

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

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

นั่นเป็นสาเหตุที่ผู้เริ่มต้นจำนวนมากเริ่มเขียนโปรแกรมด้วยภาษาเช่น PHP และไม่ใช่ภาษาอย่าง Haskell


8
ฉันมีประสบการณ์ตรงข้ามกับมหาวิทยาลัยที่ใช้ Scheme สำหรับหลักสูตรแนะนำ เมื่อนักเรียนต้องเรียนรู้ Java หรือ C # ที่บ่นมากที่สุดว่า Scheme อ่านง่ายขึ้น
Daniel Gratzer

2
นั่นพิสูจน์จุดของฉัน นักเรียนที่เรียนรู้การเขียนโปรแกรมที่จำเป็นและ OOP เป็นเวลาหลายปีจะพบว่าสามารถอ่านได้มากขึ้น ผู้ที่เริ่มต้นด้วย FP จะพบว่าสามารถอ่านได้มากกว่าเมื่อเปรียบเทียบกับการเขียนโปรแกรมที่จำเป็น จะน่าสนใจที่จะรู้ว่าเกิดอะไรขึ้นกับนักเรียนที่รู้ดีเกี่ยวกับ FP และกระบวนทัศน์ที่ไม่ใช่ของ FP
Arseni Mourzenko

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

3
@ Kr0e: การโต้เถียง "นามธรรมมากเกินไป" กับภาษาหรือกระบวนทัศน์มักจะดูแปลกสำหรับฉัน มีการใช้อาร์กิวเมนต์เดียวกันกับทุกภาษา (หรือส่วนใหญ่) หวังว่าซอฟต์แวร์ส่วนใหญ่ไม่ได้เขียนใน Assembler วันนี้
Arseni Mourzenko

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