แบบฝึกหัดการเขียนโค้ดที่ดีที่สุดสำหรับผู้เริ่มต้น: ตั้งแต่ระดับง่ายไปจนถึงระดับยาก

แบบฝึกหัดการเขียนโค้ดที่ดีที่สุดสำหรับผู้เริ่มต้น: ตั้งแต่ระดับง่ายไปจนถึงระดับยาก

นี่คือสิ่งที่ไม่มีใครเตือนคุณมาก่อน คุณอาจดูวิดีโอสอนเขียนโค้ดติดต่อกันเป็นเดือน พยักหน้าตามทุกวิดีโอ แล้วพอเปิดไฟล์เปล่าขึ้นมาก็ไม่รู้จะพิมพ์อะไร ผมเคยเป็นแบบนั้นมาแล้ว คนส่วนใหญ่ที่เรียนเขียนโค้ดก็เคยเป็นแบบนั้นเหมือนกัน

วิธีแก้ปัญหานี้อาจดูน่าเบื่อ แต่ได้ผล: แก้ปัญหาเล็กๆ ด้วยตัวเอง แม้จะยังไม่เก่งในตอนแรกก็ตาม ดังนั้นคู่มือนี้จึงแบ่งออกเป็นสองส่วน ส่วนแรกคือชุดโจทย์การเขียนโค้ดที่ดีที่สุดสำหรับผู้เริ่มต้น (สิบข้อ เรียงลำดับจากง่ายไปยาก) ส่วนที่สองครอบคลุมเว็บไซต์ต่างๆ ที่คุณจะพบกับโจทย์อีกหลายพันข้อหลังจากที่คุณได้ลองแก้โจทย์ของผมแล้ว

ภาษาโปรแกรมใดก็ได้ใช้ได้หมด ตัวอย่างของผมใช้ Python และ JavaScript บ้างเล็กน้อย เพราะคนส่วนใหญ่เริ่มต้นจากภาษาเหล่านั้น พยายามทำตามลำดับนะครับ แต่ละข้อจะสอดแทรกแนวคิดใหม่ๆ เข้ามา

เหตุใดการแก้โจทย์ปัญหาการเขียนโค้ดจึงช่วยสร้างทักษะการเขียนโค้ดที่แท้จริง

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

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

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

มีคนเคยบอกผมว่า การเขียนโค้ดมีกฎ 80/20 ของตัวเอง และสำหรับปัญหาของมือใหม่ มันก็ค่อนข้างแม่นยำทีเดียว ปัญหาส่วนใหญ่ใช้ขั้นตอนพื้นฐาน 5 อย่าง คือ ลูป, คำสั่ง if/else, การตรวจสอบสตริง, การนับจำนวนในพจนานุกรม และการวนลูปในอาร์เรย์ ถ้าคุณเชี่ยวชาญขั้นตอนเหล่านี้ ปัญหา "ใหม่" หลายอย่างก็จะกลายเป็นปัญหาเก่าที่ปรับเปลี่ยนรูปแบบเท่านั้นเอง

โจทย์ท้าทายการเขียนโค้ดที่ดีที่สุดสำหรับผู้เริ่มต้น

10 โจทย์เขียนโค้ดง่ายๆ สำหรับมือใหม่ ลองทำดูก่อน

ไม่มีอันไหนเป็นของใหม่เลย และนั่นแหละคือประเด็นสำคัญ พวกมันปรากฏอยู่ในคอร์สเรียนพื้นฐานเกือบทุกคอร์ส เพราะมันได้ผล ห้าอันแรกใช้แค่ลูป เงื่อนไข และการจัดการสตริงหรือลิสต์เล็กน้อย ในขณะที่ห้าอันหลังจะทำให้คุณคิดถึงโครงสร้างข้อมูลที่จะใช้ก่อนที่จะพิมพ์อะไรลงไป ไม่ว่าจะเกิดอะไรขึ้น พยายามอย่าค้นหาใน Google อย่างน้อยยี่สิบนาที แม้ว่ามันจะดูไร้ประโยชน์ก็ตาม

ภารกิจที่ 1: FizzBuzz

โจทย์คือให้พิมพ์ตัวเลข 1 ถึง 100 แต่ตัวเลขที่เป็นพหุคูณของสามจะแสดงเป็น "Fizz" ตัวเลขที่เป็นพหุคูณของห้าจะแสดงเป็น "Buzz" และตัวเลขที่เป็นพหุคูณของทั้งสองอย่างจะแสดงเป็น "FizzBuzz" แทน

ฉันจำได้ว่าตอนนั้นคิดว่ามันฟังดูง่ายจนเกือบจะเป็นการดูถูกเสียด้วยซ้ำ แต่จริงๆ แล้วมันไม่ได้ง่ายขนาดนั้นหรอก ซึ่งเป็นเหตุผลที่ผู้สัมภาษณ์ชอบมันมานาน คนที่อ่านเกี่ยวกับการเขียนโค้ดมาเยอะแต่เขียนโค้ดน้อยมักจะพลาดตรงลำดับการตรวจสอบนี่แหละ เวอร์ชันของฉันในภาษา Python หน้าตาเป็นแบบนี้:

สำหรับ n ในช่วง (1, 101): ถ้า n % 15 == 0: พิมพ์ ("FizzBuzz") ถ้า n % 3 == 0: พิมพ์ ("Fizz") ถ้า n % 5 == 0: พิมพ์ ("Buzz") มิเช่นนั้น: พิมพ์ (n)

เมื่อโค้ดของคุณใช้งานได้แล้ว ให้ลากบรรทัด %15 ลงไปด้านล่างสุด รันโปรแกรม แล้วดูว่ามี FizzBuzz เหลือรอดกี่ตัว คำใบ้: ไม่มีเลย

ความท้าทายที่ 2: กลับลำดับสตริง

"hello" เข้าไป "olleh" ออกมา

ในแทบทุกภาษาจะมีทางลัดอยู่ เช่น s[::-1] ใน Python หรือ split("").reverse().join("") ใน JavaScript และการเขียนมันครั้งเดียวเพื่อดูการทำงานก็ไม่เป็นไร หลังจากนั้นผมแนะนำให้ลบมันทิ้งแล้วใช้วิธีแบบธรรมดาที่ใช้ลูปเพิ่มตัวอักษรทีละตัวจะดีกว่า ตรงนี้แหละที่คุณจะสังเกตเห็นว่าในภาษาส่วนใหญ่ สตริงไม่สามารถเปลี่ยนแปลงได้โดยตรง ซึ่งจะทำให้หลายคนสับสนในภายหลังหากพวกเขาไม่เรียนรู้เรื่องนี้มาก่อน

ความท้าทายที่ 3: ตรวจสอบคำพาลินโดรม

คำพาลินโดรมคือคำที่อ่านได้เหมือนกันทั้งสองทิศทาง เช่น "racecar" หรือ "noon" ดังนั้นฟังก์ชันของคุณควรตอบว่าใช่สำหรับคำเหล่านั้น และตอบว่าไม่ใช่สำหรับ "hello"

เมื่อวิธีนั้นได้ผลแล้ว ก็เป็นช่วงเวลาที่ดีที่จะพัฒนาทักษะการเขียนโค้ดของคุณขึ้นไปอีกขั้นด้วยการป้อนข้อความว่า "A man, a plan, a canal: Panama" ซึ่งจะผ่านได้ก็ต่อเมื่อคุณแปลงข้อความให้เป็นตัวพิมพ์เล็กและลบช่องว่างและเครื่องหมายวรรคตอนออก คุณสามารถยืมโค้ดการกลับลำดับสตริงจากโจทย์ครั้งที่แล้วมาใช้ได้ ซึ่งรู้สึกดีทีเดียว

ความท้าทายที่ 4: ลำดับฟิโบนาชชี

คุณอาจเคยเห็นลำดับนี้มาก่อน: 0, 1, 1, 2, 3, 5, 8, 13 โดยที่แต่ละจำนวนเป็นผลรวมของสองจำนวนที่อยู่ข้างหน้า ฟังก์ชันของคุณควรส่งคืนจำนวน n ตัวแรกจากลำดับนี้

แค่ตัวแปรสองตัวและลูปก็เพียงพอแล้ว ความสนุกเริ่มต้นเมื่อคุณเขียนมันใหม่ด้วยการเรียกซ้ำ (recursion) เพื่อให้ฟังก์ชันเรียกตัวเอง และจากนั้นขอค่า n = 35 บนแล็ปท็อปส่วนใหญ่ คุณจะต้องรอสักพัก และการหาสาเหตุว่าทำไมถึงเป็นเช่นนั้นก็เป็นการเริ่มต้นเรียนรู้การเขียนโปรแกรมแบบไดนามิกอย่างนุ่มนวล มันเป็นหนึ่งในโมเมนต์เล็กๆ ที่ทำให้เรารู้ว่า "อ๋อ นี่เอง" และเป็นโมเมนต์ที่ติดอยู่ในใจ

ความท้าทายที่ 5: หมุนอาร์เรย์

กำหนดให้มีอาร์เรย์และตัวเลข k จากนั้นเลื่อนองค์ประกอบทุกตัวไปทางขวา k ตำแหน่ง โดยให้องค์ประกอบที่อยู่ท้ายสุดวนกลับมาอยู่ด้านหน้า เช่น ถ้าอาร์เรย์เป็น [1, 2, 3, 4, 5] และ k = 2 คุณจะได้อาร์เรย์เป็น [4, 5, 1, 2, 3]

ความพยายามครั้งแรกส่วนใหญ่จะล้มเหลวเมื่อ k มีค่ามากกว่ารายการ การหมุนห้ารายการด้วย 7 นั้นแท้จริงแล้วก็คือการหมุนด้วย 2 นั่นเอง ซึ่งจะเห็นได้ชัดเมื่อคุณได้เห็นแล้ว และจะมองไม่เห็นจนกว่าจะได้เห็น

ถ้าคุณผ่านห้าข้อแรกไปได้โดยไม่ลำบากมากนัก เยี่ยมไปเลย ข้อต่อไปจะยากขึ้นอีกหน่อย

โจทย์ข้อที่ 6: หาจำนวนเต็มที่มากที่สุดในอาร์เรย์

การหาตัวเลขที่มากที่สุดนั้นง่ายหากคุณได้รับอนุญาตให้ใช้ฟังก์ชัน max() แต่คุณไม่ได้รับอนุญาต ให้ใช้วิธีการวนลูปแทน แล้วจึงหาตัวเลขที่ใหญ่เป็นอันดับสองโดยไม่ต้องวนลูปซ้ำสองครั้ง ตอนนี้คุณกำลังติดตามค่าสองค่าและต้องระมัดระวังว่าคุณจะอัปเดตค่าใดก่อน

การใช้ตัวเลขซ้ำและตัวเลขติดลบเป็นสิ่งที่ดีสำหรับการทดสอบ เนื่องจากโซลูชันรุ่นแรกๆ จำนวนมากมักล้มเหลวอย่างเงียบๆ เมื่อทดสอบกับตัวเลขเหล่านี้

โจทย์ข้อที่ 7: นับจำนวนสระในประโยค

การนับสระเป็นการวอร์มร่างกาย ส่วนแบบฝึกหัดจริงคือการนับสระแต่ละตัวแยกกัน แล้วส่งคืนผลลัพธ์เช่น {"a": 3, "e": 5, "i": 1, "o": 2, "u": 0}

สำหรับผู้เริ่มต้นหลายคน นี่คือช่วงเวลาที่พจนานุกรม (หรืออ็อบเจ็กต์ใน JavaScript) เริ่มมีความหมาย และนั่นสำคัญมาก เพราะมันน่าจะเป็นโครงสร้างข้อมูลที่คุณจะใช้มากที่สุดในอีกหนึ่งปีข้างหน้า

ความท้าทายที่ 8: ตรวจสอบคำสลับอักษร

คำแอนาแกรมใช้ตัวอักษรเดียวกันแต่เรียงลำดับต่างกัน เช่น "listen" และ "silent" ดังนั้นคุณกำลังเขียนฟังก์ชันที่บอกว่าสตริงสองสตริงนั้นตรงตามเกณฑ์หรือไม่

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

ความท้าทายที่ 9: ผลรวมสองส่วน

ด้วยลิสต์เช่น [2, 7, 11, 15] และเป้าหมายคือ 9 คุณจะส่งคืนตำแหน่งของตัวเลขสองตัวที่รวมกันได้เท่ากับเป้าหมาย ซึ่งในที่นี้คือ [0, 1]

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

ภารกิจที่ 10: เกมทายตัวเลข

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

มันไม่ใช่แค่ปริศนาการเขียนโปรแกรมธรรมดาๆ แต่เป็นแอปพลิเคชันขนาดเล็กที่มีการรับข้อมูลจากผู้ใช้ ลูป while และตัวเลขสุ่ม ในที่สุดก็จะมีคนพิมพ์ "กล้วย" แทนตัวเลข ดังนั้นคุณจึงต้องรับมือกับข้อมูลป้อนเข้าที่ผิดพลาดด้วย และแตกต่างจากเกมอื่นๆ ตรงที่เกมนี้คุณสามารถให้เพื่อนเล่นได้จริงๆ

เว็บไซต์ที่ดีที่สุดสำหรับการแข่งขันเขียนโค้ดออนไลน์

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

แพลตฟอร์ม เหมาะที่สุดสำหรับ รูปแบบ ค่าใช้จ่าย
เอดาบิต ผู้เริ่มต้นอย่างแท้จริง โจทย์การเขียนโค้ดขนาดพอดีคำในเบราว์เซอร์ ระดับฟรี
Codewars การฝึกฝนแบบเกม จัดอันดับ "kata" พร้อมวิธีแก้ปัญหาจากชุมชน ฟรี
การออกกำลังกาย การเรียนรู้นิสัยที่ดี หลักสูตรภาษาพร้อมตัวเลือกเสริมเป็นผู้สอนที่เป็นมนุษย์ ฟรี
ฟรีโค้ดแคมป์ การเรียนรู้แบบมีโครงสร้าง หลักสูตรพร้อมแบบฝึกหัดและใบรับรองในตัว ฟรี
แฮ็กเกอร์แรงค์ เส้นทางพัฒนาทักษะและการเตรียมความพร้อมสำหรับการทำงาน โจทย์ตามหัวข้อพร้อมระบุระดับความยาก ฟรีสำหรับผู้เรียน
ลีทโค้ด การเตรียมตัวสำหรับการสัมภาษณ์ ปัญหาเชิงอัลกอริทึมที่ติดแท็ก ง่าย/ปานกลาง/ยาก ระดับฟรี
โค้ดเชฟ มุ่งสู่การแข่งขัน เส้นทางฝึกฝนและการแข่งขันเป็นประจำ ระดับฟรี
โครงการออยเลอร์ คนรักคณิตศาสตร์ ปริศนาที่ต้องใช้คณิตศาสตร์จำนวนมาก ส่งคำตอบเท่านั้น ฟรี
การมาถึงของโค้ด ความสนุกตามฤดูกาล ปริศนารายวันที่ขับเคลื่อนด้วยเรื่องราวในเดือนธันวาคมของทุกปี ฟรี

เอดาบิต

ถ้าเพื่อนถามว่าควรเริ่มต้นจากตรงไหน ผมจะแนะนำ Edabit ครับ โจทย์ไม่ยาวมาก ทุกอย่างทำได้ในเบราว์เซอร์ และคุณจะได้สะสม XP ด้วย มีการสอน Python, JavaScript, Java, C++ และอีกหลายภาษา และคำว่า "ง่ายมาก" ก็หมายความว่าง่ายจริงๆ ครับ

Codewars

Codewars เรียกโจทย์ปัญหาของตนว่า คาตะ (ศัพท์ศิลปะการต่อสู้ หมายถึงการฝึกฝน) โดยแบ่งระดับความยากตั้งแต่ 8 คิว ซึ่งง่ายที่สุด ไปจนถึง 1 คิว ความสนุกอยู่ที่หลังจากที่คุณส่งคำตอบแล้ว คุณจะได้เห็นคำตอบของคนอื่นๆ และการนำคำตอบสิบบรรทัดที่ดูไม่ค่อยดีของคุณไปเทียบกับคำตอบสองบรรทัดที่ดูคล่องแคล่วของคนอื่น จะสอนคุณได้มากกว่าบทเรียนสอนแก้โจทย์ทั่วไปเสียอีก

การออกกำลังกาย

Exercism เป็นแพลตฟอร์มที่ไม่แสวงหาผลกำไรและให้บริการฟรีโดยสมบูรณ์ มีหลักสูตรให้เลือกเรียนมากกว่า 80 ภาษา และมีอาสาสมัครคอยให้คำแนะนำเพื่อช่วยตรวจโค้ดของคุณหากคุณขอความช่วยเหลือ คุณสามารถเรียนผ่านเบราว์เซอร์หรือดาวน์โหลดแบบฝึกหัดลงในเครื่องของคุณเองก็ได้ ผมแนะนำให้คุณเลือกแบบหลังมากกว่า เพราะจะทำให้คุณคุ้นเคยกับการใช้งาน Visual Studio Code และเทอร์มินัลมากขึ้น

ฟรีโค้ดแคมป์

ไม่ใช่แค่เว็บไซต์สำหรับฝึกทักษะอย่างเดียว แต่เป็นหลักสูตรการเรียนรู้แบบครบวงจร ซึ่งสร้างขึ้นจากแบบฝึกหัดการเขียนโค้ดเล็กๆ หลายร้อยข้อ จึงมีความเหมาะสม เหมาะอย่างยิ่งสำหรับผู้ที่ชอบโครงสร้างแบบแผน: JavaScript, Python, การออกแบบเว็บไซต์ที่รองรับการแสดงผลบนอุปกรณ์ต่างๆ และอื่นๆ อีกมากมาย พร้อมโครงการรับรองในตอนท้ายของแต่ละหลักสูตร

แฮ็กเกอร์แรงค์

HackerRank จัดเรียงปัญหาตามระดับความยาก (Python, SQL, โครงสร้างข้อมูล, อัลกอริทึม) และบอกระดับความยากของแต่ละปัญหา รวมถึงจำนวนผู้ที่แก้ปัญหาได้สำเร็จ บริษัทหลายแห่งใช้ HackerRank ในการคัดกรองผู้สมัครงาน การทำความคุ้นเคยกับอินเทอร์เฟซตั้งแต่เนิ่นๆ จะช่วยลดความกังวลในภายหลังได้

ลีทโค้ด

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

โค้ดเชฟ

CodeChef เริ่มต้นจากการเป็นเว็บไซต์สำหรับการแข่งขันเขียนโปรแกรม ปัจจุบันนี้ CodeChef ยังมีเส้นทางการฝึกฝนสำหรับผู้เริ่มต้นด้วย นอกเหนือจากการแข่งขันปกติ ดังนั้นหากการแข่งขันแบบจับเวลาฟังดูน่าสนุก CodeChef ก็เป็นสถานที่ที่เหมาะสมที่จะลองเข้าร่วมดู

โครงการออยเลอร์

โจทย์คณิตศาสตร์ที่คุณต้องใช้โค้ดในการแก้ ไม่มีโปรแกรมแก้ไขบนเว็บไซต์ คุณเขียนโปรแกรมที่ไหนก็ได้ตามใจชอบ แล้วพิมพ์ตัวเลขสุดท้ายลงไป คนที่ชื่นชอบคณิตศาสตร์จะชอบมาก ส่วนคนอื่นๆ มักจะไม่ค่อยชอบ

การมาถึงของโค้ด

ทุกเดือนธันวาคม คุณจะได้รับปริศนาสองส่วนต่อวัน ซึ่งเชื่อมโยงกันด้วยเรื่องราวสุดฮา เมื่อไม่นานมานี้ ระยะเวลาการเล่นลดลงจาก 25 วันเหลือ 12 วัน และยกเลิกกระดานผู้นำระดับโลก ดังนั้นในปัจจุบันจึงส่วนใหญ่เป็นกระดานผู้นำส่วนตัวกับเพื่อนหรือเพื่อนร่วมงาน ปริศนาเก่าๆ จะยังคงอยู่ตลอดทั้งปี และคลังเก็บปริศนาเป็นแหล่งฝึกฝนที่ยอดเยี่ยม

นอกจากนี้ คุณจะได้ยินเกี่ยวกับ Coderbyte ซึ่งผสมผสานการฝึกฝนทักษะเข้ากับหลักสูตรเตรียมสอบสัมภาษณ์ และ Topcoder ซึ่งเหมาะสำหรับนักพัฒนาที่มีประสบการณ์อยู่แล้ว

ข้อควรระวังอย่างหนึ่งคือ รายชื่อเก่าๆ จำนวนมากยังคงชี้ไปยัง Google Code Jam และ Kick Start อยู่ Google ได้ปิดตัวทั้งสององค์กรไปแล้วตั้งแต่ปี 2023 และเหลือเพียงแค่ไฟล์เก็บถาวรของโจทย์ปัญหาเท่านั้น

โจทย์ท้าทายการเขียนโค้ดที่ดีที่สุดสำหรับผู้เริ่มต้น

วิธีฝึกฝนการแก้โจทย์ปัญหาการเขียนโค้ดโดยไม่ทำให้ตัวเองหมดไฟ

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

  1. เลือกภาษาโปรแกรมหนึ่งภาษาแล้วใช้ภาษานั้นต่อไปเรื่อยๆ Python มักถูกเลือกใช้เพราะอ่านง่ายคล้ายภาษาอังกฤษ ส่วน JavaScript เหมาะสำหรับการสร้างเว็บไซต์
  2. ติดตั้งโปรแกรมแก้ไขโค้ดที่ใช้งานได้จริง โปรแกรมแก้ไขโค้ดในเบราว์เซอร์ก็ใช้ได้ดีในสัปดาห์แรก การติดตั้ง Visual Studio Code ตั้งแต่เนิ่นๆ จะช่วยให้คุณเรียนรู้การรันไฟล์ การอ่านข้อผิดพลาดในเทอร์มินัล และการใช้ดีบักเกอร์เพื่อตรวจสอบโค้ด
  3. แก้โจทย์ปัญหาวันละหนึ่งถึงสามข้อ การฝึกเขียนโค้ดทุกวันในปริมาณน้อยๆ ดีกว่าการอัดแน่นเรียนในวันอาทิตย์หกชั่วโมง รูปแบบต่างๆ จะค่อยๆ ซึมซับเข้าไประหว่างช่วงพัก และเป้าหมายเล็กๆ ก็ยากที่จะมองข้าม
  4. หลังจากทำเสร็จแล้ว ลองอ่านวิธีแก้ปัญหาอื่นๆ ดูด้วย ในเว็บไซต์อย่าง Codewars หรือ Exercism ลองดูคำตอบอื่นๆ สักสองสามคำตอบ คุณจะได้เรียนรู้แนวทางปฏิบัติที่ดีที่สุดและเทคนิคเจ๋งๆ ที่ควรนำไปใช้
  5. กลับมาทบทวนโจทย์เก่าๆ อีก ครั้ง หนึ่งสัปดาห์ต่อมา ลองทำโจทย์ข้อเดิมซ้ำอีกครั้งจากความจำ ถ้าทำไม่ได้ แสดงว่าคุณจำมันแทนที่จะเข้าใจมัน
  6. เริ่มจากโปรเจกต์ขนาดเล็ก ประมาณ 30-50 ข้อ ลองสร้างอะไรสักอย่าง เช่น รายการสิ่งที่ต้องทำ แอปพยากอากาศบน API ฟรี หรือเกมผจญภัยแบบข้อความ นั่นคือจุดเริ่มต้นที่ทักษะต่างๆ จะเริ่มทำงานร่วมกัน

สิ่งที่ควรทำเมื่อคุณติดขัดในโจทย์การเขียนโค้ด

คุณจะต้องเจอปัญหาแน่ๆ นักพัฒนาอาวุโสก็เคยเจอปัญหาแบบนี้มาก่อนพักเที่ยงเหมือนกัน สิ่งที่พวกเขามีคือวิธีการแก้ปัญหาที่เป็นระบบ ดังนั้นจงนำวิธีการนั้นมาใช้:

  • ลองอธิบายปัญหาใหม่ด้วยคำพูดของคุณเอง ดูสิ หลายครั้งที่คุณคิดว่า "ฉันแก้ปัญหานี้ไม่ได้" จริงๆ แล้วกลับกลายเป็นว่า "ฉันอ่านโจทย์ผิด"
  • ลองทำตามตัวอย่างด้วยมือ ใช้ ข้อมูลป้อนเข้าเล็กน้อย ปากกาและกระดาษ แล้วจดบันทึกทุกขั้นตอนที่คุณทำ ขอแสดงความยินดี นั่นคืออัลกอริทึมของคุณแล้ว
  • เขียนรหัสเทียมก่อน "สำหรับแต่ละตัวเลข ถ้ามันมากกว่าตัวเลขที่ใหญ่ที่สุดในปัจจุบัน ให้เก็บมันไว้" ภาษาอังกฤษธรรมดาแก้ไขได้ง่ายกว่าโค้ด
  • พิมพ์ทุกอย่างออกมา ข้อผิดพลาดส่วนใหญ่มักเกิดจากตัวแปรที่เก็บค่าแตกต่างจากที่คุณคาดคิด พิมพ์ออกมาแล้วตรวจสอบดู
  • อธิบายออกมาดัง ๆ ลองอธิบายโค้ดของคุณทีละบรรทัด ให้คนฟังหรือให้ตุ๊กตายางฟังก็ได้ ข้อผิดพลาดในซอฟต์แวร์มักจะปรากฏให้เห็นตั้งแต่กลางประโยคแล้ว
  • ใช้คำใบ้ทีละขั้นตอน แพลตฟอร์มหลายแห่งมีคำใบ้ก่อนคำตอบเต็ม ลองใช้คำใบ้ แล้วลองทำใหม่อีกครั้ง

ไม่ว่าคุณจะทำอะไรก็ตาม อย่าคัดลอกคำตอบ ให้ดูมันผ่านไปแล้วก็ไปต่อ ฉันเคยทำแบบนั้นอยู่พักหนึ่งแล้วมันก็ไม่ได้ผลอะไรเลย ถ้าคุณอ่านคำตอบแล้ว ให้ปิดแท็บนั้น รอสักชั่วโมง แล้วสร้างวิธีแก้ปัญหาด้วยตัวเองอีกครั้ง

โจทย์ท้าทายเขียนโค้ดเกี่ยวกับคริปโตเคอร์เรนซีสำหรับผู้เริ่มต้นใช้บล็อกเชน

บางทีการชำระเงินด้วยคริปโตเคอร์เรนซีหรือบล็อกเชนอาจเป็นเหตุผลที่คุณอยากเรียนเขียนโค้ดตั้งแต่แรกก็ได้ งั้นลองฝึกฝนกับโจทย์จากโลกนั้นดู พื้นฐานเหมือนกันหมด (สตริง จำนวนเต็ม API) แต่โจทย์จะดูคล้ายกับงานทางเทคนิคในโลกแห่งความเป็นจริงมากกว่า คุณไม่จำเป็นต้องเข้าใจอัลกอริธึมฉันทามติสำหรับโจทย์เหล่านี้เลย

  • ดึงราคาเหรียญแบบเรียลไทม์ เรียกใช้ API ราคาคริปโตสาธารณะฟรี พิมพ์ราคา Bitcoin ปัจจุบัน อัปเดตทุกนาที สวัสดี การร้องขอ HTTP และ JSON
  • ตรวจสอบรูปแบบที่อยู่กระเป๋าเงินดิจิทัล ตรวจสอบว่าสตริงนั้นดูเหมือนที่อยู่จริงหรือไม่: ความยาวถูกต้อง คำนำหน้าถูกต้อง และมีเฉพาะอักขระที่อนุญาตเท่านั้น เป็นการฝึกฝนการใช้สตริงที่ดี และเป็นการแนะนำเบื้องต้นเกี่ยวกับนิพจน์ปกติ (Regular Expression) อย่างง่ายๆ
  • สร้างโปรแกรมแปลงหน่วย เช่น แปลง Satoshi เป็น BTC (1 BTC = 100,000,000 satoshi) และ Wei เป็น ETH (1 ETH = 10¹⁸ Wei) คุณจะเข้าใจได้เร็วว่าทำไมตัวเลขทศนิยมกับเงินถึงไม่เข้ากัน และทำไมนักพัฒนาถึงใช้ตัวเลขจำนวนเต็มในการแสดงค่า
  • แฮชสตริงด้วย SHA-256 แฮชประโยคด้วยไลบรารีมาตรฐานของคุณ เปลี่ยนตัวอักษรหนึ่งตัว แล้วแฮชอีกครั้ง ผลลัพธ์จะแตกต่างกันอย่างสิ้นเชิง คุณสมบัตินี้เป็นส่วนสำคัญที่ทำให้บล็อกเชนมีความเสถียร
  • สร้างหน้าชำระเงินแบบง่ายๆ หน้าสินค้าที่มีปุ่ม "ชำระด้วยคริปโต" ซึ่งจะสร้างใบแจ้งหนี้ทดสอบผ่าน API ของระบบชำระเงิน

ส่วนสุดท้ายนี่แหละที่เชื่อมโยงทุกอย่างเข้าด้วยกัน: แบบฟอร์ม การเรียกใช้ API การจัดการข้อผิดพลาด และการแสดงผลลัพธ์ให้ผู้ใช้จริงเห็น เกตเวย์อย่าง Plisio เผยแพร่ API และเอกสารที่คุณสามารถนำไปใช้ในร้านค้าจำลองได้ ซึ่งทำให้แบบฝึกหัดสำหรับผู้เริ่มต้นดูคล้ายกับการผสานรวมอีคอมเมิร์ซจริง ๆ

เริ่มต้นฝึกฝนการเขียนโค้ดของคุณด้วยโจทย์เพียงข้อเดียวในวันนี้

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

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

มีคำถามอะไรไหม?

เอาตรงๆ นะ FizzBuzz ก็เหมือนกับคนส่วนใหญ่แหละ มันแค่ต้องการลูปและคำสั่ง if สองสามข้อเท่านั้นเอง และคุณสามารถอธิบายได้ในประโยคเดียว แต่คนจำนวนมากก็ยังทำลำดับการตรวจสอบผิดในครั้งแรกอยู่ดี การกลับสตริงเป็นขั้นตอนที่สองที่ดีเลยทีเดียว

Edabit เป็นเว็บที่ผมจะแนะนำให้กับมือใหม่หัดเขียนโค้ด เพราะโจทย์ไม่ยาวและไม่ต้องติดตั้งอะไรเลย ส่วน Codewars นั้นจะสนุกขึ้นเรื่อยๆ เพราะมีอันดับและคุณสามารถอ่านเฉลยของทุกคนได้ Exercism มีผู้แนะนำฟรี ซึ่งหาได้ยาก freeCodeCamp เหมาะสำหรับคนที่ชอบเส้นทางการเรียนรู้ที่กำหนดไว้ ส่วน LeetCode นั้นค่อยว่ากันทีหลัง เพราะแม้แต่โจทย์ระดับง่ายก็คาดหวังพื้นฐานจากผู้ใช้มาแล้ว

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

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

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

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

Ready to Get Started?

Create an account and start accepting payments – no contracts or KYC required. Or, contact us to design a custom package for your business.

Make first step

Always know what you pay

Integrated per-transaction pricing with no hidden fees

Start your integration

Set up Plisio swiftly in just 10 minutes.