Skip to content

Fundamentals

  • Published on
    Git 명령을 외우면 매번 검색하게 되지만, 데이터 모델을 알면 명령의 동작이 추론됩니다. 이 글은 blob과 tree와 commit과 tag라는 네 가지 객체, 같은 내용이 언제나 같은 해시를 갖는 콘텐츠 주소 지정, 브랜치가 41바이트짜리 파일에 불과하다는 사실, 그리고 인덱스가 실제로 무엇을 담고 있는지를 cat-file과 ls-files로 직접 열어 보며 확인합니다. 이 모델을 알면 reset이 왜 포인터 이동인지, rebase가 왜 커밋을 옮기지 않고 새로 만드는지, cherry-pick이 왜 충돌하는지, detached HEAD가 무엇인지가 전부 하나의 그림에서 설명됩니다. 마지막으로 SHA-1 충돌 공격에 Git이 어떻게 대응했고 SHA-256 전환이 지금 어디까지 와 있는지 정리했습니다.
  • Published on
    Rob Pike의 유명한 구분 — 동시성은 여러 일을 "다루는" 것이고, 병렬성은 여러 일을 "동시에 하는" 것입니다. 스레드와 이벤트 루프, 경쟁 조건과 데이터 레이스, 뮤텍스와 데드락, 식사하는 철학자, 원자적 연산, 그리고 언제 async(I/O)가 이기고 언제 스레드(CPU)가 이기는지를 정리합니다.
  • Published on
    버그를 노려보며 코드를 이리저리 바꾸는 대신, 과학자처럼 가설을 세우고 예측을 하고 실험으로 검증하는 방법. 문제 공간을 이분 탐색으로 좁히고, 최소 재현 예제를 만들고, git bisect로 범인 커밋을 찾고, 에러 메시지를 실제로 읽는 법까지. 추측을 방법론으로 바꾸는 실전 디버깅 가이드.
  • Published on
    주소창에 URL을 치고 엔터를 누르는 그 1초 사이에 얼마나 많은 일이 일어날까요. URL 파싱부터 DNS 재귀 질의와 캐시, TCP 3-way 핸드셰이크, TLS 핸드셰이크, HTTP 요청과 응답, 그리고 HTML 파싱과 크리티컬 렌더링 경로까지. 브라우저부터 픽셀까지 전 구간을 한 번에 훑는 웹 스택 투어입니다.
  • Published on
    개발자는 코드를 쓰는 시간보다 읽는 시간이 훨씬 많습니다. 그런데 코드 읽기는 아무도 가르쳐 주지 않습니다. 진입점을 찾고, 모든 줄이 아니라 데이터를 따라가고, 테스트와 타입을 문서로 삼고, grep과 IDE 점프로 콜 그래프를 그리고, 직접 돌려 보며 print를 찍고, 뭔가를 바꿔 무엇이 깨지는지 관찰하는 법. 낯선 코드베이스를 빠르게 장악하는 실전 전략.
  • Published on
    "컴퓨터 과학에서 어려운 것은 두 가지, 캐시 무효화와 이름 짓기뿐"이라는 농담에는 진심이 담겨 있습니다. 좋은 이름이 왜 구현이 아니라 의도를 드러내야 하는지, 이름 길이와 스코프의 관계, 헝가리안 표기법을 피해야 하는 이유, 검색 가능성, 불리언·함수·컬렉션 관례, 그리고 이름 바꾸기를 하나의 리팩터링으로 다루는 법까지 정리합니다.
  • Published on
    정규식이 늘 암호처럼 보였다면 이 글로 정리하세요. 문자 클래스, 수량자, 앵커, 그룹, 선택, 룩어라운드까지 구성 요소를 하나씩 쌓고, 탐욕적 매칭과 게으른 매칭의 차이, 파국적 백트래킹과 ReDoS, 그리고 정규식을 쓰면 안 되는 순간(HTML 파싱)까지 짚습니다.
  • Published on
    스택과 힙은 그냥 "메모리의 두 영역"이 아닙니다. 프레임과 LIFO로 움직이는 빠르고 고정된 스택, malloc과 GC가 다스리는 동적인 힙, 그 사이를 잇는 포인터와 참조, 스택 오버플로와 OOM, 값·참조 의미론, 재귀 깊이, 그리고 소유권·GC·수동 관리까지. 프로그램이 실제로 메모리를 어떻게 쓰는지 밑바닥부터 파헤칩니다.
  • Published on
    Big-O 표기가 실제로 무엇을 뜻하는지, 자주 나오는 복잡도 클래스를 현실 예제와 함께, 작은 n이나 캐시 때문에 상수가 이기는 경우, 중첩 루프나 N+1 쿼리에 숨어드는 O(n²), 공간 복잡도, 동적 배열의 분할 상환, 그리고 언제 최적화를 멈춰야 하는지까지. 수학적 엄밀함이 아니라 엔지니어의 직관으로 복잡도를 다룹니다.
  • Published on
    거의 모든 언어에서 0.1 + 0.2가 0.3이 아닌 값을 냅니다. 버그가 아니라 IEEE 754의 설계 결과입니다. 2진 부동소수점이 어떻게 수를 담는지, 왜 10진 소수를 정확히 표현할 수 없는지, 엡실론 비교와 돈 계산은 어떻게 해야 하는지, NaN·무한대·음수 0의 정체와 누적 오차까지, 부동소수점의 진실을 밑바닥부터 풀어냅니다.
  • Published on
    리트코드와 채용 공고 앞에서 느끼는 불안은 사실 좋은 신호입니다. 결국 나를 성장시킨 것은 누가 시켜서가 아니라 내가 찾아서 한 공부였습니다. 커리어를 향한 갈망을 동력으로 바꾸는 법, 그리고 그 과정에서 무너지지 않는 법을 정리합니다.
  • Published on
    바이트, 코드 포인트, 그래핌 클러스터는 서로 다른 층입니다. 왜 이모지 하나의 길이가 거짓말을 하는지, UTF-8·16·32는 무엇이 다른지, NFC/NFD 정규화와 é 문제, ZWJ로 엮인 이모지, 서로게이트 페어, 그리고 문자열 뒤집기가 왜 깨지는지까지 텍스트 인코딩의 지뢰밭을 한글·일본어 사용자 관점에서 깊이 파헤칩니다.
  • Published on
    UTC로 저장하고 로컬로 표시하라. epoch와 ISO 8601, 오프셋과 타임존(IANA tz 데이터베이스)의 결정적 차이, 서머타임이 만드는 빈 시간과 겹치는 시간, 윤초, 절대 믿으면 안 되는 클라이언트 시계, 그리고 날짜와 순간의 구분까지. 시간을 다루는 개발자가 반드시 알아야 할 원칙을 실무 관점에서 정리합니다.
  • Published on
    Git을 매일 쓰면서도 내부가 어떻게 생겼는지는 모르는 경우가 많습니다. blob·tree·commit·tag로 이루어진 객체 모델, SHA 해시로 내용을 주소화하는 방식, 커밋 DAG, 브랜치는 그냥 포인터라는 사실, .git 디렉터리의 실제 모습, 같은 내용이 한 번만 저장되는 이유, 그리고 팩파일까지. Git의 진짜 데이터 모델을 파헤칩니다.
  • Published on
    하루는 24시간이다, 1분은 60초다, 시계는 앞으로만 간다, 타임존은 고정된 오프셋이다. 프로그래머가 시간에 대해 당연하게 믿는 이 명제들은 전부 거짓입니다. 유명한 "시간에 관한 거짓말" 목록을 하나씩, 각각에 실제로 터졌던 버그를 붙여 풀어 봅니다.