맨먼스 미신 / 프레더릭 브룩스 / 인사이트
프로그램이 가로선으로 표시된 경계를 넘어서 아래로 가면 ‘프로그래밍 제품’이 된다. 이것은 누구든지 실행하고, 테스트하고, 보수하고, 확장할 수 있는 프로그램이며, 다양한 운영 환경 하에서 여러 가지 데이터에 적용할 수 있다. 어떤 프로그램이 보편적으로 쓸모 있는 프로그래밍 제품이 되려면 일반화된 방식으로 작성되어야만 한다. 특히 입력 데이터의 범위와 형식은 기본적인 알고리즘이 허용하는 한도 내에서 최대한 일반화되어야 한다. 그런 다음에 이 프로그램은 신뢰성 확보를 위해 철저히 테스트되어야 한다. 그 말은, 입력 범위와 경계를 검사하는 테스트 케이스가 충분히 작성되고, 그에 따라 테스트가 수행되며, 그 결과가 기록된다는 것을 뜻한다. 마지막으로, 프로그램이 프로그래밍 제품으로 거듭나기 위해서는 누구라도 그 제품을 사용하고 수정하며 확장할 수 있도록 빈틈없는 문서화가 이루어져야 한다. 경험으로 보건대, 똑같은 기능을 제공하는 디버깅된 프로그램에 비해 프로그래밍 제품은 최소 세 배 이상의 비용이 들 것으로 추정된다. (p.5)
프로그래밍은 왜 재미있는가? 프로그램을 만드는 사람들은 어떤 즐거움을 대가로 기대하고 있는가?
첫 번째는 무언가를 만드는 데서 오는 순전한 기쁨이다. 아이들이 진흙으로 과자를 만들면서 즐거워하듯이 어른들도 무언가 만드는 것을 즐기며, 그것이 직접 설계한 것이라면 더욱 그렇다. 나는 이런 기쁨이 조물주가 만물을 창조할 때 느꼈을 기쁨과 다르지 않을 거라고 생각한다. 그 모든 나뭇잎, 모든 눈송이가 낱낱이 새롭고 어느 하나라도 같지 않음에서 엿볼 수 있는 그런 기쁨 말이다.
두 번째는 다른 이들에게 쓸모 있는 사물을 만드는 데서 오는 기쁨일 것이다. 우리는 자신이 만든 것을 다른 사람이 쓰면서 유용하다고 느끼기를 마음 깊은 곳에서 바란다. 이런 면에서 시스템 프로그래밍은 ‘아빠 회사에서’ 쓰라고 아이가 처음으로 만든 찰흙 연필꽂이와 별로 다르지 않다.
세 번째는 서로 맞물려 돌아가는 부속품으로 이루어진 복잡한 퍼즐 같은 사물을 만들고, 거기 심어 놓은 여러 가지 법칙이 미묘한 순환 속에서 펼쳐지는 것을 바라보는 매혹적인 경험이다. 프로그래밍된 컴퓨터는 핀볼 기계나 주크박스 장치의 모든 매력을 가지면서도 그것을 궁극으로 끌어올린 것이라 할 수 있다.
네 번째는 지속적인 배움에서 오는 기쁨이다. 이것은 반복되는 작업이 없다는 특성에서 비롯된다. 모든 문제에는 어딘가 새로운 측면이 있고, 문제를 해결하는 사람은 거기서 어쨌거나 무언가를 배우게 된다. 그 무언가는 때로 실용적이고 때로 이론적인 것이며, 가끔은 둘 다일 경우도 있다.
마지막 즐거움은, 너무도 유연하고 다루기 쉬운 표현 수단으로 작업하는 데서 오는 기쁨이다. 프로그래머의 작업은 시인과 마찬가지로 순수한 사고의 산물에 가깝다. 그는 허공 위에다 허공으로 만든 성을 상상의 힘으로 짓는다. 이만큼 유연하며 다듬기 쉽고 장대한 개념적 구조를 실체화하는 데 적합한 재료는 별로 없다(나중에 보겠지만 이런 유연성에도 나름의 문제는 있다).
하지만 이런 프로그램들은 작동했을 때 그 자체와는 별개로 실재하는 결과물을 만들어낸다는 점에서 시인의 시구와 달리 현실에 닿아 있다. 이 프로그램은 결과를 출력하고 그림을 그리며, 소리를 내고 기계 팔을 움직이기도 한다. 미신과 전설 속의 마법이 우리 시대에 이르러 현실이 된 것이다. 키보드에 올바른 주문을 타이핑하면 모니터 화면은 생명을 얻고, 이전에는 존재하지도 않았고 존재할 수도 없었던 것들을 우리에게 보여준다.
이렇게 우리 마음 깊은 곳 창작에 대한 갈망을 충족시키고 모든 인간이 공통적으로 지닌 감수성을 즐겁게 하기에, 프로그래밍은 재미있는 일이다. (p.6-7)
프로그래머들 사이에 만연한 이 낙관주의에 대해서는 좀 더 깊이 분석해 볼 가치가 있다. 도로시 세이어즈(Dorothy Sayers)는 그녀의 탁월한 저서 『The Mind of the Maker』에서 창조적 활동을 아이디어, 구현, 상호 작용이란 세 단계로 나누고 있다. 한 권의 책은(컴퓨터 혹은 프로그램도 마찬가지지만) 먼저 상상 속에서 모습을 갖추어 갈 것이며, 시공간에 속해 있지 않아도 창조자의 마음속에 완전한 형태를 이루고 있을 것이다. 그것은 펜과 잉크와 종이를 통해, 또는 전선과 실리콘과 페라이트(ferrite)에 의해 시간과 공간 속에 현실화된다. 그리고 누군가 그 책을 읽거나 컴퓨터를 쓰거나 프로그램을 실행할 때, 만든 이의 마음과 상호 작용이 일어나면서 창조는 비로소 완성된다.
세이어즈가 인간의 창조적 활동뿐 아니라 기독교 삼위일체 교리를 설명하기 위해 사용한 이런 서술은 지금 우리 논의에도 도움이 될 것이다. 인간이 무언가를 만들 때는, 그 생각에 불완전함이나 모순이 있더라도 실제로 만들기 시작한 후에야 그것이 명확해진다. 따라서 이론가들에게는 글로 쓰거나 실험하는 등의 ‘실제 해보기’가 필수적인 지침이 된다.
창작 활동에서 표현 수단으로 사용되는 재료는 대체로 다루기가 어렵다. 목재는 갈라지고 물감은 지워지며 전기 회로는 윙윙거린다. 이런 물리적인 한계 때문에 아이디어를 표현하는 데 제약이 생기고, 구현 도중 예상하지 못한 난관을 만나기도 한다.
그런 이유로 아이디어를 구현하는 데는 시간과 노력이 든다. 이것은 재료가 물리적이기 때문이기도 하고, 아이디어가 그 재료에 근본적으로 적합하지 않기 때문이기도 하다. 구현에 어려움이 있을 때 우리는 재료 탓을 하는 경향이 있다. 아이디어는 내 것이지만 재료는 그렇지 않으므로, 우리 자존심이 판단을 왜곡하기 때문이다.
그러나 컴퓨터 프로그래밍에서 사용되는 재료는 다루기가 무척이나 쉽다. 프로그래머는 순전히 생각만으로 여러 가지 개념과 그것을 표현할 아주 유연한 방법을 만들어 낸다. 재료가 유연하기 때문에 구현에 별다른 어려움이 있을 거라고 생각지는 않으며, 낙관주의는 이렇게 우리 사이에 만연하게 된다. 그러나 우리 아이디어 자체에 흠이 있기에 버그가 생겨나며, 우리의 낙관주의는 이렇게 정당성을 잃는다. (p.14-15)
지금까지의 내용을 극도로 단순화하면, 다음과 같은 브룩스의 법칙을 제시할 수 있을 것이다.
“늦어진 소프트웨어 프로젝트에 인력을 추가로 투입하면 더 늦어지게 된다.”
이렇게 하여 우리는 맨먼스에 관련된 미신을 걷어낼 수 있다. 프로젝트에 소요되는 기간은 순서대로 처리해야 하는 내부 요소에 좌우되며, 필요한 최대 인원수는 독립된 하위 작업의 개수에 좌우된다. 이 두 가지 수치를 파악했을 때, 관리자는 더 적은 수의 사람과 더 긴 기간에 기초한 일정을 수립할 수 있다(유일한 위험은 제품이 시대에 뒤처지게 되는 것이다). 그러나 더 많은 사람과 더 짧은 기간으로는 실행 가능한 일정을 만들어 내지 못한다. 부족한 시간 탓에 망가진 소프트웨어 프로젝트 수는 다른 이유로 그렇게 된 경우를 모두 합한 것보다도 많다. (p.25-26)
유럽에 있는 대성당들은 대체로 건축 시기와 건축가가 상이한 부분들 간에 설계나 건축 양식에서 차이가 나타난다. 후대 건축가들은 시대적 유행과 개인 취향을 반영하기 위해 초기 설계를 ‘개선’하고자 하는 유혹을 받았다. 그렇게 해서 온화한 노르만 양식의 수랑(袖廊)은 치솟은 고딕 양식의 본당과 어울리지 않는 모습으로 이웃해 있고, 건축물에는 신의 영광만큼이나 건축자들의 교만이 드러나 있다.
그에 반해, 랭스(Reims) 대성당의 건축적 통일성은 찬란한 대조 속에 우뚝 서 있다. 이 건물의 탁월함은 곳곳에서 발견할 수 있지만, 설계의 일관됨 역시 보는 이를 즐겁게 한다. 안내서에 적혀 있듯이 이런 일관성은 여덟 세대에 걸친 건축가들의 자기희생으로 얻어진 것이다. 그들은 전체적인 설계에서 원래의 순수성이 유지되도록 하기 위해 자신이 품었던 여러 가지 생각을 내려놓았다. 그리하여 이 건축물은 이제 신의 영광뿐 아니라 타락한 인간들을 자만으로부터 구원한 신의 권능까지 드러내고 있는 것이다.
만드는 데 여러 세기가 걸리는 것도 아닌 프로그래밍 시스템에서는 대부분 대성당보다 훨씬 심각한 개념적 불일치가 발견된다. 이것은 대개 설계 책임자들이 대를 이어가는 경우보다도 여러 명이 설계 작업을 나눈 경우에 생긴다.
나는 개념적 일관성이야말로 시스템 설계에서 가장 중요하게 고려할 사항이라 주장하고자 한다. 좋기는 하지만 연관성 없고 조율도 안 된 기능을 많이 넣기보다는, 이례적인 일부 기능이나 개선 사항을 빼더라도 일련의 설계 사상을 고수하는 편이 더 낫다. (p.41-42)
시스템의 ‘아키텍처’라고 하는 것은, 사용자 인터페이스의 완전하고 상세한 명세를 의미한다. 컴퓨터라면 이것은 프로그래밍 매뉴얼에 해당할 것이고, 컴파일러라면 언어 매뉴얼, 제어 프로그램은 대상 기능을 작동시키기 위한 언어들의 매뉴얼일 것이다. 전체 시스템의 경우에는, 사용자가 자기 업무를 수행하기 위해 참고해야 하는 모든 매뉴얼의 집합이 된다.
건축물의 아키텍트와 마찬가지로, 시스템 아키텍트는 사용자를 대리하는 사람이다. 영업 사원이나 조립공의 이해관계가 아니라 순전히 사용자의 이해만을 대변하기 위해 전문적이고 기술적인 지식을 동원하는 것이 그의 일이다.
아키텍처는 반드시 구현부와 세심하게 구분되어야 한다. 블라우(Blaauw)의 말대로, “아키텍처가 ‘무슨 일’이 일어날지 정하는 것이라면, 구현부는 그것이 ‘어떻게’ 현실화되는지 정한다.” 그는 문자판, 바늘, 용두로 이루어진 아키텍처를 가진 시계를 간단한 예로 든다. 아이가 이 아키텍처를 익힌 뒤에는 손목시계뿐 아니라 교회 탑에 걸린 시계를 보고도 몇 시인지 알 수 있다. 하지만 실제 구현과 그 제품화는, 시계 껍데기 속에서 무슨 일이 일어나는지, 즉 여러 가지 동력 공급 방식과 여러 가지 정밀도 제어 방법 중에서 어떤 것이 사용되는지 같은 것을 기술하는 일이다. (p.44-45)
예술이나 공예 분야에는 절제가 미덕이라고 믿을 만한 사례가 다수 있다. 예술 세계의 격언이 말해주듯이 “형식이 자유롭게 한다.” 최악으로 꼽히는 건물들은 그 목적에 비해 너무 많은 예산을 배정한 결과물이다. 바흐가 정해진 형식의 칸타타를 매주 작곡해야 했기 때문에 창조성이 억압되었을 것 같지는 않다. 나는 스트레치 컴퓨터의 아키텍처는 제약 조건이 좀 더 빡빡했더라면 훨씬 나아졌을 것이라고 확신하며, 시스템/360 모델 30에 배정된 예산 때문에 생긴 제약은 모델 75의 아키텍처에 전적으로 유익한 것이었다고 본다.
마찬가지로 나는 외부로부터 아키텍처가 주어진다는 사실이 구현 담당 그룹의 창조성을 저해하는 것이 아니라 더 높인다고 생각한다. 구현자들은 그 즉시 문제 안에서 누구도 다루지 않았던 부분에 초점을 맞출 것이며 거기에서 독창성이 솟아나기 시작한다. 제약이 주어지지 않은 구현 그룹에서는 대부분의 고민과 토론이 아키텍처 결정에 관한 방향으로 흘러가며, 본래 의미의 구현 작업은 관심에서 멀어지게 된다.
내가 여러 번 경험했던 이런 효과는, PL/I 컴파일러인 PL/C를 만든 코넬(Cornell) 대학교 그룹의 콘웨이(R. W. Conway)가 다음과 같이 확인해 준다. “우리는 언어를 변경하거나 개선하지 않고 컴파일러를 구현하기로 최종 결정을 내렸다. 언어 자체를 논한다면 우리 모든 노력이 거기에 들어가 버릴 것이기 때문이었다.” (p.47)
프로젝트 관리자의 가장 좋은 친구는 매일 적군 역할을 하는 독립적인 제품 테스팅 조직이다. 이들은 명세를 기준으로 기계와 프로그램을 점검하고, 있음직한 결함과 불일치를 모두 집어냄으로써 선의의 비판자 역할을 한다. 모든 개발 조직은 건전성을 담보하기 위해 이처럼 독립된 기술 감사 조직이 필요하다.
하지만 결국에 가서는 고객이 독립된 감사인이며, 실제 사용이라는 가차 없는 빛 아래 모든 결함은 드러날 것이다. 그렇다면 제품 테스팅 조직은 결함 발견에 전문화된 고객의 대리인이라 하겠다. 주의 깊은 제품 테스터들은 말이 제대로 전달되지 않았거나 설계상의 결정이 잘못 이해되었거나 정확하게 구현되지 않은 곳을 몇 번이고 찾아낼 것이다. 이런 이유로 인해 테스팅 조직은 설계 내용의 전달 계통에 필수적인 연결 고리이며, 설계와 동시에 초반부터 가동될 필요가 있다. (p.70)
왜 형식을 갖춘 문서를 만드는가?
첫 번째 이유는, 결정된 사항을 글로 적는 것이 필수불가결하기 때문이다. 오로지 글로 적을 때에만 빠진 곳이 나타나고 모순들이 드러난다. 글로 적는 행위에는 수백 가지의 작은 의사 결정이 필요하며, 분명하고 정확한 정책이 모호한 정책과 구별되는 부분은 이런 의사 결정의 존재 여부에서다.
두 번째 이유는, 결정된 내용을 그 문서를 통해 다른 이들에게 알릴 수 있기 때문이다. 자기가 상식이라 생각했던 정책들을 일부 팀 구성원은 전혀 알지 못한다는 사실에 관리자는 계속 놀라게 될 것이다. 관리자의 기본 업무는 모든 사람이 같은 방향으로 계속 가게 하는 것이다. 따라서 그의 일과는 의사 결정보다는 의사소통이 주가 될 것이며, 이때 그의 문서들은 소통에 따르는 부담을 엄청나게 덜어줄 것이다.
끝으로, 관리자의 문서들은 데이터베이스와 체크리스트 역할을 하기 때문이다. 그 문서들을 주기적으로 검토함으로써 자신의 현 위치를 알며, 방향성을 강조해야 하는지, 수정해야 하는지 알 수 있다. (p.111)
화학 분야 엔지니어들은, 실험실에서 동작하던 공정이라 해서 곧바로 공장에서도 돌아가지는 않는다는 것을 오래전에 배웠다. 보호되지 않은 환경에서 대량으로 공정을 가동하는 경험을 쌓으려면 ‘파일럿 공장’이라는 중간 단계를 거쳐야 한다. 예를 들어 실험실에서 개발된 담수화 공정은, 하루 200만 갤런 규모의 지역 급수 시설에 사용되기 전에 1만 갤런 규모의 파일럿 공장에서 시험이 이루어질 것이다.
프로그래밍 시스템을 만드는 이들 역시 이런 교훈을 알고는 있었지만, 아직 마음에 새기지는 못한 것 같다. 프로젝트마다 제 나름의 알고리즘을 한 묶음 설계하고서 고객에게 납품할 소프트웨어 제작에 뛰어드는데, 그 일정을 보면 가장 처음 나온 결과물을 납품해야 하는 상황이다.
대부분의 프로젝트에서 나온 첫 시스템은 거의 쓸 수 없는 수준이다. 너무 느리거나, 너무 크거나, 쓰기에 불편하거나, 셋 다일 수도 있다. 속은 상하지만 좀 더 현명하게 다시 시작해서, 그런 문제가 해결된 재설계 버전을 만드는 것 외에 다른 대안은 없다. 폐기하고 재설계하는 일은 한꺼번에 진행될 수도, 조금씩 진행될 수도 있다. 그러나 모든 대규모 시스템의 구축 경험이 시사하는 것은, 그런 일이 어쨌거나 일어날 것이라는 점이다. 새로운 개념이나 신기술이 사용되는 경우, 버려지기 위한 시스템을 만드는 것은 피할 수 없다. 아무리 훌륭한 계획이라 해도 한 번 만에 제대로 된 시스템을 만들 정도로 전지적일 수는 없기 때문이다. (p.115)
프로그램 유지 보수의 근본적인 문제는, 결함을 수정할 때 상당한(20~50%) 확률로 또 다른 결함이 유입된다는 것이다. 그러므로 전체 과정은 두 걸음 전진 후에 한 걸음 후퇴가 된다.
결함이 좀 더 깔끔하게 수정되지 못하는 까닭은 무엇인가? 첫 번째 이유는, 미묘한 종류의 결함이라도 겉으로는 국부적 문제로 나타나기 때문이다. 사실 이런 결함은 시스템 전체에 영향을 끼치지만, 대개 그 점이 명백히 드러나지는 않는다. 최소한의 노력으로 그것을 고치려 할 때 국부적이고 명백한 오류는 수정될 수 있겠지만, 프로그램 구조가 순전하거나 문서화가 아주 훌륭하지 않다면 그런 수정 행위가 끼칠 광범위한 영향은 간과될 것이다. 두 번째 이유는, 수리 담당자가 대개 코드를 만들었던 당사자는 아닌 데다가, 하급 직원이나 수습사원일 때가 많기 때문이다.
새 버그의 유입으로 인해, 프로그램 유지 보수는 다른 어떤 프로그래밍 작업보다도 더 많은 문장 단위의 시스템 테스팅을 필요로 한다. 이론상으로 매번 수정 후에는 시스템이 알 수 없는 방식으로 손상되지 않았음을 보장하기 위해 이전에 수행된 테스트 케이스 전체를 다시 수행해야 한다. 실무에서는 ‘회귀 테스트’가 이런 이상적인 모습에 실로 가깝겠으나, 거기에는 많은 비용이 든다.
부작용을 없애거나 최소한 드러나도록 만드는 프로그램 설계 방법이라면, 유지 보수 비용 면에서 막대한 이득을 얻을 수 있음이 분명하다. 더 적은 인원, 더 적은 인터페이스로 설계 내용을 구현할 방법이라면 그 역시 버그를 줄일 것이므로 같은 효과가 있다. (p.121-122)
리먼(Lehman)과 벨러디(Belady)는 대형 운영 체제가 여러 버전에 걸쳐 출시된 이력을 연구했다. 그들은 모듈 총 개수는 버전에 따라 선형적으로 증가하지만, 출시로 영향을 받은 모듈 수는 기하급수적으로 늘어남을 발견했다. 모든 수정 행위는 시스템 구조를 훼손하고 엔트로피와 무질서를 증가시키는 경향을 보였다. 원래의 설계 결함을 수정하는 데 투입되는 노력은 점점 더 줄고, 초반의 수정으로 유입된 새 결함들을 고치는 데 점점 더 많은 시간이 소요된다. 시간이 지나면서 시스템은 점차 질서가 무너져간다. 머지않아 수정 행위는 어떤 효과도 거두지 못하게 된다. 한 걸음 앞으로 나갈 때마다 다시 한 걸음 물러서는 형국이다. 원론적으로 영원히 사용 가능해야 할 시스템은 더 이상 전진의 거점이 되지 못하고 낡아버린 것이다. 게다가 장비가 바뀌고, 설정이 바뀌고, 사용자 요구 사항도 바뀌니, 사실상 한 시스템을 영원히 사용할 수는 없다. 완전히 새롭게 처음부터 다시 설계하는 일이 필요해진다.
벨러디와 리만은 통계역학적인 모델에서 출발해서 프로그래밍 시스템에 도달하는데, 그 결론은 전 세계 사람들의 경험에 의해 뒷받침되는 좀 더 일반화된 것이다. 파스칼(Pascal)은 “모든 것은 항상 처음이 가장 좋다”라고 말했다. 루이스(C. S. Lewis)는 이것을 좀 더 통찰력 있게 언급한 바 있다.그것이 역사에 대한 열쇠다. 엄청난 에너지를 쏟아붓는다. 그리고 문명들이 일어난다. 그러고 나서 훌륭한 제도가 고안된다. 하지만 그때마다 뭔가가 잘못된다. 어떤 치명적인 결함에 의해 항상 이기적이고 잔혹한 인물들이 정상에 오르고, 그다음에는 모든 것이 곤궁과 몰락으로 되돌아간다. 사실 기계도 망가지기는 마찬가지다. 멀쩡히 기동되어 몇 미터를 달리더니, 이내 고장이 나버린다.
시스템 프로그램을 만드는 일은 엔트로피를 감소시키는 과정이므로 본질적으로 준안정적인 상태다. 프로그램 유지 보수는 엔트로피를 증가시키는 과정이고, 아무리 능숙하게 수행된다 해도 시스템이 수리 불가의 구닥다리가 되는 것을 잠시 늦출 수 있을 뿐이다. (p.122-123)
프로젝트에 엄청난 일정 지연이 발생했다는 얘기를 들으면, 아마도 큰 재난이 잇달아 닥쳐왔나 보다 상상하게 된다. 하지만 재앙의 원인은 대개 토네이도라기보다 흰개미 때문일 경우가 많다. 그리고 일정은 알지 못하는 사이에, 하지만 확실히 늦어진다. 사실 대재난이라면 오히려 더 대응하기가 쉽다. 주력 인원이 배치되고, 조직은 급진적으로 재구성되며, 새로운 접근법이 고안될 것이다. 모든 팀이 난관에 대처하기 위해 나설 것이다.
그러나 매일매일 조금씩 일어나는 지연은 더 알아차리기 어렵고, 예방하기도 어려우며, 만회하기도 더 힘들다. 어제는 핵심 인물이 아파서 회의가 취소되었다. 오늘은 건물 변압기에 벼락이 떨어져서 장비들이 모두 다운되었다. 내일은 공장에서 오기로 된 첫 번째 디스크가 일주일이나 늦어져서 디스크 관련 루틴 테스트를 시작하지 못할 것이다. 폭설, 배심원 의무, 가정 문제, 긴급한 고객 미팅, 임원 감사…, 나열하자면 끝이 없다. 하나하나만 보면 예정된 일을 반나절이나 하루 정도 늦출 뿐이다. 그리고 일정은 한 번에 하루씩, 지연되어 간다. (p.155)
프로그램 문서화를 어느 수준으로 할 것인가는, 사용자가 그 프로그램을 일반적인 용도로 쓰는 것인지, 거기에 의존해야 하는 상황인지, 아니면 환경과 목적에 맞춰서 변경해야 하는지에 따라 달라진다.
프로그램을 사용하기. 모든 사용자에게는 프로그램에 대한 상세한 설명이 필요하다. 하지만 많은 문서의 경우 전체적인 개관을 제시하는 데 인색하다. 나무들이 묘사되고 껍질과 잎사귀에 대해 주석이 붙었지만, 정작 숲의 지도는 없는 격이다. 쓸모 있는 상세 설명을 작성하려면, 뒤로 한 발 물러난 다음 찬찬히 들여다봐야 한다.
- 목적. 주된 기능, 다시 말해 이 프로그램을 쓰는 이유가 무엇인가?
- 환경. 프로그램이 수행될 장비, 하드웨어 설정, 운영 체제 설정은 어떤가?
- 정의역과 치역. 유효 입력값이 정의된 영역은 어디이며 유효 출력값의 범위는 어떤가?
- 구현된 기능들과 사용된 알고리즘. 그것이 하는 일은 정확하게 무엇인가?
- 정확하고 빠짐없는 입출력 데이터 형식.
- 작동 지침. 정상 및 비정상 종료시 콘솔과 출력물에 나타나는 동작 양상을 포함한다.
- 옵션. 각 기능에 대해 사용자는 어떤 선택을 할 수 있는가? 그 선택을 명시하는 방법은 정확히 무엇인가?
- 실행 시간. 특정한 환경 설정에서 특정 분량의 문제를 처리하는 데 걸리는 시간은 얼마나 되는가?
- 정밀도와 검증. 처리 결과의 정밀도는 어느 정도로 예측되는가? 정밀도를 검증할 방법은 무엇이 있는가?
이 모든 정보는 서너 쪽 내외로 담을 수 있는 경우가 흔하다. 그러기 위해서는 간명함과 정확성에 세심한 주의를 쏟아야 한다. 이 문서들은 대부분 기본 계획에 관련된 결정 사항들이 구체화된 것이므로, 프로그램을 만들기 전에 초안을 작성할 필요가 있다. (p.168-169)
소프트웨어의 복잡성은 본질적인 속성이며 부수적인 것이 아니다. 그런 이유로, 소프트웨어를 기술하는 추상화 과정에서 그 복잡성이 망실된다면 본질적인 부분 또한 잃어버리기 쉽다. 수학과 물리학은 지난 3세기 동안 복잡한 현상에 대해 단순화된 모델을 만들고, 그 모델에서 특성들을 이끌어 내고, 실험을 통해 그 특성을 검증하는 방식으로 장족의 발전을 이루어 왔다. 이것이 가능했던 것은, 모델에서 무시된 복잡성이 그 현상의 본질적 특성이 아니었기 때문이다. 복잡성이 본질일 때 이런 방식은 더는 통하지 않는다. (p.189)
프로그램 검증은 오류를 방지하는 프로그램을 의미하지 않는다. 여기에도 마법은 없다. 수학적 증명도 결함이 있을 수 있다. 그러므로 검증으로 인해 프로그램을 테스트하는 부담이 줄어들 수는 있겠지만, 그것을 완전히 제거할 수는 없다.
더 심각한 것은, 완벽한 프로그램 검증이라 해도 단지 프로그램이 명세를 충족함을 확인했을 뿐이라는 점이다. 소프트웨어 개발에서 가장 힘든 부분은 완전하고 일관된 명세이며, 프로그램 작성의 핵심 대부분은 사실 명세를 디버깅하는 일이다. (p.204-205)
그 어떤 제품이라도 새로 만드는 것보다는 더 저렴하다. 10만 달러에 달하는 제품이라 해도 그 비용은 프로그래머 한 명을 1년 유지하는 정도다. 그리고 납품은 즉시 이루어진다! 적어도 실제로 존재하는 제품, 사용자가 만족하며 쓸 거라고 개발자가 얘기할 수 있는 제품이라면 납품은 즉각적이다. 게다가 이런 제품들은 자가 제작된 소프트웨어에 비해 문서화가 훨씬 잘 되어 있고 유지 보수도 더 나은 경향이 있다.
나는 대량 판매용 시장의 개척이야말로 소프트웨어 공학에서 가장 의미심장하며 장기적인 트렌드라고 믿는다. 소프트웨어 가격은 언제나 개발 비용이었지 복제 비용은 아니었다. 그 비용을 몇 안 되는 사용자가 나누는 것만으로도 일인당 비용은 급격히 절감된다. 이것은 또한 n벌의 소프트웨어 시스템을 사용함으로써 그 개발자들의 생산성이 n배가 된다는 관점으로도 볼 수 있다. 이것은 우리 산업 분야뿐 아니라 국가 수준의 생산성 향상이라 할 수 있다. (p.207)
요즘은 많은 사용자들이 프로그램 한 줄 짜지 않고도 다양한 응용 분야에 자기 컴퓨터를 일상적으로 활용하고 있다. 참으로, 이들 중 많은 수가 자기 기계에서 돌아갈 프로그램을 새로 짤 줄은 모르더라도 그걸로 새로운 문제를 해결하는 데는 능숙하다.
오늘날 많은 조직에 적용할 수 있는 가장 강력한 소프트웨어 생산성 전략을 하나만 꼽자면, 컴퓨터에 서툰 최전선의 지식 노동자들에게 개인용 컴퓨터와 범용 문서 작성, 드로잉, 파일 관리, 스프레드시트 프로그램을 지급하고서 자유롭게 놓아주는 것이다. 수백 명의 연구실 과학자들에게도 같은 전략을 적용할 수 있다. 이 경우에는 수학 및 통계 관련 범용 패키지와 약간의 프로그래밍 능력이 필요할 것이다. (p.208-209)
소프트웨어 프로젝트를 관리하는 일은 대부분의 프로그래머들이 애초에 생각하던 것보다도 훨씬 여타 관리 분야와 비슷하다고 1975년판의 서문은 적고 있다. 인류의 역사란, 줄거리는 변함없고, 대본은 문화의 진보에 따라 조금씩 바뀌며, 배경 설정은 항상 변하는 드라마와도 같다. 20세기에 우리 자신의 모습을 셰익스피어, 호머, 성서 속에서 찾을 수 있는 것은 그 때문이다. 『맨먼스 미신』이 사람과 팀에 대한 내용을 담고 있는 한, 쉽사리 시대에 뒤떨어지지는 않을 것이다. (p.274)
파르나스가 정보 은닉이란 관점으로 모듈에 대해 내린 정의는, 결정적 중요성을 가진 해당 연구 분야에서 출간된 첫 번째 성과이며, 객체 지향 프로그래밍을 낳은 지적 조상 중 하나다. 그는 모듈이란 것을 자신만의 데이터 모델과 연산 체계를 갖춘 소프트웨어 개체로 정의하였다. 모듈의 데이터는 오로지 그 모듈에 고유한 연산을 통해서만 접근이 가능하다. 이 분야의 두 번째 성과는 몇몇 사상가의 기여로 얻어진 결과인데, 파르나스의 모듈 개념을 ‘추상적 자료형’으로 발전시켜서 그로부터 많은 객체가 파생될 수 있게 하였다. 추상적 자료형은 모듈의 인터페이스를 고민하고 명세하기 위한 통일된 방법과, 강제하기 쉬운 접근 규율을 제공한다. (p.295)
부동산, 누구에게나 공평한 불행 / 마강래 / 메디치미디어
주변에서는, 강남은 그들만의 리그이니 정부가 신경 쓸 필요가 없다고 이야기하기도 한다. 빈대 잡다가 초가삼간 다 태우는 것처럼, 강남 집값 잡으려고 대책 내놓는 것이 전국 부동산 시장을 다 망칠 수 있다고 말한다. 큰일 날 소리다. 강남은 대한민국의 집값이 어느 정도까지 상승할 수 있는지를 보여주는 지표다. 마치 운동선수들이 세계기록을 지표로 삼고, 이를 깨기 위해 노력하는 것과 같은 이치다. 다른 지역도 강남의 집값을 따라가기 위해 전력 질주를 하고 있기 때문이다. 강남의 집값은 서울 집값의 기폭제다. 더 나아가, 서울의 집값은 전국 집값의 기폭제가 되고 있다. (p.50)
우리나라의 가처분소득 대비 가계 부채비율은 2008년 138.5퍼센트에서 2019년 190.6퍼센트까지 지속적으로 증가했다. 190퍼센트는 1년에 개인이 쓸 수 있는 돈의 2배 정도 빚을 지고 있다는 뜻이다. 다른 나라에 비해 이 수치가 얼마나 높은 것일까? 2019년 기준으로 일본과 미국은 100퍼센트 정도다. 프랑스는 120퍼센트, 영국은 140퍼센트 정도다. 우리보다 높은 나라는 덴마크(256.7퍼센트), 네덜란드(235.7퍼센트), 호주(209.7퍼센트) 정도인데, 이들은 연금제도가 매우 높은 수준으로 발달해 있다. 또한 사회안전망이 매우 잘 갖추어진 국가들이다. 그래서 실제 상환 부담이 낮은 편이라고 할 수 있다. 방금 이야기했듯이, 우리나라의 가계 부채에는 전세 대출금이 포함되어야 한다. 전세 대출을 빚으로 간주해 계산해보면 260퍼센트가 넘는다. 이 또한 전 세계적으로 가장 높은 수치다. (p.57-58)
주택보급률을 100퍼센트로 맞추어야 한다는 것은 일종의 근거 없는 강박증이다. 주택을 넉넉하게 공급해야 저소득층의 주거 질도 높아질 여지가 있기 때문이다. 왜 그럴까? 국민의 전반적인 소득 수준이 높아지는 상황에서 신규 주택이 공급된다고 치자. 새롭게 공급된 집으로 이주하는 가구는 기존에 살던 주택을 공가로 남겨둔다. 그리고 그 공가에 다른 이들이 이주한다. 또한 이들이 살던 집은 공가로 남게 되고, 이 공가를 또 다른 이들이 들어와 살게 된다. 핵심은, 양질의 주택을 공급하게 되면 경제적 여유가 있는 고소득층이나 중산층이 그리로 이동하게 되고, 이들이 살던 집에는 이들보다 소득이 낮은 계층이 이동하게 된다는 점이다. 더 좋은 주택으로 이동이 촉진되니 국민들이 느끼는 주거 만족도도 높아진다. 이것을 주택여과과정(housing filtering process)이라고 부른다. 이론적으로, 주택여과과정에서 최후에 공가로 남게 되는 주택은 가장 질이 낮은 주택이다. 이런 집들은 새롭게 건축을 하거나 멸실되어 자연으로 돌아가게 된다. (p.73)
살기 좋은 곳에 주택을 공급해야 집값을 잡는다는 주장은 매우 근시안적인 시각이다. 재건축은 공급 효과도 거의 없다. 용적률을 크게 높이거나 수직증축 리모델링을 통해 지금보다 2배나 더 많은 주택이 공급된다고 해도 집값을 잡는 것은 불가능하다. 마치 목마르다고 마신 바닷물이 더 큰 갈증을 부르듯, 서울 핵심지역의 주택 재건축은 더 큰 수요를 부를 것이 분명하다. 그렇다고 주택 공급을 멈추자는 것은 아니다. 공급은 공급대로 지속해나가야 한다. 그래야 멸실되는 주택을 보충할 수 있고, 주택의 질도 높여나갈 수 있다. 하지만 공급보다 더 중요한 것은 주택 수요를 관리하는 것이다. 수요를 억제하는 것보다 수요를 분산하는 것이 더욱 중요하다. (p.191-192)
지역 핀셋 규제가 점점 더 어려워지고 있다. 지금 우리에게 필요한 것은 핀셋 규제가 아니라 보편적이고 이해하기 쉽고, 자주 바뀌지 않는 규칙이다. 그래야 정책도 먹힌다. 행정비용도 줄어든다. 이렇게 지역을 세분화해서 촘촘히 규제하는 나라는 전 세계 어디에도 없다. 핀셋이 아닌 ‘보편적 규제’로 나아가야 한다. 현재 지역별로 차등적으로 적용하고 있는 규제는 대출, 세금, 분양권 전매, 청약 등에 관한 내용으로 구분되고 있다. 세부 내용을 들여다보면, 전국적으로 적용되어도 무방한 것들이 많다. 특정 지역을 콕 집어서 “여기는 이것이 적용된다”라고 규정할 필요가 없다는 뜻이다. 규제 내용도 하도 많이 바뀌니 세무사들조차 헷갈려한다. 보편적 규제는 지역이 대상이 아닌, 보유한 주택의 가격을 기준으로 누진적으로 규제 내용을 적용하면 된다. 자연스럽게 집값이 높은 곳은 더 강한 규제가, 집값이 낮은 곳은 더 약한 규제가 적용될 수밖에 없다. 이런 보편적인 규제에 서민과 실거주자를 위한 공제혜택을 추가하는 것은 당연한 일이다. 이 또한 전국 공통으로 말이다. (p.223-224)
주택시장에서 다주택자들도 임대주택을 공급하는 역할을 한다. 전국적으로 보면, 집 가진 가구가 55퍼센트 정도 된다. 나머지 45퍼센트 정도는 전세와 월세의 임차가구다. 다주택자는 전월세시장에서 3분의 1 정도의 물량을 임대주택으로 공급하고 있다. 앞서 여러 번 강조했듯이 주택시장은 매매시장과 임대차시장으로 구분된다. 다주택자에 대한 규제를 강화하면, 주택 수요가 임대차시장에서 매매시장으로 옮겨가게 된다. 이렇게 매매시장으로 옮길 수 있는 사람들은 그래도 집을 살 여력이 있는 사람들이다. 하지만 임대차시장에는 이렇게 경제적 여력이 있는 사람들만 있는 것이 아니다. 아무리 발버둥 쳐도 집을 살 수 없는 사람들이 있다. 저소득층과 사회적 취약계층이 이 범주에 포함된다. 추가적인 주택 공급이 없는 상황에서 다주택자들이 매물을 쏟아내면 매매시장이 커진다. 매매시장이 커지면 임대차시장은 줄어들 수밖에 없다. 매매시장과 임대차시장은 그렇게 맞물려 있다. (p.233-234)
주택이라고 다 같은 주택이 아니다. 최저주거기준에도 미치지 못하는 가구는 2019년 106만 가구(5.3퍼센트)나 된다. 전국에서 반지하에 사는 가구만 36만 4,000가구(인구 기준으로 69만)가 넘는다. 아예 주택 통계에도 잡히지 않는 ‘비주택’에 거주하고 있는 이들도 많다. 고시원과 고시텔에 사는 가구는 약 15만 2,000가구 정도이고, 옥상 주택에 거주하는 가구는 5만 4,000가구 정도다. 이러한 저급 주택과 비주택을 모두 합하면 200만 호 정도는 될 것이다. 임대주택 재고가 전체 주택의 15퍼센트 정도는 되어야 한다. 그래야 다주택자 매물이 쏟아져 나오는 상황에서도 서민들이 피해를 보지 않는다. (p.239)
부동산 문제는 부동산 대책만으로 해결할 수 없다. 주택·토지 정책은 국토·도시 정책의 하위분야다. 국토·도시의 공간 정책과 연계하지 않는 부동산 정책은 단기적 효과만으로 끝날 가능성이 크다. 수요를 억제하는 방법도, 공급을 늘리는 방법도 수도권 쏠림 현상이 멈추지 않는 한 한계가 있다. 수도권은 주택 공급이 수요를 더욱 키우는 자가발전 메커니즘을 갖고 있다. 수도권의 집값 폭등은 저출산과 일자리 문제까지 심화하고 있다. 수요를 억제하기보다 수요를 분산해야 한다. 국토의 쏠림이 더욱 심해질수록 이를 교정하기 위해 더 많은 노력이 필요하게 될 것이다. 지금을 놓치면 국민 대다수가 부동산에 인생을 볼모로 잡혀야 하는 일상을 이어가야 할지도 모른다. 이것이 균형 발전 정책이 부동산 정책으로 깊숙이 들어와야 하는 이유다. (p.261)