
Introduction
ช่วงเดือนที่ผ่านมามีข่าวนึงที่หลายคนค่อนข้างพูดถึงกันเยอะมากใน X (prev Twitter) เรื่องมีอยู่ว่ามีหนุ่มจาก Columbia university คนนึงเขาทำ AI tool สำหรับโกง coding interview ขึ้นมา
พอได้ internship offer ที่ Amazon พี่แกก็เอา video ที่ตัวเองอัดไว้ตลอด interview process มาแชร์ลง twitter พร้อมกับ reject offer แบบเท่ ๆ ไปหนึ่งทีจนเกิดเป็น viral ขึ้นมา
ยังไงก็ตามประเด็นเรื่อง LeetCode เป็นเรื่องที่หลายคนพูดถึงกันมานานละ ว่าการเอา LeetCode มาใช้ใน coding interview มันเหมาะสมไหม? แล้วการฝึกทำโจทย์ LeetCode มีความจำเป็นมากน้อยแค่ไหน?
สำหรับในบทความนี้เราเลยอยากถือโอกาสยกเรื่องนี้มาชวนพูดคุยกันหน่อย
ฝึกแก้โจทย์ LeetCode จำเป็นหรือไม่จำเป็น!?”
ก่อนไปที่จะไปพูดคุยกันนั้นก่อนอื่นเราชวนคุยถึงเรื่องของบริบทหรือ context ก่อน เพราะเมื่อบริบทเปลี่ยน คำตอบก็ย่อมเปลี่ยนตามไปด้วย
“จำเป็นสำหรับอะไร?”
ถ้าหากมีคนถามว่า “ฝึก LeetCode จำเป็นสำหรับคนที่ฝึกเขียนโปรแกรมไหม?” ก็อาจจะต้องบอกว่าไม่ได้จำเป็นขนาดนั้น (ส่วนตัวเรายังเชื่ออยู่ว่าการสร้าง project เป็นวิธีการเรียนรู้ที่ดีที่สุด — เพราะนอกจากจะได้ฝึกใช้ tool ได้ฝึกการแก้ปัญหาในเชิง technical แล้ว ยังช่วยให้เห็น bigger context อื่น ๆ อีกด้วย)
…แต่ในขณะเดียวกันก็ไม่ได้ไร้ประโยชน์สักทีเดียว
- คนที่พึ่งเริ่มเขียนโปรแกรมใหม่ ๆ การได้แก้โจทย์ง่าย ๆ อาจจะช่วยฝึกวิธีคิด (problem-solving process) ได้ฝึก technique ต่าง ๆ เฉพาะด้านเช่น two pointers หรือ sliding windows รวมไปถึงช่วยให้ใช้เครื่องมือหรือภาษาที่เขียนได้คล่องขึ้น
- หรือคนที่มีประสบการณ์แล้ว อาจจะใช้ LeetCode ข้อที่ยากขึ้นเป็น puzzle เพื่อฝึก observation/reasoning skills หรือเพื่อให้เป็นการประยุกต์ใช้ algorithm ที่รู้อยู่แล้วให้กว้างขึ้น ในข้อจำกัดหรือ constraints ที่มันจำกัดมาก ๆ
อย่างไรก็ตามในบทความนี้เราอยากจะชวนคุยในอีกบริบทนึงที่ว่า “ฝึกแก้โจทย์ LeetCode จำเป็นหรือไม่ สำหรับการใช้สมัครงาน?”
ทำไม LeetCode ถึงถูกใช้ในการสัมภาษณ์งาน?
ถ้าถามว่า LeetCode-style interview มาจากไหน ก็ต้องตอบว่าจริง ๆ แล้วมันก็เป็น filter mechanism อย่างนึงนั่นหละ ไม่ต่างอะไรกับการสอบเข้ามหาลัยดัง ๆ แบบนั้นเลย
หนึ่งในเป้าหมายสำคัญอย่างหนึ่งของการจ้างคนเข้ามาทำงานก็คือ “จ้างคนที่เหมาะสมกับงาน” ลองคิดภาพเล่น ๆ ว่าถ้าเราเปิดบริษัทขึ้นมาของตัวเอง เราก็คงจะออกแบบวิธีการคัดคน based-on งานหรือปัญหาที่บริษัทเราแก้ใช่ไหมหละครับ
ทุกอย่างก็คงจะผ่านไปด้วยดี แต่ลองคิดภาพว่าบริษัทของเราเกิด popular มาก ๆ จนมีคนสมัครเข้ามาวันละเป็นพัน ๆ คน คำถามก็คือ “เราจะ handle คนสมัครจำนวนมาก ๆ ได้ยังไง?”
สิ่งนึงที่ทำได้ก็คือ “การกรองคนออก” และสิ่งนั้น (จากที่ Google ได้ทำการลองผิดลองถูกต่าง ๆ นา ๆ) ก็คือการฝึกแก้โจทย์ algorithm จนกลายเป็น LeetCode-style interview (หรือพวก quiz, online-test ต่าง ๆ) นั่นเอง
ปัญหาเกิด
ฟังดูก็เหมือนทุกอย่างก็จะดูดี แต่ไม่รู้ถึงจุดไหนไม่รู้ LeetCode-style interview เริ่มกลายเป็น standard ในการคัดคนไปซะงั้น หลาย ๆ ที่ adopt มาใช้โดยที่ไม่ได้ตั้งคำถามกับมันว่าเราจะวัดอะไร และมันเหมาะสมกับเนื้องานที่เราทำจริง ๆ รึป่าว
จนบางทีมันก็ gone too far ไป เช่นแบบโยนโจทย์ LeetCode medium/hard ให้ทำภายในเวลา 30 นาที หรืออะไรแบบนั้น ทั้ง ๆ ที่งานจริง ๆ อาจจะเป็นแค่งานง่าย ๆ ที่ไม่ได้จำเป็นต้องแก้โจทย์ยากขนาดนั้น
(และส่วนตัวเราเชือว่าการโจทย์แก้โจทย์ยากภายใน 30 นาทีได้ มันไม่ได้วัดได้ว่าใครแก้ปัญหาเก่ง แต่วัดว่าใครจำได้มากกว่ากัน)
พอทุกอย่างมันมาทางนี้มันเลยมีกระแส “Grind LeetCode” ขึ้นมา ที่ทุกคนเอาเวลาเป็นเดือน ๆ ไปฝึก LeetCode กันเอาเป็นเอาตาย แทนที่จะเอาเวลาไปทำโปรเจคหรือแก้ปัญหาที่มันเกิดขึ้นในโลกจริง ๆ
แล้วยิ่งในยุค AI นี่ยิ่งง่ายใหญ่ เพราะจากเดิมที่เราต้องพยายามทำโจทย์หลาย ๆ แบบ และจำแนวข้อสอบ พอมี AI มันตอบแทนเราได้หมดแล้ว ดูได้จาก coding interview cheating tool ที่งอกมาเป็นดอกเห็ด (แล้วถ้าไปดูดี ๆ จะเห็นว่า MRR หรือ “monthly recurring revenue” ของ tool พวกนี้ไม่ใช่น้อย ๆ เลย)
เราควรจะทำยังไงต่อไปดี?
วิธีการแรกก็คือ “ฝึกต่อไป” ดังที่ได้กล่าวไปแล้วว่าการฝึก LeetCode มันก็มีประโยชน์ของมัน เราเองก็ได้อะไรจากการฝึก LeetCode ในช่วงเรียนมหาลัย หรือช่วงที่ตอนเริ่มกลับมาทำโปรเจคนี้ใหม่ ๆ
หรืออีกวิธีการนึงคือ “ออกจากระบบ LeetCode และเลือกทางที่แตกต่าง”
build project, contribute OSS, referral system