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