Lobsters

Small Programming Tricks

작은 프로그래밍 팁들이 만드는 큰 차이 — 일상 생산성을 높이는 지식 조각들

엔지니어링 생산성의 상당 부분이 거창한 이론이 아니라 작은 지식 조각에서 나온다는 에세이입니다. fzf·ripgrep·git pickaxe·EXPLAIN ANALYZE 같은 즉시 쓸 수 있는 팁을 소개하고, 회사에서도 이런 지식을 하루 하나씩 공유하는 방식을 제안합니다.

본문

저자 Will Keleher는 일상의 엔지니어링 생산성에서 의외로 큰 비중을 차지하는 것이 '작은 지식 조각(nugget)'이라고 주장합니다. 어떤 언어 기능이 존재한다는 사실을 아는 것, 설명되지 않는 TCP 지연이 대개 TCP_NO_DELAY 설정과 Nagle 알고리즘 때문임을 아는 것, 곤란한 상황을 벗어나게 해주는 git 명령이나 sed 요령 같은 것들입니다. 물론 모든 지식이 작은 조각으로 이루어진다는 점은 자명하지만, 그중에는 별도의 배경 지식 없이 바로 쓸 수 있어 특히 가치 있는 조각이 있다고 말합니다. 예컨대 Python을 전혀 몰라도 python3 -m http.server로 디렉터리에 간단한 서버를 띄울 수 있고, 그것만으로 작업이 조금 더 쉬워집니다.

셸과 터미널 팁

Ctrl+R로 셸 히스토리를 검색할 수 있다는 것은 많이 알려져 있지만, fzf를 설치하면 Ctrl+R이 퍼지 검색(fuzzy search)으로 바뀝니다. 더 나아가 atuin은 셸 히스토리를 검색 가능한 SQLite 데이터베이스로 대체하고, per-directory-history는 특정 디렉터리에서 실행한 명령만 검색하거나 전체 히스토리를 오가며 검색하게 해줍니다. 히스토리 저장량 자체도 설정으로 늘릴 수 있습니다. 또한 find 명령은 대부분 **/*.md 같은 glob으로 대체할 수 있는데, 대부분의 셸은 기본 지원하지만 bash는 shopt -s globstar로 켜줘야 합니다. 같은 맥락에서 grep, ack, ag보다는 rg(ripgrep)를 쓰는 편이 대부분의 경우 낫다고 권합니다. zsh의 고급 자동완성은 기본 비활성화이므로 brew 경로의 site-functions를 FPATH에 추가한 뒤 autoload -Uz compinit와 compinit를 실행해 활성화하는 설정 스니펫도 소개합니다.

데이터베이스·정규식·메트릭

SQL에서는 FROM 없이 SELECT만 쓸 수 있습니다. 데이터베이스 함수가 실제로 어떻게 동작하는지 시험하거나, SELECT TRUE <> NULL 같은 식의 결과를 떠올릴 때 유용합니다. PostgreSQL과 MySQL은 모두 EXPLAIN ANALYZE를 지원하는데, 이는 최적화하려는 쿼리를 실제로 실행하면서 훨씬 많은 성능 정보를 보여줍니다. 정규식에서는 단어 경계 어서션 \b가 단어의 시작이나 끝을 찾을 때 편리합니다. 메트릭에는 로그를 활용해 필드 값의 분포 감각을 얻을 수 있는데, 예시로 const bucket = Math.floor(Math.log10(userInGroupCount))처럼 버킷을 잡아 metrics.increment("my_metric", { bucket })로 기록하는 코드를 제시합니다.

JavaScript·Node.js·Git

모던 JavaScript는 이제 Array.flatMap, Object.entries, Promise.withResolvers를 지원합니다. Node.js에서는 https.Agent를 만들어 fetch(url, {method, agent})처럼 HTTP 요청에 넘기면 외부 리소스와의 연결을 유지할 수 있고, 이는 지연시간(latency)에 극적인 영향을 줄 수 있다고 설명합니다. Git 쪽에서는 git log -S pattern, 이른바 'git pickaxe'가 코드베이스에서 특정 문자열을 추가하거나 삭제한 모든 커밋을 찾아주며, 오래된 코드베이스에서 특히 유용하다고 강조합니다. git log -G pattern도 비슷하지만 해당 라인이 이동한 경우까지 보여줍니다. 그리고 cd -처럼 git checkout -로 이전 HEAD를 체크아웃할 수 있습니다.

회사에서의 작은 지식과 공유 방식

저자는 회사 안에서는 이런 작은 고레버리지 지식의 비중이 더 크다고 봅니다. '$PROBLEM을 디버깅하려면 $DATA_SOURCE를 보라', '$PERSON이 $AREA를 잘 알고 도움을 준다', '$HARD_THING에 대한 좋은 문서가 $OVER_HERE에 있다', '$THING이 일어나면 수동 스케일아웃 신호다', '서비스 rolling restart는 $THIS_COMMAND로 한다', '$UTIL이 $THAT_PROBLEM을 스크립트화하기 쉽게 해준다' 같은 예시를 듭니다. 이전 직장에서는 기술적 팁과 회사 고유 팁을 섞어 하루에 하나씩 Slack으로 엔지니어링 팀에 공유했고 반응이 좋았다고 합니다. 10개 중 9개를 이미 알아도 나머지 하나가 시간을 절약해주며, 하루 하나라는 양이 부담을 주지 않으면서 가끔 유용한 토론도 일으켰다는 것입니다. 시니어 엔지니어라면 비슷한 시도를 해보라고 권합니다. 각주에서는 이런 접근이 Julia Evans의 블로그 글, 즉 '작은 지식 조각은 강력하고 재미있고 접근하기 쉽다'는 메시지와 맞닿아 있다고 덧붙입니다.

Lobsters 반응

  • @brad — 이런 작은 지식 조각을 주고받는 것이 페어 프로그래밍에서 가장 즐거운 부분 중 하나였다고 말합니다. 매일 쓰지만 잘 알려지지 않은 팁으로 fpp를 소개하며, rg pancakes | fpp처럼 출력에서 파일 경로를 파싱해 하나 이상을 에디터로 열 수 있다고 설명합니다. git status와 함께 작업 중인 파일 전체를 빠르게 여는 용도로 자주 쓰며, Facebook 프로젝트이므로 대안 도구가 있다면 시도해 보고 싶다고 덧붙였습니다.

원문: will-keleher.com / 번역·요약: Trawling