อัลกอริทึม และ โมเดลโลจิก
ก่อนที่เราจะไปลงรายละเอียดและขั้นตอนการเขียนโปรแกรม สิ่งแรกที่นักพัฒนาฯ ทุกคนจะต้องมีนั่นก็คือการคิดที่เป็นไปตามขั้นตอน แยกออกมาเป็นส่วนเหมือนจิ๊กซอว์ สามารถทำงานร่วมกันได้ตามที่กำหนดไว้ และยืดหยุ่นเพื่อรองรับการพัฒนา
เราจึงจะมาเริ่มต้นกันกับการฝึกวิธีคิดเพื่อให้เหมือนนักพัฒนาฯ กันครับ กับการเรียนในหัวข้อ "อัลกอริทึม"
อัลกอริทึมคืออะไร
อัลกอริทึม (Algorithm) คือการทำงานหรือกฏการทำงานของระบบคอมพิวเตอร์เพื่อใช้ในการแก้ไขปัญหาด้วยการทำการคำนวณ โดยลักษณะการทำงานของอัลกอริทึมนั้นสามารถถูกสร้างหรือสอนโดยมนุษย์ (ผู้ให้คำสั่ง)
อัลกอริทึมจึงได้ถูกนำไปใช้งานโดยเฉพาะในด้านคอมพิวเตอร์ เพื่อทำงานตามโจทย์และลักษณะงานที่กำหนดให้ และแสดงผลลัพธ์หรือทำกิจกรรมตามที่เราต้องการ และด้วยประสิทธิภาพ (Efficiency) ที่เป็นไปตามขั้นตอนการทำงานที่เขียนไว้
วันนี้เราจะมาเขียนขั้นตอนการทำงาน เพื่อให้เราได้เห็นว่าการเขียนโค้ดนั้นก็เหมือนกับการทำงานตามที่เราต้องการเลย
การแบ่งขั้นตอนออกมาเป็นลำดับ
เช่นเราได้สร้างตัวอย่างว่าภายในหนึ่งวันเราทำอะไรบ้าง ก็จะเขียนสรุปออกมาได้อย่างคร่าว ๆ ว่าหนึ่งวันนั้นตื่นมาก็ไปแปรงฟัน และหลังจากนั้นจึงดู Netflix จนหมดวันอีกครั้ง โดยเราก็จะแปลงออกมาเป็นลำดับขั้นตอนง่าย ๆ ก็จะได้ดังขั้นตอนดังนี้
แต่จริง ๆ แล้วมันก็ยังมีขั้นตอนอื่นที่ต้องทำให้เสร็จอีกก่อนที่จะไปดู Netflix (หรือก็คือทำภารกิจสำเร็จ) หรือก็คือเราก็จะต้องทำการแตกงานออกมาเป็นลำดับขั้นตอนที่ชัดเจนมากกว่านี้เพื่อให้ผู้อื่นสามารถเข้าใจขั้นตอนที่เราต้องทำได้ หรือก็คือการแบ่งงาน (Task) ออกมาเป็นงานย่อย ๆ (Sub-task)** โดยเราจะได้ใช้ทักษะในการแบ่งงานในการเขียนโปรแกรมอยู่เรื่อย ๆ
โดยเราก็ได้ทำการเขียนขั้นตอนเข้าไปเพิ่มเติมแล้ว ก็จะได้ลำดับขั้นตอนแบบยาวเหยียดแบบนี้หล่ะครับ
แต่ขนาดนี้ พี่เองก็ยังลืมที่จะระบุว่าถ้ารีโมททีวีนั้นไม่อยู่ใกล้โซฟาจะต้องทำอย่างไร? หรือถ้าเราลุกออกมาจากเตียงแล้วไปห้องน้ำที่ไหนของบ้าน? แล้วหยิบแปรงสีฟันอันไหนก็ได้เหรอ?
จะเห็นได้ว่าการเขียนลำดับขั้นตอนให้ละเอียดเพียงพอนั้นเป็นเรื่องสำคัญเช่นกัน
- เพราะว่าหากเราไม่ได้ระบุมันมากเพียงพอ มันก็จะไม่รู้ว่าจะต้องทำอะไรและจะไปต่อไม่ถูก
- หรือถ้าบอกมันมากเกินไปก็จะทำให้เราเองก็จะต้องเหนื่อยซ้ำเพื่ออธิบายหรือแก้ไขวิธีการในภายหลังอีก
โดยในการเรียนกับพี่ เราจะเจอโจทย์ตรงนี้มาให้ลองเข้าไปเล่นกันเรื่อย ๆ เลย
แปลงขั้นตอนให้กลายเป็นโค้ด
หากว่าเราแปลงขั้นตอนข้างต้น 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
- ลดความเร็วเหลือ 4
- ลดความเร็วเหลือ 3
- ลดความเร็วเหลือ 2
- ลดความเร็วเหลือ 1
- วอร์มอัพ
โมเดลโลจิกคืออะไร
ก่อนหน้านี้เรารู้อยู่แล้วว่าเราต้องทำอย่างไรทำอะไรบ้างอย่างชัดเจน แต่เช่นเดียวกันที่เราเองนั้นก็จะต้องคิดก่อนว่าเราจะทำอันนี้ได้หรือไม่ หรือถ้าจะทำแล้วต้องทำอีกเท่าไหร่ นี่แหละสิ่งที่เราจะมาเรียน นั่นก็คือเรื่องของโลจิกนั่นเอง
อีกเช่นเคยที่ว่านี่จะเป็นครั้งแรกที่น้อง ๆ ได้นำเอาการคิดแบบมีตรรกะเพื่อสร้างมันขึ้นมาเป็นขั้นตอนที่มี "ถ้าอย่างนั้น จะทำอย่างนี้" เพื่อให้เข้าใจเป็นคอนเซ็พท์เอาไว้เช่นเดียวกัน ถ้าตอนนี้น้อง ๆ ยังไม่เข้าใจก็ไม่เป็นไรนะ!
คิดก่อนทำได้อย่างไร?
เราคิดก่อนที่จะทำได้เพราะว่าเรารู้ว่าอะไรที่จะเป็นตัวกำหนดขั้นตอนถัดไป และรู้ได้ว่าอะไรเป็นอย่างไรเราถึงจะไปทำอย่างนี้ โดยเราก็ได้มีตัวอย่างการคิดดังนี้
ตัวอย่าง: ถ้าเรามีเงิน 20 บาทเราจะซื้อโค้กหนึ่งขวดใหญ่ แต่ถ้าเรามีไม่ถึง 20 บาทเราก็จะซื้อโค้ดหนึ่งขวดเล็ก
ทำให้เราสรุปได้ว่า เราจะต้องตรวจสอบเงินที่เรามีอยู่ก่อนที่จะไปซื้อสินค้า เช่นถ้าเงินเรามีมากกว่าหรือเท่ากับ 20 เราต้องทำแบบนึง และถ้ามีน้อยกว่าเราก็จะทำอีกอย่างหนึ่ง
การทำซ้ำคือส่วนหนึ่งได้อย่างไร?
เช่นเดียวกันกับการคิดก่อนทำ แต่ครั้งนี้เราปรับมันให้เราทำงานใด ๆ ซ้ำตามจำนวนครั้งที่เราต้องการ หรือทำซ้ำจนกว่าเราจะไม่อยากทำแล้ว
ตัวอย่าง ถ้าเรามีเงิน 100 บาท ในวันนี้เราจะไปซื้อโค้กหนึ่งขวดใหญ่หนึ่งขวดในราคา 20 บาท และไปซื้อทุกวันจนเงินเราไม่เหลือพอที่จะซื้อโค้กขวดใหญ่ได้อีก
ทำให้เราสรุปได้ว่า เราจะต้องตรวจสอบเงินที่เรามีอยู่ก่อนที่จะไปซื้อสินค้า เช่นถ้าเงินเรามีมากกว่าหรือเท่ากับ 20 เราจะซื้อในวันนี้ โดยที่เงินของเราก็จะหายไป 20 บาท และพรุ่งนี้ค่อยว่ากันอีกที
น้อง ๆ เห็นหรือยังว่ามันมีความเหมือนกันอยู่ เพียงแต่ว่าการกระทำใด ๆ นั้นสามารถทำซ้ำได้, ซ้ำไม่ได้, หรือไม่ต้องทำซ้ำเท่านั้นเอง
โจทย์การใช้โลจิก
ให้น้อง ๆ ลองทำการแบ่งงานออกมาเป็นขั้นตอน จากการเล่าขั้นตอนดังต่อไปนี้:
เราจะไปกินข้าวเที่ยงข้างนอกเมื่อตอนนั้นหิว โดยที่ว่าถ้าข้างนอกฝนตกก็จะขอสั่งผ่านแอพฯ และเราก็จะไปสั่งอาหารที่ร้านที่เปิดและอยู่ใกล้บ้านมากที่สุดก่อน โดยที่เราจะผ่านหน้าร้านตามสั่งก่อน ตามด้วยร้านก๋วยเตี๋ยว และร้านสะดวกซื้อเป็นที่สุดท้าย
เฉลยโจทย์การใช้โลจิก (แตะเพื่อดูคำตอบ)
- ตรวจสอบว่าเราหิวหรือไม่
- ถ้าหิวให้ทำต่อไป
- ถ้าไม่หิวให้หยุดการทำงาน (หยุดขั้นตอนการไปกินข้าว)
- ตรวจสอบว่าข้างนอกฝนตกหรือไม่
- ถ้าตกให้สั่งผ่านแอพฯ
- ถ้าไม่ตกให้ทำต่อไป
- เดินไปยังร้านที่ใกล้ที่สุด
- ตรวจสอบว่าร้านเปิดหรือไม่
- ถ้าเปิดให้สั่งอาหารที่ร้านนั้นทันที
- ถ้าไม่เปิดให้ไปร้านถัดไปจนกว่าจะไปถึงร้านที่เปิด :::
ซึ่งเราก็จะเห็นว่าการใช้งานโลจิกนั้นสามารถเป็นส่วนหนึ่งของอัลกอริทึมของเราได้ โดยเราจะได้เริ่มเรียนเกี่ยวกับการเลือกและการทำซ้ำในหัวข้อถัด ๆ ไป