- 단순한 방법이 논문 심사나 승진 평가에서 낮게 평가되는 배경에는 복잡성 편향이 있으며, 복잡한 산출물이 더 많은 노력·숙련·혁신을 담은 것처럼 보이기 때문임
- 선택지와 구성 요소가 많은 시스템은 유연해 보이지만, 실제 운영에서는 설명·테스트·문제 해결이 어려워지고 실수와 비효율이 늘어날 수 있음
- 단순한 아이디어와 시스템은 이해·사용·피드백·확장이 쉬우며, Instagram은 2012년 인수 당시 13명 팀으로 수천만 사용자를 서비스하면서 PostgreSQL과 Redis 같은 검증된 기술을 유지함
- 머신러닝에서도 복잡한 기법이 항상 우월하지는 않으며, 중간 규모 표 형식 데이터셋 45개에서는 트리 기반 모델이 심층 신경망보다 나았고 추천·검색에서는 내적(dot product)이 neural collaborative filtering보다 나은 사례가 있음
- 복잡성 자체를 보상하면 불필요한 복잡화와 not invented here 성향을 키우므로, 복잡한 문제일수록 단순한 해법이 가능한지와 복잡성의 비용이 정당한지 먼저 따져야 함
복잡성이 더 매력적으로 보이는 이유
- 복잡성은 노력의 신호로 받아들여지기 쉬움
- 어려운 아이디어와 기술적 세부사항이 많은 논문은 많은 시간과 노력이 들어간 것처럼 보임
- 구성 요소와 기능이 많은 시스템은 더 작은 시스템보다 더 공들여 만든 산출물로 평가되기 쉬움
- 만들기 어렵다는 인상이 곧 가치와 품질의 신호처럼 작동함
- 숙련의 신호로도 해석됨
- 움직이는 부분이 많은 시스템은 설계자가 각 부분을 이해하고 통합할 능력이 있다는 인상을 줌
- 전문 용어와 증명이 많은 논문은 접근하기 어렵지만, 그만큼 주제 전문성을 보여주는 것처럼 보임
- 실무에서 거의 쓰지 않는 알고리듬과 자료구조를 면접에서 묻는 관행도 이런 신호와 연결됨
- 혁신의 신호라는 인식도 있음
- 완전히 새로운 모델 아키텍처를 만든 논문은 기존 네트워크를 수정한 논문보다 더 새롭게 평가되기 쉬움
- 처음부터 만든 구성 요소가 많은 시스템은 기존 부품을 재사용한 시스템보다 더 독창적으로 보임
- “한 가지만 바꾸고 나머지는 기존 연구와 같다”는 평가는 단순한 아이디어의 가치를 낮출 수 있음
- 기능이 많을수록 더 포괄적이라는 착시가 생김
- SQL과 NoSQL 데이터 저장소를 모두 지원하거나, 배치와 스트리밍 파이프라인을 모두 가능하게 하는 시스템은 모든 경우를 다루는 것처럼 보임
- 레고 블록이 많을수록 변화에 더 잘 대응할 수 있다고 여겨짐
- 이런 판단이 단순한 아이디어와 시스템보다 복잡한 것을 과도하게 선호하는 complexity bias로 이어짐
단순함이 실제 장점이 되는 지점
- 단순한 아이디어와 기능은 이해하고 사용하기 쉬움
- 채택 가능성과 실제 영향이 커짐
- 전달하고 피드백받기도 쉬움
- 복잡한 시스템은 설명과 관리가 어려워 사용자가 무엇을 어떻게 해야 하는지 파악하기 힘듦
- 조정할 항목이 너무 많으면 실수가 늘고, 단계가 너무 많으면 비효율이 생김
- 단순한 시스템은 만들고 확장하기 쉬움
- 구성 요소가 적으면 구현이 쉬워짐
- 표준화된 기성 기술을 쓰면 구현·유지보수할 사람을 찾기 쉬움
- 코드와 내부 상호작용이 줄어들어 이해와 테스트 부담도 낮아짐
- 불필요하게 복잡한 시스템은 구축에 더 많은 시간과 자원을 쓰게 만들어 낭비를 낳음
- Instagram 사례는 단순한 기술 선택의 장점을 보여줌
- 2012년 인수 당시 Instagram은 13명 팀으로 수천만 사용자를 서비스함
- 새로운 유행 기술 대신 검증된 기술을 유지해 엔지니어당 운영 부담을 낮춤
- 다른 스타트업들이 유행하던 NoSQL 데이터 저장소를 도입하고 어려움을 겪을 때, Instagram은 이해하기 쉬운 PostgreSQL과 Redis를 사용함
운영 비용과 유지보수성
- 시스템 배포는 끝이 아니라 시작점임
- 대부분의 노력은 프로덕션 투입 이후에 발생함
- 운영은 원래 만든 팀이 아닌 다른 사람이 맡을 가능성이 큼
- 단순한 시스템은 유지보수 비용을 낮추고 수명을 늘릴 수 있음
- 움직이는 부품이 적을수록 더 신뢰할 수 있고 고치기 쉬움
- 고장 날 수 있는 부분이 줄어듦
- 내부 상호작용이 적어 개별 구성 요소를 업그레이드하거나 교체하기 쉬움
- 복잡한 시스템은 제한된 팀이 이해해야 할 구성 요소가 많아 유지보수 비용이 커짐
- 상호의존적인 부분이 많으면 문제 해결도 더 어려워짐
- Thomas Paine은 『Common Sense』에서 “어떤 것이든 단순할수록 흐트러질 가능성이 적고, 흐트러졌을 때 더 쉽게 고칠 수 있다”고 말함
머신러닝에서도 단순한 기법이 밀리지 않는 사례
- 더 정교한 기법이 항상 더 좋은 성능을 내지는 않음
- Tree-based models > deep neural networks: 중간 규모 표 형식 데이터셋 45개에서 트리 기반 모델이 심층 신경망보다 나음
- Greedy algorithms > graph neural networks: 조합 그래프 문제에서 greedy 알고리듬이 graph neural network보다 나음
- Simple averaging ≥ complex optimizers: 다중 작업 학습 문제에서 단순 평균이 복잡한 최적화기 이상임
- Simple methods > complex methods: 32개 논문 전반의 예측 정확도에서 단순한 방법이 복잡한 방법보다 나음
- Dot product > neural collaborative filtering: 아이템 추천과 검색에서 내적이 neural collaborative filtering보다 나음
복잡성을 보상할 때 생기는 문제
- 복잡성을 보상하면 사람들이 불필요하게 복잡한 것을 만들 유인이 생김
- 단순한 방법이나 시스템은 쉬워 보인다는 이유로 덜 가치 있게 평가될 수 있음
- 보상을 얻기 위해 시스템을 복잡하게 만들면 가장 단순한 해법이 더 이상 명확한 선택지가 아니게 됨
- 복잡성은 더 많은 복잡성을 낳고, 결국 작업이 불가능한 수준으로 이어질 수 있음
- not invented here 성향도 강화됨
- 기존 구성 요소를 재사용하면 시간과 노력을 아낄 수 있는데도 처음부터 만들려는 경향이 생김
- 시간과 자원을 낭비하고 더 나쁜 결과로 이어질 수 있음
- 승진 절차와 머신러닝 논문 심사에서도 복잡성이 과도하게 강조될 수 있음
- Bryan Liles는 단순한 해법이 복잡한 해법보다 구현과 확장이 쉽지만, 승진은 복잡한 해법을 만든 사람에게 주어지는 경우가 많다고 지적함
- Micah Goldblum은 ML 리뷰에서 방법이 너무 단순하거나 기존 부품으로 구성됐다는 지적이 흔하지만, 단순함은 약점이 아니라 강점이라고 말함
- Kalman Filters, PageRank, SVM, LSTM, Word2Vec, Dropout 같은 혁신도 거절된 적이 있음
복잡성을 다루는 더 나은 방식
- 목표는 복잡한 문제를 가능한 한 단순한 해법으로 푸는 것임
- 해법의 복잡성이 아니라 문제의 복잡성에 집중해야 함
- 단순한 해법은 문제에 대한 깊은 통찰과 더 꼬이고 비용이 큰 해법을 피하는 능력을 보여줌
- Albert Einstein의 “모든 것은 가능한 한 단순해야 하지만, 그보다 더 단순해서는 안 된다”는 말과 연결됨
- 모든 것을 포괄하는 복잡한 해법보다 여러 개의 초점 있는 해법을 고려할 수 있음
- 만능(one-size-fits-all) 해법은 기대보다 덜 유연하고 덜 재사용 가능할 수 있음
- 여러 사용 사례와 이해관계자를 동시에 지원하면 강하게 결합되고, 계획과 마이그레이션에 더 많은 조율이 필요함
- 단일 목적 시스템은 운영하기 쉽고, 필요할 때 폐기하기도 쉬움
- 복잡성 편향을 줄이는 방법으로 Occam’s razor를 적용할 수 있음
- 가장 단순한 해법이나 설명이 보통 맞다는 원칙임
- 단순한 아이디어를 너무 빨리 배척하거나, 가치를 정당화하려고 불필요한 복잡성을 추가하지 않아야 함
- 복잡성의 비용을 고려해 “그만한 가치가 있는가”를 물어야 함
익숙한 복잡성을 재사용하는 반대편 편향
- “not invented here”의 반대편에는 기존 구성 요소를 자동으로 선호하는 편향도 있음
- 이미 알고 있어 개인 경험상 더 쉽고, 자신의 시간과 노력을 줄일 수 있기 때문임
- 하지만 기존 구성 요소 자체가 매우 복잡하다면, 더 단순한 것을 새로 만드는 것보다 시간과 자원을 낭비하고 더 나쁜 결과를 낳을 수 있음
- 단순한 선택지가 없을 때는 새로 만드는 것이 필요할 수 있음
- 새로 만든 것이 실제로 단순해지지 않고 기존 것만큼 복잡한 다른 물건이 되는 경우도 있음
- 어떤 문제는 본질적으로 복잡하고, 실제로 제거할 수 없는 essential complexity를 가짐
- ORM은 나쁜 사례로 다뤄짐
- ORM은 계속 새로 만들어지고 처음에는 단순하게 시작하지만 결국 복잡성이 폭발함
- object/relational impedance mismatch는 잘 알려져 있으며, ORM이라는 아이디어 자체가 본질적으로 복잡함
- 단순함을 유지한 것처럼 보이는 것은 ORM이 아니라 query builder나 data mapper일 가능성이 높음
- PSR 캐시 API는 제거 가능한 복잡성의 사례임
- PSR-6 캐시 API 뒤에 더 단순한 PSR-16 캐시 API가 나옴
- PSR-16은 복잡성과 개념 수를 줄여 API를 더 작고 덜 의견적인 형태로 만듦
- PSR-16 구현용 PSR-6 어댑터와 반대 방향 어댑터를 만들 수 있다는 점은 PSR-16에서 제거된 복잡성이 본질적이지 않았음을 보여줌
- 일부 라이브러리와 프레임워크는 개발자 경험이라는 이름으로 본질적 복잡성을 넘어 커질 수 있음
- 실제 단순함은 코드 줄 수, public method 수, 결합도 같은 지표로 측정 가능한 성격을 가짐
- 라이브러리가 몇 년 사이 원래 크기의 10배로 커지고 6~12개월마다 큰 breaking change를 내는 경우가 있음
- 성장이 없는 라이브러리를 “죽었다”고 여기고 더 “활발한” 패키지로 옮기려는 동기도 복잡성 편향의 증상일 수 있음
- 퍼져 나가는 복잡성을 피하려면 새로 만드는 선택이 필요할 때도 있음
- 요구사항을 고정하고 범위가 퍼지는 성장을 피할 수 있다면 새 구현이 더 단순한 선택이 될 수 있음
- 어느 한쪽 편향도 강화하지 않도록 주의해야 함