소프트웨어 장인
길벗, 2015
이 책에는 개인적인 일화와 현장 경험에서 비롯된 무게감있는 조언이 가득하다. 저절로 “맞아, 그랬었지. 그렇게 했었지.”라고 탄식하며 나와 크게 다르지 않은, 저자의 쓰디 쓴 경험들이 마음 한켠에 위로가 될 것이다. 아픔에 대한 책이기도 하다. 당신과 나 그리고 모든 프로그래머가 겪는 아픔을 생생하게 전달한다. 수준 이하로 일을 마무리했던 경험, 전혀 프로답지 않았던 경험, 더 나아지고 싶지만 어떻게 해야하는지 몰랐던 아픔 등에 관한 일화와 그 치유법을 담았다. - 로버트 C.마틴
낙담했다. 아니 사실 화가 났다. 나무르의 사무실을 나와서는 바로 계단을 내려가 건물 밖으로 나왔다. 도대체 그가 뭐길래 나에게 이런 말을 할 수 있나? 형편없는 사람이다! 그런 사람을 위해서는 일할 수는 없다. 이제 됐다. 이 회사와는 끝이다. 그만둘테다. 담배 몇 개비로 마음을 안정시킨 후 무슨일이 일어난 건지 되새겨보았다. 나무르는 1시간 넘게 나의 코드를 보면서 어떻게 하면 더 나은 코드를 만들 수 있는지 설명했다. 어떤 부분에서는 내 의견을 경청했고 틀린 점과 더 개선할 수 있는 방법을 이야기했다. 코딩을 시작한 이후 처음으로, 내게 시간을 들여 좋은 코드를 만드는 사람을 찾았다는 사실을 깨달았다. 다른 사람들이 성장할 수 있도록 진심으로 도와주는, 나보다 더 나은, 훨씬 다양한 경험이 있는누군가를 찾았다. 나를 가르치는데 기꺼이 시간을 투자하는 사람을 만났다. 무엇보다도 나의 첫 번째 멘토를 찾았다.
고참 개발자, 신참 개발자라는 것은 없다. 큰 규모의 기업용 자바 애플리케이션 개발에 경험이 많더라도 자바 스크립트로 게임을 만드는데는 생초보일 수 있다. 애자일 방법론을 채택하고 다수와 협력하여 일하는 방법에는 매우 익숙하더라도, 다단계 구조인 관료적/정치적인 조직에서는 신입사원과 별 다를 바 없을 수 있다.
코드를 잘 작성하는 것은 소프트웨어 프로페셔널이 가져야 할 최소한의 요건이다. 그에 더해 오늘날에는 테스트, 분석, 비즈니스에 대한 이해, 커뮤니케이션 능력, 보다 외향적인 성격을 소프트웨어 프로페셔널에게 요구한다.
애자일의 모든 절차들에는 기술적 탁월함이 전제되어 있다. 관리자들이나 역량이 부족한 애자일 코치들은 기술적 수준이 개선되어야 함을 자주 무시한다. 절차에만 집중하고 소프트웨어 개발을 공장 라인처럼 취급하면, 그저 시키는 일만 하고 출퇴근하는 공장 노동자와 다를 바 없는 개발자들만 생긴다. 이렇게 되면 비효율적인 피드백 시스템이 되어 전체 프로젝트에 해를 끼친다.
소프트웨어 장인정신에 대한 가장 흔한 오해는 장인정신만 있으면 애자일은 필요없고, 둘이 상호 배타적이라는 생각이다. 전혀 그렇지 않다. 둘은 상호 보완적이다.
소프트웨어 장인정신에 대해서 이야기하기 전에 소프트웨어 장인정신이 아닌 것들을 먼저 살펴보자.
- 아름다운 코드
- 테스트 주도 개발
- 스스로 조직화된 개발그룹
- 특정 기술 또는 방법론
- 자격인증
- 종교
소프트웨어 장인정신은 마스터가 되어가는 긴 여정이다. 소프트웨어 장인정신은 소프트웨어 개발자가 스스로가 선택한 커리어에 책임감을 가지고, 지속적으로 새로운 도구와 기술을 익히며 발전하겠다는 마음가짐이다. 소프트웨어 장인정신은 책임감, 프로페셔널리즘, 실용주의 그리고 소프트웨어 개발자로서의 자부심을 의미한다.
소프트트웨어 장인정신 매니페스토
소프트웨어 장인을 열망하는 우리는, 스스로의 기술을 연마하고, 다른 사람들이 기술을 배울 수 있도록 도움으로써 프로페셔널 소프트웨어 개발의 수준을 높인다. 이러한 일을 하는 과정에서 우리는 다음과 같은 가치들을 추구한다.동작하는 소프트웨어뿐만 아니라, 정교하고 솜씨있게 만들어진 작품을,
변화에 대응하는 것뿐만 아니라, 계속해서 가치를 더하는 것을,
개별적으로 협력하는 것뿐만 아니라, 프로페셔널 커뮤니티를 조성하는 것을,
고객과 협업하는 것뿐만 아니라, 생산적인 동반자 관계를,이 왼쪽의 항목들을 추구하는 과정에서, 오른쪽 항목들이 꼭 필요함을 의미한다.
소프트웨어 장인정신이 엘리트 주의라고 생각한다면 이는 소프트웨어 장인을 오해하는 것이다. 소프트웨어 장인은 항상 다른 사람에게 배우려하는 겸손한 사람이어야 하고 경험이 적은 개발자와 지식을 공유하기를 주저하지 않는 사람이어야 한다.
우리는 고용자, 비고용자 형태의 관계를 믿지 않는다. 계약서에 뭐라고 되어 있든 형식적인 문서일 뿐이다. 파트너십과 프로페셔널한 행동을 계약 관계보다 상위에 둔다. 소프트웨어 장인은 공장 노동자가 아니다. 적극적으로 프로젝트의 성공에 기여해야 한다. 요구사항에 질문하고, 비즈니스를 이해하고, 개선사항을 제안하며, 고객 또는 고용주와 생성적인 동반자 관계를 맺어야 한다.
소프트웨어 장인이 이런 마인드의 기업(공장 노동자)에서 일하려면 매우 고통스럽다. 우리가 도울 수 있도록 고객이 마음을 열어주면 얼마나 많은 도움이 될지 보여줌으로써 상황을 반전시키도록 최선을 다해야 한다. 기업들이 좋은 개발자를 바라듯이, 소프트웨어 장인도 일하기 좋은 기업을 원한다. 소프트웨어 장인이 스스로의 평판을 닦고 커리어를 완성해 나가는 데는 고객을 선별하는 능력이 뒷받침되어야 한다. 파트너십은 본디 쌍방향이다.
소프트웨어 프로페셔널로 대우받기를 원한다면 프로처럼 행동해야 한다. 이는 스스로를 발전시키는데 자신의 돈과 시간을 들여야 한다는 것이다. 나 자신의 커리어의 주체로서 언제, 무엇을 배울지를 스스로 결정해야 한다. 고객, 고용자를 도와줄 수 있는 위치에 있어야 한다. 자신이 일하는 회사가 새 지식을 가르쳐 주길 기대한다면 이는 프로페셔널 소프트웨어 개발자가 아니다. 개발자로 가장한 공장 노동자일 뿐이다.
소프트웨어 프로페셔널이 할 수 있는 최대의 실수는 자신이 모르는 것을 모른다고 받아들이지 않는 것이다. 모르고 있다는 것을 인지하지 못한 상태를 ‘2단계 무지’라고 한다. 아직 배울 내용이 많음을 인정하는 것은 성숙하다는 증거이고 마스터가 되기 위한 첫걸음이다.
무엇을 하든지 페이스를 유지하는 것이 중요하다. 일과 삶의 균형을 건강하기 유지하기가 어렵기는 하지만 가능하다. 아니다. 업무 외에는 아예 컴퓨터에 손을 대는 것조차 싫은 사람이라면 현재의 커리어를 다시 생각해보는 것이 좋다. 어쩌면 소프트웨어 개발자로서의 삶이 적성에 맞지 않을 가능성이 높다. 업무를 떠나서도 소프트웨어 개발이 취미인 개발자들이 많다. 개인 시간에 소프트웨어 개발을 연습하고 자기 계발을 하는 것이 상대적으로 쉽다.
어디로 가고 있는지 모르고 있다면, 결국 가고 싶지 않은 곳으로 간다 - 요기 베라
어디로 가고 싶은지 커리어의 방향을 확신할 수 없을 때는 모든 문을 열어보기 시작해야 한다. 우리에게 기회가 나타날 수 있는 상환들을 만들어낼 필요가 있다. 다른 세상으로부터 고립되어 집안이나 사무실에만 웅크려 있기만 하는데 제발로 찾아와 노크를 하고 기회를 가져다 줄 사람은 없다.
- 익숙하고 편한 것에서 벗어나 새로운 것을 공부하고 기술적 지식을 확장한다. 예를 들어 새로운 프로그래밍 언어나 기술들을 배운다.
- 지역 커뮤니티에 정기적으로 출석하거나 행사에 참여한다.
- 다른 개발자, 비즈니스 맨들과 교류한다.
- 새롭게 배운 것, 지금 하고 있는 것들에 대해 블로깅한다.
- 오픈 소스 프로젝트에 참여한다.
- 프로젝트를 만들고 공개한다.
- 컨퍼런스에 참석한다.
- 컨퍼런스에서 연사로 나선다.
돈은 충족되어야 할 기본 조건이고, 지식 노동자를 움직이는 것은 자율성, 통달, 목적의식 이렇게 세가지다 - 원동력 : 동기부여에 대한 놀라운 진실, 다니엘 핑크
역량이 더 높아질수록, 스스로에게 기쁨을 주는 일을 찾기가 쉬워진다. 좋은 일감을 얻을 수 있는 위치에 도달하려면 커리어의 개발 과정 중에 많은 집중과 결단력이 필요하다. 성공적인 커리어는 공짜로 오지 않는다. 스스로 만들어 나가야 한다. 특정 회사 안에서의 커리어보다 개인으로서 우리가 자신의 커리어가 항상 우선해야 한다. 물론 회사 안에서의 커리어가 개인의 커리어와 일치한다면 대단한 행운이지만 회사가 개인의 커리어를 통제하는 경우가 대부분이다. 일을 신중히 선택하고 고객들을 만족시켜 나가면, 소프트웨어 장이으로서 매우 성공적이고 즐거운 커리어를 만들 수 있다.
성숙한 채용 문화의 회사라면 단순히 고용자, 피고용자 관계가 아닌 파트너십을 기대한다. 우리가 하는 일에 대해서 여러 관점의 질문들을 던지고, 일하는 방식을 개선하여 목표를 성공적으로 달성하는데 기여하기를 원한다.
열정의 부재 자체가 열정적인 개발자들을 화나게 하는 것은 아니다. 열정적인 개발자들을 화나게 하는 것은 열정을 다해서 애플리케이션을 더 나아지게 하고 일하는 방식을 개선하려고 온갖 노력을 쏟는 동안 다른 개발자들이 그저 뒤에서 팔짱만 끼고 구경하거나 심지어 방해하는 것이 화가 날 뿐이다.
새로운 기술적 실행 관례나 도구를 도입하거나 그러한 것들에 대한 태도를 바꾸려할때 상사나 관리자를 설득하는 것보다 실무 개발자들을 설득하기가 훨씬 어려운 편이다. 상당수의 개발자들이 켄트 벡이 이야기한 ‘사춘기적 맹신’에 빠져 있다. (중략) 개발자, 관리자, 아키텍트들이 기술 변화를 이끌려면, 그런 맹신에 빠진 개발자를 어떻게 다루어야 하는지 알아야만 한다.
진정으로 당신을 둘러싼 것들을 바꾸고 싶다면 몇 가지 꼭 갖춰야 할 것 들이 있다. 가장 중요한 것은 용기다. 동료 개발자, 관리자, 기술 리더와 언성이 높아지는 논쟁을 두려워해서는 안된다. 의견 충돌이 없는 마음편한 대화만을 기대할 수는 없다. 싸울 준비가 되어 있어야 한다. 당신이 생각하는 내용이 어떤 것이든 말할 수 있는 용기가 있어야 한다.
경험이 쌓일수록 당신의 영향력은 커진다. 무지에 빠진 사람들을 눈을 뜨게 할 수 있다. 대중들은 당신 스스로 제대로 개념을 갖추었다고 인식하고 함께할만한 사람으로 여길 것이다. 냉소주의자들은 당신의 자신감과 깊은 지식들 앞에 힘을 못 쓸 것이다. (중략) 논쟁에서 지더라도 이전보다 더 많은 지식이 쌓일 것이기 때문에 더 나은 프로페셔널이 된다. 소프트웨어 장인에게 있어서 그런 상황은 상호 이득이다.
신중하게 싸울 곳을 정하라
“나에게 권한만 있다면 어느 누구의 방해도 받지 않고 내가 원하는 사람들로만 팀을 꾸려서 단기간에 조직을 바꿀 수 있을텐데…” 내가 일을 해오는 동안 이런 생각이 스칠 때가 많았다. 하지만 너무나 편협하고, 비효율적이고, 잠재적으로 스스로에게 해로운 생각이다. 무엇보다도, 그런 일은 절대 일어나지 않는다. 혼자서 모든 이슈와 조직 전체를 상대로 두고 싸울 수는 없다. 한 번에 한가지씩 신중하게 싸울 곳을 골라야 한다.
나의 상사를 어떻게 하면 설득할 수 있을까? 이에 대한 답은 ‘설득할 수 없다’이다. 용서를 구하는 것이 허락을 구하기보다 쉽다. 그냥 가서 하고 싶은 것을 하면 된다. 기술적 실행 관례라면 굳이 관리자가 관심을 가질 이유가 없다. 관리자들은 일정에 맞추어서 제품이 딜리버리되고, 예산을 지키고, 버그가 없는 것에 관심을 가질 뿐이다.
진정한 소프트웨어 프로페셔널은 권한에는 항상 책임이 따른다는 것을 이해하고 있다. 권한을 갖고 싶다면, 책임질 수 있는 준비를 해야 한다. 이미 책임이 주어져 있다면, 관련된 의사결정에 권한도 가질 수 있도록 해야 한다. 상아탑 아키텍트들은 그들의 커리어에 해를 입을까봐 자신의 의견에 책임지기를 두려워한다.
커리어 만들어 나가기
- 나의 커리어로부터 나는 무엇을 원하는가?
- 그것을 성취하기 위한 다음 단계는 무엇인가?
- 이 일은 나의 커리어 방향과 합치하는가?
- 내가 이 회사에 줄 수 있는 가치의 양은 얼마나 되는가?
- 그러한 투자에 대한 이익은 무엇인가?
- 그러한 투자는 대략적으로 얼마 동안 지속되어야 하는가?
- 내가 되고자 하는 프로페셔널에 이르는데 이 일은 어떻게 도움이 되는가?
- 이 일에서 나는 자율성, 통달, 목적의식을 가질 수 있나?
- 나의 고용주와 생상적인 동반자 관계를 맺을 수 있나? 양측 모두 가치를 얻고 행복할 수 있나?
소프트웨어 장인은 자신만의 사명이 있다. 더 나아지는데 집중하고, 계속해서 자신의 커리어에 투자하며, 배우고, 가르치고, 공유한다. 그가 맡은 고객에게 항상 가치를 전달할 수 있도록 해야 한다. 이러한 사명은 고객만을 위한 것은 아니다. 고객을 위한 가치 창출은 사명의 일부일 뿐이다. 소프트웨어 장인의 진정한 사명은 프로페셔널리즘, 열정, 관심으로 소프트웨어 산업의 수준을 높이는 것이다. 소프트웨어 장인은 그냥 일을 하기 위해 고용된 평범한 개발자가 아니다. 장인은 다른 개발자들이 더 나은 코드를 만들고 스스로가 하는 일에 자부심을 갖도록 돕는데 관심을 둔다. 최종적인 목표는 전 세계적으로 소프트웨어 프로젝트들의 품질과 성공 비율을 오늘날보다 높아지도록 하는 것이다. 소프트웨어 장인은 아침에 일어나서 출근하고 급여를 받는 것 이상을 생각한다. 소프트웨어 장인은 주변의 것들을 더 나아지게 하고 우리가 사는 세상을 변화시킬 것을 생각한다. 소프트웨어 장인이 된다는 것은 잘 짜여진 코드를 만드는 만드는 소프트웨어 개발자가 되는 것에서 훨씬 더 나아간다. 그것은 삶의 철학이다. 탁월함에 헌신하고, 탁월함의 추구를 본성처럼 만든다. 우리 사회의 진화를 이끄는 일에 무한한 자부심을 갖는다.