학습 차원에서 틈틈이 해외 전문가들이 블로그나 미디어 그리고 책에서 쓴 글을 번역 또는 요약 정리하고 있습니다. 이번 포스팅도 그중 하나고요. 거칠고 오역된 부분이 있을 수 있습니다. 제대로 번역되지 않은 부분은 확인 주시면 반영토록 하겠습니다. 의미 전달이 애매한 일부 문장은 삭제했습니다. 이번 글은 소프트웨어 엔지니어인 Attila Vágó 미디엄에 올린 걸 정리한 것입니다.
부모님이 내게컴퓨터를 사준 바로 그 순간 두 번째 컴퓨터를 갖고 싶었다. 10대였기 때문에 당장 살 여유가 없었지만 몇 년 후 최신 컴퓨터로 업그레이드하면서 구형 컴퓨터를 계속 사용했다. 나는 두 대 컴퓨터를 갖게 되었고 모든 것이 잘 풀렸다. 이 습관은 내가 평생 동안 유지해 온 습관이다. 그 이후로 나는 항상 2대 컴퓨터를 가졌고 때로는 3대까지 있었다. 나는 두 개 인터넷 연결을 수행할 수 있다. 광케이블과 5G 연결이다. 이것이 바로 이중화다. 물론 두 번째 컴퓨터는 항상 약간 느리고 백업 네트워크 연결도 마찬가지다. 이것이 바로 우아한 성능 저하(graceful degradation)다.
크라우드스트라이크 업데이트는 전 세계적으로 부족한 이러한 비즈니스 및 소프트웨어 엔지니어링에서 모두 페일 세이프(fail safe: 공학에서 설계 기능에 오류가 발생하는 경우 본질적으로 다른 장비, 환경 또는 사람에게 해를 끼치지 않거나 최소화하는 방식으로 대응하는 설계 기능 또는 방식)가 부족하다는 것을 노출시켰고 결함이 있는 앱(드라이버) 업데이트를 매우 다른 시각으로 바라보게 했다.
Microsoft Windows
나는 Windows 3.1부터 모든 버전 Windows를 사용해 볼 수 있는 불행한 기회를 가졌다. 불행하다고 말하는 이유는 Windows 3.1부터 Windows 10까지 운영 체제에 대해 긍정적인 경험을 한 적이 없기 때문이다.
Windows XP나 Windows 7과 같이 좋은 순간도 있었지만, 궁극적으로 나는 Linux로, 그리고 macOS로 완전히 전환하기 전까지는 윈도는 항상 필요악이라고 생각했다. 모든 버전 Microsoft Windows를 괴롭혔던 한 가지 문제가 있다면 불안정성이었다. 대략 두 달에 한 번씩 Windows 98SE를 다시 설치하거나 Windows XP에서 시스템 복원을 실행해야 했던 기억이 있지만, 적어도 XP에서는 선택권이 있었다.
웹의 등장으로 보안은 중요한 고려 사항이 되었고, 데스크톱 배경화면을 바꾸는 것보다 더 빨리 바이러스 백신 소프트웨어를 설치해야 하는 상황이 되었다. 멀웨어 방지 소프트웨어 없이 Windows를 웹에 연결하면 몇 분 안에 컴퓨터를 쓸모없게 만들 수 있었기 때문에 안정성은 갑자기 부차적인 문제가 되었다. 실제로 Windows 7이 한창 유행하던 시절에 나는 한가지 실험을 해보았다. 방금 딥 포맷한 하드 드라이브에 정품 Windows 7(정품 디스크, 매장에서 봉인된 상태로 구입)을 설치하고 이더넷 케이블을 연결한 후 내장된 홈페이지 외에 다른 사이트로 이동하지 않고 내 컴퓨터, Internet Explorer를 열고 약 한 시간 동안 그대로 두었다. 한 시간 후, 공식 사이트에서 Avira를 다운로드하고 스캔을 실행했고 멀웨어가 탐지됐다. 심각한 수준은 아니었지만 그럼에도 불구하고 감염됐다.
Microsoft Windows는 결코 안전한 운영 체제가 아니었다. 놀이로 만든 구조물 같다. Microsoft Windows처럼 널리 사용되는 운영 체제는 본질적으로 보안성이 떨어질 것이라는 생각은 Microsoft와 이들의 옹호론자들이 즐겨 주장하는 신화다. 보안 전문가라면 누구나 알 수 있듯 일부 사실도 있지만, 근본적인 진실은 변하지 않는다. Windows는 네트워크에 연결되지 않은 데스크톱 환경을 위해 만들어졌고, 그 기반은 특정 보안 하드웨어(TPM)가 필요한 Windows 11에서도 변하지 않았다.
Microsoft가 Windows 보안을 강화하기 위해 하는 모든 작업은 환영할 만한 일이지만 결국에는 사후 대응적인 패치다. 소프트웨어 엔지니어 관점에서 볼 때 Microsoft Windows는 완전히 다시 작성해야 할 기술 부채 더미처럼 보인다.
이렇게 허술하게 설계된 Windows를 고려할 때 보안에 대한 CrowdStrike 접근 방식은 놀랍지 않다. 비즈니스 및 기업 보안 분야에서 선도적인 역할을 목표로 하는 기술 회사로서, 컴퓨터가 부팅되면 앱을 로드하는 기존 안티바이러스 소프트웨어 접근 방식에서 한 걸음 더 나아가 컴퓨터가 부팅되기도 전에 드라이버를 설치해 실행하기로 한 건 당연한 선택이다. 과한 것 같지만 그렇지 않다. 우리가 말하는 것은 Windows다. Windows는 안전한 환경이 되기 위해 이 정도 지원이 절실히 필요하다. MacOS, iOS, Linux는 모두 운영 체제 기반에 보안 기능이 내장되어 있다. 하지만 BSD 유닉스(BSD Unix)는 매우 다른 설계 철학이 적용되어 개발됐다.
Microsoft Windows가 타사 보안 솔루션을 근본적으로 필요로 하는 상황은 전 세계적인 IT 붕괴의 핵심 원인 중 하나다. 여기에 손상된 파일로 인해 전체 운영 체제가 마비되는 것과 같은 추가적인 구조적 약점이 더해지면 전 세계가 마비될 수 있다.
부실한 설계, 이중화 부족
지금 M3 Max MacBook Pro에서 이 글을 입력하는 동안, 바로 사용할 수 있도록 완전히 충전된 M2 MacBook Air가 준비돼 있다. 둘 다 동일한 버전 macOS를 실행하고 있지 않다. 한 쪽에서는 자동 업데이트를 활성화했지만 다른 쪽에서는 활성화하지 않았는데, 믿기 어렵겠지만 Apple도 많은 혼란을 일으킬 수 있기 때문이다. 두 기기에서 서로 다른 버전 macOS를 실행하면 작업의 연속성뿐만 아니라 다른 기기에 대한 잠재적인 복구 솔루션도 확보할 수 있다.
10대 시절 내가 가졌던 이중화 철학은 친구들에게 극단적이고 불필요한 것으로 여겨졌지만, 몇 년 후 Cisco 자격증을 취득하면서 이중화가 모든 안정적인 네트워크의 핵심이라는 사실을 알게 되었다. 사실 신뢰성과 이중화는 모두 TCP와 UDP 프로토콜에 내장돼 있으며 이는 적합한 작업에 적합한 도구를 사용하는 또 다른 훌륭한 소프트웨어 개발 사례다. 이 경우 TCP는 데이터 무결성이 가장 중요한 목표일 때 성능 저하 없이 데이터 무결성을 처리하고, UDP는 패킷이 손실되어도 Zoom 대화와 같은 것이 중단되지 않도록 보장한다.
TCP/IP는 근본적으로 신뢰할 수 없지만, 핵심 단점이 스스로를 무력화시키는 결함이 되지 않도록 하는 메커니즘도 통합돼 있다. 소프트웨어 엔지니어링에서는 시스템의 잠재적인 단점을 파악하고 이해하면 안전장치를 개발하도록 훈련받는다. 오류 또는 알 수 없는 경우를 처리하는 것은 코드를 작성하는 사람이라면 누구나 당연히 해야 하는 일이다. 전 세계 시스템을 다운시킨 CrowdStrike 버그에서 나는 두 가지 근본적인 소프트웨어 엔지니어링 실수를 발견했다:
첫째, 드라이버의 손상된 파일은 Microsoft Windows에서 처리되지 않았다. 그런 단순한 실수를 우아하게 처리하지 않았다는 사실이 당황스럽지만, 분명히 그렇지 않았고, 안타깝게도 다른 모든 악의적 행위자들도 마찬가지겠지만, OS에서 동일한 비참한 결과를 초래하기 위해 무엇을 할 수 있는지 궁금해진다. 하나의 손상된 파일이 전체 운영 체제를 다운시키면 안 되지만, Windows의 경우 실제로 그렇게 된다. 극도로 낙관적인 오류 처리는 항상 잘못된 소프트웨어 개발 관행과 잘못된 설계의 징후다.
그리고 운영 체제에는 복구 메커니즘이 없었다. 2024년 컴퓨터에 대한 나의 기대는 업데이트가 잘못되었을 때 최신 작동 버전으로 되돌릴 수 있는 방법을 알고 있다는 것이다. 되돌리기(Reverting)는 소프트웨어 개발에서 많이 하는 작업이다. 제대로 작업을 수행하더라도 때때로 '되돌리기'가 필요한 버그를 발견할 수 있다. 운영 체제이기 때문에 업데이트 결함을 인식하고 이전 작동 상태로 되돌아가는 것이 당연하다. 예를 들어 Mac에서는 하드 드라이브 모든 콘텐츠를 삭제하더라도 컴퓨터가 OS가 없다는 것을 인식하고 웹에 연결하여 최신 작동 버전을 다운로드하도록 요청한다. 이같은 상황에서 Windows는 제대로 부팅할 수 없음을 인식하고(따라서 BSOD가 표시됨) 마지막으로 작동했던 버전을 로드하거나 최소한 안전 모드로 로드하고 사용자에게 이전 버전을 수동으로 선택하도록 안내하기만 하면 된다.
CrowdStrike 업데이트에 결함이 있는 것은 안타까운 일이지만 대부분 피할 수 있지만, 모든 소프트웨어 엔지니어가 알다시피 가끔씩 프로덕션에 치명적인 버그가 발생하지 않는 것은 불가능하다. 나는 아직 큰 사고를 일으키지 않은 소프트웨어 개발자를 만나본 적이 없다. 이는 마치 외과의사가 수술대에서 환자가 사망하는 것과 같다. 피할 수 없는 일이다. 나는 프론트엔드와 백엔드 비밀번호 길이가 일치하지 않아 수백만 명 학생을 핵심 학습 플랫폼에서 차단한 적이 있다.
잘못될 수 있는 것은 무엇이든 잘못될 수 있다. - 머피의 법칙
소프트웨어 개발에서 이 말을 얼마나 더 들어야 심각하게 받아들일 수 있을까? 이 경우 Microsoft는 분명히 가능성을 고려하지 않았다. 이유는 무엇일까? 진정한 수직적 통합(real vertical integration)이 없는 운영 체제 소유자로서 Microsoft는 사실상 통제할 수 없는 환경에서 OS를 실행한다는 사실을 잘 알고 있고, 수십 년 동안 알고 있었다. 시스템 통합업체는 가능한 모든 하드웨어를 던져주고 개발자는 그 위에 가능한 모든 것을 조합한다. 마치 서부와도 같은 상황이다. 나의 첫 일들 중 하나는 동네 컴퓨터 가게에서 고객을 위한 PC를 만드는 것이었다. 하드웨어는 형편없었고 고객이 설치하기를 원하는 소프트웨어는 더 형편없었다. 대부분의 경우 Microsoft에서 방어적인 프로그래밍(defensive programming)은 여전히 낯선 개념인 것 같다.
하지만 물론 이 모든 것을 Microsoft 탓으로만 돌릴 수는 없다. 영향을 받은 기업도 마찬가지로 잘못이 있다. 이중화나 점진적인 성능 저하를 염두에 두지 않고 미션 크리티컬 시스템을 운영하는 것이 바로 그것이다. 737 맥스(737 Max ) 비극은 하드웨어와 데이터 중복성이 없는 소프트웨어에 의존해 지시를 정확히 수행했지만, 조종사 예상과 정반대로 작동한 단일 센서에 의존한 것과 관련이 있다. 2024년 은행 시스템, 공항, 국가 의료 및 교통 시스템 전체가 어떻게 단일 운영 체제에 의존할 수 있을까? 이중화는 어디 있는 걸까?!?
이 정도 규모 IT 시스템은 이중화 기능이 내장되어 있지 않으면 존재할 수 없다. 전기를 공급하는 발전기만으로는 충분하지 않다. 물론 그것도 도움이 되지만, 점점 더 디지털화되는 세상에 살고 있기 때문에 그것만으로는 충분하지 않다. 대형 병원에 들어가서 사방에서 BSOD를 보는 것은 최악의 상황이다. 실제로 몇 가지 일반적인 가정들에 대한 답은 다음과 같아야 한다:
전원이 꺼지면 어떻게 하나? 발전기가 작동하여 전력을 보충하는 동안 배터리 전원으로 전환한다.
인터넷이 다운되면 어떻게 하나? 다른 광케이블 공급업체로 전환한 다음 DSL 또는 5G 공급업체로 전환한다 사용할 수 없는 경우 위성 통신으로 전환한다
네트워크에서 OS가 다운되면 어떻게 하나? 대체 OS를 사용하여 재부팅한다.
이것이 내가 기대할 수 있는 최소한의 답변들이다. 분명하고 슬프게도 우리는 이 모든 것이 현실이 아닌 공상 과학 영화에서나 나올 법한 IT 인프라의 세계에 살고 있으며, 그 이유는 항상 같은 이유, 즉 비용이 너무 많이 든다는 것이다. - 다음 요점으로 넘어간다.
저렴함의 문화(A culture of cheap)
이것은 코리 닥터로우의 유명한 '엔시트화' 이론을 훨씬 뛰어넘는 문제다. 소프트웨어는 우아하게 성능 저하가 일어나지 않는다. 물건은 작동하거나 작동하지 않는다. 빠르고 저렴하게 만들면 소프트웨어가 얼마나 형편없어질 수 있는지를 보여주는 예는 Microsoft와 CrowdStrike만이 아니다. 나는 Apple의 OpenAI 통합에 대해서도 똑같이 걱정하고 있다. 실제로 최근 OpenAI API를 통해 'AI 기능'을 추가한 모든 소프트웨어 회사들이 API에 문제가 발생하거나 서버가 디도스 공격을 받거나 다운되는 순간, 또는 다른 어떤 일이 발생했을 때 소프트웨어 절반은 이러한 중단을 매우 부실하게 처리할 것이라고 확신할 수 밖에 없기 때문이다.
소프트웨어는 점점 더 독립적인 개체가 아니라 상호 연결된 서비스 네트워크로 구성되어 있기 때문에 점점 더 신뢰할 수 없게 된다. 본질적으로 서비스로서 소프트웨어와 통합에 문제가 있는 것은 아니지만, 일반적으로 말해 하나의 링크만 고장 나면 모든 것이 무너지는 믿을 수 없을 정도로 섬세한 사슬이다. 대안은 모든 것을 소유하는 것인데, 이는 비현실적일 가능성이 높다. 또는 성능이 저하되더라도 충분한 가치를 제공하는 이중화 및 경험을 구현하는 것이다. 하지만 이 두 가지 솔루션 모두 비용이 저렴하지 않다.
애자일은 또 다른 훌륭한 유행어였지만, 우리는 애자일을 검증되지 않은 빠른 제공이라는 결코 의도하지 않은 의미로 해석했다. 사실 애자일의 전체 개념은 빠른 구축이 아니라 빠른 피벗을 가능하게 하기 위한 것이었다. IT 예산만 생각한다면 이중화를 염두에 두지 않고 IT 인프라를 운영하는 것이 분명 더 저렴하지만, 전반적으로 얼마나 더 저렴할까? CrowdStrike의 불행한 실수는 장기적으로 영향을 미칠 것이다. 수백 명이 소송을 당할 가능성, 바쁜 보험 회사, 일자리를 잃을 가능성, 휴가를 망칠 가능성 등 그 목록은 계속 늘어날 것이다. 이러한 작은 실수의 파급 효과는 불균형적으로 크고 광범위할 것이며, 조금만 더 투자했더라면 이러한 재난을 예방하는 데 큰 도움이 되었을 것이라는 생각을 지울 수 없다.
위태로운 미래
세상은 크라우드스트라이크와 그 CEO인 조지 커츠에게 분노를 표출하고 있지만, 나는 다른 곳을 바라봐야 한다고 생각한다. 계속되는 빠르고 저렴한 소프트웨어, 패치에 패치를 거듭하는 패치, 하드웨어와 소프트웨어 이중화보다는 그저 잘되기를 바라는 것에 의존하는 완전히 미친 비즈니스 관행, 그리고 기술 업계 전반에서 점점 더 부실하게 테스트되는 소프트웨어 업데이트가 우리를 여기까지 오게 한 것이다. 잘못된 업데이트가 아니다.
이러한 상황에서도 우리는 여전히 소프트웨어와 일상 생활에서 AI를 원하고 있을까? 0과 1의 실타래에 매달려 있는 소프트웨어에 더 많은 복잡성을 추가하고 싶다고 확신할 수 있을까? 우리는 간단한 일조차 충분히 안정적으로 잘 해내지 못하고 있다. 기본으로 돌아가서 단순성, 중복성, 우아한 성능 저하를 염두에 두고 좋은 소프트웨어를 작성해야 할지도 모른다. 큰 틀에서 보면 CrowdStrike 사건은 모래 위에 세워진 상호 연결된 세상의 기반이 드러난 폭풍일 뿐이다. '만약'의 문제가 아니라 '언제'의 문제였고, 그 '언제'가 바로 지금이다.