ช่วงวันหยุดที่ผ่านมา มีเวลานั่งอ่านหนังสือ Real-World Functional Programming
ลองอ่านไป ทำตามไป รู้เรื่องบ้างไม่รู้เรื่องบ้าง
จึงบันทึกการอ่านไว้นิดหน่อย
มาเริ่มที่บทแรกในเรื่อง Thinking differently about problems
หรือแนวคิดสำหรับปัญหาหนึ่ง ๆ ที่ต่างออกไป
มาเริ่มกันเลย
ในปัญหาหนึ่งนั้น ๆ เรามักจะมองมันในรูปแบบเดิม ๆ ที่เราเข้าใจ
ทำให้ได้แนวทางการแก้ไขเดิม ๆ บางคนบอกว่า
อยากออกนอกกรอบ แต่ไม่กล้าคิด กล้ามอง กล้าทำในมุมมองใหม่ ๆ
ดังนั้นในบทแรกของหนังสือ
จึงพยายามอธิบายในมุมมองอื่น ๆ ของปัญหา
เพราะเชื่อว่า ถ้าเรามอง คิดอย่างไร เราก็จะทำหรือแก้ไขปัญหาอย่างนั้น
ในหนังสืออธิบายไว้ว่า Functional programing
เป็นอีกหนึ่งรูปแบบที่เกิดขึ้นมานานแล้ว เกิดก่อน computer อีก !!
โดยที่ตัวภาษานั้นจะสั้น กระทัดรัด ชัดเจน ซึ่งมันดีมาก
แต่กลับไม่ได้รับความนิยม หรือ ถูกปฏิเสธจากกลุ่มนักพัฒนา จนถึงปัจจุบัน
แล้วทำไมเราถึงกลับมาพูดถึง Functional programing กัน ?
เนื่องจากในปัจจุบันมีการเปลี่ยนแปลงมากมายนั่นเอง
ยกตัวอย่างเช่น จำนวนข้อมูลที่มีขนาดใหญ่มาก ๆ (Big Data)
ดังนั้นเราต้องการแนวทางการเขียน program ที่สามารถจัดการ ประมวลผล
และ รองรับการขยายตัวได้ง่ายและเหมาะสม
ต้องการการเขียน program ที่ง่ายต่อการทดสอบ
ต้องการการเขียน program ที่อธิบาย logic หรือขั้นตอนการทำงานที่ชัดเจน
นั่นช่วยทำให้เราอ่านเข้าใจได้ง่ายขึ้น
และเข้าใจเหตุผลการทำงานของ program
ซึ่งแนวทางหนึ่งที่ตอบโจทย์เหล่านี้คือ Functional programing
ผลที่เห็นได้อย่างชัดเจนของแนวทางนี้คือ
ภาษาโปรแกรมต่าง ๆ ที่ได้รับความนิยมในท้องตลาด
ไม่ว่าจะเป็น .Net (C#) และ Java ต่างก็ได้เพิ่มความสามารถเชิง functional
เข้ามาด้วย ยกตัวอย่างเช่น
- Generic ใน C# 2.0
- Anonymous method ใน C# 2.0
- Lambda expression ใน C# 3.0
- LINQ นี่ก็สร้างในเชิง declarative และ functional กันเลย
เมื่อแต่ละภาษาโปรแกรมเริ่มนำความสามารถของ Functional programming เข้ามาใช้
หรือบางภาษาถูกสร้างมาตามแนวคิด Functional programming เลยเช่น F#
มันทำให้หลาย ๆ คนเริ่มกลับไปให้ความสนใจต่อ
ที่มาที่ไปของ Functional programming มากขึ้น
สิ่งที่ผมสนใจในหนังสือเล่มนี้คือ
เข้าบอกว่า Functional programming นั้น
จะช่วยเพิ่ม productivity ของการพัฒนาระบบงาน
นั่นคือ มันกระชับ อ่านเข้าใจได้ง่าย
แต่ก็ยังยากต่อการนำไปใช้งานจริง ๆ !!
ดูมันขัดแย้งกันพอสมควร
รูปแบบของ Functional programming ที่ช่วยนักพัฒนาและทีมคือ
มีการเขียน program ในเชิง Declarative (Declarative programming style)
ในหัวก็คิดว่า มันคืออะไรวะ ?
เมื่อเราเขียน program นั้น
ปกติเราก็ต้องเขียนด้วยชุดคำสั่งที่ computer เข้าใจ
เพื่อแปลงชุดคำสั่งเหล่านั้นไปทำงาน นี่คือความรู้พื้นฐาน
โดยรูปแบบแรกที่เรามักจะเจอกันมาก่อนคือ Imperative style
ซึ่งจะมีชุดคำสั่งต่าง ๆ เตรียมไว้มากมาย
รวมทั้งเราสามารถเพิ่มชุดคำสั่งใหม่ ๆ เข้าไปได้ด้วย
จะทำการอธิบายขั้นตอนการทำงานไปเรื่อย ๆ
แต่เมื่อ program ใหญ่ขึ้น
ชุดคำสั่งก็มีมากขึ้น
การใช้งาน การจัดการและดูแลก็ยากขึ้นตามไปด้วย
ทำให้เกิดรูปแบบการเขียน program ใหม่ ๆ
หนึ่งในนั้นคือ Object-Oriented Programming (OOP)
โดยที่ OOP ช่วยทำให้ชีวิตจาก Imperative style ง่ายขึ้นเยอะ
เพราะว่า ทำการจัดกลุ่มคำสั่งต่าง ๆ ในรูปแบบที่เข้าใจง่าย
ซึ่งตัวมันเองสามารถอธิบายกลุ่มและการทำงานได้ชัดขึ้น
แต่การทำงานของ program ยังคงอยู่ในลำดับของการจัดเรียงคำสั่งที่ชัดเจน
แล้ว Functional programming ละ เป็นแนวคิดเพื่อแก้ไขปัญหาอะไร ?
Functional programming ได้เตรียมอีกรูปแบบ
ของการขยายความสามารถของคำสั่งต่าง ๆ
ไม่ใช่เพียงแค่เพิ่มเข้าไปเท่านั้น
แต่ยังสามารถเพิ่มรูปแบบของโครงสร้างการทำงานในรูปแบบใหม่ ๆ
ไม่ใช่มีเพียงแค่ loop และ recurrion เท่านั้น
รวมทั้งมีรูปแบบของการรวมชุดคำสั่งต่าง ๆ เข้าด้วยกัน
ซึ่งบอกว่าเป็นแนวทางที่เรียบง่ายและเข้าใจได้ง่ายขึ้น
อีกอย่างคือ การเขียน program นั้น
ต้องพยายาม เขียนเพื่ออธิบายว่า มันคืออะไร ทำงานอะไร (What)
มากกว่าทำงานอย่างไร (How)
อีกเรื่องที่ Functional programming มีมาให้เลยคือ เรื่องของConcurrency-friendly
นั่นคือเราสามารถปรับเปลี่ยนการทำงาน จาก sequential
ไปยัง Concurrency และ parallel ได้ง่าย
รวมทั้งการประมาณผลบน CPU แบบ multi-core
และจากแนวคิดนี้จะไม่สามารถแก้ไขสถานะของ program ได้ (immutablity)
ทำให้ไม่เกิดปัญหาเรื่อง race condition และ dead lock !!! อีกด้วย
แต่อย่างเพิ่งไปเชื่อ !!
ว่าแล้วลองเป็นเขียน code ด้วยภาษา C# และ F# ก่อนละ !!
ผมก็ไม่เคยคิดและเขียนแนวนี้เหมือนกัน
ไว้ลองเขียนแล้วจะเอามา share ต่อไป