ผมได้มีโอกาสเข้าร่วมโปรแกรม 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 เป็น)แทน และคิดว่าใครหลาย ๆ คนอาจจะอยากลองลุยกับโปรแกรมและโครงการนี้ขึ้นมาบ้างนะครับ ปีหน้าอาจได้เจอกัน
Comments
จริงๆ ตอนแรกผมก็ว่าจะสมัครปีนี้ด้วยเหมือนกันนะ แต่ติดปัญหาเรื่องเรียนต่อ บลาๆ เลยต้องชวดไป ปีหน้าไม่มีอะไรแล้ว ยังไงก็ต้องสมัครให้ได้ครับ!
Yume Nikki
ลองดูครับ มีไอเดียให้เลือกทำเป็นร้อย ๆ คิดว่าคงมีซักอันที่น่าสนใจ และถ้าได้เข้าไปอยู่ใน community ก่อนก็จะยิ่งดีครับ
ดันพลาดไปเป็น mentor ซะตั้งแต่แรก จะกลับมาเป็น student ก็น่าเกลียด
ปีนี้สมัครไม่ผ่าน ปีหน้าก็หมดสถานะแล้ว T_T
เชื่อว่ามีคนอ่านจำนวนหนึ่ง อยากรู้แต่ไม่อยากถาม ผมเลยขอถามรายละเอียดในบางจุด
ออกตัวก่อนว่าผมเป็นคนที่ไม่มีเซ้นส์ในการตอบคำถามให้สนุก เนื้อหาเยอะ ๆ ก็อาจจะอ่านแล้วน่าเบื่อนิดนึงครับ
Groovy เป็นภาษา dynamic ที่รันบน Java Virtual Machine (JVM)
ซึ่งยืมลักษณะเด่นทางภาษาหลาย ๆ อย่างมาจาก Python, Ruby และคงความเข้ากันได้กับ Java ไว้
อาจมองได้ว่า Groovy เป็นภาษาทางเลือกซึ่งออกแบบมาเพื่อให้คนเขียน Java ได้รับรู้รสชาติของภาษา dynamic แบบไม่ต้องเรียนรู้มากนัก สำหรับเวบเฟรมเวิร์คตัวชูโรงบนภาษา Groovy คือ เกรลส์ (Grails) - ชื่อภาษาไทยโดย @bact ซึ่งทำงานในลักษณะเดียวกับ Rails แต่ห่อไลบรารี่หนัก ๆ อย่าง Spring กับ Hibernate ไว้เพื่อให้พัฒนาเวบได้ด้วยความรู้สึกเดียวกับ Rails (ผมปูพื้นเรื่องเกรลส์นิดหน่อยเพราะเกี่ยวกับคำตอบข้อสอง)
ผมเริ่มจากเล่น Groovy บ้างเล็กน้อย และด้วยความที่มันคล้ายและง่ายกว่าเมื่อมองจากมุมของ Java มา ก็เลยตามใช้ไปเรื่อย ๆ จนกระทั่งเกรลส์ออกมาก็ไปเข้าทีมพัฒนาปลั๊กอินของเกรลส์
ถัดมาอีกหน่อยก็เริ่มเอา Groovy มาใช้ทำงานวิจัย จากนั้นก็ขยับมาสร้าง Groovy AOP
จากตอนนั้นก็เริ่มคลุกคลีอยู่ใน developer เมล์ลิ่งลิสต์ของ Groovy (และ JRuby บ้าง)
หลัก ๆ เลยคืองานที่ทำอยู่ใช้ 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 ย่อมาจาก Just-In-Time เป็นคำที่มักใช้เพื่อสื่อถึงคอมไพเลอร์ (Just-In-Time Compiler) ที่อยู่ในตัวรันไทม์ เช่น JVM, .NET หรือ Flash Player เป็นต้น บางครั้งเรียกว่า dynamic compilation
ตัว JIT คอมไพเลอร์จะทำการแปลง intermediate language (bytecode, MSIL เป็นต้น - จำไม่ได้ว่าของ Flash เรียกว่าอะไร) เป็นภาษาเครื่องอีกทีก่อน และทำเรื่อย ๆ ระหว่างที่โปรแกรมทำงานอยู่ โปรแกรมบางส่วนที่ต้องทำบ่อย ๆ ก็อาจจะถูกคอมไพล์รอบสองรอบสาม และได้รหัสภาษาเครื่องที่เร็วขึ้น ๆ
พี่ใหม่พลังแรงสูงเกิน lol
ปกติผมอ่านบทความของพี่ใหม่แล้วต้องรวบรวมสมาธิมากนิดนึง เขียนเป็นภาษาไทยชัดๆแบบนี้ค่อยดีหน่อย :)
ถามต่อนะครับว่า หลายๆ คนในที่นี้ไม่ได้เรียนเอก ไม่ได้มีความรู้ทางทฤษฎีเยอะขนาดนั้น แต่ถ้าอยากสมัคร GSoC ด้วย จะต้องเจออะไรแบบนี้หรือเปล่า?
สมมติว่าถ้าเป็นเด็ก ม. ปลาย ไปสมัคร GSoC ของโครงการ Groovy งานที่ทำน่าจะเป็นอะไรได้บ้าง
ต้องไปดู GHOP ของ Groovy มั๊ง
ของ Groovy ผมยังไม่เห็นใน GHOP ครับ แต่ก็น่าดันเข้าไปนะ
สำหรับ Groovy โดยทั่ว ๆ ไปงานจะเป็นไปในทิศทางเดียวกันคือการสร้าง Groovy wrapper ห่อของที่มีอยู่ในโลกของ Java ให้สามารถใช้ได้ง่ายขึ้น
ปีที่แล้วก็เช่น SwingX Builder ซึ่งเป็นภาษา DSL ที่ทำให้เขียน GUI ได้ง่ายกว่าการใช้ภาษา Java (ใช้ร่วมกับ Swing Builder)
ปีนี้มี Groovy Science
เป็นตัวจัดการ math แบบ symbolic แก้สมการติดตัวแปรอะไรทำนองนั้น
ทั้งสองโครงการก็เป็นตัวอย่างที่มีขึ้นเพื่อดึงความเป็น dynamic ของภาษา Groovy ออกมาใช้
คารวะเพิ่มอีก 1 จอกแถมให้อีก 1 กลมเลยครับ
Sivadon Chaisiri (JavaBoom)
http://javaboom.wordpress.com
My Blog
ให้มาเป็นกลมนี่คงเมาละครับ แต่ถ้าให้จริงผมขอ Chardonnay ปี 2006 ละกันครับ lol
ด้วยความยินดีครับ ถ้ามาหาผมถึงถิ่นผมก็จัดให้ได้ครับ :)
Sivadon Chaisiri (JavaBoom)
http://javaboom.wordpress.com
My Blog
ไปเข้าทีมพัฒนาปลั๊กอินของเกรลส์ได้อย่างไรครับ
ตอนนั้นระบบปลั๊กอินของเกรลส์เสร็จใหม่ ๆ ช่วง รุ่น 0.4 เพิ่งออกครับ แล้วผมต้องใช้ SOAP ทำบางอย่างพอดี ก่อนหน้านั้นเอา XFire (SOAP stack ไม่ใช่เซิร์ฟเวอร์เกมนะครับ) ไปใช้ร่วมกับเกรลส์ไว้แล้วแต่ยังไม่ได้ทำเป็นปลั๊กอิน พอ 0.4 ออกก็เลยลองเขียนปลั๊กอินดู พอเขียนเสร็จผมก็เอาไปโพสต์ในเมล์ลิ่งลิสต์ของเกรลส์ครับ แล้ว เกรม รอชเชอร์ หัวหน้าโครงการของเกรลส์ก็เมล์มาหาบอกให้ไปสมัครเข้า Codehaus แล้วก็ตั้ง SVN repository ใหม่กัน
สำหรับคนที่อยากเข้าทีมปลั๊กอินของเกรลส์ก็ลองดูได้นะครับ สร้างตัวปลั๊กอินแล้วเอาไปโพสต์ดู และถ้าอยาก hack เกรลส์ตรง ๆ เลยผมก็พอมีไอเดียที่จะเล่าให้ฟังอยู่ครับ
ขอบคุณที่แชร์ประสบการณ์ในส่วนนี้ให้ฟังกันนะครับ
รบกวนเล่าไอเดียที่ว่าทีครับ
แล้วก็ขอบคุณสำหรับประสบการณ์ที่นำมาเล่าครับ :)
ได้เลยครับ
พอดีผมได้ลองอ่านโค้ดของ 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 เดียวกันครับ
คารวะพี่ใหม่หนึ่งจอก เขียนเป็นภาษาไทยอย่างงี้ค่อยยังชั่วได้ความรู้ดีขอบคุณครับ
ขอบคุณที่แชร์ประสบการณ์ให้รู้ครับ :)