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

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

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

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

 วิศวกรรมซอฟต์แวร์ 

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

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

 วิชาชีพ 

ในบางสาขาอาชีพ ยกตัวอย่างเช่น ในรัฐออนตาริโอ ประเทศแคนาดา ใบอนุญาตของวิศวกรทางด้านซอฟต์แวร์ ในหลาย ๆ พื้นที่ในโลก ไม่มีกฎหมายควบคุมอาชีพวิศวกรทางด้านซอฟต์แวร์ แต่มีข้อกำหนดบางอย่างจาก สถาบันวิศวกรไฟฟ้าและอิเล็กทรอนิกส์ (Institute of Electrical and Electronics Engineers: IEEE) และสมาคมคอมพิวเตอร์ (ACM) ซึ่งเป็นองค์กรหลักในด้านวิศวกรรมซอฟต์แวร์ ใน IEEE ได้กำหนดแนวทางไว้ในองค์ความรู้ด้านวิศวกรรมซอฟต์แวร์เมื่อปี 2547 ได้กำหนดแนวทางและกำหนดกรอบความรู้ที่วิศวกรด้านซอฟต์แวร์ควรรู้ และยังกำหนดจรรยาบรรณของวิศวกรซอฟต์แวร์ และนอกจากนี้ IEEE ยังมีการตีพิมพ์พจนานุกรมว่าด้วยวิศวกรรมซอฟต์แวร์และวิศวกรรมระบบ

 การจ้างงาน 

ในปี 2004 ในสหรัฐ สำนักแรงงานสถิติ นับ 760840 ซอฟต์แวร์วิศวกร ถืองานในสหรัฐ; ในช่วงเวลาเดียวกันมีบาง 1.4 ล้านประกอบทำงานในสหรัฐในอื่น ๆ ทั้งหมดรวมวิศวกรรมฝึกหัด เนื่องจากความญาติเป็นความแปลกฟิลด์การศึกษาทางการศึกษาในวิศวกรรมซอฟต์แวร์ นั้นมักจะสอนเป็นส่วนหนึ่งของหลักสูตรด้านวิทยาศาสตร์คอมพิวเตอร์และเป็นผล มากที่สุดซอฟต์แวร์วิศวกรถือด้านวิทยาศาสตร์คอมพิวเตอร์องศา

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

มีความถกเถียงในอนาคตโอกาสการจ้างงานสำหรับวิศวกรและซอฟต์แวร์อื่น ๆ ไอที ผู้เชี่ยวชาญด้าน ตัวอย่างเช่นออนไลน์ล่วงหน้าตลาดที่เรียกว่า "อนาคตของ ITJOBS ไอทีงานในอเมริกา" พยายามตอบว่าจะมีเพิ่มเติมไอทีงานรวมทั้งซอฟต์แวร์วิศวกรในกว่า 2012 มีใน ค.ศ. 2002

 การรับรอง 
การรับรองวิชาชีพของ วิศวกรซอฟต์แวร์ ยังเป็นเรื่องโต้แย้งกันอยู่ บ้างก็เห็นว่าใบรับรองเป็นเครื่องมือสำหรับยกระดับหลักปฏิบัติของมืออาชีพ และ วัตถุประสงค์ของการให้ใบรับรองวิชาชีพวิศวกรซอฟต์แวร์ เป็นการปกป้องสาธารณะ
สมาคมคอมพิวเตอร์หรือ ACM มีการรับรองวิชาชีพในปี 1980 และถูกยกเลิกไปเนื่องจากขาดความสนใจ ACM ได้มีการตรวจสอบความเป็นไปได้ของการรับรองวิชาชีพ วิศวกรรมซอฟต์แวร์ในปี 1990 แต่ในที่สุดการรองดังกล่าวก็ถูกตัดสินว่าไม่เหมาะสมในเรื่องการรับรองวิชาชีพในอุตสาหกรรมของวิศวกรรมซอฟต์แวร์ ในปี 2006 สมาคม IEEE ได้มีการรับรองวิชาชีพซอฟต์แวร์เกิน 575 ราย ในประเทศแคนาดา Canadian Information Processing Society ได้สร้างกฎหมายที่รู้จักเพื่อรองรับอาชีพข้อมูลระบบผู้เชี่ยวชาญ สถาบันวิศวกรรม ซอฟต์แวร์ได้ให้การรับรองที่ระบุหัวข้อขึ้น เช่นความปลอดภัย การปรับปรุงกระบวนการของสถาปัตยกรรมซอฟต์แวร์ การรับรองโปรแกรมส่วนใหญ่ในอุตสาหกรรมไอทีเป็นการรับรองเชิงเฉพาะด้านเทคโนโลยี และมีการจัดการโดยผู้ขายเทคโนโลยีเหล่านี้ โปรแกรมเหล่านี้มีการรับรองที่เหมาะสมกับสถาบันที่จะว่าจ้างให้บุคคลที่ใช้กับเทคโนโลยีนั้น

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

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

 การศึกษา 
ความรู้ทางด้านการเขียนโปรแกรมคอมพิวเตอร์เป็นความรู้พื้นฐานสำหรับอาชีพของวิศวกรซอฟต์แวร์ แต่เท่านั้นยังไม่เพียงพอ ส่วนใหญ่วิศวกรซอฟต์แวร์มีวุฒิการศึกษาในสาขาวิทยาการคอมพิวเตอร์ เนื่องจากอดีตยังไม่ค่อยมีหลักสูตรการเรียนการสอนระดับอุดมศึกษาในสาขาวิศวกรรมซอฟต์แวร์ อย่างไรก็ตามได้มีการเริ่มมีหลักสูตรสาขาวิศวกรรมซอฟต์แวร์ เปิดสอนมากขึ้น โดยเฉพาะอย่างยิ่งระดับปริญญาโทและปริญญาเอก ในช่วงปี ค.ศ. 2001-2004 ได้คณะวิชาการกลุ่มหนึ่งได้พัฒนาหลักสูตรต้นแบบ  สำหรับวิศวกรรมซอฟต์แวร์ระดับปริญญาตรี เรียกว่า SE2004 เพื่อให้เป็นมาตรฐานสากล การพัฒนาหลักสูตรต้นแบบดังกล่าวได้รับการสนับสนุนจากสมาคม ACM และสมาคมคอมพิวเตอร์แห่ง IEEE

ในปี ค.ศ. 1998 มหาวิทยาลัยบัณฑิตศึกษาแห่งนาวาล (Naval Postgraduate School) ในสหรัฐ ได้ริเริ่มหลักสูตรปริญญาเอกสาขาวิศวกรรมซอฟต์แวร์เป็นครั้งแรกในโลก Steve McConnell ได้ให้ความเห็นว่า เป็นเพราะมหาวิทยาลัยส่วนใหญ่มีการเรียนการสอนวิทยาการคอมพิวเตอร์มากกว่าวิศวกรรมซอฟต์แวร์ จึงทำให้ขาดแคลนวิศวกรซอฟต์แวร์ที่แท้จริง ในปี ค.ศ. 2004 สมาคมคอมพิวเตอร์แห่ง IEEE ได้พัฒนา องค์ความรู้ สำหรับสาขาวิศวกรรมซอฟต์แวร์ หรือเรียกว่า Software Engineering Body of Knowledge จนได้รับการรับรองมาตรฐานสากล ISO (ISO/IEC TR 19759:2005) 

European Commission ภายในโปรแกรม Erasmus Mundus สำหรับนักศึกษาจากยุโรป และประเทศอื่น ๆ. นี่เป็นการร่วมกันของ4มหาวิทยาลัยในยุโรป 

 สาขาวิชาย่อย 
วิศวกรรมซอฟต์แวร์สามารถแบ่งออกไปได้อีก 10 สาขาวิชาย่อย คือ
 การวิเคราะห์ความต้องการของซอฟต์แวร์: การศึกษาวิเคราะห์ข้อกำหนดและข้อกำหนดสำหรับการตรวจสอบความถูกต้องของซอฟต์แวร์.
 การออกแบบซอฟต์แวร์: การออกแบบซอฟต์แวร์มักใช้เครื่องมือช่วยในการออกแบบ Computer-Aided Software Engineering (CASE) และใช้การออกแบบที่เป็นมาตรฐานที่เป็นที่ยอมรับโดยทั่วไปเช่น การออกแบบโดยใช้ภาษายูเอ็มแอล (UML) เป็นต้น
 การพัฒนาซอฟต์แวร์: การพัฒนาซอฟต์แวร์ด้วยภาษาการเขียนโปรแกรมคอมพิวเตอร์ต่าง ๆ
 การทดสอบซอฟต์แวร์: การทดสอบการทำงานของซอฟต์แวร์
 การบำรุงรักษาซอฟต์แวร์: ระบบซอฟต์แวร์ต่าง ๆ มักมีปัญหาหลาย ๆ อย่าง หลังจากพัฒนาเสร็จแล้วยังจำเป็นต้องมีการเพิ่มเติมเรื่อย ๆ เป็นเวลาอีกยาวนาน
 การจัดการการตั้งค่าซอฟต์แวร์: เนื่องจากซอฟต์แวร์เป็นระบบที่มีคววมซับซ้อนสูง การกำหนดค่า (เช่นการควบคุมเวอร์ชันและการควบคุมซอร์ซโค๊ด) ต้องได้รับการจัดการตามมาตรฐานและกรรมวิธีที่ถูกต้อง
 การจัดการวิศวกรรมซอฟต์แวร์: การบริหารจัดการระบบซอฟต์แวร์เรียนแบบมาจากการบริหารโครงการ แต่มีข้อแตกต่างกันเล็กน้อย ซึ่งจะพบแค่ในสาขาของซอฟต์แวร์
 กระบวนการพัฒนาซอฟต์แวร์: กระบวนการพัฒนาซอฟต์แวร์เป็นหัวข้อที่มีผู้พูดถึงเป็นอย่างมาก เช่น กระบวนการพัฒนาซอฟต์แวร์แบบเอจายล์  หรือ กระบวนการพัฒนาซอฟต์แวร์แบบน้ำตก (Waterfall)
 เครื่องมือในวิศวกรรมซอฟต์แวร์
 คุณภาพซอฟต์แวร์: การควบคุมคุณภาพซอฟต์แวร์ และการประกันคุณภาพให้กับการพัฒนาซอฟต์แวร์
 ซอฟต์แวร์ท้องถิ่น: เป็นหนึ่งสาขาของอุตสาหกรรมนี้ที่เกี่ยวกับภาษาท้องถิ่น