Monthly Archives: June 2012

หนึ่งปีในสิงคโปร์ ภาคโปรแกรมเมอร์

blog ชีวิตหนึ่งปีในสิงคโปร์ ภาคคนธรรมดาอ่านไปแล้ว คราวนี้มาถึงภาคโปรแกรมเมอร์กันบ้าง

เนื้อหาอาจจะไม่เกี่ยวข้องกับสิงคโปร์ทีเดียว แต่เอาเป็นว่าเป็นเรื่องราวที่เห็นในรอบ 1 ปีนี้แล้วกันนะครับ

  • ความนิยมของภาษาเขียนโปรแกรมคล้ายๆ ไทย คือ บริษัทใหญ่ C# และ Java ส่วนบริษัทเล็ก PHP เป็นส่วนมาก Python กับ Ruby ตามมา
  • Startup ถ้าตั้งโดยคนสิงคโปร์มักจะมองแค่ระดับในประเทศตัวเอง แต่ถ้าตั้งโดยชาวต่างชาติจะมองที่ระดับทวีปและหวังจะไปถึงระดับโลก
  • จากค่าครองชีพและอัตราเงินเดือนที่สูง ทำให้คนนิยมซื้อบริการต่างๆ มากกว่าจะตั้งเซอร์เวอร์ขึ้นใช้เอง ตัวอย่างบริการ เช่น zendesk, github
  • เครื่องเซอร์เวอร์ในบริษัทมีแค่ Hadoop cluster กับ CI นอกนั้นอยู่บน cloud หมด ที่ config EC2 ขึ้นใช้เองก็ไม่เยอะ ส่วนมากซื้อบริการสำเร็จเลย
  • ได้อยู่ในทีมที่ใช้ Agile จริงๆจังๆ
  • ที่บริษัททีม Engineer ทำงาน 9 – 6 แค่นี้ตอนเย็นก็เบลอแล้ว ไม่รู้ว่าบริษัทอื่นเค้าทำกันถึง 2-3 ทุ่มได้ยังไง
  • คนไม่รู้จัก Agile จริงๆ แต่บอกว่าตัวเองรู้จักเยอะมาก แม้คนที่ใช้ Agile บาง practice อยู่แล้วได้ประโยชน์ ก็ใช่ว่าจะเข้าใจแก่นของมัน
  • ได้พบเจอกับคนสายเทคโนโลยีที่ตอนอยู่ไทยก็ได้แต่ติดตามเรื่องราวหรือการพูดของพวกเค้า 1, 2, 3
  • ได้ถ่ายรูปร่วมกับโปรแกรมเมอร์สาย Ruby ทั้งจากสิงคโปร์และประเทศใกล้เคียง ในงาน RedDotRubyConf
  • มีคนถ่ายรูปโพสท่าหล่อๆ ในงาน CITCON
  • ได้เห็นและฟัง Martin Fowler ตัวเป็นๆ
  • บริษัทที่จัดงานและให้สถานที่จัดงาน event ต่างๆ มีวาระซ่อนเร้นทั้งนั้น
  • สิ่งที่ขาดจากเด็กจบใหม่เก่งๆ คือ การ focus, การมองปัญหาที่ภาพรวม
  • พบว่าโปรแกรมเมอร์เก่งๆ ต้องมีประสบการณ์ แต่โปรแกรมเมอร์มีประสบการณ์ใช่ว่าจะเก่ง

ด้านล่างต่อไปนี้จะเป็นความเปลี่ยนแปลงส่วนตัวในรอบ 1 ปีนะครับ จริงๆ บางส่วนก็เคยเขียนไปแล้วรอบหนึ่ง

  • ศึกษาและใช้งาน Ruby และ Rails อย่างจริงจัง จนถึงระดับทำมาหากินได้ เขียนแนะนำการเริ่มต้นไว้แล้ว
  • เขียนเว็บเป็นซะที SQL พื้นฐานก็ได้แล้ว CSS ก็พอเดาได้มากขึ้น
  • แตะ PHP อยู่ 3-4 เดือน ชีวิตนี้ไม่ขอใช้มันอีก
  • อ่านหนังสือ และบทความเกี่ยวกับ ภาษาและการพัฒนาซอฟแวร์เยอะมาก เพราะมีเวลาว่างเยอะบนรถไฟฟ้า
  • หลักในการตัดสินใจสไตล์การเขียนโปรแกรมข้อแรกคือ เขียนให้สื่อสาร นึกอยู่เสมอว่าถ้าเราไม่รู้จัก code นี้มาก่อนแล้วเรามาเห็นเราจะรู้สึกอย่างไร ส่วนมากจะออกในแนวเขียนให้ง่าย และสั้น
  • เข้าใจการทำงานร่วมกับคนอื่นมากขึ้น “เปลี่ยนเพื่อแก้ปัญหา อย่าเปลี่ยนเพราะอยากเปลี่ยน”, “ทำความผิดพลาดให้เด่นชัด จะได้แก้ไข ไม่ใช่ลืมไป”
  • มองปัญหาที่ต้นเหตุมากขึ้น หลายๆครั้งที่คนอื่นจะมาวานให้เราทำอะไรให้ โดยคิดมาให้แล้วว่าเราควรจะทำอย่างไร แต่พอเราถามถึงสาเหตุจริงๆ เราจะสามารถหา solution ที่ง่ายและแก้ปัญหาตรงจุดกว่าได้
  • pair programming ทำให้รับรู้ถึงความสามารถของคนได้ดีมาก เหมาะแก่การเอาไปใช้สัมภาษณ์งานอย่างยิ่ง
  • โปรแกรมเมอร์ส่วนใหญ่มีนิสัยชอบทำอะไรให้เสร็จ จะเหนื่อยและเบื่องาน ถ้าทำไม่เสร็จซักที
  • หาสไตล์ส่วนตัวเจอ ว่าจังหวะไหนควรเขียนเทส จังหวะไหนไม่ควรเขียน
  • ถ้า enviroment ของเรารันช้าจะทำ TDD ไม่ได้ ทำได้แค่ Test-First
  • ได้รับรู้ mindset ของโปรแกรมเมอร์ฝั่ง dynamic programming
  • พบว่าคนที่เกลียด Java หลายๆ คนก็ไม่ได้รู้จัก Java จริงๆ แต่เกลียด heavy tools ของ Java
  • เห็นความสำคัญเรื่องการสื่อสารมากขึ้น และได้สังเกตตัวอย่างของคนที่สื่อสารดีๆ พยายามจะทำตาม การสื่อสารไม่ใช่แค่ทำอย่างไรให้คนฟังเราเข้าใจแล้ว แต่ไปถึงระดับทำอย่างไรให้คนฟังเราหรืออยากฟังเรา
  • รู้สึกว่าตัวเองความรู้ด้านเทคนิคสูงกว่ามาตรฐานโปรแกรมเมอร์ทั่วไปแล้ว แต่สิ่งที่ทำให้ value ของตัวเองยังไม่มากก็เรื่องการสื่อสารนี่แหละ
  • เลือกศึกษาและใช้เทคโนโลยีที่ mature กว่าสมัยก่อน สงสัยเพราะว่าแก่แล้ว
  • เหมือนจะสูญเสีย skill การ config Unix/Linux ไป ไม่ค่อยได้ใช้เลย
  • มีเวลาว่างทำอะไร เล่นอยู่พอสมควร Thai Blood DonationClear PollutionCloundClonegit_story
  • การจะเป็นคนพัฒนาโปรดัก ต้องหัดเป็นคนเรื่องมาก ต้องรู้จักประเมินว่าอะไรดี ไม่ดี ไม่ใช่อะไรก็โอเคไปหมด
  • ไม่เริ่มทำ feature อะไรที่ยังไม่เข้าใจความต้องการจริงๆ
  • ไม่ทำ feature อะไรที่ใหญ่ๆ ในครั้งเดียว ค่อยๆ แตกเป็นงานย่อยๆ
  • แตกงานแบบ vertical(end-to-end) พยายามอย่าแตกงานแบบ horizontal(layer)

หนึ่งปีในสิงคโปร์ ภาคคนธรรมดา

วันครบรอบ 1 ปีการมาอยู่สิงคโปร์ของผมเพิ่งผ่านไปไม่กี่วันมานี้ ได้เวลาบันทึกสิ่งเตือนความจำไว้หน่อย

blog นี้เป็นภาคคนธรรมดาทั่วไปอ่านได้ คาดว่าจะมีภาคโปรแกรมเมอร์ตามมาอีกทีครับ

  • คนสิงคโปร์พูดภาษาจีนเยอะกว่าที่คาดไว้ก่อนจะมา ด้วยเรื่องภาษานี้ทำเอามีเรื่องสนุกๆ เกิดขึ้นมากมาย เช่น เรื่องรถบัส และสกินเฮด เป็นต้น
  • คนแจกเบอร์โทรศัทพ์กันง่ายกว่าไทย แนบกันใน footer ของ email  กันบ่อย
  • มือถือเติมเงินไม่มีเน็ตถูกๆให้ใช้ มือถือรายเดือนขั้นต่ำแพงและให้มาทำไมไม่รู้ตั้ง 12 GB ต่อเดือน ใช้ไม่เคยถึง 4 GB
  • เบอร์โทรศัทพ์ใช้มาแล้วเกือบปี ยังมีคนโทรมาขายของเจ้าของเก่าอยู่ แถมเคยโดนคนอาฆาตแค้นเจ้าของเก่า เมาเหล้าโทรมากลางคืนด้วย
  • ทักษะภาษาอังกฤษพัฒนาขึ้นอย่างมาก โดยเฉพาะอย่างยิ่งการฟัง แต่การพูดยังห่วยอยู่ verbช่วยใช้มั่วไปหมดเพราะคิดไม่ทัน แถมอาจจะได้ bad English กลับไปโดยรู้ตัวเพราะหลายๆ คนที่คุยด้วยก็ไม่ใช่ native English
  • อยู่มา 2 บริษัท ย้าย office ที่ 4 ที่
  • ใบอนุญาตทำงาน (EP) ผูกกับบริษัท ถ้าตกงานต้องออกจากประเทศใน 30 วัน
  • มีบริษัท software consultant ใหญ่ๆเยอะ เหมือนไทยส่วนใหญ่คนสิงคโปร์ทำ
  • ส่วนบริษัท startup มี ratio เป็นชาวต่างชาติสูงมาก
  • โดนเบี้ยวเงินเดือน และตกงานเป็นครั้งแรกในชีวิต
  • สมัครงานใหม่ค่อนข้างง่าย
  • ถึงรถไม่ติด แต่ถ้าอยู่ไกลก็เดินทาง 2-3 ชั่วโมงได้เหมือนกัน
  • รถไฟฟ้าบางสายมาเร็วมากในช่วงชั่วโมงเร่งด่วน แต่คนก็ยังแน่นอยู่ คิดไม่ออกเหมือนกันว่าต้องแก้ยังไง
  • การเดินทางและหาสถานที่ค่อนข้างสะดวกและแม่นยำด้วย google map
  • รถบัสมี GPS ติดทุกคันทำให้มีระบบบอกเวลารถที่จะมาถึงป้ายด้วย
  • รถไฟและรถบัสเชื่อมต่อกัน ถ้าขึ้นลงต่อรถในระยะเวลาไม่นานจะไม่ต้องเสียเงินค่าเริ่ม journey ใหม่ (ขนาดกินข้าวหมดหนึ่งจานยังคิดต่อกันให้)
  • ไม่มีวัฒนธรรมในการต่อคิวขึ้นรถไฟฟ้า
  • คนสูบบุหรี่เยอะกว่าไทย และสูบในที่ห้ามสูบ แถมทิ้งก้นลงพื้นด้วย
  • ใครๆ ก็บอกว่าประเทศนี้ปลอดภัยกว่าประเทศตัวเอง
  • รู้จักอาหารนานาชาติ ทั้งเวียดนาม เกาหลี อินเดีย ฯลฯ
  • กินอาหารตะวันตกจนจุใจ โดยเฉพาะอย่างบริษัทมีอาหารเช้าตะวันตกให้กินทุกวัน
  • อ้วนขึ้นด้วยตู้ขนมของบริษัท
  • ได้รู้จักคนนานาชาติ ทั้งอินเดีย ฟิลิปปินส์ มาเลเซีย พม่า เวียดนาม อินโดนีเซีย สิงคโปร์ สเปน อียิปต์ อาเมเนีย รัสเซีย เกาหลี ฮังการี อเมริกา แคนาดา เนเธอร์แลนด์ ไต้หวัน ญี่ปุ่น อังกฤษ มองโกเลีย
  • สิงคโปร์เองไม่ค่อยมีที่เที่ยวเท่าไหร่ แต่คนนิยมไปเที่ยวประเทศรอบๆกัน
  • ได้ไปทริปบริษัทที่บาหลี
  • กลับมาออกกำลังกายอย่างเป็นประจำเทียบเท่ากับสมัยมัธยมฯเลยทีเดียว ทั้งวิ่ง ว่ายน้ำ เล่นบาสฯ
  • เส้นกั้นระหว่างสิงคโปร์กับอเมริกาดูน้อยกว่าไทยกับอเมริกามาก คนย้ายไป ย้ายกลับทำงานกันเป็นปกติ บริษัทดังๆ มีสาขาแสดงตัวตนที่นี่กันหมด ถึงแม้จะมีแค่บางฝ่ายก็ตาม
  • ไปงาน meetup มากมาย ที่ไปประจำก็ Agile, Functional Programming, Ruby, DevOps
  • ไปงาน conference และกึ่ง conference เช่น barcamp (ที่ไม่คิดจะไปอีกแล้ว เพราะมีแต่เรื่องธุรกิจ), geekcamp (เกิดจากคนเก็บกดจาก barcamp), CITCON, RedDotRubyConf
  • สังคม IT ไม่ใหญ่เท่าไหร่ เจอคนเดิมๆ ในหลายๆ งานบ่อยครั้ง
  • เป็น Mac user
  • ในมหาลัยฯชายสิงคโปร์มักจะอายุมากกว่าหญิงและชายชาติอื่นเพราะต้องเกณฑ์ทหารก่อนเข้ามหาลัยฯ กว่าจะจบตรีก็อายุประมาณ 24-25
  • ราคาอาหารถูกๆ ก็ประมาณ 70 – 100 บาท ถ้าเป็นร้านอาหาร 250 บาทขึ้นไป
  • เช่าห้องพักอยู่ในบ้านคนอื่นหนึ่งห้อง 20,000 บาท
  • โดยปกติธรรมเนียมการเช่าห้องคือ จ่ายมัดจำค่าห้อง 1 เดือน และต้องบอกก่อน 1 เดือนก่อนออกถึงจะได้คืน (ถ้าหมดสัญญาที่ผูกไว้)
  • สินค้าแบรนด์เนมราคาใกล้เคียงกับประเทศไทย ทำให้คนนิยมใช้ของแบรนด์เนมกัน เช่น เป็นเรื่องปกติ ที่จะกินข้าวในร้านอาหารหนึ่งมื้อแล้วราคาเท่ากับรองเท้ากีฬา
  • ซื้อช็อคโกแลตแบบหนึี่งที่มุสตาฟา ถูกว่าชางฮี 2 เท่านิดๆ และถูกกว่าสุวรรณภูมิเกือบ 4 เท่า
  • เปิดบัญชีขั้นต่ำ 12,500 บาท บางธนาคาร 25,000 บาท ดอกเบี้ยเงินฝากต่ำมากกกกก
  • ฝนตกบ่อยมาก แทบจะอย่างน้อยอาทิตย์ละครั้ง ต้องพกร่มตลอดเวลาถ้าไม่อยากเสียเวลาติดฝน
  • แต่ก็ทำให้ต้นไม้และหญ้าเขียวขจีดี
  • เวลาฝนไม่ตกก็ร้อนสูสีกับไทย
  • ช่วงตรุษจีน ร้านและห้างปิดหมด เกือบไม่มีข้าวกิน
  • เหงา คิดถึงประเทศไทย และคนไทย

Update: ภาคโปรแกรมเมอร์มาแล้วครับ

Martin Fowler at Singapore, June 2012

เมื่อวันพฤหัสฯ ที่ผ่านมา ThoughtWorks ได้ทำการประกาศตัวว่าเปิดสาขาที่ Singapore แล้ว ด้วยการนำ Martin Fowler Chieft Architecture Scientist ผู้ที่มีชื่อเสียงมากที่สุดคนหนึี่งในด้าน Agile มาพูดให้ฟัง งานแบบนี้ส่วนตัวก็ไม่พลาดไปติดตามแน่นอน และยังได้พบพี่ๆจากไทย ทั้งพี่แป๋ม พี่จั๊วและพี่เก๋ ที่สองคนหลังเค้าบินมาเพื่องานนี้โดยเฉพาะ!!

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

เริ่มด้วยเรื่อง NoSQL DATA MODELS

เค้ากำลังเขียนหนังสือที่มีชื่อว่า NoSQL Distilled อยู่ เลยได้ดึงเนื้อหาบางส่วนออกมาพูดให้ฟัง

  • เค้าเรียกการรวมกันของ NoSQL ประเภท Key-Value และ Document Store ว่า Aggregate-Oriented Database ประเด็นของมันคือการเก็บกลุ่มของข้อมูลที่ได้ทำการ denormalize แล้วนั่นเอง ทำให้ถ้าเราเข้าถึงกลุ่มของข้อมูลนั้นผ่าน key ปกติจะทำได้เร็วและถูกกว่า relational database แต่เมื่อไหร่ที่เราต้องการเข้าถึงข้อมูลใน pattern อื่นก็จะทำได้แย่กว่า relational database
  • (จากรูป) งานที่เหมาะมากๆ กับ NoSQL คือ custom fields และ non-uniform data แต่เรื่อง migration ที่หลายคนพูดว่าเป็นข้อดีหนึ่งของ NoSQL นั้น เค้าไม่เห็นด้วย เค้ามองว่าในการเก็บข้อมูลเราก็จะมีการคิดถึงรูปแบบในการจัดข้อมูลซึ่งหมายถึงมี implicit schema อยู่ดี

เรื่องต่อมาคือเรื่อง 2 Kinds of software projects

  • เค้าจัดกลุ่มการพัฒนาซอฟแวร์บนโลกนี้ออกเป็น 2 กลุ่ม คือ strategic software และ utility software
  • Strategic software (S) คือ software ที่สร้างข้อได้เปรียบในเชิงการแข่งขันทางธุรกิจ
  • Utility software (U) คือ software ที่นำมาใช้ช่วยการดำเนินธุรกิจ
  • เป้าหมายของ S คือ innovation และ speed, เป้าหมายของ U คือ ถูก
  • S ควรทำเอง, U ควรซื้อสำเร็จ
  • ความเสี่ยงของ U คือการทำพลาด, ความเสี่ยงของ S คือการไม่ทำ

เรื่องสุดท้ายคือ Continuous Integration และ Continuous Delivery

  • Source code version control ในปัจจุบันยังทำได้แค่การ merge text แต่ยังมีการ merge sematic ที่ทำไม่ได้ หากนึกตัวอย่างไม่ออกลองนึกถึงสถานการณ์ ที่เพื่อนร่วมทีมของเราเปลี่ยนการทำงานของ method ที่เราเรียกใช้อยู่ซึ่งทำให้ผลลัพธ์ของ method นั้นเปลี่ยนไปจากตอนที่เราเขียนโปรแกรมเรียกใช้มัน
  • สิ่งที่พอจะทำให้เราตรวจสอบ sematic merge ได้มีแค่ test เท่านั้น
  • พอการ merge มันสร้างความลำบากทำให้เราไม่อยาก merge กันเท่าไหร่ เลยหนีไปทำ feature branch กัน
  • แต่ feature branch ก็ยังไม่ช่วยให้การ merge มันง่ายขึ้น การแก้ปัญหานี้ที่ถูกต้อง คือควรจะ merge กันบ่อยๆ จากรูปจะเห็นว่าเค้าจำลองเหตุการณ์ของการแก้ไขที่ไม่ตรงกันของ 2 developer ด้วยลูกศร และจุดที่เราพบว่าการแก้ไขของคนสองคนขัดกันด้วยจุดแดง จะเห็นว่าถ้ารวม code กันบ่อยๆ ก็จะเจอจุดบกพร่องเร็วกว่าการแตก branch มาก
  • การรวม code กันบ่อยๆ นั่นคือแนวคิดที่เป็นหัวใจของ Continuous Integration นั่นเอง
  • ส่วน Continuous delivery คือ กระบวนการการนำซอฟแวร์จากจุดที่ dev commit ไปอยู่ในจุดที่พร้อมจะ release แบบอัตโนมัติ เหลือไว้เพียงแค่การกดปุ่ม release จากการเห็นชอบของฝ่าย business เท่านั้น
  • วิธีที่ใช้ในการทำให้เกิด Continuous delivery คือ deployment pipeline คือสร้างลำดับการรัน test หลายๆ ขั้นขึ้นมา เนื่องจาก test แต่ละระดับมีความเร็วช้าและความครอบคลุมต่างกัน จึงวางกลุ่ม test ที่รันได้เร็ว (จากการที่ตัด dependency ออก) ไว้ก่อน เพื่อให้สร้าง feedback ได้เร็วที่สุด หากผ่านชั้นที่เร็วไปได้ ก็ไปสู่ในชั้นที่ test ระหว่างส่วนมากขึ้น แต่รันได้ช้าลงต่อไป
  • ไม่ควร compile code ใหม่ระหว่างขั้น เพื่อลดความผิดพลาดในการ test จากความแตกต่างของสภาพแวดล้อมที่ใช้ในการ test
  • พี่จั๊วถามคำถามด้วยว่า ถ้าไปเจอปัญหาใน test ขั้นหลังๆ ควรทำอย่างไร เค้าก็ตอบว่าให้ไปเพิ่ม unit test ที่ครอบคลุมมากขึ้น