개발자들은 각각의 도메인분야의 개발영역이 있고, 주로 특정 도메인분야에 매진을 하는 편입니다.
안드로이드 개발자라면 안드로이드 앱을 개발할때 쓰이는 자바와, 안드로이드 API들
리눅스 커널 개발자라면 OS에 대한 지식과 디바이스 드라이버 개발 혹은 BSP 등
AI개발자라면 파이썬과 딥러닝분야에 대한 학습
서버개발자라면 Spring Framework 혹은 node js, 자바스크립트 등등
Domain에 따라 사용하는 주언어와 프레임워크, 학습분야 심지어 IDE종류도 천차만별로 달라지게됩니다.
심지어 한 평생 한 도메인에만 종사하는 개발자분들도 있으십니다.
과연 자기의 도메인에서만 쓰이는 것 만 열심히 갈고 닦는게 맞을까요?
물론 회사의 규모와 사정에 따라 한 도메인에 머물거나, 이곳저곳 다양한 도메인을
경험하는 개발자들이 있는것처럼 개인의 사정에 따라 모두 다르게됩니다.
그러나 현대 Software는 점차 빠르게 변화하면서
SW개발자들에게 다양한 Domain 분야 에서의 업무를 요구하는 추세입니다.
Domain분야가 바뀐다면 그때 그때마다 당장에 일을 하는데 있어서 필요한 분야를 Study 하며
따라가는게 중요합니다.
하지만, 전역적으로 Domain을 아우를 수 있는 그러한 SW 분야는 없을까요?
있습니다. 여기 제목에 쓰여져 있듯이 저는 알고리즘과 소프트웨어 공학이라고 생각합니다.
알고리즘
개발자가 알고리즘을 잘하면 무엇이 좋을까요?
우선 어떤 문제에 대해서 구현하는 것에 대해서는 막힘이 없게됩니다.
또한, 알고리즘 역량을 더 강화시키면, 성능을 최대한 끌어올릴 수 도 있게됩니다.
즉 요구사항이 주어질때 막힘없이 구현해내며, 성능을 최대한으로 끌어올려 최적화를 이루어낼 수 있습니다.
그렇지만 문제가있습니다.
개발자가 알고리즘역량만 발달되어 있어서 너무 구현과 성능에 치중한 나머지
간단하게는 코드가독성 부터하여 품질 중 변경용이성, 확장성 등을 놓칠 수 있게됩니다.
오히려 유지보수는 더 어려워지며 같이 일하는 동료들도 아무리 기똥찬 알고리즘이지만
이해를 못해서 생산성이 떨어지는 경우도 종종 발생하게 됩니다.
그렇기에 알고리즘역량 뿐만 아니라 아래의 소프트웨어공학 분야에 대한 역량역시 필요합니다.
소프트웨어 공학
알고리즘은 다들 무엇인지 아실겁니다. 다만 소프트웨어 공학에 대해서는 처음 들어보시는분들도 심지어 있으실 수 있습니다. 혹은 학창시절에 "소공은 들어선 안되는 과목이야" 라고 어디서 주워들어서 피하신분들도 있으실 수 있습니다 ^^;;
위키백과에서는 소프트웨어 공학을 아래와 같이 정의하고 있습니다.
-> 소프트웨어의 개발, 운용, 유지보수 등의 생명 주기 전반을 체계적이고 서술적이며 정량적으로 다루는 학문이다
아..역시 난해합니다 ㅡㅡ....제가 접하면서 느낀 소프트웨어 공학은, SW를 개발하고, 유지할때 필요한 학문들을 총괄하여 말하는 것 같습니다.
세부적인 분야로는 디자인 패턴, 요구공학, 테스트 프로그래밍, OOAD/UML, 리팩토링 등이 있습니다.
최종적으로 소프트웨어 공학의 학문들을 한번 Study해보시고 현업에 적용하시게되면 소프트웨어 아키텍트로 최종 거듭나실 수 있습니다.
소프트웨어공학분야를 접하게되는 순간, SW 개발할때 처음부터 끝까지 다 관여하실 수 있게 되거든요.
처음에는 Stake holder들과 미팅을 가지면서 요구사항들을 다 뽑아내고, 그들이 가장 우선시하는 품질들을 뽑아내어 기능 / 비기능 요구사항을 분리하여 정리합니다.
그 이후 설계에서는 어떤 디자인 패턴과 아키텍쳐를 사용할지 결정하고, 구현을 하게 됩니다.
구현 중간중간에서는 Code Quality를 높이기 위해 열심히 코드리뷰와 code metric을 이용하여 점수를 측정하고 올리기 위해 고민합니다.
또한 테스팅을 위해 어떤 프레임워크를 사용하며, 필수 테스팅 항목들을 뽑아내고 TC를 작성하다가,
잘못 작성된 구현코드를 다시 수정하는등의 활동도 하게됩니다.
SW가 최종 릴리즈가 되고나서도 유지보수 단계에서 리팩토링이 들어가면서 다시한번 가독성도 올리고 Side effect도 줄일 수 있도록 훌륭하게 바꾸는 활동도 할 수 있습니다.
다시 정리해보자면 구현능력을 올리기위해선 우선적으로 알고리즘 역량을 쌓는것이 맞습니다.
하지만 SW를 정식 출시하고 유지보수를 좀 더 잘하기 위해서는 소프트웨어공학 역량을 쌓으셔야 합니다.
이 두 가지 분야는 어느 Domain이든 통하기 때문에 학습해놓으시면 SW개발자로 일하시면서 심지어 관리자로 일할때도 도 계속해서 사용하 실 수 있을것입니다.
Youtube 영상링크