🔖 오늘 읽은 범위 : 2장.실용주의 접근법
❗ 소감 3줄 요약
- 좋은 설계를 하기 위해선 어떻게 해야 될까?
- 예광탄코드와 프로토타이핑의 차이
- 프로젝트 일정을 추정할때는 어떤 방법이 좋을까?
😃 책에서 기억하고 싶은 내용을 써보세요.
ETC 원칙을 따른다. 바꾸기 바꾸기 더 쉽게더 쉽게(Easier to Change). ETC. 이게 전부다.
왜 결합도를 줄이면 좋은가?
- 관심사를 분리함으로써 각각이 더 바꾸기 쉬워지기 때문이다.
왜 단일 책임 원칙(single responsibility principle1)이 유용한가?
- 요구 사항이 바뀌더라도 모듈 하나만 바꿔서 반영할 수 있기 때문이다.
왜 이름 짓기가 중요한가?
- 이름이 좋으면 코드가 읽기 쉬워지고, 코드를 바꾸려면 코드를 읽어야 하기 때문이다.
ETC는 규칙이 아니라 가치
- 앞으로 어떤 모습으로 바뀔지 잘 모르겠을 때 언제건 궁극의 바꾸기 쉽게라는 길을 선택한다. 바로 여러분이 작성하는 코드를 교체하기 쉽게 만들도록 노력하는 것이다.
- 엔지니어링 일지에 현재 상황과 여러분의 선택, 그리고 변경 사항에 대한 추측을 정리해 둬라. 그리고 소스 코드에 이에 대한 표시를 남겨 둬라.
프로그래머로서 우리는 지식을 수집하고, 조직하고, 유지하며, 통제한다.
우리는 지식을 명세(specification)로 문서화하고, 실행 코드를 통해 그 지식에 생명을 부여한다.
모든 지식은 시스템 내에서 단 한 번만, 애매하지 않고, 권위있게 표현되어야 한다.
- 개발자 간의 중복에 대처하려면 크게는 의사소통을 잘하는 튼튼하고 유대가 돈독한 팀을 만들어야 한다.
- 일일 스크럼 스탠드업 미팅을 운영해 볼 수 있다. 슬랙(Slack) 채널같이 공통의 문제를 다루기 위한 공간을 만들라.
- 코드 리뷰를 통해서든 다른 사람의 소스 코드와 문서를 반드시 읽어라.
직교성은 기하학에서 빌려 온 용어다.
그래프의 축과 같이 두 직선이 직각으로 만나는 경우 직교한다고 말한다.
컴퓨터 과학에서 이 용어는 일종의 독립성이나, 결합도 줄이기(decoupling)를 의미한다.
직교성의 장점
- 직교적인 시스템을 작성하면 두 가지 큰 장점이 있다. 바로 생산성 향상과 리스크 감소다.
-
생산성 향상
변화를 국소화해서 개발 시간과 테스트 시간이 줄어든다
직교적인 접근법은 재사용도 촉진한다.
시스템이 더 느슨하게 결합되어 있을수록 재조합하고 개량하기 쉽다.
-
리스크 감소
감염된 코드가 격리되어 있다.
시스템이 잘 깨지지 않는다.
툴킷과 라이브러리
- 외부에서 만든 툴킷이나 라이브러리를 도입할 때 시스템의 직교성을 해치지 않는지 주의 깊게 살펴보기 바란다.
코딩
-
코드의 결합도를 줄여라
부끄럼쟁이shy 코드를 작성하라. 즉, 불필요한 것은 다른 모듈에 보여 주지 않으며, 다른 모듈의 구현에 의존하지 않는 코드를 작성하라.-
전역 데이터를 피하라
싱글턴을 사용할 때는 주의를 기울여라. 싱글턴은 불필요한 결합을 만들 수 있다.-
유사한 함수를 피하라
-테스트
-문서화
당신이 가진 생각이 딱 하나밖에 없다면, 그것만큼 위험한 것은 없다.
가역성
- 결정이 돌에 새겨진 것이 아니라 바닷가의 모래 위에 쓰인 글씨라 생각하라. 언제든지 큰 파도가 글씨를 지워버릴 수 있다.
유연한 아키텍쳐
- 여러분의 코드가 로큰롤(rock-n-roll)을 할 수 있게 하라. 락을 할 수도 있고 필요한 경우 롤을 할 수도 있게 하는 것이다.
어둠 속에서 빛을 내는 코드
- 예광탄이 효과적인 까닭은 일반 탄환과 동일한 환경 및 제약 조건에서 발사되기 때문이다. 탄환이 순식간에 목표물에 도달하기 때문에 기관총 사수는 즉각적인 피드백을 얻을 수 있다.
-
사용자가 뭔가 작동하는 것을 일찍부터 보게 된다.
-개발자가 들어가서 일할 수 있는 구조를 얻는다.
-통합(integration) 작업을 수행할 기반이 생긴다.
-보여줄 것이 생긴다.
-진행 상황에 대해 더 정확하게 감을 잡을 수 있다.
예광탄 코드 대 프로토타이핑
- 프로토타입은 나중에 버리는 코드를 만든다. 예광탄 코드는 기능은 별로 없지만 완결된 코드이며, 최종 시스템 골격 중 일부가 된다. 프로토타입은 예광탄을 발사하기 전에 먼저 수행하는 정찰이나 정보 수집과 같은 것이다.
프로토타입을 어떻게 사용할 것인가?
프로토타입을 만들 때 무시해도 좋은 세부 사항은 무엇인가?
-
정확성
적절히 가짜 데이터를 사용할 수 있다.
-완정성
프로토타입은 제한된 방식으로만 작동하기도 한다.
어쩌면 미리 선정한 입력데이터 하나와 한 가지 메뉴 항목만 작동해도 될 것이다.
-안정성
오류 검사를 빼먹거나 아예 무시할 수도 있다.
-스타일
프로토타입 코드에는 주석이나 문서가 많지 않아야 한다.
프로토타이핑의 목적은 전체적으로 시스템이 어떻게 동작할지에 대해 감을 잡는 것이다.
프로토타입 코드를 사용하지 않도록 하려면?
- 프로토타입을 코드로 만들 때는 시작하기 전에 항상 모든 사람에게 여러분이 폐기 처분할 코드를 작성하고 있다는 사실을 이해시켜야 한다.
- 프로토타입임을 모르는 사람에게는 오해를 살 정도로 매력적일 수도 있기 때문이다.
- 코드는 폐기할 것이고, 불완전하며, 완성할 수 없다는 사실을 분명히분명히 주지시켜야 한다.
미국 워싱턴 D.C.의 의회 도서관은 현재 75테라바이트의 디지털 정보를 온라인에 올려 두고 있다고 한다.
빠르게 대답하라! 1Gbps 네트워크로 이 정보를 모두 전송하려면 시간이 얼마나 걸릴까?
백만 개의 이름과 주소를 저장하려면 저장 공간이 얼마나 필요할까?
100Mb의 텍스트를 압축하는 데 시간이 얼마나 필요할까?
프로젝트가 끝나려면 몇 개월이 더 필요할까?
얼마나 정확해야 충분히 정확한가?
기간 | 추정의 단위 |
---|---|
1 ~ 15일 | 일 |
3 ~ 6주 | 주 |
8 ~ 20주 | 달 |
20주 이상 | 추정치를 말하기 전에 다시 한번 생각해 보라. |
추정치는 어디에서 나오는가?
-
무엇을 묻고 있는지 이해하라
-시스템의 모델을 만들어라
-모델을 컴포넌트로 나눠라
-각 매개 변수에 값을 할당하라
-답을 계산하라
-여러분의 추정 실력을 기록하라
프로젝트 일정 추정하기
- 미사일에 페인트칠하기
A: 이 집에 페인트를 칠하려면 얼마나 걸릴까요?
B: 글쎄요. 아무 문제가 없고 페인트 제품 설명에 나오는 리터당 도포 면적이 정확하다면
10시간 만에도 될 겁니다.
B: 하지만 사실 그보다는 더 걸릴 것 같군요. 18시간이 더 현실적인 숫자인 것 같습니다.
B: 물론 날씨가 나빠지면 30시간 넘게도 걸릴 수 있지요.
미 해군이 폴라리스라는 잠수함 발사용 탄도 미사일 개발 프로젝트 계획을 세울 때 프로그램 평가 검토 기법(Program Evaluation Review Technique) 혹은 줄여서 PERT라고 부르는 방법론을 만들면서 이런 추정 방식을 도입했다.
과업을 의존성에 따라 네트워크 형태로 배열한 후, 간단한 통계 기법을 사용하여 전체 프로젝트의 예상 최소 및 최대 소요 시간을 계산한다.
하지만 우리는 PERT를 썩 좋아하지 않는다. 사람들은 벽을 가득 채우는 큰 차트에 프로젝트의 모든 과업을 그려 놓고는 은근히 자신들이 정확한 추정치를 갖고 있으리라 믿는다.
- 코끼리 먹기
-
요구 사항 확인하기
-위험을 분석하고 위험도가 높은 부분을 우선하기
-설계, 구현, 통합
-사용자와 함께 검증하기
초기 기능의 구현과 테스트를 마친 후, 이를 첫 번째 반복 주기의 끝으로 삼아라. 첫 반복 주기의 경험을 바탕으로 반복 주기의 수와 각 반복 주기에서 무엇을 할지에 대한 처음의 추측을 다듬을 수 있을 것이다.
이런 추정은 보통 각 반복 주기가 끝날 때 팀 리뷰 회의 시간에 한다.
이 방법은 경영진에게 별로 인기가 없다. 경영진은 보통 프로젝트가 시작되기도 전에 하나의 정확한 숫자를 원하기 때문이다.
이를 공식화하고 더 정확한 일정을 추정하는 것을 각 반복 주기의 일부로 삼았을 때, 여러분이 추정할 수 있는 가장 정확한 일정을 경영진에게 건넬 수 있을 것이다.
누군가 추정해 달라고 하면 뭐라고 대답해야 할까?
- "나중에 연락드릴게요." 라 말해야 한다. 잠시 손을 멈추고 시간을 내어 이번 항목에서 설명한 단계를 밟아 나간다면 대부분의 경우 더 좋은 추정치를 얻을 수 있을 것이다. 커피 머신 앞에서 허투루 말한 추정치는 커피와 마찬가지로 여러분에게 해를 끼칠 것이다.