หลังจากมืนๆไปกับการสอบเพื่อเข้าเรียนปริญญาโทที่จุฬาในตอนเช้า เมื่อสอบเสร็จมันมี Calendar แจ้งมาว่าผมมีสิทธิ์เข้าไปงาน Tech@Agoda เลยแวะเข้าไปฟังครับ แต่ผมเข้าฟังแค่เรื่องเดียวนะครับ เนื่องจากต้องมีภาระกิจในช่วงเย็นครับ สำหรับการเดินทาง ผมงงครับ เห็นในกำหนดการบอกว่าให้ไป Starbucks ขั้น 3 แต่มันมี 2 ที่ มีทั้งในตัว Central World กับอาคาร Office เลยเสียเวลาเดินวนไปครับ ฮ่าๆ
เข้าเรื่องเลยดีกว่า The Functions and The Machines - Functional Programming (Speaker: Dave Ravitat)
มุมมองของ Speaker Assembly is Higher !!! แล้วทำไมหละ อันนี้ต้องย้อนกลับไปถึงจุดเริ่มต้นของ Computer เลยทีเดียวครับ สำหรับแนวคิดของคอมพิวเตอร์ที่เราเรียนกันมา มันมาจาก
- Von Neumann machine - ต้นแบบของคอมพิวเตอร์ในยุคปัจจุบัน
- Turing machine - Universal Turing machine
- Finite state machine
- Turing machine - Universal Turing machine
- ถ้ามองจากมุมนี้ Finite state machine มาจนถึง Assembly ตัว Assembly เป็นภาษาขั้นสูงครับ เพราะ เราไม่ต้องเข้าใจ Machine Code ครับ
- สำหรับการเขียน Program ในรูปแบบนี้ Imperative Programming ครับ เขียนตามลำดับขั้นตอน หนึ่ง สอง สาม ไปเรื่อยๆ
แล้วเราต้องคิดเหมือนเครื่องจักร หรือ ป่าว ? คำตอบ คือ ไม่ครับ หากมองลงไปที่แก่น มันมีวิชาหนึ่งในสาย Computer Science คือ Theory of computation มันมี Models หลายอันครับ ที่เรียนกันมาจะเป็นพวก Finite state machine ครับ แต่มันมีอีกหลายตัว ตัวที่เราจะสนใจ คือ Lambda Calculus มองทุกอย่างให้เป็น Function ครับ
ก่อนเข้าไปเรื่อง Functional Programming อยากให้ลองคิดแบบ Functional Thinking ก่อนครับ คิดแบบคณิตศาสตร์ครับ ซึ่ง
- ไม่มีที่เก็บข้อมูล
- ไม่มีหน่วยความจำ
- ไม่มีตัวแปรไว้ทด
ลองดูตัวอย่างได้ครับ ของผมขอเป็นเรื่อง Fibonacci (ตามมาจากข้อสอบเมื่อเช้า 5555)
- แนวคิด - การเรียงตัวกันของอนุกรมตัวเลขที่บวกกันสองตัวหน้า แล้วสร้างตัวเลขที่สามออกมาโดยเริ่มจาก 0 และ 1 ไปเรื่อยๆ เช่น 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 85, 144 .... ไปเรื่อยๆ
- โดยมีสมการ คือ Fn = F(n-1) + F(n-2) ครับ
- F(0) = 0 และ F(1) = 1
- ลองเขียน Code แบบ Machine
public int FibonacciIteration(int n) { int x = 0, y = 1, z = 1; for (int i = 0; i < n; i++) { x = y; y = z; z = x + y; } return x; }
- ลองเขียน Code แบบ Functional
public int FibonacciFunctional(int n) { if ((n == 1) || (n == 0)) { return n; } return fibRecursion(n - 1) + fibRecursion(n - 2); }
ลองดูนะครับ ว่าอันไหนอ่านง่ายกว่ากัน ?
การที่เราคิดแบบ Function ทำงานหนึ่งอย่าง ไม่ต้องยุ่งกับใคร (Pure function) มันไม่เกิด Side Effect แล้วพอเราคิดแบบ Function แล้ว เราสามารถเอา Function เล็กๆ มาประกอบกันเป็นงานที่ใหญ่ขึ้น ซับซ้อนขึ้นได้ครับ
การศึกษาภาษาใหม่ๆ ทาง Speaker ให้เริ่มดูจาการเขียน Data Structure ครับ เพราะ มันใช้งานของที่ภาษานั้นเตรียมให้มาในระดับหนึ่งครับ
Session นี้ทำให้ผมย้อนกลับไปนึกถึง 2 วิชาในตอนปริญญาตรี คือ Computer Science Principle (CP121) กับ Theory of Computation ครับ
จบด้วยของว่างครับ ก่อนมาทำภาระกิจพ่อบ้านต่อครับ
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.