เรื่องเล่าจากเด็กฝึกงาน Agoda มหากาพย์ฝึกงานอีกครั้งในชีวิต

#STORY#TECHNICAL

3 ส.ค. 2563

สวัสดีทุกคนนะครับ ห่างหายกับการเขียนบล็อกไปนานมาก ๆ บล็อกนี้เขียนเนื่องในโอกาสหลายอย่าง อย่างแรกคือได้ฝึกงานตามที่ภาคบังคับก็เลยจะมาเล่าให้ฟัง แต่อีกอย่างคือนี่เป็นบล็อกครบรอบสองปีที่เราเริ่มเขียนบล็อกนั่นเอง (เย้!) และบังเอิญที่บล็อกแรกก็เป็นเรื่องการฝึกงานซะด้วย นั่นก็คือ "เมื่อเด็กวิศวะคอมฝึกงานครั้งแรก" นั่นเอง ใครยังไม่อ่านก็ไปอ่านซะนะครับ และอย่างสุดท้ายคือฉลองบล็อก UtopiaBeam โฉมใหม่นั่นเอง (ปรบมือ!)

ว่าแล้วอย่ารอช้า มาเริ่มกันเลย

อินโทรดักชัน

ตามนโยบายของคณะคือต้องฝึกงานซัมเมอร์ ช่วงปีสามก็เลยหาที่ฝึกงานกันให้วุ่น โชคดีที่คณะจัดงาน CP Job Fair ให้บริษัทมาเปิดบูธรับสมัครถึงในคณะ ตอนนั้นยื่นไปหลายที่แต่สุดท้ายก็เลือกที่ Agoda เพราะอยากเขียน Scala...(ที่สุดท้ายก็ไม่ได้เขียน)

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

เรื่องที่แอบเสียวเล็กน้อยคือช่วง Covid-19 มาพอดีแล้ว Agoda layoff คนไปหลักพัน เลยกลัวว่าจะโดนเทซะแล้ว โชคดีที่เราเซ็นสัญญาไว้ก่อนแล้วก็เลยรอดไป

และเพราะเป็น Covid นั่นเองทำให้การฝึกงานครั้งนี้เป็นมหากาพย์เลยทีเดียว

ได้ทำอะไรบ้าง?

เราจะเล่าให้ฟังว่าแต่ละ sprint ได้ทำอะไรบ้าง

Agoda day 0

ก่อนจะเริ่มฝึกงานต้องไปรับคอมมาก่อน ที่นี่จะมีคอมให้คนละเครื่อง พร้อม privacy และ security ที่แน่นหนามาก ๆ เช่น ต้องใช้ internal network ในการทำงาน (รวมถึง github ด้วย), password เครื่องต้องยาวอย่างน้อย 10 ตัว(มั้ง?) แต่มีกฎยุบยิบไปหมด ซึ่งจริง ๆ มันก็เป็นเรื่องดีแหละ ไม่อยากจะโม้ว่าได้ macbook ซะด้วย ถึงจะรุ่นเก่านิดนึงก็เถอะ

Agoda day 1

agoda-internship-4

แน่นอนว่าเพราะโควิดก็เลยต้อง Work From Home ซึ่งบอกเลยว่าหายนะอย่างมาก จินตนาการว่าวันแรกยังไม่รู้อะไร แต่จะถามใครก็ยาก แถมโปรเจคที่ทำโค้ดใหญ่มากกกกกกกก ซับซ้อนไปหมด

ที่บอกไม่อยากจะโม้เรื่อง macbook เพราะมันไม่ใช่เรื่องดีเลย แต่เป็นความซวยด้วยซ้ำ เพราะโปรเจคนี้ใช้ C# .NET เวอร์ชันที่รันได้แต่บน Windows ทำให้ต้องลง VM แล้วก็ลง Visual Studio บน VM อีกที เวลาทำงานเสียงพัดลมก็จะดังหน่อย แต่เครื่องไม่ได้แรงตามนะ

เนื่องจากวันแรกยังมีอะไรต้องเรียนรู้อีกเยอะ บวกกับคอมยังทำงานไม่ได้ (รอลงโปรแกรม) ก็เลยนั่งเปิดดูคลิปที่ manager บอกให้ไปดูยาว ๆ และจะเป็นอย่างงี้ไปทั้ง sprint เลยด้วย

ทีมของเราทำงานกันแบบ scrum ยาวสองสัปดาห์ เริ่มวันอังคารจบวันจันทร์ เพราะฉะนั้นวันแรกก็เลยเป็นวันจบ sprint พอดี เป็นการประเดิมฝึกงานด้วย sprint review + retrospective ซะเลย

Sprint 1

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

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

ในที่สุด story แรกและอันเดียวใน sprint นี้ก็มาถึง ให้ integrate experiment ง่าย ๆ เล่าให้ฟังเร็ว ๆ experiment ก็คือ A/B Testing นั่นแหละ (ที่นี่มี internal tool สำหรับทำ experiment เลยนะ) แล้วตอนนี้คือมี experiment ที่ได้ผลไปแล้ว งานของเราก็คือลบโค้ดที่ไม่เกี่ยวออกให้หมด ให้เหลือแต่ variant ที่ชนะเท่านั้น

ตัว story ไม่ได้ยาก แต่ที่ยากคือ workflow ของทีม กว่างานของเราจะเสร็จต้องผ่านขั้นตอนมากมาย สร้าง JIRA ticket แล้วก็ทำงาน เสร็จแล้วก็เปิด PR แล้วก็เปิด ticket สำหรับ code review เสร็จแล้วก็ต้อง join merge queue อีก

พอจบ sprint ก็จะทำ sprint review กับ retrospective กัน สั้น ๆ คือ sprint review จะเน้นพูดถึงงานที่ทำใน sprint มีการ demo ให้คนในทีมและ PO ดู ส่วน retrospective จะพูดถึงการทำงานใน sprint เป็นหลักว่ามีอะไรที่ดีและอะไรที่ควรปรับปรุง

Sprint 1 มีแค่นี้แหละ ง่ายดี

Sprint 2

Story แรกที่หยิบมาทำใน sprint นี้คือ de-integrate experiment ซึ่งก็คล้ายกับอันแรกแหละไม่มีอะไร

ข่าวดีมาก ๆ ของ sprint นี้คือจะได้เข้า office วันที่ 22/6 ก็คือครึ่ง sprint หลังนั่นเอง พอได้เข้า office จริง ๆ แล้วรู้สึกเลยว่าทำงานง่ายขึ้นมาก ๆ แล้วก็ productive ขึ้นด้วย มีอะไรก็ลุกไปถามคนข้าง ๆ ได้เลย

agoda-internship-2

กลับมาที่ sprint กันต่อ หลังจาก de-integrate experiment เสร็จแล้วก็หยิบ story มาอีกอัน นั่นก็คือการ migrate Selenium ไป Puppeteer เรื่องมีอยู่ว่าที่นี่เขียนเทสกันอยู่แล้ว และตอนแรกใช้ Selenium C# ทำ e2e testing ทีนี้เค้าจะเปลี่ยนเป็น Puppeteer เพราะมัน(น่าจะ)เร็วกว่า ด้วยความที่ตัวเองไม่เคยเขียน e2e test เลยก็คิดว่ามันน่าสนใจดีนะ

ที่ไหนได้!!! story นี้มันยากมาก ๆ ด้วยเหตุผลว่า

  • PuppeteerSharp (Puppeteer ของ C#) doc น้อยมาก ๆๆๆ แทบจะไม่ได้ช่วยอะไรเลย สุดท้ายคือต้องไปแกะจากของ js แทน
  • e2e testing เป็นอะไรที่ random มาก รันสองรอบไม่ได้รับประกันว่าจะได้ผลเหมือนกัน
  • ต่อให้ใน local จะ work แล้วก็ยังพังบน CI/CD

สุดท้ายคือทำ story ไม่เสร็จ เพราะปรึกษากับทีมแล้วตกลงกันว่าน่าจะต้องแก้ใน sprint หลัง ๆ

MVP ของ sprint นี้ยกให้กับ debugger ไปเลย ใช้ตอนทำ Puppeteer ตลอด แต่ด้วยความที่รัน Visual Studio บน VM บน macbook เลยเสียเวลาทำ story นี้มาก ๆ รันครั้งนึงใช้เวลาเกือบครึ่ง ชม. แหน่ะ

Sprint 3

Sprint นี้โฟกัสที่ product ตัวใหม่ เรื่องรายละเอียดของ product ขอไม่พูดถึงละกัน แต่ sprint backlog มี story ของ product นี้เกือบทั้งหมด เราเองก็ได้ story ง่าย ๆ มาอันนึงคือการเพิ่มตัวเมนูนี้ในหน้าเว็บ

ตอนแรกนึกว่าจะได้จับ React หรือไม่ก็ RazorEngine (Template engine ของ .NET) ที่ไหนได้ เวลาเค้า render menu เค้าไปดึงมาจาก database ว่ามีอะไรบ้าง คล้าย ๆ MVC มั้ยนะ (ไม่แน่ใจแฮะ ใครรู้ช่วยบอกที) เอาเป็นว่าสิ่งที่ต้องทำคือส่ง email ไปหาทีมที่เกี่ยวข้องให้ไปสร้างเมนูเพิ่มใน database แล้วก็จะได้เมนูมาเลย

แต่ feature นี้จะยังไม่เปิดใช้ทันที ก็เลยต้องเขียนโค้ดให้ซ่อนเมนูนี้ไว้ก่อน แต่แค่นั้นมันจะไม่เท่พอ พี่ในทีมบอกว่าให้ครอบ experiment ไปด้วยเลย เพราะเวลาจะเปิดขึ้นมาก็แค่ไปเปลี่ยน variant แค่นั้น เป็นอะไรที่เบิกเนตรมากว่าใช้ A/B testing แบบเป็น toggle switch ก็ได้เหรอ

มีอีกสอง issue ที่หยิบมาทำเวลาคิดอะไรไม่ออกหรือรอ email เป็น issue ที่เกี่ยวกับ security เรื่องมีอยู่ว่าได้รับ report ว่าบางหน้ามีช่องโหว่ CSRF (Cross-site Request Forgery) จริง ๆ เป็น report เก่ามากแล้วแต่ยังไม่ได้ recheck งานของเราก็คือให้ทำตาม PoC attack ตามใน report แล้วก็แก้ซะ ทีนี้เหมือนมันมี story ที่แก้ตัวนี้ไปแล้วแต่ไม่ได้ track กัน issue สองอันนี้ก็เลยหายวับไปกับตา

Sprint 4

นี่เป็น Sprint สุดท้ายแล้ว เวลาช่างผ่านไปเร็วเหลือเกิน

ใน Sprint นี้ก็ยังยุ่งกับ prodcut ตัวเดิมซะเยอะ แต่เราไม่ได้จับตัว product นี้เลย งานแรกของเราคือช่วยพี่ QA ในทีมเทส server นึง แน่นอนว่าบริษัทระดับนี้ก็ต้องมีหลาย server เพื่อรองรับลูกค้าจากทั่วโลกล่ะนะ ทีนี้มีแผนจะเปิด server อีกที่ก็เลยต้อง manual test งานนี้ไม่ยากอะไร แต่เป็นแรงงานซะมากกว่า ว่าแล้วก็เปิด chrome console ดู error เสร็จแล้วก็เปิด subtask ใน JIRA แค่นั้นเอง

ของเล่นใหม่ที่ได้จับคือ Kibana ใช้เพื่อดู error log แหละ เพราะ error บางอันไม่ขึ้นบน UI และใน console ก็ต้องอาศัยมาดูใน Kibana เอา

และ Story สุดท้ายก็คือการ migrate couchbase เผื่อใครไม่รู้ Couchbase คือ Document-oriented NoSQL database นั่นเอง ทีนี้มันมีหลาย cluster แล้วเค้าอยากจะ free บาง cluster ให้ product อื่นเอาไปใช้ สิ่งที่ต้องทำคือแก้ config เล็กน้อยแค่นั้นเอง...

ปัญหาคือไอ้ config เล็กน้อยที่ว่ามันมีอยู่เต็มไปหมดเลยโว้ยยยยยย บางที่ก็ hard-coded เอาไว้ บางที่ก็อยู่ใน xml config แล้วก็ยังมี config อะไรไม่รู้ที่ไม่เข้าใจเลยซักนิด แต่สุดท้ายก็ซุย ๆ ไปจนเสร็จแหละ ผ่านไปได้ด้วยดี

ซะที่ไหนล่ะ หลังจาก deploy ไปซักพักปรากฏว่ามี alert มาว่า test failed รัว ๆ เลย มาทุก 15 นาทีทั้งวัน จนสุดท้ายต้อง revert change กลับ (ความดีงามของ version control system นะครับ) แต่ก็แก้ให้มันถูกใน sprint นี้ไม่ทันแล้ว

agoda-internship-3

Last 3 days

หลังจากจบ Sprint ที่แล้วและได้หยุดยาว 4 วันก็เหลือแค่ 3 วันสุดท้าย เนื่องจากเวลาน้อยมากก็ไม่ได้หยิบ story อะไรมาเพิ่มนอกจากใช้กรรมเก่า (แก้ config couchbase นั่นแหละ) รอบที่แล้วที่มันพังเพราะว่าแก้ config ไม่ครบแล้วมันน่าจะ conflict กันเอง รอบนี้เลยแก้มันให้หมดไปเลย

ก็หวังว่ามันจะไม่พังอีกนะ (แต่ถ้าพังเราก็ช่วยอะไรไม่ได้แล้วแหละ = =)

คอนคลูชัน

จบไปแล้วกับการร่ายยาวครบ 4 sprints จะเห็นว่างานส่วนใหญ่ไม่ได้เกี่ยวข้องกันเท่าไหร่แต่เน้นหลากหลาย บางงานมี technical challenge ที่น่าสนใจ (เช่น puppeteer) บางอันคือรู้อยู่แล้วแต่ไม่เคยทำจริง

ส่วนตัวรู้สึกอยากได้งานที่มี technical challenge มากกว่านี้ เพราะมันเป็นเหตุผลที่มาฝึกงานที่ Agoda เลย แต่เข้าใจว่าฝึกงานสองเดือนมันทำอะไรไม่ได้มากหรอก

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

สำหรับบล็อกนี้จบแค่นี้ก่อนนะครับ เหนื่อย!! (´Д`)ヾ

ปล. ตอนนี้พาร์ทต่อมาแล้วนะครับ เชิญอ่านที่นี่เลย

UtopiaBeam Ⓒ 2019-2023