Systematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคนSystematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคน

Systematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคน

by arnondora on January 28, 2019

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

การเขียนโปรแกรม ไม่ใช่ภาษา แต่เป็น การแก้ปัญหา

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

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

เริ่มจากสิ่งที่เรารู้กันก่อน ก็น่าจะมีอยู่ 2 อย่างหลัก ๆ เลยนั่นคือ

  1. ที่อยู่ต้นทาง นั่นคือบ้าน
  2. ที่อยู่ปลายทาง นั่นคือ มหาลัย

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

  1. ขึ้นแท๊กซี่
  2. รถเมล์ 515 -> เดิน 330 เมตร
  3. รถเมล์ 111 -> รถเมล์ 515 -> ขึ้นพี่วิน
  4. ขึ้นพี่วิน -> รถกระป๋อง -> รถเมล์ 123
  5. รถเมล์ 112 -> รถเมล์ 514 -> รถเมล์ 121 -> ขึ้นพี่วิน
  6. รถเมล์ 112 -> รถกระป๋อง -> รถเมล์ 515 -> ขึ้นพี่วิน -> เดิน 100 เมตร

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

ก่อนเราจะเริ่มต้นการทดลอง ลองนึกดูก่อนว่า เราจะทำมันยังไงถึงเราจะได้คำตอบที่เราต้องการ นั่นคือ เดินทางแบบไหนเร็วที่สุด โอเค วิธีแรก เราอาจจะบอกว่า เราก็ลองจับเวลาการเดินทางดูมั้ย ก็เอานาฬิกาจับเวลามาจับเวลาตั้งแต่เราออกจากบ้าน จนไปถึงมหาลัย แล้วมีอะไรที่ต้องคิดอีกมั้ย ? ลองคิดก่อนแล้วค่อยอ่านต่อ…

แล้วเวลาในการออกละ ? ถ้าเราออกช้าหรือออกเร็ว จะทำให้เราใช้เวลานานรึเปล่า ณ ตอนนี้เรายังไม่รู้ ถามว่าเราควรทำอย่างไร ?

  1. ก็ Fix เป็นเวลานึงไปก่อน แล้วค่อยว่ากัน
  2. ตอนทดลองการเดินทางแต่ละครั้ง เราก็แค่ออกเวลาต่างกัน

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

สิ่งที่เรามี : วิธีการเดินทาง (6 แบบที่เล่าไป)
สิ่งที่เราอยากรู้ : วิธีการเดินทางที่ทำให้เราเดินทางจากบ้านถึงมหาลัยได้เร็วที่สุด
สิ่งที่ต้องควบคุม : เวลาออกจากบ้าน

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

วิธีที่ 1 : 40 นาที
วิธีที่ 2 : 65 นาที
วิธีที่ 3 : 75 นาที
วิธีที่ 4 : 70 นาที
วิธีที่ 5 : 75 นาที
วิธีที่ 6 : 90 นาที

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

ถัดไปเราลองมาตอบคำถามที่เราค้างไว้ก่อนหน้านี้กันนั่นคือ เวลาที่เราออกมีผลกับเวลาในการเดินทางหรือไม่ ? ดังนั้น เราก็น่าจะต้องกำหนดการทดลองดังนี้

สิ่งที่เรามี : วิธีการเดินทาง (6 แบบที่เล่าไป)
สิ่งที่เราอยากรู้ : เวลาออกจากบ้าน
สิ่งที่ต้องควบคุม : วิธีการเดินทางที่ทำให้เราเดินทางจากบ้านถึงมหาลัยได้เร็วที่สุด

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

5.00 : 20 นาที
5.30 : 30 นาที
6.00 : 45 นาที
6.30 : 70 นาที
7.00 : 100 นาที

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

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

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

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

การวาดปัญหาง่าย ๆ

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

Systematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคน

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

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

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

เราขอยกตัวอย่างเป็นปัญหาทาง Bioinformatics ง่าย ๆ กัน หลาย ๆ คนที่เรียนสายวิทย์ตอนมัธยมปลายมาน่าจะรู้จักสิ่งที่เรียกว่า Central Dogma ใช่ม่ะ

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

ในปัญหานี้ เราเริ่มต้นด้วยข้อมูลที่แสนเรียบง่ายคือ เบส A,T,C และ G (เราจะไม่ลงลึกนะ ไว้จะมาเล่าใน Blog เต็ม ๆ) แต่จบด้วย Amino ได้ถึง ตำแหน่งละ 23 รูปแบบ เช่น Met-Thr-Pro ไปเรื่อย ๆ ที่พอ Amino ต่อกันเรื่อย ๆ จนกลายเป็น Polypeptide ที่เราเอามาใช้นั่นเอง

Input : ATGAATCCGGAATCTAGGTCCTGCCACTGGGTCTGAATCAA
Output : MNPESRSCHWV

วันนี้เราจะมาลองทำโจทย์นี้กัน คือ เราจะให้ DNA มาความยาวเท่าไหร่ไม่รู้ แล้วให้หาว่าเราจะได้ Polypeptide ที่ประกอบด้วย Amino Acid อะไรบ้าง

ถ้าเราไม่เคยเรียนมาเลย หรือลืมไปหมดแล้ว ปัญหานี้ เราพยายามจะจำลองการทำงานของธรรมชาติ โชคดีที่มีคนศึกษาเรื่องนี้มาแล้ว ทำให้เราเข้าใจกระบวนการการทำงานของมันค่อนข้างละเอียดเลยละ ในกระบวนการแปลงตั้งแต่ DNA ให้กลายเป็น Polypeptide มันจะถูกแบ่งออกเป็น 2 ขั้นตอนใหญ่ ๆ ตามรูปด้านบนนั่นคือ Transcription และ Translation

Systematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคน

เวลาเราวาดออกมา เราจะวาดออกมาแบบภาพด้านบน เราจะเริ่มด้วยของที่ต้องใช้ก่อน นั่นคือ DNA แล้วข้างลูกศร เราก็เขียนสิ่งที่ DNA จะถูกกระทำลงไป และมันก็จะได้ mRNA ออกมา และ mRNA ก็ถูก Translate กลายเป็น Polypeptide นั่นเอง เราจะใช้ Cause & Effect แบบนี้แหละในการเขียนวิธีการแก้ปัญหาออกมา

Systematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคน

แต่ในแต่ละขั้นตอนก็จะมีขั้นตอนย่อย ๆ เป็นของตัวเอง เหมือนเป็น Sub-Task ไปเรื่อย ๆ เลย อย่างใน Transcription เอางานหลัก ๆ ก่อน ก็น่าจะเป็นการแปลง DNA ให้กลายเป็น mRNA ถ้าเราไม่รู้อะไรเลย เรามองว่ามันก็เป็นเหมือนโจทย์ซ้อนโจทย์อีกที สมมุติว่า เราได้ตัวอย่างมาเป็นแบบนี้

Input : ATGAATCCGGAATCTAGGTCCTGCCACTGGGTCTGAATCAA
Output : AUGAAUCCGGAAUCUAGGUCCUGCCACUGGGUCUGA

อันนี้คือ DNA เดียวกับที่เราให้ดูเมื่อกี้เลยนะ แต่ Output เป็นสิ่งที่เราอยากได้ของปัญหาการทำ Transcription นี้ สำหรับคนที่รู้เรื่องนี้อยู่แล้วก็ทำเป็นไม่รู้ไปนะ อะตอนนี้เท่ากับว่า เรามีปัญหาอยู่ เรารู้ว่า สิ่งที่เรามีคือ DNA ชุดนึง และเราอยากได้ mRNA ตัวนึงแบบในตัวอย่าง

ไหนเราลองเทียบดูสิ๊ว่า มันมีอะไรต่าง ถ้าดูเผิน ๆ ก็คล้ายอยู่นะ คิดว่ามีอะไรที่แตกต่างไป ไบ้ให้ว่ามีอยู่ 2 จุด ลองหาไปนะอย่าขี้โกง ถัดไปจะเป็นเฉลย

  • เราเปลี่ยนจาก T เป็น U อันนี้เป็นเหตุผลทางชีววิทยา แต่สามารถสังเกตจากข้อมูลได้ ถึงจะไม่ได้รู้มาก่อน ก็สามารถสังเกตได้ง่ายเลยละ
  • ความยาวมันเปลี่ยนไป เอ่ๆๆๆ ทำไมนะ ? อันนี้มันเป็นเหตุผลทางชีววิทยาอีกเหมือนกัน ซึ่งถ้าเราไม่เคยรู้มากก่อน เราอาจจะไม่แน่ใจเท่าไหร่ว่ามันตัดออกด้วยสาเหตุอะไร จริง ๆ แล้วเราตัดส่วนที่เกิดออกนั่นคือเวลาเราเอาไป Translate ในขั้นตอนต่อไป เราจะมีรหัสเริ่ม (Start Codon) และ รหัสจบ (Stop Codon) หนึ่งในรหัสจบคือ UGA ถ้ามีมันตรงไหนก็คือ จบการสร้าง Polypeptide เส้นนั้นแล้ว ทำให้ตำแหน่งต่อไปที่ไม่ได้ขึ้นต้นด้วย Start Codon ก็จะไม่ได้ใช้นั่นเอง ทำให้เราต้องตัด 6 ตัวที่เหลือออกไป เราไม่เล่าเยอะละกันนี่ไม่ใช่ Blog สอนเรื่อง Central Dogma ฮ่า ๆ

หลังจากที่เราลองดูแล้วว่าสิ่งที่เรามี และสิ่งที่เราต้องการมันต่างกันยังไง และเราก็รู้แล้วว่า เราจะต้องทำมันยังไงให้ได้ออกมาในแบบที่เราต้องการ ก็ลองเขียนออกมาเป็นขั้นตอนต่อจากรูปที่เราวาดอันใหญ่ก่อนหน้านี้กัน

Systematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคน

เราก็จะได้รูปแบบด้านบนออกมา เป็นขั้นตอนของการ Transcription นั่นเอง ตอนนี้เราก็จัดการกับปัญหาแรกได้แล้ว ไปที่ขั้นตอนต่อไปเลยดีกว่านั่นคือ Translation

Input : AUGAAUCCGGAAUCUAGGUCCUGCCACUGGGUCUGA
Output : MNPESRSCHWV

เหมือนเดิม เรามาดูกันดีกว่าว่าสิ่งที่เรามีกับสิ่งที่เราอยากได้มันหน้าตาต่างกันยังไง ดูเผิ่น ๆ จะเห็นว่าสิ่งที่เราต้องการดูจะสั้นกว่านะ และไม่มีตัวอักษรที่เหมือนกันเลย ลองเข้าไปดูให้ลึกขึ้นกัน ลองดูที่จำนวนตัวอักษรมั้ย ไหน ๆ เราก็เห็นมันสั้นกว่าแล้ว สิ่งที่เราต้องการมีแค่ 11 ตัวเท่านั้น ในขณะที่สิ่งที่เรามี 36 ตัว เอ๋ มันดูไม่น่าจะมีความสัมพันธ์อะไรกันเลย งั้นเราไบ้หน่อยละกันว่า Stop Condon เราจะไม่เขียนนะ ดังนั้น อื้ม… ทำให้สิ่งที่เราต้องการมีทั้งหมด 12 ตัว มันน่าจะทำให้ดูมีอะไรมากขึ้น

ถ้าไม่รู้อะไรเลย ลองเอามาหารกันเลยม่ะ เอา 36 หารด้วย 12 อ้าว ลงนิ ทำให้เราเดาได้เลยว่า เราน่าจะต้องใช้ 3 ตัวเพื่อแทนค่าให้เป็น 1 ตัวที่เราต้องการ ซึ่งก็ถูกต้องฮ่ะ

Codon Table

ในการ Translate จริง ๆ 3 เบสจะแทนออกมาได้ 1 Amino โดยใช้ตามตารางด้านบนได้เลย ดังนั้นวิธีการแก้ปัญหาง่าย ๆ ก็คือ เราก็ค่อย ๆ จับออกมาทีละ 3 ตัวแล้วเอาเข้าไปเทียบกับตารางเราก็จะได้ผลลัพธ์ออกมาแล้ว

Systematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคน

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

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

Systematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคน อันนี้เราเขียนตอนเรียน Molecular Technique เพราะตอนนั้นจำอะไรไม่ได้เลย ไม่เข้าใจสักอย่าง เลยเขียนออกมาเพื่อให้เราเข้าใจแต่ละขั้นตอน

จริง ๆ เราใช้วิธีการเขียนแบบนี้มานนานแล้ว แต่พึ่งเห็นประโยชน์ของมันแบบจริง ๆ จัง ๆ จากตอนที่เราเรียนวิชา Molecular Technique ที่ตอนนั้นเราเรียน Lab นี่แหละ แล้ว ขั้นตอนมันเยอะมาก ๆ เราอ่านแล้วจับขั้นตอนมันยากมากเลย เพราะเดี๋ยวหยอดโน้นหยอดนี่ เราเลยเขียนออกมาเป็นรูปแบบนี้เพื่อให้เข้าใจได้ง่ายขึ้น จริง ๆ มันก็คล้าย ๆ กับ Flow Chart แต่เราบอกด้วยว่า ในแต่ละขั้นตอนเราได้อะไรออกมา เพื่อให้เราเข้าใจมันมากขึ้นนั่่นเอง

Systematic Thinking และ Scientific Method คืออะไร ?

อ่านมาถึงตอนนี้แล้ว เราว่าหลาย ๆ คนก็น่าจะ งง ว่า อะไรของแก !! ที่เล่ามามันเกี่ยวกับหัวเรื่องยังไง ?? โอเค เราค่อย ๆ ดูไปทีละคำละกัน เริ่มที่ Systematic Thinking หรือ การคิดอย่างเป็นระบบ ถ้าเป็นนักคอมพิวเตอร์ก็ง่าย ๆ เลยฮ่ะ ทำยังไงก็ได้ให้สิ่งที่เราคิดมันออกมาเป็น Graph หรือไม่ก็มี Pattern อะไรบางอย่างออกมา ถ้าพูดภาษาคนก็น่าจะเป็น การคิดเป็นเครือข่าย คิดเป็นลำดับขั้นตอน เป็นวงจรอะไรก็ว่ากันไป

กับคำว่า Scientific Method คือ วิธีการทางวิทยาศาสตร์ เราว่ามันเป็น ระบบที่ดีเลยนะในการคิดอย่างเป็นระบบน่ะ โดยมันจะประกอบด้วย 5 ขั้นตอนคือ

  1. กำหนดปัญหา เราต้องมาดูกันก่อนว่า ปัญหาของเราคืออะไร และเกิดขึ้นได้ยังไง โดยอาจจะใช้การสังเกตนั่นเอง
  2. ตั้งสมมุติฐาน ไหนลองมาดูสิ๊ว่า จากปัญหาแล้ว มันน่าจะมีวิธีแก้ปัญหาอะไรบ้างนะ
  3. ตรวจสอบสมมุติฐาน เราก็ต้องเอาสมมุติฐานของเรามาทดลองหน่อยสิว่า มันจริงอย่างที่เราคิดมั้ย อย่างมีระบบ โดยเราจะต้องยึดสมมุติฐานของเราเป็นหลักเสมอ
  4. วิเคราะห์ผล หลังจากลองแล้ว ผลเป็นยังไงกันนะ ? ได้ตามสมมุติฐานหรือไม่ ?
  5. สรุปผล ทีนี้เราต้องเอาข้อมูลมารวมกันละ และสรุปหน่่อยสิว่า ทำไมมันได้ ทำไมมันไม่ได้กันละ คิดว่าอะไรเป็นปัจจัย ?

แล้วเมื่อกี้เราใช้ไปเหรอ ?

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

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

การใช้ Systematic Thinking และ Scientific Method เป็นเรื่องที่ทุกคนควรใช้

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

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

และตอนนี้เรามีเพจแล้วนะ ถ้าอยากติดตามเรื่องราวเกี่ยวกับ เทคโนโลยี วิทยาศาสตร์ และ Lifestyle ก็สามารถเข้าไปติดตามเราผ่านเพจ arnondora ได้เลยนะฮ่ะ 😁

Share this article to social network?
FacebookTwitterGoogle+Email
© 2014-2019 Arnon Puitrakul all right reserved.Code with by @arnondora