• 누가 코드를 이따위로 짠 거야? 나 일 못 해!!!

    다른 사람의 코드를 작업하다가 좌절한 경험이 있는가? 서비스가 성장하면 혼자 작업하던 코드도 여러 명이 작업해야 하고, 코드 규모가 커질수록 쉽게 고칠 수 없는 코드로 변하고 만다. 새로운 기능을 개발하는 시간보다 기존 코드를 읽고 수정하는 시간이 더 오래 걸리고, 코드 수정 비용이 급격하게 증가하게 된다. 프로젝트 마감? 마감은 늘어나라고 있는 거 아닌가?

    이 책에서는 소프트웨어 개선 그룹(SIG)의 컨설턴트들이 자바로 작성된 JPacman 오픈 소스를 예로 들어 유지보수 가능한 소프트웨어를 만드는 10가지 원칙을 설명한다. 특정 기술에만 해당하는 지표나 변별력이 없는 지표는 제외했다. 팀에서 지키면 최소한 읽을 수 있고, 유지보수가 가능한 코드를 작성할 수 있는, 현실적인 지침을 제시한다. 개발팀의 서가에 이 책은 반드시 꽂혀 있어야 한다.


<출처 : 다음 책 소개>


★★★★☆




 소프트웨어의 품질은 유지보수성, 기능 안정성, 성능 효율성, 호환성, 사용성, 믿음성, 보안성, 휴대성이라는 여덟가지 특성으로 분류한다고 합니다. (ISO 25010) 이 책은 그 중 유지보수성에 대한 책 입니다. 업무를 하다보면 처음 부터 신규 구현을 하는 경우도 있겠지만 대개 유지보수에 많은 시간을 드리곤 합니다. 비단 업무의 비율로 치지 않더라도 유지 보수성이란 것이 비지니스나 품질에 지대한 영향을 끼친다는 사실은 자명 합니다.


 이 책에서는 유지보수성 10대 가이드 라인을 각 장별로 제시하고 있습니다. 각 장별 예시로 제시된 코드나 내용의 난이도가 높지 않고 군더더기가 없어 약간의 실무 경험이 있으시다면 공감하며 책을 읽어 나가실 것이라 생각 됩니다. 10대 가이드 라인은 아래와 같습니다.


  1. 코드 단위를 짧게 하라 : 메소드 단위는 15라인을 넘어가지 않게 작성해야 해당 메소드를 이해하고, 테스트하고, 재사용하기 쉬워 유지 보수성이 좋아질 수 있습니다. 


  2. 코드 단위는 간단하게 짜라 : 복잡한 if-else 구문과 같이 코드 복잡성을 높이는 방식을 제한해야 합니다. 단위 당 분기점은 4개 이하로 제한하고 복잡한 단위는 더 잘게 나누어 서로 뭉쳐 있지 않게 해야 합니다. 그래야 단위 별 수정 및 테스트가 쉬워지고 유지보수 성이 개선 됩니다.


  3. 코드는 한번만 작성하라 : 코드를 복사하지 않습니다. 이 책에서 중복 코드는 정말 정말 기피해야 할 대상으로 보고 있습니다. 코드를 복사하면 여러 곳에서 버그를 고쳐야 하기 때문에 비효율적이고 에러가 나기 쉽습니다. 중복 코드의 경우 생성하지 않는 것이 무엇보다 중요 합니다. 참고로 이미 어느 정도 개발이 완료된 패키지에서의 중복 코드는 PMD 에 포함된 CPD 를 통해 검출 할 수 있습니다.


  4. 단위 인터페이스를 작게 하라 : 단위당 파라미터 개수는 4개 이하로 제한하는 것이 좋습니다. 만약 파라미터가 너무 길어진다면 이들을 객체로 추출 하는 것도 좋습니다. (예, x1, y1, x2, y2 ---> Rectangle) 


  5. 관심사를 모듈로 분리하라 : 모듈 간 결합을 느슨하게 하기 위해 큰 모듈을 삼가해야 합니다. 개별 모듈로 나누어 일을 시키고 구현 상세는 인터페이스 안으로 감추는 것이 좋습니다. 그리하여 보다 느슨하게 결합된 코드베이스 상에서 수월하게 내용을 미리 실피고 실행할 수 있습니다.


  6. 아키텍처 컴포넌트를 느슨하게 결합하라 : 메소드, 클래스 단의 리팩토링 못지 않게 최상위 수준의 컴포넌트 간의 리팩토링 역시 중요 합니다. 최상위 수준의 컴포넌트 간 결합도를 낮추어야 합니다. 다른 컴포넌트 모듈에 호출을 받는 형태로 공개된 모듈 내부의 상대적인 코드량을 최소화하는 방향으로 결합도 낮춤이 진행되야 합니다. 그리하여 각 컴포넌트의 독립성을 유지하고 유지보수성을 개선할 수 있습니다.


  7. 아키텍쳐 컴포넌트의 균형을 잡아라 : 최상위 수준의 컴포넌트 개수와 상대적 크기의 균형을 잡아야 합니다. 컴포넌트의 개수는 9개 정도(6 ~ 12개 사이) 되도록 소스 코드를 조직화 하고 컴포넌트의 크기를 대략 균등하게 맞추는 것이 좋습니다. 


  8. 코드 베이스를 작게 하라 : 코드베이스를 가능한 작게 하는 것이 좋습니다. 코드베이스가 커지는 걸 막고 시스템 크기를 적극적으로 줄여야 합니다. 이를 위한 다양한 가이드 라인이 있겠지만 이 책에서는 적극적으로 오픈소스 라이브러리 / 프레임워크 사용을 권장하고 있습니다. 단, 이때 해당 라이브러리의 코드는 고치지 않는 것이 중요합니다. 코드를 고치는 순간, 해당 라이브러리가 결국 코드 베이스에 포함되는 것이나 마찮가지기 때문에 라이브러리 업데이트를 매번 따라가고 분석해야하는 어려움이 있을 수 있습니다.


  9. 테스트를 자동화 하라 : 당연합니다. 개발자가 일일히 손으로 한땀 한땀 테스트 하고 있을 수 없습니다. 자동화 할 수 있는 것들은 모두 자동화로 돌리는 것이 좋습니다.


 10. 클린 코드를 작성하라 : "스스로 프로라고 자부한다면 클린 코드는 필수다. - 로버트 C. 마틴" 클린 코드를 작성하는 7대 규칙이 있습니다. 

    • 단위 수준의 코드 악취를 남기지 말라.

    • 나쁜 주석을 남기지 말라.

    • 주석 안에 코드를 남기지 말라.

    • 죽은 코드를 남기지 말라.

    • 긴 식별자 이름을 남기지 말라.

    • 매직 상수를 남기지 말라.

    • 제대로 처리 안 한 예외를 남기지 말라.


 책의 뒷 표지에는 좋은 코드에 대한 구루(GURU) 들의 한마디들이 적혀 있습니다. 그 중 첫 번째를 소개하자면,
' 컴퓨터가 이해할 수 있는 코드는 바보라도 짤 수 있다. 유능한 프로그래머는 인간이 이해할 수 있는 코드를 짠다.' 라는 문구다. 결국 개발이든 일이든 혼자하는 것이 아니라 같이 하는 것임을 깨닫고 이를 코드 품질 향상에도 적응 할 수 있어야 할 것 같습니다. 

 요즘 회사에서 코드 리뷰 강화! 코드 품질 강화!를 외치고 있다면, 일독하실 것을 권해 드립니다.   


  

  •  저자 존 손메즈가 이 책을 쓴 이유는 개발자로 사는 데 도움이 되는 정보와 조언을 집약적으로 담은 안내서를 만들고 싶어서다. 자신이 33세에 은퇴하기까지 성공과 실패를 통해 배운 것, 여러 사람을 만나면서 보고 들으며 배운 것을 전달하고 공유하기 위해서다. 개발자의 인생을 리부트할 조언들로 꽉 차있다.

[출처 : Daum 책 소개]



★★★★★


 유사 도서 :  [소프트웨어 장인], [프로그래머로 사는 법], [IT 전문가로 사는 법


관련 사이트 : Simple Programmer, 저자의 강좌 및 컬럼이 업로드 되는 곳

책 중간 중간에 깨알 같이 해당 사이트의 학습 과정을 홍보 하고 있음.

 책에 적혀 있는 링크를 치고 들어가면 없어진 페이지도 있고, 강의 홍보 페이지로 연결되기도 함.


john sonmez에 대한 이미지 검색결과 

[저자 : John Somez]



 개발자로 사는데 도움이 되는 정보와 조언을 담은 안내서로, 70여 가지의 주제에 대하여 7가지 카테고리로 나눠 작성 된 책입니다. 1부 경력, 2부 셀프 마케팅, 3부 학습, 4부 생산성, 5부 재무관리, 6부 건강, 7부 영혼의 구성으로 이루어져 있습니다.

 

 개인적으로 앞으로의 커리어와 생산성 그리고 전문성에 대해 다시 한번 생각해 볼 수 있게 해준 고마운 책 입니다. 1부 경력관리 부터 내용을 정리해 보면, 우선 마음가짐과 목표설정에 대한 이야기로 시작합니다. 사실 1, 2부의 내용은 여타 자기 계발 서적과 크게 다르지는 않습니다. 자기 계발 서적의 주요 타깃이 개발자라는 것만 빼면 누구나 마음 한구석으로 알고 있지만 쉽게 실천하지 못하는 그런 내용들로 채워져 있습니다.


 직원의 마음가짐이 아닌, 사업가적 마음가짐을 가지고 회사를 다녀라. 즉, 지금 다니는 회사에 '나'라는 1인 기업이 프로그래밍이라는 서비스를 판매한다는 마음가짐으로 일할때 업무를 바라보는 시선이 달라질 수 있다는 이야기. 그리고 큰 목표를 세우고 이 목표를 연 / 월 / 주 / 일단위로 구체적으로 나누어 작은 것 부터 하나씩 실천해 나가기 등.


 특히 인상적이였던 부분은 전문성에 대한 이야기 였습니다. 작가가 정의하는 전문가는 맡은 일과 경력을 진지하게 생각하는 사람이며, 때로 옳다고 생각하는 바를 실천하기 위해 손해를 감수하고 어려운 결정을 내릴 용기가 있는 사람이라고 정의 하고 있습니다. 


 자신만의 전문 분야에 대한 이야기도 빼놓을 수 없을 것 같습니다. 자바 개발자나 C# 개발자는 전문성을 표현하는데 적합하지 않습니다. 최대한 구체적으로 자신의 전문 기술을 표현하는 것이 좋습니다. 결국 개인에게 필요한 일자리는 오직 하나 입니다. 제가 삼성을 다니면서 LG에서 일할 수는 없습니다. 자바 개발자를 찾는 회사는 수백곳이겠지만 자바 웹 개발자는 수십 곳일수 있습니다. 그리고 특정 자바 웹 기술을 보유한 개발자를 찾는 곳은 몇 곳 안될수도 있습니다. 하지만 실제 제 자신의 전문성을 이런 기술에 맞게 키운다면 그 일자리에 명확히 들어 맞는 사람이 되고 해당 일자리를 얻게 될 확률이 높아 집니다. 


 이런 전문성을 갖춘 사람이라고 해도 이를 제대로 드러내지 않는 다면 다른 사람들이 알 수가 없습니다. 이에 개발자 스스로 하는 셀프 마케팅도 매우 중요합니다. 자신의 기술을 드러내는 방법은 여러가지가 있습니다. 기술 블로그를 운영한다든지 유투브 영상을 올린다든지 혹은 저술 활동이나 오픈소스 활동 또는 GitHub 에 자신의 프로젝트를 올려 자신이 가진 기술을 홍보할 수 있습니다. 저자는 이러한 활동들 중 무엇이라도 좋으니 일단 시작하라고 추천하고 있습니다. 사실 아무리 많은 자기계발 서적을 읽더라도 실천하지 않는 다면 아무런 소용이 없을 것 입니다. 책에서 말하듯 작든 크든, 처음에는 어색하고 바보 같아 보여도 일단 시작하는 것이 중요 하다고 봅니다.


 책의 초반부는 이렇듯 자신의 경력 개발과 셀프 마케팅의 중요성에 대해서 설명하고 있습니다. 중반부는 어떻게 학습하고 생산성을 높일수 있을지에 대한 구체적인 How to 가 담겨져 있습니다. 


 저자가 소개한 10단계 학습법은 꼭 한번 읽어봐야할 부분 입니다. 사실 전 개발을 하다보면 책을 한단원 한단원 읽어가면서 예제를 하나하나 쳐보고 기술을 익히는 것 보다 실제 프로젝트를 진행하면서 이슈를 얻어맞고, 프로토타입을 만들기 위해 낑낑대면서 실제로 작업을 할 때 더 많은 것을 배우곤 했었습니다. 


10단계 학습법에 대한 이미지 검색결과

[이미지 출처 : 소프트 스킬 p219, 블로그]


 10단계 학습법은 실습에 빠르게 이르게 해주는 꽤 괜찮은 방법인 것 같습니다. 일단 1-6 단계 과정을 반복 없이 한 번만 진행 합니다. 제목 그대로 배우고자 하는 것의 범위와 성공의 기준을 정하고 자료들을 모아 학습 계획을 세우면 됩니다. 이때 주의 할 것은 배우고자 하는 주제와 성공의 정의를 매우 구체적으로 해야 한다는 것 입니다. 예를 들어 주제를 정할때 [리눅스 배우기]는 좋은 주제가 아닙니다. [우분투 설치 및 설정 방법과 기본 기능 배우기] 가 좋은 주제 입니다. 성공 기준도 마찮가지 입니다. 다시 한번 예를 들어 [HTML로 웹 페이지 만들기] 는 좋은 성공 기준이 아닙니다. [HTML5 를 이용하여 이력서와 포트폴리오를 담은 내 홈페이지 만들기] 가 좋은 성공 기준 입니다. 그리고 많은 자료를 찾기 보다는 주제에 딱 맞는 유투브 강의나 책 한권을 정해 학습 계획을 세우면 1-6 단계가 끝나게 됩니다.


 7-10단계는 반복이 필요한 단계로 '배우고 실습하고, 배우고 가르치는' 절차를 따르게 됩니다. 7 단계에서 Hello World 를 치고 목차나 개요를 보며 감을 익히고 난 후 8단계에서 이것 저것 해보면서 자기가 무엇을 모르는지 아는 단계를 경험해야 합니다. 그리고 9단계에서 자신이 몰랐던 것을 알게 되고 10단계에서 이를 타인에게 가르쳐 진정 내것으로 만들면 10단계 학습법이 완료가 됩니다. 


 전 개인적으로 10단계 학습법 중 가장 8단계인 [놀기]와 마지막 단계인 [가르치기] 단계가 학습에 있어서 꼭 필요한 단계라고 생각합니다. 무엇을 모르는지 아는 단계와 알게 된 것을 가르치는 단계를 통해 학습을 강화하는 것이 이 학습법의 핵심인 것 같습니다.


 3부에서 학습법을 익히고 난 후 4부에서는 생산성에 대해 이야기 하고 있습니다. 요약하자면 "생산성은 결국 집중력에서 나오는 것이고, 집중력을 얻기 위해서는 좋은 습관의 관리와 집중을 도와주는 도구가 필요하다." 라고 할 수 있을 것 같습니다. 책에서 소개한 도구 중 제가 유용하게 사용하고 있는 도구는 뽀모도로와 kanbanflow 입니다. 뽀모도로 기법과 kanbanflow 의 사용법에 대해서는 책을 참조하시거나 인터넷 검색을 통해 자세히 확인 할 수 있습니다.


 개인적으로 kanbanflow 를 업무와 개인 작업에 사용하고 있는데 만족도가 매우 높습니다. kanbanflow 자체가 뽀모도로 타이머를 가지고 있어서 블로그를 쓰거나 코딩을 할 때 유용하게 사용하고 있습니다. 책에서 저자가 kanbanflow 사용하기 전에 trello 를 사용했었다고 하는데 trello 역시 할 일 관리에 나쁘지 않은 선택으로 보입니다. 개인의 취향에 따라 선택하면 좋을 것 같습니다. 


 책의 후반부는 개발외 적인 부분, 재테크와 건강 관리에 대한 이야기를 다루고 있습니다. 어찌보면 책 제목에 제일 걸맞는 개발자를 위한 소프트 스킬에 대한 부분이 아닐까 합니다. 재테크 부분에 있어서 국내 상황과 안 맞는 부분도 있으나 후반부까지 일독하여 보는 것을 추천 합니다. 전반부 처럼 자세한 스킬이나 실천 방안을 제시하지는 않지만 균형 잡힌 삶을 위해 무엇일 필요할지 조언을 얻을 수 있을 것 같습니다.


 일을 하고 돈을 모으고 성공하고 연애하고 결혼하고... 등등 살아가면서 하는 일에는 무엇이든 목적이 있습니다. 그리고 그 목적의 궁극적인 도달점은 행복이 아닐까 생각 합니다. 개발자로써 더 나은 삶과 행복에 다다르는 방법에 대해서 고민이 많으시다면 일독해 보시길 추천 합니다. 분명 도움이 되는 책 인 것 같습니다.