ครั้งแรกกับการสัมภาษณ์ตำแหน่ง Software Engineer ใน New Zealand

imKrish Developer
imKrish
Published in
4 min readJul 6, 2017
Christchurch, New Zealand

ตอนนี้ผมทำงานเป็น Developer อยู่ที่นิวซีแลนด์ครับ ทำมาได้ 7 เดือนแล้ว วันนี้ไปสัมภาษณ์งานตำแหน่ง Software Engineer มา (ทำให้เรารู้เลยว่า Developer กับ Engineer เนี่ย การสัมภาษณ์มันแตกต่างกันสิ้นเชิงเลย) เลยอยากจะขอแชร์ประสบการณ์หน่อยครับ (เอาไว้เตือนตัวเองด้วย ว่ามีอะไรเพิ่มเติมที่เราควรเรียนรู้มั่งนะ)

1. ตำแหน่ง: Software Engineer (C#/Javascript)

2. บริษัท: ???

3. การเตรียมตัว: เอาจริงๆไม่เคยเขียน Backend ใช้ Javascript หรือ C# ในระดับ Production เลย (ทุกวันนี้เขียน Delphi)

  • ก็เลยนั่งเรียนคอร์ส NodeJS คอร์สนึง
  • เช็คตำแหน่งงาน แล้วมันมีคำว่า Engineer อยู่ ผมก็เลยอ่าน Data Structure ไปอันนึงคือ Linked List
  • วันก่อนสอบ นอนเยอะๆ :)
  • วันจริง ความมั่นใจครับ สำคัญมากๆ (ผมผ่านมาได้ทุกครั้งก็ด้วยความมั่นใจนี้แหละ)

4. ก่อนมาสัมภาษณ์บริษัทส่ง Email มาให้เราทำข้อสอบบน website ก่อน ซึ่งมี 3 ข้อ

4.1 ข้อแรกเป็น Fizzbuzz ง่ายๆ (max: 20 นาที)

4.2 ข้อที่ 2 เกี่ยวกับ Regex (max: 30 นาที) (แต่เราไม่ได้ใช้ Regex เพื่อแก้ปัญหา)

4.3 และข้อที่สาม เกี่ยวกับการ Sort และการใช้ Reduce Function (max: 40 นาที)

*** ใน website จะมีการจับเวลา โดยให้เราเขียน code (ใช้ภาษาอะไรก็ได้) ให้รันผ่านทุก test, ผมก็เลยพยายามทำข้อสอบให้เสร็จไวที่สุด เนื่องจากข้อสอบมันไม่ยากเท่าไร เลยคิดว่าเขาน่าจะคัดจากตรงนี้ ก็ทำไปจำได้ว่าข้อสุดท้ายทำไป 8 นาที (น่าจะผ่านก็ตรงข้อนี้แหละ 555)

5. รอประมาณ 2 วัน เขาก็ส่งอีเมลมา ถามว่าว่างวันไหน บอกให้ไปสัมภาษณ์ ก็นัดกันเรียบร้อยผ่านทางอีเมล

6. วันจริง: ตอนแรกนึกว่าจะมีคนมาสัมภาษณ์หลายคน แต่ทำไปทำมาคือมีเราคนเดียว การสัมภาษณ์มีทั้งหมด 6 sessions ตอนแรกเขาบอกเราว่าประมาณ 3 ชม แต่เราโดนไป 5 ชม. เต็มๆเลย! (8 am — 1 pm)

7. Session 1: แนะนำบริษัท แนะนำตัวเรา (ประมาณ 45 นาที)

  • คำถามก็จะเป็นพื้นๆทั่วไป

7.1 เขาก็ให้เราแนะนำตัวเอง

7.2 ประสบการณ์การทำงาน

7.3 ถามว่าโปรเจคตอนนี้ทำอะไรอยู่มั่ง

7.4 บริษัทที่ทำอยู่ใช้ภาษาอะไร framework อะไร แล้วเรารู้สึกยังไง

7.5 เวลาทำงานกับคนที่ทำงานด้วยยาก เราจัดการยังไง

7.6 รู้เปล่าว่าบริษัทนี้ทำอะไรมั่ง

7.7 ทำไมถึงมาเป็น Programmer รู้สึกยังไงกับอาชีพนี้

7.8 ตอนนี้กำลังเรียนอะไรด้วยตัวเองอยู่มั่ง (อันนี้เราตอบไปว่า GraphQL (เพิ่งนั่งเรียนคืนก่อนไปสัมภาษณ์ 555+), Elixir, AWS)

  • ที่เหลือประมาณ 10 นาที เราชวนเขาคุยเกี่ยวกับประเทศไทย 555+

*** เวลาเราตอบเขาจะพิมพ์ทุกอย่างไว้ แล้วเอาไปให้คนสัมภาษณ์ใน Session ต่อไปอ่านก่อนจะเข้ามาสัมภาษณ์เรา เพราะฉะนั้นตอบอะไร คิดให้ดีดีก่อนนะ :)

*** ตอนสัมภาษณ์มีบางตอนที่เขาฟัง accent เราไม่ออก วิธีการแก้ปัญหาคือเขียนลงกระดาษ 555+

8. Session 2: Technical Exam (60 นาที)

  • อันนี้เขาให้กระดาษ กับปากกา แล้วให้เราทำข้อสอบ แบ่งเป็น 2 ตอนคือ Math (ช๊อคมาก 555) และ Programming

8.1 Part Programming (4 ข้อ)

*** ที่ยากคือทำใน Laptop ไม่ได้ เพราะฉะนั้นเราจะไม่ได้ตัวช่วยจาก Editor หรือ Stack Overflow 555

8.1.1 FizzBuzz (อีกแล้ว) เนื่องจากทำมาเยอะแล้ว!!! ก็ไม่ใช่ปัญหาอะไร 555+ เขาบอกว่าวิธีเรา Simple ดี ไม่เคยเห็นมามากนัก (ใครอยากรู้ทักมาได้นะครับ)

8.1.2 ให้เรา Implement Linked List อันนี้ก็โชคดีที่เราอ่านมาก่อน (อ่านมาแค่เรื่องเดียว ดันตรงอีก 555) วิธี Implement ง่ายๆก็คือเรามี scope เอาไว้เก็บค่า head และ tail, โดยค่านั้นจะเป็น node ที่จำ 1) Value ของมัน 2) Node ก่อนหน้ามัน 3) Node หลังจากมัน

  • ให้เรา Print ค่าทุกค่าใน List แบบ Forward
  • ให้เรา Print ค่าทุกค่าใน List แบบ Backward

*** อันนี้เราก็ใช้ Closure แก้ปัญหา

8.1.3 SQL — อันนี้เราจำ Syntax ไม่ค่อยได้ แต่ก็ตอบไปทุกข้อ (ตอบๆไปให้เขารู้ว่าเราเข้าใจ) จะมีพวก

- สร้าง Table

- Select, Edit, Delete

- Copy Table

- Drop Table

8.1.4 ให้เราแนะนำ Data Structure ที่ไว้เก็บข้อมูลที่เป็น Vector ขนาดใหญ่ มีแกน x, y, z แนะนำการทำ Index, จะ Optimize Query Time ยังไง

- ข้อนี้เราไม่ได้ทำ เพราะเราอ่านโจทย์ก็งงแล้ว 555

- เราข้ามข้อนี้เพราะเวลาทั้งหมดมีแค่ 60 นาที (นี้ยังไม่ได้เริ่มทำ Part Math เลย)

*** เรามีความรู้สึกว่า ไม่จำเป็นต้องทำทุกข้อ เพราะเวลาทั้งหมดแค่ 60 นาที

8.2 Part Math (8 ข้อ)

- อันนี้คือจริงๆไม่ได้ยากเลย ความรู้ระดับ Math ม.ปลาย บ้านเรา พวก Linear Algebra: Matrix, Vector

- อันนี้ไม่ขอบรรยายรายละเอียดมากเพราะค่อนข้างง่าย แต่เราทำไป 6 จาก 8 เพราะข้อนึงเราแปลไม่ออก กับอีกข้อนึงลืมไปหมดแล้ว 555+

*** Note: ควรหาหนังสือ Linear Algebra มาอ่านสักเล่ม เพื่อจะได้คำศัพท์ภาษาอังกฤษใหม่ๆมาทำข้อสอบ

- สรุปคือ Session 2: Techinal Exam ทั้งหมด 12 ข้อ เวลา 60 นาที ทำไป 9/12

*** ช่วงนี้เราต้องรู้จักแบ่งเวลาให้ดี

9. Session 3: Exam Review (1.5 ชม.)

  • ช่วงนี้มีคนเข้ามาในห้อง 2 คน คนนึงเป็นหัวหน้าทีมทำฝั่ง Data Analysis ส่วนอีกคนทำฝั่ง Backend เขียน API
  • เขาก็เข้ามาดูคำตอบเราในกระดาษจาก Session ที่แล้ว แล้วก็ให้เราอธิบายว่าทำไมเราถึงใช้วิธีนี้ แล้วก็นั่งคุยเกี่ยวกับวิธีอื่นๆ ที่จะใช้แก้ปัญหาในข้อนั้นๆ

*** ในข้อ Linked List เราใช้ Recursive Function เพื่อ Print ค่าทั้งหมดใน List เขาก็บอกว่าทำแบบนี้มันมีข้อเสียนะ อะไรคือข้อเสียของ Recursive Function หละ? เราก็ตอบไปว่าในบางภาษา Tail Call มันไม่เคลีย Stack ให้ มันจะซ้อนกันไปเรื่อยๆ (โชคดีอันนี้เราเคยอ่านผ่านๆจากที่ไหนสักที่) — เขาก็บอกว่าใน Production ถ้าภาษาที่เราใช้ไม่ Clear Stack ให้ ห้ามใช้ Recursive Function นะ

*** ไม่ต้องกังวลเรื่อง Syntax เขาไม่ได้เช็คจากจุดนี้ เขาสนใจวิธีที่เราใช้แก้ปัญหามากกว่า

  • หลังจากนั้นเขาก็นั่งดู CV เรา แล้วก็ถามรายละเอียดแต่ละ Project ที่เราทำ และตามด้วยคำถามทั่วๆไป ที่พอจะจำได้ก็

9.1 ใน Javascript: not defined, undefined, null ต่างกันยังไง

9.2 เคยนำเสนอ Framework ใหม่ๆ ภาษาใหม่ๆให้กับบริษัทที่ทำอยู่หรือเปล่า ถ้าเคยทำไมถึงเสนอ มันดียังไง แตกต่างยังไงกับของเก่าที่ใช้อยู่

9.3 อะไรคือข้อเสียของการ Mutate State ของ Object จะแก้ปัญหานี้ยังไง (ข้อนี้เราก็พูดถึง Functional Programming Language, Pure Function ยกตัวอย่าง Library ที่เราใช้เพื่อแก้ปัญหา - RamdaJS)

9.4 เนื่องจากเราบอกเขาไปว่าเรียน GraphQL อยู่ เขาก็เลยถามว่ามันต่างกับ REST API ยังไง แล้วให้ยกตัวอย่างสถาณการณ์ที่ใช้ GraphQL ช่วยแก้ไขปัญหาเหล่านั้น

9.5 ทำไมถึงอยากย้ายงาน

9.6 ชอบ OOP หรือ FP ให้เราบอกความแตกต่าง ความรู้สึกเวลาเรา Code

9.7 ถ้าเลือกได้อยากทำ Front End, Back End หรือ Data Analysis

9.8 อะไรคือ Promise, ปัญหาของ Asynchronous Call แก้ปัญหาเหล่านั้นยังไง (อันนี้เราตอบใช้ RxJS แล้วก็อธิบายสถาณการณ์ที่ RxJS มีประโยชน์)

  • จากนั้นก็มีคำถามวัด IQ สองข้อ โดยเขาให้เราพูดว่าจะแก้ปัญหายังไง เขียนลงในกระดาษ แล้วเขาก็จะช่วย Guide เราเรื่อยๆจนแก้ปัญหาได้ (ข้อแรกเป็น Apple, Orange; ข้อสอง เดินไปทิศใต้ ออก เหนือ แล้วกลับมาอยู่ที่เดิม ถามว่าเราอยู่ส่วนไหนของโลก)

*** ควรอ่าน IQ Test เยอะๆ ก่อนไปสัมภาษณ์ (มีเยอะเลยในเน็ต)

10. Session 4: System and Database (30 นาที)

  • ช่วงนี้เป็น System Engineer 1 คน เข้ามา เขาก็ให้กระดาษ แล้วก็ให้เราเขียน Architecture ของ Project ที่เราทำอยู่ — เราก็วาด Diagram ง่ายๆ มีฝั่ง Client-Server-Database
  • แล้วก็จะเป็นคำถามเกี่ยวกับ SQL

10.1 INNER JOIN, LEFT JOIN, RIGHT JOIN ต่างกันยังไง

10.2 อะไรคือ OUTER JOIN, FULL OUTER JOIN (ข้อนี้ตอบไม่ได้ เราก็บอกเขาไปตรงๆว่า ที่ทำงาน เราเขียนแค่ Simple Query เอง ไม่ได้รู้ลึก)

10.3 ให้ตัวอย่าง TABLE มา แล้วให้เราเขียน QUERY ที่มี SELECT, Aggregate Function, INNER JOIN, WHERE, GROUP BY, HAVING

  • ปิดท้ายด้วยคำถาม IQ 1 ข้อ: เกี่ยวกับพระราชาตามหาคนโกงเหรียญ เราก็นั่งพูด นั่งเขียนว่าเราจะแก้ยังไง เขาก็ช่วยใบ้ให้

*** เกี่ยวกับ IQ Test: บางทีเราไม่จำเป็นต้องตอบถูกนะ เขาอยากจะรู้วิธีคิดของเรามากกว่า

11. Session 5: Data Analysis & Maintenance (45 นาที)

  • ช่วงนี้เป็น Data Analysis 1 คน เข้ามา
  • ดูจากชื่อ Session แล้วตอนแรกนึกว่าจะซีเรียส แต่ทำไปทำมาคุยกันชิลๆ
  • เขาก็อธิบายว่าเอา Data มาจากไหน, เอาไปใช้ทำอะไรมั่ง, ทำไม Algorithm ถึงสำคัญมากกับฐาน Data ขนาดใหญ่
  • ให้เราโชว์ Project Front End ของเรา อันนี้เราก็โชว์ 1 Web App กับ 2 Mobile Apps

*** เขาอยากจะดูว่าเราเอา Data ใน Database มาแสดงผลให้ User ดูยังไง

12. Session 6: คุยกับ Project Manager (30 นาที)

  • เข้ามาเขาก็บอกว่าเนี่ยเขาคือหัวหน้าของทุกคนที่เข้ามาก่อนหน้านี้ เราก็แบบชีโดกแล้ว ต้องโหดแน่ๆเลย แล้วแกก็โหดจริงๆ 555+
  • แกบอกว่าแกเป็น Senior Engineer มาก่อน มีอะไรจะถามไหม เราก็ถามไป 2–3 ข้อ แล้วเราก็บอกแกว่าถามผมมั่งดีกว่า ผมถามพนักงานก่อนหน้านี้ไปก็เยอะแล้ว

12.1 Solve Sudoku

  • แกให้กระดาษกับปากกามา แล้วถามรู้จักเกม Sudoku ไหม ให้เราเขียน Data Structure ที่จะใช้เก็บค่าของตัวเลขในเกมนี้มาก่อน เราก็พูดไปเขียนไป ใช้ Plain Array ละกัน ไม่ต้อง Nested Array
  • คราวนี้แกก็บอกว่าให้เขียนโปรแกรมเพื่อ Solve Sudoku(คิดในใจงานเข้าแล้ว 555+) ตอนนั้นเราคิดว่าถ้าใช้ Plain Array มันยากที่จะ access แต่ละ index เลยบอกแกเปลี่ยนเป็น Nested Array ละกัน จากนั้นเราก็พูดไปเรื่อยๆว่าคิดอะไรอยู่ แกก็ใบ้ๆจนเรา solve ได้

Keyword ที่เราควรพูดมี: Recursion, Backtrack

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

12.2 อยู่ในห้องที่ล๊อคมีแค่กระดาษ กับปากกา เราจะรู้จำนวนของ Piano ในเมือง Christchurch ได้ยังไง ตอนแรกเราก็คิดว่าเป็นคำถามวัด IQ แกบอกให้ใช้หลักสมมติฐานเอา ก็เริ่มจากในไครเชิชมีคนกี่คน มีบ้านกี่หลัง ในบ้านร้อยหลังจะมีเปียโนสักกี่หลัง พอจับหลักได้ก็ง่ายๆเลย

12.3 ข้อสุดท้ายแกถามว่าถ้าในไครเชิชมี Piano x หลัง (จากข้อที่แล้ว) ต้องการคน Tune Piano กี่คน เราก็ใช้หลักสมมติฐานจากข้อที่แล้วนี้แหละ

จบแล้ว ตอนแรกกะจะเขียนลงแฟนเพจเฉยๆ แต่เขียนไปเขียนมามันยาวซะงั้น เลยลง Medium เลยละกัน 555+ ใครอ่านแล้วงงๆ ต้องขอโทษด้วยนะครับ ยังไม่ได้เรียบเรียงเท่าไร

สิ่งหนึ่งที่ได้จากการสัมภาษณ์ครั้งนี้คือเหมือนเราได้มานั่งรีวิวตัวเองด้วย ว่ามีตรงไหนที่เราควรเรียนรู้เพิ่มเติม ส่วนไหนควรปรับปรุงบ้าง

อันนี้ของผมที่ต้องปรับ

1. อ่าน Math, Algorithm และ Data Structure เพิ่มเติม

2. กลับไปเรียนภาษาอังกฤษใหม่อีกซักรอบ 555 (ปรับปรุง accent)

3. เวลาตอบให้ตอบในมุมของผู้สัมภาษณ์ให้มากกว่านี้

4. ศึกษา SQL กับ​ NoSQL ให้ลึกมากกว่านี้

32 เดือนก่อน ผมจากไทยมานิวซีแลนด์ ภาษาอังกฤษโคตรจะงูๆปลาๆ ตอนนั้นได้ TOEIC 545 มั้ง ความรู้ Programming เท่ากับ 0 จากวันนั้นจนวันนี้เราได้เรียนรู้อะไรเยอะจริงๆ

“The best time to plant a tree was 20 years ago. The second best time is now.” — Chinese Proverb

สำหรับผมแล้วไม่มีอะไรสายเกินไปหรอกครับ ผมเริ่ม Programming ตอนอายุ 23 แล้วคุณหละเริ่มทำสิ่งที่คุณรัก และมีความสุขแล้วยัง ?

ทำไมตอนจบเหมือนโฆษณาขายตรงซะงั้น 555+

ใครว่างๆเข้ามาคุยกันได้ที่แฟนเพจนี้เลยนะครับผม

https://www.facebook.com/imkrish.developer/

“ Happiness is Only Real When Shared ”

ที่เริ่มเขียน Blog เพราะไปเจอ Quote นี้นี้แหละครับ :)

--

--

imKrish Developer
imKrish

I’m going to be the best I could be, not someone tells me I should be. I am optimistic and I love freedom : )