본문 바로가기
Homo Ware

보수적인가, 진보적인가

by javauser 2012. 8. 25.

대선이 가까와 오면서 보수와 진보의 이념 대결은 이제 뚜렷해지게 나타날 것이다. IT 관점에서도 보수와 진보를 구분할 수 있을까? 이러한 물음에 Amazon에서 일했던 경험을 가지고, 현재 Google에 근무 중인 Steve Yegge이 올린 최근 글이 이슈로 부각되는 것 같다. Steve는 이전에도 구글+ 에 대한 빈판의 글(번역본)을 올려서 외부 유출이 되는 바람에 화제가 되기도 했었는데, 글을 읽어보면 구글+에 대한 비판의 목소리와 함께 플랫폼의 중요성을 아마존이나 다른 서비스에 대해 빗대어서 말한 것 같다. 언론이 일부글들은 인용하면서 그의 글은 본의 아닌 목적으로 사용되기도 한 모양이다.



[출처 : http://www.bablotech.com/2009/01/26/12-wallpapers-in-which-linux-criticizes-windows/]



이번에 작성한 글에서는 '소프트웨어 엔지니어링은 보수(conservative)에서 진보(liberal)까지 그 자체로 정치적인 축을 가진다'는 명제(thesis)에서 출발했다. 물론, 이분법적인 사고에 대한 문제와 실세계의 정치적인 성향과의 관계에 대해서는 논할 부분들이 많을 것이지만(사실, 이를 증명하는게 크게 의미없다고 생각하지만), 실제로 Steve가 생각하는 소프트웨어를 만드는 입장에서 보수(conservatism)와 진보(liberalism)이 무엇인지를 정리하면 다음과 같다.


보수적인 측면

  • 위험관리에 대해 적극적으로 대처하고 사전에 없애려는 노력을 함
  • 유연성(flexibility)과 생산성(productivity)보다 안정성(safety)과 성능(performance)를 더 우선시 함


진보적인 측면

  • 효과적인 변경이 더 강력한 동기이며, 이를 위한 시스템을 만듬
  • 시스템의 유연성을 극대화시키는 동시에, 기능 개발의 속도를 최대화시키는 것을 목적으로 함

이와 같은 관점은 IT에서 SW 개발과 유지보수라는 두가지를 분류해볼때 유사한 접근 방식이기도 하다. 즉, 새로운 시스템을 개발하는 SW 개발 영역에서는 진보적인 성향이 더 강하며, 시스템을 유지하고 운영하는 영역에서는 보수적인 성향이 더 강한 경향이 있다. 즉, 개발자의 보수와 진보적인 성향 역시 어떠한 시스템을 다루는가와 직접적으로 관련이 있지 않을까 싶다.

이러한 보수와 진보적인 측면을 측정하는 기준으로 Steve는 각각 9가지의 사례를 들어서 설명하고 실제 측정을 할 수 있는 웹 사이트를 만들었다. (http://sweaxis.org 에서 자신의 SW를 만드는 이념적 성향을 측정해볼 수 있다.)

보수적인 측면
1. 소프트웨어는 최종으로 인도되기 전에 버그가 없는 상태를 목적으로 해야 한다.
2. 프로그래머는 에러에 대해서 미리 예방할 수 있어야 한다.
3. 프로그래머는 새로운 언어나 기술, 문법에 대해 익히는데 어려움을 겪는다.
4. 제품 코드(운영을 위한 코드)는 컴파일러에 의해서 안전하게 체크되어야 한다. (이를 체크할 수 있는 방법이 없는 경우(예를 들어, 정규식이나, 동적 호출과 같은 실행시에만 검증할 수 있는 것들)에는 특정 절차를 거쳐서 체크되어야 한다.)
5. 데이터 저장소는 정의가 잘 된 형태로 배포된 스키마에 항상 맞아야 한다. (이는 DB와 ERD 뿐만 아니라, UML, XML과 DTD 등이 모두 포함된다.)
6. public 인터페이스는 엄격하게 모델링되어야 한다. (데이터는 문자열이나 타입을 알 수 없는 콜렉션 형태로 저장되어서는 안되며, 엄격한 특정 타입을 갖는 궁극적으로 객체 모델 형태이어야 한다.)
7. 제품(운영) 시스템은 결코 위험한 상태가 되거나 백도어 형태의 공격을 받아서는 안된다. (이는 개발을 위해 디버거나 텔넷과 같은 연결도 허용해서는 안되면 오직 읽기만 가능한 모니터링만 가능해야 함을 의미한다.)
8. 만일 해당 컴포넌트에 대해 안전성에 대한 일말의 의심이라도 있다면, 결코 배포되어서는 안된다. (이는 긴급배포와 같은 시급한 경우에도 동일하게 적용된다)
9. 빠름이 느림보다 낫다. (코드는 성능을 위해서 작성되어야 하며, 코드 자동 생성과 같은 느림을 유발하는 코드를 사용해서는 안된다.)

진보적인 측면
1. 버그가 그렇게 큰 문제가 아니다. (버그는 어떻게든 발생되며, 이를 해결하기 어려운 것과 상관없이 모든 개발자들이 이를 해결하려는 노력을 해야 한다. 이부분이 보수와 진보를 나누는 주요한 부분이다.)
2. 프로그래머는 초반에만 신참일 뿐이다. (프로그래머는 연차나 경험을 하면서 지속적으로 지식과 경험이 풍부해지고 더 현명해질 수 있다.)
3. 프로그래머는 현재 하는 일에 따라서 자신의 능력을 극적으로 빨리 향상시킨다. (새로운 기술에 대해서는 관련 문서를 읽을 시간을 잠시 주면 이를 익힌다)
4. 간결함은 힘이다. (코드는 최소화되도록 유지해야 하며, 정적 분석 도구를 통해서 더 최적화시킬 수 있다)
5. 엄격한 스키마가 유연성을 제약하며 개발 속도를 느리게 한다. (스키마는 보수적인 측면의 5번의 내용을 모두 포함하며, 실제로 데이터가 어떻게 생성되고 어떻게 사용되는지에 따라서 스키마를 이해하기 때문에 코드에 따라서 변경될 수 있다)
6. public 인터페이스는 무엇보다 단순해야 하며, 이전 버전에 대한 호환성 뿐만 아니라 이후 버전에 대한 호환성을 갖춰야 한다. (엄격한 모델링은 인터페이스가 앞으로 변화할 필요가 있는 것을 추측할 뿐이기 때문에 이전/이후 버전에 대한 호환성을 보장할 수 없으며, 최소한 단순화시킨 API로 점증적으로 변경해야 한다)
7. 시스템 유연성은 고객이 원하는 것(계약서 내용)을 얻게 만드는 것과 다른 경쟁자(외부 침입자)들이 이를 가로채는 것 사이의 차이를 의미한다. (보안이나 안정성에 관련된 수많은 검증된 제품들이 많이 있으며, 이를 통해 제어가 가능하다)
8. 기업은 위험을 감수하고, 변화를 수용하고, 경직성에 대해 강하게 반발해야 한다. (피할 수 없는 재앙에 대비해서 좋은 복구 기술을 갖출 필요가 있으며, 이는 위험을 감수하지 않더라도 필요함을 의미한다)
9. 성숙되지 않은 최적화가 악의 근원이다. (동작하는 코드가 우선이며, 성능보다 정확성에 초점을 두고, 정확성보다 반복적인 프로토타입핑에 초점을 둔다. 성능에 대해 가장 우선 순위로 언급될 때에만 프로필을 사용한 최적화로 성능을 향상시킨다)

이와 같이 총 9가지의 항목으로 구성된 보수/진보적인 내용들을 기준으로 개발자의 성향을 점검해 볼 수 있다. 항목들을 자세히 보면 보수적인 측면과 진보적인 측면 모두 동의할 부분들이 있으며, 어느 것을 더 동의할 것인가가 성향을 나타내는 것이지만, 이와 같은 성향이 SW 개발에 있어서 영향을 미치는 것은 사실이다. 즉, 설계에 대한 믿음과 사상이 바로 이러한 성향들이 다소 반영된 형태로 나타나기 때문이다.


이러한 측정 기준의 결과로 "비정치적", "보수적", "중립", "진보적"의 4가지 성향을 분류했고, 양극단의 머리를 두는 중립파를 추가로 분류했다. 또한, 언어에 따라서 어떤 성향을 띠고 있는지에 대해서는 예시를 들었고, 페이스북, 아마존, 구글, MS 등의 기업 문화에 대해서도 사례를 들고 있다.


사실, 국내 현실에서 이러한 보수와 진보적인 측면에 대해서 나누는 것은 큰 의미가 없을 수 있다. 왜냐하면 기술에 너무 종속되어 버린 SW 엔지니어링 분야에서 SW 란 단순히 무엇을 이루기 위한 도구나 수단으로 생각하는 경향이 너무나도 강해서 이러한 보수와 진보를 나누는 것에는 거의 관심이 없는 것처럼 보일 수 있다. 하지만, 무엇보다 그러한 기술을 이루는 아키텍처 설계가 어떠한 관점으로 접근할 것인지가 SW가 가지는 큰 특징을 가진다. 특히, 개발 프로세스에서도 이러한 보수/진보의 성향에 따라서 어떠한 접근법을 취할 것인지가 분명하게 나눌 수 있는 부분이 있기 때문에 설계를 하는 과정에서는 중요한 요인인 것들도 있다.


Steve Yegge는 개발자들이 사고하는 방식을 분류한다는 차원에서 꽤 생각해볼 만한 내용이다. SW 개발을 할 때에 이러한 사고에 대한 절차를 명확하게 보여줄 수 있는 방법과 방식이 필요하며, 해당 설계가 어떠한 관점과 사상에서 출발했는지를 알려줄 필요가 있다. 어느 한쪽이 더 좋고 나쁘다고 말할 수는 없지만, 그리고 이러한 분류에 속한 기술이나 언어들 역시 상황에 따라서 바뀔 수도 있지만, 가장 중요한 내용은 프로그래머라면 자신이 설계하고 구현하고자 하는 SW에 대한 강력한 믿음과 사상을 가져야 한다는 것이다. 그리고, 어떤 형태로든 이러한 내용이 표현되고 설득시키고 가시화시킬 필요가 있다.

반응형