# Content 빌드, 설계, 아키텍처처럼 소프트웨어 개발에서는 건축학에서 비롯된 메타포가 많다. 그러나 건물의 견고함, 단단함, 장엄함을 연상하게 하는 메타포가 가져다주는 신뢰감에는 긍정적이지만 자칫하면 건축의 특성과 소프트웨어의 특성이 매우 달라야 한다는 점을 간과하기 쉽다. 소프트웨어와 건축사이에는 확연한 차이가 있다. 익스트림 프로그래밍에서 보여준 예시처럼 완성된 자동차의 문짝을 바꾸라는 지시가 없듯이 건물을 지어 올리는 중에 기둥을 바꾸라는 지시가 내려오는 경우는 없다. 반면 그런 변경이 가능할 수 있도록 유연한 구조를 제공하는 것이야말로 소프트웨어의 목적이다. 소프트웨어 업계에서 켄트 벡이 종종 인용하는 정원일(gardening)에 대한 메타포가 보다 일반적이었다면 소프트웨어의 품질과 품질에 대한 견해도 보다 고차원적이었을 것이다. 정원은 유동적인 실체다. 일광량, 우천, 온도 등의 변화에 민감하며 외부에서 벌레나 동물이 유입될 수도 있다. 그리고 이상적인 정원을 위한 정원사의 행동을 생각해보자. 정원사는 완벽한 정원을 만들기 위해 정원 전체의 수목을 교체하는 대신 하루하루 가지치기 하고 비료를 조절하며 단계적으로 바꿔나갈 것이다. 이처럼 오늘 완벽한 소프트웨어가 내일도 완벽하다는 보장은 없다. 요구사항이 변화하면 오늘 완성한 소프트웨어가 제공하는 효용이 쓸모 없어질 수도 있기 때문이다. 소프트웨어는 건물을 다루는 것이 아니라 정원을 다루어야 한다. - - - ## Reference - [[요구사항 그물질하기]] - [[회상용이성이 주는 편향]] - [[리팩터링의 계층]] - [[최적화에 대한 조언]] - - -