코드 리딩: 버그 사냥의 초능력

2025-09-08

이 글에서는 저자의 커리어에서 중요한 변화, 즉 반복적인 코딩에서 버그를 사전에 찾는 방식으로의 전환에 대해 설명합니다. 테스트 주도 개발의 반복에만 의존하는 대신, 코드를 주의 깊게 읽어 미리 문제를 파악하는 것을 주장합니다. 저자는 코드를 신중하게 읽고, 프로그램의 완벽한 멘탈 모델을 구축한 후, 해당 모델과 Git의 실제 코드 간의 차이점을 파악하는 것이 중요하다고 주장합니다. 이 글에서는 제어 흐름과 데이터 구조에 집중하고, 코드 내에서 잠재적인 오류가 발생하기 쉬운 패턴을 식별하는 것을 제안합니다. 이러한 접근 방식을 통해 버그를 크게 줄이고 코드 품질을 향상시킬 수 있습니다.

더 보기

우아한 재시도 루프: 중복 및 예기치 않은 대기 회피

2025-08-27

저자는 재시도 횟수를 명확하게 제한하고, 마지막 시도 후 불필요한 대기를 피하며, 재시도 실패 시 원래 오류를 보고하고, 코드 중복을 피하는 우아한 재시도 루프 작성 방법을 탐구합니다. 여러 가지 접근 방식을 비교하여 최종적으로 종료를 보장하기 위한 상한이 있는 `try while` 루프를 채택함으로써 이전 솔루션의 경계 문제와 잠재적인 무한 루프 위험을 해결합니다. 최종 솔루션은 완벽하지 않지만 이전 시도에 비해 간결성과 견고성이 크게 향상되었습니다.

더 보기
개발

Zig의 영리한 기법: 부분 일치 열거형

2025-08-09

Zig는 열거형의 부분 일치를 처리하는 우아한 방법을 제공하여 중복 코드와 런타임 패닉을 방지합니다. 이 글에서는 `inline`과 `comptime unreachable`을 사용하는 영리한 기법을 자세히 설명하며, 이를 통해 컴파일러가 컴파일 시 불필요한 `else` 분기를 검사하여 코드의 안정성과 가독성을 향상시킵니다. 많은 열거형 변형을 처리할 때 특히 유용하며 코드 로직을 크게 단순화합니다.

더 보기

`font-size-adjust`의 오해와 진정한 유용성

2025-07-26

이 글에서는 CSS 속성 `font-size-adjust`에 대한 일반적인 오해에 대해 논박합니다. 저자는 `font-size`가 글리프를 둘러싼 상자의 크기를 지정하는 것이지 글리프 자체의 크기를 지정하는 것이 아니라고 주장합니다. 따라서 서로 다른 글꼴 간에 크기가 일치하지 않는 문제가 발생합니다. 글꼴 대체에만 초점을 맞추는 대신 `font-size-adjust`는 페이지의 다양한 글꼴에서 더 일관된 크기를 보장하는 데 사용할 수 있습니다. 저자는 더 나은 타이포그래픽 일관성을 위해 CSS 리셋에서 `ex-height 0.53`으로 설정할 것을 권장합니다.

더 보기
개발

미니멀리스트 RSS 리더: Deno를 사용하여 맞춤형 블로그 피드 만들기

2025-06-26

과도하게 복잡한 RSS 리더에 지치셨나요? 저자는 Deno와 간단한 텍스트 파일을 사용하여 자신만의 RSS 리더를 구축하는 독창적인 방법을 선택했습니다. 최신 3개 게시물의 제목과 링크만 표시하며, 로컬 전체 텍스트 저장이나 읽음/읽지 않음 상태를 관리하지 않습니다. GitHub Actions를 통해 매일 자동으로 업데이트됩니다. 코드는 간결하고 이해하기 쉽고 확장성이 뛰어나 미니멀리스트에게 완벽합니다.

더 보기
개발

빠른 Rust 빌드: 10분 미만 CI의 비결

2025-06-20

Rust의 컴파일 속도가 느리다는 것은 흔한 불만이지만, 저자는 대부분의 Rust 프로젝트가 실제보다 훨씬 느리게 컴파일된다고 주장합니다. rust-analyzer(20만 줄의 코드와 100만 줄의 의존성)를 예로 들어 GitHub Actions에서 8분의 CI 파이프라인을 달성했습니다. 이 글에서는 CI 캐싱 활용, CI 작업 분할, 증분 컴파일 및 디버그 정보 비활성화, 의존성 감소, `cargo build -Z timings`를 사용한 프로파일링, 그리고 crate 경계에서 과도한 제네릭 인스턴스화를 피하기 위한 코드 설계 등 빌드 시간 최적화 전략을 자세히 설명합니다. 저자는 빌드 시간이 개발자 생산성에 미치는 영향을 강조하고, 대규모 Rust 프로젝트의 CI 시간을 합리적인 범위(예: 약 10분)로 유지하기 위해 빌드 시간을 정기적으로 최적화할 것을 권장합니다.

더 보기

오픈소스의 조정 문제: Linux 데스크톱과 LSP에서 얻는 교훈

2025-06-20

저자는 NixOS와 KDE 애플리케이션에 대한 자신의 경험을 바탕으로 Linux 데스크톱 환경에서 오픈소스 소프트웨어 조정의 어려움을 논의합니다. Linux 데스크톱에는 통합된 API 표준이 없기 때문에 소프트웨어 생태계가 분열되어 "에셔식 영구 기관"처럼 되어 있다고 지적합니다. 이는 10년 전 마이크로소프트가 출시한 Language Server Protocol(LSP)과 대조적입니다. LSP의 구현은 평범했지만, 그 존재 자체가 IDE 기능 조정 문제를 해결하고 업계 발전을 촉진했습니다. 저자는 오픈소스 커뮤니티의 조정 능력 부족으로 LSP 이전에 통합된 IDE 프로토콜을 개발할 기회를 놓쳤다고 주장합니다. 그러나 Linux의 성공은 POSIX가 제공하는 미리 정의된 API 표준 덕분이며, 조정의 어려움을 줄였습니다. 이 글은 오픈소스 커뮤니티의 조정 메커니즘과 소프트웨어 생태계 개발 모델에 대한 성찰을 촉구합니다. 카테고리: 기술

더 보기
기술

효율적인 코드를 위한 두 가지 경험칙

2025-05-17

이 글에서는 코드 효율을 높이기 위한 두 가지 실용적인 팁을 소개합니다. `if` 조건문을 위로 이동하고 `for` 루프를 아래로 이동하는 것입니다. `if` 조건문을 호출 함수로 이동하면 분기가 줄어들고 제어 흐름이 단순해지며 가독성이 향상됩니다. `for` 루프를 일괄 데이터가 처리되는 곳으로 이동하면 일괄 처리의 이점을 활용하여 성능이 향상되고 벡터화가 가능해질 수 있습니다. 이 두 가지 팁은 상호 보완적인 관계에 있으며, 특히 대량의 데이터를 처리하는 경우 코드 효율을 효과적으로 높입니다.

더 보기
개발

스칼라 선택을 넘어서: 효율성을 위한 이벤트 스트림의 일괄 처리

2025-05-15

저자는 상태를 유지하는 서비스 설계에서 스칼라 선택 안티 패턴의 비효율성을 설명하고 있으며, LSP 서버를 예로 들고 있습니다. 이벤트를 하나씩 처리하면 지연과 리소스 낭비로 이어집니다. 제안된 해결책은 이벤트 스트림의 일괄 처리입니다. `batch_stream` 함수는 수신 이벤트를 일괄로 병합하여 효율성을 크게 향상시킵니다. 낮은 부하에서는 단일 이벤트 처리처럼 동작하지만, 높은 부하에서는 오버헤드를 크게 줄이고 성능을 향상시킵니다.

더 보기
개발

Zig의 컴파일 타임 메타 프로그래밍: 강력하지만 제한적인 접근 방식

2025-04-20

Zig의 comptime 기능은 제네릭, 조건부 컴파일 등의 기능으로 유명합니다. 하지만 의도적으로 제한적이며, 동적 코드 생성, 사용자 정의 구문 확장, 런타임 형식 정보(RTTI), I/O는 허용하지 않습니다. 이 글에서는 이러한 제한의 이유를 탐구하고, Zig가 부분 평가와 형식 특수화를 통해 효율적이고 이해하기 쉬운 메타 프로그래밍을 구현하는 방법을 보여줍니다. 사용자 정의 출력 함수 예제를 통해 RTTI에 의존하지 않고 형식 안전한 런타임 리플렉션을 수행하는 방법을 보여줍니다. 이 글은 Zig의 메타 프로그래밍에서 독특한 우아함을 칭찬하며 마무리됩니다. 다른 대안보다 강력하지는 않지만, 실제로는 매우 효율적이고 사용하기 쉽습니다.

더 보기
개발

디버거를 REPL로 활용하기: IntelliJ IDEA의 Run to Cursor와 Quick Evaluate Expression

2025-03-28

저자는 기존 디버거, 특히 gdb와 lldb가 네이티브 코드 디버깅에서 보여주는 한계에 지쳐 있었습니다. IntelliJ IDEA의 'Run to Cursor'와 'Quick Evaluate Expression' 기능을 결합하여 디버거를 강력한 REPL 환경으로 변신시키는 방법을 발견했습니다. 'Run to Cursor'로 커서 위치까지 프로그램을 실행하고, 'Quick Evaluate Expression'으로 현재 스택 프레임에서 표현식(새로 입력한 코드도 가능)을 평가할 수 있습니다. 이는 한 줄씩 단계별로 실행하는 기존 방식을 에디터 내에서 더욱 실험적인 2차원적 상호 작용으로 대체하여 코드 완성 기능을 활용하고 디버깅 효율을 크게 향상시킵니다.

더 보기
개발

스크립트에서 긴 옵션 사용하기

2025-03-22

많은 명령줄 유틸리티는 짧은 옵션(-f)과 긴 옵션(--force)을 모두 지원합니다. 짧은 옵션은 대화형 사용에 편리하지만, 긴 옵션은 스크립트에서 훨씬 더 뛰어납니다. 가독성 향상과 자체 설명적인 특성으로 유지 관리성과 이해도가 향상됩니다. 예를 들어 Git에서는 `git switch --create release-{today} origin/main`이 `git switch -c my-new-branch`보다 훨씬 명확하며, 특히 복잡한 스크립트에서 그렇습니다.

더 보기
개발 긴 옵션

하드코어 Rust: 동적 메모리 할당 없는 광선 추적기

2025-01-30

이 글에서는 최소한의 인위적으로 제한된 API(동적 메모리 할당 없음)만 사용하여 Rust 애플리케이션을 작성하는 사례 연구를 설명합니다. 저자는 RAII(Resource Acquisition Is Initialization)가 지저분한 리소스 관리로 이어진다고 비판하며, "하드코어 모드"를 제안합니다. 이는 프로그램을 `std` 바이너리와 `#![no_std] no_alloc` 라이브러리로 분할하여 바이너리만 OS에서 직접 리소스를 요청하도록 허용하는 것입니다. 장난감 광선 추적기를 예로 사용하여 저자는 이 "하드코어 모드"에서 픽셀 버퍼, 병렬 처리, 메모리 할당기, 장면 파싱을 처리하는 방법을 자세히 설명하고, 궁극적으로 동적 메모리 할당 없이 광선 추적기를 구현합니다.

더 보기
개발

불변량: 올바른 코드를 작성하기 위한 강력한 도구

2025-01-12

이 글에서는 프로그래밍에서 '불변량'의 개념과 그 응용에 대해 탐구합니다. 삽입 지점을 계산하는 이진 검색 변형이라는 작은 예시부터 시작하여 불변량을 정의하고 유지하는 것이 올바른 코드로 이어지는 방법을 보여줍니다. 이 글에서는 불변량이 시스템의 동적 진화 과정 전반에 걸쳐 항상 참인 속성이며, 여러 실행 경로를 고려하는 것으로 인한 복잡성을 피함으로써 추론을 단순화한다고 설명합니다. Cargo, rust-analyzer, TigerBeetle과 같은 프로젝트의 예시는 유지 관리 향상이나 성능 향상 등 대규모 시스템에서 불변량을 사용하는 이점을 보여줍니다. 저자는 소규모와 대규모 프로그래밍 모두에서 불변량의 중요성을 요약하고 올바르고 효율적인 코드를 작성하는 데 있어서 그 가치를 강조하며 결론짓습니다.

더 보기

혁신적인 아이디어: Magit 원칙을 jj 버전 관리 시스템에 적용하기

2024-12-13

저자는 참신한 접근 방식을 제안합니다. 바로 Emacs의 Magit 버전 관리 인터페이스(텍스트 파일을 UI로 사용)를 신흥 jj 버전 관리 생태계에 적용하는 것입니다. 이 글에서는 Magit의 텍스트 기반 UI가 효율성과 이식성을 제공한다는 점을 강조합니다. LSP 프로토콜을 활용하면 다양한 에디터에서 Magit과 유사한 환경을 구현할 수 있으므로 중복 개발을 피할 수 있습니다. 저자는 특정 텍스트 파일(예: .jj/status.jj)을 생성하고 LSP의 의미 토큰, 접기 범위, 정의로 이동 등의 기능을 사용하여 Magit과 유사한 버전 관리 작업을 수행할 수 있을 것으로 예상합니다. 최종 목표는 jj 버전 관리를 위한 효율적이고 크로스 플랫폼 사용자 인터페이스를 만드는 것입니다.

더 보기
개발