최근 프로젝트 관리에 대한 지식의 필요성을 많이 느꼈다.
그래서 어떻게 공부해야 할까 조언을 구하려고 채흥석 교수님께 메일을 보냈다.
안녕하십니까.
지난 학기 C++ 프로그래밍 강의를 들었던 양희철이라고 합니다.
지난 여름 많이 더웠는데, 그동안 건겅히 잘 지내셨는지요?
다름이 아니라 여쭈어 볼게 있어서 실례 무릎쓰고 이렇게 메일을 보냅니다.
1학기를 마치고 여름방학부터 마음 맞는 친구나 후배들과 프로젝트를 3~4개 정도 진행해 봤었습니다.
그런데 이상하게 모두 제대로 진행하지 못하였습니다.
모두 제가 관리와 주 프로그래밍을 하는 입장에서 했었는데, 번번히 실패를 해서
왜 제대로 되지 못할까하는 생각을 계속 해 보았습니다.
프로젝트마다 실패했던 요인은 여러가지였습니다.
사람들마다 프로그래밍 실력이 좋은사람도 있고 나쁜 사람도 있어서 어떤 일을 맡겨야 할지 몰라서 실패한 것도 있고
모듈을 나누어서 하는데 사람마다 분배가 제대로 안되어서 그런 것도 있고
애초에 개발 일정을 무리하게 잡아서 실패한 적도 있고
만들려고 하는 프로그램의 설계가 제대로 되지 못하여 실패한 것도 있었습니다.
이걸 해결할 수 있는 방법이 없을까 생각을 해보다가
제가 그동안 언어나 알고리즘 같은 쪽에서만 공부를 해오고 개발을 해도 혼자서 하였지
설계 방법이나 프로젝트 일정 계획 등을 공부한 적이 없고 그렇다고 여럿이서 같이 하는 프로젝트를 한 적도 없었습니다.
앞으로도 여러가지 단체 프로젝트를 계속 할 것인데, 이런 실수를 반복하지 않기 위해 뭔가 더 공부해야 한다는 생각이 들었습니다.
그래서 이런쪽을 공부하고 싶은데, 설계, 개발 방법론, 디자인 패턴 등등.. 여기 저기 책이나 인터넷을 찾아보고 있지만
뭐부터 시작해야 할지 감이 잘 안잡혀서 이렇게 교수님께 조언을 구하고자 메일을 보냅니다.
마땅히 먼저 연락드리고 찾아뵈어서 여쭈어 봐야 마땅하나 사정이 여의치 못해 이렇게 메일로 여쭙게 된 점 사과드립니다.
요즘 날씨가 많이 변덕스럽습니다. 건강 조심하시고, 곧 추석인데 좋은 한가위 되십시오.
2010.09.17
정보컴퓨터공학부 2학년 양희철 올림.
그리고 그 답변
양희철군 기억을 합니다.
양희철 군이 경험한 상황은 대규모/복잡한 소프트웨어를 여러 개발자가 함께 개발할 때 발생하는 전형적인 것들입니다.
여러분 같은 학생들뿐만 아니라, 전문적인 개발자 팀에서도 마찬가지로 겪는 상황입니다.
C++/Java 등의 언어를 이용한 코딩 기법이 아니라, 그런 상황을 극복할 수 있는 다른 기법들이 있고, 이러한 기법들은 모두 소프트웨어공학이라는 학문 분야에 해당됩니다.
3학년 2학기의 수업에서 아주 조금이나마 소프트웨어공학을 접할 수 있을 것입니다.
서점에 있는 소프트웨어공학 도서들은 다소 이론적이고 현실에 적용하기에는 너무나 설명이 피상적입니다. 마차 컴퓨터공학 개론과 같은 수준의 내용을 담고 있습니다. 그러니 소프트웨어 공학 도서는 당장은 큰 도움이 되지 않습니다.
우선 프로젝트의 실패(목표를 달성하지 못하는 모든 상황)의 원인을 구체적으로 나열해 보세요.
근본 원인에 따라서 다른 해결책이 있을 수 있습니다.
서로 다른 개발자의 능력은
1) 교육을 통하여 동일한 수준의 개발 능력을 갖추도록 한다.
2) 개발을 위한 표준적인 절차를 도입/강제화 한다.
3) 표준적인 코딩 스타일을 도입/강제화 한다.
등이 대표적인 방법입니다.
그리고 의사 소통의 문제는 대부분 기록/표현의 부정확성과 의사소통의 오해에 기인합니다.
마치 우리말/한글 등으로 표현/소통할 때의 문제점을 극복하려면 C++/Java 처럼 명확한 문법을 가진 언어를 이용해서 프로그램을 표현하고 토론해야 합니다.
C++/Java 등은 programming language이므로 설계 단계에서 사용하기에는 너무나 primitive/complex합니다.
UML을 도입해 보기 바랍니다. UML을 이용하면 설계 단계에서 class, algorithm 등을 명확하게 표현하고 모든 개발자들이 이해/검토하는 것이 가능합니다.
UML도 C++/Java 와 같은 언어(표현법)이지만, 도식(diagram)으로 되어 있고, 주로 설계 단계에서 사용된다는 점만 특별합니다.
GOF의 Design pattern 책을 보면 약간은 다르지만 UML 표현법이 사용되고 있습니다.
팀을 lead하기 위해서는 먼저 다양한 깊이 있는 지식이 필요합니다. 즉 본인이 어떤 것이 잘된 코도/시스템이고 어떻게 하는 것이 잘된 코드/시스템을 만드는 방법인 지를 알아야 합니다. 다음의 순으로 공부를 해 보기 바랍니다.
1) Refactoring by Martin Fowler
2) Design pattern by GoF
3) UML and Object-oriented Analysis/Design by Chae: 검색해 보면 제 이름의 책이 3권 있을 것입니다. 클래스.. 라는 책과 실전프로젝트(2009년)이 도움이 될 것입니다.
4) Software testing
5) Software requirement specification by Microsoft Press
1), 2), 5)는 연구실에 와서 대학원 선배들께 한번 물어 보기 바랍니다. 어떤 책인지.
모두 3학년 2학기에 소개는 되지만 수업 시간이 부족하다 보니, 아주 조금만 언급되어 그 중요성이 잘 전달되지 않습니다.
미리 공부해 두면 도움이 될 것입니다.
오타도 있는데, 수정하지 않았다.
잘 모르겠지만 뭔가 방향을 잡을 수 있을것 같다. 오늘 단번에 리팩토링 관련 책을 빌려서 읽고 있다.
대단한건 새벽 두시 반에 보냈는데, 답변이 온 시각이 세시 반 조금 안되어서였다. 그때까지 작업하고 계신건가..
아무튼 제대로 공부해 보자.