
ผมในฐานะวิศวกรรมซอฟต์แวร์อย่างเต็มตัว อยากจะมาเล่าให้น้องๆ หรือเพื่อนๆที่สนใจฟังว่าจริงๆแล้วไอ้วิศวกรรมซอฟต์แวร์เนี่ย มันคืออะไรกันแน่ เพราะในอดีตที่ผ่านมาทุกปีจะมีแต่คนมาถามโดยเฉพาะในช่วงก่อนเอ็นทรานซ์ เลยอยากจะเขียนให้กระจ่างไปเลยว่า...
- วิศวกรรมซอฟต์แวร์ (Software Engineer) คืออะไร
- แตกต่างจาก วิทยาศาสตร์คอมพิวเตอร์ (Computer Science) และ วิศวกรรมคอมพิวเตอร์ (Computer Engineer) อย่างไร
แต่ก่อนที่เราจะไปสู่คำตอบ มีหลายๆอย่างที่เราต้องรู้ ดังนั้นถ้าหากคุณคิดว่าอยากได้คำตอบ 3 ประโยคเพื่อตอบคำถามเหล่านี้ ผมบอกได้เลยว่าคุณไม่มีทางได้คำตอบหรอกจะ จะบอกห้ายยย :P
ความแตกต่างระหว่าง Computer Science, Computer Engineer และ Software Engineer
ก่อนที่จะเริ่มอยากบอกให้ชัดเจนว่า ความหมายของ 3 สิ่งนี้มีด้วยกัน 2 แบบ นั้นคือแบบที่มันควรจะเป็น กับแบบที่มันเป็นในโลกแห่งความเป็นจริง (ในไทย) ยกตัวอย่างง่ายๆเรียนเภสัชกรณ์มาจริงๆอาจจะมีเป้าหมายตอนแรกไว้ให้วิจัย และคิดค้นยาใหม่ๆ แต่ในความเป็นจริงก็มีหลายคนที่ไปอยู่ร้านขายยา หรือเป็นคนขายยาล๊อตใหญ่ๆให้กับโรงพยาบาลเป็นต้น กลับมาเรื่องของเรา ในแง่เดียวกันผมจะพูดถึงความหมายในทั้ง 2 แง่นี้โดยเริ่มจากในแง่ที่มันควรจะเป็นก่อน
ความเป็นมา
ในอดีตสมัยที่เราไม่มีคอมพิวเตอร์ใช้ สมัยนั้นมีแต่นักฟิสิกส์ นักคณิตศาสตร์ นักเคมี วิศวกรไฟฟ้า ก็ได้เกิดการคิดค้นเครื่องคอมพิวเตอร์ขึ้น (ประวัติศาสตร์ไม่ขอพูดถึงนะครับ จะไปกันใหญ่) โดยยุคนั้นผู้สร้างยุคแรกเกิดจากคน 2 กลุ่มหลักๆคือนักคณิตศาสตร์ และวิศวกรไฟฟ้า โดยหลักแล้ว คน 2 กลุ่มนี้ทำงานร่วมกันโดยที่เหล่านักคณิตศาสตร์นั้นมักจะเป็นผู้ทำวิจัยทฤษฏีทางคณิตศาสตร์ต่างๆ ที่ใช้ในทางคอมพิวเตอร์ แล้ววิศวกรไฟฟ้าก็เป็นผู้สร้างระบบ วงจรต่างๆในคอมพิวเตอร์นั้นขึ้นมา จะให้พูดง่ายๆก็ได้ว่านักคณิตศาสตร์คิดค้นวิจัยเรื่อง Software แล้ววิศวกรไฟฟ้าคิดค้นวิจัยเรื่อง Hardware แต่ว่า Software และ Hardware ในสมัยนั้นแน่นอนยังไม่ซับซ้อนเท่าในปัจจุบันโดยเฉพาะในทางด้าน Software และในสมัยนั้น Software ส่วนใหญ่นั้นมีไว้เพื่อการคำนวนทางวิทยาศาตร์ และทางการทหารทั้งสิ้น
เมื่อเทคโนโลยีนี้โตขึ้นเหล่านักคณิตศาสตร์ก็กลายมาเป็น Computer Scientist แล้ว วิศวกรไฟฟ้าก็แยกออกมาตั้งเป็น Computer Engineer โดยเช่นกัน
ความเปลี่ยนแปลง
ต่อมาในสมัยที่คอมพิวเตอร์เป็นอะไรที่แพร่หลายมากขึ้น และหน้าที่ของมันไม่ได้อยู่แค่การทำงานแค่อย่างใดอย่างนึงเพียงอย่างเดียว ในแง่ของ Software จากที่คอมพิวเตอร์เคยสร้างขึ้นมาทำหน้าที่ใดหน้าที่หนึ่งอย่างเดียว (คำนวน Projectile, ถอดรหัสทางทหาร, คำนวนสูตรทางวิทยาศาสตร์) แต่คอมพิวเตอร์มีการทำงานที่ทำได้หลายๆอย่างพร้อมกันมากขึ้น (ส่งข้อความ, พิมข้อความ, ปริ้นกระดาษ, จดข้อมูล, คิดเลข ) ในเครื่องเดียว ซึ่งส่งผลให้ทีมพัฒนาซอฟต์แวร์นั้นใหญ่ตามไปด้วย ปัญหาเหล่านี้จึงเกิดขึ้น
- ซอฟต์แวร์ถูกพัฒนาอย่างไม่เป็นระบบ การออกแบบที่ไม่ได้มาตรฐาน และไม่เป็นไปในทางเดียวกัน
- ซอฟต์แวร์ที่ซับซ้อน ส่งผลให้ทีมพัฒนาขนาดใหญ่ทำงานกันด้วยความยากลำบาง เนื่องจากซอฟต์แวร์เป็นสิ่งที่จับต้องไม่ได้ และยากต่อการสร้างความเข้าใจที่ตรงกันในกลุ่ม
ในขณะที่ Computer Science นั้นเชี่ยวชาญด้านการคำนวนเป็นหลัก และ Computer Engineer ก็เชี่ยวชาญทางด้านฮาร์ดแวร์เป็นหลัก Software Engineer จึงเกิดขึ้นเพื่อตอบปัญหาเหล่านี้โดยมีหน้าที่หลักๆด้วยกัน 2 ด้านคือ
- Design: การออกแบบโครงสร้างระบบซอฟต์แวร์ขนาดใหญ่ที่ซับซ้อนนี้ให้เป็นระบบ เพื่อง่ายต่อการเข้าใจ สร้าง และการดูแล
- Management: ด้านการจัดการ "คน" เพื่อให้การทำงานเป็นไปอย่างมีระบบที่แน่นอน และมีมาตรฐานที่ชัดเจน
ตัวอย่างหน้าที่ โปรแกรม Microsoft Word
Q: ใครเป็นคนสร้างเครื่องคอมพิวเตอร์ที่ใช้ในบ้าน
A: Computer Engineer
Q: ใครคิดวิธีตรวจหาคำผิด ในโปรแกรม
A: Computer Science
Q: ใครคิดวิธีการ Save ขนาดไฟล์ให้เล็กที่สุด เพื่อประหยัดพื้นที่
A: Computer Science
Q: ใครเป็นคนออกแบบโปรแรมโครงสร้างโปรแกรม
A: Software Engineer
Q: ใครเป็นคนดูแลการพัฒนาโปรแกรม จัดการสมาชิกในทีม
A: Software Engineer
ตัวอย่างหน้าที่ โปรแกรม Google Map
Q: ใครเป็นคนสร้างเครื่องคอมพิวเตอร์ในการคำนวน
A: Computer Engineer
Q: ใครคิดวิธีคำนวนเส้นทางจากกรุงเทพ ไปเชียงใหม่
A: Computer Science
Q: ใครเป็นคนออกแบบโปรแรมโครงสร้างโปรแกรม
A: Software Engineer
Q: ใครเป็นคนดูแลการพัฒนาโปรแกรม จัดการสมาชิกในทีม
A: Software Engineer