กระบวนการพัฒนาซอฟต์แวร์

Posted By Plookpedia | 21 เม.ย. 60
343 Views

  Favorite

กระบวนการพัฒนาซอฟต์แวร์

      กระบวนการการพัฒนาซอฟต์แวร์ที่ดีควรหาข้อผิดพลาดให้ได้แต่ต้องไม่สับสนเรื่องขั้นตอนในการพัฒนา ถ้าผลิตอย่างมีขั้นตอนก็ควรมีความยืดหยุ่นพอสมควรและไม่ยึดติดกับขั้นตอนมากเกินไป จนทำให้โครงการล่าช้าหรือล้มเหลวเพราะเลือกใช้ขั้นตอนที่ไม่เหมาะสมกับประเภทของซอฟต์แวร์  ถ้าพบข้อผิดพลาดช่วงแรก ๆ ก็จะช่วยลดระยะเวลาและค่าใช้จ่ายในการพัฒนาซอฟต์แวร์ได้มาก การศึกษาเรื่องค่าใช้จ่ายด้านซอฟต์แวร์ของบริษัทไอบีเอ็ม (IBM) บริษัทจีทีอี (GTE) และบริษัททีอาร์ดับเบิลยู (TRW) โดยนายแบรี่ บีม (Barry Boehm) ในปี ค.ศ. ๑๙๓๖ พบว่าถ้าแก้ไขข้อผิดพลาดเมื่อพัฒนาซอฟต์แวร์เสร็จแล้วแทนที่จะแก้ไขตั้งแต่ตอนที่กำหนดคุณลักษณะของซอฟต์แวร์ก็จะต้องเสียค่าใช้จ่ายเพิ่มขึ้นเป็นร้อยเท่าตัวอย่างของปัญหานี้เห็นได้อย่างชัดเจนในการแก้ปัญหาคอมพิวเตอร์ ปี ค.ศ. ๒๐๐๐ หรือที่เรียกว่า ปัญหาวายทูเค (Y2K) บริษัที่ออกแบบซอฟต์แวร์ให้ใช้กับปีที่มีเลขสี่หลักตั้งแต่ต้นแทบจะไม่เดือดร้อนในการแก้ไขเลยแต่ซอฟต์แวร์อื่น ๆ ที่ทั้งผู้ผลิตและผู้ใช้ต่างละเลยปัญหานี้โดยยังคงใช้ปีเป็นเลขสองหลักอยู่บางรายใช้อยู่เป็นสิบ ๆ ปี เมื่อถึงเวลาแก้ไขข้อผิดพลาดของซอฟต์แวร์ก็ปรากฏว่าต้องใช้เงินเป็นจำนวนมากถึงหลายสิบล้านบาท ร้อยล้านบาทหรือมากกว่านั้น 

การพัฒนาซอฟต์แวร์อย่างมีขั้นตอน 

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

๑. กำหนดคุณลักษณะซอฟต์แวร์ (Definition) 

      เน้นว่าจะ "สร้างอะไร" โดยให้คำตอบว่า "โจทย์ปัญหาที่ต้องการแก้คืออะไร" และ "สิ่งที่จะใช้แก้ปัญหานี้คืออะไร" 

๒. สร้างซอฟต์แวร์ (Development) 

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

๓. วิวัฒนาการของซอฟต์แวร์ (Evolution) 

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

      แม่แบบของกระบวนการการพัฒนาซอฟต์แวร์ที่เป็นขั้นตอนที่เก่าแก่ที่สุดนั้น เรียกกันว่า แม่แบบแบบขั้นน้ำตก (Waterfall Model) ซึ่งเมื่อลากเส้นเชื่อมต่อแต่ละขั้นตอนลงไปจนถึงขั้นตอนสุดท้ายแล้วก็จะมีลักษณะคล้ายน้ำตก 

 

ซอฟต์แวร์คอมพิวเตอร์
แม่แบบแบบขั้นน้ำตก

 

ขั้นตอนหลัก ๆ ของแม่แบบขั้นน้ำตก มีดังนี้ 

๑. วิเคราะห์ความเป็นไปได้ 

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

๒. วิเคราะห์โจทย์หรือความต้องการของผู้ใช้ 

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

๓. เขียนคุณลักษณะซอฟต์แวร์ 

      คุณลักษณะซอฟต์แวร์ (Software Specification) เป็นข้อกำหนดลักษณะหน้าที่และวิธีการทำงานของซอฟต์แวร์ว่า ซอฟต์แวร์นี้ต้องทำอะไรบ้างจึงจะสนองความต้องการของผู้ใช้ เช่น จะต้องใช้ข้อมูลอะไร จะจัดเก็บข้อมูลอะไร จะผลิตหรือประมวลผลข้อมูลอะไร ลักษณะของข้อมูลเป็นอย่างไร มีขอบเขตข้อจำกัดอะไร ฯลฯ
การกำหนดคุณลักษณะซอฟต์แวร์สามารถทำได้หลายวิธี เช่น

  • สอบถามผู้ใช้โดยตรงว่าต้องการให้ซอฟต์แวร์ทำหน้าที่อะไรบ้าง การสอบถามต้องมีเทคนิคในการสื่อสารที่ดีโดยอาจจะมีการยกตัวอย่างสภาพการณ์ (scenario-based requirement analysis) ในแนวว่า "ถ้า (สถานการณ์) เกิดขึ้นจะทำอย่างไร" เช่น ถ้าโจทย์คือการจัดการพัสดุของร้านค้านักวิเคราะห์ระบบอาจถามว่า "ถ้าสินค้าที่สั่งซื้อไม่มาส่งตามกำหนดทางร้านจะทราบได้เมื่อใดและจะดำเนินการอย่างไร"
  •  ศึกษาวิธีการดำเนินงานตามปกติก่อนนำคอมพิวเตอร์มาใช้และหาจุดอ่อนที่จะต้องนำซอฟต์แวร์เข้ามาใช้เพื่อเพิ่มประสิทธิภาพ 
  • สำรวจความต้องการของตลาดว่าคนส่วนใหญ่ต้องการให้คอมพิวเตอร์ช่วยงานด้านใด ในลักษณะใด และต้องการความบันเทิงจากคอมพิวเตอร์อย่างไร ฯลฯ 
  • ศึกษาจากลักษณะของซอฟต์แวร์เก่าที่ทำงานด้านนี้อยู่แล้ว ฯลฯ 

 

      สรุปผลการวิเคราะห์ข้อกำหนดลักษณะของซอฟต์แวร์สามารถแบ่งได้เป็น ๓ รูปแบบ คือ รูปแบบข้อมูล รูปแบบหน้าที่งาน และรูปแบบการทำงาน  วิธีการนำเสนออาจแสดงเป็นแผนผังแบบ ต่าง ๆ เช่น แสดงด้วยแผนผังการไหลของข้อมูล (Data Flow Diagram) แสดงด้วยแผนผังความสัมพันธ์ของข้อมูล (Entity - Relationship Diagram) ฯลฯ ส่วนศัพท์ว่าข้อมูลใดคืออะไรจะต้องอธิบายอยู่ในพจนานุกรมข้อมูล (Data Dictionary) 

 

ซอฟต์แวร์คอมพิวเตอร์

 

๔. ออกแบบซอฟต์แวร์ 

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

๕. เขียนซอฟต์แวร์ 

      การเขียนซอฟต์แวร์หรือโปรแกรมเป็นการเขียนชุดคำสั่งให้คอมพิวเตอร์ทำงาน ภาษาที่ใช้เขียนซอฟต์แวร์มีอยู่หลากหลาย ได้แก่ ภาษาเบสิก (BASIC) ภาษาฟอร์แทรน (FORTRAN) ภาษาโคบอล (COBOL) ภาษาซี (C) ภาษาวิชวลเบสิก (Visual Basic) ภาษาจาวา (Java) ภาษาเพิร์ล (PERL) ภาษาเดลไฟ (Delphi) ฯลฯ ซึ่งควรจะเขียนเป็นหน่วยเล็ก ๆ ก่อน โดยแต่ละภาษาอาจจะมีรูปแบบหน่วยที่ต่างกัน  เมื่อเขียนเสร็จแล้วก็ควรจะทดสอบความถูกต้องในการทำงานของแต่ละหน่วยด้วยการทดสอบซอฟต์แวร์ (software testing) ว่าถูกต้องตามข้อกำหนดตรงตามความต้องการของผู้ใช้ มีคุณภาพตามต้องการและหาข้อผิดพลาดเพื่อแก้ไขชุดคำสั่งให้กำจัดข้อบกพร่องนั้น ๆ (software debugging)

๖. รวมหน่วยย่อยของซอฟต์แวร์ 

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

๗. นำซอฟต์แวร์ไปใช้ 

      การนำเสนอซอฟต์แวร์ไปใช้ในเบื้องต้นจะช่วยให้ผู้ใช้ได้เห็นว่าใช้ได้สะดวกหรือไม่และตรงกับความต้องการหรือไม่ เมื่อนำไปใช้แล้วสามารถแก้ปัญหาที่กำลังประสบอยู่ได้หรือไม่ ฯลฯ หากไม่ตรงกับความต้องการก็จะได้ให้คนที่เขียนโปรแกรมนั้นแก้ไขใหม่ 

๘. ใช้ซอฟต์แวร์ในการทำงานจริง 

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

๙. ทำนุบำรุงซอฟต์แวร์  ขณะที่ใช้ซอฟต์แวร์อยู่ ก็ยังต้องมีการทำนุบำรุงซอฟต์แวร์ เช่น 
      (๑) แก้ไขซอฟต์แวร์ (correction) เมื่อพบข้อผิดพลาด
      (๒) ขยายหน้าที่ของซอฟต์แวร์ (enhancement) เมื่อผู้ใช้ปรับเปลี่ยนความต้องการไป 
      (๓) ปรับให้ซอฟต์แวร์ทำงานในสภาพแวดล้อมที่เปลี่ยนไป (adaptation) เช่น มีกฎระเบียบใหม่ออกมา ทำให้โจทย์ปัญหาเปลี่ยนไป หรือคอมพิวเตอร์เปลี่ยนรุ่น ฯลฯ 
      (๔) การรื้อแล้วสร้างใหม่ (software re-engineering) เพื่อปรับโครงสร้างซอฟต์แวร์เก่า พัฒนาซอฟต์แวร์ใหม่ให้มีคุณภาพและทำให้การแก้-ขยาย-ปรับ ทำได้อย่างสะดวกและประหยัดในระยะยาว

การตรวจสอบความถูกต้องควรจะทำในทุกขั้นตอนและถ้าพบข้อผิดพลาดก็ต้องรีบย้อนกลับไปแก้ไข 

วิธีการตรวจสอบแก้ไข

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

การทดสอบความต้องการ 

      รวมถึงการจัดทำกรณีทดสอบ (test case) การทดสอบและการหาจุดบกพร่องในโปรแกรมที่ต้องแก้ไข กรณีทดสอบทั่วไปมักระบุข้อมูลขาเข้าที่เป็นอินพุต (input) ของซอฟต์แวร์และระบุข้อมูลขาออกหรือลักษณะการโต้ตอบที่ควรเป็นเอาต์พุต (output) ของซอฟต์แวร์ การจัดทำกรณีทดสอบที่ดีควรครอบคลุมทั้งภายนอก (Black - box testing) และภายใน (White-box testing) การทดสอบครอบคลุมภายนอก ถ้ามีการณีที่ทดสอบอินพุตและเอาต์พุตทุกประเภทหรือการทดสอบครอบคลุมภายใน ถ้ามีกรณีที่ทดสอบทุกโปรแกรมย่อยภายในโดยต้องทำให้ทุกคำสั่งในซอฟต์แวร์ถูกเรียกใช้ การทดสอบให้ครอบคลุมมักมีกรณีทดสอบเป็นจำนวนมาก เทคนิคในการทดสอบ (testing technique) มักเสนอวิธีเลือกกรณีทดสอบให้มีพอประมาณแต่ก็ยังครอบคลุมประเด็นหลัก ๆ อยู่ ตัวอย่างเช่น การทดสอบโปรแกรมหาเศษจากการหารเลขที่คืนค่าเศษที่เป็นเลขหลัก อินพุตจะ เป็นตัวตั้ง และตัวหาร ส่วนเอาต์พุตจะเป็นคำตอบ
      อินพุต ทุกประเภทของทั้งตัวตั้งและตัวหารจะแยกได้เป็นประเภทตัวเลขที่โปรแกรมรับและประเภทตัวเลขที่โปรแกรมไม่รับ ซึ่งประเภทตัวเลขที่โปรแกรมรับอาจแยกได้เป็น ๓ แบบ ได้แก่ เลขหลักเดียว เลขหลายหลัก และเลขติดลบ ประเภทตัวเลขที่โปรแกรมไม่รับอาจแยกได้เป็น ๒ แบบ ได้แก่ ตัวอักษรอื่น ๆ ที่ไม่ใช่ตัวเลขและเลขศูนย์ นอกจากนี้ยังมี ๓ กรณีที่เทียบค่าระหว่างตัวตั้งและตัวหาร ได้แก่ ตัวตั้งมีค่ามากกว่าตัวหาร ตัวหารมีค่ามากกว่าตัวตั้ง และตัวตั้งมีค่าเท่ากับตัวหาร 
      เอาต์พุต ทุกประเภทแยกได้เป็น ๓ กรณี คือ หารลงตัว หารไม่ลงตัว และหารไม่ได้ 
หากรวมการทดสอบทุกรูปแบบแล้วก็จะมีกรณีมากถึง ๓ x ๒ x ๓ x ๓ คือ ๕๔ กรณี แต่เนื่องจากระยะเวลาในการทดสอบมักมีจำกัดกรณีที่ทดสอบจริงอาจเลือกเพียง ๑๐ กรณี ได้แก่ 
      ๑. ตัวตั้งและตัวหารเป็นเลขหลักเดียว หารลงตัว 
      ๒. ตัวตั้งและตัวหารเป็นเลขหลักเดียว หารไม่ลงตัว 
      ๓. ตัวตั้งและตัวหารเป็นเลขหลายหลัก หารลงตัว 
      ๔. ตัวตั้งและตัวหารเป็นเลขหลายหลัก หารไม่ลงตัว
      ๕. ตัวหารเป็นศูนย์ หารไม่ได้
      ๖. ตัวตั้งหรือตัวหารไม่ได้เป็นตัวเลข หารไม่ได้ 
      ๗. ตัวตั้งหรือตัวหารเป็นเลขติดลบ 
      ๘. ตัวตั้งมีค่ามากกว่าตัวหาร 
      ๙. ตัวตั้งมีค่าน้อยกว่าตัวหาร 
     ๑๐. ตัวตั้งมีค่าเท่ากับตัวหาร 
      ปัจจุบันประเทศไทยยังไม่เน้นเรื่องการออกแบบกรณีทดสอบให้ครอบคลุมเท่าที่ควรซึ่งส่งผลกระทบต่อคุณภาพของซอฟต์แวร์อย่างมากเพราะทำให้ค้นพบข้อผิดพลาดได้ล่าช้าและทำให้ค่าใช้จ่ายในการแก้ไขรวมทั้งเวลาที่ต้องใช้เพิ่มขึ้นด้วย

เว็บไซต์ทรูปลูกปัญญาดอทคอมเป็นเพียงผู้ให้บริการพื้นที่เผยแพร่ความรู้เพื่อประโยชน์ของสังคม ข้อความและรูปภาพที่ปรากฏในบทความเป็นการเผยแพร่โดยผู้ใช้งาน หากพบเห็นข้อความและรูปภาพที่ไม่เหมาะสมหรือละเมิดลิขสิทธิ์ กรุณาแจ้งผู้ดูแลระบบเพื่อดำเนินการต่อไป
  • Posted By
  • Plookpedia
  • 1 Followers
  • Follow