Monthly Archives: August 2015

วิดีโอสอนเขียนโปรแกรมด้วยภาษา Python

เช้านี้พบว่าวิดีโอสอนเขียนโปรแกรมดี ๆ ชุดนี้ ถูกอัพโหลดอยู่ใน Youtube ของ Sipa แต่ไม่ได้จัดหมวดหมู่ไว้ ผมเลยสร้าง playlist ของผมเองซะเลย เพื่อที่จะได้ดูและส่งต่อให้คนอื่นดูกันได้ง่ายขึ้น ผลงานที่ต้องใช้เวลาและพลังงานในการทำมากขนาดนี้ แล้วมาปล่อยให้ดูฟรี มันควรจะถูกดูมากกว่าหลักสิบคนแบบนี้

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

ส่วนถ้าใครเรียนแล้วติดปัญหาที่ไม่รู้จะถามใคร ถามผมมาได้เลย ครับ message มาเลย จะพยายามตอบอย่างเต็มความสามารถที่เวลาและความรู้ของผมเอื้ออำนวย

ขอขอบคุณพี่ปิงและทีมที่สร้างวิดีโอชุดนี้ขึ้นมาท่านอื่น ๆ ด้วยครับ

Advertisements

แนวทางการ design api บน Clojure

วันนี้ไปเจอโปรเจ็คเล็ก ๆ ที่ชื่อว่า progrock ซึ่งเป็นไลบราลีที่ช่วยในการวาด progress bar บน Clojure

ด้วยความที่มันเล็ก แก้ปัญหาที่เข้าใจง่าย และมีขอบเขตชัดเจนนี้เอง ผมจึงรู้สึกว่ามันเป็นโปรเจ็คสำหรับการศึกษาการจัดวางโค้ด Clojure ที่ดีเลย ด้วยขนาด code แค่ 100 บรรทัด และ test อีก 50 บรรทัด ทำให้น่าจะเข้าใจได้ง่าย

จุดสังเกตหนึ่งที่ผมอยากจะกล่าวถึงสำหรับโปรเจ็คนี้ คือ Clojure api design เน้นให้ความสำคัญกับ data เสมอ จะเห็นว่าหน้าตาของ data จะอยู่ในส่วนต้นๆ ของ README เลย ผลลัพธ์ในกระบวนการทำงานใดๆ จะอยู่ในรูป data structure (ซึ่งส่วนใหญ่จะเป็น map) จากนั้นค่อยนำ data strucutre นี้ไปวาดเป็น UI ใน presentation logic ซึ่งในโปรเจ็คก็จะแยกออกเป็น render และ print อีกที ลักษณะการออกแบบโดยแยก pure function logic และ side effect (ในที่นี้คือฟังก์ชัน print ที่มีการ print ออก standard output) ออกชัดเจนเช่นนี้ ทำให้หลายๆ อย่างง่ายขึ้น ไม่ว่าจะเป็น

  • โค้ดเข้าใจได้ง่ายขึ้น เพราะ logic จะชัดเจน มีแค่ 1 เรื่อง คือการสร้าง output
  • นำไปเล่นกับ REPL ได้ง่าย
  • ใช้ประโยชน์จาก built-in collection library ได้เต็มที่
  • การเขียน test ที่สามารถเขียนได้ง่าย เพราะโค้ดเป็นแค่ input – output ธรรมดา
  • การ debug ง่ายเช่นเดียวกัน เพราะแค่ print data structure ออกมาดู ทำบน REPL ก็จะยิ่งสะดวกขึ้น
  • การทำ concurrency หากจะมีหลาย ๆ thread มา update progress พร้อม ๆ กันก็ทำได้ โดยการจับยัดใส่ atom
  • การเปลี่ยน presentation logic จะส่งเป็น json ไปให้ client ที่อื่นก็ทำได้ทันที เพราะ data structure มันอยู่ใน format ที่ serialize ง่ายอยู่แล้ว

ผมเคยเล่าถึงมุมอื่นของการให้ความสำคัญกับ data ของ Clojure ไปแล้วบ้างแล้วที่นี่ Data oritented