작은 지식 조각과 프로그래밍 요령이 일상적인 엔지니어링 생산성에 큰 영향을 미치는 이유를 살펴봅니다.
매일의 업무에서 엔지니어링 생산성의 놀랄 만큼 큰 부분은 작은 지식 조각들에서 나온다고 생각합니다. 어떤 언어 기능이 존재한다는 사실을 아는 것, 설명되지 않는 tcp 지연이 아마도 TCP_NO_DELAY 설정과 Nagle의 알고리즘에 관련되어 있다는 것을 아는 것, 곤경에서 벗어나기 위한 알맞은 git 주문을 아는 것, 또는 파일을 다시 쓰는 sed 요령을 아는 것 말입니다.
한편으로 이는 자명합니다. 여러분이 아는 모든 것은 더 작은 지식 조각들로 이루어져 있을 테니까요. 당연히 그런 작은 지식 조각들은 중요합니다.
하지만 특히 가치가 크면서도 이를 뒷받침하는 정신적 기반을 많이 요구하지 않는 지식 조각들이 있다고 생각합니다. 디렉터리에서 간단한 서버를 시작하기 위해 python3 -m http.server를 사용하는 데 python을 전혀 알 필요는 없지만, 그래도 작업이 조금은 더 쉬워질 수 있습니다. 몇 가지 예를 들어 보겠습니다.
ctrl + r로 터미널의 명령 기록을 검색할 수 있다는 것은 알고 있을 것입니다. 하지만 fzf를 설치하면 ctrl + r가 퍼지 검색을 하도록 설정할 수 있습니다. 더 강력한 기능이 필요하다면 atuin은 셸 기록을 검색 가능한 SQLite 데이터베이스로 대체합니다. per-directory-history를 사용하면 특정 디렉터리에서 실행한 명령을 검색하는 것과 이전의 모든 명령을 검색하는 것을 오갈 수 있습니다. 마지막으로 저장할 기록의 양도 설정할 수 있습니다. stackoverflow 질문을 참고하세요.FROM 없이도 SELECT할 수 있습니다. 이는 데이터베이스의 함수가 실제로 어떻게 작동하는지 시험해 보거나 SELECT TRUE <> NULL이 어떻게 작동하는지 다시 확인할 때 유용할 수 있습니다.1explain analyze를 지원합니다. 이는 최적화하려는 쿼리를 실제로 실행하고 성능에 관한 훨씬 더 많은 정보를 제공합니다.\b를 사용하면 단어의 시작이나 끝을 쉽게 찾을 수 있습니다.* 현대 JS는 이제 [Array.flatMap](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap), [Object.entries](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries), [Promise.withResolvers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers)를 지원합니다.
* NodeJS에서는 [https.Agent](https://nodejs.org/api/https.html#class-httpsagent)를 생성한 뒤 이를 http 요청에 제공하여 외부 리소스와의 연결을 유지할 수 있습니다: `fetch(url, {method, agent})`. 이는 지연 시간에 극적인 영향을 줄 수 있습니다.
* `git log -S pattern`([”git pickaxe”](https://git-scm.com/book/en/v2/Git-Tools-Searching))은 코드베이스에서 문자열을 _추가하거나 제거한_ 모든 커밋을 보여줄 수 있습니다. 특히 오래된 코드베이스에서 놀랄 만큼 유용합니다! (`git log -G pattern`도 비슷하지만, 그 줄이 이동한 경우도 보여 줍니다.)
* `cd -`와 비슷하게 `git checkout -`를 사용해 이전 HEAD를 체크아웃할 수 있습니다.
* [아마도 `find`는 필요하지 않습니다](https://will-keleher.com/posts/you-probably-dont-need-find/). 많은 `find` 명령은 `**/*.md` 같은 글롭으로 대체할 수 있습니다. 대부분의 셸은 기본적으로 이를 지원하지만 bash에서는 `shopt -s globstar`로 이 기능을 켜야 합니다.
* 비슷한 맥락에서 대부분의 사람은 `grep`, `ack`, `ag` 대신 `rg`(ripgrep)를 사용하고 싶을 것입니다.
* zsh의 고급 자동 완성 기능은 기본적으로 켜져 있지 않습니다: ```
if type brew &>/dev/null; then
FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}"
fi
autoload -Uz compinit
compinit
이 모든 것을 이미 알고 있었을 수도 있습니다! 혹은 이런 작은 요령들이 전혀 쓸모없는 분야에서 일할 수도 있습니다. 이 특정 요령 묶음이 여러분에게 유용하지 않더라도, 수년에 걸쳐 쌓아 업무를 더 쉽게 만들어 주는 여러분만의 요령 보관함은 분명 있을 것이라 생각합니다.
회사에서는 훨씬 더 많은 지식이 이런 작지만 높은 레버리지의 지식 조각인 경향이 있다고 생각합니다.
이전 회사에서 저는 기술적인 내용과 회사 특화 내용을 모두 포함해 엔지니어링 팀에 매일 slack으로 요령 하나를 공유했고, 사람들은 이를 꽤 유용하게 여겼습니다. 요령 10개 중 9개를 이미 알고 있더라도, 그 열 번째 문서나 기법이 시간을 절약해 줄 수 있습니다! 또한 하루에 하나의 요령은 사람들에게 지식을 과하게 쏟아붓지 않기에 알맞은 양이었고, 때로는 유용한 토론을 촉발할 수도 있었습니다. 회사에서 좀 더 선임 엔지니어라면 비슷한 일을 해보는 것을 고려해 볼 수 있습니다.