당신에게는 스스로의 행동을 직접 결정할 수 있는 힘이 있다. ..."당신은 당신의 조직을 바꾸거나, 당신의 조직을 바꿀 수 있다."
다른 사람 혹은 다른 무언가를 비닌하거나 변명을 만들어 내지 말라. 모든 문제를 외부 업체나 프로그래밍 언어, 경여진, 동료 때문이라고 떠넘기지 말라. 이들이 모두 한몫씩 했을 수 있겠지만 필요한 것은 변명이 아니다. 해결책을 찾아내야 하는 사람은 여러분이다.
'깨진 창문'을 고치지 않은 채로 내버려 두지 말라.
변화를 촉진하려고 할 때 여러분이 돌멩이 수프를 만드는지 아니면 개구리 수프를 만드는지 어떻게 판단할 수 있을까?
오늘의 훌륭한 소프트웨어는 많은 경우 환상에 불과한 내일의 완벽한 소프트웨어보다 낫다. 사용자에게 뭔가 직접 만져볼 수 있는 것을 일찍 준다면, 피드백을 통해 종국에는 더 나은 해결책에 도달할 수 있을 것이다.
(2022.04.23)
바꾸기 더 쉽게(Easier to Change). ETC. 이게 전부다. 우리가 아는 한 세상의 모든 설계 원칙은 ETC의 특수한 경우다.
모든 지식은 시스템 내에서 단 한 번만, 애매하지 않고, 권위 있게 표현되어야 한다.
코드의 어떤 측면 하나를 바꿔야 할 때 여러 곳을 바꾸고 있나? 그것도 여러 가지 다른 형태를? 코드를 바꾸고 문서도 바꾸는가? 데이터베이스 스키마와 스키마를 담고 있는 구조 등도? 그렇다면 여러분의 코드는 DRY하지 않다.
class Line {
Point start;
Point end;
double length; //start와 end를 가지고 있으면 length는 언제든 계산할 수 있다.
double length() { return start.distanceTo(end); } //이렇게 하자.
public Line(Point start, Point end) {
this.start = start;
this.end = end;
calculateLength();
}
private void calculateLength() {
this.length = start.distanceTo(end);
}
//더 나은 방법(매번 length를 계산하지 않아도 됨)
class Line {
private Point start;
private Point end;
private double length;
Point getStart() { return start; }
Point getEnd() { return end; }
double getLength() { return length; }
public Line(Point start, Point end) {
this.start = start;
this.end = end;
calculateLength(); //생성자에서 한 번만 length를 계산하면 된다.
}
private void calculateLength() {
this.length = start.distanceTo(end);
}
직교성: 하나가 바뀌어도 나머지에 어떤 영향도 주지 않으면 서로 직교한다고 할 수 있다.
툴킷이나 라이브러리를 도입할 때에는 심지어 같은 팀의 다른 멤버가 작성한 것이더라도 이것이 여러분의 코드에 수용해서는 안 될 변화를 강요하지 않는지 검토해 보라.
결정이 바뀌지 않을 것이라 가정하고서 발생할지도 모를 우연한 사건에 대비하지 않는 데에서 실수가 나온다. 결정이 돌에 새겨진 것이 아니라 바닷가의 모래 위에 쓰인 글씨라 생각하라. 언제든지 큰 파도가 글시를 지워버릴 수 있다.
(2022.05.04)
예광탄: 일반 탄환 사이에 섞여 발사되어 총과 탄착지점 사이의 궤적을 볼 수 있게 해주는 총알.
예광탄 개발: 실제 조건하에서 즉각적인 피드백을 받을 수 있도록 개발하는 것.
시스템을 정의하는 중요한 요구 사항을 찾아라. 의문이 드는 부분이나 가장 위험이 커 보이는 곳을 찾아라. 이런 부분의 코드를 가장 먼저 작성하도록 개발 우선순위를 정하라.
... 전체 애플리케이션에서 불확실한 곳이 어디인지 찾아보고 해당 부분을 작동시키는 데 필요한 뼈대를 추가한다.
프로토타입은 나중에 버리는 코드, 예광탄 코드는 완결된 코드이며 프로젝트의 일부이다.
순서로는 프로토타입으로 정찰, 수집 후 예광탄 개발을 진행한다.
기존의 프로그래밍 언어를 확장해 사용하는 방식의 도메인 언어. 사용하는 프로그래밍 언어의 문법에 종속된다.
자체의 언어를 사용하는 도메인 언어. 별도의 파서가 필요하다.
초기 기능의 구현과 테스트를 마친 후, 이를 첫 번째 반복 주기의 끝으로 삼아라. 첫 반복 주기의 경험을 바탕으로 반복 주기의 수와 각 반복 주기에서 무엇을 할지에 대한 처음의 추측을 다듬을 수 있을 것이다.
여러분은 팀, 팀의 생산성 그리고 환경이 일정을 결정한다는 사실을 경영진에게 이해시켜야 한다.
(2022.05.14)
사람이 읽을 수 있는 형태의 데이터와 그 자체만으로 의미가 드러나는 데이터는 다른 어떤 형태의 데이터보다, 심지어 그 데이터를 생성한 애플리케이션보다 더 오래 살아남을 것이다.
버전 관리 시스템에서 에디터, 명령 줄 도구에 이르기까지 컴퓨터 세계의 거의 모든 도구는 일반 텍스르를 다룰 수 있다.
여러분은 모든 참가자가 하나의 공통 표준을 사용해서 소통하도록 해야 한다. 일반 텍스트가 바로 그 표준이다.
WYSIWYG(What You See Is What You Get) but WYSIAYG(What You See Is All You Get.)
셸에 익숙해지면 여러분의 생산성이 급상승할 것이다.
(2022.05.22)
버그가 여러분의 잘못인지 다른 사람의 잘못인지는 중요치 않다. 어쨌거나 그 버그를 해결해야 하는 사람은 여러분이다.
"그건 불가능해."라고 중얼거릴 정도로 놀라운 버그를 만나게 된다면 버그를 고치는 것 이상을 해야 한다. 버그가 일찍 발견되지 않은 원인을 찾아 해결하고 유사한 버그가 있을 법한 코드들도 미리 고치자. 다음번에는 놀라지 않도록!
텍스트 처리 언어를 익혀라
텍스트 언어를 제대로 사용할 수 있다면 유틸리티나 프로토타입을 빠르게 만들어 볼 수 있다.
(2022.06.08)
만약 호출자가 루틴의 모든 선행 조건을 충족한다면 해당 루틴은 종료 시 모든 후행 조건과 불변식이 참이 되는 것을 보장한다.
코드에서 DBC를 지원하지 않는 언어에서는 다음과 같은 것들을 미리 정의해 보자.
DBC를 사용하면 더 일찍 멈추고 문제에 대한 보다 정확한 정보를 알려줄 수 있다.
문제를 찾고 원인을 밝히기 위해서는 사고가 난 지점에서 일찍 멈추는 것이 유리하다.
이것은 시스템의 여러 다른 부분에 적용할 수 있는 분명하고 간략하며 명확한 선언이다. 이는 모든 시스템 사용자와 맺는 계약이며 동작에 대한 우리의 보증이다.
(2022.08.07)
우리는 너무 먼 미래는 내다볼 수 없고, 정면에서 벗어난 곳일수록 더 어둡다.
(2022.08.14)
전역 데이터를 피하라: 싱글턴, 외부 리소스
전역적이어야 할 만큼 중요하다면 API로 감싸라.
프로그래밍은 코드에 관한 것이지만, 프로그램은 데이터에 관한 것이다.