notes.dt.in.th

↩ คำถามในสมาคมโปรแกรมเมอร์ไทย

ทำไมบางบริษัทสมัครงานตำแหน่ง Web Devloper หรือ Mobile Developer ไป

ตอนสัมภาษณ์งานกลับสัมภาษณ์ด้วยโจทย์อัลกอริทึม

ทั้งๆที่ใน Job Description ก็ไม่ได้เขียนว่างานที่ทำเกี่ยวข้องกับอัลกอริทึมที่ซับซ้อน

และจากประสบการณ์ทำงานด้านนี้มาเกิน5ปี ก็ยังไม่เห็นว่าการทำงานด้านนี้จะใช้ความรู้ด้านอัลกอริทึมซับซ้อนมากมายอะไรขนาดนั้น

ไม่เข้าใจ และงงมากว่าการสัมภาษณ์คนด้วยอัลกอริทึมมันสามารถคัดคนที่มีความสามารถด้านนี้ได้อย่างไร ทำไมบางบริษัทเลือกสัมด้วยวิธีนี้

ทำ Web เหมือนกันครับ โค้ดส่วนมากที่เขียนก็ไม่เห็นต้องใช้อัลกอเยอะเท่าไหร่ ตามที่ว่านั่นแหละครับ เพราะส่วนมากก็ Create/Read/Update/Delete ลิงค์ไปลิงค์มา ส่งฟอร์ม Show/Hide กล่อง เรียก API เรียกว่าน่าจะประมาณ 90% เลยก็ว่าได้

แต่บางครั้งมันก็มีปัญหาที่ต้องแก้ด้วยอัลกอริทึมอย่างเช่น Tree traversal, Binary search, Linked list, Lookup table, Trie (โดยเฉพาะพวกปัญหาเวลาเว็บมันอืดแล้วต้อง Optimize ที่ระดับโค้ด) บางทีก็ต้องใช้คณิตศาสตร์รัวๆ พวก เมตริกซ์ ตรีโกณ สถิติ Linear regression ฯลฯ

บางทีทำพวกระบบ Access control หรือระบบที่เกี่ยวกับความปลอดภัยของข้อมูล ก็ค่อนข้างซับซ้อนนะครับ หรือพวกระบบคำนวนเงิน (เช่น ระบบจ่ายเงิน มีแบบ Recurring มีระบบลดราคา คูปอง หรือที่ต้องคืนเงินตามจำนวนที่ไม่ได้ใช้ได้) ของพวกนี้อัลกอผิดเท่ากับรายได้หายนะครับ

จะเห็นว่าเขียนโค้ดพวก 90% ส่วนมากใครๆ ก็ทำได้… บางทีเวลาสัมภาษณ์ถึงต้องถามพวกความรู้ที่ใช้งานแค่ 10% นี้ จะได้ชัวร์ว่าไม่ได้จ้างคนที่เวลาเจอโจทย์ 10% แล้วทำได้แค่ตอบว่า “ทำไม่ได้” หรือทำได้แต่ใช้เวลานานมากกกก หรือทำออกมาแล้วบั๊กกระจาย

↩ follow-up question

ในฐานะที่คุณน่าจะเป็นผู้สัมภาษณ์คนอื่นเหมือนกัน

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

เช่นผมมีความรู้ความเข้าใจใน React สูงมาก รู้หมดว่าแต่ละอย่างที่ถูก implement ขึ้นมานั้นทำมาเพื่อตอบโจทย์สิ่งใด ข้อดีข้อเสียของฟังก์ชันนั้นคืออะไร รู้หมดว่าการเขียนโค้ดที่ดีเป็นอย่างไร Design Pattern แบบไหนที่ควรใช้ แต่ผมไม่มีความสามารถมากพอที่จะทำโจทย์อัลกอริทึมยาก เช่นโจทย์ ACM ได้ สามารถทำได้เพียงอัลกอริทึมพื้นฐานเท่านั้น

กับอีกคนที่มีความสามารถในการทำโจทย์อัลกอริทึมสูงมาก สามารถทำโจทย์รอบลึกๆอย่างรอบ Asia ได้ แต่กลับไม่รู้และเข้าใจใน React ดีเท่าผม ไม่รู้จัก Design Pattern ไม่รู้เรื่องด้าน Software Architecture

ถ้าคุณมี Head count เหลือ 1 ที่ สำหรับ React Developer คุณจะเลือกใครครับ

มองว่าการพัฒนาซอฟต์แวร์มันต้องใช้ Capability ทั้งคู่นะครับบ ขอเรียกว่าเป็นแกน Algorithm กับแกน Software Engineering ละกัน มองว่าทั้งสองแกนมันเป็นตัวคูณ คือถ้าขาดด้านใดด้านนึงก็ถือว่าเป็นความเสี่ยง ฉะนั้นเวลาหาคนก็ขึ้นอยู่กับว่าทีมเราต้องการเพิ่ม Capability ด้านไหนเป็นหลักครับ

ถ้าเกิดต้องเลือกแค่คนเดียว ตามคำถามที่ให้มาจริงๆ… ก็คงต้องลองเทียบดูเรื่อง Adaptability ว่า ระหว่าง

  1. ให้คนแบบแรก สาย Software Engineering มาลองเจอปัญหา Algorithm เช่น ให้มาลองแก้ปัญหา n+1 query หรือ Optimize ความเร็วการ Render; กับ
  2. ให้คนแบบที่สอง สาย Algorithm มาลองเจอปัญหาด้าน Software Engineering เช่นให้มาลองเขียน React หรือให้ลองเซ็ตระบบ Deployment ทำ CI/CD

คิดว่าคนไหนจะสามารถปรับตัว (Adapt) เข้ากับสถานการณ์ได้ดีกว่ากันครับ… ผมมีคำตอบในใจอยู่แล้ว แต่ยังไม่เคยทดสอบจริงๆ เลยคิดว่ายังไม่สามารถให้ Informed opinion ได้ครับบ