บทความนี้จะมาเขียนเป็นที่ระลึกไว้ว่าเคยพยายามจะสมัครงานกับบริษัท Line ใช่ app Line ที่ใช้ส่งสวัสดีวันจันทร์กันอยู่เนี้ยแหละ โดยบทความนี้จะเล่าเท่าที่จะเล่าได้นะครับ เพราะแต่ละรอบนั้นความรู้สึกไม่เหมือนกันครับ เอาล่ะไปอ่านกันเลย
คุณสามารถช่วยเหลือโดยไม่ต้องจ่ายเงินผมได้ด้วยการสมัครรับข่าวสารที่ด้านล่างของบทความ นั่นจะช่วยเหลือผมได้มาก ผมสัญญาว่าจะส่งบทความที่เป็นประโยชน์แก่คุณทุกครั้งที่ส่งไปให้ครับ
ทำ resume และรอลุ้น
ตอนแรกผมเริ่มจากไปเจอบทความเกี่ยวกับการรับสมัครงานแบบเร่งด่วนของ Line ครับ โดยมีตำแหน่งงานเยอะมากๆ ตอนที่ไปเจอนั้นผมเหลือเวลาอีก 8 วันกับ resume ที่ยังไม่ได้ทำเลยพอเห็นช่วงนี้ก็ว่างๆจากงาน กำลังหางานใหม่อยู่เลยก็อยากลองสมัครดู เหตุผลเพราะว่าผมไล่อ่านบทความของคนในไลน์นั้นคือ แบบทุกคนพยายามจะพัฒนาตัวเองและแชร์เรื่องราวที่ตัวเองรู้ ผมก็ชอบสิ่งแวดล้อมแบบนี้มากๆ ก็เลยอยากเข้าไปทำงานดู เพราะคิดว่าจะมีอะไรให้เราได้เรียนรู้และสิ่งแวดล้อมที่ดีจะทำให้เราอยากเรียนรู้มากยิ่งขึ้นไปอีก
พอคิดได้อย่างนั้นผมก็ต้องไปนั่งทำ resume เลยผมใช้ เครื่องมือชื่อว่า casva นะครับคิดว่าหลายๆคนก็ใช้เครื่องมือนี้พอดีผมเพิ่งจะจ่ายเงินซื้อแบบ pro มาก็ถือว่าได้ใช้งานได้ดี ราคาไม่แพงนะครับ แนะนำซื้อมาใช้เถอะสะดวกมากๆ ผมไล่หา template ที่เหมาะสมแล้วก็พยายามกรอกข้อมูลเท่าที่จำเป็นและสำคัญครับ
อันนี้ตัวอย่างนะครับ โดยผมก็ปรับเปลี่ยนบางอย่าง เพิ่มลดอะไรก็ว่าไป โดยหลักๆจะเป็นพวก skill ที่เราทำได้และก็การสรุปกับงานที่ทำ ประมาณนั้นผมใส่ทั้งหมดที่ผมนึกออกไปเลยทั้งด้าน hard/soft skill ครับ ไม่เคยอยากได้งานเท่านี้มาก่อน ฮ่าๆ
หลังจากส่งไปก็ต้องรอ อีก 1 สัปดาห์ครับระหว่างนี้ก็คิดว่าอาจจะไม่ได้ชัวร์ ไม่รู้ทำไมชอบคิดว่าตัวเองไม่เก่งขนาดนั้น ก็แค่พอทำได้ พอทำให้ผ่านได้ แต่ไม่ได้สุดในใจก็กลัวว่าเด็กรุ่นใหม่เก่งกว่าเราตั้งเยอะ คิดไปเรื่อยเปื่อย ก็รอ รอ รอ … ผ่านไปเขาประกาศผลวันที่ 6 ก็คือวันเสาร์ครับ เช้าวันเสาร์ตื่นมาเจอ mail ฉบับหนึ่งจาก Line
ตอนอ่านยังไม่เชื่อเลยว่าผ่านเอาจริงๆ แล้วก็อ่านต่อว่าต้องทำการบ้านด้วย ให้เวลาถึงวันจันทร์ (23:59) ตอนอ่านคือบ่ายวันเสาร์คือ แบบทั้งดีใจและตกใจในเวลาเดี๋ยวกันเพราะว่าแม่งน่าได้อ่านเร็วกว่านี้จะได้รู้ว่าการบ้าน ทำยังไงและใช้เวลาเท่าไรดี
รอบที่ 2 the assignment การบ้าน
ถ้าใครอ่านหัวข้อเมลจากตะกี้จะรู้ว่าผมได้ถูกทดสอบตำแหน่ง Solution Engineer (Frontend) เอาจริงๆ ช่วงหลังๆคือแทบไม่ได้แตะ Backend เหมือนกันแต่เข้าใจพวก Login นะเพียงแต่เครื่องมืออาจจะไม่คล่อง และผมก็เองก็ใส่ตอนเหลือไปตอนแรกด้วยว่าเอา Frontend ก่อนถ้าไม่ได้ก็เอา Backend ทาง Line ก็คงเลือกให้เอา Frontend ไปแล้วกัน
โดยในอีเมลดังกล่าวนั้นมีให้ 4 ไฟล์นะครับ
- ไฟล์แรกเกี่ยวกับกำหนดการณ์ต่างๆเช่น วันเวลาที่จะประกาศ ถ้าผ่านแต่ละรอบ และต้องทำอะไรอย่างไรบ้าง
- ไฟล์ที่สองเกี่ยวกับการทดสอบของ Backend คือทาง Line ไม่ติดถ้าเราจะทำทั้ง Front/Back-end แต่เวลามันน้อยจริงๆ สำหรับผมนะครับ ท่านอื่นอาจจะทำทัน
- ไฟล์ที่สามเป็นไฟล์ wireframe สำหรับให้ frontend เปิดดูไปตอน coding
- ไฟล์สุดท้ายเป็นไฟล์ที่เป็นรายละเอียดทั้งหมดของการบ้านโดยจะรวมทั้ง Front/Back เลย
มาดูการบ้านกันดีกว่า ณ ตอนที่บทความออกไปคิดว่าน่าจะจบการสัมภาษณ์แล้วถ้าบทความนี้ไปไกลเท่าไรก็แปลว่าถึงรอบเท่านั้นนะครับ โดยการบ้านคือ สร้าง application ให้เลือกตั้ง ( ณ ตอนนี้ที่เขียนบทความคือใกล้จะเลือกตั้งผู้ว่า กทม. คนใหม่พอดี ) คิดว่าโจทย์น่าจะเปลี่ยนไปตามกระแสนะครับ โดยตัวโจทย์จะเอาพวกตัวละครจาก Line ดำเนินเรื่องผมจะเล่าคราวๆแล้วกัน
โจทย์คือ: ให้สร้างโปรแกรม UI สำหรับเลือกตั้งนายกเทศมนตรีของเมือง Line โดยเงื่อนไขต้องมีดังนี้
- ต้องมีหน้าแสดงผู้สมัครทั้งหมด โดยแสดงรายละเอียดข้อมูลให้ครบ ทั้งชื่อ รูป คะแนน เป็นต้น และมีสรุปคะแนนด้วย
- User ต้องสามารถใช้ application นี้ในมือถือได้ ( จริงๆตรงนี้ก็คือ responsive อ่ะนะ )
- ต้อง รับ/ส่ง ค่าผ่าน GraphQL
- เมื่อเปิดให้ โหวต user สามารถโหวตคนที่ต้องการได้
- ถ้าโหวตแล้วจะไม่สามารถเลือกได้อีก ( ทุกครั้งที่โหวตต้องใช้บัตรประชาชนเลือก )
- ตัวเลขของการ vote ต้องเห็นแบบ realtime
- เมื่อทำการปิดโหวตจะไม่มี user ไหนโหวตได้อีกและหน้าโหวตถูกคำนวน score และแสดงว่าใครได้เป็นนายกเทศมนตรี
- unit test ต้องมีโดยเฉพาะตรงที่มี logic ซับซ้อน
อ่านโจทย์คุณคิดว่าทำกี่วันเอางี้ดีกว่า …. ตอนผมอ่านคือมีเวลาประมาณ 2 วันครึ่ง ผมคิดว่ามันน่าจะเขียนเสร็จใน 2 วันแล้วจะใส่พวก feature เพิ่มเติมตามสะดวกเขาว่าเป็นโบนัส
ส่วนการบ้านฝั่ง Backend คือแทบไม่ได้อ่านเหตุผลเพราะว่ามันไม่ทันแน่ๆ ถ้าทำทันคือต้องใช้เครื่องมือถนัดมากๆ ส่วนผมอ่ะหรอ เป็นเป็ดอ่ะครับ ทำได้หมดแต่ไม่ลงลึก แต่เท่าที่จำได้คือ ทำโปรเจ็คเดียวกันแต่เป็นฝั่งหลังบ้าน ต้องรองรับการโหวตพร้อมๆกันทำนองนั้น
โอเคหลังจากคุณอ่านดูแล้ว 8 ข้อคิดว่ายังไง ? ทำทันใช่ไหม … ตอนผมอ่านอ่ะคิดว่าสบาย แต่ผมติดอยู่ 2 ข้อคือ ข้อ 6,8 บอกตามตรงเลยว่า เรื่อง realtime ผมเคยเขียนมาบ้าง แต่ไม่เคยทำต่อกับ graphQL ด้วยแล้วอีกเรื่องคือเรื่อง unit test ใน react คือทำน้อยมากเรียกว่าแทบไม่ได้ทำเลย คือรู้ว่าทำยังไงแต่วิธีในการเขียนอ่ะ ไม่เคยแล้ว เครื่องมือสำหรับเรื่องนี้คือเยอะมากๆ เลือกไม่ถูก
ผมเลยคิดในใจแล้วว่าจะเพื่อเวลาทำให้เสร็จหน้า UI ทั้งหมดในวันแรก ตั้งแต่ตื่นนอนยาวไปเกือบเช้ากะว่าเอาให้เสร็จเลยแค่ส่วน UI อย่างเดียว แล้วค่อยไปต่อกับ GraphQL ในวันที่ 2 และวันที่ 3 ผมกะจะเติมพวก feature ว้าวๆในวันสุดท้าย
3. วันแรกเริ่มบ่าย … จบตีสี่
ผมเลือกใช้เครื่องมือสำหรับการสร้างเว็บ คือ NextJS เหตุผล ? เพราะเคยเขียนทั้ง Vue และ React แต่ชอบ React มากกว่าแค่นั้น 5555 เอาจริงคือถนัดด้วยแล้วคิดว่าตัว NextJS มันมี function หลายๆอย่างที่ชอบด้วย ( นี่คือการตัดสินใจที่ผิดมหันต์มากๆ เตรียมอ่านในตอนหลังได้เลย ) แล้วตัว CSS ผมเลือก Tailwind อันนี้ชอบส่วนตัวเพราะผมจำ class css ได้เยอะอยู่ขี้เกียจไปนั่งเขียน css แยกก็เลยใช้ tailwind
ผมเริ่มเขียนหน้าแรกก่อน โดยหลักๆจะเป็นเรียก Card มาแสดง แต่ก่อนจะเริ่มทาง Line ได้มี github ของ backend มาให้ผมด้วย โดยสามารถ git clone แล้วรัน docker-compose up เลยจบเหมือนจะดีใช่ไหม ? ทีนี้ผมก็ทำตามขั้นตอนแล้วลองยิงเทสดูจาก ตัวอย่างที่ทาง repo ให้มาทดสอบรันทุกอย่างโอเค ยิงเข้าด้วยตัว playground ที่เขาทำมาให้ ทดสอบยิง graphQL get all candidates ก็ได้ ลองยิงเปิด event ก็ทำงานก็เลยคิดว่าไม่น่ามีปัญหา
ได้งานมาก็พยายามแตกเป็น task เล็กๆอะไรต้องเสร็จก่อนหลัง
วันแรกผมก็ทำ UI หน้า List โดยแต่ละ List ก็มีแสดงรายละเอียดต่างๆของผู้สมัครและก็ถ้ามี event open เมื่อก็จะมีปุ่ม vote ให้กด เมื่อกดก็จะมี Modal ขึ้นมาให้กรอกบัตรประชาชน แล้วก็เช็คว่าเคย โหวตไปหรือยัง ถ้าเคยแล้วก็แจ้งเตือนว่าใช้ idcard อันนี้ไปแล้ว พอจะเห็นภาพใช่ไหมครับ
ตอนแรกกะว่าจะทำหลายหน้าแบบกดแล้วเปลี่ยนหน้าเพราะเท่าที่อ่านตอนเขาบอกว่าโบนัสถ้าเราสลับหน้าแล้วกลับมา scroll bar อยู่ที่เดิมก็ถือว่าเป็นการเพิ่ม UX ที่ดีด้วยซึ่งก็จริง แต่ผมเลือกทำเป็น modal เพราะมันจบในหน้าเดียวไม่ต้องมีหลายหน้า และผมก็คิดว่าจะเก็บ idcard ไว้ใน localStorage แล้วช่วยหลังบ้านเช็คด้วยในตัว ว่า idcard นี้เคยใช้แล้ว จะได้ไม่ต้องยิงไปหลังบ้านครับ
ตัวระบบมี status มี 3 สถานะหลักๆคือ idle, open, close ตอน idle คือให้ดูรายละเอียดแต่ไม่มีให้โหวต ตอน open ก็มีปุ่มให้โหวตแล้วตอน close ก็สรุปผลของแต่ละคนพร้อมกันบอกว่าใครได้เป็นเทศมนตรี เพิ่งมานึกออกตอนเขียนบทความนี้ว่า ตอน close แล้วมันเปิดโหวตได้ใหม่แล้วดันไม่ได้ clear ค่าใน localStorage ฮ่าๆๆ (หัวเราะทั้งน้ำตา)
ผมใช้วิธีไปยิง get list เอาค่าที่ได้มาใส่ไว้เป็น mock data ไว้ก่อนเลย แล้วตอนยิงจริงเราแค่มาทำต่อกับ api จบ อันนี้เป็นแบบที่ผมทำบ่อยเลยคือ จะเอาค่าที่ยิงมาก่อนทำมาเป็น mock data รอไว้เลยแล้วต่อทีหลังมันง่ายกว่าไปนั่งยิงจริงกว่าจะทำนู้นนี่เสียเวลา แล้วผมก็เพิ่งพวก function สำหรับเช็ค idcard ด้วย แล้วช่อง idcard ก็ต้องไม่ให้ใส่อักษรได้อีก เรื่องมันจุกจิ๊กนะเอาจริงๆเรื่อง frontend เนี้ย กดปุ่มแล้วต้อง auto focus อะไรพวกเนี้ยโดนติได้ง่ายๆเลยนะ ถ้าเจอคนเนียบ
นั่งเติมตรงนู้นตรงนี่ เปลี่ยนสี เปลี่ยนขอบ เก็บตรงนั้นตรงนี่ เผลอแปปเดียวตีสี่ …. คือแบบเร็วมากๆปกติใช้เวลาอย่างชิลเลยกว่าจะถึงตีสี่ อันนี้คือเพลินมาก แบบอยากจะใส่อันนู้นอันนี่สนุกจัดเลยทำเพลินแต่ก็เสร็จครบตามที่พี่คิดไว้ UI เกือบทุกอย่างเสร็จหมด โดยวางแผนในใจว่าวันที่ 2 เดี๋ยวจะเก็บเรื่องต่อเข้ากับ api จริง
วันที่ 2 เรียนรู้ ยอมรับ เติบโต
สวัสดีบ่ายวันที่ 2 ผมค่อนข้างชัวร์ในใจแล้วน่าจะทำเสร็จทันแบบชิลๆแล้ว ไม่มีปัญหาอะไรเพราะถ้าต่อกับ api ที่เหลือวันนี้ก็เก็บพวกรายละเอียดต่อแล้วก็อาจจะทำพวก feature เล็กๆน้อยๆ เช่น filter , search หรือโชว์ ui อะไรเพิ่มเติมให้สะดวกกับการใช้งาน ผมเริ่มจากการ GET candidates ให้ได้ List มาคราวนี้ก็ถึงเวลาของ Apollo เป็น package สำหรับติดต่อกับ graphQL ถ้านึกไม่ออกก็พวก Axios ไม่ก็ Fetch นั่นแหละเหมือนกันแต่ตัว GraphQL ตอนต่อมันก็มีวิธีของมัน
ลอง set up ตาม doc มันก็เอ่อแฮะ … ไม่ยากเท่าไร เรียกได้แล้วก็ลอง react hook บอกตรงๆผมยังไม่ชินการใช้งานซักที พอเขียนๆแล้วรู้สึกอยากหา project มาทำ react ให้มากขึ้นแล้วจริงๆ ผมอ่ะเขียนได้นะ แต่พวก syntax react มันเปลี่ยนบ่อยมาก ผมชอบอันเก่ามากกว่าแต่พอใช้พวก react hook ก็คิดว่ามันก็โอเคแค่ไม่ชิน ไม่คล่องเหมือนแต่ก่อนที่เราคุ้นเคยก็แค่นั้น
พอเรียก list ได้เสร็จก็คิดว่าเออไม่น่าแย่เท่าไรแฮะ แต่ … ชีวิตไม่มีอุปสรรคจะเรียกว่าการใช้ชีวิตหรอ ถูกไหมครับ ? ปัญหาก็มาเยือนจนได้ พอเรียก List ไม่มีปัญหา คราวนี้ตอนจะ vote ถ้าคนไม่เคยใช้ graphQL มันคือการยิง POST อ่ะ แต่ใน graphQL มันเรียกว่า mutation พร้อมกับต้องแนบ header authorization เป็น idcard ไปด้วย ปัญหาคือ ใน apollo ทำยังไงวะครับ …. ? ทำไม่เป็นเสียเวลาอีก
พอเริ่มหาทางทำได้แล้วว่ายิงยังไงปัญหาต่อมาคือ ติด CORS ใช่ครับ Backend ที่เขาเตรียมมาให้ผมแม่งติด CORS ผมก็ไม่รู้จะแก้ไขยังไงเพราะว่าหลังบ้านเป็นภาษา GO ผมไม่เคยเขียนแต่เขาไปอ่าน code มันพอจะเดาๆได้แหละว่าเขาก็เขียนรองรับทุก origin แล้วลองเทสใน playground มันก็ยิงเข้า ( อันนี้มันยิงเข้าอยู่แล้วเพราะว่า origin เดียวกัน ) ผมลองเช็คใน inspect แล้วมันก็ allow หมดนะก็งงทำไมไม่ได้น้า … ก็เลยลองเทสด้วย hoppscotch อารมณ์มันคล้ายกับ postman แต่มันจะเรียกในรูปแบบของ browser ผมลองยิงไม่ได้ติด CORS เหมือนกัน
ผมติดปัญหาเรื่องนี้ตั้งแต่ช่วงบ่าย 3 ไปจนเกือบเที่ยงคืน คือพยายามจะแก้ไข แล้วก็โทรถามเพื่อนเพราะคิดว่าตัวเองอาจจะรู้ไม่หมดหรือเปล่า ถามคนที่รู้ GO ก็ไม่ได้นั่งคุยกับเพื่อนตามหาว่าเป็นเพราะอะไรเพื่อนก็แนะนำ hoppscotch มานั่นแหละถึงชัวร์แหละว่าติด CORS แน่ๆ เพราะตอนแรกคิดว่าเลือกใน apollo แล้วมันส่งค่าไม่ถูกหรือเปล่า พยายามจะแก้ไขไฟล์ GO แล้วสั่งรันใหม่อีกรอบแต่ก็ยังไม่ได้อยู่ดี
ถ้าใช้วิธี A ไม่ได้ให้ลองวิธีอื่นดูอย่าพยายามดึงดันไปทางเดียว ลองหยุดคิดซักพักจะพบทางไปต่อ
เอาจริงๆผมเสียเวลาตรงเรื่องนี้นานระดับหนึ่ง ไม่ใช่เพราะไม่รู้ว่าปัญหาคืออะไร แต่ไม่รู้จะแก้ไขยังไงมากกว่า ก็นั่นลองนั่งเทสไป จนช่วงเที่ยงคืนผมทนไม่ไหวเพราะว่ามันกินเวลาทำการบ้านผมมากเกินไปแล้วผมต้องตัดสินใจว่าจะเอาไงต่อ ผมเลยแก้ไขปัญหาเฉพาะหน้าด้วยการใช้ CORS by pass ของ chrome extension ก็สามารถเรียก mutation ได้อย่างไม่มีปัญหาก็เลยใช้ไปก่อน
เอาจริงๆ ณ จุดนี้คือ อาจจะอีเมลกลับไปหาทาง Line ว่ามันเกิดปัญหาแบบนี้ขึ้นก็รู้สึกว่ามันไม่แฟร์ทำไมเรียกไม่ได้ แต่จังหวะต้องติดสินใจ ไม่ใช่เวลามาเรียกร้อง ต้องแก้ไขปัญหาไปให้ได้ก่อนเลยตัดสินใจแบบนั้น โดยจริงๆทาง line เขาก็มีบอกในเมลนะว่า ถ้ามีปัญหาอะไรให้ติดต่อ แต่ในความคิดผมตอนนั้นที่เขียนอยู่คือ ตอนแรกคิดว่าไม่น่าจะติดนาน บวกกับว่าถ้าตอบกลับเมลไปก็จะเสียเวลารออีก ซึ่งก็จะยิ่งช้าไปอีกกว่าจะตอบกันไปมา ไม่ได้ทำอะไรพอดี จะบอกว่าผมคิดถูกที่ไม่ได้เมลกลับไปถามเพราะกว่าเขาจะตอบผมก็คือเวลาทำงานปกติ
พอเริ่มทำ mutation ได้เริ่มมีความหวังเล็กๆว่าอาจจะทันนั่งทำต่อไปเสร็จประมาณตีสองได้มั้ง เรียก vote ได้เรียบร้อยแล้ว ต่อมาคือต่อกับ websocket เพื่อให้ได้ผลโหวตแบบ realtime นั่นเอง ผมอ่ะเข้าใจ concept อยู่แต่ apollo มันทำยังไง ? นั่งหาไปก็เจอ doc พอลอง set up ตามปรากฎไม่ได้แฮะ แล้วผมลองค้นหาใน google เกี่ยวกับการเชื่อมต่อระหว่าง apollo กับ nextjs บอกเลยว่ามันมีตัวอย่างแต่ผม set up ตามแล้วติด error บอกตรงๆตรงคือความโกลาหลมากๆ
เพราะถ้าทำตาม doc ไม่ได้คือต้องหาเองซึ่งจะเสียเวลาอีก ถึงตอนนี้ก็พยายามหาว่ามีใครทำตัวอย่างเกี่ยวกับ nextjs ต่อกับ apollo แล้วต่อกับ websocket บ้างปรากฎว่ามีแต่ตัวอย่างเก่าไป 4 ปีก่อน 3 ปีก่อน คือนี่เป็นปัญหาหนึ่งเลยว่าถ้า package มันไม่ตรงบางครั้งคือมันอาจจะเกิด error แล้วไปต่อไม่ถูกเพราะในตัวอย่างในคลิปแม่งดันทำผ่านสบาย ในขณะที่ตูแค่ทำตามไม่กี่บรรทัด error แม่งมาเต็มไปหมด
พอผมไปดู doc มันบอกให้ใช้ package ใหม่ก็ทำตาม พอทำไปซักพักแม่งก็ไม่ได้ ปัญหาที่ผมเจอคือ สมมติมันบอกให้ install package a ผมก็ลงพอลง a เสร็จ a บอกว่าต้อง package b ด้วยพอลง b บอกต้องการ c,d ด้วย พอลงไปถึงปลายทางแม่งบอก error เอ้า ! เสียเวลา และมันเป็น error ใน package ด้วยผมก็ไปต่อไม่ถูกอีก อย่าลืมว่า ณ ตอนนี้ผมไม่สามารถเสียเวลา research ได้ ผมพยายามหาคำตอบจนหน้าแรกของ google อ่ะผมกดทุก Link อ่ะคุณคิดดู อ่านจนหมด ผมพอเข้าใจ concept แต่ package ที่ใช่แม่งก็ไม่ได้อยู่ดี สุดท้ายกำลังจะทิ้งตัวนอน …
บางครั้งเราต้องตัดสินใจอะไรแบบยากๆ แต่ต้องเด็ดขาด มีงานส่งครบดีกว่างานไม่ตรงตามสเปค
ผมมานึกๆดูว่าหลายๆตัวอย่างในคลิปที่ดูเขาใช้กับ react ไม่ใช่ nextjs ผมเลยคิดว่า เราพอจะกลับไปใช้ react แทนดีไหม แต่ ณ เวลานี่คือ ตีสี่กว่า ง่วงนอนแต่งานก็ไม่เสร็จตามที่คาด ปัญหาก็แก้ไม่ได้อีก … คิดไปคิดมาวนเวียนในหัวอยู่สักพักเลยตัดสินใจว่า ลองสร้าง project ใหม่ด้วย react แล้วลองเทสดูว่ามันต่อกับ ws ( websocket ) ได้ไหม เอาแค่มันต่อได้ไหม เพราะว่าตอนที่ใช้ nextjs มันต่อไม่ได้เลย error มารัวๆ
ปรากฎว่าใช้แค่ react project มันดันต่อได้ว่ะ เอ้ย !!! เหมือนเห็นแสงสว่างตรงปลายอุโมงค์แต่วันนี้หมดแรงแล้วไม่ไหว เลยคิดว่าแผนในในคราวๆว่า ถ้าพรุ่งนี้ตื่นมาเราต้องจัดการย้ายทุกอย่างมา project นี้ให้ทันภายใน 2 ชั่วโมง เอาจริงคิดว่าน่าจะทำทันนะเพราะว่าทุกอย่างมันไปหนักตรง css เองถ้าต่อกับ tailwind ได้ทุกอย่างเขียนคล้ายกันไม่น่ายาก อ่านมาถึงตรงนี้ให้เข้าใจว่าเหมือนทำใหม่หมดนั่นแหละ เศร้าแต่ก็ยังดีกว่าไปต่อไม่ได้
วันที่ 3 ทำแล้วเสียใจดีกว่าเสียใจที่ไม่ได้ทำ
ตื่นมาตอนประมาณเที่ยงโดยผมเหลือเวลาอีก 12 ชั่วโมงกับ project ที่ต้องทำใหม่ทั้งหมด อยากจะบ้าจริงๆ แต่ก็ต้องทำเพราะถ้าไม่ทำใหม่ก็จะตอบโจทย์ของการบ้านไม่ได้ จริงๆตัวการบ้านก็บอกว่า เขาไม่ได้คาดหวังว่าจะทำหมดหรอก แต่ถ้าทำได้ตรงอย่างน้อยก็สิ่งที่เป็น requirement สำหรับผมแล้วก็ถือว่ารับผิดชอบงานล่ะนะ
ผมเริ่มทำแล้วกะว่าใน 6 ชั่วโมงคือต้องทำทั้งเรื่อง UI เรื่องต่อ API กับ Realtime ต้องเสร็จเพราะจะได้เหลือเวลาไปเขียน unit test และก็ทำ feature เล็กๆน้อยๆบ้าง ผลคือทำเสร็จทันใน 6 ชั่วโมงสามารถโอน code และทำการ vote แบบ realtime ได้จริง
แต่ปัญหาก็มีอีกตรงที่ตัว package แม่ง error อะไรไม่รู้ซึ่งบอกตรงๆเลยนะ ผมไม่รู้วิธีแก้ไขปัญหานั้นจริงๆ คือพยายามหาคำตอบแล้วแต่ว่ามันเป็น error ของ package แต่มันไม่ได้กระทบแบบ app crash นะแค่ error ตอนเรียก graphQL ผมลองเช็คแล้วมันก็พอจะหยวนๆได้ คือถ้าเทียบว่าส่งงานไปมี error แต่ระบบไม่พัง ยังดีกว่าส่งงานไม่ได้เลยมากกว่า
พอทำเสร็จผมค่อนข้างโล่งใจระดับหนึ่งเลยเพราะเหลือเวลาอีก 6 ชั่วโมงเอาจริงๆผมไม่คิดว่าจะใช้หมด 6 ชั่วโมงหรอกเพราะคิดว่า ต้องเผื่อเวลาระบบด้วยเช่น เช็คก่อนส่ง ต้องเขียน readme ไฟล์เพื่ออธิบาย ไม่ได้ให้เราส่งเป็น github ไปให้นะ เขาให้เรา upload file ไป ผมก็ต้องนั่งเทสด้วยว่าถ้าส่งเป็น zip ไปแล้วตอนเขา แตกไฟล์มันเหลือกี่ไฟล์ต้องสร้างไฟล์อะไรไปเองไหม ยกตัวอย่างเช่นไฟล์ .env ก็ต้องเขียนอธิบายไปด้วยว่ามีตัวแปรอะไรต้องใช้บ้าง ทำนองนี้
ปัญหาคือจุดนี้แหละ ผมเหลือ unit test ของ react ซึ่งผมแทบไม่มีความรู้เกี่ยวกับเครื่องมือการ test เลยพยายามอ่านในเน็ตแล้วแต่เครื่องมือแม่งเยอะมากและส่วนใหญ่ตัวอย่างที่มันทำให้ดูคือ มันไม่ได้ซับซ้อนเหมือนระบบผมอ่ะ ส่วนใหญ่จะสอนง่ายๆ บอกตรงๆว่าทำได้นิดหน่อยเอง และเริ่มหมดหวังตรงนี้อีกครั้ง
แต่ทำมาขนาดนี้แล้ว ก็ไม่มีอะไรจะเสียแหละ ผมรู้สึกว่าผมทำเต็มที่ทั้ง research และทำทั้ง project ใหม่ในเวลาทัน การตัดสินใจในวันที่ 2 นั้นคือถูกต้องในมุมตัวผมเองนะ สุดท้ายผมไม่ได้ทำพวก feature ตามแผนในใจวันแรกเพราะเจอปัญหารายทางอย่างที่เล่าให้ฟังครับ
เอาจริงตอนทำเสร็จส่งไปเหมือนเราทำ project ใหญ่เสร็จอารมณ์ภูมิใจในตัวเองมันล้นทั้งๆที่มันไม่ใช่ program อะไรยากเลยเอาจริงแต่เราทำเสร็จตรงกับ requirement ทุกอย่างที่เราเทสคือโอเคระดับหนึ่งเลย ทั้งสีและ design ก็ปรับๆเอง ถึงจุดนี้ถ้าไม่ติดก็คิดว่าไม่เสียใจแล้วเพราะทำสุดทั้งเรื่องค้นหาคำตอบถามคน ตัดสินใจ ที่เหลือรอ … อีก 1 อาทิตย์ว่างานของเราจะเข้าตาเขาไหม เป็นการรอที่นานพอดูเลย
รอบสาม Interview ไม่มี ….
ใช่ครับผมมาถึงสูงสุดแค่รอบ 2 เองครับ ผมได้รับอีเมลในเช้าวันจันทร์ถัดมาว่า เสียใจด้วยนะไม่ติดน่ะ … ความรู้สึกเขียนเหมือนคนอกหักอ่ะ ปกติไม่ค่อยมีเรื่องตื่นเต้นในชีวิตเท่าไร แต่การสมัครกับ Line เป็นอะไรที่สนุกจริงๆ จาก project ที่เล่ามาผมได้ research แก้ไขปัญหาเฉพาะหน้าหลายอย่างมาก ซึ่งปกติก็ทำนะ แต่พอมันมี deadline มันทำให้รู้สึกตื่นเต้นน่ะสิ
แต่ถึงอย่างไรผมก็เข้าใจเหตุผลที่ Line ไม่รับอยู่ดีเพราะงานของผมมันไม่ได้เนียบอะไร test คือเขียนน้อยมากๆ ถ้าเข้าไปก็คงคิดว่าทาง Line คงอยากได้คนที่ทำงานได้ดีทันทีไม่ใช่มาเสียเวลาฝึกใหม่เพราะตำแหน่งของผมเองก็ไม่ใช่ Junior ซักหน่อย ถ้าในปัญหาที่เล่ามาจริงๆผมแก้ไขปัญหาได้ด้วยการทำ proxy server แล้วยิงไม่ติด CORS ได้แต่ด้วยความตื่นเต้นด้วยทำให้สติหลุด พอมานั่งคิดดูดีๆแล้ว ทางแก้ไขมันมีแต่ ณ ตอนนั้นก็คือพยายามจะทำให้เสร็จไม่อยากเสียเวลา ผมสนุกกับมันนะ ถึงแม้ไม่ติดก็ไม่เสียใจแล้ว ถือว่าทำเต็มที่แล้ว ได้แบ่งปันเรื่องราวผ่านบทความนี้อีก ผมว่าผมกำไรอยู่
ส่งท้าย
ขอบคุณจริงๆครับสำหรับคุณผู้อ่านที่อ่านมาถึงตรงจุดนี้ ผมว่าบทความอันนี้คือยาวมากนะ ผมคงต้อง move on ต่อไปนั่นแหละ ถึงแม้ในใจก็ยังซึมๆอยู่ ฮ่าๆ แต่การผิดหวังก็เป็นเรื่องธรรมดาของชีวิต วันนี้เขาไม่เลือกเรา ไม่ใช่ว่าวันข้างหน้าเขาจะไม่เลือกครับ ก็แค่พัฒนาสกิลให้มากขึ้นกว่าเดิม อะไรที่เราขาดก็เติมมันแค่นั้น ถ้าเราพิสูจน์ได้ว่าเราเจ๋งพอเดี๋ยวก็มีคนติดต่อมาเองแหละ เพราะฉะนั้นอย่าหยุดเรียนรู้นะทุกคน ชีวิตไม่แน่นอนแต่เราก็สามารถปรับตัวไปเรื่อยๆได้อยู่
ถ้าใครติดตามบทความผมมาสักพักจะเห็นว่าผมพยายามจะเขียน daily ทุกๆ 1-2 วันเพื่อ ทบทวนสิ่งที่ได้เรียนรู้และแบ่งปันว่าวันๆเจออะไรดีๆเขียนเก็บไว้ ผมคิดว่ามันเป็นประโยชน์และเป็นตัวอย่างที่ดีให้แก่หลายๆคน ถ้าวันหนึ่งใครอยากจะสมัครง่ายกับ Line อย่างน้อยๆจะได้เตรียมตัวถูกว่าควรจะศึกษาอะไร จะเจอโจทย์ประมาณไหนครับ สำหรับบทความนี้ต้องขอลาไปก่อนครับ เจอกันใหม่บทความหน้าครับ สวัสดีครับ :)
Credit ผู้ช่วยเหลือ
ขอบคุณ ปั้ม YWC#9 กับ พี่เหน่ง YWC#5 ด้วยครับสำหรับเรื่องการช่วยเหลือและเครื่องมือในการคืบค้นปัญหานะครับ คือผมไม่ได้ถามทั้งการบ้านแต่ผมถามเขาเพราะไม่แน่ใจว่าสิ่งที่ผมพยายามจะทำมันผิดหรือเปล่า แต่ผลออกมาแล้วผมไม่ติดก็ขอบคุณทั้งคู่อยู่ดีครับ
github
https://github.com/oxygenyoyo2/line-vote-election-2