Offcanvas

������������

복잡성이 SW 개발자를 죽인다··· '패러다임의 전환' 올까?

로터스 노츠의 개발자이자 마이크로소프트 베테랑인 레이 오지는 2005년의 내부 문건에 다음과 같이 서술했다.  “복잡성은 살인적이다(Complexity kills). 개발자의 수명을 단축시킨다. 제품을 구상하고 제작하고 테스트하는 일을 어렵게 만든다. 보안 문제를 끌어들인다. 그리고 이용자와 관리자를 좌절시킨다.” Ian Espinosa (CC0) 당시의 소프트웨어 개발 작업이 심각하게 복잡했다면, 클라우드 네이티브 시대에 소프트웨어 개발자가 마주치는 복잡성에 대해 그가 어떻게 말할 것인지 궁금하지 않을 수 없다.  이제 직접 다룰 수 있는 서버에서 동작하는 모놀리식 아키텍처의 애플리케이션을 제작하는 시대가 끝나가고 있다. 다수의 마이크로서비스로 분해하고, 컨테이너 안으로 패키징하고, 쿠버네티스로 오케스트레이션 하고, 분산 클라우드 환경에서 호스팅해야 하는 상황이다. 그리고 이러한 전환은 소프트웨어 복잡성을 다른 차원으로 격상시킨다.  여기에 안전하고 복원력을 확보해야 하는 요구사항과, 풍부한 기능의 소비자 등급의 경험에 대한 기대를 더해보라. 개발자는 지금까지 이런 수준의 부담에 시달려본 적이 없다고 표현해도 과언이 아니다. 아마존의 CIO인 워너 보겔스는 2019년 AWS 서밋 행사 중에 “마이크로서비스가 보편화된 환경으로 이동하면 복잡성이 확연히 증가한다”면서 “모든 것이 모놀리식 아키텍처였던 시절에는 더 단순했을까? 일정 부분에서는 분명히 그랬다”라고 말했다.  반면, 복합적 기술을 API를 통해 기성품처럼 소비하기가 이처럼 쉬운 적이 없었다. 기본적인 라이브러리 및 프레임워크로부터 이미지 인식 기능, 또는 심지어 전체 지불 스택에 이르기까지 그렇다. 단순히 조립해서 비즈니스 로직을 덧씌우면 그만이다.  그러나 이게 진짜 그렇게 단순할까? 월트 디즈니의 기업 기술 전략 총괄이었으며 현재 컨설턴트인 나이젤 심슨은 “소프트웨어 개발자가 되기가 오늘날처럼 어려운 적이 없었다”라고 말했다. 그는 “...

복잡성 소프트웨어 개발 모놀리식 API 혁신 고객 경험

2021.11.29

로터스 노츠의 개발자이자 마이크로소프트 베테랑인 레이 오지는 2005년의 내부 문건에 다음과 같이 서술했다.  “복잡성은 살인적이다(Complexity kills). 개발자의 수명을 단축시킨다. 제품을 구상하고 제작하고 테스트하는 일을 어렵게 만든다. 보안 문제를 끌어들인다. 그리고 이용자와 관리자를 좌절시킨다.” Ian Espinosa (CC0) 당시의 소프트웨어 개발 작업이 심각하게 복잡했다면, 클라우드 네이티브 시대에 소프트웨어 개발자가 마주치는 복잡성에 대해 그가 어떻게 말할 것인지 궁금하지 않을 수 없다.  이제 직접 다룰 수 있는 서버에서 동작하는 모놀리식 아키텍처의 애플리케이션을 제작하는 시대가 끝나가고 있다. 다수의 마이크로서비스로 분해하고, 컨테이너 안으로 패키징하고, 쿠버네티스로 오케스트레이션 하고, 분산 클라우드 환경에서 호스팅해야 하는 상황이다. 그리고 이러한 전환은 소프트웨어 복잡성을 다른 차원으로 격상시킨다.  여기에 안전하고 복원력을 확보해야 하는 요구사항과, 풍부한 기능의 소비자 등급의 경험에 대한 기대를 더해보라. 개발자는 지금까지 이런 수준의 부담에 시달려본 적이 없다고 표현해도 과언이 아니다. 아마존의 CIO인 워너 보겔스는 2019년 AWS 서밋 행사 중에 “마이크로서비스가 보편화된 환경으로 이동하면 복잡성이 확연히 증가한다”면서 “모든 것이 모놀리식 아키텍처였던 시절에는 더 단순했을까? 일정 부분에서는 분명히 그랬다”라고 말했다.  반면, 복합적 기술을 API를 통해 기성품처럼 소비하기가 이처럼 쉬운 적이 없었다. 기본적인 라이브러리 및 프레임워크로부터 이미지 인식 기능, 또는 심지어 전체 지불 스택에 이르기까지 그렇다. 단순히 조립해서 비즈니스 로직을 덧씌우면 그만이다.  그러나 이게 진짜 그렇게 단순할까? 월트 디즈니의 기업 기술 전략 총괄이었으며 현재 컨설턴트인 나이젤 심슨은 “소프트웨어 개발자가 되기가 오늘날처럼 어려운 적이 없었다”라고 말했다. 그는 “...

2021.11.29

칼럼 | 마이그레이션을 도중에 멈추면 안 되는 이유

애플리케이션 마이그레이션을 계획 중인가? 아마 온프레미스 애플리케이션을 클라우드로 이전하거나 모놀리식 애플리케이션을 서비스 지향 아키텍처나 마이크로서비스 아키텍처로 옮길 생각일 것이다.   이런 마이그레이션은 전력을 다해야 하는 일이다. 시간과 자원은 물론, 마음가짐과 기업의 역량을 모두 투여해야 한다.    하지만 마이그레이션은 완료하기가 쉽지 않다. 마이그레이션은 장기간의 점진적인 변화이고, 통상적으로 소비된 노력이 실현된 혜택과 바로 일치하지는 않는다. 혜택은 투자가 이루어지고 난 시점보다 훨씬 이후에 찾아온다. 때에 따라 좋아지기 전에 난관에 부딪히기도 한다.   그래서 마이그레이션을 도중에 종료하려는 유혹을 뿌리치기는 쉽지 않다.   도대체 마이그레이션을 도중에 종료하고 싶은 사람이 있기는 할까? 말도 안 되는 것처럼 보이지만 실제로 일어난다. 모놀리식 애플리케이션으로부터 서비스 지향 아키텍처로 이동한다고 하자. 마이그레이션을 시작한 지 얼마 되지 않아 중단한다면 애플리케이션은 마이그레이션 이전보다 훨씬 좋지 않은 상태로 남는다.   그렇다면 마이그레이션을 도중에 중단하려는 유혹을 어떻게 뿌리칠 것인가? 기대를 관리하는 것, 그리고 진정한 ROI를 이해하는 것이 핵심이다.     고통의 계곡   중대한 마이그레이션을 시작할 때, 특히 모놀리식 애플리케이션에서 마이크로서비스로 마이그레이션하는 등의 복잡한 마이그레이션을 시작한다면, 궁극적으로 얻게 될 혜택에 대한 일정한 기대가 있기 마련이다. 보통은 혜택이 투입된 시간과 노력에 상응할 것이라고 기대한다. ROI가 마이그레이션 노력을 정당화시킬 것이라고 생각한다.   그러나 이는 마이그레이션의 가치와 혜택을 판단하는 1차원적 시각이다. 단순 ROI 계산은 마이그레이션에 투여된 시간과 노력이 어떻게 혜택으로 변환되는지에 관한 이해를 충분히 포착하지 못한다. 일반적으로 <그림 1>에서 보듯이 혜택과...

마이그레이션 현대화 마이크로서비스 모놀리식

2021.09.03

애플리케이션 마이그레이션을 계획 중인가? 아마 온프레미스 애플리케이션을 클라우드로 이전하거나 모놀리식 애플리케이션을 서비스 지향 아키텍처나 마이크로서비스 아키텍처로 옮길 생각일 것이다.   이런 마이그레이션은 전력을 다해야 하는 일이다. 시간과 자원은 물론, 마음가짐과 기업의 역량을 모두 투여해야 한다.    하지만 마이그레이션은 완료하기가 쉽지 않다. 마이그레이션은 장기간의 점진적인 변화이고, 통상적으로 소비된 노력이 실현된 혜택과 바로 일치하지는 않는다. 혜택은 투자가 이루어지고 난 시점보다 훨씬 이후에 찾아온다. 때에 따라 좋아지기 전에 난관에 부딪히기도 한다.   그래서 마이그레이션을 도중에 종료하려는 유혹을 뿌리치기는 쉽지 않다.   도대체 마이그레이션을 도중에 종료하고 싶은 사람이 있기는 할까? 말도 안 되는 것처럼 보이지만 실제로 일어난다. 모놀리식 애플리케이션으로부터 서비스 지향 아키텍처로 이동한다고 하자. 마이그레이션을 시작한 지 얼마 되지 않아 중단한다면 애플리케이션은 마이그레이션 이전보다 훨씬 좋지 않은 상태로 남는다.   그렇다면 마이그레이션을 도중에 중단하려는 유혹을 어떻게 뿌리칠 것인가? 기대를 관리하는 것, 그리고 진정한 ROI를 이해하는 것이 핵심이다.     고통의 계곡   중대한 마이그레이션을 시작할 때, 특히 모놀리식 애플리케이션에서 마이크로서비스로 마이그레이션하는 등의 복잡한 마이그레이션을 시작한다면, 궁극적으로 얻게 될 혜택에 대한 일정한 기대가 있기 마련이다. 보통은 혜택이 투입된 시간과 노력에 상응할 것이라고 기대한다. ROI가 마이그레이션 노력을 정당화시킬 것이라고 생각한다.   그러나 이는 마이그레이션의 가치와 혜택을 판단하는 1차원적 시각이다. 단순 ROI 계산은 마이그레이션에 투여된 시간과 노력이 어떻게 혜택으로 변환되는지에 관한 이해를 충분히 포착하지 못한다. 일반적으로 <그림 1>에서 보듯이 혜택과...

2021.09.03

‘이식성이 거래 좌우할 수도...’ 틱톡이 전하는 ‘신선한’ 교훈

‘틱톡’으로부터 깨달을 수 있는 교훈은 무엇일까? 소비자 데이터를 가진 인기 소셜 네트워크의 가치가 그야말로 어마어마하다는 것일까? 사실이기는 하지만 교훈은 또 있다. 애플리케이션을 유연하면서 이식이 기능하게 디자인해야 한다는 교훈이다.  마이크로소프트이든 오라클이든, 틱톡을 인수하는 회사가 직면할 도전과제 중 하나는 중국 밖에서 인수 과정에 그 가치를 파괴하지 않고 기술 인프라와 데이터를 분할하는 방법이 될 것이다. 애초 미국 정부가 중국이 이 앱을 통해 미국 국민들에 대한 ‘스파이 행위’를 하는 것을 차단하고자 했기에 이번 거래가 촉발됐다. 백엔드에서 얽힌 데이터와 애플리케이션 코드를 풀어야 할 필요성이 함께 제기되는 셈이다. 틱톡을 소유한 회사인 바이트댄스(ByteDance)는 중국 내에서만 이용할 수 있는 더우인(Douyin)이라는 유사한 앱을 운영하고 있다. 그런데 이들 두 앱이 사용자 데이터, 서버 코드, 사용자가 볼 콘텐츠와 광고를 결정하는 알고리즘 같은 기술적 리소스를 공유하는 것으로 알려져 있다. 즉 바이트댄스는 주어진 짧은 시간에 이런 요소들을 분리해야 한다. 이를 효과적으로 해내는 능력이 인수 후보자가 지불할 인수 금액에 요소로 반영될 전망이다. 더 나아가 거래가 성사될지 여부를 결정할 수도 있다. 여기에 다른 기업들이 배울 교훈들이 있다. 전략적인 이유에서 제품이나 기업의 사업 부문을 매각, 분할, 분리하는 경우가 많다. 그런데 ‘이런 자산들이 어떻게 설계되어 있는지’가 가치에, 또 ‘얼마나 수월하게 매각을 할 수 있는지’에 영향을 줄 수도 있다. 거대한 모놀리식 애플리케이션을 만들던 시대는 오래 전에 저물었다. 대부분의 새로운 앱들은 이제 필요에 따라 축소 및 확장할 수 있고, 독립적으로 업데이트할 수 있는 작은 마이크로서비스를 이용해 클라우드에서 개발된다. 새 기능을 신속히 도입하거나 추가할 때 도움이 된다. 그러나 오픈 표준과 기술들을 이용해 세심히 설계 및 고안을 하지 않은 경우, 분리가 아주 어려울 수 있다. 고...

틱톡 마이크로소프트 오라클 중국 이식성 유연성 록인 마이크로서비스 모듈 모놀리식

2020.09.15

‘틱톡’으로부터 깨달을 수 있는 교훈은 무엇일까? 소비자 데이터를 가진 인기 소셜 네트워크의 가치가 그야말로 어마어마하다는 것일까? 사실이기는 하지만 교훈은 또 있다. 애플리케이션을 유연하면서 이식이 기능하게 디자인해야 한다는 교훈이다.  마이크로소프트이든 오라클이든, 틱톡을 인수하는 회사가 직면할 도전과제 중 하나는 중국 밖에서 인수 과정에 그 가치를 파괴하지 않고 기술 인프라와 데이터를 분할하는 방법이 될 것이다. 애초 미국 정부가 중국이 이 앱을 통해 미국 국민들에 대한 ‘스파이 행위’를 하는 것을 차단하고자 했기에 이번 거래가 촉발됐다. 백엔드에서 얽힌 데이터와 애플리케이션 코드를 풀어야 할 필요성이 함께 제기되는 셈이다. 틱톡을 소유한 회사인 바이트댄스(ByteDance)는 중국 내에서만 이용할 수 있는 더우인(Douyin)이라는 유사한 앱을 운영하고 있다. 그런데 이들 두 앱이 사용자 데이터, 서버 코드, 사용자가 볼 콘텐츠와 광고를 결정하는 알고리즘 같은 기술적 리소스를 공유하는 것으로 알려져 있다. 즉 바이트댄스는 주어진 짧은 시간에 이런 요소들을 분리해야 한다. 이를 효과적으로 해내는 능력이 인수 후보자가 지불할 인수 금액에 요소로 반영될 전망이다. 더 나아가 거래가 성사될지 여부를 결정할 수도 있다. 여기에 다른 기업들이 배울 교훈들이 있다. 전략적인 이유에서 제품이나 기업의 사업 부문을 매각, 분할, 분리하는 경우가 많다. 그런데 ‘이런 자산들이 어떻게 설계되어 있는지’가 가치에, 또 ‘얼마나 수월하게 매각을 할 수 있는지’에 영향을 줄 수도 있다. 거대한 모놀리식 애플리케이션을 만들던 시대는 오래 전에 저물었다. 대부분의 새로운 앱들은 이제 필요에 따라 축소 및 확장할 수 있고, 독립적으로 업데이트할 수 있는 작은 마이크로서비스를 이용해 클라우드에서 개발된다. 새 기능을 신속히 도입하거나 추가할 때 도움이 된다. 그러나 오픈 표준과 기술들을 이용해 세심히 설계 및 고안을 하지 않은 경우, 분리가 아주 어려울 수 있다. 고...

2020.09.15

마이크로서비스로 이전하기··· ‘현장의 조언 8가지’

마이크로서비스로의 이전은 애플리케이션 개발에 있어 상전벽해 수준의 변화를 의미한다. 그 과정에서 수반되는 복잡성을 해소할 방안을 정리했다.    오늘날 새로운 애플리케이션 개발에 있어서 특히 중요한 것 중 하나가 제공 속도다. 애자일 트렌드로 인해 소프트웨어 개발이 쉽고 빨라야 한다는 분위기가 조성됐다. 애플리케이션 개발 가속화에 도움이 되는 기술 트렌드 중 하나는 마이크로서비스의 등장이다.   마이크로서비스는 느슨하게 연동된 서비스들의 총합체로서, 애플리케이션을 구조화하는 SOA(Service-Oriented Architecture)의 변종이다. 애플리케이션을 소규모 서비스로 분할할 때의 이점에는 모듈 방식이 포함되며, 이를 통해 애플리케이션을 개발하여 시험하기가 쉬워진다. “마이크로서비스는 팀의 권한을 증진시키고 연계성을 낮추어 각 팀이 더욱 빠르게 혁신하고 팀간 소통을 줄이면서 아키텍처, 언어, 프레임워크에 대해 스스로 결정할 수 있는 자율성이 보장된다"라고 버라이존 미디어 그룹의 엔지니어링, 스포츠, 미디어 제작 엔지니어링 부사장 EJ 캠벨이 말했다. 그는 이어 "팀들이 마이크로서비스를 도입하면서 시작부터 제작까지의 사이클 시간이 크게 감소했다. 많은 팀들이 인간의 개입 없이 하루에도 몇 번씩 마이크로서비스를 배치하고 있으며 시험, 코드 검토, 정교한 CI/CD(Continuous Integration/Continuous Delivery) 파이프라인에 의존하여 변경사항을 안전하게 제공하고 있다"라고 덧붙였다. 해당 기업의 YDFP(Yahoo Daily Fantasy Product)는 핵심 게임 플레이 서비스, 스포츠 데이터 서비스, 지갑 서비스, 여러 내부 지원 서비스 등의 여러 마이크로서비스로 구성된다. "각 서비스는 자체적인 연속 배치 파이프라인, 고립된 데이터 스토어, 개발과 운영을 담당하는 각 팀이 있다"라고 캠벨이 설명했다. 그러나 마이크...

애자일 조언 마이크로서비스 모놀리식

2019.02.14

마이크로서비스로의 이전은 애플리케이션 개발에 있어 상전벽해 수준의 변화를 의미한다. 그 과정에서 수반되는 복잡성을 해소할 방안을 정리했다.    오늘날 새로운 애플리케이션 개발에 있어서 특히 중요한 것 중 하나가 제공 속도다. 애자일 트렌드로 인해 소프트웨어 개발이 쉽고 빨라야 한다는 분위기가 조성됐다. 애플리케이션 개발 가속화에 도움이 되는 기술 트렌드 중 하나는 마이크로서비스의 등장이다.   마이크로서비스는 느슨하게 연동된 서비스들의 총합체로서, 애플리케이션을 구조화하는 SOA(Service-Oriented Architecture)의 변종이다. 애플리케이션을 소규모 서비스로 분할할 때의 이점에는 모듈 방식이 포함되며, 이를 통해 애플리케이션을 개발하여 시험하기가 쉬워진다. “마이크로서비스는 팀의 권한을 증진시키고 연계성을 낮추어 각 팀이 더욱 빠르게 혁신하고 팀간 소통을 줄이면서 아키텍처, 언어, 프레임워크에 대해 스스로 결정할 수 있는 자율성이 보장된다"라고 버라이존 미디어 그룹의 엔지니어링, 스포츠, 미디어 제작 엔지니어링 부사장 EJ 캠벨이 말했다. 그는 이어 "팀들이 마이크로서비스를 도입하면서 시작부터 제작까지의 사이클 시간이 크게 감소했다. 많은 팀들이 인간의 개입 없이 하루에도 몇 번씩 마이크로서비스를 배치하고 있으며 시험, 코드 검토, 정교한 CI/CD(Continuous Integration/Continuous Delivery) 파이프라인에 의존하여 변경사항을 안전하게 제공하고 있다"라고 덧붙였다. 해당 기업의 YDFP(Yahoo Daily Fantasy Product)는 핵심 게임 플레이 서비스, 스포츠 데이터 서비스, 지갑 서비스, 여러 내부 지원 서비스 등의 여러 마이크로서비스로 구성된다. "각 서비스는 자체적인 연속 배치 파이프라인, 고립된 데이터 스토어, 개발과 운영을 담당하는 각 팀이 있다"라고 캠벨이 설명했다. 그러나 마이크...

2019.02.14

기고 | 마이크로서비스 확장을 위한 7가지 비법

마이크로서비스를 도입해 ‘현대적인’ 애플리케이션을 구현하는 것 자체는 더 이상 차별화 요소가 되지 못한다. 그러나 시장에서 입지를 유지하기 위해 반드시 해야 할 일이다. 기술 혁신의 속도 때문에 기업은 더 빨리 움직이고 있고, 더 ‘스마트’해지고 있고, 더 간소화되고 있다. 경쟁에서 앞서 나가고 경쟁력을 유지하고 비즈니스를 확장하기 위해서는 반드시 IT 현대화가 필요하다. 모놀리식(획일적) 애플리케이션 대신 분산형 마이크로서비스를 도입한 기업의 사례는 많다. 그러나 수모 로직(Sumo Logic)의 이야기는 꽤 ‘급진적’이다. 필자의 팀은 수모 로직을 창업하기 전에 엔터프라이즈 소프트웨어로 전달되는 모놀리식 아키텍처와 유사한 솔루션 구축과 확장에 약 10년이라는 시간을 투자했다. 우리는 새로운 방식으로 차세대 로그 관리 시스템을 구현하기 위해 수모 로직을 창업했다. 새로운 방식이란 규모를 확대하거나 축소할 수 있는 분산형 멀티테넌트 서비스를 가리킨다. 우리는 로그와 매트릭스를 위해 아주 규모가 큰 데이터 처리 시스템을 점진적으로 구현하면서 중요한 교훈을 많이 터득했다. 우리가 극복해야 했던 도전과제와 문제를 피할 수 있도록, 지금부터 비즈니스를 확장하는 데 마이크로서비스를 활용하는 방법 7가지를 소개한다. #1 PDU(Product Development Unit)를 구현한다 가장 먼저 팀을 구성해야 한다. 우리는 현재 PDU(Product Development Unit)라는 모델을 적용하고 있다. PDU는 고유의 마이크로서비스로 구성된 완전한 유닛이다. 규모가 작은 팀이 특정 프로젝트에 집중하면서, 특정 마이크로서비스 세트에 너무 많은 관여가 있을 때 초래되는 복잡성(충돌 또는 분규) 문제를 피하도록 도와준다. 아마존의 제프 베조스가 창안한 ‘피자 두 판의 규칙’에 토대를 두고 있는 개념이다. 피자 두 판으로 모두 한 끼 식사를 해결할...

아키텍처 확장 마이크로서비스 모놀리식 스케일링

2018.05.21

마이크로서비스를 도입해 ‘현대적인’ 애플리케이션을 구현하는 것 자체는 더 이상 차별화 요소가 되지 못한다. 그러나 시장에서 입지를 유지하기 위해 반드시 해야 할 일이다. 기술 혁신의 속도 때문에 기업은 더 빨리 움직이고 있고, 더 ‘스마트’해지고 있고, 더 간소화되고 있다. 경쟁에서 앞서 나가고 경쟁력을 유지하고 비즈니스를 확장하기 위해서는 반드시 IT 현대화가 필요하다. 모놀리식(획일적) 애플리케이션 대신 분산형 마이크로서비스를 도입한 기업의 사례는 많다. 그러나 수모 로직(Sumo Logic)의 이야기는 꽤 ‘급진적’이다. 필자의 팀은 수모 로직을 창업하기 전에 엔터프라이즈 소프트웨어로 전달되는 모놀리식 아키텍처와 유사한 솔루션 구축과 확장에 약 10년이라는 시간을 투자했다. 우리는 새로운 방식으로 차세대 로그 관리 시스템을 구현하기 위해 수모 로직을 창업했다. 새로운 방식이란 규모를 확대하거나 축소할 수 있는 분산형 멀티테넌트 서비스를 가리킨다. 우리는 로그와 매트릭스를 위해 아주 규모가 큰 데이터 처리 시스템을 점진적으로 구현하면서 중요한 교훈을 많이 터득했다. 우리가 극복해야 했던 도전과제와 문제를 피할 수 있도록, 지금부터 비즈니스를 확장하는 데 마이크로서비스를 활용하는 방법 7가지를 소개한다. #1 PDU(Product Development Unit)를 구현한다 가장 먼저 팀을 구성해야 한다. 우리는 현재 PDU(Product Development Unit)라는 모델을 적용하고 있다. PDU는 고유의 마이크로서비스로 구성된 완전한 유닛이다. 규모가 작은 팀이 특정 프로젝트에 집중하면서, 특정 마이크로서비스 세트에 너무 많은 관여가 있을 때 초래되는 복잡성(충돌 또는 분규) 문제를 피하도록 도와준다. 아마존의 제프 베조스가 창안한 ‘피자 두 판의 규칙’에 토대를 두고 있는 개념이다. 피자 두 판으로 모두 한 끼 식사를 해결할...

2018.05.21

회사명:한국IDG 제호: ITWorld 주소 : 서울시 중구 세종대로 23, 4층 우)04512
등록번호 : 서울 아00743 등록일자 : 2009년 01월 19일

발행인 : 박형미 편집인 : 박재곤 청소년보호책임자 : 한정규
사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2022 International Data Group. All rights reserved.

10.4.0.31