Programming ต่างกับ Software Engineering ยังไง?
เคยสงสัยกันไหมครับว่าทำไมในสายการเขียนโปรแกรม บางทีเราก็จะได้ยินผู้คนเรียกคนที่เขียนโปรแกรมว่า programmer ไม่ก็ software engineer ที่นี่มีคำตอบให้
TL;DR
programming เกี่ยวกับการสร้างโค้ดขึ้นมา ส่วน software engineering จะมองว่า programming เป็นส่วนหนึ่งของมัน และเสริมตรงที่ดูแลรักษาของที่สร้างจนกว่าจะสิ้นสุดอายุขัยของซอฟต์แวร์นั้น
differences between programming and software engineering
เพื่อแยกความแตกต่าง มี 3 ข้อที่ต้องคิดถึงคือ time, scale, และ trade-off
Consider of Time
Programming คือวิธีการสร้างซอฟต์แวร์ขึ้นมา
Software Engineer เหมือน programming และมีเรื่องที่เสริมเข้ามาคือจะให้ความกังวลว่าเมื่อเวลาผ่านไปแล้วระบบต้องการที่จะเปลี่ยน ระบบสามารถขยาย และยังคงประสิทธิภาพได้หรือเปล่า
ดังนั้นความแตกต่างคือ งาน programming จะโฟกัสที่ development ส่วนงาน software engineering จะโฟกัสที่ development, modification, และ maintenance
เพื่อให้เห็นผลกระทบของเวลาที่ชัดเจนขึ้น ลองดูคำถามนี้กัน
“คิดว่าโค้ดของเราจะอยู่ไปถึงเมื่อไรกัน”
เพื่อตอบคำถามนี้ลองจินตนาการถ้าเราจะต้องอยู่กับซอฟต์แวร์นั้นเป็นทศวรรษ (10 ปี)
ถ้าเป็นโค้ดที่อยู่ไม่นาน ก็น่าจะไม่มีผลกระทบเรื่องของเวลา
แต่ว่าโค้ดนั้นต้องอยู่กับเราไปอีกนาน การเปลี่ยนแปลงมักมีความสำคัญ เมื่อเวลาล่วงไป 10 ปี ซอฟต์แวร์เราต้องอัปเกรด library ไหมนะ? หรือภาษามีเวอร์ชันที่ใหม่ขึ้น?
Sustainable
ความยั่งยืน? เมื่อซอฟต์แวร์มีอายุมากขึ้น เราสามารถตอบสนองต่อการเปลี่ยนแปลงที่จะเกิดขึ้นได้หรือเปล่า? ทั้งเหตุผลเชิงของ technical และ business มองตรงที่ซอฟต์แวร์ของเรามีความสามารถที่จะเปลี่ยนไหม? ยังไม่ได้มองถึงว่าจะต้องเปลี่ยนจริง ๆ อาจจะด้วย สิ่งนั้นยังไม่มีคุณค่าพอที่จะเปลี่ยนหรือด้วยว่างานนั้นมีลำดับสำคัญน้อย
เมื่อไรก็ตามที่ซอฟต์แวร์นั้น ไม่มีความสามารถที่จะเปลี่ยนแปลง อาจจะหมายถึง เรากำลังอยู่บนความเสี่ยง และกำลังเดิมพันว่าการเปลี่ยนแปลงนั้นจะไม่มาถึง ถ้าซอฟต์แวร์นั้นเป็นสิ่งที่ใช้ในช่วงสั้น ๆ การเดิมพันนั้นก็อาจจะปลอดภัย แต่ถ้าต้องอยู่ไปเป็น 10 ปี ก็อาจจะไม่…
Consider of Scale
เราต้องทำงานกับคนกี่คนกัน? งาน programming ส่วนใหญ่มักจะถูกสร้างด้วยคน 1 คน แต่งานของ software engineering จะเป็นความร่วมมือกันของทีม
มีบางคนพยายามนิยาม software engineering ว่า “The multiperson development of multiversion programs.” — การพัฒนาโปแกรมแบบหลายเวอร์ชันที่ใช้หลายคนในการพัฒนา
ในโครงสร้างทีม, ผลิตผลของโปรเจกต์, นโยบายและแนวปฏิบัติ ของซอฟต์แวร์โปรเจกต์ล้วนถูกมองว่าเป็นความซับซ้อนของ software engineering ปัญหาที่ว่าก็เป็นส่วนหนึ่งของเรื่อง scale เช่นกัน
เมื่อองค์กรโตขึ้นและโปรเจกต์ขยับขยายออกไป ประสิทธิภาพในการพัฒนาซอฟต์แวร์จะมากขึ้นไหม? กระบวนการพัฒนาของพวกเรามีประสิทธิภาพมากขึ้นหรือเปล่า? แนวทางการใช้ version control และกลยุทธ์ในการทำการทดสอบเหมาะกับการเติบโตของคนและโค้ดที่เพิ่มขึ้นไหม? ปัญหาเรื่องการ scale มองไปถึงเรื่องการสื่อสารและการขยายคน สิ่งเหล่านี้ถูกพูดถึงในวันแรก ๆ ของ software engineering หรือเปล่า? เราเสียเงินเสียเวลาไปเท่าไร? กับการทำสิ่งที่ต้องทำซ้ำ ๆ
Consider of Trade-offs
ซอฟต์แวร์ถือว่ามีความซับซ้อนมากในการตัดสินใจ การตัดสินใจบางทีก็เหมือนกับเดิมพัน แลกกับเวลาและทรัพยากรที่ค่อนข้างสูง
ดังนั้นในทาง software engineering เรามักจะต้องประเมิน trade-off ระหว่างทางเลือกต่าง ๆ ที่จะไป ไม่ว่าจะเลือกภาษาโปรแกรมมิ่ง เลือกเฟรมเวิร์ก ว่าเราถ้าเราเลือกสิ่งนั้นจะได้ประโยชน์อะไร ไม่ได้อะไร หรือเสียประโยชน์อะไรไปบ้าง บางครั้งก็มีการเดิมพันที่สูงและบ่อยครั้งที่ดูไม่ครบองค์ประกอบ งานของ software engineer คือช่วยมององค์ประกอบที่เป็นไปได้เพื่อความยั่งยืนและการบริหารจัดการ ของการเติบโตขยับขยาย ของทั้งองค์กร ผลิตภัณฑ์ และกระบวนการพัฒนา
สุดท้ายไม่ได้หมายความว่า software engineering จะดีกว่า programming เสมอ เพียงแต่ problem domain ที่จะไปแก้ปัญหานั้นต่างกัน การนำไปใช้ให้เหมาะกับบริบทจึงสำคัญกว่า เช่น หากเราเอา software engineering ไปแก้ปัญหาที่เป็น programming ก็อาจมองว่า over engineer ก็เป็นได้..
อ้างอิงจาก https://abseil.io/resources/swe-book/html/ch01.html