อ่านโปรแกรม RPG (ปัจจุบัน) ให้เป็น
สำหรับ โปรแกรมเมอร์ใหม่ (0-3 ปี)หนึ่งในหน้าที่ คือ เรียนรู้ระบบฯงานที่มีอยู่
ผมเชื่อว่า คนสอน >50% จะบอกว่า ให้เรียนรู้ (อ่านเอาเอง) จากโปรแกรม
บางที่จะมี เอกสารประกอบให้ดู (ส่วนใหญ่ก็จะเก่ามาก)
ผมก็สอนงาน แบบนี้เหมือนกันครับ : P
ก็ภาษามันมีโครงสร้าง ไม่ซับซ้อน ดังนั้นการอ่าน/ทำความเข้าใจ ก็ยาก
แต่ใช้ไม่ได้กับทุกกรณีครับ บางเรื่องก็ยากเกินไปน๊ะครับ
ถ้าเป้าหมายของการสอนงาน คือ "เรียนรู้ให้เร็ว" และพร้อมทำงาน
วิธีข้างต้น ก็ไม่ตอบโจทย์น๊ะครับ
ตย. นาย ก ต้องมาค้นหาวิธีเขียนโปรแกรมเทคนิค abc ใช้เวลา 1 เดือน
ด้านดี (คิดบวกมากๆ) นาย ก เรียนรู้ด้วย "ตนเอง" ได้ (นักเรียนในฝัน)
ด้านเสีย ใช้เวลานานไป และไม่การันตีว่า รู้ตรงกับที่อยากให้เรียนรู้
ความเห็นของผม : แค่ "ลงมือทำ" ในสิ่งที่คิด
(ทุกคนคิดได้ แต่ไม่ได้ลงมือทำ อ้างว่าไม่ว่างซะงั้น)
กลับมาที่หัวข้อ วิธีอ่านโปรแกรม (ปัจจุบัน) ให้เป็น
Q: เราอ่านโปรแกรม เพื่ออะไร ?
หากฏ หรือ ข้อกำหนด (condition), หาความสัมพันธ์, เรียนรู้เทคนิคโดยปรกติ จะเริ่มดูโปรแกรม กลุ่ม Entry, Maintenance และหน้าจอผลลัพธ์ที่ใช้บ่อย
หากฏ หรือ ข้อกำหนด (condition)
- ถ้า สินค้า เป็นชนิดนี้ ค่า commission ให้ลดลง 5% ... ไม่พบในเอกสารพื้นฐาน
หาความสัมพันธ์
- File A01,A02 ต้องใช้คู่กับ File C05 ... ไม่มีในเอกสาร
เทคนิคต่างๆ
- แสดงผลแบบ xxx (ต้องใช้ 3 เทคนิค) ... ไม่มีในหนังสือ
- Array, SubFile ... หนังสือทั่วไปไม่พูดถึง
มา Share ประสพการณ์จากผมทีละเรื่องกันครับ
หากฏ หรือ ข้อกำหนด (condition)
ปรกติ ผมจะเริ่มจาก สรุปหลักการขึ้น "แบบย่อ" ขึ้นมาก่อนครับ (ประมาณครึ่งหน้า A4)
เช่น งานบัญชี Fix Asset, งานผลิต มี keyword อะไรบ้าง
ตย.1
สินทรัพย์ ทุกรายการต้องมี เลขที่ประจำตัว บอกวันเริ่มต้น, ระยะเวลาหมดค่า, สูตรการคำนวน
เมื่ออ่านโปรแกรม อาจจะพบว่า มีกลุ่มสินทรัพย์ บางกลุ่มต้องใช้สูตรที่แตกต่างไป (เช่น ต้องลดค่าลงแบบเรขาคณิต) ให้บันทึกเป็น "ข้อกำหนดพิเศษ"
สินทรัพย์ ทุกรายการต้องมี เลขที่ประจำตัว บอกวันเริ่มต้น, ระยะเวลาหมดค่า, สูตรการคำนวน
แบบเชิงเส้น
ยกเว้น กลุ่มอิเลคทรอนิคส์ (รหัส E) ใช้สูตรลดค่าแบบเรขาคณิต
ตย.2
งานผลิต ชิ้นงาน (Item No) ผลิตที่ (Process, machine) ณ. เวลา (วันเดือนปี,เวลา) ได้จำนวนดี
,เสียหาย เท่าไหร่
เมื่ออ่านโปรแกรม อาจจะพบว่า Process A321 จะบันทึกจำนวนในรูปแบบกิโล แทนการนับเป็นชิ้น ให้บันทึกเป็น "ข้อกำหนดพิเศษ"
งานผลิต ชิ้นงาน (Item No) ผลิตที่ (Process, machine) ณ. เวลา (วันเดือนปี,เวลา) ได้จำนวนดี,เสียหาย เท่าไหร่ (นับเป็นชิ้น)
ยกเว้น Process A321 ที่นับเป็น กิโล (ต้องเปลี่ยน กิโล เป็น ชิ้น)
หาความสัมพันธ์ (ER)
ในมหาวิทยาลัยเราเรียนการสร้าง Table ใหม่ แต่ในงานจริง บริษัทฯ เปิดทำการมามากกว่า 20 ปี
Table ต่างๆ ถูกสร้างขึ้นมามากมายแล้ว ดังนั้นการอ่านโปรแกรมก็คือ การหาความสัมพันธ์ ที่
อาจจะไม่เคยเห็นเอกสาร พูดภาษาชาวบ้านคือ "เดาใจ" ผู้สร้าง Table ในยุคนั้นออกแบบอย่างไร
โชคไม่ดี ถ้า Developer ที่จบมาส่วนใหญ่ ออกแบบไม่เก่ง ในยุคสมัยนั้น คงไม่ต่างกันเท่าไหร่ ...
การเดาใจจึง "ซับซ้อน" กว่าปรกติ
อันดับแรก ต้องเชื่อว่าโปรแกรมที่กำลังอ่าน สร้างถูกต้องตามหลักการก่อน
(ไม่จำเป็นต้องถูกต้อง 100% ก็ได้)
ตัวเอกสาร Fix Asset, งานผลิต ถ้าจะสร้าง Table ใหม่ น่าจะต้องใช้กี่ Table
(เริ่มจาก 1 Table -> หลาย Table ที่สัมพันธ์กัน) ไม่เรียกเดาใจจะเรียกอะไรครับ
เรื่องถัดมา เข้าใจวิธี RPG เรียกใช้ DB2/400
DB2/400 เป็น Database ที่ดีอีกตัว ง่ายเมื่อทำงานกับ 1 Table เริ่มซับซ้อนเมื่อทำงานมากกว่า 1 Table และ เริ่มเข้าใจยากเมื่อ บันทึก/แก้ไข ข้อมูลหลาย Table (ยุคนี้ทำได้ง่ายขึ้น แต่ก็ยังไม่ง่ายจริงๆ)
ดังนั้นไม่ใช่เรื่องแปลกที่ Developer ในยุคนั้นจะเลือกวิธีที่ง่าย มากกว่าวิธีที่ถูกต้องจริงๆ (ซึ่งทำได้ยุ่งยาก) เช่น ยุคนี้ SQL 3 Table ในครั้งเดียว RPG ยุคใหม่จะมองผลลัพธ์เป็น 1 Table แต่ RPG ในยุคดังกล่าวจะทำทีละ Step (อ่าน Table แรก แล้วนำแต่ละ Row ไปอ่าน Table 2 หรือ 3)
ลองดู ตย. การเขียนในสไตล์ใหม่
SQL : -> ได้ 1 Table-Result
Select * from Table-1 as T1
Left Join Table-2 as T2 On T1.X=T2.Y
Left Join Table-3 as T3 On T1.Y=T3.Z
RPG : (ที่ใช้คู่กับ SQL) ทำให้ดูง่าย
Read Table-Result
Do while not EOF
Print
Read Table-Result
End Do
ตย.นี้ เรารู้แค่ Table ทั้ง 3 มี Relation แต่ไม่รู้ว่าความสัมพันธ์เป็นแบบไหน
1:1 หรือ 1:m ต้องทดสอบโดยต้องใช้ SQL หา Relation ทีละคู่
Table-1 ได้ผลลัพธ์ 115 rows
เพิ่ม Join กับ Table-2 ถ้านับผลลัพธ์ได้ 115 rows เท่าเดิม -> จะได้ relation 1:1
เพิ่ม Join กับ Table-2 ถ้านับผลลัพธ์ได้มากกว่า 115 rows -> จะได้ relation 1:m
-----------------------------------------------------------
ลองดู ตย. การเขียนที่สืบทอดกันมา
RPG :
Pointer to Table-1
Read Table-1 (one row)
Do while not EOF
T1.x Pointer to Table-2
T1.y Pointer to Table-3
Read Table-3 (one row)
Do while not EOF
Print
Read Table-3 (next row)
End Do
Read Table-1 (next row)
End Do
ตย.ข้างต้น เราจะอ่าน Relation ได้ว่า
Table-1 : Table-2 จะมีความสัมพันธ์ แบบ 1:1
Table-1 : Table-3 จะมีความสัมพันธ์ แบบ 1:m
หัวข้อถัดไปยกยอดไปคราวหน้าแล้วกันครับ (เนื้อหาเริ่มยาวเกินไปแล้ว)