Systematic Thinking และ Scientific Method กับการเขียนโปรแกรม ที่จำเป็นต่อทุกคน
หลายเดือนมานี้เราได้เจอกับคนที่ได้เรียนคอมพิวเตอร์มา แล้วต้องมาเรียนเขียนโปรแกรม เราก็เห็นว่า มันต้องใช้เวลาหนักมาก ๆ ในการเขียนโปรแกรมให้ได้ เราเลยลองมานั่ง และ คิดดูสิ๊ว่า ทำไมเพื่อนเราถึงยังเขียนโปรแกรมไม่ได้แบบ มีปัญหามาแล้วเขียนได้เลย คำตอบนึงที่เรา คิดว่าน่าจะใช่คือ Systematic Thinking และ Scientific Method
การเขียนโปรแกรม ไม่ใช่ภาษา แต่เป็น การแก้ปัญหา
มีคนเคยบอกไว้ว่า จุด ๆ ไม่ใช่สถานที่ แต่เป็นผู้คน คำพูดนั้นก็ดูตลกดี การเขียนโปรแกรม ก็ไม่ต่างกัน เพราะมันไม่ใช่แค่การพิมพ์ภาษาเอเลี่ยนใส่ลงไปในเครื่อง แล้วได้ออกมาเป็นโปรแกรมแบบที่เราอยากได้ มันน่าจะดูวิเศษไปมั่ง ฮ่า ๆ แบบเสกได้ของจริงอะไรแบบนั้น
แต่การเขียนโปรแกรมจริง ๆ แล้วมันเป็นเรื่องของการแก้ปัญหามากกว่า ยกตัวอย่างเรื่องง่าย ๆ อย่างการ จะเดินทางจาก บ้านไปมหาลัยให้ใช้เวลาน้อยที่สุด ดูเป็นปัญหาง่าย ๆ และอยู่ใกล้ตัวเนอะ อะโอเค เราลองมาแก้ปัญหานี้กัน
เริ่มจากสิ่งที่เรารู้กันก่อน ก็น่าจะมีอยู่ 2 อย่างหลัก ๆ เลยนั่นคือ
- ที่อยู่ต้นทาง นั่นคือบ้าน
- ที่อยู่ปลายทาง นั่นคือ มหาลัย
ในปัญหานี้ขอสมมุติว่า เราเดินทางด้วยรถสารธารณะนะ น่าจะทำให้แก้ปัญหาได้ง่ายกว่า ถ้าเป็นทุกคน ทุกคนจะเริ่มจัดการกับปัญหานี้ยังไง สำหรับเรา เราจะเริ่มดูทางที่เป็นไปได้ก่อนว่า จากบ้านไปถึงมหาลัย เราสามารถเดินทางไปโดยการขึ้นรถอะไรได้บ้าง หลังจากที่เราหามา เราน่าจะได้ List ของ การขึ้นรถที่จะทำให้เราไปจากบ้าน ไปถึงมหาลัยได้ ก็อาจจะเป็นแบบนี้
- ขึ้นแท๊กซี่
- รถเมล์ 515 -> เดิน 330 เมตร
- รถเมล์ 111 -> รถเมล์ 515 -> ขึ้นพี่วิน
- ขึ้นพี่วิน -> รถกระป๋อง -> รถเมล์ 123
- รถเมล์ 112 -> รถเมล์ 514 -> รถเมล์ 121 -> ขึ้นพี่วิน
- รถเมล์ 112 -> รถกระป๋อง -> รถเมล์ 515 -> ขึ้นพี่วิน -> เดิน 100 เมตร
ตอนนี้ เราก็ได้มา 6 วิธีการเดินทางด้วยกัน แต่ละวิิธีก็มีความแตกต่างกันออกไป แล้วเราจะรู้ได้ยังไงว่า วิธีไหนทำให้เราเดินทางได้ไปถึงที่หมายได้เร็วที่สุด ถ้าจะให้นั่งเดา หรือนั่งเทียนแล้วได้คำตอบ ก็น่าจะตลกไป ง่ายที่สุดก็คือ สร้างการทดลอง ไงละ อาจจะใช้เวลาหลายวันหน่อย แต่มันก็ทำให้เราได้คำตอบที่ค่อนข้างตรงไปตรงมาใช่ม่ะ
ก่อนเราจะเริ่มต้นการทดลอง ลองนึกดูก่อนว่า เราจะทำมันยังไงถึงเราจะได้คำตอบที่เราต้องการ นั่นคือ เดินทางแบบไหนเร็วที่สุด โอเค วิธีแรก เราอาจจะบอกว่า เราก็ลองจับเวลาการเดินทางดูมั้ย ก็เอานาฬิกาจับเวลามาจับเวลาตั้งแต่เราออกจากบ้าน จนไปถึงมหาลัย แล้วมีอะไรที่ต้องคิดอีกมั้ย ? ลองคิดก่อนแล้วค่อยอ่านต่อ...
แล้วเวลาในการออกละ ? ถ้าเราออกช้าหรือออกเร็ว จะทำให้เราใช้เวลานานรึเปล่า ณ ตอนนี้เรายังไม่รู้ ถามว่าเราควรทำอย่างไร ?
- ก็ Fix เป็นเวลานึงไปก่อน แล้วค่อยว่ากัน
- ตอนทดลองการเดินทางแต่ละครั้ง เราก็แค่ออกเวลาต่างกัน
ถามว่า ณ ตอนนี้ เราอยากรู้มั้ยว่า การออกเวลาไหน มันทำให้เราถึงช้าหรือเร็ว ย้อนกลับไปดูสิ่งที่เราอยากรู้ก่อนว่า เราอยากรู้ว่า วิธีไหนที่ทำให้เราใช้เวลาน้อยที่สุดในการเดินทางจากบ้านไปมหาลัย เห็นม่ะ ตอนนี้เรายังไม่ได้อยากรู้นิว่า ออกตอนไหนทำให้เราเดินทางได้เร็วที่สุด จากที่เล่ามา ทำให้เราสรุปการทดลองของเราออกมาได้ดังนี้
สิ่งที่เรามี : วิธีการเดินทาง (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 ก็ควรจะเริ่มจากการที่คิดก่อนว่า เราจะต้องแก้ปัญหายังไงก่อนนั่นเอง
การวาดปัญหาง่าย ๆ
ตัวอย่างที่ยกมาเป็นปัญหาที่เราเอามาตัดปัจจัยหลาย ๆ อย่างออก เช่น ค่าใช้จ่าย การต่อรถ และอื่น ๆ อีกมากที่ ณ หน้างานเราต้องมานั่งพิจารณา เพราะปัญหาหลาย ๆ อันในปัจจุบันล้วนมีความซับซ้อนมาก ถ้าจะให้เราคิดในหัวเฉย ๆ โอกาสที่มันจะตกหล่นมีมากจริง ๆ ดังนั้น เราจะต้องหาวิธีที่จัดการกับปัญหาที่ซับซ้อน วิธีนึงที่เราใช้คือ เราพยายามเขียนออกมาเป็นขั้น ๆ แล้วค่อย ๆ แตกย่อยเข้าไปเรื่อย ๆ
วิธีง่าย ๆ ของเราคือเริ่มจากการกำหนด จุดเริ่มต้น และ จุดสิ้นสุด ก่อน นั่นคือ สิ่งที่เรามี และ สิ่งที่เราอยากรู้ เอาละ เรามาถึงจุดที่ยากแล้วนั่นคือ แล้วเราจะทำยังไงให้สิ่งที่เรามี กลายร่างเป็นสิ่งที่อยากได้กันละ
อย่างในปัญหาการเดินทางเมื่อกี้ เราก็บอกว่า เราอาจจะเริ่มดูจากว่า มันมีวิธีการเดินทางอะไรบ้างใช่ม่ะ อันนี้ก็เป็นวิธีนึงก็คือ ถ้าเรามี 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
เวลาเราวาดออกมา เราจะวาดออกมาแบบภาพด้านบน เราจะเริ่มด้วยของที่ต้องใช้ก่อน นั่นคือ DNA แล้วข้างลูกศร เราก็เขียนสิ่งที่ DNA จะถูกกระทำลงไป และมันก็จะได้ mRNA ออกมา และ mRNA ก็ถูก Translate กลายเป็น Polypeptide นั่นเอง เราจะใช้ Cause & Effect แบบนี้แหละในการเขียนวิธีการแก้ปัญหาออกมา
แต่ในแต่ละขั้นตอนก็จะมีขั้นตอนย่อย ๆ เป็นของตัวเอง เหมือนเป็น 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 ฮ่า ๆ
หลังจากที่เราลองดูแล้วว่าสิ่งที่เรามี และสิ่งที่เราต้องการมันต่างกันยังไง และเราก็รู้แล้วว่า เราจะต้องทำมันยังไงให้ได้ออกมาในแบบที่เราต้องการ ก็ลองเขียนออกมาเป็นขั้นตอนต่อจากรูปที่เราวาดอันใหญ่ก่อนหน้านี้กัน
เราก็จะได้รูปแบบด้านบนออกมา เป็นขั้นตอนของการ Transcription นั่นเอง ตอนนี้เราก็จัดการกับปัญหาแรกได้แล้ว ไปที่ขั้นตอนต่อไปเลยดีกว่านั่นคือ Translation
Input : AUGAAUCCGGAAUCUAGGUCCUGCCACUGGGUCUGA
Output : MNPESRSCHWV
เหมือนเดิม เรามาดูกันดีกว่าว่าสิ่งที่เรามีกับสิ่งที่เราอยากได้มันหน้าตาต่างกันยังไง ดูเผิ่น ๆ จะเห็นว่าสิ่งที่เราต้องการดูจะสั้นกว่านะ และไม่มีตัวอักษรที่เหมือนกันเลย ลองเข้าไปดูให้ลึกขึ้นกัน ลองดูที่จำนวนตัวอักษรมั้ย ไหน ๆ เราก็เห็นมันสั้นกว่าแล้ว สิ่งที่เราต้องการมีแค่ 11 ตัวเท่านั้น ในขณะที่สิ่งที่เรามี 36 ตัว เอ๋ มันดูไม่น่าจะมีความสัมพันธ์อะไรกันเลย งั้นเราไบ้หน่อยละกันว่า Stop Condon เราจะไม่เขียนนะ ดังนั้น อื้ม... ทำให้สิ่งที่เราต้องการมีทั้งหมด 12 ตัว มันน่าจะทำให้ดูมีอะไรมากขึ้น
ถ้าไม่รู้อะไรเลย ลองเอามาหารกันเลยม่ะ เอา 36 หารด้วย 12 อ้าว ลงนิ ทำให้เราเดาได้เลยว่า เราน่าจะต้องใช้ 3 ตัวเพื่อแทนค่าให้เป็น 1 ตัวที่เราต้องการ ซึ่งก็ถูกต้องฮ่ะ
ในการ Translate จริง ๆ 3 เบสจะแทนออกมาได้ 1 Amino โดยใช้ตามตารางด้านบนได้เลย ดังนั้นวิธีการแก้ปัญหาง่าย ๆ ก็คือ เราก็ค่อย ๆ จับออกมาทีละ 3 ตัวแล้วเอาเข้าไปเทียบกับตารางเราก็จะได้ผลลัพธ์ออกมาแล้ว
เท่านี้เราก็จะได้วิธีการแก้ปัญหานี้แล้ว การใช้ปัญหานี้เราอยากจะนำเสนอเรื่องนึง เวลาเราเจอปัญหา มันก็เหมือนเล่นเกม Puzzle แต่ถ้าเราสักแต่เล่นไปโดยที่เราไม่รู้ Background มันเลย เราก็ไม่ต่างจากการนั่งมั่วไปเรื่อย ๆ เลย อย่างตอนที่เราทำ Transcription ถ้าเราไม่มี Background ในเรื่องนี้มาก่อน เราจะไม่มีทางรู้เลยว่า มันตัดจากอะไร ? ดังนั้น การที่เรากระโดดเข้าไปเล่นกับปัญหาใน Field อื่น ๆ เราก็ควรที่จะมีความรู้ในนั้นนิดหน่อย
สรุปทริกง่าย ๆ คือ เราก็ต้องเริ่มจากการดูก่อนว่า มีอะไร และ ต้องการอะไร แล้วค่อยมาคิดว่า เราจะทำให้สิ่งที่เรามีกลายร่างเป็นสิ่งที่เราต้องการได้จาก การสังเกต นั่นเอง ปัญหาอื่น ๆ อาจจะยากกว่านี้ หรือง่ายกว่านี้มันก็ขึ้นกับปัญหาเนอะ ถ้าเราฝึกการคิดให้เป็นขั้นเป็นตอนบ่อย ๆ ก็จะทำให้เราคิดแก้ปัญหาได้เร็วและมีประสิทธิภาพมากขึ้นนั่นเอง
อันนี้เราเขียนตอนเรียน Molecular Technique เพราะตอนนั้นจำอะไรไม่ได้เลย ไม่เข้าใจสักอย่าง เลยเขียนออกมาเพื่อให้เราเข้าใจแต่ละขั้นตอน
จริง ๆ เราใช้วิธีการเขียนแบบนี้มานนานแล้ว แต่พึ่งเห็นประโยชน์ของมันแบบจริง ๆ จัง ๆ จากตอนที่เราเรียนวิชา Molecular Technique ที่ตอนนั้นเราเรียน Lab นี่แหละ แล้ว ขั้นตอนมันเยอะมาก ๆ เราอ่านแล้วจับขั้นตอนมันยากมากเลย เพราะเดี๋ยวหยอดโน้นหยอดนี่ เราเลยเขียนออกมาเป็นรูปแบบนี้เพื่อให้เข้าใจได้ง่ายขึ้น จริง ๆ มันก็คล้าย ๆ กับ Flow Chart แต่เราบอกด้วยว่า ในแต่ละขั้นตอนเราได้อะไรออกมา เพื่อให้เราเข้าใจมันมากขึ้นนั่่นเอง
Systematic Thinking และ Scientific Method คืออะไร ?
อ่านมาถึงตอนนี้แล้ว เราว่าหลาย ๆ คนก็น่าจะ งง ว่า อะไรของแก !! ที่เล่ามามันเกี่ยวกับหัวเรื่องยังไง ?? โอเค เราค่อย ๆ ดูไปทีละคำละกัน เริ่มที่ Systematic Thinking หรือ การคิดอย่างเป็นระบบ ถ้าเป็นนักคอมพิวเตอร์ก็ง่าย ๆ เลยฮ่ะ ทำยังไงก็ได้ให้สิ่งที่เราคิดมันออกมาเป็น Graph หรือไม่ก็มี Pattern อะไรบางอย่างออกมา ถ้าพูดภาษาคนก็น่าจะเป็น การคิดเป็นเครือข่าย คิดเป็นลำดับขั้นตอน เป็นวงจรอะไรก็ว่ากันไป
กับคำว่า Scientific Method คือ วิธีการทางวิทยาศาสตร์ เราว่ามันเป็น ระบบที่ดีเลยนะในการคิดอย่างเป็นระบบน่ะ โดยมันจะประกอบด้วย 5 ขั้นตอนคือ
- กำหนดปัญหา เราต้องมาดูกันก่อนว่า ปัญหาของเราคืออะไร และเกิดขึ้นได้ยังไง โดยอาจจะใช้การสังเกตนั่นเอง
- ตั้งสมมุติฐาน ไหนลองมาดูสิ๊ว่า จากปัญหาแล้ว มันน่าจะมีวิธีแก้ปัญหาอะไรบ้างนะ
- ตรวจสอบสมมุติฐาน เราก็ต้องเอาสมมุติฐานของเรามาทดลองหน่อยสิว่า มันจริงอย่างที่เราคิดมั้ย อย่างมีระบบ โดยเราจะต้องยึดสมมุติฐานของเราเป็นหลักเสมอ
- วิเคราะห์ผล หลังจากลองแล้ว ผลเป็นยังไงกันนะ ? ได้ตามสมมุติฐานหรือไม่ ?
- สรุปผล ทีนี้เราต้องเอาข้อมูลมารวมกันละ และสรุปหน่่อยสิว่า ทำไมมันได้ ทำไมมันไม่ได้กันละ คิดว่าอะไรเป็นปัจจัย ?
แล้วเมื่อกี้เราใช้ไปเหรอ ?
จากปัญหาทั้ง 2 อันเมื่อกี้ เราใช้มันทั้งคู่เลยนะ อย่างปัญหา Transcription และ Translation นั่น เราก็ไม่ได้คิดมั่ว ๆ ไปเรื่อยใช่ม้าาา เราเริ่มจากการกำหนดปัญหาก่อนเช่นตอน Transcription เราก็บอกว่า โอเค เราต้องการทำ Transcription โดยมี DNA เป็นตัวอย่าง ทีนี้ก็มาถึงการตั้งสมมุติฐานละ เราก็ไม่ได้มั่ว ๆ ดูไปเรื่อย ๆ ใช่ม่ะ แต่เราค่อย ๆ เริ่มจาก ดูรูปแบบอักษรก่อน ว่าเออ มันมีตัวนึงถูกแทนที่ด้วยอีกตัว และ ขนาดไม่เท่ากัน นั่นคือเราเห็น Pattern นั่นเอง จากนั้น เราก็เอา Pattern ที่เราคิดว่าใช่มาตั้งเป็นสมมุติฐาน
เราตรวจสอบโดยการที่เราเขียนโปรแกรมขึ้นมา และลองรันดูว่า ได้มั้ย ? หรือทำมือกับ Sample เล็ก ๆ ก็ได้เหมือนกัน ก็เป็นการพิสูจน์ที่ดีเลย แล้วเราก็มาวิเคราะห์ผลกันสิ๊ว่า มันถูกต้องกับทุก ๆ เคสมั้ย สุดท้ายก็สรุปว่า โอเคมันใช้ได้นะ ให้ผลถูกต้องกับทุกเคสมั้ยอะไรแบบนั้น
การใช้ Systematic Thinking และ Scientific Method เป็นเรื่องที่ทุกคนควรใช้
จะเห็นว่า ในการแก้ปัญหาสักอย่างนึง การใช้ Systematic Thinking ร่วมกับ Scientific Method ในการแก้ปัญหา (ทั้งปัญหาเชิง Programming และอื่น ๆ รวมถึงปัญหาในชีวิตประจำวัน) มันทำให้เราแก้ปัญหาที่มีความซับซ้อนได้แม่นยำ และมีประสิทธิภาพมากขึ้นมาก ของพวกนี้ เราว่ามันต้องฝึก หัดแก้ปัญหาบ่อย ๆ ทำไปเรื่อย ๆ ชั่วโมงบินสูงขึ้น เราก็จะวิเคราะห์ แก้ปัญหา ที่มีความซับซ้อนมากขึ้นได้นั่นเอง ง่าย ๆ เลยนะ ลองเทียบดูเราตอนเด็ก กับปัจจุบัน มันก็ต่างกันแล้วใช่ม่ะ ไม่ว่าจะเป็นเรื่องของ ประสบการณ์ และ ความรู้ เองก็เถอะมันทำให้เราเก่งขึ้นทุกวัน บางปัญหาที่เราแก้ไม่ได้ อีกคนกลับแก้ได้แบบง่ายดายมาก นั่นเพราะเขาอาจจะมีประสบการณ์ที่เคยโดนมาแล้ว หรือมีความรู้ในเรื่องนั้น ๆ มากกว่าเราไงละ ถ้าอยากจะเก่งขึ้นก็ต้องขยันหาทั้ง 2 อย่างนี้มานั่นเองงงง
สำหรับคนที่พึ่งหัดเขียนโปรแกรมนะ เราอยากบอกว่า การเริ่มต้นมันโคตรยากเลย ท้อนะ เข้าใจนะว่า มันยากจริง เราว่ามันเป็น Skill อะ มันไม่ใช่ว่า เราอ่านหนังสือมา จำได้แล้วเขียนได้เลย แต่มันต้องอาศัยประสบการณ์ ดังนั้น ถ้าอยากเก่งขึ้นก็จงออกไปหาประสบการณ์นะ ~
และตอนนี้เรามีเพจแล้วนะ ถ้าอยากติดตามเรื่องราวเกี่ยวกับ เทคโนโลยี วิทยาศาสตร์ และ Lifestyle ก็สามารถเข้าไปติดตามเราผ่านเพจ arnondora ได้เลยนะฮ่ะ 😁