อัลกอริทึม และ โมเดลโลจิก

ก่อนที่เราจะไปลงรายละเอียดและขั้นตอนการเขียนโปรแกรม สิ่งแรกที่นักพัฒนาฯ ทุกคนจะต้องมีนั่นก็คือการคิดที่เป็นไปตามขั้นตอน แยกออกมาเป็นส่วนเหมือนจิ๊กซอว์ สามารถทำงานร่วมกันได้ตามที่กำหนดไว้ และยืดหยุ่นเพื่อรองรับการพัฒนา

เราจึงจะมาเริ่มต้นกันกับการฝึกวิธีคิดเพื่อให้เหมือนนักพัฒนาฯ กันครับ กับการเรียนในหัวข้อ "อัลกอริทึม"

อัลกอริทึมคืออะไร

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

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

วันนี้เราจะมาเขียนขั้นตอนการทำงาน เพื่อให้เราได้เห็นว่าการเขียนโค้ดนั้นก็เหมือนกับการทำงานตามที่เราต้องการเลย

การแบ่งขั้นตอนออกมาเป็นลำดับ

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

ตื่นนอน ลุกไปแปรงฟัน ดู Netflix

แต่จริง ๆ แล้วมันก็ยังมีขั้นตอนอื่นที่ต้องทำให้เสร็จอีกก่อนที่จะไปดู Netflix (หรือก็คือทำภารกิจสำเร็จ) หรือก็คือเราก็จะต้องทำการแตกงานออกมาเป็นลำดับขั้นตอนที่ชัดเจนมากกว่านี้เพื่อให้ผู้อื่นสามารถเข้าใจขั้นตอนที่เราต้องทำได้ หรือก็คือการแบ่งงาน (Task) ออกมาเป็นงานย่อย ๆ (Sub-task)** โดยเราจะได้ใช้ทักษะในการแบ่งงานในการเขียนโปรแกรมอยู่เรื่อย ๆ

โดยเราก็ได้ทำการเขียนขั้นตอนเข้าไปเพิ่มเติมแล้ว ก็จะได้ลำดับขั้นตอนแบบยาวเหยียดแบบนี้หล่ะครับ

ตื่นนอน ลุกออกจากเตียง เดินไปห้องน้ำ หยิบแปรงสีฟัน หยิบยาสีฟัน บีบยาสีฟันไปที่แปรงสีฟัน แปรงฟัน เดินไปหน้าทีวี หยิบรีโมท เปิด Netflix นั่งที่โซฟา ดู Netflix

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

จะเห็นได้ว่าการเขียนลำดับขั้นตอนให้ละเอียดเพียงพอนั้นเป็นเรื่องสำคัญเช่นกัน

  • เพราะว่าหากเราไม่ได้ระบุมันมากเพียงพอ มันก็จะไม่รู้ว่าจะต้องทำอะไรและจะไปต่อไม่ถูก
  • หรือถ้าบอกมันมากเกินไปก็จะทำให้เราเองก็จะต้องเหนื่อยซ้ำเพื่ออธิบายหรือแก้ไขวิธีการในภายหลังอีก

โดยในการเรียนกับพี่ เราจะเจอโจทย์ตรงนี้มาให้ลองเข้าไปเล่นกันเรื่อย ๆ เลย

แปลงขั้นตอนให้กลายเป็นโค้ด

หากว่าเราแปลงขั้นตอนข้างต้น 12 ขั้นตอนมันออกมาเป็นโค้ด ก็จะได้ประมาณนี้ครับ:

wakeUp()                                # ตื่น
gotOutFromBed()                         # ลุกขึ้นออกจากเตียง
goTo('Toilet')                          # เดินไปยัง: ห้องน้ำ
getItem('Toothbrush')                   # หยิบสิ่งของ: แปรงสีฟัน
getItem('Toothpaste')                   # หยิบสิ่งของ: ยาสีฟัน
combineItem('Toothbrush', 'Toothpaste') # บีบยาสีฟันไปที่แปรงสีฟัน
brushTeeth()                            # แปรงฟัน
goTo('Sofa')                            # เดินไปยัง: โซฟา
getItem('Remote TV')                    # หยิบ: รีโมททีวี
openTV()                                # เปิดทีวี
openNetflix()                           # เปิดดู Netflix

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

และแถมว่าภายในขั้นตอนนั้นก็ยังมีขั้นตอนที่เราต้องไประบุเพิ่มเติมอีก เช่น getItem() คือต้องทำอย่างไรบ้าง เช่นส่องหาของที่ตรงกับสิ่งที่เราต้องการค้นหาในพื้นที่ใกล้ตัวเรา และเมื่อทำเสร็จแล้วเราก็ต้องหยิบเอามาไว้ใส่ในมือเป็นต้น

การจัดขั้นตอนให้เป็นกลุ่มและเปลี่ยนแปลงง่าย

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

...นั่นเองครับ แต่เราก็รู้อยู่แล้วว่าการลุกไปแปรงฟันนั้นต้องทำอย่างไร มีขั้นตอนที่ตายตัว เราก็เลยสามารถกำหนดออกมาเป็นขั้นตอนได้เลยดังนี้

wakeup()
brush_teeth()
watch_netflix()

แล้วเราก็ระบุไปว่า brushYourTeeth() ต้องทำดังต่อไปนี้

got_out_from_bed()
go('Toilet')
get_item('Toothbrush')
get_item('Toothpaste')
use_item('Toothbrush', 'Toothpaste')
use_item('Toothbrush')

และระบุว่า watchNetflix() ต้องทำดังต่อไปนี้

goTo('Sofa')
getItem('Remote TV')
openTV()
openNetflix()

การเขียนเพื่อใช้งานจริง

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

แต่ครั้งนี้เราก็จะเขียนโปรแกรมที่จะใช้งานจริงแบบนี้

def wakeUp():
    print('Wake up')

def gotOutFromBed():
    print('Got out from bed')

def goTo(place):
    print('Go to ' + place)

def getItem(item):
    print('Get ' + item)

def combineItem(item1, item2):
    print('Combine ' + item1 + ' and ' + item2)

def brushTeeth():
    print('Brush teeth')

def openTV():
    print('Open TV')

def watchNetflix():
    print('Watch Netflix')

wakeUp()
gotOutFromBed()
goTo('Toilet')
getItem('Toothbrush')
getItem('Toothpaste')
combineItem('Toothbrush', 'Toothpaste')
brushTeeth()
goTo('Sofa')
getItem('Remote TV')
openTV()
openNetflix()

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

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

โจทย์การใช้อัลกอริทึม

ให้น้อง ๆ ลองทำการแบ่งงานออกมาเป็นขั้นตอน จากการเล่าขั้นตอนดังต่อไปนี้:

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

เฉลยโจทย์การใช้อัลกอริทึม (แตะเพื่อดูคำตอบ)
  1. ใส่เสื้อผ้าออกกำลังกายจากบ้าน
  2. ออกจากบ้าน
  3. เดินทางไปยังสวนที่ใกล้บ้านที่สุด
  4. วอร์มอัพ
  5. เดินเหยาะ
  6. เริ่มความเร็วเป็น 1
  7. เพิ่มความเร็วเป็น 2
  8. เพิ่มความเร็วเป็น 3
  9. เพิ่มความเร็วเป็น 4
  10. เพิ่มความเร็วเป็น 5
  11. ลดความเร็วเหลือ 4
  12. ลดความเร็วเหลือ 3
  13. ลดความเร็วเหลือ 2
  14. ลดความเร็วเหลือ 1
  15. วอร์มอัพ

โมเดลโลจิกคืออะไร

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

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

คิดก่อนทำได้อย่างไร?

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

ตัวอย่าง: ถ้าเรามีเงิน 20 บาทเราจะซื้อโค้กหนึ่งขวดใหญ่ แต่ถ้าเรามีไม่ถึง 20 บาทเราก็จะซื้อโค้ดหนึ่งขวดเล็ก

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

การทำซ้ำคือส่วนหนึ่งได้อย่างไร?

เช่นเดียวกันกับการคิดก่อนทำ แต่ครั้งนี้เราปรับมันให้เราทำงานใด ๆ ซ้ำตามจำนวนครั้งที่เราต้องการ หรือทำซ้ำจนกว่าเราจะไม่อยากทำแล้ว

ตัวอย่าง ถ้าเรามีเงิน 100 บาท ในวันนี้เราจะไปซื้อโค้กหนึ่งขวดใหญ่หนึ่งขวดในราคา 20 บาท และไปซื้อทุกวันจนเงินเราไม่เหลือพอที่จะซื้อโค้กขวดใหญ่ได้อีก

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

น้อง ๆ เห็นหรือยังว่ามันมีความเหมือนกันอยู่ เพียงแต่ว่าการกระทำใด ๆ นั้นสามารถทำซ้ำได้, ซ้ำไม่ได้, หรือไม่ต้องทำซ้ำเท่านั้นเอง

โจทย์การใช้โลจิก

ให้น้อง ๆ ลองทำการแบ่งงานออกมาเป็นขั้นตอน จากการเล่าขั้นตอนดังต่อไปนี้:

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

เฉลยโจทย์การใช้โลจิก (แตะเพื่อดูคำตอบ)
  1. ตรวจสอบว่าเราหิวหรือไม่
    1. ถ้าหิวให้ทำต่อไป
    2. ถ้าไม่หิวให้หยุดการทำงาน (หยุดขั้นตอนการไปกินข้าว)
  2. ตรวจสอบว่าข้างนอกฝนตกหรือไม่
    1. ถ้าตกให้สั่งผ่านแอพฯ
    2. ถ้าไม่ตกให้ทำต่อไป
  3. เดินไปยังร้านที่ใกล้ที่สุด
  4. ตรวจสอบว่าร้านเปิดหรือไม่
    1. ถ้าเปิดให้สั่งอาหารที่ร้านนั้นทันที
    2. ถ้าไม่เปิดให้ไปร้านถัดไปจนกว่าจะไปถึงร้านที่เปิด :::

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

แก้ไขล่าสุด:
เขียนโดย: Kunanon Srisuntiroj