[BOOK] 소프트웨어 장인 – 산드로 만쿠소 지음 / 권오인 옮김
![[BOOK] The Software Craftsman](https://yujaewook.files.wordpress.com/2020/08/2019-10-08-20.19.19.jpg?w=300&h=300)
부제: “프로페셔널리즘, 실용주의, 자부심”
사내 개발자 필독도서 시리즈 – 1편
많은 팀과 개발자들이 같은 코드 베이스에서 아주 큰 시스템을 만들고 있습니다.
모든 개발자들이 이런 식으로 으스대려고 난해한 코드를 만들면 코드를 이해하기가 얼마나 어려워질지 생각해봤나요? 수천 라인, 아니 수백만 라인의 코드가 이런 식이라고 상상해보세요.
일을 하는 것도 중요하지만 그에 못지 않게, 일을 어떻게 하느냐도 중요합니다.
‘아는 만큼 보인다.’ 어느 분야에서나 마찬가지. 개발자의 세상에서도 아는 만큼 보인다. 탁월한 개발자가 되려면 어떻게 해야할까? 정답이 있는 것은 아니지만 누군가는 정리해 두었다. 감사히 읽어보자.
정체된 개발자 역량, 낮은 수준의 동기부여, 잔뜩 쌓여 있는 기술적 부채, 기술적 전문성 부족, 신뢰할 수 없는 릴리즈 절차, 불안정한 시스템, 늦은 버그 발견, 신뢰할 수 없는 데다가 비싼 테스트, 비효율적인 개발/디버깅/배포 주기, 오래 걸리는 빌드, 난해한 요구사항 등이 여전히 존재한다.
- 코딩이 직업인 사람이 동작하는 코드를 만드는 건 기본이예요.
- 장기적인 예측과 계획은 시간 앞에 허망하게 빗나갈 때가 많았다.
- 코딩에서 손을 뗀 기간이 길면 길수록 다시 손에 익히기가 어려워진다.
- 정리하면 커리어 패스를 정할 때는 내가 열정이 있는 것, 진정 즐겁게 할 수 있는 것을 따라야 한다는 것이다.
- 10년 동안, 다른 프로젝트, 다른 기술, 다른 회사에서 일한 것과 10년 동안 같은 회사, 같은 프로젝트, 같은 사람, 같은 기술로만 일한 것은 크게 다르다.
- 수평적인 조직 구조와 스스로 동기가 부여된 재능있는 개발자로 구성된 프로젝트가 새로운 표준으로 자리잡고 있다.
- 애자일에서는 프로젝트 시작 첫 주부터 동작하는 소프트웨어를 만든다.
- 팀원들의 역할이 계층적, 분업적, 세부적으로 배분되던 과거의 방식은 이제 사라지고 있다.
- 정보를 전달하는 가장 효율적이고 효과적인 방법은 얼굴을 마주보고 대화하는 것
- 애자일의 모든 절차들에는 기술적 탁월함이 전제되어 있다.
- 기술을 이해하지 못하는 사람들이 의사 결정을 하는 것은 프로젝트를 재앙으로 이끄는 지름길이다.
- 소프트웨어 장인정신은 소프트웨어를 일종의 공예 작품으로 보아 소프트웨어 개발자를 중세의 대장장이에 비유한다.
- 스스로가 선택한 커리어에 책임감을 가지고, 지속적으로 새로운 도구와 기술을 익히며 발전하겠다.
- 매니페스토의 핵심은 부제, ‘프로페셔널 소프트웨어 개발의 수준을 높인다’에 있다.
- 높은 커버리지에 신뢰할 수 있는 테스트가 가능해야 하고, 명료하고 단순한 디자인과 비즈니스 용어로 잘 기술된 코드여야 한다.
- 소스 코드는 예측가능하고 유지보수될 수 있는 상태여야 한다.
- 소프트웨어가 나이를 먹고 덩치가 점점 커지고 있다면 동시에 우리는 기업의 이익도 늘어나게 해야 한다.
- 소프트웨어 장인정신의 중심에는 멘토링과 공유가 있다.
- 훌륭한 개발자는 더 뛰어난 개발자와 일하고 싶어 한다. 훌륭한 개발자는 뛰어난 기업에서 일하기를 갈망한다.
- 코드와 관련된 일이 아니면 나의 일이 아니라고 생각하는 개발자는 진정한 소프트웨어 장인이라고 할 수 없다.
- 고참 개발자, 신참 개발자라는 것은 없다.
- 소프트웨어 개발자가 소프트웨어 개발 업무만 하면 되던 시절은 지나갔다.
- 애자일 원칙의 절차적인 부분들은 팀에 정말로 중요한 것, 비즈니스에 가치가 있는 것에 집중한다.
- 기술적 탁월함의 개선 없이 절차만 개선하는 것은 무의미하다.
- 소프트웨어 장인정신은 시켜야만 일하는 역량 미달의 노동자가 아니라 소프트웨어 프로페셔널의 수준을 높여, 프로의 모습으로 일하는 소프트웨어를 개발자를 지향한다.
- 소프트웨어 장인은 항상 다른 사람에게 배우려 하는 겸손한 사람이어야 하고 경험이 적은 개발자와 지식을 공유하기를 주저하지 않는 사람이어야 한다.
- 소프트웨어 장인정신은, 항상 최선을 다하고 고객에게 좋은 서비스를 제공하려는 개발자에 관한 이야기다.
- 소프트웨어 장인정신은 프로페셔널 개발자들이 수용하고 있는 마음가짐이자 삶의 자세다. 소프트웨어 장인은 소프트웨어와 함께 살고 숨쉰다. 그들은 소프트웨어를 장인의 작품으로 여기며 자신의 기술을 마스터하기 위해 모든 노력을 기울인다.
- 소프트웨어 장인이라면 스스로가 만든 것에 애정과 자부심을 가져야 함은 매우 기본이다.
- 소프트웨어 프로페셔널로 대우받기를 원한다면 프로처럼 행동해야 한다.
- 소프트웨어 프로페셔널은 여러 업무 중에서도 비즈니스에 기여하고, 해결책에 옵션을 제공하고, 우리가 개발하는 소프트웨어의 기술, 품질, 구현에 최상의 서비스를 제공해야 한다.
- 블로그는 우리의 배움과 자기계발에 대한 기록의 장으로 두는 게 좋다.
- 훈련을 통해 우리가 익숙하지 못한 새로운 테크닉이나 기술에 능숙해지려고 코딩 카타를 하는 것이다.
- 내게 있어 최고의 자가 학습, 자가 훈련 방법은 펫(Pet) 프로젝트다. 펫 프로젝트는 취미생활과도 비슷한 나만의 소프트웨어 프로젝트다
- 항상 전체적인 그림을 생각해야 한다.
- 페어 프로그래밍을 함께 해본 적이 없는 사람에게 완전히 새로운 문제 해결 방식을 접할 가능성이 훨씬 높다.
- 열정적인 개발자들은 항상 배우려 하고 그들이 아는 것을 공유하려 하기 때문에 그들과 어울리는 것은 대단히 좋은 일이다.
- ‘무지’라는 장애요소를 제거하는 것은 우선순위에서 높이 두어야 한다.
- 배움과 훈련이 멈추는 순간 우리의 커리어도 멈춰버린다.
- 훌륭한 관리자는 현재 프로젝트 상태가 어떠한지 명확하게 이해하고 주어진 일정 동안 무엇을 할 수 있을지 개발자들과 함께 추산 가능해야 한다.
- 소프트웨어 프로젝트에는 소스 코드 그 자체만큼 중요한 것은 없다.
- 오래 방치할수록 다시 보고 즐길 수 있는 상태로 되돌리는 데 더 많은 수고가 필요하다.
- 코드의 품질을 돌보아야 하는 책임은 바로 개발자에게 있다.
- 우리 업계는 이제서야 코드의 품질이 프로젝트의 성공을 보증하지는 못하더라도 실패의 핵심 요인이 될 수 있다는 것을 배우고 있다.
- 빨리 하는 것과 허술한 것은 다르다.
- 테스터가 버그를 발견하는 것은 개발자로서 대단히 수치스러운 일이다.
- 기능 구현이 완료되었다고 할 수 있으려면 반드시 테스트까지 되어야 한다.
- 항상 프로젝트에 다른 사람들도 있다는 사실을 인식하고 전체 프로젝트에 미치는 영향을 감안하여 책임있게 행동해야 한다.
- 보이스카웃 규칙 ‘처음 발견했을 때보다 더 깨끗하게’를 지속적으로 적용해야 한다.
- 즐겁게 일하는 것은 좋지만 항상 우리가 대가를 지불받고 있는 프로페셔널이라는 사실을 잊지 않고 고객이 비즈니스 목적을 달성토록 주의를 기울여야 한다.
- XP 실행 관례에는 테스트 주도 개발(TDD), 페어 프로그래밍, 리펙토링, 단순한 디자인, 지속적인 통합 등이 있다.
- TDD의 이름 자체에 ‘테스트’가 들어 있기는 있지만 사실 TDD는 설계에 대한 실행 관례다.
- 가장 훌륭한 테스터는 자동화된 테스트를 개발하여 개발자를 돕고 비즈니스 분석가와 제품 오너가 사용자 시나리오에 따른 제품의 적합 기준을 정의하는 데 도움을 주는 사람이다.
- 실용주의는 소프트웨어 장인이 가져야 하는 최선의 역량 중 하나다.
- 소프트웨어 장인으로서, 우리의 일에 항상 최선의 기술, 도구, 절차, 방법론 그리고 실행 관례를 선택할 수 있도록 개방적인 사고 방식을 가져야 한다.
- 개발자들은 그들이 배우고 싶은 것을 따라서 일을 선택한다.
- 직설적으로 말하면 역량이 부족한 사람들만이 일자리 걱정을 한다.
- 소프트웨어 장인은 자신의 커리어 방향과 일치하는 경우에만 회사 안의 커리어를 수용한다.
- 훌륭한 개발자를 유인하려면 먼저 채용 공고의 직무 요건을 바로잡아야 한다.
- 문제는 채용 과정이고 그것에 권한과 책임이 있는 사람이 문제다.
- 직무에서 무엇을 책임져야 하는지 설명하는 것이 훨씬 낫다.
- 개발자들은 그들이 빛날 수 있는 기회와 재미난 일거리를 많이 제공해 줄 회사를 찾는다.
- 열정은 기술적인 역량이나 프로그래밍 언어에 대한 이해보다도 더 중요한 조건이었다. 나는 항상 새로운 것을 시도하고, 배우고, 지식을 공유하고, 커뮤니티 활동에 적극적인 사람을 원했다.
- 좋은 면접은 자유 토론과도 같아야 한다.
- 좋은 개발자는 나쁜 개발자를 채용하지 않는다. 좋은 개발자는 그들 자신보다도 더 훌륭한 개발자를 찾으려 노력한다. 좋은 개발자는 훌륭한 팀을 구성하는 것이 얼마나 중요한지 잘 알고 있다.
- 금전적인 보상 수준보다도 자율성, 배움, 목적, 생산적 파트너십, 열정적인 사람들, 좋은 업무 환경과 같은 것들을 더 우선해서 따진다.
- 항상 그렇지만 상황이 안 좋아지면 제일 먼저 가장 능력 있는 개발자들이 떠나간다.
- 기존 개발자들에게 자극을 주고 동기를 부여하는 데 가장 효과적인 방법은 외부로부터 소프트웨어 장인을 수혈받는 것이다.
- 소프트웨어 장인은 항상 소프트웨어에 대해서 이야기하고 자신의 자기계발 활동을 다른 사람들과 공유하려 한다.
- 개발자에게 동기를 부여할 수 있는 최선의 사람은 바로 동료 개발자다.
- 언제, 무엇을, 어떻게 배울지 개발자들 스스로 정하게 내버려 두자.
- 젊은 개발자들은 업계에 발을 들이는 순간부터 그들의 선배가 만들어 놓은 불필요하게 복잡하고 엉망인 코드들을 상대해야 한다.
- 열정적인 개발자들은 새로운 아이디어, 기술, 테크닉으로 놀 수 있는 놀이터를 좋아한다.
- 팀에 열정을 불어 넣고 더 나은 일하는 방법을 추구하도록 하는 가장 효율적인 방법은 스스로 모범을 보이는 것이다.
- 무언가 일을 올바르게 할 시간은 없지만 똑같은 일을 계속해서 반복할 시간은 있다.
- 기술 관리자들이 소프트웨어 개발 스킬 때문에 승진한 경우는 극히 드물다.
- 정직함과 투명함은 소프트웨어 장인이라면 반드시 가져야 할 핵심 가치다.
- 자기가 하는 말이 무엇인지 스스로도 제대로 모르면서 다른 사람을 설득할 수는 없다.
- 새로운 기술을 제안하기 전에, 본인 스스로 충분히 이해해야 한다.
- 용서를 구하는 것이 허락을 구하기보다 쉽다.
- 무슨 일을 하든 고객에게 가치를 전달해야 한다.
- 개발자는 습관대로 하려는 편이고 자기 주관이 뚜렷한 경우가 대부분이다. 그냥 가서 해보자고 말한다고 순순히 따라오지는 않는다. 실행 관례를 전파하는 가장 효율적인 방법은 모범을 보이는 것이다.
- 커뮤니케이션을 상대방의 수준에 맞게 잘 하는 것도 중요하다.
- 무언가를 더 나아지게 만드는 데 목적을 두어야 한다.
- 열정을 공유하고, 모범을 보임으로써 사람들을 이끌고, 정직하고 투명해야 한다.
- 진정한 소프트웨어 프로페셔널은 권한에는 항상 책임이 따른다는 것을 이해하고 있다.
- 쓰레기 더미가 굴러 점점 커지면 싼 것이 더 이상 싸지 않게 된다.
- 현실적으로 시간과 돈은 마음대로 늘릴 수 있는 것이 아니다.
- 무엇이든지 새로운 것을 배울 때는 시간이 걸리는 점이 문제다.
- 레거시 코드를 대상으로 작업할 때는 최소한 수정한 부분만큼은 원래 보다 깨끗하게 만들어 놓아야 한다.
- 소프트웨어 장인은 여러 가지 훌륭한 도구들을 포용하면서 맡은 일의 맥락에 가장 적합한 것을 꺼내어 적용할 수 있어야 한다.
- 프로젝트는 한두 명의 슈퍼 개발자를 위한 것이 아니다. 프로젝트를 수행한 사람들이 떠나간 후 그것을 유지보수할 사람들을 고려해야만 한다.
- 비범한 개발자는 요구사항을 충족하는 가장 단순한 코드를 만들어 경험이 적은 개발자가 이해하는 데 아무런 문제가 없도록 한다.
- 실용주의가 없는 장인정신은 장인정신이 아니다. 장인이 가장 중요하게 초점을 맞추는 것은 고객의 만족이다.
- 고객이 소프트웨어 프로젝트를 통해 무엇을 성취하려 하는지 반드시 이해해야 한다.
- 품질은 비싼 것이 아니다. 스킬 부족이 잘 작성된 코드를 비싼 것으로 만드는 원인이다.
- 소프트웨어 개발자들은 우리가 살고 있는 세상이 진화해 나가는 데 꼭 필요한 존재다.
- 열정. 이 단어 하나가 모든 것을 요약한다.
- 정직과 용기는 소프트웨어 장인이 갖추어야 할 핵심적인 자질이다.
- 훌륭한 관리자나 아키텍트가 되는 데 필요한 스킬과 훌륭한 개발자가 되기 위한 스킬이 꼭 서로 같을 수는 없다.
- 관리자나 아키텍트가 되는 개발자는 소프트웨어 개발 직능의 사다리를 오른 것이 아니라 사다리 자체를 바꾼 것이다.
- 단순히 일을 하는 곳이 아니라 배우고 성장하는 장이 되게 한다.
- 나는 항상 더 많은 것을 제공하고 더 많은 일을 수행해서 내 주변의 모두가 더 나아지도록 노력했다.
- 앞으로 나아가지 못하고 정체되어 있다고 느낀다면, 무언가를 배우거나 스스로 일을 즐기지 못한다면, 그때는 움직여야만 한다.
- 탁월함에 헌신하고, 탁월함의 추구를 본성처럼 만든다.