- 현대 소프트웨어는 하드웨어 발전을 효율·간결함·완성도로 되돌려주기보다, “컴퓨터가 충분히 빠르다”는 전제에 기대며 비효율을 정상화해 왔음
- 웹 스크롤, Google Inbox의 이메일 열기 13초, Windows 10 업데이트 30분, 텍스트 에디터 입력 지연처럼 기본 작업도 기대보다 느리게 느껴짐
- Android 시스템 6GB, Windows 10 4GB, Google Keyboard 150MB, Electron 앱과 Slack 사례는 앱과 플랫폼의 비대화가 성능·복잡성·신뢰성 비용으로 이어짐을 보여줌
- OS·앱·브라우저 업데이트와 iOS 11의 32비트 앱 지원 중단처럼, 한때 잘 동작하던 소프트웨어도 시간이 지나며 느려지거나 망가질 수 있음
- 더 나은 소프트웨어를 만들려면 엔지니어가 자신이 만든 시스템의 성능·구조·한계를 이해하고, 더 적은 리소스로 빠르고 예측 가능한 결과를 내야 함
성능을 낭비하는 소프트웨어
- 현대 소프트웨어는 가능한 성능의 1% 또는 0.01% 로 실행돼도 괜찮다고 받아들여지는 경우가 많음
- 자동차, 건축, 비행기는 물리적 한계나 최적 형태에 가까워지는 반면, 소프트웨어는 비효율을 “컴퓨터가 충분히 빠르다”는 말로 정당화함
- “프로그래머의 시간은 컴퓨터의 시간보다 비싸다”는 격언은 컴퓨터 시간이 전례 없이 낭비되는 현실을 가릴 수 있음
- 매일 실행하는 Python 프로그램을 Rust로 재작성해 1.5초에서 0.06초로 줄였지만, 6시간을 보상받는 데 41년 넘게 걸린다는 트윗은 효율 논의의 대표 사례로 쓰임
참을 수 없을 정도로 느린 기본 경험
- 최신 휴대용 컴퓨터는 달 착륙 시대의 컴퓨터보다 수천 배 강력하지만, 최신 MacBook Pro에서도 웹 페이지를 60fps로 부드럽게 스크롤하기 어려움
- Google이 만든 Inbox는 Google Chrome에서 이메일 하나를 여는 데 13초가 걸림
- 콘텐츠 대신 빈 흰 상자를 애니메이션하는 방식은 웹 페이지가 낼 수 있는 성능 한계에 맞춘 타협에 가까움
- 120Hz 디스플레이가 주류가 된 시점에도 웹 커뮤니티 응답 하나를 보는 데 60Hz조차 안정적이지 않다고 봄
- Windows 10 업데이트는 30분이 걸리며, 그 시간이면 SSD를 포맷하고 새 빌드를 받아 설치하는 일을 여러 번 할 수 있다고 비교함
- 현대 텍스트 에디터는 42년 된 Emacs보다 입력 지연이 큼
- 키 입력마다 작은 사각 영역만 갱신하면 되는 작업도 16ms 안에 처리하지 못한다고 지적함
- 3D 게임은 같은 16ms 안에 화면 전체 렌더링, 입력 처리, 월드 계산, 리소스 관리를 수행함
- 더 빠른 하드웨어는 더 나아진 소프트웨어보다, 같은 일을 더 느리게 하는 소프트웨어를 돌리는 데 쓰이는 상황이 됨
비대해진 앱과 플랫폼
- 웹 앱은 광고만 막아도 10배 빨라질 수 있으며, AMP는 새로운 기술이라기보다 비대한 부분을 제거하라는 상식적 해결책에 가까움
- Android 시스템은 아무 앱이 없어도 6GB이고, Windows 95는 30MB였으며 Windows 10은 4GB임
- Windows 10은 Windows 95보다 133배 크지만 기본 기능은 크게 다르지 않다고 봄
- Android는 Windows 10보다도 1.5배 큼
- Google Keyboard는 보통 150MB, Google 앱은 350MB, Google Play Services는 300MB를 차지함
- Google Keyboard가 화면에 키 서른 개를 그리는 앱인데 Windows 95 전체보다 5배 복잡한지 묻는 방식으로 비판함
- Google Play Services는 쓰지 않아도 지울 수 없음
- 기본 앱을 설치한 뒤 사진 저장 공간이 약 1GB만 남는 상황은, 플로피 디스크에 OS·앱·데이터를 모두 저장하던 시절과 대비됨
- Electron 기반 Todo 앱에는 Xbox 360 컨트롤러 드라이버, 3D 그래픽 렌더링, 음악 재생, 웹캠 촬영 기능까지 포함될 수 있음
- Slack은 채팅과 간단한 텍스트 에디터에 가까운 앱인데도, 로딩 속도와 메모리 사용량 때문에 무거운 앱으로 분류됨
- 앱이 커질수록 제어 상실, 복잡성 비용, 성능 손실, 신뢰성 채무가 커지며 과도하게 무거운 앱을 정상으로 받아들여서는 안 됨
시간이 지나며 썩는 소프트웨어
- 3년 전에는 16GB Android 폰으로도 충분했지만, Android 8.1 시대에는 앱들이 특별한 이유 없이 두 배씩 커져 쓰기 어려워짐
- iPhone 4s는 iOS 5와 함께 발표됐지만 iOS 9 실행은 버겁고, iOS 9이 근본적으로 훨씬 뛰어난 것도 아니라고 지적함
- iOS 11은 32비트 앱 지원을 중단해 개발자가 없거나 업데이트하지 않는 앱은 다시 볼 수 없게 될 수 있음
- DOS 프로그램은 1980년대 이후 여러 컴퓨터에서 수정 없이 돌아가지만, JavaScript 앱은 다음 Chrome 업데이트에도 망가질 수 있다는 트윗을 인용함
- 오늘 멀쩡했던 웹 페이지도 10년 안에 어떤 브라우저에서도 제대로 돌아가지 않을 수 있음
- 같은 일을 하기 위해 새 전화기와 새 MacBook을 사지만, 결국 같은 앱을 더 느리게 실행하는 상황이 반복됨
낮아진 품질 기대치
- 웹 페이지는 문제가 생기면 원인을 살피기보다 새로고침을 누르라고 요구함
- 웹 앱은 호환되는 브라우저에서도 “무작위” JavaScript 오류를 쏟아낼 수 있음
- 웹 페이지와 SQL 데이터베이스 설계는 렌더링된 웹 페이지를 보는 동안 데이터가 바뀌지 않을 것이라는 희망 위에 세워져 있다고 비판함
- 공동 작업 기능은 “최선의 노력” 수준에 머무는 경우가 많아 데이터를 잃을 수 있는 일상적 시나리오를 품고 있음
- “어떤 버전을 유지할까요?” 같은 다이얼로그는 작업물 중 하나를 파괴할 대상을 고르라는 뜻에 가까움
- Linux는 임의로 프로세스를 죽이는 설계를 갖고 있어도 서버에서 가장 인기 있는 운영체제임
- Dell 모니터, AirDrop, Bluetooth 사례는 장치 안의 소프트웨어와 복잡한 사양이 주기적 리셋이나 운에 의존하는 경험을 만든다는 점을 보여줌
- 안정적으로 작동하는 무언가를 전달하려면 만든 대상을 안팎으로 이해해야 하지만, 과하게 부풀려진 시스템에서는 그것이 어려움
프로그래밍 도구와 개발 관행의 혼란
- 패키지 관리, 빌드 시스템, 컴파일러, 언어 설계, IDE 같은 기본 요소에서도 빠르고 효율적이며 오래가는 완성도를 보기 어려움
- 빌드 시스템은 모든 변경 정보를 갖고도 주기적으로 전부 지우고 다시 하기를 요구함
- 신뢰성 있고 예측 가능하며 재현 가능하게 만들 수 없을 이유가 없다고 봄
- NPM은 수년간 “가끔 동작함” 상태에 머물렀다고 표현됨
rm -rf node_modules가 Node.js/JavaScript 개발에서 피할 수 없는 것처럼 보인다는 트윗을 인용함
- 컴파일러와 사전·사후 작업이 몇 분 또는 몇 시간씩 걸려도 받아들여지는 현실은 “프로그래머의 시간은 중요하다”는 말과 충돌함
- Hadoop을 PC 한 대에서 실행하는 것보다 느린 상황에서도 선택하는 사례는, 프로그래머가 항상 합리적 결정을 내리지는 않음을 보여줌
- 머신 러닝과 “인공지능”은 소프트웨어를 신뢰할 수 없는 추측의 시대로 옮겼다고 비판함
- “인공지능”이나 “머신러닝”이 쓰인 앱·서비스는 신뢰성 없고 예측 불가능하며 결과 설명이 어렵다고 읽는다는 트윗을 인용함
- Linux 위에 VM을 올리고, VM 안에 Docker를 넣는 방식은 프로그램·언어·실행 환경을 깔끔히 치우는 방법을 모른다는 신호로 해석됨
- Go의 단일 실행파일이 주요 장점으로 꼽히는 현실은, 엉망이지 않기만 해도 성공으로 간주되는 상황을 드러냄
- 의존성은 간단한 문제를 “전체 패키지 솔루션”으로 해결하려다 도입 비용과 또 다른 의존성을 함께 끌고 옴
- 프로그램을 재부팅 없이 몇 년 동안 쓰기 어렵고, 때로는 며칠도 어렵다고 지적함
- 프로세스 재시작, 데이터베이스 재기동, 20분마다 앱을 재시작하는 워치독, 중복 리소스 포함과 압축 전송은 고치는 대신 빨리 넘어가는 방식임
- 이런 관행은 엔지니어링이 아니라 게으른 프로그래밍이며, 엔지니어링은 만든 것의 성능·구조·한계를 깊이 이해하는 일임
쌓여버린 복잡성과 시장의 무관심
- 현재 소프트웨어는 근근이 동작하는 코드 위에 다시 근근이 동작하는 코드가 쌓인 상태이며, 계속 커지고 복잡해져 바꿀 기회가 줄어듦
- 건강한 생태계에는 때때로 후퇴한 뒤 전진하는 과정이 필요하지만, 25년간 새로운 OS 커널을 보지 못했고 이제는 재작성하기에 너무 복잡해졌다고 지적함
- 브라우저도 엣지 케이스와 역사적 문제 때문에 레이아웃 엔진을 바닥부터 새로 작성하기 어려움
- 오늘날의 진전은 모놀리스 문제를 해결하려고 마이크로서비스를, 마이크로서비스 문제를 해결하려고 Docker를, Docker 문제를 해결하려고 Kubernetes를 도입하는 식으로 불 위에 연료를 더 붓는 것처럼 보임
- XML 기반 선언 설정에서 YAML 기반 마이크로서비스 설정으로 옮겨왔지만, 과거 XML에는 적어도 스키마가 있었다는 트윗을 인용함
- 사용자는 엔지니어가 제공하는 것을 받아들일 수밖에 없고, Android 앱 350MB, 끊기는 스크롤, “작동하지 않으면 재부팅” 같은 상황에도 선택지가 거의 없음
- 경쟁 제품들도 모두 느리고 크고 품질이 낮으면 경쟁 압력이 생기기 어려움
- iPhone/iOS와 다른 스마트폰, Chrome과 다른 브라우저처럼 한때 긴장을 만드는 제품이 나오기도 하지만 오래가지는 않는다고 봄
- 엔지니어의 임무는 현대 컴퓨터로 성능, 신뢰성, 품질, 가용성 측면에서 무엇이 가능한지 보여주는 일이어야 함
그래도 보이는 대안
- Martin Thompson의 LMAX Disruptor, SBE, Aeron은 인상적이고 단순하며 효율적인 예로 꼽힘
- Raph Levien의 Xi editor는 올바른 원칙을 염두에 두고 만든 것으로 평가됨
- Jonathan Blow는 자신의 게임을 위해 언어를 만들었고, 그의 노트북에서 50만 줄 코드를 1초 만에 완전 새 컴파일할 수 있음
- 증분 빌드도 중간 캐시도 아닌 전체 새 컴파일 결과임
- 빠른 프로그램을 작성하는 데 천재나 마술이 필요한 것은 아니며, 유행하는 툴체인 같은 거대한 쓰레기 더미 위에 만들지 않으면 된다고 봄
더 나은 소프트웨어를 위한 요구
- 소프트웨어 엔지니어링은 현 상태에 머무르지 않고 더 나아져야 하며, 같은 것을 반복해 더 느리고 큰 형태로 만들 필요가 없음
- 오늘날의 개발은 진전이라기보다 너덜거리는 도구 위에서 비즈니스 목표만 간신히 충족하는 상태에 가까움
- 지역 최적화에 얽매인 결과, 비대하고 비효율적인 상태에 익숙해졌다고 지적함
- 엔지니어는 더 나은 도구로 더 나은 앱을 몇 배는 적은 리소스로 빠르고 예측 가능하며 신뢰성 있게 만들 수 있고, 그렇게 해야 함
- 신뢰성 있고 예측 가능한 고품질 제품을 전달하려면 무엇을 왜 하는지 완전히 이해해야 하며, “주어진 게 이렇다”는 변명은 받아들일 수 없음