RSS가 ICE를 이긴 방법: 단순함이 복잡성을 압도하다

2025-09-08
RSS가 ICE를 이긴 방법: 단순함이 복잡성을 압도하다

이 글은 콘텐츠 공유 프로토콜인 RSS와 ICE의 경쟁 이야기를 다룹니다. 마이크로소프트와 어도비 같은 거대 기업의 지원을 받은 ICE는 뛰어난 기능을 제공했지만 매우 복잡하고 폐쇄적이었습니다. 반면 넷스케이프에서 시작된 RSS는 단순하고 사용하기 쉬웠으며, 개방적인 성격 덕분에 번성했습니다. 결국 RSS의 단순함과 수많은 블로거와 개발자들의 기여로 더 강력한 ICE를 제압하고 콘텐츠 통합의 업계 표준이 되었습니다. 이는 “단순함이 복잡성을 압도한다”는 인터넷 속담을 다시 한번 증명합니다.

더 보기

왜 저는 Markdown보다 reStructuredText를 선호하는가

2025-08-18
왜 저는 Markdown보다 reStructuredText를 선호하는가

이 글에서는 저자가 기술 서적을 작성할 때 Markdown보다 reStructuredText(rST)를 선호하는 이유를 설명합니다. rST는 추상적인 문서 트리의 중간 무게 표현으로, Markdown의 경량 접근 방식에 비해 뛰어난 확장성과 사용자 정의 기능을 제공합니다. 저자는 이미지 생성 및 연습 문제 처리의 예를 통해 rST의 사용자 정의 지시어와 문서 트리 변환을 사용하여 Markdown에서는 달성하기 어려운 복잡한 문서 구조와 기능을 구현할 수 있음을 보여줍니다. rST의 구문이 Markdown만큼 직관적이지 않다는 것을 인정하면서도, 저자는 대규모 문서 처리, 특히 사용자 정의 확장 및 변환이 필요한 경우(저자의 책 "프로그래머를 위한 논리" 등)에 그 강력한 기능을 높이 평가합니다.

더 보기
개발 기술 저술

JavaScript 런타임의 폭발적 증가: 10년간의 혁신

2025-07-28
JavaScript 런타임의 폭발적 증가: 10년간의 혁신

지난 10년 동안 새로운 JavaScript 런타임과 엔진이 폭발적으로 증가하여 다양한 환경에서 JavaScript를 실행할 수 있게 되었으며, 작업별 최적화가 눈에 띄게 향상되었습니다. 이를 통해 JavaScript는 클라우드, 에지 컴퓨팅, 스마트 TV, 모바일 기기, 그리고 마이크로컨트롤러까지 진출했습니다. 이 글에서는 이러한 다양성의 원동력과 단일 런타임이나 엔진으로 모든 요구 사항을 충족할 수 없는 이유를 살펴봅니다. 에지 컴퓨팅의 부상과 마이크로컨트롤러를 위한 저리소스 엔진부터 다른 언어와의 상호 운용성을 용이하게 하는 폴리글롯 엔진, 그리고 네이티브 앱 개발에서의 광범위한 사용까지, JavaScript 런타임은 놀라운 적응력과 역동적인 성장을 보여줍니다. 이 글에서는 Node.js, Deno, Cloudflare Workers, Bun, React Native, NativeScript 등 다양한 런타임과 엔진을 자세히 설명하고, 이들의 기반 기술과 발전 과정을 개괄합니다.

더 보기
개발

캐싱: 최적화가 아닌 추상화

2025-07-04
캐싱: 최적화가 아닌 추상화

일반적인 생각으로는 캐싱은 소프트웨어 속도를 높이는 도구입니다. 하지만 저자는 이것이 캐싱 기능의 일부일 뿐이라고 주장합니다. 객체 저장소, 디스크, 메모리 간 데이터 이동 작업 후 저자는 캐싱의 더 중요한 역할은 소프트웨어를 단순화하는 것이라고 말합니다. 이 글에서는 미리 만들어진 캐싱 알고리즘(LRU, LFU 등)의 한계를 탐구하고 캐싱은 기반 저장소 세부 정보를 숨기고 프로그래머가 데이터 계층 위치를 신경 쓰지 않도록 하는 추상화 계층으로 작동한다고 제안합니다. 데이터베이스와 OS의 캐싱 메커니즘은 이 추상화의 예시입니다. OS 페이지 캐시나 fsync 오용과 같은 문제가 발생할 수 있지만 이는 캐싱을 포기해야 하는 이유가 아니라 캐싱을 더 잘 이해하고 사용해야 함을 의미합니다.

더 보기
개발

고독의 유행병: 집을 나서라는 외침

2025-06-29
고독의 유행병: 집을 나서라는 외침

이 글은 현대 사회에 만연한 고독 문제를 다루며, 집을 나서는 것이 이를 해결하는 중요한 열쇠라고 주장합니다. 저자는 개를 키우고 개 공원에서 지역 사회 활동에 참여한 경험을 관계 형성의 주요 사례로 제시합니다. 보도와 같은 도시 인프라가 지역 사회를 육성하는 데 중요함을 강조합니다. 이 글은 후기 자본주의가 고독으로부터 이익을 얻고 악화시키는 것을 비판하며, 독자들에게 적극적으로 지역 사회에 참여하고 인간 관계를 경험하도록 촉구합니다.

더 보기
기타

SMT를 사용한 LinkedIn 퀸 문제 해결: SAT보다 쉽다!

2025-06-12
SMT를 사용한 LinkedIn 퀸 문제 해결: SAT보다 쉽다!

이 게시물에서는 추가적인 지역 제약 조건이 있는 고전적인 N-퀸 문제의 변형인 'LinkedIn 퀸' 퍼즐을 SMT 솔버 Z3를 사용하여 해결하는 방법을 자세히 설명합니다. 저자는 정수 변수와 제약 조건을 활용한 SMT에서의 문제 표현이 많은 부울 절을 필요로 하는 동등한 SAT 표현보다 훨씬 더 간단하다는 것을 보여줍니다. SMT 솔버는 Glucose와 같은 고도로 최적화된 SAT 솔버보다 느릴 수 있지만, 인코딩의 용이성 때문에 많은 사람들에게 SMT가 선호됩니다. 이 게시물에는 완벽한 코드와 모델의 정확성을 검증하기 위한 유용한 정상성 확인이 포함되어 있습니다. 이것은 업계가 SAT를 직접 사용하는 대신 SAT로 컴파일하는 도구를 선호하는 이유에 대한 설득력 있는 설명을 제공합니다.

더 보기
개발 SMT 솔버

결정 불가능성: 프로그래머의 판도라의 상자

2025-05-28
결정 불가능성: 프로그래머의 판도라의 상자

이 글에서는 컴퓨터 과학에서 '결정 불가능성' 개념을 쉽게 설명합니다. 간결한 언어와 구체적인 예시(예: 어떤 숫자가 두 소수의 합인지 판별)를 사용하여 결정 문제와 튜링 머신의 역할을 설명합니다. 중요한 점은 결정 불가능성이 프로그램이 중지할지 여부를 판단할 수 없다는 의미가 아니라, 모든 프로그램의 중지 여부를 판단할 수 있는 보편적인 알고리즘이 존재하지 않는다는 의미입니다. 따라서 많은 문제(예: 프로그램 속성 검증)는 엄청난 노력이 필요하며 해결할 수 없을 가능성도 있습니다. 이는 형식적 검증 및 프로그램 분석과 같은 분야의 필요성을 시사합니다.

더 보기
개발

프로퍼티 기반 테스트: 복잡한 입력에 대한 단위 테스트의 우월성

2025-05-21
프로퍼티 기반 테스트: 복잡한 입력에 대한 단위 테스트의 우월성

이 글에서는 프로퍼티 기반 테스트(PBT)와 기존 단위 테스트의 장단점을 논의합니다. 저자는 단일 입력 함수에는 단위 테스트로 충분하지만, 다중 입력 함수의 에지 케이스 조합 폭발로 인해 랜덤 입력 생성을 하는 PBT가 숨겨진 에지 케이스 오류를 발견하는 데 뛰어나다고 주장합니다. 하지만 PBT에는 학습 곡선이 있으며, 복잡한 입력 생성 전략을 익히는 것이 중요합니다. 대부분의 PBT 예시는 복잡한 입력 공간을 다루는 PBT의 진정한 능력을 보여주기에는 너무 단순합니다.

더 보기

미국 우정청의 이메일 도전: E-COM의 부흥과 몰락

2025-05-14
미국 우정청의 이메일 도전: E-COM의 부흥과 몰락

이메일의 위협에 직면한 미국 우정청은 1982년 E-COM 서비스를 시작하여 이메일을 인쇄하여 우편 배달원을 통해 배달하는 시도를 했다. 초기에는 성공을 거두었지만, 높은 비용, 복잡한 절차, 유연성 부족으로 인해 1985년에 실패로 끝나 4천만 달러 이상의 손실을 입었다. 그러나 E-COM은 '이메일'이라는 용어의 보급에 기여했으며, 우정청의 기술 변화에 대한 대응을 보여주는 사례이다.

더 보기

미국의 식품 안전: 거짓과 역사와의 싸움

2025-04-30
미국의 식품 안전: 거짓과 역사와의 싸움

이 기사는 과학 저널리스트 데보라 블룸과의 인터뷰를 통해 미국의 식품 안전 현황과 역사를 탐구합니다. 블룸은 정보 과잉과 정부 규제 완화 속에서 미국 시민들이 식품 안전 위험에 직면해 있으며, 19세기 식품 조작 문제가 다시 수면 위로 떠오르고 있다는 점을 지적합니다. 그녀는 자신의 저서 '독극물 부대'를 예로 들어 1906년 순수 식품 의약품법 제정 과정과 화학자 하비 와일리가 '독극물 부대' 실험으로 식품 안전 문제를 폭로한 경위를 설명합니다. 블룸은 식품 안전에 대한 국민적 관심을 촉구하는 동시에 식중독 문제를 개인 책임으로 돌리는 개인주의적 사고방식을 비판하며, 정부가 기본적인 권리를 보장해야 할 책임을 강조합니다.

더 보기

요구사항은 변화를 거듭한다: 형식적 방법과 시스템 진화

2025-04-28
요구사항은 변화를 거듭한다: 형식적 방법과 시스템 진화

이 글은 소프트웨어 개발 과정에서 끊임없이 변화하는 요구사항에 어떻게 대처해야 하는지에 대한 논의를 펼칩니다. 잦은 변경이 있는 경우 사전에 대규모 형식적 모델링을 하는 것은 비현실적일 수 있지만, 시스템이 일정 규모에 도달하거나 아키텍처 변경(단계 전환)이 발생하면 형식적 방법이 필수적이 됩니다. 형식적 사양 및 검증을 통해 개선이 기존 기능을 손상시키는 것을 방지합니다. 동기 업데이트에서 비동기 업데이트로 전환하는 예를 통해 형식적 방법이 기존 요구사항을 새로운 시스템이 충족하는지 검증하는 방법을 보여주고 소프트웨어 유지보수의 중요성과 기능의 무음 실패 방지를 강조합니다.

더 보기

논리로 Blue Prince의 명제적 살롱 퍼즐 풀기

2025-04-21
논리로 Blue Prince의 명제적 살롱 퍼즐 풀기

이 기사에서는 명제 논리를 사용하여 게임 Blue Prince의 논리 퍼즐을 자동으로 푸는 방법을 자세히 설명합니다. 이 퍼즐은 세 개의 상자(파란색, 흰색, 검은색)가 있으며, 각 상자는 진술을 하고, 적어도 하나의 상자가 완전히 참이고, 적어도 하나의 상자가 완전히 거짓이며, 상품은 정확히 하나의 상자에 있다는 규칙이 있습니다. 저자는 이 문제를 명제 논리로 모델링하고, 완전 탐색 접근 방식을 사용하여 모든 만족할 만한 할당을 찾아 상품의 위치를 결정합니다. 이 기사에는 JavaScript 구현과 코드 최적화에 대한 논의가 포함되어 있습니다.

더 보기
게임

구글의 AMP for Email: 대담한 실패

2025-04-18
구글의 AMP for Email: 대담한 실패

구글은 AMP(Accelerated Mobile Pages) 기술을 이용해 호텔 예약이나 구글 문서 댓글에 직접 답장하는 등 이메일 내에서 직접적인 상호 작용을 가능하게 하는 이메일 경험을 혁신하려고 시도했습니다. 하지만 이 시도는 결국 실패했습니다. 이 글에서는 AMP for Email의 실패 원인으로 개발의 복잡성, 낮은 호환성, 이메일의 본질적 특성과의 모순 등을 분석합니다. 구글의 강제적인 추진에 대한 개발자들의 불신도 실패의 한 원인입니다. 상호 작용하는 이메일이 불가능한 것은 아니지만, 단순성과 신뢰성을 희생하지 않고 호환성과 지속성을 우선시해야 합니다. 이메일의 오랜 성공은 단순성과 분산화에 있습니다.

더 보기
기술

NP를 넘어서: 더 직관적인 복잡도 문제

2025-04-17
NP를 넘어서: 더 직관적인 복잡도 문제

저자는 정지 문제를 NP-완전보다 어려운 문제의 전형적인 예로 사용하는 것에 이의를 제기하며, 그것이 혼란을 야기하고 직관적이지 않다는 점을 주장합니다. 결정 불가능하지만, "예"라는 답변의 검증은 프로그램을 유한 단계 실행함으로써 수행할 수 있습니다. 더 이해하기 쉬운 대안으로, 무한 그리드에서 토큰을 이동시켜 목표 지점에 도달할 수 있는지 여부를 판단하는 문제가 제시됩니다. 이 문제는 저차원에서는 PSPACE-완전하지만, 차원의 증가에 따라 복잡성이 폭발적으로 증가하여, 결국 아커만 완전에 도달합니다. 이것은 NP 문제를 훨씬 넘어서는 복잡성을 시각적으로 보여줍니다.

더 보기

Prolog을 사용하여 Layton 퍼즐을 우아하게 푸는 방법

2025-04-08
Prolog을 사용하여 Layton 퍼즐을 우아하게 푸는 방법

저자는 자신의 책 "프로그래머를 위한 논리"에서 논리 프로그래밍 언어에 대한 장을 다시 작성하면서 'Layton 스타일' 퍼즐을 사용하여 Prolog의 강력함을 보여주었습니다. 이 퍼즐은 처음 세 명의 학생 점수를 바탕으로 네 번째 학생의 점수를 추론하는 것입니다. 간결한 Prolog 코드(단 15줄!)를 사용하여 저자는 Prolog의 패턴 매칭과 양방향성을 이용해 이 문제를 우아하게 해결하고, 모든 가능한 정답 키를 찾아 최종적으로 네 번째 학생의 점수가 6점임을 밝혀냈습니다. 더 길고 비효율적인 솔루션과의 비교도 제시됩니다. 저자는 퍼즐을 교육에 사용하는 것에 반대하지만, 이 예시는 Prolog의 실용적인 잠재력을 보여줍니다.

더 보기
개발 퍼즐 풀이

KV 데이터베이스 구축을 중단해야 할 때

2025-03-25
KV 데이터베이스 구축을 중단해야 할 때

저자는 Key-Value 데이터베이스가 지나치게 단순하고 표현력이 부족하여 사용하기 어렵다고 비판합니다. 저장 엔진 공급업체들 사이에서 인기가 있지만, KV 데이터베이스는 적절한 데이터 모델을 구축하기 위한 기본 구성 요소일 뿐이며, 사용자는 처음부터 데이터 모델을 구축해야 하며, 종종 최적이 아닌 결과를 얻게 됩니다. 저자는 타협안으로, 형식화된 레코드를 갖는 임베디드 데이터베이스를 제안합니다. 논리 스키마와 물리적 스키마를 분리하지만, 쿼리는 물리적 스키마에 대해 작성됩니다. 이렇게 하면 복잡한 쿼리 플래너가 필요 없어지고, 비동기 스키마 변경 및 레이아웃 전환이 지원됩니다. 이러한 접근 방식은 데이터의 독립성과 임베디드 시스템에 필요한 단순성을 조화시키고, 간단한 KV 스토어와 본격적인 관계형 데이터베이스의 복잡성 모두에 대한 매력적인 대안을 제공합니다.

더 보기
개발

검증 우선 개발: 테스트 주도 개발을 넘어서

2025-03-18
검증 우선 개발: 테스트 주도 개발을 넘어서

이 글에서는 코드를 작성하기 전에 검증 메커니즘을 구축하는 것을 강조하는 패러다임인 검증 우선 개발(VFD)을 탐구합니다. 여기에는 테스트 작성, 형식 불변량 정의, 계약 추가 등 다양한 방법이 포함될 수 있습니다. VFD는 테스트 주도 개발(TDD)과 다릅니다. TDD는 VFD의 특수한 경우이며 테스트를 사용하여 코드 디자인을 주도하는 데 중점을 둡니다. VFD의 장점으로는 검증을 건너뛸 가능성 감소, 조기 오류 감지, 코드 품질 향상 등이 있습니다. 그러나 VFD에는 단점도 있습니다. 개발 속도 저하, 탐색적 코딩 방해, 검증 방법이 코드 디자인에 영향을 미칠 가능성 등입니다. 저자는 VFD가 패러다임이 아니라 기법으로서 더 유연하며 다른 접근 방식과 쉽게 통합될 수 있다고 주장합니다.

더 보기
개발 검증 우선

5가지 비결정론: 형식적 방법론에서 얻은 실용적 통찰

2025-02-20
5가지 비결정론: 형식적 방법론에서 얻은 실용적 통찰

이 글에서는 시스템 모델링에서 나타나는 5가지 비결정론, 즉 진정한 무작위성, 동시성, 사용자 입력, 외부 요인, 추상화를 탐구합니다. 저자는 실제 예시를 사용하여 각 유형을 명확하게 설명합니다. 진정한 무작위성은 의사 난수 생성기를 사용하여 시뮬레이션되는 경우가 많지만, 모델링에서는 일반적으로 비결정적 선택으로 처리됩니다. 동시성은 비결정론의 주요 원인 중 하나이며, 상태 공간 폭발로 인해 특별한 처리가 필요합니다. 사용자 입력과 외부 요인은 비결정적 외부 영향으로 간주됩니다. 중요한 점은 추상화를 통해 복잡한 결정론적 프로세스가 비결정적 선택으로 단순화되어 모델이 간소화되고 잠재적 오류에 대한 민감도가 높아진다는 것입니다. 이는 비결정론과 소프트웨어 개발에서의 응용을 이해하는 데 귀중한 통찰력을 제공합니다.

더 보기

효율성 vs. 수평적 확장성: 불가피한 절충?

2025-02-12
효율성 vs. 수평적 확장성: 불가피한 절충?

이 글은 소프트웨어 효율성과 수평적 확장성 간의 긴장 관계를 탐구합니다. 저자는 확장성에 최적화된 소프트웨어는 단일 머신 환경에서 종종 성능이 저하되고 그 반대의 경우도 마찬가지라고 주장합니다. 이는 암달의 법칙, 조정 오버헤드, 공유 리소스의 제한 때문입니다. 효율적인 알고리즘은 시스템과 문제에 대한 가정에 의존하는 경우가 많으며, 수평적 확장을 수행하면 이러한 가정이 더 이상 유효하지 않을 수 있습니다. 저자는 문화적 요소와 작업 유형이 선택에 영향을 미치는 점에 대해서도 논의하며, Tigerbeetle 데이터베이스와 CPython의 GIL 등의 예를 제시합니다. 결론적으로 문제와 환경에 대한 깊이 있는 이해가 높은 효율성과 확장성을 달성하는 열쇠입니다.

더 보기
개발

정규 표현식 앵커의 흥미로운 역사: `$`와 `^`는 왜 사용될까요?

2025-01-21
정규 표현식 앵커의 흥미로운 역사: `$`와 `^`는 왜 사용될까요?

이 글에서는 정규 표현식에서 `$`와 `^`를 줄 앵커로 사용하는 역사적 기원을 살펴봅니다. QED 텍스트 에디터로 거슬러 올라가면 `$`는 처음에 버퍼의 끝을 나타냈고, 나중에 Ken Thompson에 의해 정규 표현식에서 줄의 끝을 나타내는 것으로 적용되었습니다. `^`의 선택은 당시 일반적으로 사용되던 Teletype Model 35 타자기의 제한된 문자 집합과 `^`가 ASCII-67에 이미 존재했기 때문일 가능성이 높습니다. 이는 영리한 설계라기보다는 당시 하드웨어와 문자 집합의 제약으로 인한 결과이며, 정규 표현식의 관례가 되었습니다.

더 보기
개발

수학적 모델링이 드러낸 드레이들 게임의 최악

2024-12-18
수학적 모델링이 드러낸 드레이들 게임의 최악

작년에 저자는 확률적 모델링 언어인 PRISM을 사용하여 전통적인 휴일 게임인 드레이들을 모델링하여 재미없다는 것을 증명했습니다. 올해는 게임이 끝날 때까지 시뮬레이션하도록 모델을 개선했습니다. 새로운 모델은 첫 번째 플레이어만 제거하는 이전의 결함을 수정하고 베팅과 플레이어 제거에 대한 계산 로직을 개선했습니다. 모델 시뮬레이션을 통해 저자는 평균적으로 4명의 플레이어가 있는 게임은 끝나는 데 760번의 회전이 걸리며, 가장 긴 경우 6시간을 초과할 수 있다는 것을 발견했습니다. 이는 드레이들 게임이 길고 지루하며 짜증 난다는 것을 충분히 증명합니다.

더 보기