เมื่อเราอยากเล่นจรวดกระดาษและมีความสามารถในการพับจรวด เพื่อนของเราอยากเล่นบ้างแต่เขาพับไม่เป็นเราก็ต้องบอกวิธีพับตามขั้นตอนให้แก่เขา เมื่อเขาฟังขั้นตอนที่เราบอกเสร็จแล้วก็ ไม่ใช่ว่าเขาจะมีจรวดให้เล่นได้ทันทีแต่เขาต้องหากระดาษมาพับตามขั้นตอนที่เราบอกก่อน เขาจึงจะได้จรวดมาปาเล่นอย่างเราบ้าง
คอมพิวเตอร์ที่เราเห็นว่าสามารถทำอะไรได้สารพัดและมีเกมมากมายให้เราเล่นนั้น อันที่จริงแล้วเวลาเริ่มต้นคอมพิวเตอร์ไม่สามารถทำอะไรได้เลยสาเหตุที่ทำได้ก็เพราะมีการสั่งวิธีทำสิ่งต่าง ๆ เป็นขั้นตอนไว้ให้เราเรียกคำสั่งต่าง ๆ สำหรับคอมพิวเตอร์ที่รวมกันเป็นชุดว่า "ซอฟต์แวร์" หรือ "โปรแกรม" เกมที่เราเล่นในคอมพิวเตอร์ก็เป็นซอฟต์แวร์อย่างหนึ่ง คอมพิวเตอร์ต้องทำตามคำสั่งที่อยู่ในซอฟต์แวร์ก่อนเราจึงจะเริ่มเล่นเกมได้
ปัญหาคือคอมพิวเตอร์เป็นเครื่องที่เข้าใจภาษาเครื่องเท่านั้นถ้าให้คนเขียนคำสั่งในภาษานี้ก็จะยาวและยุ่งยากสับสนมากเพราะมีแต่เลข 0 กับ 1 คนจึงได้คิดภาษาเขียนโปรแกรมที่คนสามารถอ่านออกขึ้นมาเพื่อเขียนคำสั่งแล้วให้ซอฟต์แวร์ที่ทำหน้าที่เป็นล่ามแปลเป็นภาษาเครื่องอีกครั้งก่อนที่จะสั่งให้คอมพิวเตอร์ทำงานได้ ถ้าเราเปรียบเทียบการบอกวิธีพับจรวดกระดาษที่มีเพียง ๓-๔ ขั้นตอนกับการบอกวิธีสร้างจรวดของจริงที่มีหลายแสนขั้นตอน เราก็จะทราบว่าการสร้างจรวดของจริงมีกระบวนการที่ยุ่งยากกว่ามากและเช่นเดียวกันถ้าเราจะสั่งให้คอมพิวเตอร์ทำงานบ่อย ๆ อย่างบวก ๑ ถึง ๑๐ เราอาจจะเขียนคำสั่ง หรือ "เขียนโปรแกรม" สั้น ๆ ขึ้นมาได้เลยแต่ถ้าเราจะให้คอมพิวเตอร์ทำงานที่ยาก เช่น จำลองสภาพให้เสมือนเราขับเครื่องบินรบได้เราจะต้องมีกระบวนการอีกมากมาย การเขียนโปรแกรมจะเป็นเพียงส่วนปลีกย่อยเท่านั้นเราเรียกกระบวนการนี้ว่า "การพัฒนาซอฟต์แวร์"
กระบวนการสร้างจรวดของจริงต้องใช้คนหลายสาขาอาชีพและมีขั้นตอนหลายอย่าง เช่น จะต้องมีนักวิทยาศาสตร์ที่รู้เรื่องอวกาศมาวิเคราะห์ก่อนว่าจะทำอย่างไรให้คนที่ขับจรวดสามารถหายใจได้ขณะที่จรวดอยู่ในอาวกาศ จะต้องมีวิศวกรออกแบบรูปร่างจรวดมีช่างออกแบบเครื่องยนต์และสร้างจรวดจำลองลำเล็ก ๆ ขึ้นมาทดลองบินก่อนหากมีข้อผิดพลาดจรวดจำลองลำเล็กตกสู่พื้นดินก็ยังไม่มีใครได้รับบาดเจ็บ เมื่อแก้ไขข้อผิดพลาดเรียบร้อยแล้วจึงจะสร้างจรวดของจริงในขั้นตอนนี้ก็ยังต้องมีคนเข้าไปทดสอบหรือทดลองใช้ส่วนต่าง ๆ ว่าทำงานไม่ผิดพลาดแน่นอนจึงจะสามารถขับจรวดไปนอกโลกได้
กระบวนการการพัฒนาซอฟต์แวร์ก็ต้องใช้คนที่มีความชำนาญหลายด้านเช่นเดียวกัน ซอฟต์แวร์สำหรับงานบางอย่างมีผู้สร้างไว้จำหน่ายแล้วแต่ถ้าซอฟต์แวร์ที่จะสั่งให้คอมพิวเตอร์ทำงานตามที่เราต้องการไม่มีจำหน่ายเราก็ต้องจ้างคนมาพัฒนาซอฟต์แวร์ให้แก่เรา แต่ไม่ใช่จ้างเฉพาะคนเขียนโปรแกรมเท่านั้นเราต้องจ้างผู้ชำนาญในการวิเคราะห์ ออกแบบ และทดสอบมาร่วมมือกัน อีกทั้งต้องเลือกกระบวนการการพัฒนาที่เหมาะสมกับลักษณะของซอฟต์แวร์ด้วยเราจึงจะได้ซอฟต์แวร์ที่ดีเสร็จเร็วและราคาไม่แพงเกินไป การพัฒนาซอฟต์แวร์ขนาดเล็ก ๆ โดยคน ๆ เดียวนั้นต้องใช้คนที่สามารถเขียนชุดคำสั่งด้วยภาษาคอมพิวเตอร์ได้หรือที่เรียกว่า "โปรแกรมเมอร์" โปรแกรมเมอร์มักได้รับการมอบหมายตั้งแต่เริ่มต้นว่าจะต้องสั่งให้คอมพิวเตอร์ทำอะไรบ้างเขาจึงจะเริ่มดำเนินการ สมมติว่าโจทย์ คือ ให้คอมพิวเตอร์ตรวจสอบว่าปี พ.ศ.ที่ระบุเป็นอธิกสุรทินหรือไม่ขั้นตอนที่โปรแกรมเมอร์จะดำเนินการมีดังต่อไปนี้
ขั้นที่ ๑ วิเคราะห์โจทย์
โปรแกรมเมอร์ต้องหานิยามว่าปีอธิกสุรทินคืออะไร โดยอาจหาจากสารานุกรมหรือพจนานุกรมก็จะพบว่าปีอธิกสุรทิน (leap year) คือ ปีที่มี ๓๖๖ วัน ในปีนั้นเดือนกุมภาพันธ์จะมี ๒๙ วัน ในเชิงการคำนวณ ปีอธิกสุรทินเป็นปีที่หารด้วย ๔ ได้ลงตัวแต่หารด้วย ๑๐๐ ไม่ลงตัวหรือปีที่หารด้วย ๔๐๐ ได้ลงตัว
ขั้นที่ ๒ ออกแบบขั้นตอนการแก้ปัญหา
การระบุขั้นตอนในการแก้ปัญหาสำหรับคอมพิวเตอร์มีศัพท์เรียกว่า "อัลกอริทึม (Algorithm)" อธิบายให้ทราบถึงวิธีจัดการกับข้อมูลขาเข้าหรือ "อินพุต" เพื่อแปลงให้เป็นข้อมูลขาออกหรือ "เอาต์พุต" ในกรณีนี้ข้อมูลขาเข้า คือ ปี พ.ศ. ซึ่งเป็นเลข ๔ หลัก ข้อมูลขาออก คือ พิมพ์ว่า ใช่หรือไม่ใช่ปีอธิกสุรทิน โปรแกรมเมอร์อาจเริ่มร่างขั้นตอนหลักดังนี้
(๑) อ่านปี
(๒) ถ้าหารปีด้วย ๔ ลงตัวและหารปีด้วย ๑๐๐ ไม่ลงตัว ตอบว่าใช่ปีอธิกสุรทิน
(๓) มิฉะนั้นถ้าหารปีด้วย ๔๐๐ ลงตัว ตอบว่าใช่ปีอธิกสุรทิน
(๔) อัลกอริทึมสำหรับตรวจสอบปีว่าเป็นปีอธิกสุรทินหรือไม่ มิฉะนั้นตอบว่าใช่ปีอธิกสุรทิน
ขั้นที่ ๓ การเขียนโปรแกรม
โปรแกรมในภาษาวิชวลเบสิก (Visual Basic) ที่ตรวจสอบปีอธิกสุรทินที่เขียนตามอัลกอริทึมจากขั้นที่ ๒ แสดงได้ดังนี้
Private Sub LeapYear-Click()
Dim Year As Integer
Year = InputYear.Text
if (Year Mod 4 = 0 And Year Mod 100 <> 0) Then
MsgBox "ปี" & Year & "เป็นปีอธิกสุรทิน" , vboKOnly. "ผลการคำนวณ"
Elself (Year Mod 400 = 0) Then
MsgBox "ปี" & Year & "เป็นปีอธิกสุรทิน", vbOKOnly, "ผลการคำนวณ"
Else
MsgBox "ปี" & Year & "ไม่เป็นปีอธิกสุรทิน" , vbOKOnly, "ผลการคำนวณ"
End If
End Sub
: โปรแกรมที่เขียนด้วยภาษาวิชวลเบสิกเพื่อตรวจสอบปี พ.ศ. ว่าเป็นปีอธิกสุรทินแต่โปรแกรมนี้ยังมีข้อผิดพลาดอยู่บ้าง
ชุดคำสั่งที่เป็นภาษาที่คนสามารถอ่านออกดังแสดงในรูปที่ ๑ เรียกกันว่า "ซอร์สโคด (Source Code)" ซึ่งก่อนที่โปรแกรมจะสั่งให้คอมพิวเตอร์ทำงานได้ โปรแกรมเมอร์ต้องเรียกซอฟต์แวร์ที่ทำหน้าที่เป็นล่าม เรียกว่า "คอมไพเลอร์ (Compiler)" เพื่อแปลคำสั่งในซอร์สโคดให้เป็นภาษาเครื่อง (machine language) ก่อนชุดคำสั่งที่แปลเป็นภาษาเครื่องแล้ว เรียกว่า "อ็อบเจ็กต์โคด (Object Code)" โปรแกรมที่ถูกแปลงเป็นอ็อบเจ็กต์โคด เรียกว่า "โปรแกรมพร้อมปฏิบัติ (executable file)" เมื่อใดที่ถูกเรียกใช้คอมพิวเตอร์ก็จะทำงานตามคำสั่งได้
ขั้นที่ ๔ ทดสอบโปรแกรม
โปรแกรมเมอร์ต้องคิดกรณีที่จะทดสอบระบบ โปรแกรมนี้มี ๒ กรณีหลัก คือ กรณีแรกเลือกปีที่รู้แล้วว่าเดือนกุมภาพันธ์มี ๒๘ วัน เช่น ปี พ.ศ. ๒๕๔๑ กรณีที่ ๒ เลือกปีที่รู้แล้วว่าเดือนกุมภาพันธ์มี ๒๙ วัน เช่น ปี พ.ศ. ๒๕๔๓ เมื่อเริ่มทำงานโปรแกรมเมอร์จะเรียกโปรแกรมพร้อมปฏิบัติของโปรแกรมนี้มาใช้เพื่อทดสอบระบบโดยคอมพิวเตอร์จะแสดงหน้าจอเพื่อเรียกข้อมูลขาเข้า ดังนี้
เมื่อป้อนปี พ.ศ. ๒๕๔๑ เข้าโปรแกรมนี้ คอมพิวเตอร์แสดงผลว่า "ปี ๒๕๔๑ ไม่เป็นปีอธิกสุรทิน" ซึ่งถูกต้องแต่เมื่อป้อนปี พ.ศ. ๒๕๔๓ คอมพิวเตอร์แสดงผลว่า "ปี ๒๕๔๓ ไม่เป็นปีอธิกสุรทิน" ซึ่งผิดเมื่อเห็นผลในกรณีที่ ๒ แล้วโปรแกรมเมอร์จะทราบทันทีว่าโปรแกรมมีปัญหาหรือมี "บัก" ที่ต้องเข้าไปแก้ไข
ขั้นที่ ๕ แก้ไขโปรแกรม
วิธีการที่ดีสำหรับการแก้ไขโปรแกรม คือ ควรย้อนไปพิจารณาการวิเคราะห์โจทย์และการออกแบบขั้นตอนการแก้ปัญหาด้วย เมื่ออ่านอย่างรอบคอบจะพบว่าวิธีคำนวณตรวจสอบปีนั้นใช้ได้เฉพาะปี ค.ศ. ไม่ใช่ปี พ.ศ. ดังนั้นการแก้ไขต้องแก้ที่อัลกอริทึมซึ่งย้อนกลับไปเรื่องการออกแบบวิธีแปลงปี พ.ศ. ให้เป็นปี ค.ศ. ก่อน เราสามารถคำนวณได้โดยการลบปี พ.ศ. ๕๔๓ ขั้นตอนของอัลกอริทึมจากขั้นที่ ๒ จะถูกแก้ไขแล้วจึงไปแก้ไขโปรแกรมดังแสดงนี้
จากอัลกอริทึมเดิม อัลกอริทึมที่ถูกแก้ไข
(๑) อ่านปี (๑) อ่านปี พ.ศ.
(๒) ถ้าหารปีด้วย ๔ ได้ลงตัวและปีด้วย๑๐๐ ไม่ลงตัว ตอบว่าใช่ปีอธิกสุรทิน (๑.๑) ปี = ปี พ.ศ. - ๕๔๓
(๒) ถ้าหารปีด้วย ๔ ได้ลงตัวและหารปีด้วย
๑๐๐ ไม่ลงตัว ตอบว่าใช่ปีอธิกสุรทิน
โปรแกรมเพื่อตรวจสอบปีพ.ศ. ว่าเป็นปีอธิกสุรทิน หลังการแก้ไขให้แปลงปี พ.ศ. เป็นปี ค.ศ. ก่อนการประมวลผล
Private Sub LeapYear-Click()
Dim Year, ThaiYear As Integer
ThaiYear = InputYear.Text
Year = ThaiYear - 543
if (Year Mod 4 = 0 And Year Mod 100 <> 0 Then
MsgBox "ปี" & Year + 543 & "เป็นปีอธิกสุรทิน" , vbOKOnly, "ผลการคำนวณ"
Elself (Year Mod 400=0) Then
MsgBox "ปี" & Year+543 & "เป็นปีอธิกสุรทิน" , vbOKOnly, "ผลการคำนวณ"
Else
MsgBox "ปี" & Year-543 "ไม่เป็นอธิกสุรทิน" , vbOKOnly, "ผลการคำนวณ"
End if
End Sub
เมื่อเอากรณีปี พ.ศ. ๒๕๔๑ มาทดสอบอีกครั้งคอมพิวเตอร์แสดงผลว่า "ปี ๒๕๔๑ ไม่เป็นปีอธิกสุรทิน" อย่างถูกต้องและเมื่อเอากรณีปี พ.ศ. ๒๕๔๓ มาทดสอบอีกครั้งคอมพิวเตอร์แสดงผลว่า "ปี ๒๕๔๓ เป็นปีอธิกสุรทิน" อย่างถูกต้องซึ่งถือว่าสามารถแก้ปัญหาได้สำเร็จ
ขั้นที่ ๖ การปรับปรุงโปรแกรม
การพัฒนาซอฟต์แวร์ต้องคำนึงถึงคุณภาพด้วย ซอฟต์แวร์ที่ทำงานถูกต้องแล้วไม่ได้หมายความว่าดีพร้อมแล้วในกรณีนี้ยังสามารถเพิ่มคุณภาพได้อีกหลายประการ การปรับปรุงโปรแกรมที่ง่ายที่สุด คือ การเพิ่มคำอธิบายภาพ (comment) ซึ่งแสดงผลได้ดังนี้
การเขียนโปรแกรมขนาดเล็กนี้มีประเด็นเรื่องคุณภาพให้พิจารณามากมาย ดังนั้นประเด็นเหล่านี้ก็ต้องยิ่งมีมากขึ้นในการพัฒนาซอฟต์แวร์ขนาดใหญ่ การใช้คำว่า "การพัฒนาซอฟต์แวร์" จึงมักมีความหมายมากกว่า "การเขียนโปรแกรม" เพราะมีความซับซ้อนมากกว่า ในการพัฒนาซอฟต์แวร์นักวิเคราะห์ที่ไม่ใช่โปรแกรมเมอร์มักจะมาร่วมศึกษาวิเคราะห์ความซับซ้อนของโจทย์ปัญหาโดยจะมีเอกสารประกอบการดำเนินการและมีการประสานงานเพื่อให้คนหลายคนสามารถทำงานร่วมกันได้ กระบวนการการพัฒนาจะมีขั้นตอนย่อย ๆ อีกมาก ขณะที่เริ่มมีเครื่องมือ (ซอฟต์แวร์) บางอย่างที่ช่วยให้สามารถสร้างชุดคำสั่งของซอฟต์แวร์ได้โดยอัตโนมัติจากข้อกำหนดของซอฟต์แวร์ซึ่งจะทำให้เห็นได้อย่างชัดเจนว่าความยากในการพัฒนาซอฟต์แวร์ขนาดใหญ่อยู่ที่การวิเคราะห์โจทย์และการออกแบบมากกว่าการเขียนคำสั่งหรือการเขียนโปรแกรมเพียงอย่างเดียว