Monthly Archives: January 2014

สอน TDD, Rails ผ่าน Remote Pair Programming

ผมจำไม่ได้แล้วว่าผมแปะประกาศรับคนที่สนใจ TDD, Ruby, Rails มา pair ด้วยกันไว้ที่แถบด้านขวาของบล็อกและใน profile ของผมตั้งแต่เมื่อไหร่ น่าจะซักครึ่งปีได้ละมั้ง ตลอดเวลาที่ผ่านมาไม่เคยมีใครติดต่อมาเลยจนกระทั่งเมื่อ 3 อาทิตย์ก่อน มีผู้ขยันและกล้าหาญติดต่อมาคนแรก น้องวินปี 1 ลาดกระบังฯ ติดต่อมาว่าอยากจะศึกษา TDD เรานัดตอนหัวค่ำของวันนึงใช้ Google Hangout คุยกัน

ก่อนหน้านี้เคย remote pair ที่ไม่ใช่ตอนทำงานอยู่บ้างกับพี่รูฟ แต่ครั้งนี้จะเป็นครั้งแรกที่จะ remote pair กับคนที่ไม่เคยเขียน TDD มาเลย ช่วงนั้นเห็นพี่รูฟและหลายๆ คนเล่นโจทย์ Fizzbuzz กัน ก็เลยเอาโจทย์นี้แหละ

วันนั้นเราใช้ tmux/vim กัน โดยน้อง ssh เข้ามาที่เครื่องผม นี่คือโค้ดที่ได้จากวันนั้น

Continue reading

closure, FP และ OOP

เมื่อวานนี้พูดถึงคำนิยามของ closure ไป วันนี้ผมจะนำมันมาใช้สร้างโค้ดที่มีลักษณะคล้ายโค้ดจากภาษา Object-oriented programming (OOP) ให้ดูครับ

เริ่มต้นด้วยโค้ด OOP บน Ruby ก่อน

class Prepend
  def initialize(start_word)
    @start_word = start_word
  end

  def prepend_for(end_word)
    @start_word + " " + end_word  # Not idiomatic Ruby but should be more familiar for other languages user
  end
end

hello = Prepend.new("Hello")
hello.prepend_for("Tap") # => "Hello Tap"
hello.prepend_for("OOP") # => "Hello OOP"

ผมทำสร้างคลาส Prepend ซึ่งมี constructor method ที่รับพารามิเตอร์ 1 ตัวคือคำแรก (start_word) เก็บไว้เป็น instance variable และสร้างเมท็อด prepend_for ที่รับพารามิเตอร์หนึ่งตัวคือคำท้าย (end_word) นำคำแรกและคำท้ายต่อกัน

Continue reading

Lambda กับ Closure ต่างกันยังไง

ตั้งแต่แรกที่ผมได้ยินเกี่ยวกับเรื่อง Functional programming ผมก็ได้ยิน 2 คำนี้มาตลอด แต่ไม่เคยรู้ซักทีว่าเมื่อไหร่ควรใช้คำใด เมื่อไหร่เราควรเรียกว่า Lambda เมื่อไหร่เราควรเรียกว่า Closure พอวันนี้รู้แล้วก็เลยมาเล่าให้ฟังครับ ขออธิบายแบบไม่ทางการนะครับ

Lambda คือการประกาศฟังก์ชันแบบไม่มีชื่อ โดยการประกาศนี้บอกแค่เพียงว่าฟังก์ชันนี้รับพารามิเตอร์อะไรบ้าง และทำกระบวนการอะไรภายในนั้นกับพารามิเตอร์เหล่านั้น

ตัวอย่างเช่น

function(x,y) {
  return x+y;
}

ซึ่งเจ้า Lambda function นี้อาจจะถูกเรียกใช้ทันที

(function(x,y) {
  return x+y;
})(1,2) // => 3

จะถูกเก็บไว้ในตัวแปรเพื่อเรียกใช้ทีหลัง

var sum = function(x,y) {
  return x+y;
}
sum(1,2)

หรือจะถูกส่งเป็นอาร์กิวเมนต์เข้าไปให้ฟังก์ชันอื่นก็ได้

Continue reading

ปี 2556

ปี 2556 ถือว่าเป็นอีกปีหนึ่งที่ดีสำหรับผม สุขภาพกายแข็งแรง สุขภาพจิตดี

การออกกำลังกายอย่างสม่ำเสมอ นอนอย่างเป็นเวลาและเพียงพอ ทานผลไม้ทุกวัน ทำให้ผมแทบจะไม่ป่วยเลย ผมวิ่งออกกำลังกายในระยะ 5 – 10 กิโลเมตรเป็นประจำ อย่างน้อยอาทิตย์ละครั้ง ที่วิ่งประจำก็จะเป็น Punggol Waterway Park บางครั้งก็เลยขึ้นไปหน่อยถึงริมเกาะสิงคโปร์ทางด้านบน อีกที่ก็จะเป็นรอบๆ Clarke Quay และ Fort Canning Hill ได้มีโอกาสวิ่งบนทางรถไฟเก่าที่เชื่อมจากท่าเรือทางใต้ถึงมาเลเซียด้วย

ในด้านสุขภาพจิต ผมรู้สึกว่าผม emotional มากขึ้น ซึ่งส่วนตัวคิดว่าเป็นเรื่องที่ดี การลดการตัดสินใจด้วยเหตุผล เพิ่มความเข้าใจในความรู้สึกมากขึ้นเป็นสิ่งที่ผมอยากได้อยู่เสมอ

ความเปลี่ยนแปลงใหญ่ในชีวิตปีนี้คือ ผมย้ายจากทำงานประจำอยู่ที่สิงคโปร์กลับมาที่ไทย เป็นความตั้งใจตั้งแต่ตอนก่อนไปแล้วว่าผมคงจะไม่ได้อยู่นานนัก ไม่ได้มีความตั้งใจจะย้ายไปใช้ชีวิตถาวรที่ต่างประเทศแต่อย่างใด สรุปรวมเวลาที่อยู่ที่สิงคโปร์ก็ประมาณ 2 ปี 2 เดือน

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

ผมคิดว่าผมน่าจะยังสามารถพัฒนาด้านทักษะด้านการพัฒนาซอฟแวร์ต่อไปได้ เนื่องจากผมอยู่ในระดับที่สามารถหาความรู้เพิ่มด้วยตนเองได้อย่างไม่มีปัญหา ไม่ว่าจะเป็นจากการอ่านหนังสือ, ดู screencast, ดูบันทึก talk ตาม conference ต่างๆ

Continue reading