What Happened To Programming In The 2010s?

Matthias Endler

2010년대 프로그래밍에는 무슨 일이 있었을까?

원문은 Matthias Endler님이 에 게재했습니다. 이 블로그 구독하기

얼마 전, 나는 Fred Wilson이 쓴 “What Happened In The 2010s”라는 글을 읽었다. 이 글은 지난 10년간 기술과 비즈니스 분야의 핵심 변화를 짚어낸다. 이를 계기로 훨씬 더 좁은 주제에 대해 생각해보게 됐다: 2010년대 프로그래밍에는 무슨 일이 있었을까?

🚓 아마 실제로 있었던 일의 90%는 잊어버렸을 것이다. 제발 고소하지 마시길. 내 목표는 과거를 돌아봐서 여러분이 미래를 더 잘 예측할 수 있게 하는 것이다.

어디서부터 시작할까?

아주 거시적으로 보면, 프로그래밍은 10년 전이나 지금이나 여전히 똑같다:

  1. 에디터에 프로그램 입력하기
  2. 컴파일러(또는 인터프리터)에 넣기
  3. Bleep Boop 🤖
  4. 결과 받기

하지만 좀 더 자세히 들여다보면 우리 주변에서 많은 것이 바뀌었다. 오늘날 당연하게 여기는 많은 것들이 10년 전에는 존재하지 않았다.

그 전에는 어땠을까?

2009년만 해도 우리는 jQuery 플러그인을 만들고, 공유 호스팅 서비스에서 웹사이트를 운영했으며, FTP로 콘텐츠를 업로드했다. 코드는 종종 출처가 불분명한 포럼이나 블로그 튜토리얼에서 복사해 붙여 넣었고, 심지어 책을 보고 손으로 옮겨 적기도 했다. Stack Overflow(2008년 9월 15일에 출시)는 아직 걸음마 단계였다. 버전 관리는 CVSSVN으로 했고, 아예 하지 않는 경우도 많았다. 나는 2010년 1월 3일에 Github에 가입했다. Raspberry Pi(2012년에야 출시됐다)가 뭔지 들어본 사람조차 없었다.

<a href='https://xkcd.com/2324/'>xkcd #2324</a>
출처: xkcd #2324

새로운 프로그래밍 언어의 폭발

지난 10년 동안 수많은 새롭고 흥미로운 프로그래밍 언어들이 탄생했다.

Crystal, Dart, Elixir, Elm, Go, Julia, Kotlin, Nim, Rust, Swift, TypeScript 모두 첫 안정 버전을 출시했다!

더 흥미로운 점은 모든 위 언어들이 이제 공개적으로 개발되고 있으며 소스 코드가 Github에 자유롭게 공개되어 있다는 것이다. 누구나 개발에 기여할 수 있다는 뜻이며, 이는 오픈소스의 위력을 보여주는 증거다.

각 언어는 이전에는 널리 퍼지지 않았던 새로운 아이디어들을 선보였다:

  • 강력한 타입 시스템: Kotlin과 Swift는 옵셔널 널 타입을 주류로 만들었고, TypeScript는 JavaScript에 타입을 가져왔으며, 대수적 데이터 타입은 Kotlin, Swift, TypeScript, Rust에서 흔해졌다.
  • 상호 운용성: Dart는 JavaScript로 컴파일되고, Elixir는 Erlang과, Kotlin은 Java와, Swift는 Objective-C와 연동된다.
  • 더 나은 성능: Go는 더 쉬운 동시성을 위해 고루틴과 채널을 내세웠고 1밀리초 미만의 가비지 컬렉터로 인상적인 모습을 보였으며, Rust는 소유권과 빌림 덕분에 가비지 컬렉터 오버헤드 자체를 없앴다.

이건 짧은 목록일 뿐이지만, 프로그래밍 언어 분야의 혁신은 크게 가속화됐다.

기존 언어들의 혁신

기존 언어들도 가만히 있지 않았다. 몇 가지 예를 들면 다음과 같다:

C++는 긴 겨울잠에서 깨어나 1998년 마지막 메이저 릴리스 이후 C++11을 출시했다. 람다, auto 포인터, 범위 기반 루프 등 수많은 새로운 기능을 언어에 도입했다.

지난 10년이 시작될 때 최신 PHP 버전은 5.3이었다. 지금은 7.4까지 왔다. (6.0은 건너뛰었다. 아직 그 얘기를 할 준비는 되지 않았다.) 그 과정에서 두 배 이상 빨라졌다. PHP는 이제 번창하는 생태계를 갖춘 진정한 모던 프로그래밍 언어다.

심지어 Visual Basic에도 이제 튜플이 생겼다. (미안하다, 참을 수 없었다.)

더 빨라진 릴리스 주기

대부분의 언어가 더 빠른 릴리스 주기를 채택했다. 인기 언어들의 현황은 다음과 같다:

언어현재 릴리스 주기
C비정기적
C#~ 12개월
C++~ 3년
Go6개월
Java6개월
JavaScript (ECMAScript)12개월
PHP12개월
Python12개월
Ruby12개월
Rust6주 (!)
Swift6개월
Visual Basic .NET~ 24개월

Null의 느린 죽음

지난 10년이 끝나갈 무렵인 2009년 8월 25일의 강연에서 Tony Hoare는 null 포인터를 자신의 10억 달러짜리 실수라고 불렀다.

Chromium 프로젝트의 연구에 따르면 심각한 보안 버그의 70%가 메모리 안전 문제였다 (Microsoft도 마찬가지였다). 다행히 메모리 안전 문제는 코더가 나빠서가 아니라는 인식이 마침내 힘을 얻기 시작했다.
많은 주류 언어가 null을 대신할 더 안전한 대안인 널러블 타입, Option, Result 타입을 받아들였다. Haskell 같은 언어들은 이전부터 이런 기능을 갖고 있었지만, 2010년대에 들어서야 비로소 인기를 얻었다.

타입 시스템의 복수

이와 밀접하게 관련된 것이 타입 시스템에 대한 논쟁이다. 지난 10년 동안 타입 시스템은 화려하게 복귀했다. TypeScript, Python, PHP(몇 가지 예에 불과하다)가 타입 시스템을 받아들이기 시작했다.

추세는 타입 추론 쪽으로 향하고 있다. 모호한 상황에서는 다른 사람이 의도를 더 명확히 이해할 수 있도록 타입을 추가하고, 그 외에는 생략하는 식이다. Java, C++, Go, Kotlin, Swift, Rust가 타입 추론을 지원하는 대표적인 예다. 어디까지나 내 이야기지만, 지난 몇 년 사이 Java를 작성하는 것이 훨씬 더 편해진 것 같다.

라이브러리와 프레임워크의 기하급수적 성장

현재 npm에는 1,330,634개의 패키지가 있다. 누군가 대신 유지보수해 주는 패키지가 100만 개가 넘는 셈이다. 여기에 160,488개의 Ruby gems, 243,984개의 Python 프로젝트를 더하고, 42,547개의 Rust 크레이트까지 얹으면 된다.

인기 프로그래밍 언어별 패키지 수.<br /> 2019년에 npm에 무슨 일이 있었는지는 묻지 마시길.
인기 프로그래밍 언어별 패키지 수.
2019년에 npm에 무슨 일이 있었는지는 묻지 마시길.
출처: Module Counts

물론 가끔 leftpad 같은 일도 있지만, 이는 우리가 직접 라이브러리 코드를 덜 작성하고 대신 비즈니스 가치에 집중할 수 있다는 뜻이기도 하다. 반면 잠재적인 실패 지점은 더 많아졌고 감사는 어려워졌다. 오래된 패키지도 아주 많다. 더 깊이 있는 논의를 원한다면 Linux Foundation과 Harvard의 Census II 보고서 [PDF]를 추천한다.

프론트엔드 프레임워크 쪽에서도 우리는 좀 과하게 열광했다:

공짜 점심은 없다

이런 회고에서 무어의 법칙을 빼놓을 수 없다. 지난 10년 동안 무어의 법칙은 놀랍게도 잘 유지됐다:

<a href='https://en.wikipedia.org/wiki/Moore%27s_law'>Wikipedia</a>
출처: Wikipedia

하지만 함정이 있다. 싱글 코어 성능을 보면 곡선은 점점 평평해지고 있다:

<a href='https://www.youtube.com/watch?v=Azt8Nc-mtKM&'>스탠퍼드 대학교: The Future of Computing (동영상)</a>
출처: 스탠퍼드 대학교: The Future of Computing (동영상)

무어가 예언한 새로운 트랜지스터들은 CPU를 더 빠르게 만들지 않고, 대신 더 많은 병렬성이나 하드웨어 암호화 같은 다른 종류의 처리 능력을 추가한다. 더 이상 공짜 점심은 없다. 엔지니어들은 예를 들어 동시 실행을 받아들이는 식으로 애플리케이션을 더 빠르게 만들 새로운 방법을 찾아야 한다.

콜백, 코루틴, 그리고 결국 async/await가 업계 표준이 되고 있다.

GPU(그래픽 처리 장치)는 매우 강력해져 대규모 병렬 연산이 가능해졌고, 이는 머신러닝이 실용적인 활용 사례에 부활하는 계기가 됐다:

딥러닝이 실현 가능해지면서 머신러닝이 널리 사용되는 많은 소프트웨어 서비스와 애플리케이션의 핵심 요소가 됐다. — Wikipedia의 머신러닝 타임라인

컴퓨팅은 어디에나 존재하므로, 이제 대부분의 경우(적어도 소비자 기기에서는) 단순한 성능보다 에너지 효율이 더 중요한 역할을 한다.

뜻밖의 반전

교훈

지금 ‘Matthias, X를 완전히 빼먹었네’라고 생각하고 있다면, 내 의도는 정확히 전달된 것이다. 이 글은 실제로 일어난 일의 극히 일부도 담지 못했다. 모든 걸 다 얘기하려면 족히 10년이 걸릴 것이다.

개인적으로 나는 다음 10년이 기대된다. 소프트웨어가 세상을 집어삼키고 있다 — 점점 더 빠른 속도로.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글