Sunday, April 20, 2014

Review Corona SDK part.2 Language from the moon.


มาพูดถึงตัวภาษาที่ใช้ใน Corona SDK กันบ้าง ก็คือภาษา Lua (ใน Official ให้อ่านออกเสียงว่า ลู-อะ แต่ไม่มีใครอ่านแบบนั้นสักคน จะฝรั่งหรือไทยก็อ่าน "ลัว" กันหมด)

ประวัติของมันก็ไปอ่านกันได้ที่ http://www.lua.org/

ตัวภาษามันก็เป็นภาษา script อารมณ์เดียวกับ Javascript, python, ruby, php ฯลฯ เทือกๆนี้แหละครับ ส่วนตัวแล้วผมว่ามันคล้ายๆ Javascript แต่มันก็มีอะไรที่เป้นของมันเองเยอะเหมือนกันนะ

วิธีการเขียนก็ง่ายๆสไตล์ภาษาScript อย่างเช่นอยากจะ Hello world ก็แค่

 print("Hello world")  

แล้ว save เป็นไฟล์ สมมติว่าชื่อ hello.lua แล้วรันด้วย command (ต้องติดตั้ง lua เองต่างหากนะครับ Corona SDK ไม่มีมาให้ เด๊่ยวจะมาแนะนำวันหลัง)

>lua hello.lua

แค่นี้ก็ทำงานได้แล้วครับ

แต่ว่าแค่นี้มันจะไปพิเศษยังไงกันล่ะ มีภาษาอื่นๆทำได้ตั้งเยอะแยะ เดี๋ยวลองดูไปเรื่อยๆละกันครับ

ไม่ต้องประกาศ Type 
เป็นมาตรฐานของภาษายุคนี้ไปแล้วกระมัง คือเราไม่จำเป็นต้องประกาศ Type ของตัวแปร เอาอะไรมารับก็ได้หมด เช่น
 somchai = "My father"  
 somchai = 65355  
 somchai = {}  

ตัวแปรทุกตัวเป็น Global 
ถ้าเราเขียนแบบนี้
 function createSomchai()  
   somchai = "My father"  
 end  
 function greetSomchai()  
   print("Hello"..somchai)  
 end  

พวกที่อยู่ข้างนอก ก็จะรู้จัก somchai ไปด้วย
createSomchai()
print(somchai)
greetingSomchai()

ถ้าไม่อยากให้เป็น Global ต้องใส่ local ไว้ข้างหน้า
 functon createSomchai()  
   local somchai = "My father"  
 end  

นอก function ก็จะไม่รู้จักตัวแปร somchai อีกต่อไป

Table เทพ
ใน Lua ไม่มี Array ไม่มี Class ไม่มี Struct ฯลฯ มีให้แต่ Table ซึ่งมันสามารถแปลงร่างเป็นสิ่งที่เราอยากให้มันเป็นได้
เป็น Array
 somchaiChildrens = {"Perseus", "Herculis", "Kratos"}  

เป็น Data object
 somchaiProfile = {  
   name="Somchai",  
   age=42,  
   isMarries=true  
 }  

เป็น Module
 somchai = {  
   function sleep() end  
   function wake() end  
   function wwork() end  
 }  

นอกจากนี้ก็มีพวก Data structure แบบอื่นๆอีกเช่น Set, Queue, Tree ซึ่งจะเอามาแนะนำในโอกาสต่อไปครับ รวมถึงเรื่องการ iteration ด้วย

Function ก็เป็น Type
หมายถึงว่าเราสามารถ pass function เข้าไปใน function อื่นๆได้ หรือจะเอาไว้ใน table ก็ได้เช่นเดียวกัน แล้วก็ evaluate function นั้นได้แบบเดียวกับ Javacript

 function evaluateFunction(anyFunction)  
   anyFunction()  
 end  

ไม่มี Try Catch
เพราะตัวภาษามันสร้างมาจาก C มันไม่มี Exception handling (= =')  ต้องใช้ฟังก์ชั่น pcall แทนครับ แบบนี้

 local result, message = pcall(greetSomchai())  

result จะเป็นตัวแปร boolean ถ้าเป็น true หมายถึง ไม่มี error ถ้าเป็น false หมายถึงมี error เกิดขึ้น
message ขึ้นอยู่กับ result ถ้าเป็น true ก็จะเป็นผลลัพธ์ที่ return มาจาก function (ถ้าไม่มีก็เป็น nil) แต่ถ้าเป็น false มันก็จะเป็น Message ของ error ที่เกิดขึ้น
ตัวอย่างวิธีการใช้ error ครับ

 function greetSomchai()  
  if somchai then  
  print("Hello "..somchai)  
  else  
  error("Who the hell is Somchai?")  
 end  

Silent fail
ถ้าไม่ร้ายแรงจริงๆ มันจะไม่ throw error ออกมาครับ อย่างเช่นหา Module ไม่เจอ, เรียกใช้ตัวแปรที่ยังไม่ถูกประกาศหรือเป็น nil อันนี้มันจะมี error ออกมา
แต่ถ้าเป็นพวกการเปิดไฟล์ ถ้าไม่มีไฟล์หรือใส่ path ผิดมันไม่ error นะครับมันจะ error ตอนที่เราจะเอามาใช้ ให้เราเดาสาเหตุกันเล่นๆ สนุกๆ  ^ ^ หรือ
สรุปว่าต้องเขียนดีๆ นะ เวลามีแมลงจะได้ไล้จับถูก

OOP ก็มีให้ใช้นะ
แต่วิธีการมันจะประหลาดหน่อย  อย่างกับทำอะไรฝืนธรรมชาติอยู่ ก็มันทำงานอยู่บนภาษา C นี่นะ ถ้าใช้แค่ใน Corona ก็ไม่จำเป็นเลยครับ

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

Tuesday, April 15, 2014

ไปเรียน CSD มาแหละ

มีโอกาสได้ไปเรียนคอร์ส CSD กับทาง Odd-e Thailand มาครับ เลยมาบันทึกอะไรเก็บไว้หน่อย
CSD ย่อมาจาก Certified Scrum Developer เป็นคอร์สที่มีทั้งนั่งฟัง Lectucre และ Workshop รวมอยู่ด้วยกัน ใช้เวลาทั้งหมด 6 วัน เนื้อหาก็ตามชื่อครับ เกี๋ยวกับ Agile และ Scrum  แต่จะเน้นทางด้าน Developer และการทำานร่วมกันเสียมาก (ผมไม่เคยเรียนคอร์สเกี่ยวกับ Scrum master หรือ Product owner นะ แต่เนื้อหามันคงจะต่างกันเยอะอยู่ เอาไว้มีโอกาสคงได้สัมผัส ตอนนี้ต้องหาตังมาจ่ายค่าเรียนก่อนครับ ฮ่ะๆๆ)

สำหรับเนื้อหาในชั้นเรียนไม่ได้มีอะไร surprise เท่าไหร่ (สำหรับผมนะ แต่ถ้าใหม่ๆมาเลยมันจะเหมือนเอาตัวเองเข้าไปอยู่ท่ามกลางพายุดีๆนี่ล่ะครับ ซึ่งคงไม่มีหรอก...มั้ง) ตัวผมก็เคยผ่านค่าย Spartan กับชั้นเรียนมหาสนุกอย่าง Geek academy มาแล้ว แต่พอลองเอามาใช้กับงานจริงๆมันก็ไม่ได้เป็นอย่างที่ฝันไว้เท่าไหร่ กิจกรรมหรือpracticeบางอย่างก็ทำบางอย่างก็ไม่ หลายตัวที่ไปเรียนมาแล้วก็ขายไม่ออก ผมจึงอยากรู้ว่าที่เขาทำกันจริงๆน่ะ มันเป็นยังไง

เนื้อหาคร่าวๆในชั้นเรียน
- Hyper productivity
- Introduction to Agile & Scrum
- Unit test
- Collective ownership
- Code smell
- Mocking
- Robot framework
- ฯลฯ
ส่วนใหญ่จะได้เรียนไปแล้วใน Geek academy และค่าย Spartan นะครับ ถ้าไม่เคยเรียนก็ไปเรียนกันนะ

ระหว่างเรียนเราก็จะต้องทำ Product สุดเมพขึ้นมา 1 ตัว กับทีมที่ไม่เคยทำงานร่วมกันมาก่อน ภายในเวลา 5 วัน ระหว่างทางเราก็พบกับปัญหาเต็มไปหมด ทั้งปัญหาจริงๆ ทั้งวางกับดักกันเอง กระทั่งผู้สอนวางให้ แต่ก็ส่งงานได้ในวันสุดท้ายนะครับ :)

ในชั้นเรียนนี้เราจะมีครบ ทั้ง ทีม, Product owner, Scrum master และ Technical coach (บางทีก็มาช่วย บางที่ก็มาวางยา 555) อะไรที่ทำไม่ได้หรือไม่ได้ทำในที่ทำงาน ลองมาที่นี่ครับ ได้ทำทุกกิจกรรมจริงๆ
ทำให้ผมเข้าใจเลยว่า Scrum master กับ Product owner มันมีความจำเป็นจริงๆ ไม่ใช่ว่านึกจะอุปโลกน์ใครขึ้นมาเป็น หรือ ไม่มีเลยได้
การมี Scrum master ทำให้เรามีกิจกรรมที่ไม่ได้ทำที่ทำงานอย่างเช่น การกำหนด Working agreement การเปลี่ยนคู่ Pair ทุกชั่วโมง อ้อ รวมไปถึงการทำ Pair programming ด้วยนะครับ ยากมากเลยนะเวลาจะเอาไปใช้ในที่ทำงาน แรงต้านเยอะมาก แต่ในชั้นเรียนนี้เราจะแพร์มันทุกๆอย่าง กระทั่งการติดตั้งweb server หรือJenkins เขียนATDDด้วย Robot framework แต่จนจบคอร์สผมก้ยังแพร์ได้ไม่ครบทุกคนอยู่ดี น่าเสียดายนัก

พูดถึงเรื่อง Pair หน่อย ปกติแล้ว เวลาเราทำงานอะไรอยู่ เราก็จะปล่อยให้ตัวเองจมดิ่งลงไปในตัวงานนั้น ถ้ามีใครมาบอกให้หยุดหรือขัดจังหวะเราก็หงุดหงิด ก็อยากจะทำงานของเราต่อไป ผมคิดว่านี่เป็นสาเหตุที่หลายๆทีมล้มเหลวนะ เพราะเราก็ไม่ค่อยอยากจะขัดใจเพื่อนพอนานๆไป เราก็เลิกไปเองโดยปริยาย Scrum master ต้องมีไว้เพื่อเหตุนี้แหละครับ คอยบอกกับทีมว่า เฮ้ย พวกแกทำข้อตกลงอะไรกันไว้ ลืมแล้วป่าว ช่วงแรกก็ฝืนๆหน่อย ที่จะต้องทิ้งงานที่ทำอยู่ไป แต่ช่วงกลางถึงท้ายของคอร์ส เราก็ชินกับมันแล้วก็เปลี่ยนคู่กันเองได้เลยครับ เวลาติดปัญหาหรือresearchได้หรือไม่ได้ก็ให้ทีมมาร่วมรับรู้(มีกระดิ่งวิเศษหนึ่งอัน พอดังแล้วทุกคนต้องหยุดงานแล้วมาดู มีอยู่ใน Working agreement ด้วย)

ยังมีเรื่องที่ประทับใจอีกครับ อย่างเช่นการได้solutionจากเพื่อนร่วมทีมที่เราไม่รู้หรือไม่เคยคิดถึงมันมาก่อน การเอาปัญหามาแชร์กับทีมมันไม่ได้เป็นเรื่องเสียเวลาเลยครับ ถ้าเรานั่งอมมันเอาไว้ อาจจะเสีย feature ที่เราจะ release ใน sprint นั้นไปเลยก็ได้
แล้วก็การได้pairกับระดับปรมาจารย์อย่างSteven Mak(ผู้สอนท่านหนึ่ง เป็นคนฮ่องกง)นี่มันช่วยเปิดหูเปิดตาเราได้มากจริงๆ อย่างเช่นการมีอยู่ของ Getter,Setter ถ้ามันไม่มี test ที่เรียกใช้มันก็ลบทิ้งไปซะ เป็นต้น รู้สึกว่าเรานี่ยังห่างไกลกับเค้าอีกหลายล้านปีแสงเลย แต่ไม่ได้ทำให้หมดกำลังใจนะครับ กลับกันเลย เหมือนทางที่ต้องเดินต่อไปข้างหน้ามองเห็นได้ชัดขึ้นมากกว่า
แล้วก็การทำ Code review ที่แท้จริง ผมเรียกอย่างนี้ก็แล้วกันนะ เพราะที่เคยทำมามันไม่ได้เป้นแบบในชั้นเรียนเลย บรรยากาศมันผิดกัดลิบลับ ตรงนี้จะนำไปปรับใช้ในทีมแน่นอน
เรื่องเพื่อนร่วมชั้นนี่ก็เกรียนกันดีมากครับ ผมอยากจะทำ Product กับทีมนี้ต่อไปเลย แถมยังได้เป็นเพื่อนร่วมชั้นกับพี่หนุ่ม อันนี้ผมรู้สึกเป็นเกียรติมาก ปกติแล้วเคยเป็นแต่นักเรียนของพี่เขาน่ะ 555

เรื่องที่ไม่่ค่อยพอใจก็มีอยู่บ้าง เช่นการพยายามจะไม่เป็น Hero แต่ก็อดไม่ได้ อันนี้ไม่ได้อวยตัวเองนะครับ แต่ผมหมายถึงอาการแบบเห็นคนอื่นทำไม่ได้ ก็เลยเข้าไปทำเองอะไรเงี้ย บางทีก็ทำไม่ได้ ก็ติดเหมือนกันอย่างเช่นวันแรกๆที่ต้องทำ Jenkins ก็นังทำไปทั้งวัน มาวันสุดท้าย เมล์ยังส่งไม่ได้เหรอ มาผมลุยเอง แอบ Hardcode อีกตะหาก ดีนะวันสุดท้ายไม่มี code review แบบนี้น่ะครับ บางทีแอบนั่งว่างก็มี :(
แล้วก็ระหว่างทางไม่ได้เอางานให้ PO ดูเลยซักกะนิด (ไม่ค่อยจะอยู่ด้วยแหละ อันนี้ถือว่าแบ่งๆกันไปนะครับ ฮ่าๆ)
อ้อ แล้วก็การทีทีมตกลงใช้ Netbeans ด้วยครับ ที่ทีมเราตกลงใช้ Netbeans ในตอนแรกเนี่ย เพราะเชื่อว่ามันจะมี Web server อย่าง tomcat มาให้ครับ ซึ่งปรากฏว่าไม่มี สุดท้ายก็ต้องมาลงกันเองอยู่ดี เจอปัญเรื่อง Maven เรื่อ Java path/version อีกตะหาก แต่ก็ผ่านมาได้นะ ทีมเราเทพ อิอิ

มีเรื่องที่ข้ามไปอีกนะครับ เช่นเรื่องที่เรากินกันตลอดเวลา, มุขแป๊กของคุณแอร์ หรือ commit น้อยไปมั้ย ฯลฯ แต่หมดแรงแล้ว เอาเป็นว่าถ้ามีโอกาสก็ลองมาเรียนดูครับ แค่ได้มาลองทำ Practice ทั้งหลายที่อาจจะทำไม่ได้ในที่ทำงานเราก็คุ้มแล้วครับ

สวัสดีครับ -/\-