소프트웨어 장인

sw_master

이 책을 읽고 있으면 지난 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장 소프트웨어 장인으로서의 커리어

  • 장인의 길 :
    • 열정 : 직무에 열정, 배움에 열정, 공유에 열정
    • 좋은 개발자가 장인은 아니다. 철학을 가지고 노력해야 함.
    • 정직과 용기 : 고객에게 숨기지 않고 투명해야 한다.

CC BY-NC-ND 2.0 KR

이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다. 크리에이티브 커먼즈 라이선스

저작권과 관련된 파일요청 및 작업요청을 받지 않습니다.

댓글 남기기