Part of 10306103 หลักการเขียนโปรแกรมเบื้องต้น (Fundamentals of Programming)
บทที่ 14 จริยธรรมทางวิชาการและความซื่อสัตย์ในการพัฒนาโค้ด
แผนบริหารการสอนประจำบทที่ 14
บทนี้ว่าด้วยจริยธรรมทางวิชาการ (academic integrity) และความซื่อสัตย์ในการพัฒนาโค้ด ซึ่งเป็นบทที่เน้นแนวคิดและการปฏิบัติมากกว่าการเขียนโค้ดจำนวนมาก โดยอธิบายว่าความซื่อสัตย์คือการไม่นำผลงานของผู้อื่นมาเป็นของตน การจำแนกการคัดลอกที่ไม่เหมาะสมออกจากการศึกษาแนวทางแล้วพัฒนาเป็นโค้ดของตนเอง การพัฒนาโค้ดด้วยความเข้าใจของตนเองจนอธิบายการทำงานได้ทุกบรรทัด และการอ้างอิงแหล่งที่มาและการใช้เครื่องมือช่วย เช่น เว็บ ตัวอย่างโค้ด หรือเครื่องมือปัญญาประดิษฐ์ (AI) อย่างโปร่งใส เนื้อหาต่อยอดจากการจัดการสตริงในบทที่ 8 และมาตรฐานการเขียนโค้ดในบทที่ 13 โดยนำหลักการวนอักขระในสตริงมาพัฒนาโปรแกรมตัวอย่างหนึ่งด้วยความเข้าใจของตนเอง บทนี้ตอบ CLO4 ที่ระบุถึงการพัฒนาโค้ดด้วยความเข้าใจของตนเองและความซื่อสัตย์โดยตรง
| ผลลัพธ์ | ข้อความ | หลักฐาน | CLO |
|---|---|---|---|
| LLO14.1 | อธิบายหลักจริยธรรมทางวิชาการและความซื่อสัตย์ในการพัฒนาโค้ด และจำแนกการคัดลอกที่ไม่เหมาะสม | งานข้อ 1 (ปฏิบัติการที่ 14 Lab B) | CLO4 |
| LLO14.2 | พัฒนาโค้ดด้วยความเข้าใจของตนเอง โดยศึกษาแนวทางจากแหล่งอื่นแล้วเขียนใหม่พร้อมอธิบายการทำงาน | งานข้อ 2 (ปฏิบัติการที่ 14 Lab A) | CLO4 |
| LLO14.3 | อ้างอิงแหล่งที่มาและการใช้เครื่องมือช่วย (รวมถึงเครื่องมือ AI) อย่างซื่อสัตย์และโปร่งใส | งานข้อ 3 (ปฏิบัติการที่ 14 Lab A/B) | CLO4 |
CLO ที่เกี่ยวข้อง (ข้อความจากหลักสูตร):
- CLO4 พัฒนาโค้ดด้วยความเข้าใจของตนเอง หลีกเลี่ยงการคัดลอกจากแหล่งอื่นโดยไม่ศึกษา เพื่อให้ผลงานถูกต้องและมีความซื่อสัตย์
บทที่ 14 เป็นจุดตรวจ CLO4 ระยะที่ 3 ต่อจากบทที่ 1 และ 7 ซึ่งให้ข้อเสนอแนะเท่านั้น ใบงาน C14-WS01 มี 30 คะแนน คิดในหมวดความซื่อสัตย์ 5% ไม่รวมในหมวดใบงานบทที่ 1–13
CLO4 สรุปผลแบบถ่วงน้ำหนัก เป้าหมาย 60% เพื่อสะท้อนผลการเรียนรู้เท่านั้น ไม่เป็นเงื่อนไขผ่านรายวิชา และไม่ทำให้ได้เกรด I โดยอัตโนมัติ
ระเบียบ บทลงโทษ และนโยบาย AI เฉพาะของมหาวิทยาลัยหรือหลักสูตรต้องใช้แหล่งอ้างอิงจริง แยกกระบวนการดังกล่าวออกจากการให้คะแนนหลักฐานตามรูบริกนี้
วิธีสอน
- ตั้งคำถามนำว่าการนำโค้ดของผู้อื่นมาส่งโดยไม่เข้าใจต่างจากการศึกษาตัวอย่างแล้วเขียนใหม่ด้วยความเข้าใจอย่างไร เพื่อเปิดประเด็นเรื่องความซื่อสัตย์และนำเข้าสู่หลักจริยธรรมทางวิชาการ
- อธิบายหลักจริยธรรมทางวิชาการและความซื่อสัตย์ แล้วจำแนกการคัดลอกที่ไม่เหมาะสมออกจากการศึกษาแนวทางแล้วอ้างอิง พร้อมเชื่อมโยงกับระเบียบความซื่อสัตย์ของหลักสูตรที่ผู้สอนเตรียม
- สาธิตขั้นตอนการพัฒนาโค้ดด้วยความเข้าใจของตนเอง คือศึกษาแนวทาง เขียนใหม่ด้วยคำของตน และอธิบายการทำงานได้ทุกบรรทัด โดยใช้โปรแกรมนับสระเป็นตัวอย่างที่ต่อยอดจากการวนอักขระในบทที่ 8
- อธิบายการอ้างอิงแหล่งที่มาและการแจ้งการใช้เครื่องมือช่วยอย่างโปร่งใส ทั้งเว็บ ตัวอย่างโค้ด และเครื่องมือ AI ด้วยการเขียนคอมเมนต์ระบุแนวทางและแหล่งที่ศึกษา
- มอบหมายให้ลงมือปฏิบัติตามใบงาน ทั้งการพัฒนาโปรแกรมด้วยความเข้าใจและการวิเคราะห์สถานการณ์จริยธรรม โดยกำหนดจุดตรวจระหว่างทางเพื่อให้ข้อมูลป้อนกลับทันที
สื่อการเรียนการสอน
- เครื่องคอมพิวเตอร์ที่เข้าถึงแพลตฟอร์มการเรียนของรายวิชาสำหรับเขียน คอมไพล์ และรันโปรแกรมภาษา C (มาตรฐาน C11) บนเว็บ
- เอกสารประกอบบทที่ 14 และสไลด์สรุปหลักจริยธรรมทางวิชาการ การพัฒนาด้วยความเข้าใจ และการอ้างอิง
- ไฟล์โปรแกรมตัวอย่าง
ch14_vowels.cและชุดสถานการณ์กรณีศึกษาสำหรับ Lab B - ระเบียบและแนวปฏิบัติด้านความซื่อสัตย์ของมหาวิทยาลัยและหลักสูตร (ผู้สอนเตรียม)
การวัดผลและการประเมินผล
กำหนดส่ง: งานข้อ 1–3 ภายใน 23:59 น. ของวันก่อนวันปฏิบัติการในสัปดาห์ที่ 15 ส่วนชุดฝึกท้ายบทและแบบฝึกหัดวัดความเข้าใจของบทนี้ ภายใน 23:59 น. ของวันก่อนวันบรรยายในสัปดาห์ที่ 15 ดูวันที่จริงของตอนเรียนได้ในห้องเรียนออนไลน์ (มติผู้สอน 28 ต.ค. 2569)
| ข้อ | งาน | หลักฐาน | ผลลัพธ์ | CLO |
|---|---|---|---|---|
| 1 | วิเคราะห์ชุดสถานการณ์ว่าการกระทำใดเหมาะสมหรือไม่เหมาะสมด้านความซื่อสัตย์ พร้อมเหตุผลและแนวทางที่ถูกต้อง | เอกสารวิเคราะห์สถานการณ์ | LLO14.1 | CLO4 |
| 2 | ศึกษาแนวทางโปรแกรมหนึ่ง แล้วเขียนใหม่ด้วยความเข้าใจของตนเอง พร้อมคอมเมนต์อธิบายการทำงาน | ไฟล์ซอร์สโค้ด + ผลการรัน | LLO14.2 | CLO4 |
| 3 | ระบุแหล่งที่มาและเครื่องมือช่วย (รวมถึง AI) ที่ใช้ในงานของตนอย่างโปร่งใส | คอมเมนต์อ้างอิงในไฟล์ + เอกสารวิเคราะห์ | LLO14.3 | CLO4 |
หลักฐานและคะแนนใบงาน C14-WS01 (30 คะแนน)
งานข้อ 1–3 ให้คะแนนแยกกันตามหลักฐานที่มี แม้โปรแกรมยังคอมไพล์ไม่ผ่าน ก็ตรวจคำอธิบายและการอ้างอิงได้ ไม่ใช้ข้อใดเป็นด่านปิดการให้คะแนนอีกข้อ
| งาน | ผลลัพธ์ | คะแนนเต็ม |
|---|---|---|
| 1 วิเคราะห์สถานการณ์ | LLO14.1 | 10 |
| 2 พัฒนาและอธิบายโค้ด | LLO14.2 | 10 |
| 3 บันทึกที่มาและความช่วยเหลือ | LLO14.3 | 10 |
รูบริก LLO14.1: วิเคราะห์สถานการณ์ (0–10)
ใช้บัตร A–F ในบทนี้ ให้คะแนนรายองค์ประกอบแล้วรวม ไม่ให้คะแนนจากการกล่าวโทษหรือความเห็นว่าบุคคลใดเป็นคนดีหรือไม่ดี
| องค์ประกอบ | วิธีให้คะแนนจากหลักฐาน | เต็ม |
|---|---|---|
| จำแนกตามข้อเท็จจริงและข้ออนุญาต | A–F ข้อละ 0.5 เมื่อแยกได้ถูกต้อง รวมถึงระบุว่ายังตัดสินไม่ได้เมื่อข้อมูลไม่พอ | 3 |
| เหตุผลที่ตรวจสอบได้ | A–F ข้อละ 0.5 เมื่อยกข้อเท็จจริงหรือข้ออนุญาตรองรับ ไม่เติมข้อสันนิษฐานเป็นข้อเท็จจริง | 3 |
| แนวทางดำเนินการ | ข้อละ 1 สำหรับการตรวจข้ออนุญาตเพิ่ม การแก้ไข/อ้างอิง และการขอคำชี้แจงอย่างเป็นธรรม | 3 |
| สรุปข้อจำกัด | 1 เมื่อแยกสิ่งที่รู้กับสิ่งที่ยังต้องตรวจได้; 0.5 เมื่อระบุได้บางส่วน; 0 เมื่อไม่มี | 1 |
รูบริก LLO14.2: พัฒนาและอธิบายโค้ด (0–10)
| องค์ประกอบ | วิธีให้คะแนนจากหลักฐาน | เต็ม |
|---|---|---|
| วิธีคิดก่อนโค้ด | input/output ตัวนับ เงื่อนไขหยุด และการตรวจสระ ข้อละ 0.5 | 2 |
| ผลงานและผลทดสอบ | คอมไพล์ได้ 1; นับตัวเล็ก/ใหญ่ได้ 1; ตรวจสตริงว่างและอักขระที่ไม่ใช่สระได้อย่างละ 0.5 | 3 |
| อธิบายการทำงาน | ไล่ค่าได้ตรงโค้ด 1; อธิบายลูป/เงื่อนไขได้ 1; อธิบายผลคืนและข้อจำกัดได้ 1 ให้ 0.5 เมื่อถูกบางส่วน | 3 |
| ปรับแก้อย่างมีเหตุผล | ระบุจุดที่แก้หรือเสนอเปลี่ยนกรณีทดสอบ 1; คาดผลและเทียบหลักฐานหลังปรับ 1 ให้ 0.5 เมื่อครบเพียงบางส่วน | 2 |
รูบริก LLO14.3: อ้างอิงและรายงานความช่วยเหลือ (0–10)
| องค์ประกอบ | วิธีให้คะแนนจากหลักฐาน | เต็ม |
|---|---|---|
| ระบุที่มาให้ตรวจตามได้ | แหล่ง/ผู้จัดทำ 1; ชื่อหรือหัวข้อ 1; URL หรือบท/หน้า/รุ่น 1 ให้ 0.5 เมื่อข้อมูลนั้นมีแต่ยังตามได้ไม่ชัด | 3 |
| แยกบทบาทความช่วยเหลือ | ระบุส่วนที่รับความช่วยเหลือ 1; อธิบายบทบาทเว็บ/บุคคล/AI ตามที่ใช้จริง 1; แยกส่วนที่ปรับเอง 1 ให้ 0.5 เมื่อชัดบางส่วน | 3 |
| ความสอดคล้องกับงาน | เชื่อมบันทึกกับโค้ดหรือคำตอบที่ส่ง 1; อธิบายวิธีตรวจความถูกต้องของสิ่งที่นำมาใช้ 1 ให้ 0.5 เมื่อมีหลักฐานบางส่วน | 2 |
| รายงานขอบเขตตามจริง | ระบุสิ่งที่ทดสอบแล้ว 1; แยกสิ่งที่ยังไม่ตรวจหรือข้อจำกัด 1 ให้ 0.5 เมื่อชัดบางส่วน | 2 |
ทุกองค์ประกอบให้ 0 เมื่อไม่มีหลักฐานรองรับ ใช้ครึ่งคะแนนตามที่ระบุเท่านั้น หากไม่ใช้แหล่งภายนอกหรือ AI ให้บอกขอบเขตงานและวิธีพัฒนาของตนตามจริง ใช้หลักฐานนั้นประเมินได้เต็ม ไม่บังคับให้ใช้เครื่องมือ
ตรวจจากชิ้นงาน คำอธิบาย ผลทดสอบ และบันทึกที่ผู้เรียนจัดทำเฉพาะงานนี้ ไม่เรียกดูบทสนทนา AI ส่วนตัว ประวัติการกดแป้นพิมพ์ หรือบัญชีส่วนตัว ไม่ใช้ความคล้ายของโค้ดหรือการพูดติดขัดเพียงอย่างเดียวตัดสินความซื่อสัตย์
คะแนนสะท้อนหลักฐานการเรียนรู้ ไม่ใช่คำตัดสินคุณธรรม เมื่อหลักฐานไม่พอ ให้ระบุส่วนที่ขาดและให้ผู้เรียนชี้แจงด้วยข้อเขียนหรือวาจาโดยใช้คำถามและเกณฑ์เดียวกัน
คะแนนหมวดความซื่อสัตย์ = คะแนน C14-WS01 / 30 × 5 โดยแต่ละ LLO มีคะแนนเต็ม 10 ไม่มีด่านผ่าน/ไม่ผ่าน และไม่เพิ่มคะแนนซ้ำในหมวดใบงานบทที่ 1–13
CLO4 สรุปผลแบบถ่วงน้ำหนัก เป้าหมาย 60% เพื่อสะท้อนผลการเรียนรู้เท่านั้น ไม่เป็นเงื่อนไขผ่านรายวิชา และไม่ทำให้ได้เกรด I โดยอัตโนมัติ
ใช้รูบริกนี้กับงานที่ประกาศเกณฑ์ก่อนส่ง ไม่แปลงผลผ่าน/ไม่ผ่านเดิมเป็นคะแนนย้อนหลังโดยอัตโนมัติ ผู้สอนต้องตรวจหลักฐานและบันทึกคะแนนตามเกณฑ์ที่ประกาศ
ดูคะแนนและข้อเสนอแนะได้ที่หน้า “คะแนนของฉัน” การแก้ไขและส่งช้าใช้ประกาศกำหนดส่งของรายวิชาที่แจ้งก่อนส่งงาน ไม่ใช้สิทธิส่งแก้จนวันส่งเกรดแบบด่านผ่าน/ไม่ผ่านเดิม
เฉลยจะเปิดในชั้นเรียนหลังทุกคนทำเสร็จ
บทนำ
การพัฒนาโปรแกรมที่ดีไม่ได้วัดจากการที่โปรแกรมทำงานถูกต้องเพียงอย่างเดียว แต่ยังขึ้นกับว่าผลงานนั้นเกิดจากความเข้าใจและความซื่อสัตย์ของผู้พัฒนาเองหรือไม่ จริยธรรมทางวิชาการ (academic integrity) คือการทำงานด้วยความซื่อสัตย์ ไม่นำผลงานของผู้อื่นมาเป็นของตน และให้เครดิตแก่แหล่งที่มา บทที่ 8 ได้แนะนำการจัดการสตริงและการวนอักขระ และบทที่ 13 ได้แนะนำมาตรฐานการเขียนโค้ดและการใส่คอมเมนต์ บทนี้นำทั้งสองเรื่องมาใช้แสดงให้เห็นว่าการศึกษาแนวทางจากแหล่งอื่นแล้วพัฒนาเป็นโค้ดของตนเองพร้อมอ้างอิงนั้นต่างจากการคัดลอกโดยไม่ศึกษาอย่างไร ตั้งแต่หลักจริยธรรม การพัฒนาด้วยความเข้าใจของตนเอง การอ้างอิงแหล่งที่มาและการใช้เครื่องมือช่วย ไปจนถึงกรณีศึกษาและแนวปฏิบัติที่ดี
หลักความซื่อสัตย์และการพัฒนาด้วยความเข้าใจของตนเองในบทนี้เป็นพื้นฐานของบทที่ตามมา โครงงานบูรณาการในบทที่ 15 ต้องส่งมอบผลงานที่พัฒนาด้วยความเข้าใจของตนเองและอ้างอิงแหล่งที่มาอย่างโปร่งใส บทนี้จึงเป็นการเตรียมความพร้อมทั้งด้านแนวคิดและการปฏิบัติด้านความซื่อสัตย์
| สิ่งที่ได้จากบทนี้ | ใช้ต่อในบท |
|---|---|
| หลักจริยธรรมทางวิชาการและการจำแนกการคัดลอกที่ไม่เหมาะสม | บท 15 (โครงงานบูรณาการ) |
| การพัฒนาโค้ดด้วยความเข้าใจของตนเอง | บท 15 (โครงงานบูรณาการ) |
| การอ้างอิงแหล่งที่มาและการใช้เครื่องมือช่วย (รวมถึง AI) อย่างโปร่งใส | บท 15 (โครงงานบูรณาการ) |
ความรู้พื้นฐาน เครื่องมือ และรุ่นซอฟต์แวร์
บทนี้ต้องใช้คอมไพเลอร์ภาษา C และโปรแกรมแก้ไขข้อความหรือ IDE และต้องมีความรู้เรื่องการวนอักขระในสตริงจากบทที่ 8 รวมถึงมาตรฐานการเขียนโค้ดและการใส่คอมเมนต์จากบทที่ 13 ตารางด้านล่างแสดงรุ่นที่ใช้ตรวจชุดสอนฉบับนี้ แยกจากบันทึกตัวอย่างเดิมซึ่งระบุ GCC 13.3.0
| เครื่องมือ | รุ่นที่ทดสอบ | หน้าที่ |
|---|---|---|
| คอมไพเลอร์ GCC | 6.3.0 (MinGW-w64 Windows), 12.2.0 (Debian Linux) | ตรวจโปรแกรมตัวอย่างของชุดสอนฉบับนี้ |
| มาตรฐานภาษา | C11 (-std=c11) | กำหนดไวยากรณ์ภาษา C ที่ใช้อ้างอิง |
บันทึกตัวอย่างเดิมระบุ GCC 13.3.0 บน Linux ส่วนชุดสอนฉบับนี้ตรวจซ้ำด้วยเครื่องมือตามตาราง ไม่อ้างว่าได้รันรุ่นเดิมซ้ำ หากใช้คอมไพเลอร์หรือระบบปฏิบัติการอื่น ผลการแสดงข้อความภาษาไทยอาจต่างกันเล็กน้อย แต่ซอร์สโค้ดภาษา C มาตรฐานใช้ได้เหมือนกัน ส่วนระเบียบและแนวปฏิบัติด้านความซื่อสัตย์ที่อ้างถึงเป็นหลักการทั่วไป ระเบียบและบทลงโทษเฉพาะของมหาวิทยาลัยและหลักสูตรต้องให้ผู้สอนเติมแหล่งอ้างอิงจริง
วิธีใช้ชุดสอนบทที่ 14
เชื่อมจาก บทที่ 13 มาตรฐานโค้ดและการจัดการเวอร์ชัน ว่าไฟล์ที่อ่านง่ายและมีประวัติยังต้องบอกที่มาอย่างตรงไปตรงมา บทนี้ฝึกแยกสิ่งที่รู้ ข้ออนุญาต และหลักฐานของสิ่งที่รายงาน
เริ่มจากอ่านเงื่อนไขงาน แล้ววิเคราะห์กรณีสมมติ อธิบายโปรแกรมของตน และทำบันทึกที่มาควบคู่กับผลตรวจ งานหลักยังเป็น Lab A–B และ LLO14.1–14.3 ไม่เพิ่มข้อบังคับใช้ AI หรือเผยแพร่บทสนทนาออนไลน์
ใบงานเป็นตารางสำหรับคัดลงสมุดหรือเอกสาร เว็บไซต์ไม่ได้รับคำตอบหรือบันทึกการใช้เครื่องมือให้อัตโนมัติ ใช้เฉพาะชื่อและข้อมูลสมมติในการอภิปราย ไม่ใช้เรื่องของเพื่อนที่ระบุตัวได้เป็นกรณีสาธารณะ
ใบงาน 1: อ่านข้อตกลงของงานก่อนตัดสิน
ความซื่อสัตย์เกี่ยวข้องกับทั้งความจริงของที่มาและข้ออนุญาตของงาน ถ้าโจทย์ห้ามรับร่างคำตอบ การเขียนอ้างอิงภายหลังไม่ได้เปลี่ยนให้ร่างนั้นได้รับอนุญาต และการอธิบายโค้ดได้ก็ไม่ลบข้อกำหนดที่ห้ามไว้
| ประเด็นที่ต้องตรวจ | ประกาศหรือโจทย์ฉบับใด | ข้อความที่เกี่ยวข้อง | สิ่งที่อนุญาต | สิ่งที่ยังต้องถาม |
|---|---|---|---|---|
| งานเดี่ยวหรืองานกลุ่ม | ||||
| ปรึกษาแนวคิดได้แค่ไหน | ||||
| ใช้ตัวอย่างโค้ดได้หรือไม่ | ||||
| ใช้ AI ช่วยบทบาทใดได้บ้าง | ||||
| ต้องเปิดเผยความช่วยเหลือแบบใด |
เติมจากประกาศจริงพร้อมวันที่หรือรุ่นเอกสาร ไม่เติมจากความเคยชินของวิชาอื่น ถ้าไม่มีข้อความชัด ให้ระบุว่า “ยังไม่พบข้อกำหนด” และถามผู้สอนก่อนใช้ความช่วยเหลือส่วนนั้น ไม่สรุปว่าไม่มีประกาศเท่ากับอนุญาตทุกอย่าง
ACM Code of Ethics ข้อ 1.3 เน้นการรายงานอย่างซื่อสัตย์และไม่บิดเบือนนโยบายองค์กร ใช้เป็นกรอบอภิปราย ไม่ใช้แทนประกาศหรือกระบวนการพิจารณาของมหาวิทยาลัย
14.1 จริยธรรมทางวิชาการและความซื่อสัตย์
ระดับที่ 1: จริยธรรมทางวิชาการ (academic integrity) คือการทำงานด้วยความซื่อสัตย์ ไม่นำผลงานของผู้อื่นมาเป็นของตน และให้เครดิตแก่แหล่งที่มาที่ใช้ ความซื่อสัตย์ในการพัฒนาโค้ดจึงหมายถึงการที่ผลงานสะท้อนความเข้าใจและความพยายามของผู้พัฒนาเองอย่างแท้จริง
ระดับที่ 2: การคัดลอกโค้ดจากแหล่งอื่น เช่น จากเพื่อน จากเว็บ หรือจากตัวอย่างสำเร็จรูป โดยไม่ศึกษาและไม่อ้างอิง แล้วนำมาส่งเป็นผลงานของตน ถือว่าไม่เหมาะสม เพราะผลงานไม่ได้สะท้อนความเข้าใจของผู้ส่ง สิ่งนี้ต่างจากการศึกษาแนวทางจากแหล่งอื่นแล้วพัฒนาเป็นโค้ดของตนเองพร้อมระบุแหล่งที่ศึกษา ซึ่งอาจเป็นการเรียนรู้ที่ซื่อสัตย์เมื่อทำตามข้ออนุญาตของงานและเงื่อนไขแหล่งด้วย หลักสำคัญคือการอ้างอิงที่ถูกต้องและการลงมือทำความเข้าใจด้วยตนเอง ไม่ใช่การนำผลงานสำเร็จของผู้อื่นมาแอบอ้าง ทั้งนี้ระเบียบและบทลงโทษที่เป็นทางการให้อ้างอิงตามระเบียบความซื่อสัตย์ของมหาวิทยาลัยและหลักสูตรที่ผู้สอนจัดเตรียม
ระดับที่ 3: ในเชิงวิชาชีพ ความซื่อสัตย์ส่งผลต่อความน่าเชื่อถือของผู้พัฒนาและผลงานโดยตรง ผู้ที่ส่งงานซึ่งไม่ได้เข้าใจจริงจะไม่สามารถดูแล แก้ไข หรือต่อยอดผลงานนั้นได้เมื่อเกิดปัญหา และเมื่อทำงานร่วมกับผู้อื่น ความไว้วางใจจะลดลงหากพบว่าผลงานไม่ได้มาจากความเข้าใจของตน การรักษาความซื่อสัตย์ตั้งแต่ขั้นเรียนรู้จึงเป็นรากฐานของความเป็นมืออาชีพในระยะยาว
คำถามตรวจความเข้าใจ 14.1: การคัดลอกโค้ดจากเพื่อนโดยไม่เข้าใจ ต่างจากการศึกษาตัวอย่างแล้วเขียนใหม่พร้อมอ้างอิงอย่างไร
กิจกรรมบัตรสถานการณ์: แยกข้อเท็จจริงจากข้อสันนิษฐาน
อ่านบัตรสมมติทีละใบ ระบุสิ่งที่เกิดขึ้นจริง สิ่งที่ยังขาด และขั้นถัดไปก่อนตัดสิน ให้ใช้คำว่า “ต้องตรวจข้ออนุญาตเพิ่ม” เมื่อข้อมูลไม่พอ แทนการบังคับเลือกอนุญาตหรือผิดทันที
| บัตร | ข้อเท็จจริงที่กำหนด | คำถามสำหรับผู้เรียน |
|---|---|---|
| A | โจทย์ให้ปรึกษาแนวคิดได้ ผู้เรียนคุยเรื่องลูปแล้วต่างคนเขียนและบันทึกบทบาท | หลักฐานใดแสดงว่าทำตามขอบเขต |
| B | โจทย์ให้ทำเอง ผู้เรียนรับไฟล์เพื่อน เปลี่ยนชื่อ และแจ้งว่าเขียนทั้งหมดเอง | ข้อความใดไม่ตรงกับที่มา |
| C | อ่านเว็บแล้วเขียนใหม่ มีอ้างอิง แต่ยังไม่ทราบว่างานอนุญาตให้ใช้ตัวอย่างหรือไม่ | ข้อมูลใดต้องตรวจเพิ่ม |
| D | งานอนุญาต AI เสนอกรณีทดสอบ ผู้เรียนใช้ AI ร่างทั้งฟังก์ชัน | บทบาทที่ใช้ตรงขอบเขตหรือไม่ |
| E | ผู้เรียนรันสองกรณีแล้วเขียนว่าทุกอินพุตผ่าน | หลักฐานรองรับคำใดได้จริง |
| F | โค้ดสองฉบับคล้ายกัน ผู้ตรวจยังไม่ได้รับคำอธิบายหรือที่มา | ควรตรวจอะไรตามกระบวนการก่อนสรุป |
แบ่งกลุ่มให้แต่ละคนเป็นผู้พัฒนา ผู้ตรวจ และผู้ตั้งคำถาม ผลัดกันยกเหตุผลจากข้อเท็จจริงที่กำหนด ห้ามเพิ่มข้อเท็จจริงที่ช่วยคำตอบของตนโดยไม่ประกาศว่าเป็นสมมติฐาน
14.2 การพัฒนาโค้ดด้วยความเข้าใจของตนเอง
ระดับที่ 1: การพัฒนาโค้ดด้วยความเข้าใจของตนเองคือการเข้าใจหลักการและเหตุผลของโค้ดก่อนเขียน ไม่ใช่การจดจำหรือคัดลอกรูปแบบมาใช้โดยไม่ทราบว่าแต่ละส่วนทำงานอย่างไร
ระดับที่ 2: ขั้นตอนที่ซื่อสัตย์ประกอบด้วยสามขั้น ขั้นแรกคือศึกษาแนวทางจากแหล่งที่น่าเชื่อถือ เช่น เอกสารประกอบหรือตัวอย่างในบทก่อน เพื่อเข้าใจหลักการ ขั้นที่สองคือเขียนโค้ดใหม่ด้วยคำและโครงสร้างของตนเอง แทนการคัดลอกบรรทัดต่อบรรทัด และขั้นที่สามคืออธิบายการทำงานของโค้ดได้ทุกบรรทัด หากมีส่วนใดที่อธิบายไม่ได้ แสดงว่ายังไม่เข้าใจจริงและควรกลับไปศึกษาเพิ่ม ตัวอย่างในบทนี้คือการศึกษาหลักการวนอักขระในสตริงจากบทที่ 8 แล้วพัฒนาโปรแกรมนับสระขึ้นเองด้วยความเข้าใจ
ระดับที่ 3: ประโยชน์ของการพัฒนาด้วยความเข้าใจของตนเองคือทำให้แก้ไข ต่อยอด และรับผิดชอบผลงานได้จริง เมื่อโปรแกรมมีข้อผิดพลาดหรือต้องเพิ่มความสามารถใหม่ ผู้ที่เข้าใจโค้ดของตนจะทราบว่าต้องแก้ส่วนใดและแก้อย่างไร ต่างจากผู้ที่คัดลอกมาโดยไม่เข้าใจซึ่งจะติดขัดทันทีที่ต้องเปลี่ยนแปลง ความเข้าใจจึงเป็นเงื่อนไขของทั้งความซื่อสัตย์และคุณภาพของผลงานตามเจตนาของ CLO4
คำถามตรวจความเข้าใจ 14.2: เหตุใดการเข้าใจโค้ดของตนเองจึงสำคัญต่อการแก้ไขและต่อยอดผลงาน
ใบงาน 2: อธิบายวิธีคิดก่อนดูบรรทัดโค้ด
สำหรับ Lab A กำหนดให้ “สระ” หมายถึงตัวอักษรอังกฤษ a, e, i, o, u ทั้งตัวพิมพ์เล็กและใหญ่ ไม่ใช่การแยกพยางค์ เสียงอ่าน หรือสระทุกภาษา ข้อความต้องเป็นสตริง C ที่มีอักขระปิดท้ายและอ่านได้ครบ
| คำถามที่ต้องตอบด้วยคำของตน | คำอธิบาย | หลักฐานหรือกรณีตรวจ |
|---|---|---|
| ข้อมูลเข้าและผลคืนคืออะไร | ||
| เริ่มตัวนับที่เท่าไร เพราะอะไร | ||
| เหตุใดจึงหยุดเมื่อพบอักขระปิดท้าย | ||
| ตัวพิมพ์ใหญ่ถูกนับตรงไหน | ||
| ช่องว่างและตัวเลขมีผลอย่างไร | ||
| ขอบเขตใดยังไม่รองรับ |
ปิดตัวอย่างแล้วเขียนขั้นตอนด้วยภาษาธรรมชาติ จากนั้นเขียนโค้ดตามขั้นตอน ตรวจผล และอธิบายจุดที่แก้ ไม่ใช้เพียงการจำบรรทัดเป็นหลักฐานทั้งหมด และไม่เขียนว่า “ไม่เคยใช้ความช่วยเหลือ” ถ้าเคยใช้จริง
หากอธิบายบางส่วนยังไม่ได้ ให้ระบุจุดที่ต้องทบทวนและกลับไปศึกษา การพูดติดขัดหรือโค้ดคล้ายตัวอย่างเพียงอย่างเดียวไม่เพียงพอให้สรุปที่มาของผลงาน ต้องพิจารณาหลักฐานและกระบวนการของรายวิชาร่วมกัน
ตัวอย่างประกอบ: ไล่การนับแล้วเทียบกับคำอธิบาย
ไฟล์ vowel_trace.c แสดงการตัดสินใจทีละตำแหน่งของข้อความสมมติ Ai x ก่อนรันให้คาดค่าตัวนับหลังแต่ละตำแหน่ง ตัวอย่างนี้ช่วยตรวจความเข้าใจ ไม่ใช้ผลจากการคัดลอกแล้วรันเป็นหลักฐานว่าเขียนเอง
/* vowel_trace.c : chapter 14 demonstration, not a claim of student authorship */
#include <stdio.h>
int is_english_vowel(char ch)
{
return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U';
}
int main(void)
{
const char text[] = "Ai x";
int count = 0;
for (int i = 0; text[i] != '\0'; ++i) {
const int matched = is_english_vowel(text[i]);
count += matched;
printf("index=%d char=[%c] matched=%d count=%d\n",
i, text[i], matched, count);
}
printf("vowels=%d\n", count);
return 0;
}| ตำแหน่ง | อักขระ | คาดว่าจะนับหรือไม่ | ตัวนับหลังรอบ | ผลที่รันจริง |
|---|---|---|---|---|
| 0 | A | |||
| 1 | i | |||
| 2 | ช่องว่าง | |||
| 3 | x |
อธิบายว่าฟังก์ชันคืน 0 หรือ 1 ได้อย่างไร และเหตุใดจึงบวกค่าที่คืนได้ ทดลองเปลี่ยนข้อความเป็น y, AEIOU และสตริงว่างในสำเนาแยก แล้วเขียนว่าการเปลี่ยนนี้ตรวจความเข้าใจส่วนใด
ตัวอย่างประกอบ: รายงานผลตรวจตามที่รันได้จริง
ไฟล์ vowel_evidence.c รวมกรณีที่กำหนดคำตอบไว้ก่อน เทียบผลจริงแล้วคืนสถานะไม่เป็นศูนย์เมื่อผิด ตัวอย่างตรวจเฉพาะตัวอักษรอังกฤษที่ระบุ ไม่อ้างว่ารองรับภาษาไทยหรือ Unicode ทุกแบบ
/* vowel_evidence.c : chapter example; record the sources actually used */
#include <stdio.h>
int is_english_vowel(char ch)
{
return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U';
}
int count_english_vowels(const char text[])
{
int count = 0;
for (int i = 0; text[i] != '\0'; ++i) {
count += is_english_vowel(text[i]);
}
return count;
}
struct VowelCase {
const char *text;
int expected;
};
int main(void)
{
const struct VowelCase cases[] = {
{"", 0},
{"Education", 5},
{"AEIOU", 5},
{"aeiou", 5},
{"rhythm", 0},
{"A1 e!", 2},
{"Queue", 4},
{"12345", 0}
};
const int case_count = (int)(sizeof cases / sizeof cases[0]);
int failed_count = 0;
for (int i = 0; i < case_count; ++i) {
const int actual = count_english_vowels(cases[i].text);
const int ok = actual == cases[i].expected;
printf("case=%d expected=%d actual=%d %s\n",
i + 1, cases[i].expected, actual, ok ? "PASS" : "FAIL");
if (!ok) {
++failed_count;
}
}
printf("failed=%d\n", failed_count);
return failed_count == 0 ? 0 : 1;
}คอมไพล์เป็นไฟล์แยกเพื่อไม่สับสนกับ Lab A เดิม และบันทึกรุ่นเครื่องมือ ข้อมูลที่ใช้ ผลจริง และข้อจำกัด ก่อนคัดข้อความ PASS ไปอ้างต้องยืนยันว่าตรงกับซอร์สฉบับที่ส่ง
gcc -std=c11 -Wall -Wextra -Wpedantic vowel_trace.c -o vowel_trace
gcc -std=c11 -Wall -Wextra -Wpedantic vowel_evidence.c -o vowel_evidence
./vowel_trace
./vowel_evidenceคำสั่งรันนี้ใช้รูปแบบเชลล์ Linux/macOS หากใช้ PowerShell กับ GCC ให้สร้างชื่อที่ลงท้าย .exe แล้วรัน .\vowel_trace.exe และ .\vowel_evidence.exe ตามไฟล์ที่สร้าง
การตรวจแปดกรณีผ่านสนับสนุนคำว่า “ผ่านแปดกรณีที่ระบุ” ไม่ใช่ “ถูกทุกกรณี” ถ้าฉบับใดยังไม่รันให้บันทึกว่ายังไม่รัน การแก้ข้อมูลทดสอบให้เข้ากับบั๊กโดยไม่มีเหตุผลจากโจทย์ไม่ใช่การยืนยันความถูกต้อง
14.3 การอ้างอิงแหล่งที่มาและการใช้เครื่องมือช่วย
ระดับที่ 1: การอ้างอิงคือการให้เครดิตแก่แหล่งที่ใช้ศึกษาหรือเครื่องมือที่ช่วยในการพัฒนา เพื่อให้ผู้อ่านทราบว่าส่วนใดของผลงานได้แนวทางมาจากที่ใด
ระดับที่ 2: แนวปฏิบัติที่ซื่อสัตย์คือการเขียนคอมเมนต์ระบุแนวทางหรือแหล่งที่ศึกษาไว้ในโค้ด เช่น ระบุว่าศึกษาหลักการจากบทใดหรือเอกสารใด และการแจ้งการใช้เครื่องมือช่วยอย่างโปร่งใส ไม่ว่าจะเป็นเว็บ ตัวอย่างโค้ด หรือเครื่องมือปัญญาประดิษฐ์ (AI) การแจ้งควรระบุว่าใช้เครื่องมือใด ใช้ในส่วนใด และผู้พัฒนาได้ตรวจสอบและเข้าใจผลลัพธ์นั้นด้วยตนเองหรือไม่ นโยบายการใช้เครื่องมือ AI ที่เป็นทางการให้อ้างอิงตามระเบียบของมหาวิทยาลัยและหลักสูตรที่ผู้สอนจัดเตรียม
ระดับที่ 3: ความโปร่งใสเป็นส่วนหนึ่งของความซื่อสัตย์ทางวิชาการ การอ้างอิงไม่ได้ทำให้การคัดลอกกลายเป็นเรื่องที่ยอมรับได้ในทุกกรณี แต่เป็นการแสดงที่มาของแนวทางอย่างตรงไปตรงมา ผู้พัฒนายังต้องเข้าใจและรับผิดชอบโค้ดที่ส่งเสมอ แม้จะได้แนวทางมาจากแหล่งอื่นหรือใช้เครื่องมือช่วย การแจ้งที่มาอย่างครบถ้วนจึงช่วยแยกการเรียนรู้ที่ซื่อสัตย์ออกจากการแอบอ้างผลงาน
คำถามตรวจความเข้าใจ 14.3: ควรบันทึกการใช้เครื่องมือช่วย เช่น เว็บหรือ AI อย่างไรจึงเรียกว่าซื่อสัตย์และโปร่งใส
ใบงาน 3: บันทึกที่มาให้ผู้อ่านตามต่อได้
แยกแหล่งความรู้ที่อ่าน ส่วนโค้ดที่นำมาใช้ และข้อเสนอจากเครื่องมือ ไม่ใส่ชื่อผู้เขียนหรือวันที่ที่หาไม่พบ ถ้าไม่มีวันที่ให้บอกว่าไม่ปรากฏและระบุวันที่เข้าถึงตามรูปแบบที่ผู้สอนใช้
| แหล่งหรือเครื่องมือ | ชื่อหน้าและที่อยู่ | ใช้กับส่วนใด | ศึกษาแนวคิด/นำโค้ดมา/รับข้อเสนอ | สิ่งที่ตรวจเอง |
|---|---|---|---|---|
| เอกสารบทเรียน | ||||
| เอกสารฟังก์ชันภาษา C | ||||
| ตัวอย่างโค้ดภายนอก ถ้ามี | ||||
| ความช่วยเหลืออื่นที่ใช้จริง |
ตัวอย่างการบันทึกที่มาของโปรแกรมในบทนี้คือระบุชื่อบท หน้า และส่วนที่ศึกษา ไม่ใช้เพียง “จากอินเทอร์เน็ต” หากดัดแปลงตัวอย่างที่ให้ไว้ ให้ระบุว่าดัดแปลงส่วนใด ไม่คัดข้อความว่าเขียนเองทั้งหมดไปใช้เป็นคำรับรอง
ACM ข้อ 1.5 เน้นการให้เครดิตและเคารพเงื่อนไขผลงาน ใช้เป็นหลักคิดว่าต้องตรวจทั้งที่มาและข้ออนุญาต การใส่ลิงก์อ้างอิงเพียงอย่างเดียวไม่ตอบเงื่อนไขการใช้ของทุกแหล่ง
ใบงาน 4: เปิดเผยบทบาท AI ตามการใช้จริง
ใช้ตารางนี้เมื่อข้อกำหนดงานอนุญาตบทบาทนั้นก่อน หากไม่ได้ใช้ AI ให้ระบุว่าไม่ได้ใช้ในงานฉบับนี้ ไม่เติมชื่อเครื่องมือเพื่อให้ดูค้นคว้ามากขึ้น และไม่ใช้ข้อความตัวอย่างเป็นรายงานเหตุการณ์ที่ไม่ได้เกิด
| รายการ | บันทึกจากสิ่งที่ใช้จริง |
|---|---|
| ชื่อเครื่องมือและวันที่ใช้ | |
| บทบาทที่โจทย์อนุญาต | |
| สิ่งที่ถามหรือขอให้ช่วยโดยสรุป | |
| ข้อเสนอที่นำมาใช้กับส่วนใด | |
| สิ่งที่ไม่รับหรือแก้ พร้อมเหตุผล | |
| วิธีตรวจและกรณีที่รันเอง | |
| จุดที่ยังไม่แน่ใจ |
การขอให้อธิบาย error, เสนอกรณีทดสอบ และร่างฟังก์ชันเป็นคนละบทบาท ต้องแจ้งตามที่ทำจริง ถ้าข้อเสนอผิด ให้บันทึกว่าผิดตรงใดและตรวจอย่างไร ไม่รายงานเพียงว่าเครื่องมือบอกว่าทำงานได้
แนวทาง UNESCO เรื่อง GenAI ในการศึกษาและวิจัย เสนอการใช้ที่ให้มนุษย์เป็นศูนย์กลางและคุ้มครองข้อมูล ใช้ประกอบการอภิปราย ไม่ใช่นโยบายอนุญาต AI ของรายวิชานี้
14.4 กรณีศึกษาและแนวปฏิบัติ
ระดับที่ 1: ในการเรียนและการทำงานจริงมักพบสถานการณ์ที่ต้องตัดสินว่าการกระทำใดเหมาะสมหรือไม่เหมาะสมด้านความซื่อสัตย์ การแยกแยะได้อย่างถูกต้องช่วยให้ปฏิบัติตนได้อย่างมั่นใจ
ระดับที่ 2: สถานการณ์ที่พบบ่อยมีหลายลักษณะ เช่น การนำโค้ดของเพื่อนมาส่งโดยไม่เข้าใจ ซึ่งไม่เหมาะสม การศึกษาตัวอย่างจากเว็บแล้วเขียนใหม่ด้วยความเข้าใจพร้อมระบุแหล่งที่ศึกษา ซึ่งเหมาะสมเมื่ออยู่ในขอบเขตที่งานอนุญาตและทำตามเงื่อนไขแหล่ง และการใช้เครื่องมือ AI ช่วยร่างโค้ดแล้วนำมาตรวจสอบ ทำความเข้าใจ และแจ้งการใช้อย่างโปร่งใส ซึ่งเหมาะสมเมื่อปฏิบัติตามนโยบายของหลักสูตร การร่วมมือกันเรียนรู้ เช่น การอภิปรายแนวทางร่วมกัน ต่างจากการคัดลอกคำตอบของกันและกันมาส่ง
ระดับที่ 3: แนวปฏิบัติที่ดีสำหรับงานเดี่ยวคือพัฒนาผลงานด้วยความเข้าใจของตนเองและระบุแหล่งที่ศึกษา ส่วนงานกลุ่มคือแบ่งงานอย่างชัดเจน ร่วมกันเข้าใจทุกส่วน และระบุบทบาทของสมาชิกอย่างตรงไปตรงมา จุดที่มักเข้าใจผิดคือการคิดว่าการอ้างอิงทำให้คัดลอกได้ทุกกรณี และการสับสนระหว่างการร่วมมือเรียนรู้กับการคัดลอกคำตอบ หลักที่ยึดได้คือผลงานต้องสะท้อนความเข้าใจของผู้ส่งและแจ้งที่มาอย่างโปร่งใสเสมอ
คำถามตรวจความเข้าใจ 14.4: การร่วมมือกันเรียนรู้ต่างจากการคัดลอกคำตอบของกันและกันมาส่งอย่างไร
14.5 กรณีศึกษาต่อเนื่อง: ความช่วยเหลือแบบใดและต้องเปิดเผยอะไร
การเขียนโปรแกรมมักอาศัยเอกสาร เครื่องมือ และการถามผู้อื่น ประเด็นจริยธรรมไม่จบที่คำถามว่า “ใช้ของคนอื่นหรือไม่” แต่ต้องพิจารณาว่าใช้สิ่งใด ได้รับอนุญาตให้ใช้ในงานนี้หรือไม่ เปิดเผยที่มาอย่างตรงไปตรงมาหรือไม่ และยังสามารถรับผิดชอบสิ่งที่ส่งได้หรือไม่
หลักอ้างอิงในส่วนขยายนี้คือ ACM Code of Ethics โดยเฉพาะความซื่อสัตย์ การเคารพผลงานผู้อื่น ความเป็นส่วนตัว และคุณภาพงาน เป็นกรอบอภิปรายวิชาชีพ ไม่ใช่ระเบียบลงโทษหรือนโยบาย AI ของมหาวิทยาลัย หากโจทย์รายวิชาระบุข้ออนุญาตไว้ ต้องใช้ข้อกำหนดนั้น และสอบถามผู้สอนเมื่อไม่ชัด
14.5.1 กรณีที่หนึ่ง: อ่านคู่มือแล้วเขียนฟังก์ชันเอง
ผู้เรียนอ่านเอกสารเรื่อง strcmp แล้วเขียนโปรแกรมค้นหารหัสสมมติด้วยตนเอง การเรียนจากเอกสารเป็นกิจกรรมปกติ แต่เมื่ออธิบายแหล่งความรู้ควรระบุว่าศึกษาสัญญาฟังก์ชันจากที่ใด จุดที่ควรอธิบายได้คือเหตุใดตรวจผลเท่าศูนย์ และเหตุใดไม่ใช้ == เปรียบเทียบเนื้อหาสตริง
ถ้าคัดโค้ดตัวอย่างมาบางส่วน ต้องเปิดเผยส่วนที่นำมาใช้และตรวจเงื่อนไขการใช้ของแหล่งนั้น การเพิ่มชื่อแหล่งอ้างอิงไม่ได้เปลี่ยนโค้ดที่คัดมาให้เป็นงานที่คิดเองทั้งหมด และไม่ได้รับรองว่าโจทย์ประเมินอนุญาตให้คัดมาใช้
14.5.2 กรณีที่สอง: เปลี่ยนชื่อตัวแปรของคำตอบจากเพื่อน
ผู้เรียนได้รับคำตอบทั้งโปรแกรมแล้วเปลี่ยน sum เป็น total พร้อมจัดย่อหน้าใหม่ การเปลี่ยนผิวหน้าไม่ได้เปลี่ยนที่มาของวิธีแก้ ถ้าแบบฝึกหัดกำหนดให้ทำเอง การส่งโดยอ้างว่าเป็นงานตนเองยังไม่ตรงกับความจริง
แนวทางที่เหมาะคือหยุดก่อนส่ง เปิดเผยความช่วยเหลือที่ได้รับ และกลับไปอธิบายโจทย์กับเขียนส่วนที่ต้องทำเองตามข้ออนุญาตของผู้สอน ไม่พยายามทำให้เครื่องมือตรวจความคล้ายมองไม่เห็น เป้าหมายการเรียนคืออธิบายและพัฒนาวิธีแก้ได้ ไม่ใช่เพียงทำให้รูปร่างไฟล์ต่าง
14.5.3 กรณีที่สาม: ใช้ AI แล้วบอกว่าผ่านทุกการทดสอบ
หากเครื่องมือเสนอโปรแกรมและกล่าวว่า “ทดสอบแล้ว” ผู้ส่งยังต้องรันและตรวจในบริบทของตนเอง ไม่ควรอ้างผลที่ไม่มีหลักฐาน หากตนรันเพียงสองกรณี ให้บอกสองกรณีที่รันจริงและข้อจำกัดที่เหลือ ไม่แปลงคำกล่าวของเครื่องมือเป็นผลทดลองของตน
เมื่อรายวิชาอนุญาตให้ใช้ AI ควรบันทึกบทบาท เช่น ช่วยอธิบายข้อความคอมไพเลอร์ เสนอกรณีทดสอบ หรือเสนอร่างโค้ด พร้อมระบุสิ่งที่ตรวจและแก้เอง รูปแบบการเปิดเผยให้เป็นไปตามที่ผู้สอนกำหนด การเขียน disclosure ไม่ได้ทำให้การใช้ที่โจทย์ห้ามกลายเป็นอนุญาต
14.6 แยกสิทธิ์ใช้ผลงาน การอ้างอิง และข้ออนุญาตในการประเมิน
สามคำถามนี้เกี่ยวข้องกันแต่ไม่แทนกัน ประการแรกแหล่งผลงานอนุญาตให้นำมาใช้ภายใต้เงื่อนไขใด ประการที่สองผู้ส่งบอกที่มาและส่วนที่นำมาใช้ตรงหรือไม่ ประการที่สามงานประเมินนี้อนุญาตให้ใช้ความช่วยเหลือประเภทนั้นหรือไม่ หากตอบเพียงว่ามีลิงก์อ้างอิง ยังตอบอีกสองคำถามไม่ได้
| สถานการณ์สมมติ | สิ่งที่รู้แล้ว | สิ่งที่ต้องตรวจเพิ่ม |
|---|---|---|
| พบโค้ดสาธารณะไม่มีข้อมูลสิทธิ์ชัด | อ่านได้บนเว็บ | ไม่ถือว่าได้รับอนุญาตทุกการใช้ |
| มีใบอนุญาตให้ใช้และระบุที่มาแล้ว | มีข้อมูลเรื่องสิทธิ์และการอ้างอิง | ยังต้องตรวจเงื่อนไขของงานประเมิน |
| ผู้สอนอนุญาตให้ปรึกษาแนวคิด | แลกเปลี่ยนแนวคิดได้ตามขอบเขต | ไม่สรุปว่าแลกคำตอบทั้งไฟล์ได้ |
| ใช้เครื่องมือสร้างคำตอบบางส่วน | รู้ว่ามีความช่วยเหลือ | ต้องเปิดเผย ตรวจ และรับผิดชอบตามกติกา |
ตารางเป็นกรอบตั้งคำถาม ไม่ใช่คำวินิจฉัยข้อกฎหมายของใบอนุญาตใด หากเจอเงื่อนไขที่ตนไม่เข้าใจ ควรเลือกแหล่งที่มีเงื่อนไขชัดหรือขอคำแนะนำ ไม่แต่งชื่อผู้เขียน วันที่ หรือใบอนุญาตเพื่อทำรายการอ้างอิงให้ดูครบ
14.6.1 ตัวอย่างบันทึกความช่วยเหลือที่มีสาระ
ข้อความ “ใช้เว็บไซต์และ AI” ยังไม่บอกว่าใช้ตรงไหน ตัวอย่างที่ชัดขึ้นคือ “อ่านเอกสารฟังก์ชันรับสตริงจากคู่มือ ใช้เครื่องมือช่วยเสนอกรณีข้อความยาว และเขียนการตรวจขนาดเอง จากนั้นทดสอบชื่อว่าง ชื่อมีช่องว่าง และชื่อเกินความจุ” รายงานต้องเป็นสิ่งที่ทำจริง ไม่ใช้เป็นข้อความสำเร็จรูปโดยไม่ทำขั้นตอนเหล่านั้น
หากไม่ใช้เครื่องมือใด ก็ไม่ต้องเติมชื่อเครื่องมือเพื่อให้ดูมีการค้นคว้า และหากยังไม่ทดสอบกรณีใด ให้บอกว่ายังไม่ทดสอบ ความซื่อสัตย์รวมถึงการสื่อสารข้อจำกัดและความไม่แน่ใจอย่างตรงไปตรงมา ไม่ใช่เพียงไม่คัดลอกคำตอบ
14.7 ความเป็นส่วนตัว หลักฐาน และเวิร์กช็อปอภิปราย
14.7.1 อย่าเปลี่ยนข้อมูลผู้เรียนจริงเป็นข้อมูลตัวอย่างโดยพลการ
เมื่อขอความช่วยเหลือเรื่องโปรแกรมคะแนน ใช้ชื่อ Sample-A รหัส 0017 และคะแนนสมมติได้ ไม่จำเป็นต้องส่งรายชื่อนักศึกษาจริงทั้งห้องให้บริการภายนอก การลบชื่อแต่เหลือรหัสที่เชื่อมกลับได้อาจยังไม่ตัดความเสี่ยง ควรลดข้อมูลให้เหลือสิ่งที่ต้องใช้ทำซ้ำปัญหา
ภาพหน้าจอก่อนส่งควรตรวจว่ามีอีเมล โทเคน รหัสผ่าน หรือข้อมูลคนอื่นติดมาหรือไม่ หากพบให้สร้างข้อมูลจำลองและจับภาพใหม่ ไม่แก้ภาพให้แสดงผลการทดสอบที่ไม่เคยเกิด การปกปิดข้อมูลส่วนบุคคลกับการแต่งหลักฐานเป็นคนละเรื่องและต้องรักษาความจริงของผลไว้
14.7.2 เวิร์กช็อปสี่บทบาท
ให้ผู้เรียนผลัดกันเป็นผู้พัฒนา ผู้ตรวจงาน ผู้ให้ความช่วยเหลือ และผู้รับผลกระทบ ใช้สามกรณีข้างต้นตั้งคำถามว่า ข้อเท็จจริงที่รู้คืออะไร ข้อมูลใดยังขาด ใครต้องรับผิดชอบส่วนใด และก่อนส่งควรทำอะไรเพิ่ม หลีกเลี่ยงการตัดสินจากความคล้ายเพียงตัวชี้วัดเดียวโดยยังไม่รับฟังคำอธิบายและหลักฐานตามกระบวนการของรายวิชา
ต่อด้วยงานเขียนบันทึกที่มาของตัวอย่างค้นหารหัส ระบุเอกสารที่อ่าน ส่วนที่เขียนเอง ความช่วยเหลือที่ใช้ และกรณีที่รันจริง แล้วให้เพื่อนตรวจว่ารายงานแยกข้อเท็จจริงกับคำกล่าวอ้างได้หรือไม่ หากเขียนว่า “รองรับข้อมูลทุกแบบ” ให้ถามว่ามีหลักฐานใดรองรับและควรแก้เป็นข้อความที่ตรงขอบเขตอย่างไร
งานสุดท้ายให้เลือกโค้ดของตนหนึ่งฟังก์ชัน อธิบายข้อมูลเข้า ขอบเขต ผลคืน และเหตุผลของกรณีทดสอบโดยไม่อ่านคำตอบสำเร็จรูป หากยังอธิบายไม่ได้ ให้ใช้จุดนั้นวางแผนเรียนเพิ่ม การยอมรับช่องว่างความเข้าใจพร้อมแก้ไขเป็นพฤติกรรมการเรียนรู้ที่ควรฝึกก่อนโครงงานบูรณาการ
ใบงาน 5: สร้างข้อมูลจำลองก่อนขอความช่วยเหลือ
สมมติต้องขอให้ช่วยหาบั๊กการค้นหารหัส ใช้รายการที่สร้างขึ้นใหม่ เช่น SAMPLE-A และ SAMPLE-B กับค่าทดลอง ไม่คัดข้อมูลผู้เรียนจริงมาเปลี่ยนแค่ชื่อ แล้วถือว่ากลายเป็นข้อมูลจำลองทันที
| สิ่งที่เตรียมส่ง | จำเป็นต่อการทำซ้ำหรือไม่ | ข้อมูลจำลองที่ใช้แทน | สิ่งที่ตรวจในภาพหรือไฟล์ |
|---|---|---|---|
| ชื่อและรหัสจริง | |||
| อีเมลหรือข้อความสนทนา | |||
| ข้อความ error ที่เกี่ยวข้อง | |||
| ซอร์สส่วนที่ทำให้เกิดปัญหา | |||
| รหัสผ่านหรือโทเคน |
อธิบายว่าทำไมข้อมูลจำลองยังทำให้เกิดบั๊กเดียวกัน แล้วจับภาพผลทดลองใหม่ตามที่เกิดจริง อย่าแก้ข้อความผลลัพธ์ในภาพเพื่อให้ดูผ่าน การตัดข้อมูลที่ไม่จำเป็นออกกับการแต่งผลทดสอบเป็นคนละเรื่อง
ACM ข้อ 1.6 กล่าวถึงการคุ้มครองความเป็นส่วนตัวและลดโอกาสระบุตัวกลับ ใช้เป็นกรอบให้เลือกข้อมูลที่จำเป็น ไม่ใช้ข้อสรุปว่าเปลี่ยนชื่อแล้วหมดความเสี่ยงเสมอ
14.8 ตัวอย่างเปรียบเทียบ: รายงานความก้าวหน้าที่ตรงหลักฐาน
ทีมสมมติพัฒนาโปรแกรมค้นหารหัสและรันผ่านกรณีพบข้อมูลแล้ว แต่ยังไม่ทดสอบชุดว่าง ข้อความว่า “ระบบค้นหาทำงานครบแล้ว” ทำให้ผู้รับเข้าใจว่ากรณีสำคัญผ่านทั้งหมด ข้อความที่ตรงกว่าคือ “ทดสอบการพบรหัสในชุดสามรายการแล้ว ยังต้องตรวจกรณีไม่พบและชุดว่าง” ซึ่งบอกทั้งความก้าวหน้าและสิ่งที่ค้าง
ความซื่อสัตย์ไม่ได้หมายความว่าต้องทำงานได้สมบูรณ์ทุกครั้ง แต่ต้องไม่ซ่อนข้อจำกัดสำคัญของสิ่งที่ส่ง หากพบว่าผลรายงานสลับชื่อกับคะแนน ต้องแจ้งและแก้ก่อนใช้ประเมิน ไม่จัดหน้ารายงานให้ดูเรียบร้อยเพื่อกลบปัญหาข้อมูล
อีกกรณีผู้ช่วยเสนอให้ตัดข้อมูลจริงบางแถวออกเพื่อให้ค่าเฉลี่ยตรงกับตัวอย่าง การแก้ข้อมูลให้เข้ากับคำตอบที่ต้องการไม่ใช่การดีบัก ต้องตรวจว่าข้อกำหนด ข้อมูล หรือสูตรส่วนใดผิดตามหลักฐาน หากใช้ข้อมูลสมมติเพื่อทำซ้ำปัญหา ต้องระบุว่าเป็นข้อมูลสมมติ ไม่อ้างว่าเป็นผลจากการใช้งานจริง
| ข้อความที่คลุมเครือ | สิ่งที่ควรเปิดเผยเพิ่ม |
|---|---|
| ทดสอบหมดแล้ว | ทดสอบกรณีใด ด้วยเวอร์ชันใด และเหลืออะไร |
| เขียนเอง | ส่วนใดเขียนเองและใช้ความช่วยเหลือใดตามที่อนุญาต |
| ไม่มีข้อมูลส่วนบุคคล | ใช้ข้อมูลจำลองจริงหรือยังเหลือตัวระบุที่เชื่อมกลับได้ |
| ใช้โค้ดเปิดได้ | แหล่งใด มีเงื่อนไขใด และงานนี้อนุญาตหรือไม่ |
การอภิปรายควรแยกการตั้งข้อสงสัยออกจากข้อสรุปเรื่องตัวบุคคล การพบโค้ดคล้ายกันเป็นข้อมูลให้ตรวจต่อ ไม่ใช่ใบอนุญาตเผยแพร่ชื่อหรือตัดสินลงโทษนอกกระบวนการของรายวิชา บทนี้ฝึกพิจารณาหลักฐานและความรับผิดชอบ โดยไม่สร้างบทลงโทษใหม่
ให้ผู้เรียนเขียนรายงานสถานะของงานตนจากสิ่งที่ทำจริงหนึ่งย่อหน้า ระบุสิ่งที่สำเร็จ กรณีที่ยืนยันแล้ว ข้อจำกัด และขั้นถัดไป จากนั้นตรวจว่าทุกคำกล่าวอ้างมีหลักฐานหรือระบุความไม่แน่ใจอย่างตรงไปตรงมา ทักษะนี้ใช้กับการส่งมอบโครงงานและการทำงานวิชาชีพต่อไป
ใบงาน 6: เปลี่ยนคำกล่าวอ้างให้ตรงหลักฐาน
เปรียบเทียบถ้อยคำกับสิ่งที่มีจริง ถ้าข้อมูลไม่พอให้ลดขอบเขตคำกล่าวอ้างหรือบอกสิ่งที่ยังต้องตรวจ ไม่สร้างผลรัน บทสนทนา แหล่งอ้างอิง หรือภาพหน้าจอขึ้นย้อนหลังเพื่อให้เอกสารดูครบ
| ข้อความตั้งต้น | หลักฐานที่มีจริง | ข้อความที่ตนเขียนใหม่ | สิ่งที่ยังต้องทำ |
|---|---|---|---|
| รองรับทุกภาษา | ตรวจ Education และ AEIOU | ||
| ทดสอบหมดแล้ว | รันสองกรณีในเครื่องเดียว | ||
| ไม่ใช้ความช่วยเหลือ | รับข้อเสนอกรณีทดสอบจาก AI | ||
| เป็นงานตนทั้งหมด | ดัดแปลงโค้ดตัวอย่างบางส่วน | ||
| ไม่มีปัญหาแล้ว | คอมไพล์ผ่าน แต่ยังไม่รัน |
ทำบันทึกสั้นโดยมีสี่ส่วน: งานฉบับใด สิ่งที่ยืนยันแล้ว ข้อจำกัด และขั้นถัดไป ผู้ตรวจควรตามจากคำกล่าวอ้างไปยังซอร์สหรือผลจริงได้ โดยไม่ต้องเดาว่ารายงานหมายถึงไฟล์ใด
14.9 อ่านโค้ดที่ผิดและทำความเข้าใจข้อความวินิจฉัย
ตัวอย่างต่อไปนี้เป็นโค้ดฝึกแยกจากงานที่ต้องส่ง แสดงข้อผิดพลาดที่สัมพันธ์กับเนื้อหาบท พร้อมข้อความวินิจฉัยจริง วิธีอ่าน และฉบับแก้ คำว่า diagnostic ใช้รวมข้อความ error, warning และ note จึงไม่ควรเรียกทุกบรรทัดว่า error หรือถือว่าการไม่มี error แปลว่าโปรแกรมถูกตามโจทย์
ที่มาของ log: ผู้เขียนทดสอบด้วย GCC 11.4.0 บน Ubuntu ผ่าน Linux environment เมื่อ 24 ตุลาคม 2569 ใช้ C11 และตัวเลือกดังนี้ ชื่อไฟล์ เลขบรรทัด คอลัมน์ ถ้อยคำ และคำเตือนที่เปิดใช้อาจต่างจากแพลตฟอร์มการเรียน นักศึกษาไม่จำเป็นต้องเปลี่ยนเครื่องมือหรือการติดตั้งตามชุดทดสอบของผู้เขียน
-std=c11 -O0 -Wall -Wextra -Wpedantic -Wformat=2 -fdiagnostics-color=never -fmessage-length=0ข้อความรูปแบบ bad.c:5:17 อ่านว่าไฟล์ bad.c บรรทัด 5 คอลัมน์ 17 ส่วน ^ และ ~ ช่วยชี้บริเวณที่ตรวจพบ จุดนี้อาจเป็นปลายเหตุจากบรรทัดก่อนหน้า error ทำให้การสร้างโปรแกรมล้มในกรณีนั้น warning เตือนความเสี่ยงแม้คำสั่งสร้างอาจจบสำเร็จ และ note ให้บริบท เช่น declaration เดิม ต้องอ่านคู่กัน (GCC: Diagnostics)
ตัวอย่างที่ผิด 1: คัดลอกจุดเรียกแต่ไม่มีฟังก์ชันที่อ้างถึง
ประเภท: ข้อผิดพลาดขณะเชื่อมโยงโปรแกรม
ตัวอย่างจำลองสถานการณ์นำจุดเรียกจากแหล่งช่วยเหลือมาใช้โดยยังไม่ตรวจ implementation prototype ที่มีอยู่ไม่ได้ทำให้ฟังก์ชันนับสระเกิดขึ้น และการเขียนชื่อแหล่งอ้างอิงไม่ทำให้โค้ดเชื่อมโยงสำเร็จ ต้องตรวจทั้งความครบของโปรแกรมและการอ้างอิงจริง
โค้ดที่ผิด — ไม่ใช้แทนฉบับแก้
#include <stdio.h>
int count_vowels(const char text[]);
int main(void)
{
printf("vowels=%d\n", count_vowels("AEIOU"));
return 0;
}คำสั่งสร้างและข้อความที่ได้จริง
gcc -std=c11 -O0 -Wall -Wextra -Wpedantic -Wformat=2 -fdiagnostics-color=never -fmessage-length=0 bad.c -o bad/usr/bin/ld: /tmp/cczGNfQY.o: in function `main':
bad.c:(.text+0x13): undefined reference to `count_vowels'
collect2: error: ld returned 1 exit statusสถานะจบของคำสั่งสร้างที่ตัวเก็บผลอ่านได้: 1 คำสั่งล้มและไม่ได้รัน executable ของตัวอย่างนี้ การรันไฟล์เก่าที่อาจค้างจาก build ครั้งก่อนจะไม่ใช่หลักฐานของโค้ดปัจจุบัน
อ่านข้อความว่าแจ้งอะไรและผิดอย่างไร
undefined reference to count_vowels หมายถึงยังไม่มีนิยามที่ linker ใช้งานได้ ไม่ได้พิสูจน์ว่าเกิดการทุจริตหรือว่าโค้ดมาจากแหล่งใด ข้อสรุปด้านความซื่อสัตย์ต้องอิงหลักฐานการทำงานและนโยบายจริงแยกจาก diagnostic ทางเทคนิค
โค้ดที่แก้แล้ว
#include <stdio.h>
int count_vowels(const char text[])
{
int count = 0;
for (int i = 0; text[i] != '\0'; ++i) {
char ch = text[i];
if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U') {
++count;
}
}
return count;
}
int main(void)
{
printf("vowels=%d\n", count_vowels("AEIOU"));
return 0;
}เหตุผลของการแก้และสิ่งที่ต้องตรวจซ้ำ
เพิ่ม implementation ที่เข้าใจและอธิบายได้ ทดสอบกรณีตัวพิมพ์ใหญ่ เล็ก ไม่มีสระ และข้อความว่าง พร้อมระบุแหล่งและบทบาทความช่วยเหลือที่ใช้จริง ไม่แต่งแหล่งอ้างอิงหรืออ้างว่าทดสอบผ่านโดยยังไม่ได้รัน
ผลตรวจฉบับแก้จริง: คอมไพล์ด้วยตัวเลือกเดิมและเพิ่ม -Werror เพื่อให้ชุดทดสอบผู้เขียนไม่ยอมรับ warning ไม่มีข้อความวินิจฉัยและคำสั่งสร้างจบด้วยสถานะ 0 จากนั้นรันได้ stdout ดังนี้ และ stderr ว่าง
vowels=5ตัวอย่างที่ผิด 2: อ้างว่าทดสอบครบแต่กรณีตัวพิมพ์ใหญ่ยังล้ม
ประเภท: ข้อผิดพลาดที่ชุดทดสอบรายงาน
compiler ยอมรับฟังก์ชันที่นับเฉพาะสระตัวพิมพ์เล็ก แต่ข้อกำหนดตัวอย่างรับทั้งสองแบบ test ด้วย AEIOU จึงเปิดเผยส่วนที่ยังขาด ถ้าเคยทดลองเพียง aeiou จะยังไม่มีหลักฐานของ uppercase
โค้ดที่ผิด — ไม่ใช้แทนฉบับแก้
#include <stdio.h>
int count_vowels(const char text[])
{
int count = 0;
for (int i = 0; text[i] != '\0'; ++i) {
char ch = text[i];
if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') ++count;
}
return count;
}
int main(void)
{
int actual = count_vowels("AEIOU");
printf("%s expected=5 actual=%d\n", actual == 5 ? "PASS" : "FAIL", actual);
return actual == 5 ? 0 : 1;
}คำสั่งสร้างและข้อความที่ได้จริง
gcc -std=c11 -O0 -Wall -Wextra -Wpedantic -Wformat=2 -fdiagnostics-color=never -fmessage-length=0 bad.c -o badไม่มีข้อความวินิจฉัยจาก compiler ในการทดลองนี้ ทั้ง stdout และ stderr ว่าง การไม่มีข้อความเป็นผลที่สังเกต ไม่ใช่การรับรองความถูกต้องของโปรแกรม
สถานะจบของคำสั่งสร้างที่ตัวเก็บผลอ่านได้: 0 ขั้นสร้างสำเร็จ จากนั้นจึงตรวจพฤติกรรมขณะรันหรือใช้ชุดทดสอบตามประเภทข้างต้น
ผลจากการรันฉบับผิด
stdout:
FAIL expected=5 actual=0stderr ว่าง ไม่มี runtime diagnostic จากระบบในการทดลองนี้ ต้องใช้การเทียบผลกับข้อกำหนดเป็นหลักฐาน
สถานะจบที่ตัวเก็บผลอ่านได้: 1
ผลตามข้อกำหนดที่ใช้เทียบ:
PASS expected=5 actual=5อ่านข้อความว่าแจ้งอะไรและผิดอย่างไร
FAIL expected=5 actual=0 เป็นข้อความที่ชุดทดสอบในโค้ดพิมพ์ ไม่ใช่ข้อความ compiler expected คือผลตามข้อกำหนด actual คือค่าจากฟังก์ชัน การออกด้วยสถานะ 1 ทำให้ระบบทดสอบแยกความล้มเหลวได้ ไม่ใช้เพียงการมองว่ามีข้อความบนหน้าจอ
โค้ดที่แก้แล้ว
#include <stdio.h>
int count_vowels(const char text[])
{
int count = 0;
for (int i = 0; text[i] != '\0'; ++i) {
char ch = text[i];
if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U') ++count;
}
return count;
}
int main(void)
{
int actual = count_vowels("AEIOU");
printf("%s expected=5 actual=%d\n", actual == 5 ? "PASS" : "FAIL", actual);
return actual == 5 ? 0 : 1;
}เหตุผลของการแก้และสิ่งที่ต้องตรวจซ้ำ
เพิ่มเงื่อนไข uppercase แล้วรัน test เดิมโดยไม่เปลี่ยน expected การรายงานความก้าวหน้าต้องระบุกรณีที่ลองจริงและข้อจำกัด ไม่สรุปว่าระบบถูกทั้งหมดจาก test เดียวและไม่ลบกรณีล้มเพื่อทำให้รายงานดูผ่าน
ผลตรวจฉบับแก้จริง: คอมไพล์ด้วยตัวเลือกเดิมและเพิ่ม -Werror เพื่อให้ชุดทดสอบผู้เขียนไม่ยอมรับ warning ไม่มีข้อความวินิจฉัยและคำสั่งสร้างจบด้วยสถานะ 0 จากนั้นรันได้ stdout ดังนี้ และ stderr ว่าง
PASS expected=5 actual=5ลำดับการอ่าน log เมื่อลองโปรแกรมของบทนี้
- ระบุว่าเกิดในขั้น compile, link, run หรือ test และแยกข้อความจากระบบออกจากข้อความที่โปรแกรมพิมพ์เอง
- อ่าน diagnostic แรกกับบริบทบรรทัดก่อนหน้า แล้วใช้ note เพื่อเทียบ declaration หรือชนิดข้อมูล อย่าแก้ทุกข้อความตามลำดับโดยไม่หาสาเหตุร่วม
- แก้ทีละสาเหตุ สร้างโปรแกรมใหม่ และตรวจว่ากำลังรันผล build ใหม่ การเติมวงเล็บ ปิด warning หรือลบ test อาจทำให้ log เงียบโดยยังผิดโจทย์
- ใช้ข้อมูลเดิมที่ทำให้ผิดทดสอบซ้ำ แล้วเพิ่มกรณีขอบเขตที่สัมพันธ์กับบท การรันจบสถานะศูนย์เพียงครั้งเดียวไม่แทนการตรวจข้อกำหนดครบถ้วน
ความหมายตามภาษาอ้างจากร่างมาตรฐาน C11 โดยข้อความ diagnostic เฉพาะถ้อยคำเป็นของเครื่องมือที่ใช้ ไม่ได้กำหนดให้ compiler ทุกตัวพิมพ์เหมือนกัน (WG14 N1570, GCC: Warning Options)
ปฏิบัติการที่ 14 จริยธรรมทางวิชาการและความซื่อสัตย์ในการพัฒนาโค้ด
ปฏิบัติการนี้แบ่งเป็นสองส่วน ส่วนแรกฝึกพัฒนาโปรแกรมด้วยความเข้าใจของตนเอง โดยศึกษาแนวทางการวนอักขระในสตริงจากบทที่ 8 แล้วเขียนโปรแกรมนับสระขึ้นใหม่พร้อมคอมเมนต์ระบุแหล่งที่ศึกษา ส่วนที่สองเป็นกิจกรรมวิเคราะห์สถานการณ์จริยธรรมที่ไม่ต้องรันโค้ด เพื่อฝึกจำแนกการกระทำที่เหมาะสมหรือไม่เหมาะสมพร้อมให้เหตุผล ทั้งสองส่วนทำแยกกันได้ แต่ควรทำตามลำดับเพื่อให้เห็นทั้งการปฏิบัติที่ซื่อสัตย์และการตัดสินสถานการณ์ด้วยหลักเดียวกัน
ไฟล์ซอร์สโค้ดในปฏิบัติการนี้ให้ตั้งชื่อเป็นภาษาอังกฤษแบบ snake_case และบันทึกไว้ในโฟลเดอร์ของผู้เรียนเอง คำสั่งคอมไพล์ในเอกสารนี้ทดสอบด้วย gcc 13.3.0
Lab A: ศึกษาแล้วเขียนใหม่ด้วยความเข้าใจ
สถานการณ์ ต้องการพัฒนาโปรแกรมนับจำนวนสระภาษาอังกฤษในข้อความ โดยศึกษาหลักการวนอักขระในสตริงจากบทที่ 8 ก่อน แล้วเขียนโปรแกรมขึ้นใหม่ด้วยความเข้าใจของตนเอง พร้อมใส่คอมเมนต์ระบุแนวทางและแหล่งที่ศึกษา เพื่อฝึกการพัฒนาที่ซื่อสัตย์และการอ้างอิงอย่างโปร่งใส
เป้าหมาย ฝึก LLO14.2 และ LLO14.3 คือพัฒนาโค้ดด้วยความเข้าใจของตนเองพร้อมอธิบายการทำงาน และระบุแหล่งที่ศึกษาในคอมเมนต์อย่างโปร่งใส
ขั้นปฏิบัติ
- ศึกษาหลักการวนอักขระในสตริงจากบทที่ 8 คือการวนจากอักขระแรกจนพบอักขระปิดท้ายสตริง
'\0'เพื่อให้เข้าใจแนวทางก่อนเขียน - สร้างไฟล์ชื่อ
ch14_vowels.cด้วยโปรแกรมแก้ไขข้อความหรือ IDE แล้วเขียนโปรแกรมด้วยคำและโครงสร้างของตนเอง โดยจัดย่อหน้า 4 ช่องว่างและใส่คอมเมนต์ส่วนหัวที่ระบุแหล่งที่ศึกษา
/*
* ch14_vowels.c : นับสระภาษาอังกฤษในข้อความ
* แนวทาง: ศึกษาหลักการตรวจอักขระจากบทที่ 8 (การวนอักขระในสตริง)
* ตัวอย่างของบทเรียน ผู้เรียนต้องบันทึกแหล่งและบทบาทที่ใช้จริง
*/
#include <stdio.h>
int count_vowels(const char text[]) {
int count = 0;
for (int i = 0; text[i] != '\0'; i++) {
char ch = text[i];
if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U') {
count++;
}
}
return count;
}
int main(void) {
char message[] = "Education";
printf("ข้อความ: %s\n", message);
printf("จำนวนสระ: %d\n", count_vowels(message));
return 0;
}- คอมไพล์และรันด้วยคำสั่ง
gcc -std=c11 -Wall ch14_vowels.c -o ch14_vowels
./ch14_vowelsผลที่บันทึกในตัวอย่างเดิม (ชุดสอนฉบับนี้ตรวจซ้ำด้วย GCC ตามตาราง)
ข้อความ: Education
จำนวนสระ: 5ฟังก์ชัน count_vowels วนอักขระในสตริงตามหลักการจากบทที่ 8 โดยวนจากดัชนีแรกจนพบอักขระปิดท้ายสตริง '\0' แต่ละรอบจะนำอักขระมาเทียบกับสระทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ด้วยเงื่อนไข if หากตรงกับสระตัวใดจะเพิ่มตัวนับ count เมื่อข้อความคือ "Education" ซึ่งมีสระคือ E, u, a, i, o รวมห้าตัว โปรแกรมจึงรายงานจำนวนสระเท่ากับ 5 คอมเมนต์ส่วนหัวระบุว่าศึกษาแนวทางจากบทที่ 8 ซึ่งเป็นการอ้างอิงแหล่งที่ศึกษาอย่างโปร่งใส
ตัดสินใจเอง A.1 ดัดแปลงโปรแกรมให้รับข้อความของตนเอง แล้วอธิบายการทำงานของแต่ละส่วนด้วยคำของตนเองในคอมเมนต์ พร้อมคงคอมเมนต์ส่วนหัวที่ระบุแหล่งที่ศึกษา เพื่อยืนยันว่าพัฒนาและเข้าใจโค้ดด้วยตนเอง
ผลลัพธ์ที่คาดหวัง A.1 โปรแกรมคอมไพล์ผ่านไม่มีการแจ้งเตือนและรายงานจำนวนสระของข้อความที่เลือกได้ถูกต้อง พร้อมคอมเมนต์ที่อธิบายการทำงานได้เอง (ผลที่คาดว่าจะเห็นสำหรับข้อความที่ผู้เรียนเลือกเอง ยังไม่ได้ทดสอบในเอกสารนี้ เพราะขึ้นกับข้อความของแต่ละคน)
จุดตรวจ A โปรแกรมคอมไพล์ผ่านไม่มีการแจ้งเตือนและรันได้ผลถูก ผู้พัฒนาอธิบายการทำงานของโค้ดได้ทุกบรรทัด มีคอมเมนต์ส่วนหัวระบุแหล่งที่ศึกษา และโค้ดมีการจัดย่อหน้าตามมาตรฐาน
ปัญหาที่พบบ่อย
| อาการ | สาเหตุ | วิธีแก้ |
|---|---|---|
| อธิบายการทำงานของโค้ดบางส่วนไม่ได้ | ยังไม่เข้าใจขั้นตอนหรือข้อตกลงของโค้ดเพียงพอ | ระบุจุดที่ยังไม่เข้าใจและกลับไปศึกษาหลักการทีละส่วน ไม่สรุปที่มาจากอาการเดียว |
| ไม่ได้ระบุแหล่งที่ศึกษาในคอมเมนต์ | ลืมบันทึกแนวทางหรือแหล่งที่ใช้ | เพิ่มคอมเมนต์ส่วนหัวระบุว่าศึกษาแนวทางจากบทหรือเอกสารใด |
| นับสระพลาดเมื่อเป็นตัวพิมพ์ใหญ่ | เทียบเฉพาะสระตัวพิมพ์เล็ก | เพิ่มเงื่อนไขเทียบสระตัวพิมพ์ใหญ่ให้ครบ |
เปิดหลังผู้เรียนพัฒนาด้วยตนเองแล้ว
Lab B: วิเคราะห์สถานการณ์จริยธรรม
สถานการณ์ พิจารณาชุดสถานการณ์เกี่ยวกับการใช้โค้ดจากเพื่อน จากเว็บ และจากเครื่องมือช่วย แล้วตัดสินว่าการกระทำแต่ละกรณีเหมาะสมหรือไม่เหมาะสมด้านความซื่อสัตย์ พร้อมให้เหตุผลและแนวทางที่ถูกต้อง กิจกรรมนี้เป็นการวิเคราะห์และอภิปราย ไม่ต้องรันโค้ด
เป้าหมาย ฝึก LLO14.1 และ LLO14.3 คือจำแนกการคัดลอกที่เหมาะสมหรือไม่เหมาะสมพร้อมเหตุผล และเข้าใจการอ้างอิงแหล่งที่มาและการใช้เครื่องมือช่วยอย่างโปร่งใส
ขั้นปฏิบัติ
- อ่านสถานการณ์ต่อไปนี้ทีละกรณี
- สถานการณ์ที่ 1: นำไฟล์โค้ดของเพื่อนมาส่งเป็นงานของตน โดยเปลี่ยนเพียงชื่อตัวแปร และอธิบายการทำงานไม่ได้
- สถานการณ์ที่ 2: ศึกษาตัวอย่างแนวทางจากเว็บ แล้วเขียนโปรแกรมขึ้นใหม่ด้วยความเข้าใจของตนเอง พร้อมใส่คอมเมนต์ระบุแหล่งที่ศึกษา
- สถานการณ์ที่ 3: ใช้เครื่องมือ AI ช่วยร่างโครงโปรแกรม แล้วนำมาตรวจสอบ ทำความเข้าใจทุกบรรทัด และแจ้งการใช้เครื่องมือในเอกสารประกอบตามนโยบายของหลักสูตร
- สถานการณ์ที่ 4: สมาชิกกลุ่มศึกษาร่วมกันอภิปรายแนวทางแก้โจทย์ แล้วต่างคนต่างเขียนโปรแกรมของตนเองด้วยความเข้าใจ
- พิจารณาข้ออนุญาตของงานร่วมกับแต่ละสถานการณ์ แล้วตัดสินพร้อมเหตุผล หากข้อมูลไม่พอให้ระบุสิ่งที่ต้องตรวจเพิ่มก่อนสรุป
- ให้เหตุผลประกอบการตัดสิน และเสนอแนวทางที่ถูกต้องสำหรับสถานการณ์ที่ไม่เหมาะสม
ตัดสินใจเอง B.1 ยกสถานการณ์จากประสบการณ์การเรียนหรือการทำงานของตนเองมาหนึ่งกรณีที่เกี่ยวข้องกับความซื่อสัตย์ในการพัฒนาโค้ด แล้วอธิบายว่าการกระทำนั้นเหมาะสมหรือไม่ พร้อมเสนอแนวปฏิบัติที่ซื่อสัตย์
ผลลัพธ์ที่คาดหวัง B.1 ได้สถานการณ์หนึ่งกรณีพร้อมการจำแนกที่สอดคล้องกับหลักความซื่อสัตย์ และแนวปฏิบัติที่ถูกต้อง (ผลที่คาดว่าจะเห็นสำหรับสถานการณ์ที่ผู้เรียนยกเอง ยังไม่มีเฉลยตายตัว เพราะขึ้นกับประสบการณ์ของแต่ละคน ผู้สอนประเมินจากความสมเหตุสมผลของเหตุผล)
จุดตรวจ B จำแนกแต่ละสถานการณ์ได้ถูกต้อง ให้เหตุผลที่สอดคล้องกับหลักความซื่อสัตย์ และเสนอแนวทางที่ถูกต้องสำหรับกรณีที่ไม่เหมาะสม
ปัญหาที่พบบ่อย
| อาการ | สาเหตุ | วิธีแก้ |
|---|---|---|
| เข้าใจว่าการอ้างอิงทำให้คัดลอกได้ทุกกรณี | สับสนระหว่างการแสดงที่มากับการนำผลงานสำเร็จมาแอบอ้าง | ย้ำว่าผลงานต้องสะท้อนความเข้าใจของผู้ส่งเสมอ การอ้างอิงเป็นการแสดงที่มา ไม่ใช่ใบอนุญาตคัดลอก |
| สับสนระหว่างการร่วมมือกับการคัดลอก | แยกไม่ออกระหว่างการอภิปรายแนวทางกับการส่งไฟล์เดียวกัน | ให้แต่ละคนพัฒนาและอธิบายผลงานของตนเองได้ แม้ได้อภิปรายแนวทางร่วมกัน |
| ตัดสินถูกแต่ให้เหตุผลไม่ได้ | จำข้อสรุปโดยไม่เข้าใจหลัก | เชื่อมเหตุผลกลับไปที่หลักความซื่อสัตย์และความเข้าใจของผู้ส่ง |
เปิดหลังผู้เรียนวิเคราะห์ด้วยตนเองแล้ว
ใบงานขยาย Lab B: ตรวจเหตุผลและแก้ไขอย่างโปร่งใส
ใช้บัตรสถานการณ์ A–F เขียนข้อเท็จจริง ข้ออนุญาตที่รู้ สิ่งที่ยังต้องตรวจ และทางเลือกก่อนส่ง อย่าสร้างบทลงโทษหรือข้อกล่าวหาต่อบุคคลจริงจากกิจกรรมนี้
| กรณี | ข้อเท็จจริง | ข้อกำหนดที่อ้างได้ | ข้อมูลที่ยังขาด | แนวทางก่อนส่ง |
|---|---|---|---|---|
| A หรือ B | ||||
| C หรือ D | ||||
| E หรือ F |
ถ้าพบว่าตนส่งคำอธิบายที่มาหรือผลตรวจไม่ตรง ให้เก็บฉบับเดิมไว้ตามช่องทางที่รายวิชากำหนด แจ้งส่วนที่คลาดเคลื่อน แก้รายงาน และขอแนวทางผู้สอน ไม่เสนอให้ซ่อนหรือลบหลักฐานเพื่อให้ตรวจไม่พบ
ให้เพื่อนตรวจเหตุผลแทนการตรวจแค่คำว่าเหมาะสมหรือไม่เหมาะสม หากยังไม่ทราบนโยบาย ให้ระบุเงื่อนไขที่ทำให้ข้อสรุปเปลี่ยน การอธิบายสิ่งที่ไม่รู้ตรง ๆ มีสาระกว่าการเดาว่าทุกกรณีได้รับอนุญาต
ใบงานปิดบท: ชุดหลักฐานของงานที่ส่ง
รวบรวมซอร์สที่อธิบายได้ ผลที่รันจริง บันทึกแหล่งที่มาและเครื่องมือที่ใช้ และเอกสารวิเคราะห์ Lab B ตามงานข้อ 1–3 เดิม ไม่ต้องส่งบทสนทนาส่วนตัวทั้งหมดหรือเผยแพร่งานสู่สาธารณะเพื่อพิสูจน์ความซื่อสัตย์
| หลักฐาน | ไฟล์หรือส่วนที่อยู่ | ตรงกับฉบับส่งหรือไม่ | สิ่งที่ยังค้าง |
|---|---|---|---|
| โปรแกรมและคำอธิบาย Lab A | |||
| ผลรันและกรณีตรวจ | |||
| ที่มาและบทบาทความช่วยเหลือ | |||
| การวิเคราะห์ Lab B |
ตรวจออกจากบทหกข้อ: อ้างอิงแทนข้ออนุญาตได้หรือไม่, อ่านคู่มือกับนำคำตอบมาส่งต่างกันอย่างไร, รายงานบทบาท AI อย่างไร, หลักฐานใดยืนยันผลตรวจ, ทำไมเปลี่ยนชื่อไม่พอให้เป็นข้อมูลจำลอง และควรทำอย่างไรเมื่อพบรายงานคลาดเคลื่อน
นำบันทึกที่มา ขอบเขต และผลตรวจไปใช้กับ บทที่ 15 โครงงานบูรณาการ โดยคง LLO และใช้แผนคะแนนแบบถ่วงน้ำหนักตามมติ 30 ต.ค. 2569
เก็บกวาด
เมื่อจบปฏิบัติการ ให้ลบไฟล์ปฏิบัติการที่สร้างจากการคอมไพล์ (เช่น ch14_vowels) และเก็บเฉพาะไฟล์ซอร์สโค้ด .c พร้อมเอกสารวิเคราะห์สถานการณ์ไว้ เพื่อให้โฟลเดอร์งานสะอาดและมีเฉพาะสิ่งที่ต้องส่ง
สรุป
บทนี้อธิบายหลักจริยธรรมทางวิชาการและความซื่อสัตย์ในการพัฒนาโค้ด เริ่มจากความหมายของความซื่อสัตย์ว่าคือการไม่นำผลงานของผู้อื่นมาเป็นของตนและการให้เครดิตแก่แหล่งที่มา พร้อมจำแนกการคัดลอกที่ไม่เหมาะสมออกจากการศึกษาแนวทางแล้วพัฒนาเป็นโค้ดของตนเอง ต่อด้วยการพัฒนาโค้ดด้วยความเข้าใจของตนเองสามขั้น คือศึกษาแนวทาง เขียนใหม่ด้วยคำของตน และอธิบายการทำงานได้ทุกบรรทัด ซึ่งช่วยให้แก้ไข ต่อยอด และรับผิดชอบผลงานได้จริง จากนั้นคือการอ้างอิงแหล่งที่มาและการแจ้งการใช้เครื่องมือช่วย ทั้งเว็บ ตัวอย่างโค้ด และเครื่องมือ AI อย่างโปร่งใส และปิดท้ายด้วยกรณีศึกษาและแนวปฏิบัติสำหรับงานเดี่ยวและงานกลุ่ม ปฏิบัติการในบทนี้ให้พัฒนาโปรแกรมนับสระด้วยความเข้าใจพร้อมอ้างอิง และวิเคราะห์สถานการณ์จริยธรรม หลักเหล่านี้ตอบ CLO4 โดยตรงและเป็นพื้นฐานของการส่งมอบผลงานอย่างซื่อสัตย์ในบทถัดไป
สิ่งที่ส่งต่อไปยังบทถัดไป
| สิ่งที่ส่งต่อ | ค่า/รูปแบบ | ใช้ในบท |
|---|---|---|
| หลักจริยธรรมทางวิชาการและการจำแนกการคัดลอกที่ไม่เหมาะสม | ผลงานต้องสะท้อนความเข้าใจของผู้ส่งและให้เครดิตแหล่งที่มา | บท 15 (โครงงานบูรณาการ) |
| การพัฒนาโค้ดด้วยความเข้าใจของตนเอง | ศึกษาแนวทาง เขียนใหม่ด้วยคำของตน อธิบายได้ทุกบรรทัด | บท 15 (โครงงานบูรณาการ) |
| การอ้างอิงแหล่งที่มาและการใช้เครื่องมือช่วย | คอมเมนต์ระบุแหล่งที่ศึกษา และแจ้งการใช้เว็บ/ตัวอย่างโค้ด/AI อย่างโปร่งใส | บท 15 (โครงงานบูรณาการ) |
สรุปคำสั่ง
| คำสั่ง | หน้าที่ |
|---|---|
gcc -std=c11 -Wall ch14_vowels.c -o ch14_vowels | คอมไพล์ซอร์สโค้ด ch14_vowels.c เป็นไฟล์ปฏิบัติการ พร้อมเปิดการแจ้งเตือน |
./ch14_vowels | รันไฟล์ปฏิบัติการที่คอมไพล์แล้ว |
แบบฝึกหัดท้ายบท
ตอนที่ 1 ฝึกทบทวน (15 ข้อ ตรวจคำตอบให้ทันที)
ตอนที่ 2 แบบฝึกหัดเขียนตอบ (5 ข้อ)
กลุ่ม ก (เข้าใจ)
- ก1 (LLO14.1) จงอธิบายความต่างระหว่างการคัดลอกโค้ดโดยไม่ศึกษากับการศึกษาแนวทางแล้วเขียนใหม่ด้วยความเข้าใจพร้อมอ้างอิง และเหตุใดกรณีหลังจึงถือว่าซื่อสัตย์
- ก2 (LLO14.3) จงอธิบายว่าควรแจ้งการใช้เครื่องมือช่วย เช่น เว็บหรือเครื่องมือ AI ในการพัฒนาโค้ดอย่างไรจึงเรียกว่าโปร่งใส
กลุ่ม ข (ประยุกต์)
- ข1 (LLO14.2) จงศึกษาแนวทางของโปรแกรมภาษา C หนึ่งเรื่องจากบทก่อน แล้วเขียนโปรแกรมขึ้นใหม่ด้วยความเข้าใจของตนเอง พร้อมใส่คอมเมนต์ส่วนหัวระบุแหล่งที่ศึกษา แล้วคอมไพล์และรันให้ได้ผลจริง
- ข2 (LLO14.3) จากโปรแกรมในข้อ ข1 จงเขียนบันทึกสั้นแจ้งแหล่งที่ศึกษาและเครื่องมือช่วยที่ใช้ พร้อมระบุว่าได้ตรวจสอบและเข้าใจผลลัพธ์ด้วยตนเองอย่างไร
กลุ่ม ค (วิเคราะห์)
- ค1 (LLO14.1) จากสถานการณ์ที่สมาชิกกลุ่มส่งไฟล์โค้ดเดียวกันทั้งกลุ่มเป็นงานเดี่ยว จงวิเคราะห์ว่าเหมาะสมหรือไม่ด้านความซื่อสัตย์ พร้อมเหตุผล และเสนอแนวปฏิบัติที่ถูกต้องสำหรับการทำงานร่วมกัน
การศึกษาค้นคว้าเพิ่มเติม
- ศึกษาแนวทางการจัดการสตริงและอักขระเพิ่มเติมจาก Kernighan และ Ritchie (1988) แล้วทดลองพัฒนาโปรแกรมประมวลผลสตริงของตนเองขึ้นใหม่ด้วยความเข้าใจ พร้อมคอมเมนต์ระบุแหล่งที่ศึกษา
- ทบทวนข้อกำหนดด้านการจัดการสตริงและอักขระของภาษา C ตามมาตรฐาน ISO/IEC 9899:2011 เพื่อเข้าใจพฤติกรรมของการวนอักขระจนพบอักขระปิดท้ายสตริงที่ใช้ในโปรแกรมตัวอย่าง
- ศึกษาระเบียบและแนวปฏิบัติด้านความซื่อสัตย์ทางวิชาการของมหาวิทยาลัยและหลักสูตรที่ผู้สอนจัดเตรียม แล้วสรุปแนวปฏิบัติที่ควรยึดในการพัฒนาและส่งมอบผลงานของรายวิชานี้
เอกสารอ้างอิง
International Organization for Standardization. (2011). ISO/IEC 9899:2011 — Information technology — Programming languages — C. ISO.
Kernighan, B. W., & Ritchie, D. M. (1988). The C programming language (2nd ed.). Prentice Hall.
ตำราหลักภาษาไทยของรายวิชา. (ผู้สอนเติมรายละเอียดบรรณานุกรม — เพิ่มตามมติผู้สอน 21 ต.ค. 2569).
แหล่งปฐมภูมิที่ตรวจประกอบการปรับปรุง 23 ตุลาคม 2569
- ACM — Code of Ethics and Professional Conduct
- UNESCO — Guidance for generative AI in education and research
ใช้เอกสารข้างต้นตรวจหลักการก่อนเรียบเรียงส่วนขยายและสร้างข้อมูลสมมติ กรณีศึกษาใหม่เป็นสถานการณ์สมมติสำหรับอภิปราย ไม่ใช้แทนนโยบายหรือบทลงโทษที่ผู้สอนและมหาวิทยาลัยประกาศ โปรแกรมตัวอย่างตรวจด้วย GCC ตามตารางเครื่องมือ รายงานขอบเขตผลตรวจในส่วนผู้สอน