소프트웨어 공학 개요
소프트 웨어 공학이란
소프트웨어 공학(Software Enginieering)은 소프트웨어를 개발하는 데 있어서 어떻게(How) 개발할지 무엇을(What) 개발할지와 같은 방법, 도구, 이론을 모두 포함한 포괄적인 개념으로 개발에 들어가기에 앞서 기술적, 비 기술적인 부분들을 고려해 체계적으로 개발을 진행하고 개발 도중 생기는 문제를 해결하기 위한 학문이다.
이는 소프트웨어를 개발하는 데 있어서 필수적인 요소로 이를 고려하지 않고 무작정 개발을 시작하면 어느 순간 처음 생각했던 것과는 아예 다른 방향으로 흘러가고 있음을 깨닫게 되고 그때가 돼서야 깨닫고 되돌리려 하면 너무 많은 리소스가 필요하게 된다.
소프트웨어 공학의 목적
소프트웨어 공학의 목적은 질 좋은 소프트웨어를 만드는 것이다.
그렇다면 질좋은 소프트웨어를 만들어야 하는 이유는 무엇일까? 아무렇게나 만들어도 결국에 기능만 동작하면 되는 것 아닐까?
아쉽게도 그렇지가 않다.
왜냐하면 질나쁜 소프트웨어는 반드시 비용의 문제를 동반하기 때문이다.
현재 우리가 사용하는 PC의 비용은 하드웨어보다 소프트웨어에 대한 비용이 더욱 커지고 있다. 여기서 말하는 비용은 단순히 돈 뿐만 아니라 개인의 시간이나 노력 등과 같은 개발에 필요한 모든 것을 포함하는 의미다.
기술의 발전으로 다양한 분야와 장치에 이식되는 소프트웨어는 개발할 때의 비용보다도 이를 운용하고 유지, 보수할 때의 비용이 더욱 증가하고 있어며 결국 이와 같은 비용의 문제를 최소하하기 위해 효율적인 소프트 웨어를 개발하는 것이 소프트웨어 공학의 목적이다.
하지만 목적만 있으면 결코 그 목적에 도달할 수 없다.
목적에 도달하는 과정인 ‘어떻게’, 'How'가 중요하다.
코드는 보기 쉬워야한다.
우리가 코드를 작성할 때를 생각해보자.
코드가 한 번 제대로 돌아간 이후, 그 코드를 유심히 본 적이 있거나 유지보수를 한 적이 있었을까?
빠르게 기능을 구현해야한다는 생각에 우선 동작만 하는 얼기설기 엮인 코드 덩어리를 굴리다 보면 결국 그 틈 사이로 생각지도 못한 문제들이 비집고 들어오게 되는데 이미 그 때가 되어서 어디에 문제가 발생 한 것인지 찾기엔 너무 얽히고 꼬인 코드를 제대로 풀어내는 것조차 힘든 상황을 맞게 되는 것이다.
이는 문제를 해결하기 위한 시간과 노력을 증가시키게 되고 이것이 곧 비용의 증가인 것이다.
다음으로 일단 돌아가는데에 중점을 둔 코드를 누군가가 봤다고 해보자.
처음부터 다시 볼 생각을 하지 않고 짠 코드다. 나조차도 다시 보면 이해할 수 있을까 싶은 코드를 남이 본다면 그걸 이해할 수 있을까? 설령 이해할 수 있다 하더라도 많은 비용이 발생하게 될 것이다.
프로젝트의 볼륨이 커지게 되면 아무리 적게 잡아도 5명 이상이서 개발을 하게 될 때가 오게 된다.
이렇게 5명이 모여서 개발을 하는데 내 코드를 나머지 4명이 이해하기 어렵고 나 또한 나머지 4명의 코드를 이해하기 어렵다면 결국 5명이 개발 전에 나머지 4명의 코드를 해석하는 것에만 많은 시간과 노력을 소모해야한다.
그렇기에 협업하는 과정에서 남의 코드를 이해하는 과정이 생기게 되고, 코드를 빠르게 이해하기 위해서는 남이 보기 좋게 코드를 짜는 것이 중요하다.
좋은 소프트웨어가 가져야 할 특성
그렇다면 좋은 소프트웨어라는 것이 무엇이냐하면 딱 잘라 말하기는 애매모호하다. 상황에 따라서 속도가 빠른 소프트웨어가 좋을 수도 있고, 보안이 중요한 소프트웨어가 있을 것이기 때문이다.
하지만 적어도 이런 특성을 가져야 좋은 소프트웨어의 시작점이라고 할 수 있는 기준을 제시해보고자 한다. 이는 빠른 속도나 높은 보안능력과 같은 소프트웨어의 특성이 아니라 소프트웨어라면 가져야할 덕목과 같은 것이다 .
유지 가능성
소프트웨어는 변화하는 상황 속에서 고객의 요구사항에 맞춰 진화할 수 있어야한다. 유지보수가 쉬워야 한다는 것이다. 즉, 소프트웨어를 운용하고 필요에 따라 기능을 업데이트할 수 있어야 한다는 뜻이다.
신뢰성과 보안
소프트웨어의 신뢰성은 믿을 수 있는(reliablity) 것을 포함해 보안과 안전을 모두 일컫는다.
소프트웨어는 절대 물리적, 경제적 손해를 유발하면 안됩니다. 어떤 이벤트에 대해서 작동이 실패했을 때 (System failure)경제적, 물리적 손해를 주면 안된다는 뜻이다.
효율성
소프트웨어가 작동할 때 메모리나 프로세서와 같은 리소스를 사용하게 된다. 이 때, 리소스의 낭비를 유발해서는 안된다는 것이다.
처리 시간, 메모리 효율에 있어서 효율적으로 관리가 되어야 합니다. 이말은 곧 복잡도를 관리해야한다는 뜻이다. 단순한 과정도 복잡한 프로세스를 거치게 되면 처리 시간이 올라가고 메모리를 오래 점유하고 있게 된다.
접근 가능성
만들어진 소프트웨어를 아무도 사용하지 않으면 무용지물이다. 소프트웨어가 사람들에게 잘 알려서 사용자가 많아져도 너무 복잡하면 아무도 사용하지 않을 것이다.
그래서 개발된 소프트웨어는 반드시 이해할 수 있어야 하고 유용해야된다는 것이다.즉, 시스템과 유저가 양립할 수 있어야 한다. 사용하기 쉽고 다른 프로그램(혹은 환경들)과 충돌이 적은 소프트웨어를 뜻한다.
코더와 디벨로퍼
가끔 프로그래머들은 스스로를 코더와 디벨로퍼로 분류하곤 한다.
둘 다 프로그래머나 개발자가 아닌가 싶지만 둘에는 엄연한 차이가 있다고 한다.
흔히 개발을 건축에 비유하곤 한다.
다리를 만든다고 할 때, 사용자를 고려한 설계를 하고 설계대로 다리를 건설하는 사람과 그냥 사람이 건너갈 수만 있게 벽돌만 쌓는 사람이 있을 것이다.
여기서 전자가 디벨로퍼고 후자가 코더라고 할 수 있다.
다른 기술이 아닌 그저 벽돌을 올리는 것은 누구나 할 수 있다.
결국 우리는 그냥 벽돌을 무작정 쌓아 다리를 만드는 것이 아닌 누구나 쉽고 안전하게 이용할 수 있는 다리를 체계적으로 설계하는 디벨로퍼가 되기 위해 소프트웨어 공학을 공부해야 하는 것이다.