소프트웨어 장인정신 선언
1장 들어가는 글
소프트웨어 장인정신이란 무엇인가?
– 성장 마인드 세트 : 당신은 더나아질수있으며, 당신이 제대로 할 준비가 되어있다면 모든것이 개선될수있다.
– 자발성 : 피드백을 바탕으로 항상 적응하고 변화해갈 필요성
– 독단적이라기보다는 실용적이려는 욕구
– 가진 지식을 쌓아두어 희소하게 만들기보다는 나누는 편이 낮다는 신념(오픈소스 공동체로의 참여)
– 결과적으로 자신이 틀렸다고 증명될지라도 기꺼히 실험에 보고자하는 자세
– 자신의 운명에 대해 누가 답해주기를 기다리기보다는 스스로 운명을 지배하고 책임지고자 하는 태도
– 그룹보다는 개인에 초첨을 맞추기 : 팀이 아닌 개인의 역량을 향상시키는 것에 초첨
– 우리와 다름을 끌어안고 가겠다는 서약
– 프로세스 중심적이기 보다는 역량 중심적 : 높은 역량을 갖는 것이 올바른 프로세스를 갖는 것보다 중요하다
– 어떤기술을 배우려면 그 기술을 사용해서 자기 목표를 이루려고 하는 사람들과 같은 방에 있어야 함
– 견습생이 된다는 것
– 내가 하고있는 일을 함상 좀더 좋고 세련되고 빠르게 해결하는 방법이 있을 꺼라고 생각하는 태도, 상태, 과정
– 자신과 성장의 필요성에 집중하는 것
– 숙련공이 된다는 것
– 기본적으로 견습생의 배움 + 전문가들을 잇는 연결(커뮤니케이션의 통로)
– 자신의 진전을 보여줄 더큰 규모의 포트폴리오 : 포트폴리오를 다양하고 심화시키기위해 마스터를 여러번 옮김
– 마스터가 된다는 것
– 견습생 + 숙련공 + 소프트웨어 개발 전체분야를 발전
– 소프트웨어 개발의 핵심을 꿰뚫는 새로운 도구의 발명
– 자신보다 뛰어난 제자의 양성
견습과정이란 무엇인가?
– 전문적인 소프트웨어 개발자가 되는 법을 배우는 것
– 좋은 교사를 찾고, 그 곁에서 배울수있는 기회를 찾아라
견습과정 패턴이란 무엇안가?
– 경럭을 발전시키기 위해 소프트웨어 장인모델을 적용하는 길잡이
– 해당 패턴은 독창적이진 않을수 있지만, 이미 사용되고있으며, 생산적이고, 업무환경을 개선시킬것이다.
패턴들은 어디서 비롯되었는가?
– 비슷한 문제를 해결하는데 동일한 해법을 적용한 수많은 실제 시스템에서 비롯
여기서 이제 어디로 가는가?
– 패턴을 하나씩 배워보자.
2장 잔을 비우다
– 이미 많은 경험을 쌓았을 수록 잔비우기에 많은 노력을 해야 한다.
– 나쁜습관, 자기역량에 대한 자부심, 직관에 반하는 접근방식에 대한 반감없애기
– 흰띠를 매는 것 : 내가 어떤 전문 지식을 익혔든지 간에 초심으로 돌아감
– 무지를 드러내라 : 무지에 맞섬으로 지식을 습득해나가는 모습을 보여줘라
– 압도적으로 다가온다면, 한발물러서서 내가 얼마나 전진해왔고, 그동안 어떤역량을 개발했는지 돌아보라
첫 번째 언어
– 언어를 하나 선택하고 그언어에 능숙해저라.
– 멘토를 찾아라
– 마음 맞는 사람들을 찾아 공동체에 참여하라.
– 그 언어에 너무 익숙해져 다른언어를 배울지 못하게 되는 일이 없도록 하라.
– 언어명세를 찾아서 읽어보고, 언어명세를 작성하는 일에 도전하라
흰 띠를 매라
– 첫번째 언어를 학습함으로서 얻은 자신감은 그래도 두되, 얻은 지식은 한편으로 밀어두라
– 새로운 지식을 받아들이려면, 우리는 우선 과거의 경험과 선입견을 한켝으로 밀어둘수 있어야 한다.
– 새로운 접근법을 통달한 다음 도약하기 위해서는 당분간은 생산성이 저하되는 것을 감수해야 한다.
열정을 드러내라
– 장인들은 소프트웨어 개발이라는 기예를 기꺼이 배우고자 하는 열성적인 견습생만 채용한다.
– 심도있는 지식이나 엄청난 생산성으로 기여하지는 못하더라도 팀에 열정을 불어넣고 모든것에 대해 질문하는 것이 견습생의 본분이다
구체적인 기술
– 구체적인 기술을 습득해서 유지하라-빌드파일 작성하기, 하이버네이트, 스트러츠 등의 오픈소스 프레임워크 등의 기술
– 우러러 보는 역량을 가진 사람들의 이력서를 보라 – 대표역량을 뽑아보고, 어떤 역량이 지금 나에게 필요한지 보라.
– 자신의 이력서를 정기적으로 보고 갱신하라 – 구체적인 기술을 나열한 목록을 만들어라.
무지를 드러내라
– 그들에게 성장하는 모습을 보여줘라.
– 무언의 압력에 굴복해서 사람들이 듣고싶어하는 이야기를 하는 것이 튼튼한 관계를 쌓는데 좋은 방법은 아니다 – 진실을 말하라.
– 질문받는 쪽에서 당신이 당연히 알꺼라고 생각하는 것에 굴복하지 마라.
– 익숙하지 않는 기술분야나 새로운 영역의 업무를 배울때는 자신의 전문기술을 옆으로 밀어두고 흰띠를 매는 용기아ㅗ 겸손을 가질 필요가 있다.
무지에 맞서라
– 도구나 기법을 하나 고른 다음에 그것과 관련된 지식의 빈틈을 능동적으로 메워라
– 공개적인 학습은 견습생이 숙련공 단계로 발전해가는 길 중 하나임
깊은 쪽
– 깊은쪽으로 뛰어들어라 다 준비가 될때 까지 기다리다가는 아무일도 못할수가 있다.
– 두렵게 생각되는 일을 맡고 능력을 넘어서는 듯한 일을 함으로써 당신은 성장할수가 있다.
– 피드백 루프를 만들 것 : 도전적인 프로젝트가 통제를 벗어나 헛돌때, 그 프로젝트를 붙들고 즉시 도움을 받을수 있어야함.
– 무모하다기 보다는 용감하다는 느낌이 들도록 해야 한다.
한발 물러서라
– 평정을 되찾기 위해 자신이 지닌 익숙한 능력속으로 잠시 후퇴하라.
– 얼마나 오래, 얼마나 멀리후퇴해 일을 것인지 의식적으로 한게를 지어두지 않으면 두려움이나 실패에 굴복할지도 모른다
장을 마치며
– 탄탄한 견습과정을 이루는 토대는 정확한 자기평가다.
3장 긴 여정을 걷다
긴 여정
– 정말로 프로그램을 잘하게 된다는 것은 일생의 과업이며, 지속적인 배움과 연습으로 이루어가는 대담한 계획이다.
– 길게 보아라. 견습기간동안에는 급여나 통상적인 리더쉽같은 것보다는 학습과 장기적인 성장에 더 가치를 두라
– 자신만의 지도를 그려라 – 중년의 나이가 되어서도 여전히 현역 소프트웨어 개발자일 것이라는 점을 마음에 새기고 있어야 한다,
예술보다 기예
– 프로그래밍은 일종의 공예이다, 공예는 예술의 일종이긴하나 순수예술은 아니다 정식적인 부분이 가미될수있겠지만, 공예는 쓸모있는 물건을 만드는 작업이다. 순수예술은 오직 아름다움을 목적으로 한다.
– 장인정신은 튼튼한 상호환계에 기초한다, 이기심을 좇지말고 고객에 가치를 제공하는 데 집중하라.
– 실리를 위하여 미적인 면을 희생할수 있는 능력을 개발하는 성숙함을 갖춰라
– 문제를 당장 해결하고 싶어하는 고객의 요구와 당신을 장인이게 하는 내면적인 기준사이에서 균형을 잘 맞추어햐 한다.
지속적인 동기 부여
– 장인정신에 대한 당신의 의욕이 긴여정 동안의 시험과 시련속에서 적응 하고 생존 하리라는 확신을 가져라
– 황금족쇄 : 뭔가 새로운 것을 배우고 싶지만 내가 이미 알고있는 것만으로도 벌이가 너무 좋다
– 긴여정이 황금 족쇄를 맞닥드렸을때 경계심을 품어라
– 좋아하는 일을 하게 되면 금전적인 보상이 따라온다
– 동기부여가 되는 일을 최소한 15가지 이상적어보라
열정을 키워라
– 소프트웨어 장인정신에 대한 자신의 열정을 보호하고 성장시킬 조취를 취하라
– 무언가를 잘하고 싶으면 그 일을 좋아하라
– 마음맞는 사람들을 찾으라
– 배운것을 공유하라
– 고전을 공부하라
– 자신만의 지도를 그려라
자신만의 지도를 그려라
– 논리적이면서도 의욕적으로 경력의 다음단계를 준비하라.
– 단순히 높은 수준의 목표를 써내려가지말고 작지만 현실가능한 단계를 정해보라
– 당신의 직위와 급여때문에 지도상에 갈수있는 목적지가 제한되는 사태를 미리 방지하라
– 단기적인 직함과 급여보다 나의 목표와 일치하는 장기적으로 나를 더 높은 곳으로 이끌어 줄수있는 직장에서 일하는 것의 상대적인 중요성을 생각하라
직위를 이용하라
– 직책이 어떤것인지 길고 상세한 버전으로 적어보라
– 실제로 하는 일과 나의 역량 수준을 정확히 반영하라
– 다른 곳의 동일한 직책을 가진 낯선사람이 나를 어떤 눈으로 볼지 상상하라
전장에 머물러라
– 숙련됨은 연슴을 중단하는 그시점부터 퇴보하기 시작한다.
– 야전의 참호안에 머무는 것이 소프트웨어 개발을 위한 당신의 열정을 키우는 방법이다
또 다른 길
– 당신이 가지 않는 길을 간다고 해서 그사람들이 길을 잃은 것은 아니다
– 전혀다른 경력 또한 인정하라, 그리고 삶에서 무언가 다른일을 해보는 것을 두려워하지 말라
장을 마치며
–
4장 정확한 자기 평가
가장 뒤떨어진 이가 돼라
– 여우의 머리가 되기보단 사자의 꼬리가 되라
– 주변을 당신보다 뛰어난 개발자로 채워라
– 팀에서 가장 뒤떨어진 자가 되어 팀의 다른 사람들과 같은 수준이 되기까지 뛰어난 개발자들을 모방해야 한다
– 내가아는 모든팀을 나열하고 기술수준에 따라 정렬하고 성장하길 원하는 멤버에게 열려있는 팀을 찾아보라
멘토를 찾아라
– 당신보다 앞서 지나간 사람들을 찾아서 그들로부터 배우라
– 활발한 메일링 리스트가 있는 도구나 라이브러리 또는 커뮤니티를 하나 골라서 잠복하면서 흐름을 파악하고 교사리스트를 찾아 멘토링을 청하라
마음 맞는 사람들
– 연관된 문제를 풀기위해 힘을 모으고 있는 인재들의 커뮤니티보다 강력한것은 없다.
– 커뮤니티는 많은 이점이 있지만 집단적 사고에 주의 해야 한다
– 당신이 사용하는 도구 당신이 알고있는 언어, 같이 일했던 사람, 그둑하는 블로그, 흥미를 느끼는 아이디어를 기반항려 가입할만한 커뮤니티를 찾으라
팔꿈치를 맞대고
– 다른 소프트웨어 개발자와 나란히 앉아서 실제로 같이 작업할 방법을 찾아보라
– 짝프로그래밍의 의한 개발
– 팔꿈치를 맞대고 일한 경험이 긍정적이였든 부정적이였든 간에 배운것을 기록하고 이런 경험을 돌이켜볼수있어야 한다.
바닥을 쓸어라
– 단순하고 매력도 없지만 바드시 해야 하는 종류의 일을 해라
– 냄새나는 일에 달려들어 사람들의 기대를 넘어서 재미를 느끼도록 창조적인 방식으로 문제를 해경할 방도를 생각하라
장을 마치며
– 겸손은 성공적인 견습과정의 토대중 하나다
5장 끊임없는 학습
– 소프트웨어 개발이란 학습과 의사소통이다
– 구체적인 기숭릉 배우는 기본을 넘어 배우는 방법도 배워야 한다
능력의 폭을 넓혀라
– 새로운 지식을 이해하고 간직하고 적용하는 방법뿐아니라 효과적으로 흡수할 수있는 테스틱도 발전시켜야 한다.
– 능력의 폭을 넓힐지 이해한후 언제 그것을 실행에 옮길것인지 알아야 한다.
연습, 연습, 또 연습
– 실수해도 마음이 편한 환경에서 방해받지 않고 기예를 연마할 시간을 확보하라
– 카타 : 무예의 기본을 내제화하는 것을 도울 목적으로 마스터에 의해 안무가 짜여진 일련의 동작
– 연습이란 이론적으로 좋은것이지만 주기적인 피드백을 받지못하면 오히려 나쁜습관을 들일고있을 수있다
부숴도 괜찮은 장난감
– 업무때와 비슷한 도구를 써서 업무때 구축하는 시스템의 범위에 들지 않는 토이 시스템을 구축하고 실패해볼수있는 여지를 만들어라
– 장난감은 재미있어야 한다 재미가 없다면 열정이 휩쓸고 지나간후 먼지만 쌓일것이다
소스를 활용하라
– Use the Source, Luke
– 결국은 소스가 최종결정자다
– 다른사람들의 소스코드를 찾아서 읽어라
– 왜 파일이 그런식으로 배치되어있는지 알아보고 나라면 어떻게 했을지 고민해라
– 사람들이 작성한 코드로 부터 그 의도를 꿰뚫어보는 능력을 키워라
– 소프트웨어 개발분야의 문제점중 하나는 교사가 부족하다는 것이다 : sourceforge.net이나 github, google code를 활용하라
– 프로그래머의 능력을 테스트하는 가장 좋은 방법은 30페이지쯤 되는 코드를 건내주고 얼마나 빨리 그 코드를 통독하고 이해하는지를 보는 것이다
일하면서 성찰하라
– 피터의 법칙 : 조직에서 일하는 모든사람은 자신의 능력이 무능력 수준에 도달할때까지 승진한다
– 사색하는 소프트웨어 개발자가 되라 : 내가 어떻게 일하고있는지 스스로 성찰해야 한다
– 나의 습관도표 : 의식적으로 자신의 하는 일을 적고 일들 사이의 연관성을 기록하는 것
배운 것을 기록하라
– 당신이 걸어가는 여정의 기록을 일지나 개인위키, 블로그 등에 남겨라
– 배운순서를 시간순으로 기록하면 걸어온 여정을 볼수가 있다
– 배운것을 기록만 하고 그냥 잊어버리는 덫에 빠지지 않도록 노력하라
– 썼던글을 정기적으로 다시 읽어 리뷰하라
– 인용문은 탁월한 참고자료의 원천이다
배운 것을 공유하라
– 배운것을 정기적으로 공유하는 습관을 초기에 들여놓아라
– 블로그운영, 커뮤니티, 컨퍼런스 발표, 튜토리얼 작성
– 한사람이 가르칠떄 두사람이 배운다
피드백 루프를 만들어라
– 당신의 수행능력을 평가하는데 어느정도 객관성있는 외부데이터를 정기적으로 수집할 방안을 마련하라
– 유용한 피드백 : 기반으로 삼아 실천할수 있는 데이터이며, 특정한 행위를 더하거나 덜하도록 선택의 여지를 주는 데이터
실패하는 법을 배워라
– 당신이 어떤식으로 실패하곤 하는지 확인하고, 고칠부분은 바로 잡아라
장을 마치며
6장 학습 과정의 구성
독서 목록
– 읽기로한 책들을 추적해갈 도서목록으로 유지하고, 다릭은 책을 기억해두라
– 공개된 장소에 당신의 도서목록을 올려두라
– 도서목록은 읽을 책의 순서를 나타내며 참고문헌에 많이 나타나는 책일수록 우선순위를 높여라
– 멘토들에게 필독서를 추천받아라
꾸준히 읽어라
– 좋은 프로그래밍 책을 두달에 1권 일주일에 대략 35페이지 정도만 읽어도 단신은 이내 이분야에 대해서 확실한 감을 잡게 될것이다
– 계속해서 성공적으로 적용하기 위한 요령은 책을 다읽은 후에도 추진력을 유지하는 것
– 두껍지않은 책을 한권은 늘 지니고 다녀라
고전을 공부하라
– 무지를 드러내서 잘모르는 개념이 어떤뜻이며, 어떤책에서 비롯되었는지 물어보라
– 제일 훌륭한 것들을 읽어라
– 수명이 긴책에 집중하고 웹이나 실험을 통해서 그정보가 어떻게 발전했는지 배워라
– 자신의 도서목록을 고전뿐아니라 현대적이고 실용적인 책과 기사도 섞어두라
더 깊이 파고들어라
– 도구나 기술분야, 각종 기법 같은 것을 깊이 파고드는 법을 배워라
– 지식의 깊이가 새로운 분야에 도전할때 기댈언덕이 되어준며, 앞으로 나아갈 힘을 부여한다
– 팀내에서 디버깅하고 역컴파일하고 리버스 엔지니어링을 하는 사람들과 기술분야에 대해서 RFC문서 명세서, 표준문서를 읽는 사함들이 대성당을 지을수있다.
– 그 아이디어를 누가 처음 생각해냈는지 조사해보고 그들이 풀려고 했던 문제가 무었인지 이해하라
– 튜토리얼을 읽을때는 복사해서 갖다 쓸코드를 찾지말고 새로습득한 지식을 마음속 어디에 두면 좋을지 찾도록 하라
– 심도있는 지식을 얻는 일은 힘들다
– 수박겉핥기 식으로만 해서는 지금모르는 것을 앞으로도 모를 것이며, 자기 지식의 한계가 어디까지인지 이해하지 않고서는 새로운 것을 깨달을수 없다
– HTTP1.1을 기술하고있는 RFC2616과 원격프로시져 호출을 기술한 RFC707을 찾아서 읽으라
– 페이스북에서 사용하고 있는 Apache Thrift 프레임워크 같은 것을 검토하라
익숙한 도구들
– 익숙한 도구들을 선별하여 거기에 집중하라
– 당신은 도구들이 어디에 쓸지 쓰지말하아 할지를 구별하라
– 정말어려운일은 도구상자의 상당부분을 버려야 할때가 생긴다
– 익숙한 도구들은 쉽게 얻고 쉽게 버리는 법을 배워야 한다
장을 마치며
7장 결론
– 진정한 마스터는 존재하지 않는다(아직까지는)