ช่วงวันหยุดที่ผ่านมา มีเวลานั่งอ่านหนังสือ 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 ต่อไป