วิธีพัฒนาทักษะ Data Structures, Algorithms และ Problem-Solving ให้ดีขึ้น

27-ก.พ.-19

คัมภีร์เทพ IT

คงมีคนไอทีหลายท่านที่ไม่ได้เรียนจบด้านไอทีมาโดยตรง แต่ใช้การศึกษาหาความรู้ด้วยตนเอง และคุณ Fabian Terh ก็เป็นหนึ่งในนั้น เขาได้ถ่ายทอดประสบการณ์เกี่ยวกับ วิธีพัฒนาทักษะ Data Structures, Algorithms และ Problem-Solving ให้ดีขึ้น พร้อมทั้ง Resource ต่างๆ ที่เป็นประโยชน์ มาให้อ่านกัน

คุณ Fabian เป็นคนหนึ่งที่ใช้การศึกษาเรียนรู้ต่างๆ ด้าน Computer Science ด้วยตนเอง แม้เขาจะคุ้นเคยและถนัดกับ Programming ทั่วไปอย่างเช่น Object-Oriented Programming ก็ตาม แต่หากพูดถึง Data Structures, Algorithms และ Problem-Solving หรือการแก้ไขปัญหา แล้ว กลับเป็นทักษะที่เขารู้สึกว่า มันไม่ใช่เรื่องง่ายเลย

ปัญหา: คุณรู้ทฤษฎี แต่คุณมีปัญหาเรื่องการนำไปใช้งานจริง

คุณเคยเจอปัญหาที่ “คุณไม่รู้ว่า คุณควรต้องรู้อะไร” บ้างไหม เพราะปัญหานี้ Fabian ก็เคยเจอมาก่อน แม้เขาจะรู้ในทฤษฎีเป็นอย่างดี เช่น รู้ว่า Linked List คืออะไร ทำงานอย่างไร มี Operation ที่หลากหลาย รวมทั้งเวลาที่ Computer ต้องใช้ในการประมวลผล เป็นต้น แต่ด้วยเหตุที่ เขาไม่รู้ว่า เขายังไม่รู้เรื่องใดอีกบ้าง เขาจึงไม่สามารถหาจุดที่ยังไม่รู้ในการทำความเข้าใจเกี่ยวกับการนำไปประยุกต์ในการแก้ปัญหาจริง

คำถามประเภทต่างๆ

ตัวอย่างคำถามเกี่ยวกับ Data Structures: จงอธิบายวิธีที่คุณจะแทรก Node ใน Linked List และระบุเวลาที่ Computer ต้องใช้ในการประมวลผล

และนี่คือคำถามเกี่ยวกับ Algorithms: จงหา Element ใน Rotated Sorted Array และระบุเวลาที่ Computer ต้องใช้ในการประมวลผล

ส่วนคำถามเกี่ยวกับ การแก้ไขปัญหา ซึ่งน่าจะเป็นทักษะที่ Fabian คิดว่าอยู่ในระดับที่ดีกว่า 2 ทักษะแรก อาจเป็นการอธิบายสถานการณ์สั้นๆ และแสดง List ของ Requirements ของปัญหา ในการสอบ อาจให้คุณอธิบายเกี่ยวกับการแก้ปัญหา แต่ในทาง Programming อาจต้องการให้คุณ Submit Code โดยไม่ต้องระบุ Data Structures และ Algorithms ที่เจาะจง หรือกล่าวอีกนัยหนึ่งคือ คุณสามารถใช้ Data Structures และ Algorithms ที่เหมาะสมในการแก้ปัญหาให้เกิดประสิทธิภาพมากที่สุดเท่าที่จะทำได้

แล้วคุณจะพัฒนาทักษะด้าน Data Structures, Algorithms และ Problem-Solving ได้อย่างไร

หากคุณอยากฝึฝน ขอแนะนำ 3 เว็บไซต์ คือ HackerRank, LeetCode, and Kattis โดยรวมแล้วทั้ง 3 เว็บไซต์มีความคล้ายกันโดยเฉพาะ 2 เว็บไซต์แรก แต่ก็ไม่เหมือนกันซะทีเดียว และแต่ละเว็บไซต์ก็มีจุด Focus ที่แตกต่างกันเล็กน้อยซึ่งก็มีประโยชน์ที่แตกต่างกันไปด้วย

หากจะจัดหมวดหมู่ทักษะที่จำเป็นสำหรับการแก้ปัญหาอย่างคร่าวๆ สามารถแบ่งได้ดังนี้:

1. ความรู้เกี่ยวกับ Data Structures

สำหรับหัวข้อนี้ ดูเหมือนเว็บไซต์ HackerRank จะมีความโดดเด่นมากในเรื่องนี้ เพราะมี Section ที่เกี่ยวกับ Data Structures โดยเฉพาะ ซึ่งคุณสามารถ Filter ได้ตามประเภทด้วย เช่น Arrays, Linked Lists, (Balanced) Trees, Heaps รวมทั้งอื่นๆ

ตัวอย่างคำถามด้าน Data Structures ที่อาจไม่ค่อยเกี่ยวกับการแก้ไขปัญหามากนัก:

คุณอาจคิดว่า คำถามบางข้ออาจไม่สามารถนำมาใช้โดยตรงในการแก้ไขปัญหา แต่มันก็เป็นเรื่องที่ดีในการทำความเข้าใจ Concept ซึ่งมีความสำคัญอย่างยิ่งในทุกกรณี

ใน HackerRank ไม่มี “รูปแบบของ Solution” ที่จะให้คุณเข้าถึงได้ง่ายๆ แม้ว่าในส่วนของการแสดงความเห็นจะเต็มไปด้วยคำแนะนำที่บอกเป็นนัย, การบอกใบ้ หรือแม้แต่ Snippet Code ก็ตาม แต่สิ่งเหล่านั้นมันก็มากเพียงพอแล้ว แม้ว่าบางทีคุณอาจต้องเข้าไปดู Code ทีละบรรทัดใน IDE เพื่อให้เข้าใจมันจริงๆ

2. ความรู้เกี่ยวกับ Algorithms

แม้ HackerRank จะมี Section เกี่ยวกับ Algorithms แต่โดยส่วนตัวแล้ว Fabian ชอบ LeetCode มากกว่า เพราะมันมีตัวอย่างปัญหาที่หลากหลายและกว้างกว่า และปัญหาเหล่านั้นก็มี Solution พร้อมคำอธิบายและเวลาที่ Computer ต้องใช้ในการประมวลผล

การเข้าไปดูคำถามยอดนิยม 100 อันดับแรกของ LeetCode ถือเป็นจุดเริ่มต้นที่ดี และนี่คือตัวอย่างคำถามที่น่าสนใจ:

แตกต่างกับคำถามของ Data Structures เพราะมันไม่ได้ Focus ไปที่การทำงานหรือจัดการกับ Data Structures มากนัก แต่ Focus ว่ามันทำอะไรได้บ้างมากกว่า อย่างเช่น ปัญหาของ “Accounts Merge” ถือเป็นพื้นฐานสำคัญในการประยุกต์ใช้ Standard UFDS Algorithms ส่วนปัญหาของ “Searching in a Rotated Sorted Array” จะแสดงเกี่ยวกับการ Twist บน Binary Search ในบางครั้งคุณอาจต้องเรียนรู้เทคนิคในการแก้ปัญหาใหม่แทบจะทั้งหมด เช่น “sliding window” สามารถแก้ไขปัญหา “Longest Continuous Increasing Subsequence”

3. ความรู้เกี่ยวกับการนำ Data Structures และ Algorithms ไปประยุกต์ใช้

Fabian เลือกใช้เว็บไซต์ Kattis ในการพัฒนาทักษะการแก้ปัญหาทั่วไปของเขา ใน Kattis Problem Archive มีตัวอย่างปัญหาด้าน Programming มากมายจากแหล่งต่างๆ เช่น จากการแข่งขันการเขียน Program จากทั่วโลก

แต่ Kattis ก็มีข้อด้อยเช่นกัน เนื่องจากไม่มี Solution ที่เป็นทางการ และไม่มี Forum ให้คนได้เข้าไปร่วมแสดงความคิดเห็น (ซึ่งต่างจาก HackerRank และ LeetCode) นอกจากนี้ Test Cases ก็เป็นแบบ Private อีกด้วย ตอนนี้ Fabian มีปัญหาที่ค้างอยู่ที่ Kattis จำนวนหนึ่ง ซึ่งยังไม่สามารถแก้ปัญหาได้ ซึ่งไม่ใช่เพราะเขาไม่รู้วิธีแก้ปัญหา แต่เพราะไม่สามารถหา Bug ได้

Resource อื่นๆ

Geeksforgeeks ก็เป็นอีกหนึ่ง Resource ที่มีประโยชน์มากสำหรับการเรียนรู้เกี่ยวกับ Data Structures และ Algorithms เนื่องจากมี Snippet Code ในภาษาต่างๆ เช่น C ++, Java และ Python ซึ่งคุณสามารถ Copy และ Paste ลงใน IDE ของคุณเพื่อดู Code ไปทีละบรรทัดได้

สรุป

ในเรื่องของ Programming มันไม่มีทางลัด คุณต้องศึกษาและอยู่กับมันมากๆ เริ่มต้นเขียน Code, Debug และศึกษาจาก Code ที่ถูกต้องของคนอื่นบ้างเพื่อจะได้รู้ว่าคุณทำผิด ตรงไหน อย่างไร และทำไม แต่เชื่อเถอะว่า คุณจะเก่งขึ้นจากความพยายามของคุณและต่อไปมันจะง่ายขึ้นเรื่อยๆ

ที่มา:  https://medium.freecodecamp.org/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความล่าสุด