소프트웨어 장인 - 프로페셔널리즘/실용주의/자부심: 요약(1)

9 minute read

스압주의 - 책 자체가 소프트웨어 장인 정신에 대한 요체를 서술하다보니 뺄 내용이 많지 않았다. 그래서 책 내용이 상당히 많다. 이는 책의 저자에게는 상당히 미안한 일이지만 나 자신을 위해서 요약 정리를 해두는 것이 좋다고 생각했다. 만약 이것이 무리가 있는 경우는 개인적으로만 보관하도록 하겠다는 것을 미리 밝힌다. 만약 이 글을 보더라도 개인적으로 책을 사서 읽어보고 개발자의 삶에 있어 지침서로 보관하기를 추천한다. 길더라도 탐독해주시기 바란다

이념과 태도

21세기의 소프트웨어 개발

“1부. 이념과 태도”는 21세기 들어 달라진 소프트웨어 개발에 대해서 먼저 논한다. 이전에는 남이 이해하기 어렵고 상당히 추상화된 코드를 작성하는 것이 개발 실력을 보여주는 척도였다. 하지만 요즘 고참 개발자 라고 함은 품질, 기술, 아키텍처, 요구사항 정리, 협업, 일정과 매니징, 채용, 사업, 영업까지 개발 뿐만 아니라 비지니스 전반까지 모두 관할하는 사람이 됨을 의미하고 있다. 즉 소프트웨어를 비지니스의 핵심 자산으로 만들어낼 수 있는 능력을 가진 사람을 고참 개발자라고 지칭할 수 있다. 이는 21세기 변화하는 산업의 환경과 연관이 있다. 급변하는 시장 환경으로 인해 요구사항의 변경은 잦아지고 있고, 여러 가지 기술을 복합적으로 사용하고 복수의 통합 포인트를 두고, 점진적이고 복합적으로 제품을 개발한다. 이렇기 때문에 개발자는 점점 더 많은 역할을 맡게 된다.

애자일

이런 환경에서 절차적으로 올바른 목표로 진행 중인지를 확인하면서, 기술적으로 목표한 것을 올바르게 실행하고 있는지를 강조하는 애자일(Agile) 이 출현하게 됐다. (애자일의 개념은 애자일 매니페스토, 애자일 매니페스토의 12가지 원칙에서 확인하자. 다들 개념을 알고 있어도 이 두 링크를 상세히 본 적은 없을 것이라 생각한다. 꼭 한 번 곱씹어 읽는 것을 추천한다.)

애자일은 짧은 피드백 루프를 만들어내는 것을 말한다. 이를 위해 동작하는 소프트웨어(혹은 결과물)으로 얘기를 하게 됨으써 관료제, 과도한 문서화, 섣부른 과잉설계(Big Design Up-Front: BDUF)의 오버헤드를 제거하고 변화를 내재 한다. 또한 이를 위해 각 팀원/조직의 역할을 계층/분업/세분화하던 방식이 사라지고 개발자가 비지니스와 고객 가치 창출 과정 모두에 직접 참여하는 것을 매우 중요해지고 있다. 즉 코드를 잘 작성하는 것은 소프트웨어 프로페셔널이 가져야 할 최소한의 요건이다. 이로 인해 오늘날에는 개발자에게 테스트, 분석, 비지니스에 대한 이해, 커뮤니케이션 능력, 보다 외향적인 성격을 새롭게 요구하고 있다.

하지만 애자일을 도입해서 많은 것을 개선시키고 변화시키고 있지만 좋은 소프트웨어를 빠르게 공급하지 못하고 있는 것이 현실이다. 왜 그럴까? 이는 부분적으로만 애자일로 전환했기 때문에, 즉 절차적으로만 애자일을 도입했기 때문이다. 소프트웨어 프로젝트에서 가장 중요한 결과물은 소프트웨어 자체이기 때문에 애자일은 기술적인 탁월함 을 전제한다. 결국 개발 역량이 부족한 구성원이 만드는 품질이 나쁜 제품은 애자일의 절차적인 방법론으로 해결이 불가능하다. 그래서 애자일의 절차적인 방법론을 도입하는 것과 동시에 개발자의 역량 향상에도 투자를 많이 해야 한다. 반대로 새로운 기술적 실행 관례에 대한 거부감 또한 문제가 된다. 이는 경험 많은 개발자가 실행과 강력한 교육으로 해결해야 한다.

소프트웨어 프로젝트를 바라보는 편협한 시각도 문제가 된다. 실제 사용자 목소리를 들을 수 없고, 비지니스 담당자와는 칸막이가 쳐 있으며, 빠르고 빈번한 피드백 루프도 없는 환경에서는 소프트웨어는 성공하기 어렵다. 그리고 기술을 이해하지 못하는 사람이 의사 결정을 하는 것은 프로젝트를 재앙으로 이끄는 지름길이다. 즉 역량 있는 소프트웨어 장인과의 협력읉 통해 의사 결정을 해나가야 한다. 반대로 소프트웨어 장인은 개발 뿐만 아니라 비지니스적인 이슈에 대해서도 이해하고 대안을 제시하고 피드백을 주고 건설적인 비판을 함으로써 목적을 달성할 수 있도록 도와야 한다.

즉 좋은 절차(애자일)와 기술적 탁월함(소프트웨어 장인 정신)이 동시에 있어야 소프트웨어 프로젝트는 성공으로 이끌 수 있다는 것이다. 그리고 제일 중요한 점은 어떤 문제가 있는지 재빨리 인식하고 대응하는 것이다.

소프트웨어 장인 정신

소프트웨어 장인 정신이란 흔히 아름다운 코드, 테스트 주도 개발, 종교 등이 아니다. 오히려 소프트웨어 개발자로서의 커리어를 밟아가면서 가지고 있어야 하는 마음가짐에 가깝다. 책에 나온 주관적인 정의를 그대로 옮겨본다.

소프트웨어 장인정신은 마스터가 되어가는 긴 여정이다. 소프트웨어 장인정신은 소프트웨어 개발자 스스로가 선택한 커리어에 책임감을 가지고 지속적으로 새로운 도구와 기술을 익히며 발전해나겠다는 마음가짐이다. 소프트웨어 장인정신은 책임감, 프로페셔널리즘, 실용주의 그리고 소프트웨어 개발자로서의 자부심을 의미한다.

좀더 자세히 서술하면 아래와 같다.

  1. 자신이 하는 일에 주인의식을 가지고 프로페셔널하게 행동하고
  2. 고객이 원하는 것이 무엇이든 달성할 수 있도록 돕는다.
  3. 다른 개발자들에게 배우고 자신의 지식을 나누며 경험이 부족한 개발자들을 멘토링하는 것이다.

사실 장인 이라는 단어에 논란이 많지만 실제로 중요한 것은 이 비유가 상징하고 장려하는 가치와 행동이다. 이러한 가치와 행동을 정의하기 위한 무수한 토론을 통해 소프트웨어 장인정신 매니페스토가 만들어졌다.

소프트웨어 장인을 열망하는 우리는, 스스로의 기술을 연마하고, 다른 사람들이 기술을 배울 수 있도록 도움으로써 프로페셔널 소프트웨어 개발의 수준을 높인다. 이러한 일을 하는 과정에서 우리는 다음과 같은 가치들을 추구한다.

  • 동작하는 소프트웨어뿐만 아니라, 정교하게 솜씨있게 만들어진 작품을,
  • 변화에 대응하는 것뿐만 아니라, 계속해서 가치를 더하는 것을,
  • 개별적으로 협력하는 것 뿐만 아니라, 프로페셔널 커뮤니티를 조성하는 것을,
  • 고객과 협업하는 것뿐만 아니라, 생산적인 동반자 관계를,

이 왼쪽의 항목을 추구하는 과정에서 오른쪽 항목이 꼭 필요함을 의미한다.

여기서 가장 중요한 말은 ‘프로페셔널 소프트웨어 개발의 수준을 높인다’ 이다. 이 매니페스토는 경험이 많고 재능 있는 개발자가 겪는 어려움, 추구하는 가치와 열망을 함께 담고 있다. 부실한 관리, 잘못 정의된 절차와 형편없는 코드 때문에 프로젝트가 실패하는 일은 없어야 한다. 매니페스토의 각각의 문장이 의미하는 바를 간단히 정리해봤다.

  • 동작하는 소프트웨어뿐만 아니라, 정교하게 솜씨있게 만들어진 작품을, - 단지 동작하는 소프트웨어가 아닌 시간이 지나도 이해하고 관리가 쉬운(테스트, 명료하고 단순한 설계, 비지니스 용어로 잘 기술된 코드) 소프트웨어를 만들어야 한다.
  • 변화에 대응하는 것뿐만 아니라, 계속해서 가치를 더하는 것을, - 소프트웨어 프로젝트는 기업으로서는 상당한 비용을 지불하게 한다. 당연히 이 투자는 회사의 이익과 직접적으로 연결된다. 하지만 계속 가치를 더 한다는 는 말은 비지니스적인 가치뿐만 아니라 코드 품질을 높여나가는 것을 말한다. 코드 품질을 높여가는 것은 소프트웨어의 빠른 변화를 대응을 가능하게 함으로써 가치의 잠재력을 높이는 것에도 있다. 이를 위해 좋은 소프트웨어 설계, 자동화된 테스트 기술, 그리고 열정적이고 재능있는 개발자가 핵심적이다.
  • 개별적으로 협력하는 것 뿐만 아니라, 프로페셔널 커뮤니티를 조성하는 것을, - 소프트웨어 장인 정신의 중심엔 멘토링과 공유 가 있다. 겸손하게 배우는 자세와 자신의 실패까지고 공유하여 다른 신입 개발자 뿐만 아니라 업계 전체를 앞으로 나아가게 할 책임이 있다.
  • 고객과 협업하는 것뿐만 아니라, 생산적인 동반자 관계를, - 파트너십과 프로페셔널한 행동을 계약 관계보다 상위에 둔다. 그러기 위해서는 적극적으로 프로젝트의 성공에 기여해야 한다. 요구사항에 질문하고 비지니스를 이해하고 개선사항을 제안하며 고객(또는 고용주)와 생산적인 동반자 관계를 맺어야 한다. 코드를 잘 작성하는 것은 꽤 중요하지만 프로젝트를 완성시킬 때 필요한 요소 중 하나일 뿐이다. 프로젝트를 성공으로 이끌기 위해 업무 절차 개선, 실현 가능성이 높은 선택지의 제공, 불필요한 관료주의 철폐, 비지니스 도메인 이해를 통한 요구사항 정하기, 업무 우선순위를 정하고 계획하는 것을 돕는 것도 포함된다. 생산적인 동반자 관계는 어떤 순간이든 고객에게 가치를 제공하는 것을 의미한다.

소프트웨어 장인의 태도

자신의 커리어의 주인은 자기 자신이다. 회사에서 교육을 시켜주면 좋겠지만 스스로의 커리어를 끊임없이 발전할 수 있게 해야 한다. 프로페셔널로 대우받기 원한다면 프로처럼 행동해야 한다. 마치 우리가 프로 스포츠 선수에게 바라듯 말이다. 스스로를 발전시키는데 자신의 돈과 시간을 들여야 한다. 수동적이 아닌 능동적으로 배워나가야 한다. 물론 배움의 기회를 주는 기업이라면 열정적인 개발자를 더욱 끌어들일 수 있다. 전통적인 상명하복 관리 방법은 창조적인 노동 형태에서는 잘 동작하지 않는다. 동반자적인 파트너십 을 기반으로 쌍방의 생산적인 동반자 관계가 되어야 한다. 그럼 앞에서 조금씩 언급을 했지만 소프트웨어 장인의 태도는 구체적으로 어때야 할까를 정리해봤다.

끊임없는 자기계발

독서, 많은 독서 를 하는 것은 중요하다. 특정 프로그래밍 언어, 프레임워크와 같은 특정 기술에 대한 서적 은 당면한 업무에 적합하지만 그 가치가 오래 가지 않는다. 특정 개념에 대한 서적 은 커리어를 전진시킬 때 필요한 기초를 쌓을 수 있는 책이다. 주로 새로운 개념, 패러다임 혹은 실행 관례를 소개한다. 주로 TDD(Test-Driven Development), DDD(Domain-Driven Development), 객체 지향 설계, 함수형 프로그래밍와 같은 한 차원 높은 개념이 있다. 이런 개념을 알아두면 새 기술을 배울 때 학습 시간이 줄어드는 효과가 있다. 또 행동 양식 에 대한 서적도 있다. (마치 이 책처럼) 효율적으로 팀에서 일할 수 있게 돕거나 일반적인 상황에서 더 나은 프로페셔널이 될 수 있도록 조언한다. 애자일 방법론, 소프트웨어 장인정신, 린 소프트웨어 개발, 심리학, 철학, 경영에 대한 책이 그렇다. 마지막으로 혁명적인 서적 또는 고전이 있다. 일하는 방식이나 개인의 가치관을 바꾸는 책이다. 특정 기술보다는 개념이나 행동 양식에 대한 책이 될 때가 대부분이다.1 커리어를 위해서라면 개념이나 행동양식에 대한 책에 더 관심을 두는 것이 좋다.

블로그 는 성공/실패담 경험적인 지식이 많이 모여있는 지식원이라고 할 수 있다. 하지만 지식이 체계적으로 모여있는 것이 아니기 때문에 경험이 없는 사람에게는 큰 도움이 되지 않을 수 있다. 반면 블로그를 작성함으로써 배움과 경험을 나누는 소프트웨어 장인 혹은 애자일 정신에도 부합하기도 한다.

기술 웹사이트 는 시장의 최신동향을 파악하기에 좋은 수단이다.

팔로우할 리더 찾기

어디나 그렇지만 특정 기술 혹은 일반적인 개념적, 행동양식적인 부분에 대한 리더 그룹이 있다. 이들이 어떤 방향으로 움직이지 알아두는 것이 좋다. 그런 방향을 이끌고 있는 배경을 이해하도록 해야 한다. 소셜미디어 는 이런 생각을 빠르게 팔로우업할 수 있는 도구가 된다.

끊임없는 훈련

일을 할 때의 방법은 그 실행 결과만큼이나 중요하다. 급여의 이유는 문제 해결 자체의 대가이지만 훈련할 때 그 문제를 어떻게 해결하는 지가 중요하다(지인의 경우, 공부는 집에서 하는거다라고 했다). 이런 방법을 능숙하게 하려면 훈련이 중요하다. 반복해서 하지 않으면 업무에 녹아나오지 않는다. 아래 훈련을 위한 방법을 소개한다.

카타 는 일본말로 “품세”라는 뜻으로 훈련용 코딩 과제이다. 같은 문제를 풀더라도 방법론(테크닉, 언어, 기술, 접근 방법)을 달리 해가면서 풀 수 있는 훈련용 코드를 말한다.

펫 프로젝트 는 대부분의 사람들이 큰 효과를 가져다주는 훈련법이다. 분명한 목적이 있고 결과물도 명확하니 동기를 잃지 않고 진행할 수 있기 때문이다. 또한 예산/일정 등과 같은 제약이 없기 때문에 원하는 훈련을 할 수 있는 좋은 환경이기도 하다. 그리고 문제 해결이 주요 목적이 아니기 때문에 적정 기술을 찾지 않아도 되고 사용하거나 훈련하고 싶은 특정 기술로 구성해도 된다. 그럼으로써 해당 기술이 어떤 문제를 해결하는데 좋은지를 판단해볼 수 있다. 추가적으로 펫 프로젝트를 진행하다보면 작업 관리, 자동화 배포, CI 등 다양한 기술을 시험해볼 수 있는 안전하고 훌륭한 테스트 베드가 된다. 심지어 기획, 비지니스 계획까지 세워볼 수도 있다. 어떤 것을 만들어보느냐에 대한 것이 거대한 장벽이지만 흥미를 가지고 열정적으로 할 수 있는 주제를 찾으면 된다. 이미 있거나 비슷한 것을 만들어도 된다.

오픈 소스 프로젝트에 기여하는 것은 누구나 알고 있다시피 좋은 훈련 방법이다. 이미 만들어져 있는 프로젝트라면 실행, 디버깅, 테스트 코드, 버그 수정, 문서 보강 등 작은 것부터 기여하는 방법도 있다. 펫 프로젝트에 비해 범위가 한정적이지만 훌륭한 개발자가 어떻게 일하는지를 코드 레벨에서 살펴볼 수 있는 기회이기도 하다.

페어 프로그래밍 은 팀의 정신적 에너지가 높아지고 개발자 간에 서로 좀더 친밀해질 수 있다. 사실 다들 약간의 두려움이 있지만 그 두려움을 이겨내면 빠른 서로간의 지식 공유와 시야 확장의 장점이 있다. 다름을 받아들이고 좋은 토론 기회로 삼아야 한다. 또한 이런 기회를 통해 자신의 개념을 좀더 정리할 수도 있다.

사회활동: 다른 개발자와 어울리기

소프트웨어 개발자는 내향적인 모범생이어도 된다는 것은 예전 이야기다. 아이디어를 주고 받고 페어 프로그래밍을 하고 사회적으로 교류할 수 있는 인적 네트워크를 형성하는 것은 성공적인 커리어를 위해 상당히 중요하다. 정보 공유 뿐만 아니라 정서적 만족감과 열정을 얻을 수 있다.

의도한 발견

소프트웨어 프로페셔널이 할 수 있는 최대의 실수는 자신이 모르는 것을 모른다고 받아들이지 않는 것이다. (이건 다른 영역도 마찬가지다.) 2단계 무지라고도 하고 최근 말로는 메타 인지라고도 한다. 개발자는 대부분 긍정적이고 낙관적이기 때문에 계획에 있어서 예측이 틀릴 가능성이 높다. 물론 개발 과정 중에 다양한 이슈가 튀어나오기 때문이기도 하다. 하지만 중요한 것은 이를 인지하고 영향을 최소화하도록 노력해야 한다. 프로젝트 초기에 생각 가능한 모든 측면에서 우리가 파악하지 못한 것을 찾아내기 위해 시간을 투자해야 한다. 무지의 수준을 최대한 빨리 낮추면 낮출수록 업무 생산성과 효율이 매우 높아진다. 이 뿐만 아니라 모든 무지라는 장애요소를 제거하는 것은 우선순위에서 높이 둬야 한다.

일과 삶의 균형 - 시간 만들기, 집중: 뽀모도로 기법, 균형

모두 알겠다. 그럼 이런 시간은 어떻게 낼까? 다들 시간이 없다고 한다. 하지만 항상 시간이 있다. 우리가 최적화 시키지 못할 뿐이다. 습관적으로 무의미하게 사용하는 시간을 줄이고 그 시간이라도 카페에 가서 자기 커리어에 투자해야 한다. 점심 시간도 하루나 이틀은 혼자만의 시간으로 이용할 수 있다. 간단한 식사를 가지고 주위 조용한 장소로 가자. 장소는 사무실이 아니면 좋다. 회사에 있다면 회사 일을 할 가능성이 높기 때문이다. 개발자 모임도 두 달에 한 번 정도 참석하는 것이 좋다. 나 혼자서는 보지 못한 것을 더 배울 수도 있다. 평소에도 일어난 시간, 잠들기 전 시간을 잘 이용해보고 이동 시간과 같은 자투리 시간에도 휴대용 기기를 통해 공부를 하자. 업무 외 시간을 잘 활용하려면 업무를 효율적으로 끝내는 것도 중요하다. 집중을 위해서는 뽀모도로 기법 등을 써보자. 이에 대한 자세한 방법은 직접 찾아보기를 바란다.이런 자기 계발이 싫다면 개발자의 길 말고 다른 길을 알아보는 것도 좋다. 그리고 프로페셔널로서의 삶이 건강해야 가족의 삶도 건강해진다. 이는 그동안 생각했던 것과 반대이긴 하지만 그 동안 이 영향을 간과하기도 한 것은 사실이다. 충분한 경제력과 커리어는 삶에 있어서도 좋은 영향을 준다.

- 요약 1부 끝 -

Reference

  1. 실용주의 프로그래머, The Mythical Man-Month, 디자인 패턴(GoF), 테스트 주도 개발, 익스트림 프로그래밍, 클린 코더, 소프트웨어 장인 정신, 리펙토링 등이 있다.