회사에 처음 입사했을 때 추천받은 책을 2년이나 지난 지금에서야 사서 읽었다. 내용이 어떤 특정한 디자인 패턴이나, 기술 명세는 아니다. 어떤 마음가짐으로 소프트웨어를 제작하고, 어떤 케리어 패스를 밟아가는 것을 추천하는지가 적혀있다. 단순히 근시안적인 몇몇 언어나 몇몇 기술에 대한 내용이 아닌, 프로그래머로써 가져가야 할, 지켜나가야 하고, 습관이 되어있어야 하는 부분들을 자세히 적어두었다. 이 책을 통해 나는 아직도 성장하려면 멀었구나 하는 생각이 들고 반성도 많이 했다. 하지만, 돌려 말하면 아직 내가 부족하기에 앞으로 더 해야할 일들이 많고, 하고싶은 일도 많아질 것이라는 생각에 가슴이 뛰었다. 한 발 물러서서 나를 돌아볼 수 있는 유익한 시간이었다. 프로그래밍을 배우는 대학생이나 이제 막 취업한 신입 프로그래머 분들께 강력 추천을 드린다.
아래는 책을 읽고 "아 이런 부분은 나한테 바로 적용해도 되겠구나" 했던 부분이다. 재미삼아 읽어보시길!
책을 읽고 실제 적용해 볼 만한 생활 습관
첫 공동체를 찾아라. 커뮤니티의 가치관을 파악하고 참여하라. (오픈소스, RFC, 일반 커뮤니티 등..)
다른사람의 소스를 읽어라(오픈소스 프로젝트). 모르는 부분이나 설계 사상을 기록하고, 일상에 적용할 수 있을지 생각해보자.
출근 후 아침 30분 정도를 뼈대가 되는 라이브러리를 읽는데 할애하자.
토이 프로젝트 계획을 세우고 실행하라.
자신의 이력서를 정기적으로 수정하라. (구체적인 기술 내용을 포함할 것)
업무 중 가장 이해하기 어려운 5가지를 적어두고, 실제 해결하라.
내가 잘 알고있는 독립적인 주제를 선택하여 다시 구현해보라 (ex> 캐싱 알고리즘)
나의 팀이 몇달째 미뤄둔 가장 지저분한 일이 무엇인가? 그 일에 달려들어라. 억지로 하지 말고, 재미있고 창조적인 방식으로 문제를 해결하라.
수시로 노트에 아이디어를 메모하고 블로깅 해보자.
배운 것을 공유하고, 만약 그 주제로 컨퍼런스에 나갔으면 어떤 형식이 될지 대략적인 개요 정도를 생각해보자.
도서 목록을 만들어라.
두껍지 않은 책을 항상 소지하고 다녀라.
패턴 목록
Be the worst (가장 뒤떨어진 이가 되라) : 주변의 모든 이들을 일찌감치 앞서버리면서 당신의 학습은 더디어졌다.
Study the Classics (고전을 공부하라) : 당신과 함께 일하는 경허많은 사람들은, 당신이 이미 읽었을 것이라고 여기는 책에 나오는 개념들을 계속 언급한다.
Concrete Skill (구체적인 기술) : 뛰어난 개발 팀에서 일하고 싶지만, 당신에게는 아주 적은 실무 경험밖에 없다.
Read Constantly (꾸준히 읽어라) : 신속하게 숙련도를 끌어올렸지만, 당신에게 보이지 않는 심오하고 더욱 근본적인 개념들이 어디선가 끝없이 흘러가고 있는 것 같다.
The Long Road (긴 여정) : 당신에게는 소프트웨어의 명장이 되고자 하는 포부가 있다. 비록 사람들이 당신에게 기대하는 것은 그게 아닌 것 같지만.
The Deep End (깊은 쪽) : 당신은 자신의 경력이 안정 상태에 접어든 것이 아니라 실은 틀에 박힌 듯 정체된 것이 아닌가 두려워지기 시작한다.
Expand Your Bandwidth (능력의 폭을 넓혀라) : 소프트웨어 개발에 대한 당신의 이해는 좁으며 일상 작업에 관련된 저수준의 세부 사항에 맞춰져 있다.
Reading List (도서 목록) : 읽어야 할 책의 권수가 당신의 책 읽는 속도보다도 더 빠르게 늘어만 간다.
A Different Road (또 다른 길) : 당신이 가려는 방향은 소프트웨어 장인정신으로 향하는 길과 다르다는 것을 알게 되었다.
Dig Deeper (더 깊이 파고들어라) : 당신은 많은 도구와 기술이나 기법에 대해 피상적인 지식밖에 가지지 못했고, 좀 더 어려운 문제들과 씨름하면서 계속 장애물에 부딪히고 있다.
Find mentors (멘토를 찾아라) : 당신은 이미 있는 것을 다시 만들고 장애물에 부딪히느라 많은 시간을 소비하고 있지만, 어디쯤에서 안내를 받기 위해 방향을 틀어야 할지 확신하지 못한다.
Expose Your Ignorance (무지를 드러내라) : 당신의 지식에 큰 틈이 있음을 발견했고, 당신이 하고 있는 일에 대해서 잘 모른다고 사람들이 생각할까봐 두렵다.
Confront Your Ignorance (무지에 맞서라) : 당신의 지식에 큰 틈이 있음을 발견했고, 당신이 하는 일은 이런 주제에 대한 이해를 요구하고 있다.
Sweep the Floor (바닥을 쓸어라) : 당신은 미숙한 개발자이며 팀으로부터 신뢰를 얻고자 한다.
Share What You Learn (배운 것을 공유하라) : 주변의 사람들이 당신처럼 빠르게 학습하지 못하는 것 같아서 좌절하고 있다.
Record What You Learn (배운 것을 기록하라) : 당신은 같은 교훈을 계속 되풀이해서 배우지만, 도무지 몸에 붙지를 않는 것 같다.
Breakable Toys (부서도 괜찮은 장난감) : 실패가 허용되지 않는 환경에서 일하지만, 당신에게는 여전히 안전하게 학습할 데가 필요하다.
Use the Source (소스를 활용하라) : 주변에 좋은 코드와 나쁜 코드를 구별할 만한 사람이 없다면, 당신이 짜 놓은 것이 좋은지 어떤지 어떻게 알 수 있을까?
Learn how You Fail (실패하는 법을 배워라) : 당신의 학습 역량은 성공적인 부분을 향상시켰지만, 실패와 약점은 그대로 남아 있다.
Practice, Practice, Practice (연습, 연습, 또 연습) : 당신의 일상적인 프로그래밍 작업은 실패하면서 배울 수 있는 여지를 제공해 주지 않는다.
Unleash Your Enthusiasm (열정을 드러내라) : 당신은 팀에 맞추기 위해서 소프트웨어 개발에 대한 흥분과 호기심을 숨기고 지내게 되었다.
Nurture Your Passion (열정을 키워라) : 당신은 기예에 대한 열정을 질식시키는 환경에서 일하고 있다.
Craft over Art (예술보다 기예) : 고객에게 해결책을 주기로 했는데, 단순하고 검증된 해법을 선택할 수도 있고 뭔가 새롭고 환상적인 것을 만들 기회로 삼을 수도 있다.
Familiar Tools (익숙한 도구들) : 당신이 사용하는 도구와 기술들이 너무 급속히 바뀌어서, 작업을 추산하는 데 어려움을 느낀다.
Reflect as You Work (일하면서 성찰하라) : 지금의 지위에서 보낸 햇수와 수행한 프로젝트 개수가 늘어가면서, 당신은 마치 마법처럼 '경험이 쌓이게' 만들어 줄 계시의 순간을 기다리고 있음을 깨닫는다.
Draw Your Own Map (자신만의 지도를 그려라.) : 고용주가 제시하는 어떤 경력 경로도 당신에게 맞지 않는 것 같다.
Stay in the Trenches (전장에 머물러라)
: 승진 제안을 받았지만, 그 자리로 가면 프로그래밍과는 멀어지게 된다.
Sustainable Motivations (지속적인 동기 부여) : 당신은 계속 바뀌고 상충되는 요구사항을 가져오는 고객을 위해 아리송하게 명세된 프로젝트라는 좌절스러운 현실에서 일하고 있음을 깨닫는다.
Use Your Title (직위를 지표로 사용하라) : 공식적인 자리에서 자신을 소개할때면 왠지 사과를 하거나 당신의 실제 기술 수준과 직무 내용간의 격차에 대해 변명을 해야 할 것 같은 생각이 든다.
Your First Language (첫 번째 언어) : 당신은 몇몇 언어에 익숙하지만, 그 어느 것에도 능통하지는 않다.
Rubbing Elbows (팔꿈치를 맞대고) : 뭔지 알 수는 없지만 더 상급의 테크닉과 접근 방식이 있을 것이란 느낌을 갖고 있다.
Create Feedback Loops (피드백 루프를 만들어라) : 당신은 자신이 '인식하지 못한 무능력'으로 고통 받고 있는지 알 수가 없다.
Retreat into Competence (한발 물러서라) : 너무나 광대한 자신의 무지에 직면하면서 당신은 압도됨을 느낀다.
The White Belt (흰 띄를 매라) : 당신이 가진 경험이 새로운 기술의 습득을 더 어렵게 하는 것 같아서 학습에 애를 먹고 있다.