brunch

You can make anything
by writing

C.S.Lewis

by 김의선 Jun 01. 2022

단순성과 복잡성

복잡성은 감옥이고 단순성은 자유다

소프트웨어에서 단순함의 중요성


소프트웨어의 보안을 보장하는 가장 중요한 요소는 단순성이다.
프로그램으로 진입하는 입구와 공격 방식이 제한될수록 그만큼 방어해야 할 경우의 수도 줄어들기 때문이다.


이런 시각으로 볼 때 왜 UNIX 기반의 시스템이 윈도 기반의 시스템보다 더 안전한지 쉽게 알 수 있다. 표준 UNIX프로그램 대부분은 시스템 호출을 매우 적게 사용하여 작성한다. 각 시스템 호출은 명확하고 구체적인 한 가지 역할만 한다. 반면 윈도우의 시스템 호출은 상당히 복잡하다. 윈도에는 특정 부분과는 상관없이 입구가 너무 많아서 절대로 안전하게 유지할 수 없다. 윈도우가 설치된 장비를 안전하게 사용하려면 외부와 연결할 때마다 승인을 받는 방화벽, 스파이웨어 스캐너, 처리속도가 2000퍼센트 느려지는 바이러스 방어 프로그램을 설치해야 한다. 윈도우가 안전하다면 그런 건 설치할 필요가 없을 것이다.


  구글의 수석 아키텍트였던 M. 알렉산더는 '심플 소프트웨어'에서 시스템을 단순하게 설계하는 것만이 보안을 보장하는 유일한 방법이라고 말한다. 


단순함을 유지해야 하는 이유는 단지 보안 때문만은 아니다. 

복잡하고 지저분한 소스코드는 변경에 대한 영향도 파악에 오랜 시간이 소요되도록 만들고, 장애에 대한 위험도 그만큼 커지게 된다. 복잡한 프로그램을 제작함으로써 고용에 대한 안정성을 얻을 수는 있겠다. 본인 이외에는 아무도 그 프로그램을 이해할 수 없을 테니까. 하지만 역으로 생각하면, 개발자는 영원히 그 프로젝트에 메인 몸이 된다. 사내 다른 부로 자리를 옮기고 싶어도 관리자는 걱정이 돼서 반대할 것이고, 설령 자리를 옮기더라도 인수받은 개발자의 숱한 문의 메일과 전화에 시달려야 할 것이다.


복잡성이라는 감옥에 해방되기 위해서, 그리고 오류 없고 해석이 명확한 소스코드를 작성하기 위해 단순함이라는 요소는 필수다.






단순함을 유지하기 어려운 이유


물리학에는 열역학 제2법칙 : 엔트로피의 법칙이라는 것이 있다.

깨진 달걀을 원래 상태를 되돌려놓을 수 없듯이 엔트로피는 항상 증가하고, 무질서한 방향으로 흐른다는 법칙이다. 소프트웨어에서도 마찬가지다. 마치 우리가 휴대폰을 사용할 때 사용기간이 길어질수록 데이터가 쌓이고 프로그램이 복잡해지면서 동일한 기기를 사용하더라도 점차 느려짐을 느끼게 되는 것처럼 소프트웨어에서도 각기 서로 다른 이질적인 기능들을 덕지덕지 붙여 넣다 보면 점점 복잡한 프로그램으로 변하게 된다.


예전에 유튜브에서 카카오톡이 해외진출이 어려운 이유에 대한 영상을 본 적이 있다. 스마트폰 교체주기가 빠른 한국에서는 모든 유저들이 큰 문제없이 사용이 가능하지만 저사양 기종을 보유한 유저가 많은 해외에서는 느려서 사용이 어렵다는 것이다. 물론 해외 어느 SNS 애플리케이션보다 카카오톡이 기능이 많은 것은 사실이지만 그만큼 성능을 느리게 하는 비효율적인 요소도 분명 존재할 것이다.


이는 카카오톡만의 문제가 아닌 누구보다도 빠른 변화를 원하는 한국의 문화 때문이기도 할 것이다. 작년 코로나 유행이 한참일 때 정부에서 QR체크인에 대한 검토가 있었고 전 국민이 사용하는 카카오톡에도 기능을 추가해달라는 요청이 있었다. 결국 기능이 탑재되기는 했지만 초기에 기능 탑재가 어렵다며 거절했었던 것으로 기억한다. 아마도 카카오톡 내부적으로 갑작스러운 기능 추가에 대해서 복잡성으로 인한 전체적인 아키텍처에 대한 문제를 우려했던 것은 아닐까?


카카오톡 QR체크인. 현재는 서비스하지 않는다.


단순함을 유지하기 위한 해법



 카카오톡 사례처럼 시스템의 복잡성으로 인한 악순환의 고리는 동서고금을 막론하고 소프트웨어 업계에서 흔히 일어나는 일이다. IT부서에 종사하고 있거나 종사했던 사람이라면 소프트웨어의 심플함을 유지하는 것이 얼마나 어려운지 느낄 것이다. 실제로 필자도 왜 프로그램의 심플함을 유지해야 하는지에 대해 IT와 관련 없는 순수 유저층에게 이해하게끔 설명하기가 매우 어렵다는 것을 느낀다.


 이에 대한 해답을 얼마 전 시청한 마틴 파울러의 oscon 발표 연설 영상에서 얻을 수 있었는데, 영상에서 마틴 파울러는 훌륭한 아키텍처가 존재해야 하는 유일한 이유는 '경제성'으로 설명될 수 있다고 말한다. 훌륭한 아키텍처는 추후 운영상의 유지보수 이슈가 없게 하고 여러 가지 기능 추가에 대한 영향이 적어 오류가 덜 나게 만든다. 이는 장기적으로 볼 때 '시간'이라는 비용을 절약하게 만들고 소프트웨어에서 시간 절약은 엄청난 비용에 대한 절감 효과를 나타낼 수 있다. 따라서 장기적으로 볼 때 경제적인 이득을 가져온다는 것이다.


물론 단순한 설계만이 꼭 훌륭한 아키텍처인가? 에 대한 의문이 있을 수 있다. 두 가지 요소가 완벽히 일치하는 것은 아니겠지만 대체로 유사점이 많다는 생각이다. 심플한 설계일수록 개발자가 이해하기 쉽고 명쾌한 코드일 가능성이 높고, 유지 보수하기 쉬우며, 기능 추가도 더 쉬울 테니 말이다.


훌륭한 내부 설계는 장기적으로 이익을 가져다주지만 일반 유저들의 눈에 보이지 않기에 간과되기 쉽다. / 출처 : oscon 2015, martin pauler


따라서 나는 사용자들과 소통할 때 그들이 이해하기 쉽도록 경제성을 논리로 제시하곤 한다. 


프로그램을 최대한 건드리지 말자는 소리는 아니다. 소프트웨어에 새로운 기능을 추가하고 업그레이드하는 것은 사용자들을 위해 반드시 필요한 요소다. 이는 두말하면 잔소리다. 중요한 것은 사용자의 요구를 충족할 수 있으면서도 추후 유지보수가 쉽도록 훌륭한 설계가 필요하다는 점이다. 우리의 백로그에는 항상 개선할 점들이 넘쳐나고 있으며 현재 훌륭한 아키텍처를 망치는 프로그램에 대한 변경은 지양되어야 하니 말이다.


그리고 마치 나이 든 사람이 정기적인 검사와 운동을 통해 건강을 유지하듯, 시스템도 정기적인 소스코드 리팩터링과 아키텍처 정비를 통해 수명을 연장할 수 있을 것이다. 또한 시스템의 기능을 추가하거나 변경을 시도할 때 사전에 아키텍트에 대한 영향도를 파악하거나 이에 대한 이해도가 있는 전문가의 의견을 충분히 들을 필요가 있다. 


이러한 노력들이 지속될 때 많은 유저들의 사랑을 받는 훌륭한 소프트웨어로 남을 수 있지 않을까 생각해본다.


나이가 들어도 운동을 통해 건강을 유지할 수 있는 것처럼 시스템도 효율적인 아키텍트를 통해 수명을 연장할 수 있다.


매거진의 이전글 훌륭한 소프트웨어의 조건
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari