"ลองสังเกต logical structures ที่อยู่ในเรื่องราวในแต่ละวัน ที่อยู่ในธรรมชาติรอบตัวเราก่อน เรารีบไปเรียนสิ่งที่มัน abstract กันเร็วเกินไป"
ยกให้ maths for working programmers เป็นหนึ่งในคลาสที่กระทบวิธีการทำความเข้าใจโลก การแก้ปัญหาของเราที่สุด จากคนที่เคยกลัวคณิตศาสตร์มาก่อน รู้สึกว่ามันเริ่มเป็น part of me แล้ว
ก่อนที่เราเรียนกับอาจารย์เมื่อ 4 ปีก่อน เราไม่สนใจ maths เลย ขอแค่ก็อปโค้ดนี้จาก StackOverflow แล้วมันจะทำอย่างนี้ได้ เราเคยพูดในทอล์คว่า Haskell เรียนไปก็ไม่ได้ใช้ หรือพูดอย่างไม่มั่นใจว่า Monad คือกล่องเก็บข้อมูล ตอนนั้นเราคิดแบบนี้จริงๆ
คือเราก็พอ sense ได้แหละ ว่ามันมี layer บางอย่างที่เราแกะยังไงมันก็แกะไม่ออก แต่อะไรที่เราไม่รู้ก็น่ากลัวสำหรับเรา ก็เลยไม่ไปยุ่งกับมันมาตลอด
ครั้งแรกที่เราเรียนกับอาจารย์เดฟ คือ Maths4WP และ Category4WP รุ่นแรก เมื่อ 4 ปี่ก่อน จนถึง reasoning with discrete structures ปีที่แล้ว ความรู้สึกและ perception ที่เรามีกับ maths มันก็เปลี่ยนไปตลอด
ต้นปีนี้ได้ยินมาว่า version ใหม่มันเปลี่ยนไปจากเดิมเยอะมาก เลยรีบทักหาอาจารย์เดฟขอเปิด private class เลย ถือคติอยากเรียนก็ต้องได้เรียน หาสถานที่กับโพสต์เฟซตั้งตี้หาเพื่อนมาเรียนเอง
เราลงเรียนแบบ series เรียนต่อกันเลย ตอนนี้เรียนจบ day 4 จาก 6 แล้ว พอมันโฟกัสกับ mental model และ thought process มากกว่าโค้ด มันเลยเริ่มซึมซับเข้าเป็น part of me ได้จริงๆ เลยรู้สึกอินกับ version นี้มาก
Day 0
logical structures are around us. in the stories we tell our children. in the decisions we make in our lives.
เราชอบตามเสพโพสต์อ. เดฟเรื่องการสอน maths ให้น้องเอด้ามาก ด้วยความที่เราอินกับ Lifelong Kindergarten เลยสนใจเรื่องการสอนคณิตศาสตร์ระดับอนุบาล-ประถม กับอยากเรียนแบบนั้นบ้าง
เปิดคลาสมาวันแรกก็สมใจอยาก ทั้งวันแรกอาจารย์ก็จะมีเรื่องมาเล่าให้ฟัง การวางเมืองวิจัยในมาเลเซียบ้าง ระบบการศึกษาที่ญี่ปุ่นบ้าง แต่ระหว่างเล่าก็จะวาดเซ็ต เล่าไปก็วาดลูกศรเชื่อมกันบ้าง ไม่ว่าจะเล่าเรื่องอะไรก็จะเขียนกระดานตลอด
สักพักเราก็จะเริ่มเห็นว่าหลายเรื่องที่เล่ามันมีอะไรคล้ายกันมั้ยนะ เมื่อเรามองไกลออกไป หลายคนก็ sense ได้ว่ามัน share logical structures กัน มนุษย์เราจับ pattern เก่ง ยิ่งเราสังเกตเราก็จะยิ่งเห็น
สิ่งที่เราชอบที่สุดใน day 0 คือการพูดถึง concrete กับ abstract
คนเรามักจะชอบ generalize ให้มันครอบคลุมมากเกินความจำเป็น เช่น ทุกแอพจะถูกเขียนใหม่โดยใช้ AI บ้าง blockchain จะมาแทนฐานข้อมูลในอนาคตบ้าง หรือศาสนาพุทธจะตอบคำถามทุกสิ่งบ้าง
ชอบที่อาจารย์แนะนำว่าอย่า generalize ถ้าเรายังไม่ได้เห็น concrete samples ที่มันเยอะมากพอ เหมือนเวลาเราทำ product แหละ นิยามปัญหาเล็กๆ ที่มัน concrete ก่อน อย่าเพิ่งเอา vision ไปปนกับ action แล้วพูดว่าแอพเราวันแรกต้องแก้ปัญหาทุกคน มันทำไม่ได้อยู่แล้ว
ในการศึกษาไทยก็เหมือนกัน พอเรายังเห็นสิ่งที่มัน concrete น้อยเกินไป เราขาด abstraction maturity กันจนทำให้การเรียนใน higher education มันมีปัญหา เพราะเรามองภาพไม่ออก
ตั้งแต่ก่อนเข้าอนุบาลเราก็รีบฝึกให้ใช้ตัวเลขก่อนที่จะฝึกนับสิ่งของ ฝึกจัดรูปปัญหา ไม่แปลกเลยว่าเราไม่มี intuition ที่ทำให้เราทำงานกับสิ่งที่มัน abstract ได้เลย จนสุดท้ายต้องกลับมา concrete ในระดับมหาลัยกัน
อีกอันที่เราชอบคือ "from falsehood, anything follows" จากวิธีการที่ผิด มันจะนำมาซึ่งคำตอบที่ถูกหรือผิดก็ได้ เราบอกไม่ได้ว่าวิธีการมันถูกจากคำตอบที่มันถูก จน chain of reasoning นั้นก็เชื่อถือไม่ได้
mathematics is a "logical study of logical things"
ปล. คลาสนี้ overlap กับ reasoning with discrete maths [1] ที่เรารีวิวไปแล้ว ขอแปะ link ไว้ให้อ่านเพิ่มเติมใน comment นะฮะ
Day 1 - 2
เวอร์ชั่นนี้ต่างออกไปจากที่เราเรียนตอนแรกหลายอย่างเลย พอมันมี day 0 แล้ว สิ่งที่มันเคย arcane นิดๆ ในเวอร์ชั่นแรก เช่น classes of machines/languages, lambda definition หรือ turing machine definition มันก็ intuitive ขึ้นมาทันทีใน day 1 เวอร์ชั่นนี้
คลาสนี้เปิด theory of computation ด้วย Entscheidungsproblem ของ Hilbert ที่ทำให้เกิดการ formalize นิยามของ algorithm จนถึงจุดที่เราสามารถทำ computation ด้วยการทำตาม algorithm ได้
รู้สึกว่าอาจารย์ซีเรียสกับความถูกต้องของ intuition มากในเวอร์ชั่นนี้ เช่น "function is just a mapping", "lambda is a function constructor, NOT an anonymous function" ที่พอ mental model มันดี มันก็ไปเรื่องอื่นๆ ได้ง่ายและไม่สับสน
ชอบตอนที่โชว์โค้ด C ชุดนึง แล้วให้เราตั้งคำถามว่าทำไมมันถึงแย่ น่ากลัวเหมือนกันว่าทำไมเราถึงไม่มองมันเป็นเรื่องใหญ่ ทำไมบางคนถึงยอม approve โค้ดที่ fragile ขนาดนั้น เค้าตระหนักมั้ยว่าทำไมมันถึงไม่ดี
แล้วพอเรา refactor ในภาษา C มันพิสูจน์เลยได้ว่า functional programming เป็น mental model ที่ไม่ได้จำกัดว่าต้องใช้ภาษา pure functional เท่านั้น ถึงเขียน C เราก็ทำให้โค้ดมัน functional มากขึ้นได้
(แต่ภาษาอย่าง Haskell ที่ทรงพลังกว่า เราก็ใช้ความสามารถอย่าง pattern matching & terms rewriting ที่ภาษาอื่นทำได้ไม่ดีเท่า)
moment นึงที่เรารู้สึกว่า powerful คือตอนที่ break down subproblems เพื่อที่จะแก้ปัญหากัน น่าจะเป็น one of my most favourite moments ในคลาสเลย
ด้วยความที่เราไม่ค่อยถูกสอนให้ break down subproblems กันเวลาแก้ปัญหา พอเจอปัญหาที่มันซับซ้อนเราก็ไปกันไม่ถูก มัวแต่ diddle with the code ไปเรื่อยๆ log ค่าออกมาดูเรื่อยๆ จนกว่ามันจะถูก
Day 2 afterstory: OOP & Alan Kay ไขปริศนาภูมิสมัย 10 ขวบ
อันนี้ personal นิดนึงนะ ข้ามได้ - ตอนเรียน Day 2 มีช่วงนึงที่ทำให้เราร้อง "เชี่ยยยยย" แล้วคืนนั้นนอนไม่หลับ นั่งอ่านบทความ นั่งดูวิดิโอถึงตีสี่ คือตอนอาจารย์เดฟเล่าเรื่อง object-oriented programming
ตอนที่เราเด็กมากๆ ประมาณ 10 ขวบมั้ง ตอนนั้นเราเล่น Metasploit เพราะอยากเป็นแฮคเกอร์ เห่อหมอยตามอายุแหละ เลยไปเจอภาษา Ruby แล้วเรารู้สึก intrigue กับ message passing ในนั้นมาก ว่าทำไมเราส่ง message เข้า receiver ได้ ตอนช่วงประมาณ 13 ที่เข้าค่ายแล้วเจอ objective-c เราก็สนใจ message passing เหมือนกัน
ตอนนั้นเลยไปเจอคนคุยกันใน StackOverflow ว่า เฮ้ย Ruby เนี่ยมันไม่ใช่ true OOP นะ ถ้าอยากศึกษาจริงๆ ต้องไปอ่าน Java แต่เราพิสูจน์ไม่ได้ว่าแล้วมันมีอะไรที่ Ruby มันโมเดลไม่ได้วะ
พอโตขึ้นมาอีกนิด จำได้ว่าพี่จาบอนก็บอกว่า OOP มันจำลองมาจาก Plato's Theory of Forms ซึ่งก็เมคเซ้นส์ แต่เรายังเชื่อมโยงไม่ได้ว่ามันเกี่ยวกับ message passing ยังไงวะ
ปีที่แล้วเราสนใจเรื่องพวก synthetic biology เลยลองไปเล่นภาษา Gro ที่จำลอง cell signaling ในตัวภาษาได้เลย มันจะมี syntax แบบ get_signal ที่เราแอบ draw analogue บางอย่างกับ message passing เหมือนกัน
เลยเดาได้ว่า เออ Alan Kay น่าจะต้องมีพื้น biology แหละ ถ้าคอนเซปต์มันมาจาก cell signalling อะนะ พออาจารย์เฉลยว่า OOP ในแบบของ Alan Kay มันมาจาก biological cells as mathematical objects + chemical substances as messages รู้สึกว่าแม่ง make sense ทันที
เย็นวันนั้นเลยแบบนั่งอ่าน a history of smalltalk ที่เค้าเขียน เลยยิ่งมั่นใจได้ว่าที่อาจารย์พูดไม่ได้มั่ว เพราะมันพูดถึงไอเดียเหล่านี้จริงๆ เลยได้มีโอกาสไป binge ทอล์คตั้งแต่ที่เค้าเล่าเรื่อง Smalltalk กับ Dynabook ยิ่งรู้สึกมี profound respect กับ computer scientist ยุคนั้น
อีกอย่างคือเค้าตอบคำถามใน Quora ดีมาก เราสังเกตได้ว่า opinions มัน change over time แหละ แต่ก็ทำให้เข้าใจอะไรได้เยอะขึ้น
สังเกตตั้งแต่ Seymour Papert, Marvin Minsky แล้วแหละ ว่าคนพวกนี้สนใจเรื่อง learning มากๆ ยิ่งพอเห็นว่า Dynabook ตอนแรกทำมาเพื่อเรื่องนี้ยิ่งทึ่งเลย รู้สึกว่าได้ role model คนนึงละ
Day 3 - 4
ยิ่งเรียน day 3 ยิ่งเข้าใจว่าทำไมถึงต้องเรียน day 0 มาก่อน พอปูเรื่อง sets, function มาแล้ว การเข้าใจ typeclass, algebraic data types หรือเรื่อง partial/total function มันตรงไปตรงมามาก ฟังแล้วนึกภาพตามได้เลย ต่างกับที่อ่านในเน็ตตอนพยายามทำความเข้าใจเอง
"designing and thinking based on sets and functions" นี่ powerful กว่าที่เราคิดมาก แล้วยิ่งรู้สึกว่า typeclasses, ADTs มันมีอยู่ได้อย่างมีเหตุผล พอเรานึกถึง logical structures แล้ว reason กับมัน ต่างกับเมื่อก่อนที่เรามอง typeclass เป็นแค่ interface เฉยๆ
อีกอย่างคือเราชอบที่ปูมาว่าถ้าโมเดล type แบบ naive ที่ไม่ใช้ typeclass มันจะเจอปัญหาอะไรเป็นลำดับ รู้สึกว่าเวลาที่ยก concrete problems ก่อน เจอปัญหาก่อนจนมันไปต่อลำบาก แล้วค่อยนิยาม abstractions มาแก้ปัญหานั้น
แต่พระเอกสำคัญต่อมาของ day 3 - 4 คือ induction และ equational reasoning แหละ สารภาพว่า unexpected มากว่าจะเจอกับสองตัวนี้ เราไม่ได้เรียน induction ในโรงเรียนด้วย แต่ทำครั้งแรกสนุกมาก
ตอนเห็นการแก้ปัญหาจากการ break down subproblems ที่ทำให้เราสามารถลด order ของอัลกอริทึมด้วยการ rewrite the terms with equational reasoning ตั้งแต่การลด order ของ pipeline ไปจนถึง optimize O(N^3) ไปเป็น O(N) - kadane's algorithm ได้นี่ทึ่งมาก
ไม่คิดว่า proof มันจะช่วยให้เราทำอะไรแบบนี้ได้ ทำเอาซะอยากเรียน algorithm design ต่อเลยเนี่ย น่าสนใจมากว่าเราสามารถ design, proof and optimize algorithms โดยไม่ต้องเขียนโค้ดสักบรรทัดด้วยซ้ำ
อีกอย่างคือพอเราเข้าใจธรรมชาติของ recursive structures อย่างจำนวนนับ, list, trees แล้วมันทำความเข้าใจกับ data structures ได้ง่ายมากเลย ยิ่งพอ proof based on induction ยิ่งเข้าใจได้ ก็แปลกดีว่าทำไมในโรงเรียนไม่สอนกันแบบนี้วะ
อันที่ solve tower of hanoi ยิ่งทำให้เราเชื่อเรื่องนี้ พอเราเข้าใจว่า base case คืออะไร inductive case คืออะไร การแก้ปัญหามันก็ตรงไปตรงมา
บทเรียนสำคัญที่ได้จากคลาสนี้คืออย่ามองข้าม naive solution เมื่อก่อนเราชอบกลัวโดนเพื่อนล้อว่าทำไมคิดได้แค่ naive วะ แต่ในคลาสนี้เราก็เริ่มจาก naive solution เสมอที่มาจากการ break down subproblems มันก็ไปสู่ optimized solution ได้จากการ rewrite the terms
ซึ่งถ้าเรามองข้าม naive solution ไป มันคงคล้ายกับการที่เรามองข้ามการ break down subproblems มันข้ามขั้นไป แล้วเราจะไม่เข้าใจว่าการที่ algorithm มันถูก optimize มันมีวิธีคิดยังไงบ้างที่จะไปถึงจุดนั้น
ชอบที่บอกว่าเราต้องคิด the worst algorithm ให้ออกด้วย เพราะโลกจริงมันมักจะมีอัลกอริทึมเหี้ยๆ ที่เราต้องรับมือให้ได้ ถ้าจินตนาการไม่ออกเราก็รับมือกับมันไม่ได้
หลังจบคลาส รู้สึกว่ามีอะไรกลับไป ponder เยอะมาก
เราเชื่อว่า a language that doesn't affect the way you think about programming is not worth knowing ฉันใด, a class that doesn't affect the way you think is not worth taking ฉันนั้น
เมื่อวานที่ไปทอล์คเรื่อง software engineering beyond the age of AI เชื่อว่าคอนเซปต์ประมาณ 70% เราตกผลึกมาจากคลาสอาจารย์เดฟนี่แหละ แต่รู้สึกว่าการเล่าเรื่องแบบนี้มันธรรมชาติมากจริงๆ
เมื่อคืนมี moment ที่เรานอนไม่หลับ แล้วนั่งนึกถึงการที่ตัวเราเอง หรือคนในเน็ตชอบด่วนตัดสินคนที่มี set of values ไม่ตรงกับเรา แล้วก็นั่งคิดว่าเราสามารถใช้ abstract reasoning เพื่อ empathize ได้มั้ย
does there exist a set X that is opposed to what I currently believe? what does the structure of their belief system look like?
มีพี่คนนึงบอกว่าถ้าเราสามารถเข้าใจคนที่มุมมองต่างกับเรามากๆ โดยไม่ได้ไป pity หรือไปดูถูกเค้า แต่ลอง thought experiment ได้ว่าทำไมเค้าคิดแบบนั้น แล้วลองดูว่าในจิตใจและชุดความคิดของเรามีอะไรที่มันเปลี่ยนไปได้มั้ย ถึงจุดนั้นแหละคือเราเริ่ม empathize ได้
น่าแปลกใจดีนะที่การใช้ abstract reasoning มันไม่ได้ทำให้คนเราแข็งกระด้าง หรือเป็น insufferable realist แบบที่บางคนคิด แต่มันทำให้เรามึ awareness ถึงโลกและกลุ่มคนที่กว้างใหญ่กว่าเซ็ตความคิดของเรา ซึ่งบางทีเรา empathize ได้ในระดับที่เราทำงานกับความคิดตัวเองได้
ขออนุญาตโควทพี่คริส จากคลาสอีกคลาสที่เรายกให้เป็น the best classes that changes how I think คู่กับคลาสนี้
"awareness precedes option. options precedes change."
ยิ่งเราสังเกตความคิดตัวเอง สังเกตธรรมชาติรอบตัว เรายิ่งยอมรับมันได้ reason กับมันได้ เราเข้าใจว่าทำไมเราไม่ชอบความคิดแบบนี้ ทำไมวิธีการแก้ปัญหาของเราถึงยังไม่ดีพอ
เราก็จะมี option เพิ่มขึ้นว่าจะแก้ปัญหาในโลกยังไง จะตอบสนองหรือจัดการในใจตัวเองยังไง ถึงมันจะเป็นแค่ imperfect model แต่เราก็ observe เพิ่มเติม และเปิดกว้างพอที่จะเปลี่ยนความคิดเราได้
ถ้า generalize ขึ้นอีกระดับ การที่เราสังเกตธรรมชาติมากขึ้น มองเห็น logical structures ของมันมากขึ้น ก็คงทำให้เรามี awareness ต่อความเป็นไปได้อื่นๆ ในธรรมชาติที่เรามองข้ามไป ซึ่งมันก็คงทำให้เรามี options ในการแก้ปัญหามากขึ้น ว่าเราจะแก้ปัญหาแบบไหน
ขอบคุณอาจารย์เดฟที่เปิดคลาสนี้ และขอบคุณเพื่อนๆ ที่มาเรียนด้วยกันฮะ ใครสนใจเรียน ลองไปตามใน FB อาจารย์ได้เลย มีรอบ public ที่กำลังเปิดเร็วๆ นี้ หรือจะตั้งตี้ไปเปิด private class ก็ได้ครับ