TL;DR

  • Zig 여정의 핵심은 대상 시스템의 기능을 바탕으로 문제를 모델링하고, 의존성에만 기대지 않으며, 프로젝트를 끝까지 완성하는 과정임.
  • 입문자는 프레임워크보다 대상 컴퓨터가 제공하는 연산을 중심으로 문제를 바라보는 능력을 길러야 함.
  • 중급자는 빌드와 메모리 할당, 효율성, 퍼징을 포함해 코드의 동작 전반을 깊이 설계해야 함.
  • 고급자는 핵심 기능을 완전히 소유하고 비기능적 개선 여지를 줄여 열정을 쏟는 프로젝트를 완성해야 함.
  • Zig의 도구 체인과 커뮤니티는 아직 완전히 성숙하지 않았지만, 시스템 이해와 소프트웨어 엔지니어링 역량을 키우는 데 도움이 되는 선택지임.

Zig 여정

  • 몇 주 전 뮌헨에서 열린 하루 일정의 콘퍼런스인 Zigtoberfest에 참석함.
  • 행사 첫머리에서 소개 발언을 맡아, Zig 프로젝트와 커뮤니티에 접근하는 방법을 입문자·중급자·고급자 세 단계로 나눠 제안함.
  • 이 글에서 연설 내용을 모두 반복하지 않고, 핵심 주제인 Zig 여정을 강조함.
  • 이 글은 Go, Rust, Modula-2, Mojo, 대형 언어 모델(LLM) 등이 있는 상황에서 Zig의 의미를 이해하기 어려워하는 사람들의 질문에도 답할 수 있음.

1. 프레임워크가 아니라 대상 컴퓨터를 바라보기

  • 입문자를 위한 핵심 조언은 문제를 높은 수준의 API를 제공하는 의존성 조합으로 보기보다, 대상 시스템이 제공하는 연산의 순서로 생각하는 법을 익히는 것임.
  • 이러한 능력은 웹 개발을 포함해 어떤 생태계에서 일하든 매우 유용함.

시스템 프로그래밍은 소프트웨어 개발을 모델링하는 방식임. 작업 대상의 범주가 아니라 문제를 바라보는 관점임. 뛰어난 시스템 프로그래머는 관련된 시스템을 완전히 이해함.

— Andrew Kelley, Systems Distributed ’23

  • 의존성이나 프레임워크를 사용하지 말라는 뜻은 아니지만, 그것만 다룰 줄 아는 상태는 문제임.
  • 단순한 애플리케이션 다수는 의존성을 연결하는 방식으로 가장 잘 해결되지만, 혁신적인 무언가를 만들려면 프로그램의 핵심 기능을 완전히 제어해 사용자에게 새롭고 세심하게 설계된 경험을 제공해야 함.

2. 코드 동작을 깊이 설계하기

  • 앞선 조언이 애플리케이션의 기능 요구사항을 면밀히 살피는 것이었다면, 중급 Zig 사용자에게는 그 밖의 모든 요소를 직접 설계하라는 조언임.
  • 애플리케이션에 중요한 C/C++ 의존성이 있다면 사용자가 직접 설치해야 하는 방식과 Zig 빌드 스크립트에서 함께 제공하는 방식 사이에는 큰 차이가 있음.
  • 사용자가 직접 설치하는 방식은 사실상 패키지 관리자(apt, brew, winget 등)에 의존하게 됨.
  • 패키지 관리자가 의존성을 패키징하는 방식을 바꾸면 버전이나 기능 토글 등의 변경으로 애플리케이션이 깨질 수 있음.
  • 일부 생태계에서 컨테이너를 지나치게 많이 사용하는 이유도 여기에 있으며, Zig에서는 zig build만 실행해 모든 시스템에서 모든 시스템용 애플리케이션을 빌드하는 최상급 기준을 달성할 수 있음.
  • 이를 돕기 위해 C/C++ 프로젝트의 빌드 스크립트를 모으고 공동으로 관리하는 조직인 All Your Codebase를 만들었음. 원문에는 관련 링크가 (GH, CB)로 표시되어 있음.
  • 코드 동작을 깊이 설계하는 다른 사례로는 효율성 개선, 불필요한 힙 할당 제거, 적절한 퍼징이 있음.

3. 완벽한 소프트웨어를 현실로 만들기

  • 고급 Zig 사용자에게 주는 조언은 열정을 쏟을 프로젝트를 찾아 끝까지 완성하는 것임.
  • 여기서 완벽함은 애플리케이션으로 다루기로 한 범위를 완전히 탐색하고, 사용자에게 제공하는 핵심 기능을 완전히 소유하며, 남은 중요한 비기능적 개선 사항이 없는 상태를 뜻함.
  • 프로젝트 범위에 따라 이 단계에 이르기까지 여러 해의 작업이 걸릴 수 있지만, 여정에 쏟은 노력에 의미를 부여하는 방법임.

결론

  • 설명한 과정은 Zig만의 것이 아니며, 다른 생태계에서도 같은 경로를 따를 수 있음.
  • 다만 Zig는 도구 체인과 커뮤니티 모두 이 여정의 진전을 돕는 데 의도적으로 초점을 맞춤.
  • 도구 체인과 생태계가 아직 완전히 성숙하지는 않았지만, 개인의 성향과 초기 도입자에 가까운 선택을 감수할 의향에 따라 Zig는 더 큰 영향력을 발휘하는 소프트웨어 엔지니어가 되는 가장 좋은 방법일 수 있음.
  • ‘Hello Systems’에서는 Zig 같은 저수준 언어보다 Python으로 기능이 완비된 정적 사이트 생성기를 작성하는 일이 얼마나 더 어려운지 설명함.
  • Markdown을 HTML로 바꾸는 가장 표면적인 기능을 넘어서면 Python의 추상화가 동시성 및 여러 요소를 세밀하게 조정하는 일을 불가능할 만큼 어렵게 만들기 때문임.
  • 고수준 프로그래밍 언어가 언제나 소프트웨어를 만드는 가장 쉬운 방법이라고 믿는 것은 잘못된 생각임.
  • 그런 믿음은 의존성에 지나치게 기대게 만들고, 궁극적으로 기계가 할 수 있는 일의 현실과 멀어지게 함.
  • 시스템을 깊이 이해하는 법을 배우면 의존성을 더 잘 활용할 뿐 아니라 LLM을 더 잘 조종할 수 있음.
  • 처음에는 직관에 어긋나 보일 수 있지만, 의존성이나 에이전트가 제공한 결과물의 품질을 평가하려면 무엇이 가능한지 알아야 한다는 점에서 분명한 사실임.
  • Zigtoberfest 연설을 마치며 Zig 여정에서 잘 나아가고 있다고 느끼는 사람에게 손을 들어 달라고 요청했고, 약 100명이 모인 방의 거의 모든 사람이 자신 있게 손을 듦.
  • 이 순간은 Andrew, 핵심 팀, 행사 주최자 등의 공동 노력이 Zig Software Foundation의 사명을 현실로 만들고 있음을 보여주는 반가운 일이었음.
  • 소프트웨어 엔지니어링에 대한 이해를 넓히는 데 관심 있는 사람은 가까운 Zig Day에 참여하거나 다른 Zig 행사에 참석할 수 있으며, Software You Can Love Vancouver는 다음 달 개최 예정임.
  • 비영리 재단에 대한 후원도 요청함.
  • 자기 계발을 강조하는 메시지를 전하기가 점점 더 어려워지는 시점이며, Zig Software Foundation은 독립성을 유지하고, 지름길 없이 Zig를 완성 단계까지 이끌고, 활기찬 글로벌 커뮤니티를 조성하기 위해 대중의 지원에 의존함.