User Tools

Site Tools


python:programming

1. วิถีของโปรแกรม

จุดประสงค์ของตำรานี้ คือ สอนให้เราคิดอย่าง วิศวกรคอมพิวเตอร์ วิธีคิดนี้ รวมเอาส่วนของแง่มุมที่ดีที่สุดของคณิตศาสตร์ วิศวกรรม และวิทยาศาสตร์ธรรมชาติ ในลักษณะเดียวกับนักคณิตศาสตร์ วิศวกรคอมพิวเตอร์ใช้ ภาษารูปนัย (formal language) เพื่อสื่อถึงความคิด (โดยเฉพาะ การคำนวณ การประมวณข้อมูล) ในลักษณะเดียวกับวิศวกรอื่นๆ วิศวกรคอมพิวเตอร์ออกแบบสิ่งต่างๆ ประกอบส่วนประกอบต่างๆเข้าด้วยกันเป็นระบบที่ใหญ่ขึ้น และประเมินข้อดี-ข้อเสีย (tradeoffs) ของทางเลือกต่างๆ ในลักษณะเดียวกับนักวิทยาศาสตร์ วิศวกรคอมพิวเตอร์สังเกตพฤติกรรมของระบบที่ซับซ้อน ตั้งสมมติฐาน และทดสอบสมมติฐาน

ทักษะที่สำคัญที่สุดของวิศวกรคอมพิวเตอร์ คือ ทักษะการแก้ปัญหา (problem solving). ทักษะการแก้ปัญหา หมายถึง ความสามารถในการอ่าน-ตีความปัญหา (formulate problems) คิดอย่างสร้างสรรค์เกี่ยวกับวิธีการแก้ปัญหา (think creatively about solutions) และ การนำเสนอวิธีแก้ปัญหาได้อย่างกระจ่างและตรงประเด็น (express a solution clearly and accurately) นั่นเท่ากับว่า กระบวนการเรียนการเขียนโปรแกรม เป็น โอกาสที่ดีในการฝึกฝนทักษะการแก้ปัญหา นั่นเป็นเหตุผลว่า บทนี้เรียกว่า “วิถีของโปรแกรม” (the way of the program)

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

1.1 อะไรคือโปรแกรม

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

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

อินพุต (input):
รับข้อมูลเข้าจากแป้นพิมพ์ ไฟล์ เครือข่าย หรือ อุปกรณ์อื่นๆ

เอาต์พุต (output):
แสดงข้อมูลออกหน้าจอ บันทึกข้อมูลลงไฟล์ ส่งข้อมูลผ่านเครือข่าย หรือ ส่งข้อมูลไปอุปกรณ์อื่นๆ

คณิตศาสตร์ (math):
ทำการคิดคณิตศาสตร์พื้นฐาน เช่น การบวก และการคูณ

การทำเงื่อนไข (conditional execution):
ตรวจสอบเงื่อนไขที่ระบุ และเลือกทำคำสั่งที่เหมาะสม

การทำซ้ำ (repetition):
ทำคำสั่งซ้ำๆ โดยแต่ละรอบของการทำซ้ำอาจมีความต่างบ้าง

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

1.2 การรันโปรแกรมไพธอน

เรื่องหนึ่งที่ยากที่สุดของการเริ่มใช้ไพธอน (Python) คือ เราอาจจะต้องติดตั้งไพธอน รวมถึงซอฟต์แวร์ที่เกี่ยวข้อง. ถ้าคุณคุ้นเคยกับระบบปฏิบัติการ โดยเฉพาะถ้าคุณสะดวกที่จะใช้คอมมานไลน์ (command-line interface) คุณไม่น่ามีปัญหาในการติดตั้งไพธอน. แต่สำหรับมือใหม่ มันก็อาจจะลำบากบ้างที่จะต้องเรียนการจัดการระบบไปพร้อมๆ กับการเรียนเขียนโปรแกรม.

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

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

ไพธอน อินเตอร์พรีเตอร์ (interpreter) เป็นโปรแกรมที่อ่านและรันคำสั่งภาษาไพธอน. ขึ้นกับเอนไวรอนเมนต์ 1) ของเรา บางเอนไวรอนเมนต์ อาจจะเปิดไพธอนอินเตอร์พรีเตอร์ ด้วยการคลิกไอคอน หรือ บางเอนไวรอนเมนต์ อาจจะด้วยการพิมพ์คำสั่ง python ที่หน้ารับคำสั่ง (command console). หลังจากที่ไพธอนอินเตอร์พรีเตอร์เปิดขึ้นมา เราอาจจะเห็น

Python 3.4.0 (default, Jun 19 2015, 14:20:21) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

สามบรรทัดแรก บอกข้อมูลเกี่ยวกับตัวอินเตอร์พรีเตอร์ และระบบปฏิบัติการ ดังนั้นข้อมูลนี้อาจจะต่างๆ จากที่คุณได้. แต่คุณควรจะตรวจสอบเวอร์ชั่นดูด้วย เวอร์ชั่น ที่ในตัวอย่างนี้เป็น 3.4.0 ตัวเลขแรกบอกว่าเป็น ไพธอน 3. ถ้าตัวเลขแรกเป็น 2 แปลว่า คุณกำลังรัน ไพธอน 2 อยู่.

บรรทัดสุดท้ายเป็น ตัวพร้อม (prompt) ที่เป็นตัวบอกว่า อินเตอร์พรีเตอร์พร้อมที่จะรับคำสั่งจากเรา. ถ้าคุณพิมพ์คำสั่งและกด “Enter” อินเตอร์พรีเตอร์จะแสดงผลออกมา

>>> 1 + 1
2

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

1.3 โปรแกรมแรก

ตามธรรมเนียมแล้ว โปรแกรมแรกที่เราจะเขียนในภาษาใหม่ จะเรียกว่า โปรแกรม “Hello, World!” เพราะว่า มันจะทำแค่แสดงคำว่า “Hello, World!” สำหรับไพธอน หน้าตาของโปรแกรมจะเป็นดังนี้

>>> print('Hello, World!')

นี่เป็นตัวอย่างของ คำสั่งพิมพ์ (print statement) แม้ว่าจริงๆ แล้ว มันไม่ได้พิมพ์อะไรลงกระดาษ มันแค่แสดงข้อความออกหน้าจอ ซึ่งในกรณีนี้ ผลลัพธ์คือ

Hello, World!

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

วงเล็บใช้บอกว่า print เป็นฟังก์ชัน (function). เราจะเรียนเรื่องฟังก์ชันกัน ใน บทที่ 3.

ในไพธอน 2 คำสั่งพิมพ์จะต่างออกไปเล็กน้อย นั่นคือ มันไม่ใช่ฟังก์ชัน ดังนั้นจึงไม่ต้องการวงเล็บ เช่น

>>> print 'Hello, World!'

จุดต่างนี้จะค่อยๆ กระจ่างขึ้นทีหลัง

1.4 ตัวดำเนินการพีชคณิต

จาก “Hello, World!” ขั้นต่อไปคือ การคำนวณพีชคณิต (arithmetic). ไพธอนมี ตัวดำเนินการ (operators) ที่ใช้สัญญลักษณ์พิเศษ เพื่อแสดงการคำนวณ เช่น บวกและคูณ.

ตัวดำเนินการ +, -, และ * ทำการบวก, ทำการลบ, และทำการคูณ ดังแสดงในตัวอย่าง เช่น

>>> 40 + 2
42
>>> 43 - 1
42
>>> 6 * 7
42

ตัวดำเนินการ / ทำการหาร เช่น

>>> 84 / 2
42.0

คุณอาจจะสงสัยว่า ทำไมผลลัพธ์ถึงเป็น 42.0 แทนที่จะเป็น 42. เราจะอธิบายเรื่องนี้ในหัวข้อถัดไป.

ส่วน ตัวดำเนินการ ** ทำการยกกำลัง นั่นคือ เช่น

>>> 6**2 + 6
42

บางภาษาคอมพิวเตอร์จะใช้ ^ สำหรับการยกกำลัง แต่ไพธอนใช้ ^ สำหรับตัวดำเนินการตามบิต (bitwise operator) ที่เรียกว่า เอ็กซ์ออร์ (XOR). ถ้าคุณยังไม่คุ้นเคยกับตัวดำเนินการตามบิต ผลลัพธ์อาจจะดูแปลกๆ เช่น

>>> 6 ^ 2
4

เนื้อหาของตำรานี้ไม่ครอบคลุมตัวดำเนินการตามบิต แต่ถ้าสนใจ ก็สามารถค้นคว้าเพิ่มเติมได้จาก http://wiki.python.org/moin/BitwiseOperators.

1.5 ค่าและชนิดข้อมูล

ค่าข้อมูล (value) เป็นสิ่งพื้นฐานที่โปรแกรมทำงานด้วย ค่าที่พูดถึง ได้แก่ ตัวอักษร และ ตัวเลข. บางค่าที่เราดูกันไปแล้ว เช่น 2, 42.0, และ 'Hello, World!'.

ค่าต่างๆ เหล่านี้ เป็นชนิดข้อมูล (types) ต่างๆ กัน เช่น ค่า 2 เป็นชนิดจำนวนเต็ม (integer) ค่า 42.0 เป็นชนิดเลขทศนิยม หรือ จำนวนโฟลตติ้งพอยต์ (floating-point number) และ 'Hello, World!' เป็นชนิดสายอักขระ (string) ที่เรียกเช่นนี้ ก็เพราะตัวอักษรถูกนำมาเรียงร้อยต่อกัน.

ถ้าไม่แน่ใจว่าค่าข้อมูลเป็นชนิดไหน เราก็ใช้อินเตอร์พรีเตอร์บอกเราได้ เช่น

>>> type(2)
<class 'int'>
>>> type(42.0)
<class 'float'>
>>> type('Hello, World!')
<class 'str'>

ตัวอย่างข้างต้น คำว่า “class” ในที่นี้ ถูกใช้ ในแง่ที่หมายถึง ชนิดหมวดหมู่. ชนิดข้อมูล ก็คือ หมวดหมู่ของค่าข้อมูล. ผลที่ได้ก็ไม่น่าแปลกใจว่า จำนวนเต็ม เป็นชนิดข้อมูล int. สายอักขระ เป็นชนิดข้อมูล str. และเลขทศนิยม (จำนวนโฟลตติ้งพอยต์) เป็นชนิดข้อมูล. float.

แล้วถ้าเป็นค่าแบบ '2' และ '42.0' จะนับเป็นชนิดข้อมูลแบบไหน ค่าเหล่านี้ดูเหมือนตัวเลข แต่ค่าเหล่านี้อยู่ในอัญประกาศ (quotation marks) เหมือนสายอักขระ.

>>> type('2')
<class 'str'>
>>> type('42.0')
<class 'str'>

มันเป็น สายอักขระ.

เวลาที่เราพิมพ์เลขจำนวนเต็มค่าใหญ่ๆ เราอาจจะอยากที่จะใช้เครื่องหมายจุลภาคคั่นกลุ่มของตัวเลข แบบ 1,000,000. นี่ไม่ใช่รูปแบบจำนวนเต็มที่ถูกต้องในไพธอน

>>> 1,000,000
(1, 0, 0)

ไม่เหมือนที่เราคิดเลย. ไพธอนมอง 1,000,000 เป็นลำดับของจำนวนเต็มที่คั่นด้วยจุลภาค. เราจะเรียนชนิดของลำดับแบบนี้ทีหลัง (บทที่ 12)

1.6 ภาษารูปนัยและภาษาธรรมชาติ

ภาษาธรรมชาติ (natural language) เป็นภาษาที่คนใช้พูด เช่น ภาษาไทย ภาษาจีน ภาษาอังกฤษ ภาษาธรรมชาติไม่ได้ถูกออกแบบ โดยนักออกแบบภาษา (แม้ว่าจะมีคนพยายามจะใส่กฏเกณฑ์เข้าไป) ภาษาธรรมชาติพัฒนาและมีวิวัฒนาการตามธรรมชาติที่ผู้คนใช้มัน

ภาษารูปนัย (formal language) เป็นภาษาที่ถูกออกแบบ โดยนักออกแบบสำหรับจุดประสงค์เฉพาะ ตัวอย่างเช่น สัญกรณ์ (notation) ที่นักคณิตศาสตร์ใช้ ก็เป็นภาษารูปนัยที่ออกแบบมาเฉพาะ สำหรับแสดงถึงความสัมพันธ์ระหว่างตัวเลขและสัญญลักษณ์ต่างๆ นักเคมีก็ใช้ภาษารูปนัย แสดงโครงสร้างทางเคมีของโมเลกุล และที่สำคัญ

ภาษาคอมพิวเตอร์ เป็นภาษารูปนัย ที่ออกแบบมาเพื่อระบุวิธีการประมวลผล

ภาษารูปนัยมักจะมีกฎวากยสัมพันธ์ (syntax) ที่เข้มงวด ซึ่งกฎวากยสัมพันธ์ ใช้เพื่อควบคุมโครงสร้างของข้อความ (หรือโครงสร้างของคำสั่ง) ตัวอย่างเช่น ในคณิตศาสตร์ ข้อความ $3 + 3 = 6$ มีวากยสัมพันธ์ที่ถูกต้อง แต่ $3 + = 3 \$ 6$ ไม่ถูก. ในเคมี $H_2O$ เป็นสูตรที่ถูกต้องตามวากยสัมพันธ์ แต่ $_2Zz$ ไม่ถูก

กฎวากยสัมพันธ์มาในสองรูปแบบ ซึ่งคือเกี่ยวกับ โทเค็นต่างๆ (tokens) และโครงสร้าง (structure) โทเค็น เป็นส่วนประกอบพื้นฐานของภาษา เช่น คำ (ในภาษาธรรมชาติ) ตัวเลข (ในคณิตศาสตร์) ธาตุทางเคมี (ในเคมี)

หนึ่งในปัญหาของ $3 += 3 \$ 6$ คือ $\$$ ไม่ใช่โทเค็นที่ถูกต้องทางคณิตศาสตร์ (อย่างน้อยก็เท่าที่ผมรู้) ในทำนองเดียวกัน $_2Zz$ ไม่ถูกต้อง เพราะว่า ไม่มีธาตุทางเคมีที่ใช้ตัวย่อ $Zz$

กฎวากยสัมพันธ์แบบที่สอง จะเกี่ยวกับ วิธีที่รวมโทเค็นเข้าด้วยกัน สมการ $3 += 3$ ไม่ถูกวากยสัมพันธ์ทางคณิตศาสตร์ เพราะว่า แม้ $+$ และ $=$ จะเป็นโทเค็นที่ถูกต้อง แต่เราไม่สามารถเอาโทเค็นสองตัวนี้มาวางต่อกันแบบนี้ได้ ทำนองเดียวกัน ในสูตรเคมี ตัวห้อยจะต้องมาหลังจากธาตุ ไม่ใช่มาก่อนธาตุ

ตัวอย่าง ข้อความภาษาอังกฤษที่ถูกวากยสัมพันธ์ด้านโครงสร้าง แต่ผิดด้านโทเค็น ได้แก่ “This is @ well-structured Engli$h sentence with invalid t*kens in it.” เปรียบเทียบกับ ข้อความภาษาอังกฤษที่ถูกวากยสัมพันธ์ด้านโทเค็น แต่ผิดด้านโครงสร้าง ได้แก่ This sentence all valid tokens has, but invalid structure with.

ประโยคนี้ถูก$\int$ครงสร้7งภ7ษ7ไท$\epsilon$ 11ต่ผิดด้าน$\int$ทเค็น. ส่วนทั้งหมดโทเค็นถูกนี้ประโยค แต่ไม่โครงสร้างถูก

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

แม้ว่า ภาษารูปนัย และภาษาธรรมชาติ จะมีลักษณะหลายๆ อย่างคล้ายๆ กัน ไม่ว่าจะเป็น โทเค็น โครงสร้าง และวากยสัมพันธ์ แต่ก็มีความแตกต่างกันอยู่มาก ได้แก่

ความกำกวม (ambiguity):
ภาษาธรรมชาติจะเต็มไปด้วยความกำกวม ที่คนมักจะใช้บริบทหรือข้อมูลอื่นๆ ช่วย ภาษารูปนัยถูกออกแบบมาให้ปราศจาก (หรือเกือบปราศจาก) ความกำกวมเลย นั่นคือ ข้อความในภาษารูปนัย จะมีความหมายอย่างเดียวแน่นอน โดยไม่เกี่ยวกับบริบท

ความซ้ำซ้อน (redundancy):
เพื่อชดเชยความกำกวม และลดการเข้าใจผิด ภาษาธรรมชาติมักใช้ความซ้ำซ้อนเข้ามาช่วย ผลคือ ภาษาธรรมชาติมักจะใช้ถ้อยคำมากเกินไป ภาษารูปนัยไม่ค่อยซ้ำซ้อนและกระชับกว่า

ความตรงตามตัวอักษร (literalness):
ภาษาธรรมชาติเต็มไปด้วยสำนวนและการอุปมา ภาษาอังกฤษ มีสำนวน “The penny dropped” ที่ไม่ได้หมายถึง เศษเงิน หรือแม้แต่มีอะไรร่วงหล่น (สำนวนนี้หมายถึง การที่ใครสักคนได้เข้าใจเรื่องราวสักที หลังจากงงมานาน2)) ภาษาไทย ก็มีสำนวน เช่น “ตีเหล็กเมื่อแดง กินแกงเมื่อร้อน” ซึ่งไม่ได้หมายถึง ทั้งเหล็ก หรือว่าแกง แต่หมายถึง การทำสิ่งที่มีประโยชน์ เมื่อยังมีโอกาส ภาษารูปนัยหมายความตรงตามที่เขียน

เพราะว่า เราใช้ภาษาธรรมชาติมาตลอด ทำให้บางครั้ง มันอาจจะยากหน่อยที่จะปรับตัว เพื่อใช้ภาษารูปนัย ความต่างของภาษารูปนัยกับภาษาธรรมชาติ ก็ต่างกันแบบที่ ร้อยกรอง(บทกวี)ต่างจากร้อยแก้ว(ข้อความธรรมดา) แต่ภาษารูปนัยกับภาษาธรรมชาติต่างกันมากกว่า.

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

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

โปรแกรม (Programs):
ความหมายของโปรแกรมคอมพิวเตอร์ชัดเจน ไม่กำกวน และตรงตามตัวอักษร และความหมายสามารถเข้าใจได้อย่างครบถ้วน โดยการวิเคราะห์โทเค็นและโครงสร้าง

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

1.7 การดีบัก

นักเขียนโปรแกรมทำผิดพลาดได้ ด้วยเหตุผลแปลกๆ ความผิดพลาดในโปรแกรม (programming errors) ถูกเรียกว่า บัก (bugs) และกระบวนการตรวจหาข้อผิดพลาดนี้ เรียกว่า การตรวจแก้จุดบกพร่อง หรือ การดีบัก (debugging)

บางครั้ง การเขียนโปรแกรม โดยเฉพาะการดีบัก อาจจะทำให้อารมณ์เสียได้ บางครั้ง ที่เรามีปัญหากับบัคที่ยากๆ เราอาจจะรู้สึกโมโห รู้สึกท้อ หรือรู้สึกอาย

มีหลักฐานว่า คนมักจะปฏิสัมพันธ์กับคอมพิวเตอร์ ราวกับว่าคอมพิวเตอร์เป็นคน เวลาที่คอมพิวเตอร์ทำงานได้ดี เรามักมองคอมพิวเตอร์เหมือนเป็นเพื่อนร่วมทีม แต่เวลาที่คอมพิวเตอร์ดื้อหรือหยาบคาย เราก็มักจะทำกับคอมพิวเตอร์ เหมือนกับที่เราทำกับคนดื้อ หรือคนหยาบคาย (จาก Reeves and Nass, The Media Equation: How People Treat Computers, Television, and New Media Like Real People and Places)

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

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

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

1.8 อภิธานศัพท์

  • การแก้ปัญหา (problem solving): กระบวนการที่รวม การอ่านปัญหา การตีความปัญหา การหาวิธีแก้ปัญหา และการอธิบายวิธีแก้ปัญหาที่ได้
  • ภาษาระดับสูง (high-level language): ภาษาโปรแกรม เช่น ไพธอน ที่ออกแบบมาให้คนอ่านและเขียนได้ง่าย
  • ภาษาระดับล่าง (low-level language): ภาษาโปรแกรม ที่ออกแบบมาให้คอมพิวเตอร์ทำงานได้ง่าย บางครั้ง ภาษาระดับล่าง เรียกว่า “ภาษาเครื่อง” (machine language) หรือ “ภาษาแอสเซมบลี” (assembly language)
  • ความเคลื่อนย้ายง่าย (portability): คุณสมบัติของโปรแกรม ที่สามารถทำงานบนคอมพิวเตอร์ได้หลายประเภท
  • อินเตอร์พรีเตอร์ (interpreter): โปรแกรมที่อ่าน โปรแกรมอื่น และดำเนินการตามโปรแกรมที่อ่าน
  • พร้อม (prompt): ตัวอักขระที่แสดงโดยอินเตอร์พรีเตอร์ เพื่อจะบอกว่า อินเตอร์พรีเตอร์พร้อมที่จะรับอินพุตจากผู้ใช้
  • โปรแกรม (program): ชุดของคำสั่งที่ระบุวิธีการประมวลผล
  • ข้อความพิมพ์ (print statement): คำสั่ง ที่ทำให้ไพธอนอินเตอร์พรีเตอร์แสดงค่าออกหน้าจอ
  • ตัวดำเนินการ (operator): สัญญลักษณ์พิเศษ ที่แทนการประมวลผลพื้นฐาน เช่น การบวก การคูณ หรือการต่อสายอักขระ
  • ค่า (value): หนึ่งในหน่วยพื้นฐานของข้อมูลที่โปรแกรมใช้ เช่น ตัวเลข หรือ สายอักขระ
  • ชนิด (type): ประเภทของค่าข้อมูล. ชนิดข้อมูลที่เราได้เห็นกันไปแล้ว ได้แก่ จำนวนเต็ม (ชนิด int) จำนวนโฟลตติ้งพอยต์ (ชนิด float) และ สายอักขระ (ชนิด str)
  • จำนวนเต็ม (integer): ชนิดข้อมูลที่แทนจำนวนเต็ม
  • โฟลตติ้งพอยต์ (floating-point): ชนิดข้อมูลที่แทนเลขที่มีเศษส่วน
  • สายอักขระ (string): ชนิดข้อมูลที่แทนชุดลำดับของตัวอักษร
  • ภาษาธรรมชาติ (natural language): ภาษาใดๆ ที่ผู้คนใช้พูดกัน และมีวิวัฒนาการของภาษาไปตามธรรมชาติ
  • ภาษารูปนัย (formal language): ภาษาใดๆ ที่คนได้ออกแบบมาสำหรับจุดประสงค์เฉพาะ เช่น เพื่อแสดงความคิดเชิงคณิตศาสตร์ หรือโปรแกรมคอมพิวเตอร์ ภาษาคอมพิวเตอร์ทุกภาษาเป็นภาษารูปนัย
  • โทเค็น (token): หน่วยพื้นฐาน ของโครงสร้างไวยากรณ์ของโปรแกรม ในลักษณะเดียวกับ คำ ของภาษาธรรมชาติ
  • วากยสัมพันธ์ (syntax): กฏเกณฑ์ต่างๆ ที่กำหนดโครงสร้างของโปรแกรม
  • แจงส่วน (parse): ตรวจสอบโปรแกรม และวิเคราะห์โครงสร้างตามวากยสัมพันธ์
  • บัก (bug): ความผิดพลาดในโปรแกรม
  • การดีบัก (debugging): กระบวนการหาและแก้ไขบัก

1.9 แบบฝึกหัด

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

เมื่อเราทดลองความรู้ใหม่ๆ ที่ได้เรียน เราควรจะลองที่จะทำอะไรผิดด้วย. ตัวอย่างเช่น ในโปรแกรม “Hello, world!” มันจะเกิดอะไรขึ้น ถ้าเราใส่อัญประกาศ () แค่ตัวเดียว? มันจะเกิดอะไรขึ้น ถ้าเราไม่ใส่อัญประกาศเลย? มันจะเกิดอะไรขึ้น ถ้าเราสะกด print ผิด?

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

มันดีกว่าที่ เราจะทำพลาดตอนนี้ โดยตั้งใจ ดีกว่าที่ เราไปพลาดตอนหลัง โดยไม่ตั้งใจ.

  1. ในคำสั่ง print มันจะเกิดอะไรขึ้น ถ้าเราใส่วงเล็บแค่อันเดียว หรือไม่ใส่เลย?
  2. ถ้าเราลองพิมพ์สายอักขระ (string) ออกมา มันจะเกิดอะไรขึ้น ถ้าเราใส่อัญประกาศ () อันเดียว หรือไม่ใส่เลย?
  3. เราสามารถใช้เครื่องหมายลบ เพื่อสร้างเลขลบออกมาได้ เช่น -2 มันจะเกิดอะไรขึ้น ถ้าเราใส่เครื่องหมายบวกไปหน้าตัวเลข? ถ้าอันนี้จะได้อะไรออกมา 2++2?
  4. ในคณิตศาสตร์ การใส่ศูนย์ข้างหน้าตัวเลขไม่มีปัญหาอะไร เช่น 02 มันจะเกิดอะไรขึ้น ถ้าทำแบบนี้ในไพธอน?
  5. มันจะเกิดอะไรขึ้น ถ้าเราลองสองตัวเลข โดยไม่มีตัวดำเนินการ (operator) ระหว่างตัวเลขเลย? ลอง 4 8

แบบฝึกหัด 2
เปิดไพธอนอินเตอร์พรีเตอร์มา และใช้มันเป็นเหมือนเครื่องคิดเลข.

  1. 42 นาที 42 วินาที คิดเป็นกี่วินาที?
  2. 10 กิโลเมตร คิดเป็นกี่ไมล์? คำใบ้: 1.61 กิโลเมตร เท่ากับ 1 ไมล์
  3. ถ้าเราใช้เวลา 42 นาที 42 วินาทีวิ่งได้ 10 กิโลเมตร เราใช้เวลากี่นาทีในการวิ่งต่อไมล์? เราวิ่งได้เร็วกี่ไมล์ต่อชั่วโมง?

https://greenteapress.com/thinkpython2/html/thinkpython2002.html

1)
เอนไวรอนเมนต์ (operating environment) ในที่นี้ หมายถึง โครงสร้างพื้นฐานที่ใช้รันไพธอนอินเตอร์พรีเตอร์ ซึ่งอาจหมายถึง ระบบปฏิบัติการ เช่น ไมโครซอฟต์วินโดว์ ลีนุกซ์ รวมไปถึง ไอดีอี (IDE, ย่อจาก Integrated development environment) ซึ่งเป็นระบบอำนวยความสะดวก สำหรับการพัฒนา เช่น Anaconda (https://anaconda.org/anaconda/python) เป็นต้น.
2)
สำนวน เป็นการอุปมากับ เครื่องขายของอัตโนมัติ ที่เหรียญค้างไม่ยอมทำงาน จนพักใหญ่ๆ กว่าที่เหรียญจะหลุดเข้าไปในเครื่อง และเครื่องทำงานได้ จากคณะผู้แปล
python/programming.txt · Last modified: 2021/08/30 09:55 (external edit)

Page Tools