
이 책을 읽고 있으면 지난 15년동안 개발자 스펙을 쌓으면서 겪었던 많은 사람들과 많은 일들이 스쳐지나가네요.
그때 했던 고민들과 그때 찾지 못한 답변들이 이 책에서 얘기될때마다 깊이 공감하면서 앞으로 어떻게 개발자의 길을 가야할지 생각해 보게 됩니다.
더 나은 개발자가 되기 위한 조언들이 필요하다면 꼭 읽어보길 권하는 바입니다.
1부 이념과 태도
1장 21세기의 소프트웨어 개발
- 고참이라는 것은 상대적인 개념이다. 영원한 고참은 없다.
- 애자일은 커다란 혁신이였지만 아직까지 개선이 되지 않는 이유는 개발자들이 프로페셔널하지 않기 때문이다.
2장 애자일
- 애자일은 단일 개념이 아니다. 서로 다른 맥락에 따른 방법론과 테크닉의 조합이다.
- 애자일 원칙
- 절차적 관점 : 절차적인 부분에서 비지니스에 가치가 있는 것에 집중한다.
- 기술적 관점 : TDD, 페어프로그래밍, 지속적인 통합, 단순한 디지안 원칙
- 게임 체인저
- 기존 : 섣부른 과잉 설계(Big Design Up-Front : BDUF), 방대한 문서, 관료체계
- 애자일 : 동작하는 소프트웨어, 빠른 피드백, 비지니스와 고객가치 창출에 개발자들이 직접 참여, 민첩 -> 빠른 피드백 주기
- 애자일 매니페스토의 원칙들
- http://agilemanifesto.org/iso/ko/
- 가치있는 SW, 요구사항 변경 환영, 동작하는 SW, 비지니스 담당자들은 개발자와 함께 일함
- 프로젝트는 동기가 부여된 개인들로 구성, 정보 전달은 대화로,
- 진척도=동작하는 SW, 지속 가능한 개발, 기민함, 단순함,
- 스스로 조직화 되는 팀, 정기적으로 조율
- 애자일 격변기 & 행오버
- 개발팀 스스로 백로그(할일 목록)을 관리, 빠른 피드백 루프 매커니즘
- 하지만 많은 애자일 프로젝트들이 여전히 엉망인 코드를 반복한다.
- 애자일의 절차들에는 기술적인 탁월함이 전재되어 있다. 구성원의 기술적인 훈련도 중요하다.
- 애자일과 소프트웨어 장인정신 : 둘은 상호 보완적 관계이다.
3장 소프트웨어 장인정신
- 소프트웨어 장인정신
- 비유 : SW개발자 = 숙련된 대장장이 밑에서 배우는 도제(연습생)
- 위키피디아 : SW장인정신 = 개발자 스스로의 코딩 스킬을 강조하는 개념
- 주관적인 정의 : SW장인정신 = 마스터가 되어가는 여정(캐리어에 책임감을 가지고 지속적으로 발전하겠다는 마음가짐)
- 짧은 정의 : SW장인정신 = SW개발의 프로페셔널리즘
- 정의 이상의 의미 : SW장인정신 = 이념 or 마음가짐에 가깝다. (주인의식, 프로페셔널, 멘토링..)
- 소프트웨어 장인정신 이력
- 1999 실용주의 프로그래머 ~
- 소프트웨어 장인정신 모임 : 2008년(애자일 선언후 7년)후 SW장인정신을 정규화 하기 위한 모임
- 2009년 1번째 SW장인 정신 컨퍼런스가 런던에서 개최
- 2009년 에잇스 라이트사와 옵티마사가 장인 교환 프로그램을 시도
- 소프트웨어 장인 커뮤니티 : LSCC(런던 SW 장인 커뮤니티), SoCraTes UK(SW 장인 콘퍼런스)
- 소프트웨어 장인정신 매니페스토 :
- 소프트웨어 장인을 열망하는 우리는, 스스로 기술을 연마하고, 다른 사람들이 기술을 배울 수 있도록 도움으로써 프로페셔널 소프트웨어 개발의 수준을 높인다. 이러한 일을 하는 과정에서 우리는 다음과 같은 가치들을 추구한다.
- 동작하는 소프트웨어뿐만 아니라, 정교하며 솜씨 있게 만들어진 작품을
- 변화에 대응하는 것뿐 아니라, 계속해서 가치를 더하는 것을
- 개별적으로 협력하는 것뿐만 아니라 프로페셔널 커뮤니티를 조성하는 것을
- 고객과 협업하는 것뿐만 아니라, 생산적인 동반자 관계를
4장 소프트웨어 장인의 태도
- 오래전 작성한 코드가 고칠부분이 없다면, 그동안 배운것이 없는 것이다. (프로페셔널이 되기 위해 일평생 정진해야 한다)
- 내 커리어의 주인은 누구인가?
- 투자는 스스로 해야 한다.
- 프로페셔널로 대우받기 원한다면 스스로를 발전시키는데 돈과 시간을 투자해야 한다.
- 끊임없는 자기계발
- 독서
- 특정기술에 대한 서적 : 특정기술을 급하게 알아야 할때. 당장은 유용하나 오래가지 않음. Hibernate/Node.js/Clojure
- 특정개념에 대한 서적 : 개념/패러다임/실행관례 소개. TDD/DDD/OOP/FP
- 행동양식에 대한 서적 : 팀과의 협업/일상적인 상황. 린SW개발/심리학/철학
- 혁명적 서적(또는 고전) : 개념/행동양식. 실용주의프로그래머/디자인패턴/테스트주도개발/익스트림프로그래밍/클린코더/소트트웨어장인정신/리펙토링
- 블로그
- SW장인정신/애자일모델에 적합
- 충분한 지식이 없는 사람에게는 블로그가 독이 될 수 있다. (깊이없는 글)
- 숙련도와 상관없이 블로그는 필요하다.
- 기술 웹사이트 : 최신동향
- 팔로우할 리더 찾기 : 트위터 등
- 독서
- 끊임없는 훈련
- 실행관례와 새로운 기술을 배우는 것은 자동차 운전과 같다 (나중에 자연스럽게 사용하게 된다)
- 카타(품세) : 훈련용 코딩
- codingkata.org
- codekata.pragprog.com
- kate.softwarecraftsmanship.org
- 펫(pet) 프로그램 :
- 취미활동과 같은 SW 프로젝트.
- 무엇을 배울지 결정하고 해결할 문제를 찾는다.
- 재미있어야 한다.
- 오픈소스
- 기여할 부분이 보인다면 작은것부터 시작하자
- 다른 개발자의 일하는 방식을 체험할 수 있다
- 페어프로그래밍
- 혼자 배우는것은 한계가 있다.
- 나 자신의 실행 역량을 파악하는 기회
- 새로운것을 배우는 기회.
- 가르치다보면 생각을 구조화할 수 있다
- 사회 활동: 다른 개발자들과 어울리기, 커뮤티니
- 의도한 발견
- SW 프로페셔널의 최대 실수는 자신의 무지를 받아들이지 않는 것 (2단계 무지)
- 아직 배울것이 많음을 인정하는 것이 성숙하다는 증거
- 모르는 것을 배우는 기회를 만들라. (최신동향 따라하기, 커뮤니티 이벤트 참석 등)
- 시간
- 커리어에 시간을 투자하기 위해 시간을 최적화 해야 한다.
- 시간 만들기 : 낭비하는 시간 줄이기, 자기계발 시간 가지기
- 뽀모도로 기법
- 어떤일을 할지 정한다
- 뽀모도로(타이머)를 25분에 맞춘다
- 타이머가 끝날때까지 그 일을 한다.
- 짤게 쉰다(5분)
- 매 4회의 뽀모도로마다 길게 쉰다(15~30분)
5장 영웅, 선의 그리고 프로페셔널리즘
- 매니저가 잘못하고 있다면 ‘아니오’라고 말할 수 있어야 한다.
- 불가능하다고 알고 있다면 ‘노력 해보겠다’라고 말하지 말라
- 실망시키지 않기 위한 ‘네’라는 말은 거짓말이며 파괴적인 습관이다.
- ‘아니오’라고 말할때는 대안을 제시하라
6장 동작하는 소프트웨어
- 애자일의 ‘동작하는 소프트웨어만’으로는 부족하다. ‘고품질의 동작하는 소프트웨어’로 개념이 변화하기 때문이다.
- SW는 유기물처럼 지속적인 관리가 필요하다. (정원 돌보기 처럼)
- 보이지 않는 위협 : 저품질 SW로 인한 버그 수정시간과 테스트 시간
- 나쁜 코드는 개발자 외의 다른 사람에게 보일때는 이미 늦은 상태이다.
- 빨리하는 것과 허술한 것은 다르다.
- 단위테스트할 시간이 없어서 생략한다면, 더 많은 시간을 소모할 수 있다.
- 단위 테스트 작성은 별개의 업무가 아니다. 코드 작성에 녹아 있어야 한다.
- 그린필드 프로젝트(백지상태에서 시작) vs 레거시 코드 프로젝트(기존에 코드 존재)
- 보이스카웃 규칙 : ‘처음 발견했을 때보다 더 깨끗하게’, 이는 레거시 코드를 접할때도 마찬가지다. 리펙토링
7장 기술적 실행 관례
- SW장인정신은 기술적 실행관례에 집중하여, 애자일을 보완함
- XP 실행관례는 SW품질 향상 및 피드백 루프를 단축시킬 수 있는 여러 방법을 제공한다. 하지만 이것만으로 프로젝트 성공을 보증하지 않는다.
- 실행관례가 효율적이려면 구성원에게 그 가치가 납득되어야 한다.
- TDD는 BUDF(Big Design Up Front)를 막아준다.
- 지속가능한 통합과 TDD를 사용한다면 QA 부담이 줄어든다.
- 의사결정에 대한 책임감
- 실용주의 : SW장인이 가져야 할 최선의 역량중 하나. 영원한 실행 관례는 없다. 최선의 기술/도구/절차/방법론/실행관례를 선택해야 한다.
8장 길고 긴 여정
- ‘어디로 가고 있는지 모르고 있다면, 결국 가고 싶지 않은 곳으로 간다.’ – 요기베라
- 어디로 가야 할지 모른다면, 밖으로 나가 교류를 하라. 새로운기술습득/커뮤니티참석/블로깅/오픈소스참여
- 회사안에서의 커리어보다 우리자신의 커리어가 우선되어야 한다.
2부 완전한 전환
9장 인재 채용
- 채용 선별 조건으로 열정에 집중해야 한다.
- 열정적인 개발자는 항상 배우고, 동기를 부여하여 혁신하고 기술변화를 이끈다.
10장 소프트웨어 장인 면접하기
- SW장인은 일하러 가는 것이 행복한 직장을 찾는다.
11장 잘못된 면접 방식
- 잘못된 면접 방식
- 똑똑한 척하는 면접관을 세운다
- 수수께끼식 질문을 던진다
- 답을 모르는 질문을 한다
- 지원자를 바보로 만든다
- 인터넷 접속을 막는다
- 종이에 코드를 작성하게 한다
- 알고리즘 문제를 낸다
- 전화 면접을 한다
- 좋은 면접 방식
- 짝 프로그래밍 : 지원자의 테스트 작성법, 리펙토링, 네이밍룰 등에 대해 알 수 있다.
12장 낮은 사기의 대가
- 사기가 낮은 회사는 망한다.
- 사기를 높이기 위해 SW장인을 팀에 영입하라
13장 배움의 문화
- 배움의 문화 만들기
- 동료들과 북 클럽 진행
- 테크 런치 진행 (점심시간에 난상 토론회)
- 그룹 토론회 (약 45분)
- 업무 교환하기 : 기존 결정 재검증, 지식 공유, 문제 개선, 공동 학습
- 그룹 코드 리뷰하기
- 코딩 실습하기 : Kata를 사용
- 사용할 기술은 가능한 자유롭게 선택하기
- 내부 학습 모임을 만들기 : 2인이상이면 충분, 규모에 집착하지 말것.
- 회사에서의 펫 프로젝트 시간을 허용하기
- 외부 기술 커뮤니티와 교류하기
- 아무도 참여하려 하지 않는다면
- 모범을 보여라
- 관심을 보이는 사람들에게 집중하라
- 강제하지 마라
- 모두를 변화시키려 들지 말라
- 모임에 대한 약속을 제때하라 : 모두에게 맞는 시간조율은 어렵다.
- 허락을 구하지 마라 : 개인시간에 공부하는 것에 대해 허락을 구할 필요없다. 단 업무를 소홀히 하지 마라
- 투덜대지 마라 : 공부할때는 방 하나면 된다.
- 리듬을 만들라 : 커뮤니티의 정기모임
14장 기술적 변화의 실행
- 기술적 변화를 반대하는 회의론
- 무지 : 무지에 대한 두려움으로 새로움을 거부한다.
- 대중 : 자신감 부족. 누군가 시켜야 한다.
- 냉소주의 : 똑똑하게 보이기 위해 꼬투리 잡음.
- 트라우마 : 과거의 실패로 인해 피함
- 너무 바쁨 : 근시안적인 판단으로 비효율적으로 반복
- 상사 : 기술 배경이 없는 상사는 기술 변화를 이해 못함
- 몰상식 : 논리적으로 반대할 내용이 없어도 다른 문제로 옮겨다니며 반대함.
- 무념무상 : 그냥 남들과 같이 흘러가려함.
- 피해망상 : 회사가 자기에게 피해를 준다고 생각함.
- 무능력 : 본질을 못봄.
- 상아탑 프로젝트 : 자신이 제일 똑똑하다고 생각함. 인터넷에서 취한 개념만 가짐
- 좌불안석 : SW장인이 자신의 실체를 폭로할 위협으로 생각함
- 팬보이 : 특정 주제에 광적으로 전념. 한쪽에만 전문가.
- 기술적 변화를 위한 준비
- 단순함
- 상대(관리자,아키텍트,투자자 등)의 언어로 말하라
- 말할 내용을 스스로 잘 이해하라
- 상대방을 존중하라. (상대를 바보로 만들지 마라)
- 경청
- 기술적 변화를 시작하는 방법
- 신뢰를 쌓으라
- 전문성을 확보하라
- 모범을 보여 사람들을 이끌라
- 신중하게 싸울 곳을 정하라
- 점진적으로 반복, 관찰, 수용하라
15장 실용주의 장인정신
- 품질 vs 시간
- 품질은 선택사항이 아니다
- XP실행관례와 애자일 원칙을 습관화 한 장인은 좋은 품질을 빠르게 만들 수 있다.
- TDD와 XP실행관례가 진리는 아니다 : 계속 진화한다. 더 좋은 것을 찾자.
- 단순한 설계를 위한 네 가지 원칙 (켄트벡)
- 모든 테스트 통과 : 모든 테스트를 통과해야 한다.
- 명료성의 최대화 : 명료하고, 충분히 표현되고, 일관되어야 한다.
- 중복의 최소화 : 동작이나 설정에 중복이 있어서는 안된다.
- 구성요소의 최소화 : 메서드,클래스,모듈의 수는 가능한 적어야 한다.
- 디자인 패턴
- 범용코드로 인한 복잡성
- TDD 수행시 처음부터 디자인패턴을 적용하기 힘듬
- 당장의 합당한 이유 없이 ‘미래를 대비해’ 추상화하면 복잡해지고 추상화 단계마다 비용이 발생
- SOLID 원칙
- 장인정신과 실용주의
- 장인에게 가장 중요한 것은 고객의 만족이다.
- 실용주의가 없는 장인정신은 장인정신이 아니다.
16장 소프트웨어 장인으로서의 커리어
- 장인의 길 :
- 열정 : 직무에 열정, 배움에 열정, 공유에 열정
- 좋은 개발자가 장인은 아니다. 철학을 가지고 노력해야 함.
- 정직과 용기 : 고객에게 숨기지 않고 투명해야 한다.


