Tags:
Node Thumbnail

ผมได้มีโอกาสเข้าร่วมโปรแกรม Google Summer of Code ปีนี้ โดยทำงานให้กับโครงการ Groovy ของ Codehaus

Google Summer of Code คือโปรแกรมส่งเสริมการพัฒนาซอฟต์แวร์เสรีที่ผลักดันด้วยทุนของกูเกิ้ล โดยผู้ที่สามารถจะเข้าร่วมโปรแกรมได้จะต้องมีสถานะเป็นนักเรียน/นิสิต/นักศึกษาในระดับใดก็ได้ตั้งแต่ปริญญาตรีจนถึงปริญญาเอก และทำงานให้กับองค์กรที่เข้าร่วมโครงการตลอดฤดูร้อน ซึ่งกินเวลาประมาณ 3 เดือน

เริ่มสมัคร

ตัวโปรแกรมจะแบ่งออกเป็น 3 ช่วง คือช่วงรับสมัคร และช่วงทำงานช่วงที่ 1 และ 2
ในช่วงรับสมัคร ผู้สมัครเข้าร่วมโปรแกรม จะเลือกงานจากข้อเสนอโครงการซึ่งมีองค์กรโอเพ่นซอร์สทั้งหลายมาเสนอไว้ ซึ่งแต่ละคนเลือกได้มากกว่าหนึ่งโครงการ และถ้าผู้สมัครได้รับเลือกจากหลาย ๆ โครงการ ก็จะมีการเรียงลำดับกันทีหลัง ซึ่งทำโดยทีมกูเกิ้ลและผู้ดูแลโครงการนั้น ๆ (mentor) ผมทำโครงการ Groovy Performance Tuning กับกิลโยม ลาฟอร์จ ซึ่งเป็นผู้จัดการโครงการของ Groovy จริง ๆ แล้วตัวข้อเสนอและไอเดียของโครงการนี้ผมร่างเองหมดแล้วก็ส่งให้กิลโยมเอาไป โพสต์ไว้ในหน้าข้อเสนอของ Groovy ซึ่งถ้าเรามีไอเดียมาเองและตัวองค์กรรับฟังแล้วนั้นก็จะไม่ค่อยมีปัญหาในการเข้าร่วมโปรแกรม ปีนี้ผู้ที่ผ่านมีประมาณ 1,100 คน โดยของ Codehaus นั้นใบสมัครผ่าน 7 และได้โควต้า 4 นั่นคือตัวข้อเสนออาจจะผ่านแต่ถ้าโควต้าขององค์กรนั้น ๆ ไม่พอเราก็จะไม่ได้เข้าร่วมโปรแกรม

เมื่อผ่านช่วงรับสมัคร ผู้สมัครก็จะเปลี่ยนสภาพเป็นผู้เข้าร่วมโครงการ(ผมจะเรียกว่านักเรียน) นักเรียนแต่ละคนก็จะได้รับอนุญาตให้เข้าร่วม private เมล์ลิ่งลิสต์ ซึ่งจะมีการโพสต์ข่าวสารเป็นระยะ ๆ จากผู้จัดการโปรแกรมจากกูเกิ้ล (เราเรียกเธอว่า LH) รวมทั้งมีกระทู้ไร้สาระมาเป็นระยะ ๆ จากเกรียนlnwทั้งหลาย

เมื่อผ่านช่วงแรกนักเรียนจะได้ 1. ของขวัญ ปีนี้เป็นหนังสือ Beautiful Code 2. บัตรเครดิตพร้อมเงินก้อนแรก จากกูเกิ้ล การ activate บัตรมีขลุกขลักเล็กน้อยเพราะต้องทำผ่านระบบโทรศัพท์อัตโนมัติ หลายคนรวมทั้งผม activate ด้วย Skype แต่บางคนบอกไว้ในลิสต์ว่าทำแล้วมีปัญหา ส่วนกระบวนการนำเงินจากบัตรออกมาใช้ก็ลำบากไม่แพ้กันเพราะชื่อบนบัตรไม่ใช่ชื่อตัวเราเองแต่เป็นคำว่า GSOC Student 2008 ดังนั้นการใช้บัตรซื้อของบนเวบไซต์หรือผ่าน Paypal ก็อาจจะมีปัญหา วิธีการที่ดีที่สุดคือการถอนเงินโดยตรงจากตู้ซึ่งค่าธรรมเนียมกูเกิ้ลจะเป็นคนจ่าย

จากนั้นก็จะเข้าสู่ช่วงทำงาน ช่วงการทำงานสองช่วงจะคั่นด้วยการประเมินกลางภาคและปิดท้ายด้วยการประเมินปลายภาค ถ้าไม่ผ่านการประเมินกลางภาคก็จบ ไม่ได้เงินก้อนที่สองและไม่ต้องทำต่อ แต่ถ้าผ่านมาได้ก็ได้เงินก้อนที่สองเข้าทางบัตรเครดิตเหมือนเดิม และถ้าผ่านการประเมินปลายภาคก็ได้อีกก้อนที่เหลือ โดยการประเมินว่าผ่านหรือไม่นั้นทำโดยผู้ดูแลโครงการซึ่งเราที่เป็นนักเรียน จะต้องติดต่ออยู่เรื่อยๆ เพื่อขอคำปรึกษาบ้าง รายงานผลความก้าวหน้าบ้างเป็นต้น ซึ่งปกติจะเป็นสัปดาห์ละครั้ง สำหรับของ Codehaus จะมีเมล์ลิ่งลิสต์อีกตัวไว้รายงานความก้าวหน้า ช่วงหลัง ๆ ผมใช้วิธีส่งผ่าน twitter แทน (โดยใช้ hashtag #gsoc)

ปัญหาที่เจอเป็นเรื่องทางเทคนิค

เรื่องเชิงสังคมไม่ค่อยมีปัญหาเพราะความคุ้นเคยกับชุมชนของ Groovy อยู่แล้ว ปัญหาใหญ่กลายเป็นเรื่องทางเทคนิคแทน เพราะระบบการ dispatch เมธอดของ Groovy ตัวใหม่นั้นเร็วระดับนึงอยู่แล้ว (เร็วกว่า JRuby เล็กน้อยบน shootout benchmarks) การแก้ปัญหาด้วยวิธีเดิมตามที่เตรียมไว้ (callsite caching) ไม่ทำให้เร็วมากขึ้นอย่างมีนัยสำคัญ ก็เลยจำเป็นต้องหาวิธีการใหม่ ระหว่างการค้นก็ไปรื้อบทความมาอ่านหลายชิ้นรวมทั้งงานวิจัยเบื้องหลัง tracemonkey ด้วย แล้วก็บังเอิญไปเจอว่างานเก่าที่ทำไว้นั้นสามารถเอามาแก้ให้ทำงานกับ Java 5 ได้ (ความเข้ากันได้กับ Java 5 เป็นข้อกำหนดเบื้องต้นของ Groovy 1.6) ก็เลยเอาเทคนิคการคอมไพล์แบบ Just-in-time ที่คิดไว้มาเขียนให้ใช้ได้กับระบบ callsite caching ใน Groovy 1.6

ก็เห็นอยู่บ้างเหมือนกันสำหรับบางคนที่มีปัญหากับผู้ดูแลโครงการ ซึ่งตรงนี้ถ้าหากแก้ไขเองไม่ได้ วิธีแก้ปัญหาคือแจ้งโดยตรงไปที่ LH เพื่อจัดการเจรจาหรือไม่ก็เปลี่ยนผู้ดูแลเป็นคนอื่นจากองค์กรเดียวกัน ผมเข้าใจว่าเป็นปกติของ Geek ที่จะโค้ดมากกว่าพูด บางทีบางครั้งจุดนี้ก็อาจจะเป็นข้อด้อยซึ่งผมเองก็เรียนรู้ที่จะสื่อสารให้มากขึ้นเช่นกัน อย่างไรก็ตามช่วงเวลาฤดูร้อนก็กำลังจะจบลงแล้วครับ ตอนนี้อยู่ในระยะประเมินปลายภาค และผลลัพธ์งานผมที่ได้จากเทคนิคการ JIT ก็ค่อนข้างน่าประทับใจ (อ่านต่อ)

สิ่งที่ได้

อาจจะสังเกตว่าผมไม่ได้ระบุเรื่องขอบเขตเวลาและเรื่องค่าตอบแทนที่ได้จากกูเกิ้ล เพราะอยากให้ไปหาอ่านต่อเองจากตัวโปรแกรม(หรือข่าวเก่าจาก sugree) สิ่งสำคัญที่ได้คือ 1. เสื้อยืด Google Summer of Code (สำคัญมาก) 2. การอนุญาตให้อ้างอิงกูเกิ้ลได้ใน Resume และ CV ในฐานะ work contractor 3. ประสบการณ์เข้าร่วมกับทีมโอเพ่นซอร์ส (สำหรับคนที่ไม่เคยเป็น contributor)

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

Get latest news from Blognone

Comments

By: KnightBaron
ContributoriPhoneAndroidRed Hat
on 24 August 2008 - 13:16 #62288
KnightBaron's picture

จริงๆ ตอนแรกผมก็ว่าจะสมัครปีนี้ด้วยเหมือนกันนะ แต่ติดปัญหาเรื่องเรียนต่อ บลาๆ เลยต้องชวดไป ปีหน้าไม่มีอะไรแล้ว ยังไงก็ต้องสมัครให้ได้ครับ!

Yume Nikki

By: cblue on 24 August 2008 - 22:43 #62326 Reply to:62288

ลองดูครับ มีไอเดียให้เลือกทำเป็นร้อย ๆ คิดว่าคงมีซักอันที่น่าสนใจ และถ้าได้เข้าไปอยู่ใน community ก่อนก็จะยิ่งดีครับ

By: sugree
FounderWriterAndroidBlackberry
on 25 August 2008 - 01:22 #62341

ดันพลาดไปเป็น mentor ซะตั้งแต่แรก จะกลับมาเป็น student ก็น่าเกลียด

By: mk
FounderAndroid
on 25 August 2008 - 01:56 #62342
mk's picture

ปีนี้สมัครไม่ผ่าน ปีหน้าก็หมดสถานะแล้ว T_T

By: mk
FounderAndroid
on 25 August 2008 - 02:40 #62345
mk's picture

เชื่อว่ามีคนอ่านจำนวนหนึ่ง อยากรู้แต่ไม่อยากถาม ผมเลยขอถามรายละเอียดในบางจุด

  1. Groovy คืออะไร?
  2. ไปรู้จักกับชุมชน Groovy ได้อย่างไร? คือถ้าเป็นคนใช้ธรรมดา มันไม่น่าจะไปรู้จักนักพัฒนาโครงการได้
  3. ทำไมถึงเลือกทำโครงการนี้ (performance tuning)
  4. มีความรู้พื้นฐานอยู่แล้วหรือเปล่า เท่าที่เขียนเห็นมีเทคนิคชื่อเท่ๆ หลายอัน รู้เรื่องพวกนี้มาจากไหน
  5. อะไรคือ JIT
By: cblue on 25 August 2008 - 05:48 #62348 Reply to:62345

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

Groovy คืออะไร?

Groovy เป็นภาษา dynamic ที่รันบน Java Virtual Machine (JVM)
ซึ่งยืมลักษณะเด่นทางภาษาหลาย ๆ อย่างมาจาก Python, Ruby และคงความเข้ากันได้กับ Java ไว้
อาจมองได้ว่า Groovy เป็นภาษาทางเลือกซึ่งออกแบบมาเพื่อให้คนเขียน Java ได้รับรู้รสชาติของภาษา dynamic แบบไม่ต้องเรียนรู้มากนัก สำหรับเวบเฟรมเวิร์คตัวชูโรงบนภาษา Groovy คือ เกรลส์ (Grails) - ชื่อภาษาไทยโดย @bact ซึ่งทำงานในลักษณะเดียวกับ Rails แต่ห่อไลบรารี่หนัก ๆ อย่าง Spring กับ Hibernate ไว้เพื่อให้พัฒนาเวบได้ด้วยความรู้สึกเดียวกับ Rails (ผมปูพื้นเรื่องเกรลส์นิดหน่อยเพราะเกี่ยวกับคำตอบข้อสอง)

ไปรู้จักกับชุมชน Groovy ได้อย่างไร? คือถ้าเป็นคนใช้ธรรมดา มันไม่น่าจะไปรู้จักนักพัฒนาโครงการได้

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

ทำไมถึงเลือกทำโครงการนี้ (performance tuning)

หลัก ๆ เลยคืองานที่ทำอยู่ใช้ Groovy และมันยังเร็วได้ไม่ถูกใจ เลยต้องทำเอง(ก็เข้าแนวคิด do-it-yourself) เพราะจะเอา Groovy ไปใช้ทำงานด้าน High Performance Computing เนื่องจากความง่ายเชิงภาษาในลักษณะเดียวกับ Python และ idiom ทางภาษาที่ตนเองคุ้นเคยกว่า รวมทั้งคุ้นเคยกับ Java bytecode มาแล้วในระดับนึง

แรงบันดาลใจอีกส่วนคือ Python Psyco ที่ให้ความเร็วที่เหลือเชื่อ เลยคิดว่าเราก็น่าจะทำให้ Groovy เร็วขึ้นได้บ้าง

มีความรู้พื้นฐานอยู่แล้วหรือเปล่า เท่าที่เขียนเห็นมีเทคนิคชื่อเท่ๆ หลายอัน รู้เรื่องพวกนี้มาจากไหน

ศึกษาเอาระหว่างเรียน ป. เอก (ยังไม่จบ)
แรกสุดเลยเมื่อ 3 ปีก่อนไม่ได้ตั้งใจจะทำทางด้านนี้ เริ่มจับด้าน Aspect-Oriented Programming เป็นหลัก พออ่านไปทำไปเริ่มเข้าใจว่าข้อจำกัดบางอย่างแก้ไขไม่ได้ด้วยหลักการทางวิศวกรรมซอฟต์แวร์ (SE) อย่างเดียวแต่เกี่ยวข้องกับภาษาและตัวรันไทม์ (ในที่นี้คือภาษา Groovy และ JVM)
สุดท้ายก็วกกลับมาที่เดิมเพราะไปเจอว่ามันคือแนวคิดทาง SE ที่แฝงอยู่ในตัวภาษา dynamic ที่หายังไงก็จะหาไม่เจอใน C หรือ Java

คำเช่น dispatch, callsite, callsite caching และ trace เป็นศัพท์เฉพาะที่เจอได้ในงานทางด้านรันไทม์

อย่าง dispatch จริง ๆ แล้วคือการที่ a เรียกใช้ (call) b

จุด a เรียกใช้ b ก็เรียกกันว่า call site (แปลตรงตัว)

มีการเติม caching เข้ามาเพราะว่าเป็นกลไกที่ใช้เพิ่มความเร็วของจุดดังกล่าว

ส่วน trace เป็นเทคนิคอีกเรื่องนึงที่เพิ่งเกิดขึ้นไม่นาน ตามอ่านได้จากลิงค์ที่ให้ไว้ครับ

อะไรคือ JIT

JIT ย่อมาจาก Just-In-Time เป็นคำที่มักใช้เพื่อสื่อถึงคอมไพเลอร์ (Just-In-Time Compiler) ที่อยู่ในตัวรันไทม์ เช่น JVM, .NET หรือ Flash Player เป็นต้น บางครั้งเรียกว่า dynamic compilation
ตัว JIT คอมไพเลอร์จะทำการแปลง intermediate language (bytecode, MSIL เป็นต้น - จำไม่ได้ว่าของ Flash เรียกว่าอะไร) เป็นภาษาเครื่องอีกทีก่อน และทำเรื่อย ๆ ระหว่างที่โปรแกรมทำงานอยู่ โปรแกรมบางส่วนที่ต้องทำบ่อย ๆ ก็อาจจะถูกคอมไพล์รอบสองรอบสาม และได้รหัสภาษาเครื่องที่เร็วขึ้น ๆ

By: moniguna on 25 August 2008 - 14:12 #62377 Reply to:62348

พี่ใหม่พลังแรงสูงเกิน lol
ปกติผมอ่านบทความของพี่ใหม่แล้วต้องรวบรวมสมาธิมากนิดนึง เขียนเป็นภาษาไทยชัดๆแบบนี้ค่อยดีหน่อย :)

By: mk
FounderAndroid
on 25 August 2008 - 22:58 #62409 Reply to:62348
mk's picture

ถามต่อนะครับว่า หลายๆ คนในที่นี้ไม่ได้เรียนเอก ไม่ได้มีความรู้ทางทฤษฎีเยอะขนาดนั้น แต่ถ้าอยากสมัคร GSoC ด้วย จะต้องเจออะไรแบบนี้หรือเปล่า?

สมมติว่าถ้าเป็นเด็ก ม. ปลาย ไปสมัคร GSoC ของโครงการ Groovy งานที่ทำน่าจะเป็นอะไรได้บ้าง

By: sugree
FounderWriterAndroidBlackberry
on 26 August 2008 - 00:11 #62419 Reply to:62409

ต้องไปดู GHOP ของ Groovy มั๊ง

By: cblue on 26 August 2008 - 01:16 #62431 Reply to:62419

ของ Groovy ผมยังไม่เห็นใน GHOP ครับ แต่ก็น่าดันเข้าไปนะ

By: cblue on 26 August 2008 - 01:08 #62428 Reply to:62409

สำหรับ Groovy โดยทั่ว ๆ ไปงานจะเป็นไปในทิศทางเดียวกันคือการสร้าง Groovy wrapper ห่อของที่มีอยู่ในโลกของ Java ให้สามารถใช้ได้ง่ายขึ้น
ปีที่แล้วก็เช่น SwingX Builder ซึ่งเป็นภาษา DSL ที่ทำให้เขียน GUI ได้ง่ายกว่าการใช้ภาษา Java (ใช้ร่วมกับ Swing Builder)

ปีนี้มี Groovy Science
เป็นตัวจัดการ math แบบ symbolic แก้สมการติดตัวแปรอะไรทำนองนั้น

ทั้งสองโครงการก็เป็นตัวอย่างที่มีขึ้นเพื่อดึงความเป็น dynamic ของภาษา Groovy ออกมาใช้

By: javaboom
WriteriPhone
on 25 August 2008 - 23:26 #62414 Reply to:62348
javaboom's picture

คารวะเพิ่มอีก 1 จอกแถมให้อีก 1 กลมเลยครับ

Sivadon Chaisiri (JavaBoom)
http://javaboom.wordpress.com


My Blog

By: cblue on 26 August 2008 - 01:13 #62430 Reply to:62414

ให้มาเป็นกลมนี่คงเมาละครับ แต่ถ้าให้จริงผมขอ Chardonnay ปี 2006 ละกันครับ lol

By: javaboom
WriteriPhone
on 26 August 2008 - 13:20 #62461 Reply to:62430
javaboom's picture

ด้วยความยินดีครับ ถ้ามาหาผมถึงถิ่นผมก็จัดให้ได้ครับ :)

Sivadon Chaisiri (JavaBoom)
http://javaboom.wordpress.com


My Blog

By: snck
iPhoneAndroidUbuntu
on 26 August 2008 - 22:27 #62501 Reply to:62348

ไปเข้าทีมพัฒนาปลั๊กอินของเกรลส์ได้อย่างไรครับ

By: cblue on 26 August 2008 - 23:19 #62505 Reply to:62501

ตอนนั้นระบบปลั๊กอินของเกรลส์เสร็จใหม่ ๆ ช่วง รุ่น 0.4 เพิ่งออกครับ แล้วผมต้องใช้ SOAP ทำบางอย่างพอดี ก่อนหน้านั้นเอา XFire (SOAP stack ไม่ใช่เซิร์ฟเวอร์เกมนะครับ) ไปใช้ร่วมกับเกรลส์ไว้แล้วแต่ยังไม่ได้ทำเป็นปลั๊กอิน พอ 0.4 ออกก็เลยลองเขียนปลั๊กอินดู พอเขียนเสร็จผมก็เอาไปโพสต์ในเมล์ลิ่งลิสต์ของเกรลส์ครับ แล้ว เกรม รอชเชอร์ หัวหน้าโครงการของเกรลส์ก็เมล์มาหาบอกให้ไปสมัครเข้า Codehaus แล้วก็ตั้ง SVN repository ใหม่กัน

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

By: snck
iPhoneAndroidUbuntu
on 27 August 2008 - 00:21 #62511 Reply to:62505

ขอบคุณที่แชร์ประสบการณ์ในส่วนนี้ให้ฟังกันนะครับ

By: Solotov on 27 August 2008 - 01:20 #62517 Reply to:62511

รบกวนเล่าไอเดียที่ว่าทีครับ

แล้วก็ขอบคุณสำหรับประสบการณ์ที่นำมาเล่าครับ :)

By: cblue on 27 August 2008 - 02:49 #62525 Reply to:62517

ได้เลยครับ

พอดีผมได้ลองอ่านโค้ดของ Apache OFBiz (ระบบ ERP ที่ @pphetra อยู่ในทีมนึงที่ fork มาทำต่อ ดูได้ที่ Codenone Projects) แล้วเคยจะลองพอร์ตมาเป็นเกรลส์ทั้งก้อน ระหว่างทดลองพอร์ตก็เจอว่าระบบ domain class ของเกรลส์ (ถ้าคุ้นเคยกับ Rails ให้นึกถึง ActiveRecord ไว้นะครับ) ซึ่งสร้างบน Hibernate นั่นไม่สนับสนุนการทำ view (ในมุมของ database คือ joined tables) แต่ตัว Hibernate จริง ๆ แล้วทำได้ เป็น feature ที่เรียกว่า subselect

feature นี้มี impact พอสมควรกับตัวเกรลส์ ซึ่งก็แปลว่า patch อาจจะเข้าไปอยู่ในเกรลส์ได้ไม่ยากนัก

ผมขอพูดถึงจุดที่น่าสนใจคร่าว ๆ นิดนึงเพื่อเป็นแนวทางให้พอจะเริ่มต้นได้
1. อ่านกลไกการทำ subselect ของ Hibernate
2. อ่านการเขียน mapping Hibernate ในเกรลส์ เริ่มแกะได้จากคลาส org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder และคลาสใน package เดียวกันครับ

By: vi on 25 August 2008 - 11:01 #62367

คารวะพี่ใหม่หนึ่งจอก เขียนเป็นภาษาไทยอย่างงี้ค่อยยังชั่วได้ความรู้ดีขอบคุณครับ

By: IceDagger on 26 August 2008 - 02:27 #62433

ขอบคุณที่แชร์ประสบการณ์ให้รู้ครับ :)