ทุกท่านครับเคยสงสัยกันไหมว่า โปรแกรมเอย แอพพลิเคชั่นต่างๆ บนมือถือเอย รวมไปถึงเกมต่างๆ นั้นเขามีขั้นตอนในการพัฒนาออกมาอย่างไร จนสำเร็จรูปให้เราสามารถใช้งานได้กันทุกวันนี้ วันนี้ผมจะแนะนำขั้นตอนให้ทุกท่านได้รับรู้กันว่าซอฟต์แวร์หนึ่งนั้น ต้องผ่านกระบวนการวุ่นวายแค่ไหนกว่าจะออกมาให้เราใช้งานได้
ก่อนอื่นเราควรต้องทำความรู้จักกับซอฟต์แวร์กันก่อนว่าในทางปฏิบัติแล้วการผลิตซอฟต์แวร์แบ่งออกเป็นคู่ๆ 4 คู่ด้วยกันตามลักษณะของโครงการผลิตซอฟต์แวร์คือ
- ซอฟต์แวร์ที่พัฒนาใหม่ทั้งหมด กับ ซอฟต์แวร์ที่พัฒนาต่อยอดจากระบบเดิม
- ซอฟต์แวร์ที่พัฒนาเฉพาะลูกค้ารายบุคคล กับ ซอฟต์แวร์ที่พัฒนาเพื่อขายในวงกว้าง
- ซอฟต์แวร์ที่พัฒนาไว้ใช้ในองค์กร กับ ซอฟต์แวร์ที่ผู้พัฒนาภายนอกพัฒนาให้ (Out Sourced)
- ซอฟต์แวร์ที่พัฒนาครั้งเดียวจบ กับ ซอฟต์แวร์ที่ต้องมีการบำรุงแก้ไขไปเรื่อยๆ
โดยการผลิตซอฟต์แวร์ตามลักษณะโครงการดังที่ได้กล่าวในขั้นต้นนั้นต่างก็มีกระบวนการขั้นตอนในการผลิตแบบเดียวกันจะต่างกันเพียงรายละเอียดปลีกย่อยเท่านั้น ทั้งนี้ขั้นตอนกระบวนการในการผลิตซอฟต์แวร์นั้นมีหลายขั้นตอนครับ หลายท่านอาจจะคิดว่าก็เพียงแค่เขียนโปรแกรมออกมาใช้ได้ก็จบแล้ว นั่นไม่จริงเลยครับ การจะทำซอฟต์แวร์ที่ดีได้จะต้องผ่านกระบวนการหลายขั้นตอน โดยในขั้นตอนแรกสุดที่จะกล่าวถึงในวันนี้คือการเก็บความต้องการ หรือ Requirements Gathering
Requirements หรือความต้องการนั้นมีความหมายตรงตามชื่อของมัน คือความต้องการในการจะทำสิ่งๆ หนึ่ง เช่น เราต้องการโปรแกรมคิดเลขออนไลน์, เราต้องการเวปขายสินค้า, เราต้องการแอพดูหนัง ฯลฯ เหมือนจะง่ายใช่ไหมครับ แต่มันไม่ง่ายขนาดนั้น เพราะในความต้องการกว้างๆ อย่างที่ผมได้ยกตัวอย่างมานั้น มันมีความต้องการย่อยๆ อีกมากมายที่จะต้องประกอบกันออกมาด้วยเพื่อให้ซอฟต์แวร์สามารถทำงานได้ตรงตามที่ต้องการดังนั้นการเก็บเกี่ยวความต้องการให้ตรงตามที่ผู้ใช้งานต้องการให้มากที่สุด จึงถือเป็นงานที่สำคัญเป็นอย่างยิ่ง และยังเป็นตัวกำหนดความเป็นไปของซอฟต์แวร์นั้นๆ อีกด้วย
ความต้องการแบ่งออกเป็น 2 รูปแบบคือ
- ความต้องการที่เป็นหน้าที่ (Functional Requirements) หมายถึงความต้องการที่เป็นหน้าที่หรืองานหลักของซอฟต์แวร์นั้นๆ เช่นถ้าต้องการโปรแกรมเครื่องคิดเลขออนไลน์ ความต้องการตรงนี้ก็จะหมายถึง ซอฟต์แวร์สามารถทำการ บวก ลบ คูณ หาร ฯลฯ ได้อย่างถูกต้องเป็นต้น ซึ่งความต้องการในประเภทนี้จะถูกนำไปเขียนเป็นโค้ดโปรแกรมครับ
- ความต้องการที่ไม่เป็นหน้าที่ หรือความต้องการเชิงคุณภาพ (Non-Functional Requirements , Quality Requirements) หมายถึงความต้องการที่อยู่ในรูปแบบของคุณภาพของซอฟต์แวร์ เช่นจากโปรแกรมเครื่องคิดเลขออนไลน์ ความต้องการตรงนี้ก็จะหมายถึง ซอฟต์แวร์สามารถให้บริการคำนวณได้เรื่อยๆ ไม่ล่ม, ซอฟต์แวร์รองรับผู้ใช้บริการได้มากกว่า 1,000,000 คนในเวลาเดียวกัน, ซอฟต์แวร์สามารถคำนวณการบอกลบคูณหารได้ภายใน 0.01 วินาที ฯลฯ
?
ดังที่ได้บอกไว้ว่าตัวความต้องการนั้นมีลักษณะเป็นอย่างไรในข้างต้น แต่สิ่งที่ทำให้การเก็บความต้องการนั้นมีความยุ่งยากก็คือ ผู้เก็บความต้องการ(นักวิศวกรความต้องการ หรือ Requirements Engineer) จะต้องทำการเก็บความต้องการจากผู้ใช้งานเป็น ?ภาษาพูด? หรือ คำบอกเล่าตามที่ชาวบ้านต้องการนั่นแหละครับ โดยทั่วไปการเก็บความต้องการจากผู้ใช้เพียงคนเดียวมักจะไม่เพียงพอ ทำไมหรือครับ นั่นเพราะผู้ใช้แต่ละคนต่างก็มีความต้องการในการใช้งานซอฟต์แวร์หนึ่งๆ ที่แตกต่างกันไป ยกตัวอย่างเช่นจากโปรแกรมเครื่องคิดเลขออนไลน์ ผู้ใช้คนหนึ่งอาจจะต้องการแค่การบวก ลบ คูณ หาร เท่านั้นแต่อีกคนอาจจะต้องการให้มีฟังก์ชันชั้นสูงเช่น การถอดราก (Square root) ฯลฯ อีกคนอาจต้องการให้สามารถบันทึกขึ้นตอนการคำนวณได้ทั้งหมด เห็นไหมครับ ต่างคนต่างความคิด ดังนั้น การที่จะเก็บความต้องการให้ได้ตรงตามที่ผู้ใช้ต้องการมากที่สุดคือการเก็บข้อมูลโดยตรงกับผู้ใช้ครับ (ขอยกตัวอย่างนี้ที่เห็นได้อย่างชัดเจนคือไมโครซอฟท์ ฟังเสียงผู้ใช้งานเรื่องปุ่ม Start บน Windows 8 ที่หายไปจนทนเสียงเรียกร้องไม่ไหวต้องเอากลับเข้ามาใน Windows 8.1)
ความยากลำดับต่อมาก็คือการแบ่งแยกประเภทของความต้องการให้ออกเป็น 2 ประเภทครับ สาเหตุที่ต้องแยกความต้องการที่เป็นภาษาพูดให้เป็น 2 ประเภทดังที่ได้กล่าวไปข้างต้นนั้นก็เนื่องมาจาก ในด้านการเขียนโปรแกรมนั้น ความต้องการที่ไม่เป็นหน้าที่(หรือความต้องการเชิงคุณภาพ) มักจะไม่ได้อยู่ในรูปแบบของโค้ดโปรแกรมซึ่งต่างจากความต้องการที่เป็นหน้าที่ครับเช่นหากเราจะเขียนความต้องการให้โปรแกรมบวกเลข เราก็เพียงกำหนดโค้ด A+B เป็นต้น แต่สำหรับความต้องการเรื่องซอฟต์แวร์รองรับผู้ใช้บริการได้มากกว่า 1,000,000 คนในเวลาเดียวกันนั้น ถามนักเขียนโปรแกรมคนไหนก็ไม่มีใครตอบได้ ว่าจะเขียนโปรแกรมยังไงให้ทำแบบนี้ได้ ตรงส่วนนี้นักวิศวกรความต้องการจึงมีความจำเป็นในการแยกความต้องการออกให้เป็นสิ่งที่ต้องเขียนโค้ดขึ้นมา กับสิ่งที่ต้องควบคุมดูแลนั่นเอง
การเก็บความต้องการนั้นก็สามารถทำได้หลายวิธี ไม่ว่าจะเป็นการสัมภาษณ์โดยตรงจากผู้ใช้งาน, การออกแบบสอบถาม การแอบตรวจสอบลักษณะการใช้งานของผู้ใช้ (Send log ในแอพมือถือทั้งหลาย คือการส่งไปบอกผู้ผลิตซอฟต์แวร์ว่าเราทำงานอย่างไร) ฯลฯ สิ่งหนึ่งที่สำคัญก็คือการจะเก็บความต้องการได้ดีนั้น นักวิศวกรความต้องการจะต้องมีความรู้ความเข้าใจในเรื่องพื้นฐานที่เกี่ยวข้องกับซอฟต์แวร์นั้นๆ ด้วยครับ (เช่น หากจะเก็บความต้องการโปรแกรมเครื่องคิดเลขออนไลน์ นักวิศวกรความต้องการจะต้องมีความเข้าใจในเรื่องของการคำนวณ และขั้นตอนการคำนวณเป็นต้น) หากวิศวกรความต้องการไม่เข้าใจพื้นฐานแล้วก็ไม่สามารถสกัดความต้องการให้เป็นไปตามที่ผู้ใช้งานต้องการได้
เมื่อวิศวกรความต้องการรวบรวมความต้องการได้แล้วขั้นตอนต่อไปคือจะต้องทำเอกสารเพื่อเป็นแบบรับข้อตกลงสำหรับความต้องการของซอฟต์แวร์ เอกสารนี้จะระบุความต้องการทั้งหมด รวมถึงข้อความ สัญญา อื่นๆ เพื่อให้บริษัทผลิตซอฟต์แวร์กับผู้ใช้งาน(ในที่นี้อาจจะเป็นบริษัทผู้จ้างทำซอฟต์แวร์นั้นๆ) ได้ทำการตกลงกันถึงความต้องการของระบบว่าระบบจะเป็นอย่างไร สามารถทำอะไรได้บ้าง เพื่อมิให้มีการเพิ่มเติมความต้องการอื่นในขั้นตอนต่อไปของกระบวนการพัฒนาซอฟต์แวร์(ซึ่งผมจะกล่าวถึงในบทความต่อไปว่าทำไมขั้นตอนนี้ถึงได้สำคัญมาก)
จากที่ได้กล่าวไปแล้วทั้งหมดจะเห็นได้ว่าขั้นตอนการเก็บความต้องการนั้น ถือเป็นการกำหนดทิศทางของซอฟต์แวร์ รวมไปถึงกำหนดอนาคตของซอฟต์แวร์ว่าจะเป็นอย่างไร แน่นอนครับความผิดพลาดในการพัฒนาซอฟต์แวร์อาจจะเกิดขึ้นได้ แต่หากนักวิศวกรความต้องการสามารถสกัดความต้องการให้ได้ถูกต้องและตรงตามที่ลูกค้าต้องการมากที่สุด ความผิดพลาดในกระบวนการผลิตซอฟต์แวร์จะลดลงมากกว่า 40% เลยทีเดียวครับ?