반응형

실용주의 프로그래머

The Pragmatic Programmer

 

9장. 실용주의 프로젝트

Pragmatic Projects (p.77)

 

Topic 49. 실용주의 팀 (p.378)

실용주의 철학을 살리면서 이를 어떻게 이룰 수 있는지.

 

이 책에서 이제까지 살펴본 실용주의 기법들은 팀에도 적용된다.

 

실용주의 팀은 작다.

구성원이 대략 10~12명 이하여야 하고, 구성원이 추가되거나 빠지는 일은 드물어야 한다.

모두가 서로 잘 알고, 신뢰하며, 의존해야 한다.

 

TIp 84. 작고 안정적인 팀을 유지하라
팀은 작고 안정적이어야 한다. 모두가 서로를 신뢰하고 의존해야 한다.

 

* 깨진 창문을 없애라

품질은 팀의 문제다.

품질은 팀원 모두가 제각기 기여할 때만 보장된다.

품질은 애초에 제품에 포함된 것이지 나중에 덧붙이는 것이 아니다.

 

* 삶은 개구리

모든 사람이 적극적으로 환경 변화를 감시하도록 권장하라.

무엇이건 간에 애초에 인지하고 있던 것과 다른 것들을 늘 깨어서 의식해야 한다.

새 요구사항에 대한 수치를 관리하라.

 

* 여러분의 지식 포트폴리오를 계획하라

성공을 원하는 팀이라면 자신들의 지식과 기술에 투자하는 것을 고려해야 한다.

새로운 기능을 만드는 것 외에도 해야 할 일들이 있다.

1. 구형 시스템 유지 보수

2. 프로세스 회고와 개선

3. 새로운 기술 탐험

4. 학습 및 기술 갈고 닦기

 

Tip 85. 실현하려면 계획하라.
계획하지 않으면 실현되지 않을 것이다. 회고, 실험, 학습, 기술연마를 계획하라.

 

* 팀의 존재를 소통하라

팀도 나머지 세상과 명확하게 의사소통해야 하는 존재다.

외부 사람들에게 무뚝뚝하고 과묵해 보이는 프로젝트팀이야말로 최악이다.

 

훌륭한 프로젝트팀은 뚜렷한 특성이 있다.

생산해 내는 문서는 깔끔하고 정확하며 일관적이다.

 

프로젝트 시작할 때, 팀 이름을 짓고 괴짜스러운 로고도 만들어 사용하라.

사람들과 대화를 할 때 자신의 팀 이름을 거리낌 없이 사용하라.

팀은 정체성 확립의 기반을 얻을 것이고,

세상은 여러분의 작업과 관련해서 기억할 만한 뭔가를 얻게 될 것이다.

 

* 반복하지 말라

즉각적이고 매끄러운 의사소통이 중복된 일(문제)을 피하는 핵심이다.

여러분은 팀 동료에게 질문을 하고 거의 즉각적으로 답을 받을 수 있어야 한다.

DRY(Don’t Repeat Yourself)를 지키려면 서로 관심을 유지하라.

 

* 팀 예광탄

작업에 필요한 기술을 팀 안에 모두 갖추어야 한다.

프론트엔드, UI/UX, 서버, DBA, QA 등이 모두 함께 일하는 것이 편안하고 익숙해야 한다.

 

Tip 86. 모든 기능을 갖춘 팀을 조직하라.
직무가 아니라 기능성을 중심으로 팀을 조직하라.
UI/UX 디자이너와 코더를 분리하거나, 프론트엔드와 백엔드,
테스터와 데이터 모델러, 설계와 배포를 분리하지 말라.
코드를 처음부터 끝까지 점진적이고 반복적으로 만들 수 있는 팀을 조직하라.

 

* 자동화

일관성과 정확성을 모두 보장하는 확실한 방법은 팀이 하는 모든 일을 자동화하는 것이다.

도구 제작 역량을 팀내에 꼭 갖추어서 프로젝트 개발과 서비스 배포를 자동화하는 도구를 만들고 적용하라.

 

* 멈춰야 할 때를 알라

각 팀원이 자신의 방식대로 빛나게 하라.

팀원들을 지원하기에, 그리고 프로젝트가 가치를 만들어 내기에 딱 좋을 만큼의 구조를 제공하라.

 

 

Topic 50. 코코넛만으로는 부족하다 (p.387)

성공의 진정한 비법.

 

눈에 잘 띄는 결과물을 만드는 데만 투자하면서 기반이 되는 작업이 마법처럼 끝나 있기를 소망하지 말라.

피상적인 결과물에만 투자하지 말라.

 

* 맥락의 중요성

유행에 속아 넘어가지 말라.

특정한 결과물, 피상적인 구조나 정책, 프로세스, 방법론만으로는 부족하다.

 

Tip 87. 유행하는 것이 아니라 실제로 잘 맞는 것을 사용하라.
다른 회사가 쓴다는 이유만으로 개발 방법론이나 기법을 도입하지 말라.
여러분의 팀과 여러분의 환경에 잘 맞는 것을 도입하라.

 

가장 근본적인 실용주의 기법을 적용하여 "잘 맞는 것"을 알 수 있다.

 

작은 팀 하나나 조직에서 아이디어를 시험해 보라.

잘 맞는 것 같은 좋은 부분만 유지하고

나머지는 낭비나 비용일 뿐이므로 버리면 된다.

 

* 만병통치약은 아무 병도 못 고친다

소프트웨어를 개발할 때 늘 따를 수 있는 단 하나의 계획이란 것은 없다.

기존의 규칙 너머를 보고 개선의 여지를 찾아내는 능력이 필요하다.

여러 특정 방법론에서 가장 좋은 부분만 가져다가 적절히 조정하여 사용해라.

 

* 진짜 목표

진짜 목표는 작동하는 소프트웨어를 제공 함으로써 사용자가 즉각적으로 새로운 일을 할 수 있게 되는 것이다.

 

Tip 88. 사용자에게 필요할 때 제공하라.
프로세스가 그렇다는 이유만으로 몇 주 혹은 몇 달이나 기다리게 하지 말라.

 

Topic 51. 실용주의 시작 도구 (p.392)

버전 관리, 테스트, 자동화.

 

어떤 작업이건 간에 일상적인 작업은 모두 자동화해야 한다.

 

* 버전 관리로 운용하라

Tip 89. 버전 관리 시스템으로 빌드, 테스트, 릴리스를 운용하라.
커밋이나 푸시로 빌드, 테스트, 릴리스를 시작시켜라.
버전 관리 시스템의 태그로 서비스 배포 여부를 지정하라.

 

* 가차 없고 지속적인 테스트

Tip 90. 일찍 테스트하고, 자주 테스트하라. 자동으로 테스트하라.
빌드 때마다 도는 테스트는 책장에 꽂혀 있는 테스트 계획보다 훨씬 더 효과적이다.

 

코드를 작성하자마자 테스트해야 한다.

 

Tip 91. 모든 테스트가 끝날 때까지는 코딩이 끝난 게 아니다.
당연하다.

 

단위 테스트

'단위 테스트'는 하나의 모듈을 테스트하는 코드다.

다음 단계로 넘어가기 전 사용하는 모든 모듈의 단위 테스트가 반드시 통과해야 한다.

모든 모듈이 시스템 전체에 걸쳐 어떻게 사용되고 상호 작용하는지 테스트해야 한다.

 

통합 테스트

'통합 테스트(integration test)'는 프로젝트를 구성하는 주요 서브시스템이 다른 부분과 제대로 작동하는지 보여준다.

 

유효성 평가 및 검증 (Validation and Verification)

최종 사용자의 접근 방식에 대해, 그리고 그것이 개발자의 테스트 데이터와 어떻게 다른지에 대해 관심을 기울여라.

 

성능 테스트

'성능(performance) 테스트' 혹은 스트레스 테스트 역시 프로젝트의 중요한 측면이다.

실세계 조건에서 성능 요구 사항들을 준수하는지 자문해 보라.

 

테스트를 테스트하기

완벽한 소프트웨어를 작성할 수 없기 때문에,

완벽한 테스트 소프트웨어 역시 작성할 수 없다.

 

Tip 92. 버그를 심어 놓고 테스트를 테스트하라.
소스 코드의 복사본에 고의로 버그를 심어 놓고 테스트가 잡아내는지 검증하라.

테스트를 작성할 땐 경보가 필요할 때 정말 울리는지 확인하라.

 

철저한 테스트

충분히 필요한 만큼 철저하게 테스트했다는 것은 알 수 없다!

Tip 93. 코드 커버리지만 올리지 말고 상태 조합을 테스트하라.
중요한 프로그램 상태들을 파악해서 테스트하라.
테스트에서 각 줄을 수행했다는 것만으로는 부족하다.

 

속성 기반 테스트

테스트하려는 코드의 계약과 불변식에 따라 테스트 데이터를 생성하는 '속성 기반' 테스트 기법을 사용하라.

 

* 그물 조이기

Tip 94. 버그는 한 번만 잡아라.
한번 인간 테스터가 버그를 찾았다면 더는 인간 테스터가 그 버그를 만나서는 안 된다.
그 이후로는 자동화 테스트가 확인해야 한다.

 

* 전체 자동화

Tip 95. 수작업 절차를 사용하지 말라.
컴퓨터는 똑같은 명령을 똑같은 순서로 반복해서 실행할 것이다.

 

Topic 52. 사용자를 기쁘게 하라 (p.402)

모든 프로젝트에서 후원자를 어떻게 기쁘게 하는지.

 

개발자로서 우리의 목표는 사용자를 기쁘게 하는 것이다.

 

어떻게 사용자들이 기대하는 것을 밝혀낼 수 있을까?

이 프로젝트가 끝나고 한 달(혹은 일 년이라든지) 후에 우리가 성공했는지 어떻게 알 수 있을까요?

고객 잔존율, 데이터의 품질, 절감한 비용 등으로 판단할 수 있다.

소프트웨어 프로젝트 자체가 아니라 이런 성공 척도가 진짜로 의미 있는 사업 가치다.

소프트웨어는 이런 목적을 달성하기 위한 수단일 뿐이다.

 

- 모두 사용자의 기대를 파악

- 사용자의 기대에 더 가까운 선택

- 요구 사항을 비판적으로 분석

- 프로젝트 진행 중 사용자의 기대에 대하여 계속 생각

 

Tip 96. 사용자를 기쁘게 하라. 그저 코드만 내놓지 말라.
사용자의 사업 가치를 창조하는 해법을 개발하라.
그리고 매일 사용자를 기쁘게 하라.

진정한 여러분의 직함은 "문제 해결사"다.

이것이 우리가 하는 일이고, 실용주의 프로그래머의 본질이다.

 

우리는 문제를 해결한다.

 

Topic 53. 오만과 편견 (p. 404)

자신의 작업에 자부심(pride)을 갖고 여러분의 서명을 남겨라.

 

실용주의 프로그래머는 책임을 회피하지 않는다.

Tip 97. 자신의 작품에 서명하라.
옛 장인들은 자신의 작품에 서명하는 것을 자랑스러워했다.
여러분도 그래야 한다.

 

다른 사람의 코드를 존중해야 한다.

코드에는 주인이 있어야 하지만 꼭 개인일 필요는 없다.

 

사람들이 코드에 붙은 여러분의 이름을 보고 그것이 튼튼하고 잘 작성되었으며,

제대로 테스트되었을 뿐 아니라 훌륭히 문서화되었을 것이라고 기대하도록 만들자.

 

전문가가 만든 진정으로 전문가다운 결과물.

실용주의 프로그래머.

 

끝.

 

 

맺는말

우리는 백지에서 시작하여 우리가 상상할 수 있는 거의 무엇이든 만들어 낼 수 있다.

그리고 우리가 만드는 것이 세상을 바꿀 수 있다.

어떤 결과가 나올지는 여러분의 손에 달렸다.

 

* 도덕적 잣대

의도치 않은 이 힘의 대가로 우리는 늘 경각심을 가져야 한다.

우리는 우리가 내놓는 모든 코드마다 두 가지 질문을 던질 책임이 있다.

1. 사용자를 보호했는가?

 나는 이 코드의 사용자를 위험으로부터 보호하기 위해 최선을 다했는가?

Tip 98. 먼저, 해를 끼치지 말라.
실패는 피할 수 없다. 그로 인해 누구도 고통받지 않게 하라.

2. 나라면 이것을 쓸까?

 내가 이 소프트웨어의 사용자라면 만족스러울까?

Tip 99. 쓰레기 같은 인간을 돕지 말라.
여러분도 똑같은 인간이 되고 말 것이다.

 

* 여러분이 원하는 미래를 상상하라

여러분에게 달렸다.

여러분은 자신 그리고 여러분 후손들의 미래를 만들고 있다.

우리 모두가 살고 싶은 미래를 만드는 것이 여러분의 책무다.

 

우리가 가질 수 있는 미래를 그리고, 실제로 그런 미래를 만들어 내는 용기를 가져라.

매일매일 허공에 성을 지어라.

 

우리 모두에게는 아름다운 인생이 있다.

Tip 100. 결국 당신의 삶이다.
삶을 사람들과 나누고, 삶을 축하하고, 삶을 만들어가라.
그리고 그걸 즐겨라!
우리에게 주어진 놀라운 삶을 즐기고, 위대한 일을 하라.

 

 

 

 

반응형

실용주의 프로그래머

The Pragmatic Programmer

 

8장. 프로젝트 전에

Before the Project (p.349)

 

항목 45 - 흔한 함정이나 곤란한 상황에 빠지지 않는 법을 익혀라.

항목 46 - 일반 통념과 제약 조건 관리(constraint management)

항목 47 - 우리가 생각하는 함께 일하기는 코딩하는 동안 문제를 함께 푸는 것이다.

항목 48 - 애자일 선언(Agile Manifesto)은 "공정(process)과 도구보다 개인과 상호 작용"으로 시작한다.

 

여러분 그리고 여러분의 팀은 프로젝트를 시작할 때 요구 사항을 파악해야 한다.

 

Topic 45. 요구 사항의 구렁텅이 (p.350)

완성이라는 것은 더 이상 더할 것이 없을 때가 아니라, 더 이상 뺄 것이 없을 때 달성되는 것이다.
- 앙투안 드 생텍쥐페이(Antoine de St. Exupery), <바람과 모래의 별들>

많은 책과 튜토리얼에 따르면 '요구 사항 수집'은 프로젝트 초기에 이뤄진다.

 

Tip 75. 자신이 뭘 원하는지 정확히 아는 사람은 아무도 없다.

 

* 요구 사항 미신

소프트웨어 산업 초창기 컴퓨터가 컴퓨터를 다루는 사람보다 훨씬 비싸던 시절이 있었다.

비용을 절약하기 위해서 기계가 해야 할 일을 정확하게 기술하려고 애썼다.

돈이 많이 들었기에 사람들은 자신이 원하는 것을 정확히 알 때만 자동화를 시도하게 되었다.

초기의 컴퓨터는 기능이 충분치 않아서 해결 가능한 문제의 폭도 제한적이었다.

그래서 문제 이해 후 작업을 시작하는 것이 실제로 가능했다.

 

진짜 세상은 엉망이고 갈등이 넘쳐나며 알 수 없는 점도 많아서,

무엇을 다루든 정확한 명세란 것은 거의 불가능하다고 볼 수 있다.

그래서 프로그래머들이 등장했다.

Tip 76. 프로그래머는 사람들이 자신이 원하는 바를 깨닫도록 돕는다.
소프트웨어 개발은 사용자와 프로그래머의 공동 창작 작업이다.

 

* 상담 치료로서의 프로그래밍

우리의 경험상 최초의 요청 사항은 궁극적인 요구 사항이 아니다.

의뢰인은 인식하지 못할 수도 있지만, 의뢰인의 요청 사항은 사실 함께 탐험을 떠나자는 초대장이다.

 

의뢰인이 미처 고려해 보지 않은 문제도 있을 것이다.

여기가 바로 일이 재미있어지는 부분이다.

좋은 개발자라면 협상 능력을 키울 수 있는 상황이기도 하다.

 

의뢰인과의 소통을 통해서 판단을 내리며 해결책을 만드는 데 참여한다.

여러분이나 의뢰인이 혼자서 만들어 내는 것보다 아마 더 좋을 것이다.

 

* 요구 사항은 과정이다

 

Tip 77. 요구 사항은 피드백을 반복하며 알게 된다.
요구 사항을 이해하려면 탐험과 피드백을 거쳐야 한다.
결정한 요구 사항의 여파를 바탕으로 처음의 발상을 다듬는다.

 

의뢰인이 제시한 요구 사항에 대한 피대븍을 주고 의뢰인은 피드백을 바탕으로 자기 생각을 더 가다듬는다.

 

우리는 모형(mockup)이나 프로토타입을 만들어서 의뢰인이 직접 다루어 볼 수 있도록 한다.

공들여 만들지 않아도 생각을 전달할 수만 있으면 된다.

 

실용주의 프로그래머는 프로젝트 전체를 요구 사항 수집 과정으로 보아야 한다.

과정의 반복 주기가 끝날 때마다 직접 의뢰인에게 피드백을 받는다.

혹시 정말로 잘못된 방향으로 가더라도 잃어버리는 시간을 최소화할 수 있다.

 

* 의뢰인의 입장에서 보라

시스템이 실제로 어떻게 사용될지 통찰을 얻을 수 있을 뿐 아니라,

옆에서 지켜보는 것으로 의뢰인과 신뢰를 구축하고 의사소통의 기반을 다지는 데

얼마나 도움이 되는지 놀라게 될 것이다.

 

Tip 78. 사용자처럼 생각하기 위해 사용자와 함께 일하라.
시스템이 정말로 어떻게 사용될지 통찰을 얻을 수 있는 가장 좋은 방법이다.

 

* 요구 사항 대 정책

 

Tip 79. 정책은 메타데이터다.
정책을 시스템 코드 안에 고정하지 말라. 대신 시스템이 사용하는 메타데이터로 표현하라.

 

* 요구 사항 대 현실

도구가 성공하려면 사용하는 사람의 손에 적응할 수 있어야 한다.

이 점도 염두에 두어야 성공적으로 요구 사항을 수집할 수 있다.

 

* 요구 사항 문서화

우리는 최고의 요구 사항 문서, 아니 아마 유일한 요구 사항 문서는 작동하는 코드라고 믿는다.

문서는 구현 과장에서 안내 역할을 하는 이정표일 뿐이다.

 

요구 사항 문서는 의뢰인을 위한 것이 아니다

의뢰인이 프로그래머를 고용하는 이유는,

의뢰인은 고차원적이고 모호한 측면이 있는 문제를 풀고 싶어 하는 반면,

프로그래머는 세부 사항과 미묘한 차이 하나하나에 관심을 두기 때문이다.

요구 사항 문서는 개발자를 위해서 쓰는 것이다.

 

요구 사항 문서는 계획을 위한 것이다

작은 인덱스 카드에 애플리케이션의 작은 일부가 그 기능을 쓰는 사용자 관점에서 어떻게 작동해야 하는지를 적자.

요구 사항을 화이트보드에 붙일 수도 있고, 상태나 우선순위를 표현하기 위해 이리저리 옮길 수도 있다.

요구 사항 설명을 짧게 제한하면 개발자들이 명확하지 않은 점을 물어보도록 유도할 수 있다.

코드를 작성하기 전이나 작성하는 도중에 일어나는 의뢰인과 개발자 간의 피드백 과정이 더 활발해질 수 있다.

 

* 지나치게 자세한 명세

요구 사항 문서를 만들 때 생기는 또 다른 심각한 문제는 지나치게 자세히 서술하는 것이다.

좋은 요구 사항은 추상적이다.

사업에 필요한 사항을 정확히 반영하는 가장 간단한 표현이 최고다.

 

요구 사항은 아키텍처가 아니다.

요구 사항은 설계가 아니며 사용자 인터페이스도 아니다.

요구 사항은 필요를 표현하는 것이다.

 

* 딱 하나만 더......

반복 주기를 거치며 의뢰인과 정기적으로 피드백을 주고 받자.

피드백은 서로 주고받는 것이다.

 

* 용어 사전 관리하기

'프로젝트 용어 사전(glossary)'을 만들고 관리하라.

용어 사전에 여러 사람이 접근하기 쉬워야 한다.

온라인 문서가 적합하다.

 

Tip 80. 프로젝트 용어 사전을 사용하라.
프로젝트에서 쓰이는 용어와 어휘들을 모두 한곳에 모으고 관리하라.

 

 

Topic 46. 불가능한 퍼즐 풀기 (p.362)

절대적 제약 조건은 그것이 아무리 불쾌하거나 어리석어 보여도 꼭 따라야 한다.

 

* 자유도

어떤 퍼즐이든 그것을 해결하는 열쇠는 제약을 인식하는 것과 더불어

여러분에게 주어진 자유도(degree of freedom)를 파악하는 것이다.

 

문제는 틀을 찾는 것, 곧 진짜 제약을 찾는 일이다.

 

Tip 81. 생각의 틀을 벗어나지 말고, 틀을 찾아라.
불가능한 문제와 마주쳤다면 진짜 제약 조건을 찾아라.
스스로 물어보라.
‘정말로 반드시 이렇게 해야 하나? 꼭 해야 하는 일이긴 한가?’

 

풀리지 않는 문제와 마주쳤다면 생각해 볼 수 있는 모든 해결 경로 후보를 눈앞에 나열해 보라.

제약을 범주별로 나누고 우선순위를 매겨라.

제일 구속이 심한 제약부터 파악해 내고 나머지 제약을 그 안에서 맞춰 보아야 한다.

 

* 자신만의 방법에서 빠져나오라

문제가 생각보다 훨씬 어려울 때 잠깐 다른 일을 해보자.

산책을 하거나 아예 내일로 미루거나..

 

여러분이 일부러 딴짓을 하고 있을 때 갑자기 여러분의 머릿속에 답이 떠오르는 일이

얼마나 자주 일어나는지 놀라게 될것이다.

 

간단히 표현하면 딴짓을 한 사람이 의식적으로 노력한 사람보다 복잡한 문제 해결 과제를 더 잘 해냈다.
- 사이콜로지 투데이(Psychology Today)

 

그저 문제에 대해 이야기하는 것으로 주의를 돌리기만 해도 깨달음을 얻을 때가 있다.

 

* 행운은 준비된 사람에게 찾아온다

문제 해결에 필요한 원료는 바로 해답에 도움이 될 수 있는 경험이다.

여러분의 뇌에 경험을 주입하는 가장 좋은 방법은

이상적인 작업을 할 때 무엇은 잘되고 무엇은 안되는지 피드백을 주는 것이다.

언제나 "겁먹지 마시오.(DON'T PANIC.)"

 

 

Topic 47. 함께 일하기 (p.367)

사용자와 밀접하게 함께 일해라.

사용자는 여러분 팀의 일원이다.

 

한 사람이 코드를 입력하는 동안 한 명 혹은 여러 명의 팀 동료가 조언하고 고민하며 문제를 함께 푸는 것.

이 방식은 함께 일하는 아주 강력한 방법이다.

끝없는 회의나 제안서보다, 그리고 유용성보다 무게를 더 중시하는 법률 문서스러운 문서 뭉치보다 훨씬 낫다.

 

그저 질문하고, 토론하고 메모를 하는 것이 아니라,

실제로 코딩을 하는 와중에 질문을 하고 토론을 하는것이다. (중요하다!)

 

* 짝 프로그래밍(pair programming)

직접 코드를 작성하는 사람 외의 사람의 존재로 인해 생기는 사회적인 압력은

변수 이름을 foo로 짓는 것 같은 나쁜 습관이나 약점으로부터 우리를 지켜준다.

 

다른 사람이 지켜보고 있으면 민망할 수도 있는 꼼수를 덜 쓰게 되고,

결과적으로 소프트웨어의 품질이 좋아진다.

 

* 몹 프로그래밍(mob programming)

셋 이상의 사람이 참여하는 짝 프로그래밍의 확장판이다.

'실시간 코딩을 곁들인 밀접한 협업'이라고 생각해도 될 것이다.

 

* 무엇을 해야 할까?

현재 늘 혼자서 프로그래밍을 하고 있다면 짝 프로그래밍을 시도해 봐도 좋을 것이다.

새로운 아이디어를 모아야 하거나 골치 아픈 문제를 분석해야 한다면 몹 프로그래밍 시간을 가져 봐도 좋을 것이다.

이렇게 함께 일하는 동안 기술적인 면 외에 인간적인 측면도 신경 써야 한다.

 

가장 먼저 고려할 만한 몇 가지 팁.

- 코드를 짜는 거지 자아(ego)를 쌓는 게 아니다. 우리 모두는 각자 뛰어난 부분이나 장단점이 있다.

- 소규모로 시작하라.

- 코드만 비판하고 사람을 비판하지 말라.

- 다른 것은 틀린 것이 아니다. 이해하려고 노력하라.

- 자주 회고를 하라. 개선할 점을 찾아라.

 

여러분과 여러분의 팀이 늘 한 가지 방법으로만 일했다면,

다른 방식을 실험해 보는 것이 좋다.

예) 몹 프로그래밍을 할 때는 키보드로 입력하는 사람을 5~10분마다 바꿔 주어야 한다.

 

교과서와 사례 보고서를 모두 찾아보고 연구를 좀 하라.

곧장 코드로 뛰어들기보다는 간단한 연습 문제로 시작하라.

 

Tip 82. 코드에 혼자 들어가지 말라.
프로그래밍은 어렵고 힘들 수 있다. 친구와 함께 가라.

 

 

Topic 48. 애자일의 핵심 (p.372)

애자일은 여러분이 일하는 방식이지 여러분이 아니다.

 

Tip 82. 애자일은 명사가 아니다. 애자일은 무언가를 하는 방식이다.
애자일은 형용사다. 즉, 무언가를 하는 방식이다.

 

애자일 선선에서 언급한 가치를 기억하라.

우리는 소픝트웨어를 개발하고, 또 다른 사람의 개발을 도와주면서 소프트웨어 개발의 더 나은 방법들을 찾아가고 있다. 이 과정에서 우리는 다음과 같은 가치를 찾아냈다.
- 공정과 도구보다 개인과 상호작용
- 포괄적인 문서보다 작동하는 소프트웨어
- 계약 협상보다 고객과의 협력
- 계획을 따르기보다 변화에 대응하기
왼쪽에 있는 것도 가치가 있지만 오른쪽에 있는 것에 더 높은 가치를 둔다.

 

애자일의 가치는 소프트웨어를 만드는 더 나은 방법을 지속적으로 탐구하는 과정에서 찾고 알게 되는 것이다.

 

* 애자일 프로세스라는 것은 있을 수 없다

애자일,

즉 기민함이란 것은 변화에 대응하는 것,

일을 시작한 이후 맞부딪히는 미지의 것에 대응하는 것이 전부이다.

 

소프트웨어를 개발할 때 따라야 할 단 한 가지 계획이란 없다.

온통 피드백을 수집하고 그에 대응하라.

 

* 그래서 우리는 무엇을 해야 할까?

애자일 선언은 피드백을 모으고 그에 맞게 행동함으로써 불확실성을 헤쳐 나가라고 제안한다.

 

애자일하게 일하는 방법.

1. 여러분이 어디에 있는지 알아내라.

2. 도달하고 싶은 곳을 향하여 의미 있는 발걸음을 가능한 한 작게 옮겨라.

3. 어디에 도착했는지 평가하고, 망가트린 것이 있으면 고쳐라.

위 과정을 끝날 때까지 반복하라.

 

지속적으로 프로세스를 실험하지 않는 팀은 애자일 팀이 아니다.

 

* 이 과정이 설계를 주도한다

좋은 설계는 나쁜 설계보다 바꾸기 쉬운 결과물을 만든다.

애자일에 대한 이 논의는 왜 바꾸기 쉬워야 하는지를 알려준다.

 

우리 피드백 고리를 효율적으로 만들려면 가능한 한 고치는 일이 쉬워야 한다.

 

애자일이 전반적으로 작동하게 하려면 좋은 설계를 만들어야 한다.

좋은 설계는 무언가를 바꾸기 쉽게 하기 때문이다.

바꾸기 쉽다면 모든 층위에서 아무런 주저 없이 문제를 바로잡을 수 있을 것이다.

 

이것이 애자일이다.

 

 

 

 

반응형

실용주의 프로그래머

The Pragmatic Programmer

 

7장. 코딩하는 동안

While You Are Coding (p.273)

 

일단 코딩에 들어가면 대부분 기계적인 작업,

즉 설계 내용을 컴퓨터가 실행 할 수 있는 문장으로 바꾸는 일만 하면 된다고들 많이 생각한다.

이런 태도가 소프트웨어 프로젝트가 실패하는 가장 큰 원인으로 볼 수 있다.

 

코딩은 기계적인 작업이 아니다.

코딩할 때는 매 순간 결정을 내려야 하는데,

프로그램이 정확하게 생산적으로 작동하면서 천수를 누리도록 하려면

사려 깊은 생각과 판단으로 결정을 내려야 한다.

 

코딩도 대부분은 반복적인 일이지만 정신을 늘 기민하게 유지하면 재앙을 막을 수 있다.

 

Topic 37. 파충류의 뇌에 귀 기울이기 (p.275)

오직 인간만이 무언가를 직접 보고, 정확한 예측에 필요한 모든 정보를 획득하고,

심지어 순간적으로는 정확한 예측을 한 후에도, 그런데 그것이 아니라고 말할 수 있다.

- 개빈 드 베커(Gavin de Becker), <서늘한 신호(The Gift of Fear)>

 

프로그래머로서 경험이 늘어 갈수록 여러분의 뇌에는 암묵적인 지식이 켜켜이 쌓인다.

여러분은 자신의 뇌가 하는 일을 자각하지 못하더라도 뇌는 계속 저장을 하고 있는 것이다.

 

어디에서 왔는지에 상관업싱 모든 본능에는 공통점이 있다.

 

* 백지의 공포

첫번째 원인,

파충류의 뇌가 여러분에게 무언가 할 말이 있어서다.

인식의 지평 바로 밑에 도사리고 있는 모종의 의심이 있다. 이런 의심은 중요하다.

어떤 작업을 앞두고 마음속에 의심이 계속 남아 있거나 왠지 꺼림칙하다면,

여러분의 경험치 여러분에게 말을 거는 중일지도 모른다.

직감이 여러분의 역량에 일조하도록 하라.

두번째 다른 원인은,

여러분은 그저 실수할까 봐 두려운 것일 수 있다.

합리적인 두려움이다.

우리 개발자들은 코드에 많은 것을 투자한다. 그 때문이다.

 

* 자신과 싸우기

코딩이 어려운 날이 있다.

여러분의 코드가 무언가 말하려는 것이다.

지금 하려는 작업이 필요 이상으로 힘들다고 말이다.

이유가 무엇이든 코드가 보내는 피드백을 파충류의 뇌가 느끼고 있다.

그래서 여러분의 주의를 끌기 위해 필사적으로 노력하는 것이다.

 

* 파충류와 이야기하는 법

여러분의 본능, 여러분의 무의식, 파충류의 뇌에게 귀 기울이고 또 기울이기 바란다.

비법은 언제나 동일하다.

 

Tip 61. 여러분 내면의 파충류에게 귀 기울여라.
코드가 반발하는 것처럼 느껴진다면,
사실은 여러분의 무의식이 무엇인가 잘못되었다고 말하려는 것이다.

 

1. 하고 있는 일을 멈춰라.

2. 문제를 표면으로 끄집어내 보라.

 

위와 관련하여 여러 방법들을 시도해 보았는데도 여전히 막혀 있을 수도 있다.

여러분의 뇌에게 여러분이 하려는 일은 별 문제가 없다고 알려줘야 한다.

바로 프로토타이핑을 하면 된다.

 

* 놀이 시간이다!

이미 존재하는 코드 위에서 작업하고 있어서 기존 코드 때문에 문제 해결이 여의치 않다면,

기존 코드를 잠시 다른 곳으로 밀어 두고 비슷한 것을 대신 프로토타이핑으로 만들어라.

 

1. 포스트잇에 "프로토타이핑 중" 이라고 써서 모니터 옆에 붙여라.

2. 프로토타이핑은 원래 실패한다고, 실패하지 않더라고 버리는 것이라는 점도 함께 상기시켜라. 프로토타이핑으로 손해 볼 일은 없다.

3. 텅 빈 에디터 화면에 여러분이 배우고 싶은 것 혹은 하고 싶은 것을 한 문장의 주석으로 표현해 보라.

4. 코딩을 시작하라.

 

포스틑잇을 보고, 명확한 문제로 구체화되면 즉각 해결하라.

마친 후 여전히 불안한 마음이 들면 다시 처음부터 시작하라.

첫 단계는 산책과 수다, 그리고 휴식이다.

단계를 반복하다 보면 무엇을 해야 하는지 알게 될 것이다.

모든 프로토타입 코드를 지우고, 포스트잇도 떼고, 비워진 에디터 창에 멋지고 빛나느 새 코드를 채워 넣어라.

 

* '여러분'의 코드뿐이 아니다

다른 사람의 코드를 실험하고 정리 작업 하면서 패턴을 찾아보라.

그런 식으로 코드를 작성해야만 했던 원인을 찾아낼 수 있다면 코드를 이해하는 일이 훨씬 더 쉬워질지도 모른다.

다른 사람들이 은연중에 적용한 패턴을 여러분은 의식적으로 적용할 수도 있다.

 

그 과정에서 여러분이 새로운 것을 배울 수도 있다.

 

* 코드뿐이 아니다

본능에 귀를 기울이고 문제가 여러분 앞에 튀어나오기 전에 미리 대처하라.

 

 

Topic 38. 우연에 맡기는 프로그래밍 (p.282)

우리는 우연에 맡기는 프로그래밍, 곧 행운과 우연한 성공에 의존하는 프로그래밍을 하지 않아야 한다.

대신 '의도적으로 프로그래밍'해야 한다.

 

* 우연에 맡기는 프로그래밍 하기

 

애초에 코드가 왜 잘 돌아가는지도 모른다면,

왜 코드가 망가졌는지도 모를 것이다.

 

우리도 우연에 맡길 때가 있다.

우연한 행운과 주도면밀한 계획을 착각하기 쉬운 경우도 종종 있다.

 

1. 구현에서 생기는 우연

단순히 코드가 지금 작성된 방식이 그렇기 때문에 생기는 우연한 일들이 있다.

이런 우연에 기대다 보면 결국 문서화되지 않은 에러나 예외적인 경우의 동작에 의존하게 되고 만다.

 

예시) 어떤 루틴을 잘못된 데이터를 가지고 호출 !

  > 예상 못한 데이터에 특정한 방식으로 반응

  > 그 반응을 기반으로 코드 작성

  >> 하지만! 그 루틴을 만든 사람의 의도는 그 루틴이 그런 식으로 작동하는 것이 아니었다..

 

가장 극단적인 경우는 여러분이 호출한 루틴이 실제로는 그렇게 설계된 루틴이 아닌데도

여러분이 원하는 효과를 내는 것처럼 보일 수도 있다.

잘못된 순서로 호출하거나, 잘못된 맥락에서 호출하는 것도 이와 관련된 문제다.

 

"이제 돌아는 가니까, 그대로 놔두는 편이 더 나을 거야......"

이런 함정에 빠지기 쉽다.

잘 작동하는데 더 괜히 건드려서 일을 만들 필요가 있을까?

우리가 보기에는 그래야 할 이유가 몇 가지 있다.

 

 - 정말로 제대로 돌아가는 게 아닐지도 모른다. 그저 그렇게 보이는 것일수도..

 - 여러분이 의존하는 조건이 단지 우연인 경우도 있다. 화면 해상도, CPU 코어 수 등등

 - 문서화되지 않은 동작은 라이브러리의 다음 릴리스에서 변경될 수도 있다.

 - 불필요한 추가 호출은 코드를 더 느리게 만든다.

 - 추가로 호출한 루틴에 새로운 버그가 생길 수도 있다.

 

다른 루틴을 호출할 때도 문서화된 동작에만 의존하라.

어떤 이유로든 그럴 수 없다면 추측을 문서로 상세히 남겨라.

 

2. 비슷하다고 괜찮을 리는 없다

특정한 경우에만 '딱' 특정한 현상이 발생하는 것은 그저 우연이다.

사실은 더 깊고 근본적인 문제가 있었을 것이다.

 

3. 유령 패턴

그저 우연에 불과한 것들 속에서, 인간은 언제나 패턴과 인과 관계를 찾으려고 한다.

 

테스트가 여러분의 장비에서는 통과했던 것 같은데 서버에서는 통과하지 못하는 이유는

두 환경의 차이 때문일 수도 있지만 어쩌면 그저 우연일 수도 있다.

가정하지 말라. 증명하라.

 

4. 상황에서 생기는 우연

잘 되는 듯한 답을 찾는 것과 올바른 답을 찾는 것은 다르다.

 

Tip 62. 우연에 맡기는 프로그래밍을 하지 말라.
믿을 만한 것만 믿어야 한다.
우발적인 복잡성에 주의하고,
우연한 행운을 목적을 가지고 세운 계획으로 착각하지 말라.

 

6. 암묵적인 가정

우연은 여러 단계에서 우리를 오도할 수 있다.

요구 사항을 만들어내는 단계부터 테스팅에 이르기까지 이 모든 단계에서 말이다.

가정하지 말라. 증명하라.

 

확고한 사실에 근거하지 않은 가정은

어떤 프로젝트에서든 재앙의 근원이 된다.

 

* 의도적으로 프로그래밍하기

우리는 코드를 마구 찍어 내는 데에 드는 시간을 줄이고 싶고,

또 가능한 한 개발 주기 초기에 오류를 잡아서 고치고 싶고,

애초부터 오류를 더 적게 만들고 싶어 한다.

> 의도적으로 프로그래밍해야 한다!

 

 - 언제나 여러분이 지금 무엇을 하고 있는지 알아야 한다.

 - 더 경험이 적은 프로그래머에게 코드를 상세히 설명할 수 있는가? 그렇지 않다면 아마 우연에 기대고 있는 것일 터..

 - 자신도 잘 모르는 코드를 만들지 말라.

 - 계획을 세우고 그것을 바탕으로 진행하라.

 - 신뢰할 수 있는 것에만 기대라.

 - 가정을 기록으로 남겨라.

 - 코드뿐 아니라 여러분이 세운 가정도 테스트해 보아야 한다. 어떤 일이든 추측만 하지 말고 실제로 시험해 보라.

 - 노력을 기울일 대상의 우선순위를 정하라.

 - 과거의 노예가 되지 말라. 기존 코드가 앞으로 짤 코드를 지배하도록 놓아 두지 말라.

   언제나 리팩터링할 자세가 되어 있어야 한다.

 

그러므로 앞으로 어떤 것이 잘 돌아가는 듯이 보이기는 하는데

여러분이 그 이유를 모를 경우

그것이 우연은 아닌지 반드시 확인하라.

 

 

Topic 39. 알고리즘의 속도 (p.291)

실용주의 프로그래머가 거의 날마다 하는 또 다른 종류의 추정이 있다.

바로 알고리즘이 사용하는 자원, 곧 시간, 프로세서, 메모리 등을 추정하는 것이다.

상식과 약간의 분석, 그리고 '대문자 O 표기법(Big-O notation)'이라고 부르는

근삿값을 기록하는 방식을 알아보자.

 

* 알고리즘을 추정한다는 말의 의미

일반적으로 입력의 크기는 알고리즘에 영향을 준다.

입력의 크기가 클수록 알고리즘의 수행 시간이 길어지거나 사용하는 메모리 양이 늘어난다.

 

우리는 반복문이나 재구 호출을 담고 있는 코드를 작성할 때면

언제나 무의식적으로 수행 시간과 필요한 메모리 양을 계산한다.

생각보다 훨씬 상세한 분석을 해야 하는 경우도 종종 실제로 있다.

이럴 때 대문자 O 표기법이 유용하다.

 

* 대문자 O 표기법

대문자 O 표기법은 근삿값을 다루는 수학적 방법으로

O()

와 같이 표기한다.

 

어떤 정렬 루틴이 원소 n개를 정렬하는 데 O(n²) 시간이 걸린다고 말할 때,

이는 그저 최악의 경우에 걸리는 시간이 n의 제곱에 비례하여 늘어난다고 얘기하는 것이다.

 

O가 '... 차수로(order of)'를 뜻한다고 생각하면 된다.

 

O() 표기법은 우리가 측정하는 값-시간, 메모리 등-의 상한을 기술하는 표기법이다.

n이 커질수록 가장 큰 차수에 비하면 다른 차수는 무시해도 될 정도이기 때문에,

관습적으로 최상위 차수를 제외한 다른 모든 차수는 제거하며,

상수인 계수도 표기하지 않는다.

 

O(n²/2) 는 O(n²)과도 같다.

 

대문자 O 표기법은 수행 시간이든 메모리든, 아니면 다른 무엇을 나타내든 실제 숫자를 알려주지 않는다.

그저 입력의 크기가 바뀜에 따라 이 값이 어떻게 바뀔지를 알려줄 뿐이다.

 

* 상식으로 추정하기

상식을 이용해서 간단한 알고리즘들의 차수를 대부분 추정할 수 있다.

 

단순 반복문

O(n) - 소진 탐색(exhaustive search), 배열에서 최댓값 찾기, 체크섬 생성하기 등

중첩 반복문

O(m x n) or O(n²) - 버블 정렬

반씩 자르기

반복문을 돌 때마다 작업 대상의 수를 반으로 줄여 나가는 알고리즘

O(log n) - 정렬된 목록의 이진 검색이나 이진 트리의 탐색, 정수의 2진수 표현에서 첫 번째 1인 비트를 찾는 문제 등

분할 정복(divide and conquer)

입력 데이터를 둘로 나눠서 각각 독립적으로 작업한 다음, 결과를 합치는 알고리즘

O(n log n) - 퀵 정렬(quicksort)

조합적(combinatoric)

알고리즘이 항목의 순열(permutation)을 다루기 시작하면 대부분의 경우 수행 시간은 걷잡을 수 없이 늘어난다.

순열에는 계승(factorial)이 따라오기 때문이다.

'난해(hard)'하다고 분류되는 문제를 푸는 알고리즘이 대개 여기에 속한다.

예시) 여행하는 외판원 문제(traveling salesman problem),

상자에 물건을 최적으로 집어넣는 문제(bin packing problem),

숫자 집합을 분할해서 각 부분 집합의 원소 합을 모두 같게 만드는 문제(partition problem) 등

 

종종 한정된 문제 도메인에서 이런 알고리즘의 수행 시간을 줄이기 위해 휴리스틱을 동원하기도 한다.

 

* 실전에서의 알고리즘 속도

들어올 수 있는 최댓값이 정해져 있다면 그 코드를 실행하는 데 시간이 얼마나 걸릴지 알 수 있다.

숫자가 외부 요인에 따라 달라진다면 잠시 작업을 멈추고 커다란 수가 들어왔을 경우

수행 시간이나 메모리 소모에 어떤 영향을 미칠지 생각해 보는 것이 좋다

 

Tip 63. 사용하는 알고리즘의 차수를 추정하라.
코드를 작성하기 전에 실행 시간이 얼마나 걸릴지 대략이라도 감을 잡아라.

 

코드의 실행 시간이 얼마나 될지 또는 메모리를 얼마나 사용할지 확실하지 않다면 직접 실행해 보라.

어떤 일을 하는 코드인지 코드 자체에 대해서도 생각해 보라.

이론적 요인과 실무적 요인을 모두 고려하려고 노력하라.

 

Tip 64. 여러분의 추정을 테스트하라.
알고리즘의 수학적 분석이 모든 것을 다 알려주지는 않는다.
실제 환경에서 코드의 수행 시간을 측정해 보라.

 

정확하게 시간을 재는 일이 어렵다면 '코드 프로파일러(code profiler)'를 사용하여

알고리즘이 돌아갈 때 각 단계의 실행 횟수를 센 다음 입력값 크기별 실행 횟수를 그래프로 그려 보라.

 

최고라고 언제나 최고는 아니다

적당한 알고리즘을 선택할 때도 실용적이어야 할 필요가 있다.

가장 빠른 알고리즘이 언제나 가장 좋은 알고리즘은 아니다.

 

'성급한 최적화(premature optimization)'를 조심하라.

언제나 어떤 알고리즘을 개선하느라 여러분의 귀중한 시간을 투자하기 전에

그 알고리즘이 정말로 병목인지 먼저 확인하는 것이 좋다.

 

 

Topic 40. 리팩터링 (p.300)

이 천지 만물 모두 변하나 ......
- H. F. 라이트(H.F. Lyte), <Abide with me(함께 하소서)>

코드는 정적인 존재가 아니다.

코드는 발전해야 한다.

 

소프트웨어 개발은 건축보다 정원 가꾸기에 더 가깝다.

딱딱하기보다는 유기적인 활동이다.

 

소프트웨어 개발의 현실은 정원 가꾸기 메타포에 훨씬 더 가깝다.

어떤 루틴이 너무 크게 자라거나 너무 많은 것을 하려고 할지도 모른다.

계획한 대로 잘 되지 않는 것들은 잡초 제거하듯 뽑아내거나 가지치기를 해야 한다.

 

코드 고쳐쓰기, 다시 작업하기, 다시 아키텍처 만들기는 모두 아울러서 '재구성(restructuring)'이라고 부른다.

그런 활동 중 일부를 따로 떼어 '리팩터링(refactoring)'이라는 이름으로 실천하기도 한다.

 

<리팩터링> 에서 마틴 파울러는 '리팩터링'을 다음과 같이 정의한다.

밖으로 드러나는 동작은 그대로 유지한 채 내부 구조를 변경함으로써
이미 존재하는 코드를 재구성하는 체계적 기법.

여기서 핵심 두 가지는 아래와 같다.

1. 이 활동은 체계적이다. 아무렇게나 하는 것이 아니다.

2. 밖으로 드러나는 동작은 바뀌지 않는다. 기능을 추가하는 작업이 아니다.

 

무질서하게 대규모로 코드를 다시 쓰는 것이 아니라, 정확한 목적을 가지고 정밀하게 접근하는 활동이다.

그래서 코드를 바꾸기 쉽게 유지하는 것이다.

 

밖으로 드러나는 동작이 바뀌지 않는다는 것을 보장하려면

코드의 동작을 검증하는 좋은 자동화된 단위 테스트가 필요하다.

 

* 리팩터링은 언제 하는가?

리팩터링은 여러분이 무언가를 알게 되었을 때 한다.

 

주저하지 말고 변경하라.

 

언제나 바로 지금이 최적기다.

코드를 리팩터링할 이유는 아주 많다.

 

중복

DRY 원칙 위반을 발견했다.

직교적이지 않은 설계

더 직교적으로 바꿀 수 있는 무언가를 발견했다.

더 이상 유효하지 않은 지식

코드는 지금 상황에 뒤떨어지지 않아야 한다.

사용 사례

진짜 사람들이 실제 상황에서 시스템을 사용하게 되면,

여러분은 어떤 기능은 예전에 생각했던 것보다 더 중요하고,

"꼭 필요하다"고 생각했던 기능은 그렇지 않은 경우도 있다는 것을 깨닫게 될 것이다.

성능

성능을 개선하려면 시스템의 한 영역에서 다른 영역으로 기능을 옮겨야 한다.

테스트통과

코드를 조금 추가한 후 추가한 테스트가 통과했을 때가,

방금 추가한 코드로 다시 뛰어들어 깔끔하게 정리하기에 최고의 타이밍이다.

 

여러분의 코드를 리팩터링하는 것 - 기능을 이리저리 옮기고 이전에 내린 결정을 바꾸는 것 - 은

사실 '고통 관리(pain management)'를 실천하는 것이다.

많은 개발자들이 코드에 조금 개선할 부분이 있다는 이유만으로는 다시 돌아가서 코드 열기를 주저한다.

 

현실 세계의 복잡한 문제들

일정의 압박은 리팩터링을 하지 않는 단골 핑계다.

지금 하지 않으면 일이 더 진척 되었을 때 훨씬 더 많은 시간을 투자하게 될 것이다.

그때가 되면 일정에 더 여유가 생길까? ... 그럴리가!

 

Tip 65. 일찍 리팩터링하고, 자주 리팩터링하라.
정원의 잡초를 뽑고 식물 배치를 바꾸는 것과 같이
코드도 필요할 때마다 다시 작성하고, 다시 작업하고, 아키텍처를 다시 만들라.
근본적인 문제를 해결하라.

 

일정에 리팩터링할 시간을 확실히 포함시켜 두도록 하라.

그 코드를 사용하는 사람들이 코드가 조만간 재작성될 것이라는 사실과

재작성이 그들의 코드에 미칠 영향을 인지하도록 해야 한다.

 

* 리팩터링은 어떻게 하는가?

리팩터링의 본질은 재설계다.

리팩터링은 천천히, 신중하게, 조심스럽게 진행해야 하는 작업이다.

 

1. 리팩터링과 기능 추가를 동시에 하지 말라.

2. 리팩터링을 시작하기 전 든든한 테스트가 있는지 먼저 확인하라.

3. 단계를 작게 나누어 신중하게 작업하라.

   단계를 작게 나누고, 한 단계가 끝날 때마다 테스트를 돌린다면 기난긴 디버깅 작업을 피할 수 있다.

 

탄탄한 회귀 테스트를 유지하는 것이야말로 안전한 리팩터링의 비결이라는 것이다.

다음에 여러분이 기대하는 수준에 못 미치는 코드를 발견하면, 고쳐라.

고통을 관리하라.

지금은 고통스러울지라도 앞으로 더욱 고통스러워질 것 같으면 지금 고치는 편이 낫다.

 

깨진 창문을 그대로 놓아두지 말라.

 

 

Topic 41. 테스트로 코딩하기 (p.307)

Tip 66. 테스트는 버그를 찾기 위한 것이 아니다.
테스트는 여러분의 코드를 보는 한 관점이다.
코드의 설계, API, 결합에 대한 피드백을 준다.

우리는 테스트의 주요한 이득이 테스트를 실행할 때가 아니라

테스트에 대해 생각하고, 테스트를 작성할 때 생긴다고 믿는다.

 

* 테스트에 대해 생각하기

특정한 데이터베이스 조회 코드를 작성해야 한다고 생각해보자.

 

테스트 데이터는 어디서 가져다 사용해야 할까? 데이터베이스에서 연결한다.

테스트 데이터를 어떻게 채워야 할까? 데이터베이스 스키마를 확인하여 필요한 테이블/필드를 찾는다.

 

테스트에 대해 생각하는 것으로 시작했는데 코드 한 줄 쓰지 않고도 두 가지 발견을 했다.

 

* 테스트가 코딩을 주도한다.

이전 예에서 테스트에 대해 생각함으로써

우리 코드의 결합도는 낮추고 (전역 DB 연결을 쓰지 않고 DB 연결을 넘겨줌)

유연성은 올릴 수 있었다. (테스트하는 필드의 이름을 매개 변수로 지정)

 

우리 메서드의 테스트 작성에 대해 생각함으로써 코드의 작성자가 아니라

사용자인 것처럼 메서드를 외부의 시선으로 보게 되었다.

 

Tip 67. 테스트가 코드의 첫 번째 사용자다.
테스트가 주는 피드백으로 코드의 방향을 잡아라.

 

테스트는 우리의 코딩을 인도하는 필수 피드백이다.

 

다른 코드와 긴밀하게 결합된 함수나 메서드는 테스트하기 힘들다.

무언가를 테스트하려면 그것을 이해해야만 한다.

 

코드에 테스트의 빛을 비추면 모든 것이 명확해진다.

코딩을 시작하기 전에 경계 조건의 테스트와 경계 조건에서 어떻게 동작해야 하는지를 먼저 생각해 본다면,

아마 함수를 단순하게 만드는 코드 패턴을 찾을 수 있을 것이다.

테스트해야 하는 오류 조건에 대해 생각해 본다면 그에 맞게 함수 구조를 잡을 것이다.

 

테스트 주도 개발

테스트 주도 개발(test-driven development, TDD)

테스트 우선 개발(test-first development)

 

TDD의 기본 주기는 다음과 같다.

1. 추가하고 싶은 작은 기능 하나를 결정한다.

2. 그 기능이 구현되었을 때 통과하게 될 테스트를 하나 작성한다.

3. 테스트를 실행한다.

4. 실패하는 테스트를 통과시킬 수 있는 최소한의 코드만 작성한다. 그리고 확인한다.

5. 코드를 리팩터링한다. 개선점을 찾고 개선 후에도 테스트&수정을 반복 확인한다.

 

어떻게든 TDD를 실천하라.

하지만 도중에 이따금 멈추어 큰 그림을 살피는 것을 잊지 말라.

 

* TDD: 목표가 어디인지 알아야 한다.

전체 문제를 완전히 파악하기 힘들 때 한 번에 테스트 하나씩 작은 단계들을 밟아라.

 

Tip 68. 상향식이나 하향식이 아니라 끝에서 끝까지(end-to-end) 만들어라!
끝에서 끝을 잇는 조그만 기능 조각들을 만들고, 그 과정에서 문제에 대하여 배워라.

코드를 채워 나가면서 배운 것을 적용하고, 각 단계마다 고객을 참여시켜서 전체 과정을 안내하도록 하라.

 

* 다시 코드로

소프트웨어를 만들 때 맨 처음부터 테스트가 가능하도록 만들고,

코드들을 서로 연결하기 전에 코드를 하나하나 철저하게 테스트해야만 한다.

 

* 단위 테스트(unit test)

모듈을 통제된 (심지어는 인위적으로 만들어진) 환경에서 철저하게 테스트하고 나면,

넓은 바깥세상에서 그 모듈이 어떻게 행동할지 더 잘 알게 될 것이다.

소프트웨어 단위 테스트랑 어떤 모듈에게 이것저것을 시켜보는 코드를 가리킨다.

동일한 테스트를 코드 수정 후 다시 돌려보는 것을 회귀 테스트(regression testing)라고 한다.

 

* 계약을 지키는지 테스트하기

우리는 단위 테스트를 계약을 잘 지키는지 보는 테스트라고 여긴다.

1. 계약을 지키는지 여부 확인

2. 코드로 표현된 계약의 의미가 우리가 생각한 것과 일치하는지 여부 확인

 

다양한 종류의 테스트 케이스와 경계 조건에서도 모듈이 약속한 대로 기능을 잘 수행하는지 테스트 해보자.

계약을 잘 지키는지 확인하는 테스트를 강조함으로써 프로젝트에서 이후에 벌어질지 모를 재앙을 피하려고 노력하자.

 

Tip 69. 테스트할 수 있도록 설계하라.
코드를 쓰기 전 테스트에 대해 먼저 생각하라.

 

* 임시 테스트

'임시(Ad-hoc) 테스트'는 우리가 직접 코드를 이리저리 찔러보는 것이다.

디버깅 작업이 끝나면 이런 임시 테스트를 정식 테스트의 형태로 만들어 두어야 한다.

 

여러분이 만든 테스트를 그냥 버리지 말고 기존의 단위 테스트 군단에 합류시켜라.

 

* 테스트 접점 만들기

아무리 테스트를 잘 갖추었어도 모든 버그를 발견할 수는 없다.

규칙적이고 일관된 형식의 로그를 확인 가능한 모듈을 사용하거나,

상태 정보와 그 외의 것들이 들어 있는 진단 제어 도구를 사용하자.

 

* 테스트 문화

여러분이 작성하는 모든 소프트웨어는 언젠가 테스트된다.

여러분이나 여러분의 팀이 테스트하지 않으면 결과적으로 사용자들이 테스트하게 된다.

소프트웨어를 철저하게 테스트할 계획을 세우는 것이 좋다.

 

때에 따라 테스트를 먼저 쓰기가 어렵거나 의미가 없을 수도 있다.

코드를 조금 작성하고, 테스트를 작성하고 다시 코드로 넘어가라.

 

제대로 된 테스트 문화를 가졌다면 모든 테스트가 언제나 통과해야 한다.

불량 테스트를 무시하다 보면 모든 테스트를 무시하게 되기 쉽고 악순환의 고리가 시작된다.

 

테스트 코드를 다른 제품 코드와 마찬가지로 다뤄라.

결합도를 낮추고, 깨끗하고 견고하게 유지하라.

 

Tip 70. 여러분의 소프트웨어를 테스트하라. 그러지 않으면 사용자가 테스트하게 된다.
가차 없이 테스트하라. 여러분 대신 사용자가 버그를 찾도록 하지 말라.

 

 

Topic 42. 속성 기반 테스트 (p.321)

믿으라, 하지만 확인하라
- 러시아 속담

함수를 작성할 때 단위 테스트도 작성하기를 추천한다.

 

코드를 작성하고 직접 테스트를 작성한다면 잘못된 가정이 둘 다에 들어갈 수도 있지 않을까?

자기 자신의 생각에 비추어 보면 제대로 동작하므로 코드는 테스트를 통과한다.

>> 대안은 컴퓨터에게 테스트를 맡기는 것이다. 컴퓨터는 여러분과 달리 선입견이 없다.

 

* 계약, 불변식, 속성

'불변식(invariant)' - 함수 실행 전후로 계속 어떤 부분의 상태에 대하여 참이 되는 조건을 말한다.

예시) 리스트를 정렬했을 때의 결과는 정렬하기 전 리스트와 원소의 수가 같을 것이다.

    그렇다면 리스트의 길이가 불변식에 해당한다.

 

코드에 존재하는 계약과 불변식을 뭉뚱그려서 '속성(porperty)'이라고 부른다.

코드에서 속성을 찾아내서 테스트 자동화에 사용할 수 있는데,

이것을 '속성 기반 테스트(property-based testing)'라 한다.

 

Tip 71. 속성 기반 테스트로 가정을 검증하라.
속성 기반 테스트는 여러분이 절대 시도해 보지 않을 만한 것들을 시도하고,
여러분이 의도하지 않은 방식으로 여러분의 코드를 사용할 것이다.

 

* 테스트 데이터 생성

예시) Hypothesis 의 hypothesis.strategies 모듈의 함수들

@given(some.integers())

> 여러 번 실행되면서 매번 다른 정수(integer)를 넘길 것이다.

@given(some.integers(min_value=5, max_value=10).map(lambda x: x * 2))

> 10에서 20 사이의 짝수가 생성될 것이다.

@given(some.lists(some.integers(min_value=1), max_size=100))

> 길이가 최대 100인 자연수 리스트가 만들어질 것이다.

 

* 잘못된 가정 찾기

(책 예제 참고)

 

* 속성 기반 테스트는 우리를 자주 놀래킨다

속성 기반 테스트가 강력한 까닭은 그저 입력을 생성하는 규칙과 출력을 검증하는 단정문만 설정한 채 제멋대로 작동하도록 놔두기 때문이다.

정확히 어떤 일이 일어날지 절대 알 수 없다.

 

속성 기반 테스트가 실패했다면 테스트 함수가 어떤 매개 변수를 사용했는지 알아낸 다음 그 값을 이용하여 별도의 단위 테스트를 정식으로 추가하는 것이 좋다.

이 단위 테스트의 두 가지 역할.

1. 속성 기반 테스트의 여러 가지 다른 수행 결과와 상관없이 문제가 발생하는 상황에 집중할 수 있게 해 준다.

2. 단위 테스트가 '회귀 테스트(regression test)' 역할을 한다.

 

속성 기반 테스트는 임의의 값을 생성하여 사용하기 때문에 다음번에 실행했을 때 똑같은 값을 테스트 함수에 넘긴다는 보장이 없다. 위와 같이 단위 테스트를 만들어 두면 버그가 완전히 해결되었음을 보장할 수 있다.

 

* 속성 기반 테스트는 설계에도 도움을 준다.

속성 기반 테스트는 여러분이 코드를 불변식과 계약이라는 관점으로 바라보게 한다.

여러분은 무엇이 변하지 않아야 하고, 어떤 조건을 만족해야 하는지 생각하게 된다.

 

 

Topic 43. 바깥에서는 안전에 주의하라 (p.331)

좋은 울타리가 좋은 이웃을 만든다.
- 로버트 프로스트(Robert Frost), <담장 고치기>

우리는 지나칠 정도로 의심을 해야 한다. 매일.

근래 발생하는 보안 관련 사건, 사고들은 모두 개발자가 부주의한 탓이다.

 

* 나머지 90%

잘 돌아가는 코드를 완성 했다고 생각해도, 그것은 90% 완성한 것이다.

이제는 나머지 90%를 고려해야 한다.

다음으로 해야 하는 일은 코드가 잘못될 수 있는 경우를 찾아보고, 각 경우에 대한 단위 테스트를 추가하는 것이다.

잘못된 매개 변수를 넘기거나 리소르를 흘리거나 리소스가 모자라는 경우 따위를 생각해 보아야 한다.

 

* 기본 보안 원칙

개발하고 배포하는 환경에 따라 제각각 보안을 위해 해야 할 일들이 있겠지만,

우리가 언제나 명심해야 하는 기본 원칙이 몇 가지 있다.

1. 공격 표면을 최소화하라.

2. 최소 권한 원칙.

3. 안전한 기본값.

4. 민감 정보를 암호화하라.

5. 보안 업데이트를 적용하라.

 

공격 표면을 최소화하라.

시스템의 '공격 표면(attack surface)' 영역은 공격자가 데이터를 입력하거나,

데이터를 추출하거나 서비스를 실행시킬 수 있는 모든 접근 지점을 합한 것이다.

 

1. 코드의 복잡성은 공격 매개체(attack vector)를 유발한다.

2. 입력 데이터는 공격 매개체다. 외부 데이터를 절대 신뢰하지 말라.

3. 인증이 없는 서비스는 공격 매개체다.

4. 인증을 요구하는 서비스도 공격 매개체다.

5. 출력 데이터는 공격 매개체다.

6. 디버깅 정보는 공격 매개체다.

 

Tip 72. 단순함을 유지하고 공격 표면을 최소화하라.
복잡한 코드는 버그의 온상이고, 공격자가 뚫고 들어올 여지도 높인다.

 

최소 권한 원칙

최소한의 권한만을 꼭 필요한 시간만큼만 제일 짧게 부여하라는 게 또다른 핵심 원칙이다.

 

시스템의 모든 프로그램과 모든 특수 권한 사용자는
과업을 마치기 위해 필요한 최소한의 권한만을 사용하여 운용해야 한다.
- 제롬 살처(Jerome Saltzer), Communications of the ACM, 1974.

 

시간과 권한 차원에서 공격 매개체의 유효 범위를 줄이자.

권한이야말로 '적을수록 낫다(less is more)'.

 

안전한 기본값

여러분의 애플리케이션 혹은 웹 사이트 사용자의 기본 설정은 가장 안전한 값이어야 한다.

가장 안전한 값이 가장 사용자 친화적인 값이나 편리한 값은 아닐 수 있겠지만,

각 사용자가 직접 보안과 편리함 사이에서 고르도록 하는 편이 낫다.

 

민감 정보를 암호화하라

개인 식별 정보나 금융 데이터, 비밀번호, 다른 인증 정보를 일반 텍스트로 남기지 말라.

데이터베이스든 다른 파일이든 동일하다.

설사 데이터가 유출 되더라도 암호화가 안전장치 역할을 할 수 있어야 한다.

키나 암호는 보통 빌드나 배포 프로세스 내에서 설정 파일이나 환경 변수로 관리한다.

 

보안 업데이트를 적용하라

Tip 73. 보안 패치를 신속히 적용하라.
공격자들은 최대한 빠르게 취약점을 공격한다. 여러분은 더 빨라야 한다.

이 팁은 인터넷에 연결된 모든 장비에 해당한다.

 

* 상식 대 암호

암호학(cryptography)에 있어서는 여러분의 상식이 맞지 않을 수 있다는 점을 명심해야 한다.

암호화에 있어서 첫 번째 규칙이자 가장 중요한 규칙은 절대 직접 만들지 말라는 것이다.

신뢰할 수 있는 것에만 의지하라.

 

간단한 암호화 작업 외에도 여러분의 웹 사이트나 애플리케이션의 보안 관련 기능을 주의 깊게 검토하라.

제대로 구현했다 하더라도 계속해서 데이터를 관리하고 안전하게 유지할 책임은 여전히 여러분에게 있다.

새로운 법령이나 법적 의무에 대한 대응도 여러분 몫이다.

 

외부의 인증 서비스를 사용하라.

여러분의 조직 내에서 운영하는 인증 서비스를 함께 사용할 수도 있고,

외부 클라우드가 제공하는 것을 사용할 수도 있다.

 

바깥에서는 안전에 주의하라.

 

 

Topic 44. 이름 짓기 (p.341)

올바른 이름으로 부르는 것이 지혜의 시작이다.
- 공자

이름이란게 무슨 의미가 있나?? 프로그래밍에서는 이름이 "모든 것!!"이다.

 

이름은 아주 중요하다.

이름은 여러분의 의도와 믿음을 잔뜩 드러내기 때문이다.

 

이름을 지을 때 왜 만드는지 생각하는 것은 아주 효과적이다.

여러분이 문제 풀이 사고방식에서 벗어나 더 큰 그림을 보도록 하기 때문이다.

 

이름을 지을 때는 여러분이 표현하고 싶은 것을 더 명확하게 다듬기 위해 끊임없이 노력해야 한다.

이렇게 명확하게 다듬는 작업이 여러분이 코드를 작성할 때 코드를 더 잘 이해할 수 있도록 도울 것이다.

 

* 문화를 존중하라

컴퓨터 과학에는 어려운 문제가 딱 두 개 있다.
캐시 무효화와 이름 짓기.

관습은 각 프로그래밍 언어나 환경의 문화에 달린 것이다.

관습이 없는 환경이라면 당연히 한 글자 변수명을 사용하면 안된다.

그 분야의 문화를 존중하라.

 

* 일관성

반드시 팀의 모든 사람이 각 단어의 뜻을 알고 일관성 있게 사용해야 한다.

의사 소통을 장려하자. 용어의 의미를 자연스럽게 퍼져 나갈 수 있도록 만들자.

팀에게 특별한 의미가 있는 단어를 모두 모은 프로젝트 용어 사전을 만들어보자.

 

시간이 흐르다 보면 프로젝트 용어들은 자리를 잡아 나갈 것이다.

 

* 이름 바꾸기는 더 어렵다

컴퓨터 과학에는 어려운 문제가 딱 두개 있다.
캐시 무효화, 이름 짓기, 그리고 하나 차이(off-by-one) 오류.

아무리 좋은 이름을 짓기 위해 노력하더라도 모든 것은 변한다.

부지런히 이름을 계속 바꾸지 않으면 악몽 같은 상황에 빠지게 된다.

 

문제를 발견했으면 고쳐라.

당장 바로 그 자리에서.

 

Tip 74. 이름을 잘 지어라. 필요하면 이름을 바꿔라.
읽는 사람에게 의도를 표현할 수 있는 이름을 붙이고, 의도가 변하자마자 이름을 바꿔라.

 

잘못된 이름을 바꿀 수 없는 상황이라면 더 큰 문제가 있는 것이다.

바로 ETC(easier to change) 위반이다.

그 문제를 고치고 나서 잘못된 이름을 바꿔라.

이름을 바꾸기 쉽게 만들고, 자주 이름을 바꿔라.

 

 

 

반응형

여러 변수, 메소드, 클래스 등 네이밍에서 사람마다 다양한 방법을 사용한다.

이름에 공백을 사용할 수는 없기 때문에 개인이든 팀단위 프로젝트든 스타일을 통일시켜서,

코딩 중에 이름 때문에 헷갈리는 상황을 줄이는 것이 좋다.

모든 케이스에서 사용되는 단어들 사이에 공백은 없다.

 

카멜 케이스 (camelCase)

낙타의 등을 닮아서 지어진 이름.

두번째 단어부터 첫번째 글자를 대문자로 표기한다.

ex) camelCase, selectMember, printData, requiredMemberNumber, abcAbcAbc

 

케밥 케이스 (kebab-case)

케밥이 꼬치에 꿰어진 모습을 닮았다나..

모든 단어를 소문자로 표기하며 단어 사이에는 '-' 을 넣는다.

ex) camel-case, select-member, print-data, required-member-number, abc-abc-abc

 

파스칼 케이스 (PascalCase)

왜 파스칼 이라는 이름이 붙었는지는 잘 모름..

처음부터 끝까지 단어의 시작을 대문자로 표기한다.

본인 공부할 때, 클래스명을 대문자로 시작하는 경우가 많아서 해당 케이스는 잘 쓰지 않을것 같다..

ex) CamelCase, SelectMember, PrintData, RequiredMemberNumber, AbcAbcAbc

 

스네이크 케이스 (snake_case)

케밥 케이스와 유사하지만 '-'가 아닌 '_'를 사용한다.

ex) camel_case, select_member, print_data, required_member_number, abc_abc_abc

 

반응형

Serializable

https://selfish-developer.com/entry/Serializable-%EA%B3%BC-Parcelable

 

Serializable 과 Parcelable

Serializable Serialization(직렬화)란 자바 시스템 내부에서 사용하는 객체를 외부의 자바 시스템에서도 사용할 수 있도록 byte형태로 데이터를 변환시키는 기술을 말하며 안드로이드 상에선 직렬화를

selfish-developer.com

https://velog.io/@sa1341/Java-%EC%A7%81%EB%A0%AC%ED%99%94%EB%A5%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

 

Java 직렬화를 하는 이유가 무엇일까?

예전에 회사 프로젝트를 보면 클래스에서 Serializable 인터페이스를 구현한 것을 자주 볼 수 있었습니다. 그 당시에는 객체를 바이너리로 변환하기 위해 직렬화 인터페이스를 구현한다는 정도만

velog.io

https://techblog.woowahan.com/2550/

 

자바 직렬화, 그것이 알고싶다. 훑어보기편 | 우아한형제들 기술블로그

{{item.name}} 자바의 직렬화 기술에 대한 대한 이야기입니다. 간단한 질문과 답변 형태로 자바 직렬화에 대한 간단한 설명과 직접 프로젝트를 진행하면서 겪은 경험에 대해 이야기해보려 합니다.

techblog.woowahan.com

 

하이픈, 대시, 마이너스의 차이..?

https://joonfont.com/forum/?mod=document&uid=16 

 

문장부호 Hyphen(하이픈), En dash(엔대시), Em dash(엔대시), minus(마이너스)의 차이

1. Hyphen(-) U+002D  : 길이가 짧은 문장 부호입니다. -두 개 이상의 단어를 합칠 때 사용 예) Eye-opener, check-in, free-for-all, run-down, up-to-date -숫자 예) Fifty-one, eighty-nine, thirty-two, sixty-five -단어를 나눌 때

joonfont.com

 

Cloneable

아직 뭔지 잘 모르겠다

https://velog.io/@suky/Java-Cloneable%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0

 

Java: Cloneable에 대한 고찰

이펙티브 자바를 읽다가 문득 든 의문을 풀기 위하여 삽질한 기록입니다. 🤣

velog.io

https://living-only-today.tistory.com/197

 

Cloneable 인터페이스와 clone 메소드

개요 Java 언어에서는 인스턴스의 복사를 실행하는 도구로 clone 메소드가 준비되어 있습니다. clone 메소드를 실행할 경우에는 복사 대상이 되는 클래스는 java.lang.Cloneable 인터페이스를 구현할 필

living-only-today.tistory.com

 

axios

이번에 vue.js와 함께 사용하여 맛보기 경험함

https://axios-http.com/kr/docs/intro

 

시작하기 | Axios Docs

시작하기 브라우저와 node.js에서 사용할 수 있는 Promise 기반 HTTP 클라이언트 라이브러리 Axios란? Axios는 node.js와 브라우저를 위한 Promise 기반 HTTP 클라이언트 입니다. 그것은 동형 입니다(동일한 코

axios-http.com

 

vue.js

올해 처음 사용해봄.

https://kr.vuejs.org/v2/guide/index.html

 

시작하기 — Vue.js

Vue.js - 프로그레시브 자바스크립트 프레임워크

kr.vuejs.org

https://joshua1988.github.io/web-development/vuejs/vuejs-tutorial-for-beginner/

 

Vue.js 입문서 - 프론트엔드 개발자를 위한

Vue.js를 시작하기 위한 소개, 구성요소, 구조, Vue Router, HTTP 통신 라이브러리 등

joshua1988.github.io

 

 

반응형

**

정신없이 4장은 읽다 말고 정리도 못했네요.

시간내서 꼭 제대로 정독해야겠어요..

**

 

실용주의 프로그래머

The Pragmatic Programmer

 

5장. 구부러지거나 부러지거나

Bend, or Break (p.181)


현대의 미친 듯이 바른 변화 속도를 따라가려면

모든 수단을 동원하여 가능한 한 느슨하고 유연한 코드를 작성해야 한다.

 

그러지 않으면 코드는 금세 낡고 수정하기 어려워지고,

결국 기억 저편으로 사라질 것이다.

 

Topic 28. 결합도 줄이기 (p.182)

관계없는 개념들을 분리하여 결합도를 낮추는 방법에 대해서,

 

우리가 어떤 것 하나만을 골라내려고 해도,
그것이 우주의 다른 모든 것과 얽혀 있음을 깨닫게 된다.
 - 존 뮤어(John Muir), <나의 첫 여름>

높은 결합도는 변경의 적이다.

결합도가 높으면 이리저리 연결되어 있어서 여러 가지를 동시에 바꿔야 하기 때문이다.

 

소프트웨어의 구조는 유연해야 한다.

그리고 유연하려면 각각의 부품이 다른 부품에 가능한 한 조금만 연결되어야 한다.

 

Tip 44. 결합도가 낮은 코드가 바뀌기 쉽다

 

 - 연쇄 메서드 호출

 - 정적인(static) 것의 위험함

 - 왜 클래스 상속이 위험한가?

 

코드에서 나타나는 다음과 같은 결합의 증상을 놓치지 않도록 주의해야 한다.

 - 관계없는 모듈이나 라이브러리 간의 희한한 의존 관계

 - 한 모듈의 '간단한' 수정이 이와 관계없는 모듈을 통해 시스템 전역으로 퍼져 나가거나

   시스템의 다른곳에서 무언가를 깨뜨리는 경우

 - 개발자가 수정하는 부분이 시스템에 어떤 영향을 미칠지 몰라 코드의 수정을 두려워 하는 경우

 - 변경 사항에 누가 영향을 받는지 파악하고 있는 사람이 없어서 결국 모든 사람이 참석해야 하는 회의

 

열차 사고

 

Tip 45. 묻지 말고 말하라. (Tell, Don't Ask, TDA.)

다른 객체의 내부 상태에 따라 판단을 내리고 그 객체를 갱신해서는 안 된다.

객체의 내부 상태를 묻는 것으로 인하여 캡슐화(encapsulation)의 장점은 사라지고,

또 그 과정에서 구현에 대한 지식이 코드 여기저기로 퍼져 버린다.

 

데메테르 법칙

LoD는 어떤 클래스 C에 정의된 메서드가 다음 목록에 속하는 것만 사용할 수 있다고 제한한다.

 - C의 다른 인스턴스 메서드

 - 메서드와 매개 변수

 - 스택이나 힙에 자신이 생성하는 객체의 메서드

 - 전역 변수

Tip 46. 메서드 호출을 엮지 말라.

연쇄와 파이프라인

파이프라인의 함수에서 반환되는 데이터는 반든시 다음 함수가 처리할 수 있는 형식이어야 한다.

 

글로벌화의 해악

 

Tip 47. 전역 데이터를 피하라.

 

싱글턴(singleton)도 전역 데이터다.

외부 리소스도 전역 데이터다.

 

상속은 결합을 늘린다

 

결국은 모두 ETC

결합된 코드를 바꾸기 힘들다.

 

Topic 29. 실세계를 갖고 저글링하기 (p.193)

유용한 다른 기술들에 대해서..

 

그냥 일어나는 일은 없다. 일어나도록 만들어진 것이다.
 - 존 F. 케네디 (John F. Kenneyd)

 

 

Topic 30. 변환 프로그래밍 (p.207)

함수 파이프라인이라는 보다 유연하고 명쾌한 방식 활용에 대해서.

 

Topic 31. 상속세 (p.224)

유연하고 바꾸기 쉬운 코드를 만들 수 있는 더 난은 대안들에 대해서.

 

Topic 32. 설정 (p.236)

세부 사항을 완전히 코드 밖으로 옮기는 방법에 대해서.

 

 

반응형

오늘 TIL 3줄 요약

  • 에디터를 내 손발처럼 자연스럽게 사용할 수 있도록 숙지하자
  • 디버깅과 테스트는 대충 넘길 수 없다
  • 수첩, 노트에 일지를 적어보자

TIL (Today I Learned) 날짜

2022. 03. 23

오늘 읽은 범위

3장. 기본 도구

책에서 기억하고 싶은 내용을 써보세요.

  • 지식을 일반 텍스트로 저장하라.
  • 실용주의 프로그래머는 오직 코드만 쏟아 내거나, 객체 모델만 개발하거나, 문서만 작성하거나, 빌드 과정 자동화만 하지는 않는다.
  • >> 이 모든 일을 다 한다.
  • 텍스트는 프로그래밍의 기본 원재료이므로 여러분은 텍스트를 최대한 손쉽게 조작할 수 있어야 한다.
  • 에디터에 유창해지도록 노력해야 한다.
  • 늘 하는 반복적인 일을 자동화할 방법을 연구하여 한두 줄 만으로 가능하게 해보아라.
  • >> 확장 기능을 만들고 공개 해보아라.
  • 코드 수정한 사람, 버전간 변경점, 변경된 코드 줄 수, 수정된 파일 빈도 등 정보는
  • 버그 추적이나, 감사(audit), 성능 관리, 품질 관리를 해야 할 때 매우 귀중하다.
  • 언제나 버전 관리 시스템을 사용하라!!!
  • 디버깅은 단지 문제 풀이일 뿐이라는 사실을 받아들이고, 그런 마음으로 공략하라.
  • 버그를 살표보기 전에 일단 작업 중인 코드가 경고 없이 깨끗하게 빌드되는지부터 확인하라.
  • 버그를 고치는 첫걸음으로 가장 좋은 것은 그 버그를 재현할 수 있게 만드는 것이다.
  • 누군가에게 문제를 설명하게 되면 혼자 코드를 살펴볼 때는 당연히 여기고 지나갈 것을 명시적으로 이야기해야 한다.
  • >> 이런 가정 몇 가지를 입 밖에 내면, 문제에 대한 새로운 통찰을 불현듯이 얻을 수도 있다.
  • 가정하지 말라. 증명하라.
  • 일지를 쓰면 좋은 점- 진행 중인 작업과 직접적인 관계가 없는 발상을 일단 쌓아 놓을 수 있는 곳이 생긴다.실은 말도 안 된다는 것을 깨닫게 될 수도 있다.
  • 종이에 직접 글씨를 쓰는 것은 키보드를 두드리는 것과는 다른 무언가 특별한 것이 있다.
  • - 메모를 시작하자마자 메모의 주제인 여러분이 방금 전까지 하던 일이
  • - 기억보다 더 믿을 만하다.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

  • 급하게 프로젝트 진행 중인데 테스트할 걱정이 앞선다.
  • 여러 에디터를 써보고 익숙해지자..
  • 가정해서 떠들지 말고 테스트하고 다른 사람들에게 설명하며 직접 보여주자.
  • 일지를 쓰자...종이에 가능할지는 모르겠다..일단 태블릿에 써보자.

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  •  

오늘 읽은 다른사람의 TIL

반응형

실용주의 프로그래머

The Pragmatic Programmer

 

3장. 기본 도구

(p103)The Basic Tools

 

 

자신의 기본 도구 상자에 어떻게 투자해야 할 것인가?

도구들의 사용법을 배우는 데에 시간을 투자하라.

도구가 손의 연장이 된 자신을 발견하게 될 것이다.

 

Topic 16. 일반 텍스트의 힘

 

일반텍스트란?

 

Tip 25. 지식을 일반 텍스트로 저장하라.

 

텍스트의 힘

일반 텍스트가 널리 쓰이는 이유는?

 - 지원 중단에 대한 보험

 - 기존 도구의 활용

 - 더 쉬운 테스트

 

지원 중단에 대한 보험

일반 텍스트 파일은 포맷을 부분적으로밖에 알지 못하더라도 파싱할 수 있다.

사람이 읽을 수 있는 것과 사람이 이해할 수 있는 것에는 차이가 있다.

 

기존 도구의 활용

버전 관리 시스템에서 에디터, 명령 줄 도구에 이르기까지 컴퓨터 세계의 거의 모든 도구는 일반 텍스트를 다룰 수 있다.

 

더 쉬운 테스트

시스템 테스트에 사용할 합성 데이터를 일반 텍스트로 표현하면 특별한 도구를 만들 필요 없이 간단하게 테스트 데이터를 추가하거나 수정할 수 있다.

 

최소 공통분모

모든 참가자가 하나의 공통 표준을 사용해서 소통하도록 해야 한다.

일반 텍스트가 바로 그 표준이다.

 

Topic 17. 셀 가지고 놀기

GUI 환경의 기능은 일반적으로 설계자가 의도한 범위를 넘어설 수 없다.

실용주의 프로그래머는 오직 코드만 쏟아 내거나, 객체 모델만 개발하거나, 문서만 작성하거나, 빌드 과정 자동화만 하지는 않는다.

이 모든 일을 다 한다.

 

Tip 24. 명령어 셸의 힘을 사용하라.

 

자신만의 셸

 

목수가 작업 공간을 자신에게 맞추어 바꾸듯이 개발자도 셸을 자신에게 맞추어야 한다.

 - 색깔 조합 설정

 - 프롬프트 설정

 - 별칭과 셸 함수

 - 명령어 자동 완성

 

Topic 18. 파워 에디팅

텍스트는 프로그래밍의 기본 원재료이므로 여러분은 텍스트를 최대한 손쉽게 조작할 수 있어야 한다.

원한다면 에디터를 몇 개 사용하든 상관없다.

다만 각각의 에디터에 유창해지도록 노력해야 한다.

 

Tip 27. 에디터를 유창하게(fluency) 쓸 수 있게 하라.

 

유창해지는 것의 가장 큰 이점은 더는 에디터 사용법을 생각하지 않아도 된다는 것이다.

생각이 자유롭게 흐를 것이고 프로그래밍에 큰 도움임 될 것이다.

 

어떤 것이 '유창'한 것인가?

 

 - 텍스트 편집 시 여러 단위로 커서 이동 or 내용 선택 해보아라

 - 코드 편집 시 반대편 괄호로 이동, 함수/모듈 등 다양한 문법 단위로 커서 이동 해보아라

 - 변경한 코드의 들여쓰기를 자동으로 맞춰라

 - 여러 줄의 코드를 명령 하나로 주석 처리했다가 다시 주석을 해제하라

 - 실행 취소를 여러번 헀다가 취소한 명ㅎ령을 재실행 기능으로 다시 수행하라

 - 에디터 창을 여러 구역으로 쪼개라. 그리고 각 구역 사이를 이동하라.

 - 특 정 줄 번호로 이동하라.

 - 여러 줄을 선택한 후 가나다순으로 정렬하라.

 - 문자열로, 또 정규 표현식으로 검색하라. 이전에 검색했던 것을 다시 검색하라.

 - 선택 영역이나 패턴 검색을 이용하여 일시적으로 여러 개의 커서를 만든 다음, 동시에 여러 곳의 텍스트를 편집하라.

 - 현재 프로젝트의 컴파일 오류를 표시하라.

 - 현재 프로젝트의 테스트를 실행하라.

 

과연 몇개나 마우스/트랙패드 없이 수행 가능할까?

현재 사용하는 에디터로는 수행 불가능한 것이 몇가지 있을 수도 있다.

그럼 바꿀 때인 것은 아닐까??

 

유창해지기

삶을 편하게 해 주는 명령어를 배워라.

더 나은 방법을 찾아보고 몸이 기억하도록 만들어야 한다.

 

에디터 성장시키기

 

사용 중인 에디터에서 명백한 한계에 봉착한다면 필요한 기능을 추가하는 확장 기능을 찾아보라.

나뿐만 아니라 필요한 사람이 있고 운이 좋다면 누군가가 해결책을 만들어 놓았을 것이다.

늘 하는 반복적인 일을 자동화할 방법을 연구하여 한두 줄 만으로 가능하게 해보아라.

확장 기능을 만들고 공개 해보아라.

 

Topic 19. 버전 관리

진보라는 것은 변화와는 거리가 멀고 오히려 기억에 의존한다.
과거를 기억하지 못하는 사람은 과거를 반복할 운명이다.
 - 조지 산타야나(George Santayana), <Life of Reason(이성의 삶)>

실제로 컴파일되고 실행되던 지난주의 평화로운 시절로 돌려줄 수 있다!

또한 공동 작업과 배포 파이프라인, 이슈 추적에다 일반적인 팀 상호작용까지 아우르는 훨씬 더 큰 세상을 놓치지 마라.

 

공유 디렉토리는 버전 관리 시스템이 아니다.

 

소스 코드부터 시작

버전 관리 시스템은 소스 코드나 문서의 모든 변경 사항을 이거하고,

바르게 설정된 버전 관리 시스템이 있으면 소프트웨어의 이전 버전으로 언제든지 되돌아갈 수 있다.

 

코드 수정한 사람, 버전간 변경점, 변경된 코드 줄 수, 수정된 파일 빈도 등 정보는

버그 추적이나, 감사(audit), 성능 관리, 품질 관리를 해야 할 때 매우 귀중하다.

 

여러 사용자가 동일한 파일을 작업하며 합칠 수도 있다.

 

Tip 28. 언제나 버전 관리 시스템을 사용하라.

우리가 키보드로 입력하는 거의 모든 것에 대해 일상적으로 버전 관리 시스템을 사용한다.

 

브랜치 사용하기

 

프로젝트 허브로서의 버전 관리

 

Topic 20. 디버깅

참으로 고통스러운 일입니다.
자신이 겪는 어려움을 보고는 알게 되죠.
다른 누구도 아닌 바로 자신이 문제를 만들었다는 걸.
 - 소포클레스(Sophocles) <아이아스>

소프트웨어 결함은 요구 사항을 오해하는 것부터 코딩 오류에 이르기까지 여러 모습으로 나타난다.

 

디버깅의 심리

디버깅은 단지 문제 풀이일 뿐이라는 사실을 받아들이고, 그런 마음으로 공략하라.

 

Tip 29. 비난 대신 문제를 해결하라.

 

디버깅 사고방식

 

가장 속이기 쉬운 사람은 자기 자신이다.
 - 에드워드 불워-리턴(Edward Bulwer-Lytton), <The Disowned(의절)>
Tip 30. 당황하지 말라.

실제 문제는 눈앞에 있는 것에서 몇 단계 떨어져 있고,

또 다른 여러 가지와 연관되어 있을 확률이 다분하다.

 

겉으로 드러난 특정한 증상만 고치려고 하지 말고,

항상 문제의 근본 원인을 찾으려고 노력하라.

 

실마리 찾기

버그를 살표보기 전에 일단 작업 중인 코드가 경고 없이 깨끗하게 빌드되는지부터 확인하라.

 

 - 처음에 받은 자료 이상을 얻기 위해서 버그를 보고한 사용자를 인터뷰할 필요도 있다.

 - 경계 조건(boundary condition)과 실제 최종 사용자의 사용 패턴 모두를 철저히 테스트해야 한다.

 

디버깅 전략

버그 재현하기

버그를 고치는 첫걸음으로 가장 좋은 것은 그 버그를 재현할 수 있게 만드는 것이다.

Tip 31. 코드를 고치기 전 실패하는 테스트부터.

 

미지의 세계에 온 프로그래머

 

Tip 32. 그놈의(damn) 오류 메시지 좀 읽어라.

 

이상한 결과

디버거에서 호출 스택 위아래로 어떻게 이동하고,

스택의 지연 변수를 어떻게 확인하는지 숙지하라.

 

흔한 버그 시나리오

 - 입력값에 따라 바뀜

 - 릴리스 사이에서 발생한 문제(regression)

 

이진 분할

이진 분할ㅡ이분 탐색, 이진 검색(binary search)ㅡ는 짜 보았을 것이다.

분할 정복(divide and conquer) 방식을 사용해보아라.

 

로깅과 트레이싱

트레이싱(tracing) 구문은 '여기까지 도달'이나 'x값 = 2' 같이 화면 혹은 파일에 출력하는 작은 진단용(diagnostic) 메시지를 일컫는다.

 

고무오리

문제의 원인을 찾는 매우 단순하지만 꽤 유용한 기법으로 그냥 누군가에게 문제를 설명하는 방법이 있다.

누군가에게 문제를 설명하게 되면 혼자 코드를 살펴볼 때는 당연히 여기고 지나갈 것을 명시적으로 이야기해야 한다.

이런 가정 몇 가지를 입 밖에 내면, 문제에 대한 새로운 통찰을 불현듯이 얻을 수도 있다.

 

소거법

 

Tip 33. "select"는 망가지지 않았다.

 

만약 여러분이 '단 하나만 변경'했는데 시스템이 작동을 멈춘다면 설사 아무 관련이 없어 보여도 십중팔구 직접적이든 간접적이든 변경한 그 하나에 책임이 있다.

 

놀라운 구석

어떤 버그로 놀라게 될 때 애지중지 믿고 있던 진실들을 재평가해야만 한다.

예상치 못한 '놀라운' 실패를 대면했을 때 자신이 세운 가정이 적어도 하나는 잘못되었다는 것을 받아들여야 한다.

 

버그와 관련된 루틴이나 코드가 제대로 작동하는 걸 '안다'고 해서 대충 얼버무리고 지나치지 말라.

그것을 증명하라.

이 맥락 안에서, 이 데이터로, 이 경계 조건하에서 증명하라.

 

Tip 34. 가정하지 말라. 증명하라.

 

놀라운 버그를 마주쳤을 때, 단순히 그걸 고치는 것을 넘어서

왜 이 문제가 더 일찍 발견되지 않았을까 생각해 봐야 한다.

 

버그를 미리 잡을 수 있도록 단위 테스트나 다른 테스트를 수정할 필요가 있는지 고민해 보라.

 

디버깅 체크 리스트

 - 보고된 문제가 내재하는 버그의 직접적 결과인가 아니면 단순히 증상일 뿐인가?

 - 버그가 정말로! 여러분이 사용하는 프레임워크에 있나? OS에? 아니면 여러분 코드에 있나?

 - 이 문제를 동료에게 상세히 설명한다면 어떻게 말하겠는가?

 - 의심 가는 코드가 단위 테스트를 통과한다면 테스트는 충분히 갖춰진 것인가?

  이 데이터로 테스트를 돌리면 무슨 일이 생기는가?

 - 이 버그를 야기한 조건이 시스템의 다른 곳에도 존재하는가?

  다른 버그가 유충 단계에서 성충이 될 날만 기다리고 있는 것은 아닌가?

 

Topic 21. 텍스트 처리

가끔은 기본 도구만으로는 해내기 힘든 종류의 변환 작업이 있다.

범용 텍스트 처리 도구가 필요한 것이다.

 

Tip 35. 텍스트 처리 언어를 익혀라.

이 책을 쓰기 위해 만든 루비와 파이썬 프로그램들,,

 - 책 빌드하기

 - 코드 넣기 및 강조

 - 웹사이트 갱신

 - 수식 넣기

 - 찾아보기(index) 생

 

(연습 문제 11~13 는 추후 기재)

 

Topic 22. 엔지니어링 일지

일지를 쓰면 좋은 점

 - 기억보다 더 믿을 만하다.

 - 진행 중인 작업과 직접적인 관계가 없는 발상을 일단 쌓아 놓을 수 있는 곳이 생긴다.

  (지금 하는 일에 계속해서 집중할 수 있다!)

 - 메모를 시작하자마자 메모의 주제인 여러분이 방금 전까지 하던 일이

  실은 말도 안 된다는 것을 깨닫게 될 수도 있다.

 

파일이나 위키말고 종이를 사용하라.

글씨를 쓰는 것은 키보드를 두드리는 것과는 다른 무언가 특별한 것이 있다.

 

적어도 훗날 여러분이 성공해서 유명해졌을 때 회고록을 쓰는 데는 도움이 될 것이다.

 

 

 

 

 

반응형

오늘 TIL 3줄 요약

  • 코드는 간단하게 기능은 확실하게
  • 프로토타이핑을 어렵게 생각하지 말자
  • 모든 상황과 변수를 추정하자

TIL (Today I Learned) 날짜

2022. 03. 21

 

오늘 읽은 범위

2장. 실용주의 접근법 (Topic 8 ~ 15)

 

책에서 기억하고 싶은 내용을 써보세요.

  • 좋은 설계는 나쁜 설계보다 바꾸기 쉽다
  • 유지보수는 출시되었을 때 시작하는 별개의 활동이 아니라 전체 개발 과정의 일상적인 부분이다.
  • DRY(Don't Repeat Yourself)는 코드 뿐만 아니라 문서화부터 의사소통까지 개발 모든 영역에서 따라야한다.
  • 개발을 진행하다 보면 나중에는 성능상의 이유로 DRY 원칙을 위배할 수도 있을 것이다.
  • 관련 없는 것들 간에 서로 영향이 없도록 하라.
  • 외부에서 만든 툴킷이나 라이브러리를 도입할 때 시스템의 직교성을 해치지 않는지 주의 깊게 살펴보자.
  • 당신이 가진 생각이 딱 하나밖에 없다면, 그것만큼 위험한 것은 없다.
  • 코딩에서 예광탄의 효과를 얻으려면 우리를 요구 사항으로서부터 최종 시스템의 일부 측면까지 빨리, 눈에 보이게, 반복적으로 도달하게 해 줄 무언가를 찾아야 한다.
  • 프로토 타입은 그것이 프로토타입임을 모르는 사람에게는 오해를 살 정도로 매력적일 수도 있기 때문에, 시작하기 전에 항상 모든 사람에게 이 코드는 폐기 처분될 코드라는 사실을 이해시켜야 한다.
  • 일반적으로 내부 도메인 언어는 호스트 언어의 기능을 쓸 수 있는 장점이 있다.
  • 내부 도메인 언어의 단점은 호스트 언어의 문법과 의미론을 따라야만 한다는 것이다.
  • 얼마나 정확해야 충분히 정확한지 추정치를 생각해보자.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

  • 최소한 내가 작성한 코드는 나중에 나뿐만 아니라 남도 직관적으로 알아볼 수 있게 하자.
  • 나보다 경력이 많은 사람의 의견이나 코드에도 항상 다른 방향은 없는지 생각하자.
  • 회사에서 이전 프로토타이핑 자료가 있다면 찾아봐야겠다.
  • 개발은 끝이 없고 시작부터 계속 추정의 연속이고 언제 변할지 모르는 환경에 적응해야한다..

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  • 실무에서 직교성을 유지하는것이 얼마나 어렵고 힘든지 여러 의견/경험담을 알고 싶고 찾아보고 싶네요.

오늘 읽은 다른사람의 TIL

반응형

**

3월 19일 토요일 정신 못차리고 쉬다가 2일차 분량의 책을 늦게 읽었고 TIL을 작성하지 못하였다.

3~4일차(2장) 분량은 빠른 TIL 정리를 위하여 중간중간 적고 싶은 내용과 내 생각을 함께 작성 해본다.

**

실용주의 프로그래머

The Pragmatic Programmer

 

2장. 실용주의 접근법(p37)

A PragmaticApproach

 

Topic 8. 좋은 설계의 핵심(p38)

Tip 14. 좋은 설계는 나쁜 설계보다 바꾸기 쉽다.

ETC(easier to change)는 규칙이 아니라 가치.

소스를 언제 누가 보더라도 바꾸기 쉽도록 작성하자.

 

Topic 9. DRY: 중복의 해악(p41)

프로그래머로서 우리는 지식을 수집하고, 조직하고, 유지하며, 통제한다.

우리는 지식을 명세로 문서화하고, 실행 코드를 통해 그 지식에 생명을 부여한다.

그리고 그 지식으로부터 테스트 중에 점검할 사항들을 얻는다.

유지보수는 출시되었을 때 시작하는 별개의 활동이 아니라 전체 개발 과정의 일상적인 부분이다.

유지보수를 쉽게 만드는 길은 DRY 원칙을 따르는 것이라 생각한다.

모든 지식은 시스템 내에서 단 한 번만, 애매하지 않고, 권위 있게 표현되어야 한다.
Tip 15. DRY: 반복하지 말라 (Don't Repeat Yourself)

DRY는 코드 밖에서도

이것은 단지 소스 코드에서만 국한되는 것은 아니다.

DRY는 지식의 중복, 의도의 중복에 대한 것이다.

코드의 중복

(코드는 추후 추가필요..)

코드 한곳을 수정할 때 다른 여러곳을 수정해야 한다면

최대한 중복을 없애보자 (고객사 요청에 따라 100% 없애지는 못할지도..)

모든 코드 중복이 지식의 중복은 아니다

동일한 코드라 할지라도 각각 서로 다른 것을 검증하고 있다면,

그것은 우연이지 중복이 아니다.

문서화 중복

주석에 모든 내용을 담는다고 해서 좋은 것은 아니다.

소스 코드에서 특정 상수를 수정할 때 주석에서도 수정해야 한다면

언젠가 주석과 코드간 격차가 생길 것이다.

함수 이름이 함수가 하는 일을 잘 알려줄 수도 있다.

데이터의 DRY 위반

개발을 진행하다 보면 나중에는 성능상의 이유로 DRY 원칙을 위배할 수도 있을 것이다.

모듈을 통해 제공되는 모든 서비스는 일관된 표기법(notation)으로 사용할 수 있어야 한다. 저장한 값으로 구현되었건, 계산을 통해 구현되었건 상관없이. - 버트런드 마이어(Bertrand Meyer)

표현상의 중복

내부 API에서 생기는 중복

외부 API에서 생기는 중복

데이터 저장소와의 중복

개발자 간의 중복

똑같은 일을 하는 코드가 서로 다른 곳에서 몇년이 지나고서야 발견될 수 있다.

많은 의사소통으로 유대가 돈독한 팀을 만들어서 대처해야 한다.

서로 정보 공유를 할 수 있는 소프트웨어를 사용하고

짧은 일일 회의를 생활화 하거나

정보를 정리하고 공유할 수 있는 인원을 주기적으로 정하는 등

여러 방안을 생각해볼 필요가 있다.

Tip 16. 재사용하기 쉽게 만들어라.

뭔가를 직접 만드는 것보다

기존의 것을 찾아내고

재사용하기 쉬운 환경을 조성해야 한다.

단, 어려운 방법은 실패할 확률을 높일 것이다.

 

Topic 10. 직교성(p54)

직교성이란

일종의 독립성이나 결합도 줄이기(decoupling) ?!

비직교적인 시스템 - 헬리콥터 조종

직교성의 장점

Tip 17. 관련 없는 것들 간에 서로 영향이 없도록 하라.

직교적인 시스템은 생산성 향상과 리스크 감소라는 두 가지 큰 장점이 있다.

생산성 향상

리스크 감소

설계

모듈식, 컴포넌트 기반, 계층(layer).

시스템은 서로 협력하는 모듈의 집합으로 구성되어야 하고,

각 모듈은 다른 부분과 독립적인 기능을 구현해야 한다.

특정 기능에 대한 요구 사항을 대폭 변경하는 경우 몇 개의 모듈이 영향을 받는가?

> 답은 하나여야 한다.

>> 말 자체는 이상적이지만..가능한 하나의 모듈에만 영향을 미쳐야한다)

자신의 힘으로 제어할 수 없는 속성에 의존하지 말아라.

툴킷과 라이브러리

외부에서 만든 툴킷이나 라이브러리를 도입할 때 시스템의 직교성을 해치지 않는지 주의 깊게 살펴보자.

코딩

코드의 결합도를 줄여라.

전역 데이터를 피하라.

유사한 함수를 피하라.

자신이 작성하는 코드를 항상 비판적으로 바라보는 습관을 길러라.

테스트

직교적으로 설계하고 구현한 시스템은 테스트하기 더 쉽다.

문서화

정말 직교적인 문서라면 내용 변화 없이 모양새를 완전히 바꿀 수 있을 것이다.. (?! 흠)

직교적으로 살아가기

앞서 말한 원칙들을 지킨다면 개발하고 있는 시스템이 더 유연하고 이해하기 쉬워질 것이다.

디버깅, 테스트, 유지 보수 또한 쉬워질 것이다.

(연습 문제 1~2 는 추후 기재)

 

Topic 11. 가역성(p66)

당신이 가진 생각이 딱 하나밖에 없다면, 그것만큼 위험한 것은 없다.

- 에밀 오귀스트 샤르티에(Emil-Auguste Chartier), <Propos sur la religion(종교론)>

가역성

Tip 18. 최종 결정이란 없다.

유연한 아키텍처

Tip 19. 유행을 좇지 말라.

Topic 12. 예광탄(p71)

준비, 발사, 조준 ...... - 미상 (?!?)

어둠 속에서 빛을 내는 코드

Tip 20. 목표물을 찾기 위해 예광탄을 써라.

예광탄 코드 접근 방법에는 여러 장점이 있다.

사용자가 뭔가 작동하는 것을 일찍부터 보게 된다.

개발자가 들어가서 일할 수 있는 구조를 얻는다.

통합(Integration) 작업을 수행할 기반이 생긴다.

보여줄 것이 생긴다.

진행 상황에 대해 더 정확하게 감을 잡을 수 있다.

예광탄이 언제나 목표물을 맞히는 것은 아니다.

예광탄 코드 대 프로토타이핑

Topic 13. 프로토타입과 포스트잇(p79)

프로토타이핑 대상

아키텍처

기존 시스템에 추가할 새로운 기능

외부 데이터의 구조 혹은 내용

외부에서 가져온 도구나 컴포넌트

성능 문제

사용자 인터페이스 문제

Tip 21. 프로토타이핑으로 학습하라.

프로토타입을 어떻게 사용할 것인가?

정확성

완전성(completeness)

안정성

스타일

아키텍처 프로토타이핑

 

주요 영역의 책임이 잘 정의되었고 적절한가?

주요 컴포넌트 간의 협력 관계가 잘 정의되었는가?

결합도는 최소화했는가?

중복이 발생할 만한 곳이 있는가?

정의된 인터페이스와 제약 사항은 수용할 만한가?

각 모듈이 실행 중에 필요한 데이터에 접근할 수 있는 경로를 갖고 있는가?

모듈에 데이터가 필요한 시점에 데이터 접근이 가능한가?

프로토타입 코드를 사용하지 않도록 하려면?

(연습 문제 3 은 추후 기재)

Topic 14. 도메인 언어(p85)

언어의 한계가 곧 자기 세계의 한계다.

- 루트비히 비트겐슈타인(Ludwig Wittgenstein)

Tip 22. 문제 도메인에 가깝게 프로그래밍하라.

실세계 도메인 언어의 예

(몇가지 사례 추후 기재)

RSpec (Ruby용 테스트 라이브러리) - 코드에서 기재(expect)하는 동작을 테스트에 표현하도록 만들어졌다.

(https://rspec.info)

큐컴버(Cucumber) - 프로그래밍 언어에 종속되지 않은 테스트를 정의할 수 있다.

(https://cucumber.io)

피닉스 라우터(Phoenix router) - 들어오는 HTTP 요청을 코드의 핸들러(handler) 함수로 전달하는 라우팅 도구.

(https://phoenixframework.org)

앤서블(Ansible) - 소프트웨어를 설정하는 도구

(https://www.ansible.com)

도메인 언어의 특성

내부와 외부 언어의 장단점

손쉽게 만드는 내부 도메인 언어

(연습 문제 4~8 은 추후 기재)

Topic 15. 추정(p94)

Tip 23. 추정으로 놀람을 피하라

얼마나 정확해야 충분히 정확한가?

추정치는 어디에서 나오는가?

무엇을 묻고 있는지 이해하라.

시스템의 모델을 만들어라.

모델을 컴포넌트로 나눠라.

각 매개 변수에 값을 할당하라.

답을 계산하라.

여러분의 추정 실력을 기록하라.

프로젝트 일정 추정하기

불확실성을 줄이는 두 가지 기법을 살펴보자.

미사일에 페인트칠하기

프로그램 평가 검토 기법(Program Evaluation Review Technique, PERT)

 

코끼리 먹기

점증적 개발(incremental development)

요구 사항 확인하기

위험을 분석하고 위험도가 높은 부분을 우선 하기

설계, 구현, 통합

사용자와 함께 검증하기

Tip 24. 코드와 함께 일정도 반복하며 조정하라.

누군가 추정해 달라고 하면 뭐라고 대답해야 할까?

 

(연습 문제 9~10 은 추후 기재)

 

'2022' 카테고리의 다른 글

[책] 실용주의 프로그래머 3장 기본 도구  (0) 2022.03.24
[노개북] TIL 2장 실용주의 접근법  (0) 2022.03.23
Spring Transaction  (0) 2022.03.18
2022년 3월 18일 금요일 관심있는 자료들  (0) 2022.03.18
<form:form>  (0) 2022.03.17

+ Recent posts