Chapter 04 업무 자동화
소프트웨어 개발에서 제 한계를 보완하는 핵심 기법은 자동화입니다.
자동화를 더 많이 할수록 기억해야 할 것이 줄어듭니다.
버튼 하나, 명령어 하나로 배포할 수 있다면, 배포 체크리스트를 여기저기 찾아 헤맬 필요가 없습니다.
PRACTICE 09 데스크톱 환경 최적화하기
작업 공간
아이디어 25 데스크톱을 시간 관리하듯 정리하세요.
작업 공간workspaces은 각각 고유한 창과 앱을 갖춘 완전한 데스크톱으로, 화면에서 이들 사이를 전환할 수 있습니다.
여러 대의 디스플레이를 가진 것과 비슷하지만, 한 번에 하나의 화면만 보는 구성이죠.
데스크톱 화면에는 제 이메일과 브라우저 창이 열려 있습니다.
이메일에 답장하려면 종종 웹 검색이 필요하거든요.
제가 글을 쓸 때는 에디터, 도서 제작 프로그램, PDF 미리보기 도구를 포함한 작업 공간을 갖춥니다.
이런 식으로 진행 중인 프로젝트마다 작업 공간을 하나씩 둡니다.
내가 사용하는 것
자신의 작업 방식을 관찰하세요
창과 작업 공간을 관리하는 도구를 일주일 정도 써 보세요.
작업 공간을 사용해 보세요
자신의 환경에서 직접 시도해볼 수 있는 도구들을 찾아보세요.
일주일 동안 시도해 보세요. 원하시는 대로 구성을 설정하는 데 며칠 정도 걸릴 겁니다.
그 다음에는 작업을 분할하는 습관을 들여 보시고, 본인에게 맞는지 확인해 보세요.
PRACTICE 10 터미널 활용 극대화하기
아이디어 26 효과적인 개발자는 터미널을 능숙하게 다룹니다.
셸shell 명령을 잘 알면 GUI 애플리케이션이 한계에 도달했을 때 훨씬 단순하게 해결할 수 있습니다.
터미널을 사용하면 운영체제 전체에 접근할 수 있습니다.
스크립트를 작성하고 애플리케이션을 조합해 거의 모든 작업을 수행할 수 있죠.
셸과 터미널
터미널 시작하기
제 삶을 가장 단순하게 만들어주는 건 탭 키의 자동 완성 기능입니다.
입력하는 동안 ⇥ 키를 누르면 셸이 상황에 맞는 내용으로 자동 완성을 시도합니다.
제가 챙기는 터미널의 추가 기능
- 속도: GPU 렌더링 사용으로 빠른 스크롤 출력
- 스크롤백: 터미널은 적어도 마지막 2,000 줄의 출력 내용을 보관할 수 있어야 하며, 더 많이 보관하는 것이 바람직합니다.
- 테마
- 키 매핑
- 다중 패널/창
아이디어 27 터미널을 정보를 표시하는 대시보드로 사용하세요.
다중 패널
저는 창을 여러 개의 창으로 분할하고 각 패널에서 별도의 셸을 실행할 수 있는 터미널 프로그램을 사용합니다.
이 창의 레이아웃을 사용자가 구성할 수 있어야 하며, 각 창에서 폰트 크기를 독립적으로 제어할 수 있어야 합니다.
로그를 별도 창에 띄워 화면 한쪽에 치워두지만 계속 스크롤되며 보이게 해두는 경우가 많거든요.
중요한 추가 항목: 셸
저는 문맥 기반 명령 자동완성 기능을 매우 좋아합니다.
대부분의 셸은 명령어 입력 단계에서도 유사한 기능을 제공합니다.
사소하게 들리지만 이런 기능은 업무 환경에서 실제로 큰 차이를 만듭니다.
특히 업무 별로 서로 다른 작업 공간을 설정하면 그 차이가 더욱 커집니다.
새 작업 공간으로 전환하면 셸은 그 작업 공간의 디렉터리에 국한된 제안을 제공해 각 작업 공간이 서로 구분되어 있다는 느낌을 확실히 줍니다.
아이디어 28 셸은 강력한 제어 능력을 제공합니다.
매일 사용하는 도구
제 맥에서는 터미널로 키티Kitty를, 셸로는 피시Fish를 사용합니다.
선택은 스스로 해야 합니다.
자신에게 맞는 옵션을 찾을 때까지 여러 가지 옵션을 직접 시험해 보세요.
PRACTICE 11 그 외 모든 것 자동화하기
아이디어 29 자동화는 곧 신뢰성입니다.
개발자 관점에서는 자동 방식이 수동 방식보다 훨씬 더 간단하고 스트레스가 적습니다.
이 모든 점을 고려하면 아직도 그런 도구들을 사용하지 않는 팀들이 있다는 건 말이 안 됩니다.
자동화 먼저, 코드는 나중에
어떤 길을 택하든 저는 한 가지 원칙이 있습니다.
애플리케이션 코드의 한 줄을 작성하기에 앞서, 저는 다음과 같은 단계를 마쳐야 합니다.
- 로컬에 있는 프로젝트 파일 복사본을 삭제한 다음, 버전 관리 시스템에 있는 원본에서 다시 복원하기
- 프로젝트의 모든 의존성을 단일 명령어로 설치하기
- 단일 명령어로 소스에서 프로젝트 빌드하기(처음엔 ‘Hello, World!’ 프로그램으로)
- 테스트를 빌드의 일부로 자동으로 실행하거나 단일 명령어로 실행
- 프로젝트를 타겟 환경에 배포하기
할 일이 많아 보이지만 실제 환경에서 이 원칙을 꾸준히 따르면 곧 완비된 템플릿 프로젝트들이 쌓여서, 약간의 맞춤 설정만으로 바로 사용할 수 있습니다.
애플리케이션을 0일 차에 배포한다면 단순함을 유지해야 합니다.
설정할 환경도 없고, 초기화할 데이터베이스도 없고, 구성할 메일러도 없으며, 시작할 메시지 큐도 없습니다.
단지 다른 기기에서 ‘Hello, World!’를 실행시키는 겁니다.
먼저 그 부분을 동작하게 만든 다음 앱에 기능을 추가하기 시작하세요.
작업을 진행하는 동안에도 계속 배포합니다.
진행하면서 하는 게 전체 완성된 애플리케이션을 한꺼번에 구성하고 실행하려고 시도하는 것보다 훨씬 간단합니다.
이 접근 방식에는 또 다른 큰 장점이 있습니다.
제가 소프트웨어를 만드는 대상인 사용자들이 원할 때마다 최신 변경사항을 직접 시험해볼 수 있다는 점입니다.
질문이 있으면 앱의 특정 화면으로 이동해 달라고 요청한 다음, 제가 말하는 부분을 직접 보여줄 수 있습니다.
단일 명령 배포
전원이 켜지고 SSH 키로 프로비저닝된 새 대상 시스템이 준비되면 운영 체제를 구성하고 의존성을 설치하며 모든 서비스를 가동하고 애플리케이션을 배포·설정한 다음 데이터를 마이그레이션해 전체를 실행할 수 있어야 합니다.
그리고 이걸 배포 명령 하나로 할 수 있어야 합니다.
아이디어 30 베어 머신에서 단일 명령으로 애플리케이션을 실행할 수 있어야 합니다.
이상적으로는 그 명령이 여러 개의 하위 명령으로 구성되어, 이미 설정된 머신에서는 초기 환경 설정을 건너뛸 수 있으면 좋습니다.
저는 개인적으로 앤서블Ansible을 사용해 서버와 애플리케이션의 설정 및 업데이트를 모두 관리하는 것을 선호합니다.
운에 맡기지 마세요
개발 중에는 대략 주에 한 번 정도 원격 머신을 운영체제와 SSH 키만 남긴 기본 상태로 초기화하고, 배포 명령을 사용해서 애플리케이션을 여전히 실행할 수 있는지 확인합니다.
언젠가 새벽 세 시, 사이렌이 요란하게 울리는 가운데 미리 그렇게 해 둔 자신에게 감사하게 될 것입니다.
이렇게 해보세요
한두 시간 여유가 생기면, 원하는 프로그래밍 언어와 프레임워크를 이용해 ‘Hello, World!’ 애플리케이션을 만들어 보세요.
그런 다음 자동화 스크립트를 만들어 보는 겁니다.
새로 체크아웃한 상태에서 시작해 새로 생성한 대상 환경에 애플리케이션을 배포하고 실행되도록 해 최종적으로 애플리케이션이 배포되어 실행되게 하세요.
애플리케이션을 변경한 후 대상 머신에 업데이트해 보세요.
PRACTICE 12 에디터 완전히 장악하기
에디터 길들이기
에디터는 생각만큼이나 개인적이어야 하며, 사용자의 스타일과 선호, 워크플로우에 맞춰 나만의 것으로 느껴져야 합니다.
적어도 그래야 합니다.
아이디어 31 에디터는 머리에 있는 정보를 코드로 옮기는 가장 짧은 지름길입니다.
마우스 사용은 질색
편집하는 동안 마우스를 전혀 사용하지 않는다고 말할 수 있습니다.
재밌는 건 하루가 끝날 무렵에 오른쪽 손목이 더 이상 아프지 않다는 겁니다.
도전해 보세요
현재 사용 중인 에디터를 마우스 없이 사용할 수 있나요?
탐색
가볍게 재미 삼아 개인 프로젝트에서는 다른 에디터를 사용해 보세요.
평소 사용하시는 에디터보다 더 나은 점이 있나요? 더 나쁜 점도 있나요?
PRACTICE 13 개발 장비 세팅 자동화하기
아이디어 32 개발용 머신도 프로덕션 서버처럼 프로비저닝하세요.
이 복구에는 두 가지 요소가 있습니다. 작업 파일과 구성이죠.
작업 파일은 비교적 쉬운 부분입니다.
버전 관리 시스템을 사용하고, 지금까지 한 작업을 잃어버리면 바보 같겠다 싶을 때마다 변경 사항을 커밋하고 푸시해야 합니다.
도구 및 구성 복구
저는 설치하는 애플리케이션과 도구를 관리하기 위해 두 가지 도구를 사용하고, 구성 관리는 별도의 앱 한 개로 처리합니다.
도구 재설치
두 개의 애플리케이션 설치 도구는 asdf와 홈브루Homebrew입니다.
asdf는 주로 개발과 직접 연관된 도구들, 컴파일러, 그리고 일부 에디터에 초점을 맞춥니다.
여러 프로젝트에서 이런 도구들의 여러 버전을 언어별 시스템(예: 루비의 rbenv) 없이도 쉽게 실행할 수 있어서 마음에 듭니다.
asdf에 포함되지 않은 것들은 홈브루를 사용합니다.
홈브루는 커버리지가 우수하며 패키지들에 대한 설명이 적극적으로 유지 관리됩니다.
구성 복구
구성 파일은 파일 시스템 전반에 흩어져 있습니다.
나중에 제가 무언가를 잘못 건드리거나(또는 새 기기를 사용하게 되면), 개별적으로든 묶음으로든 해당 항목들을 복구할 수 있어야 합니다.
이런 작업을 하는 도구가 여러 가지 있습니다.
일부 사람들은 GNU 스토우Stow를 강력히 추천하지만, 저는 개인적으로 야덤Yet Another Dotfile Manager(yadm)을 더 좋아합니다.
이 래퍼는 깃 명령을 매우 간단히 감싼 것입니다.
전체 하드 드라이브를 깃의 관리 대상에 넣지만, 깃의 스파스 체크아웃sparse checkout 기능을 사용해 사용자가 지정한 파일만 관리합니다.
도구를 추적하는 것을 잊지 마세요
아이디어 33 설치하는 동안 사용하는 도구를 기록하세요.
다행히도 홈브루와 asdf에는 현재 설정을 기록하는 방법이 있습니다
정리 작업
생각
기존 머신과 비슷한 상태로 다시 돌아오는 데 보통 얼마나 걸리나요?
탐색
로컬 머신에 있는 다양한 구성 파일의 위치를 알고 계신가요?
이렇게 해 보세요
노트북과 데스크톱을 모두 가지고 있다면, 야덤yadm이나 스토우Stow와 같은 도구를 두 기기 모두에 설치해 보세요. 먼저 머신 중 하나에 더미 파일을 몇 개 생성하고, 서로 다른 디렉터리에 배치합니다. 해당 파일들을 야덤에 추가하고 커밋한 다음 리포지터리에 푸시합니다. 다른 컴퓨터에서 리포지터리를 클론하고, 생성한 파일들이 올바른 위치에 설치되었는지 확인하세요. 파일 중 하나 이상의 내용을 변경하고 상태를 확인한 다음 커밋합니다. 첫 번째 머신으로 돌아가 변경 사항을 내려받으세요.
진짜 이렇게 해 보세요
다음 번에 구성(예: 에디터)이 필요한 애플리케이션을 설치할 때는 홈브루, asdf 또는 초콜레티Chocolatey와 같은 도구를 사용하세요. 그런 다음 앱의 초기 구성을 설정합니다. 이제 해당 애플리케이션을 재설치하고 구성하는 데 필요한 모든 정보를 저장해 두세요.
그 다음 두 번째 머신에서 패키지 관리자 목록과 구성을 가져옵니다. 패키지 관리자를 실행해 애플리케이션을 설치하고 실행합니다. 첫 번째 머신에 설정한 것과 동일한 구성을 확인할 수 있습니다.
Chapter 04 업무 자동화
소프트웨어 개발에서 제 한계를 보완하는 핵심 기법은 자동화입니다.
자동화를 더 많이 할수록 기억해야 할 것이 줄어듭니다.
버튼 하나, 명령어 하나로 배포할 수 있다면, 배포 체크리스트를 여기저기 찾아 헤맬 필요가 없습니다.
PRACTICE 09 데스크톱 환경 최적화하기
작업 공간
작업 공간workspaces은 각각 고유한 창과 앱을 갖춘 완전한 데스크톱으로, 화면에서 이들 사이를 전환할 수 있습니다.
여러 대의 디스플레이를 가진 것과 비슷하지만, 한 번에 하나의 화면만 보는 구성이죠.
데스크톱 화면에는 제 이메일과 브라우저 창이 열려 있습니다.
이메일에 답장하려면 종종 웹 검색이 필요하거든요.
제가 글을 쓸 때는 에디터, 도서 제작 프로그램, PDF 미리보기 도구를 포함한 작업 공간을 갖춥니다.
이런 식으로 진행 중인 프로젝트마다 작업 공간을 하나씩 둡니다.
내가 사용하는 것
PRACTICE 10 터미널 활용 극대화하기
셸shell 명령을 잘 알면 GUI 애플리케이션이 한계에 도달했을 때 훨씬 단순하게 해결할 수 있습니다.
터미널을 사용하면 운영체제 전체에 접근할 수 있습니다.
스크립트를 작성하고 애플리케이션을 조합해 거의 모든 작업을 수행할 수 있죠.
셸과 터미널
터미널 시작하기
제 삶을 가장 단순하게 만들어주는 건 탭 키의 자동 완성 기능입니다.
입력하는 동안 ⇥ 키를 누르면 셸이 상황에 맞는 내용으로 자동 완성을 시도합니다.
제가 챙기는 터미널의 추가 기능
다중 패널
저는 창을 여러 개의 창으로 분할하고 각 패널에서 별도의 셸을 실행할 수 있는 터미널 프로그램을 사용합니다.
이 창의 레이아웃을 사용자가 구성할 수 있어야 하며, 각 창에서 폰트 크기를 독립적으로 제어할 수 있어야 합니다.
로그를 별도 창에 띄워 화면 한쪽에 치워두지만 계속 스크롤되며 보이게 해두는 경우가 많거든요.
중요한 추가 항목: 셸
저는 문맥 기반 명령 자동완성 기능을 매우 좋아합니다.
대부분의 셸은 명령어 입력 단계에서도 유사한 기능을 제공합니다.
사소하게 들리지만 이런 기능은 업무 환경에서 실제로 큰 차이를 만듭니다.
특히 업무 별로 서로 다른 작업 공간을 설정하면 그 차이가 더욱 커집니다.
새 작업 공간으로 전환하면 셸은 그 작업 공간의 디렉터리에 국한된 제안을 제공해 각 작업 공간이 서로 구분되어 있다는 느낌을 확실히 줍니다.
매일 사용하는 도구
제 맥에서는 터미널로 키티Kitty를, 셸로는 피시Fish를 사용합니다.
선택은 스스로 해야 합니다.
자신에게 맞는 옵션을 찾을 때까지 여러 가지 옵션을 직접 시험해 보세요.
PRACTICE 11 그 외 모든 것 자동화하기
개발자 관점에서는 자동 방식이 수동 방식보다 훨씬 더 간단하고 스트레스가 적습니다.
이 모든 점을 고려하면 아직도 그런 도구들을 사용하지 않는 팀들이 있다는 건 말이 안 됩니다.
자동화 먼저, 코드는 나중에
어떤 길을 택하든 저는 한 가지 원칙이 있습니다.
애플리케이션 코드의 한 줄을 작성하기에 앞서, 저는 다음과 같은 단계를 마쳐야 합니다.
할 일이 많아 보이지만 실제 환경에서 이 원칙을 꾸준히 따르면 곧 완비된 템플릿 프로젝트들이 쌓여서, 약간의 맞춤 설정만으로 바로 사용할 수 있습니다.
애플리케이션을 0일 차에 배포한다면 단순함을 유지해야 합니다.
설정할 환경도 없고, 초기화할 데이터베이스도 없고, 구성할 메일러도 없으며, 시작할 메시지 큐도 없습니다.
단지 다른 기기에서 ‘Hello, World!’를 실행시키는 겁니다.
먼저 그 부분을 동작하게 만든 다음 앱에 기능을 추가하기 시작하세요.
작업을 진행하는 동안에도 계속 배포합니다.
진행하면서 하는 게 전체 완성된 애플리케이션을 한꺼번에 구성하고 실행하려고 시도하는 것보다 훨씬 간단합니다.
이 접근 방식에는 또 다른 큰 장점이 있습니다.
제가 소프트웨어를 만드는 대상인 사용자들이 원할 때마다 최신 변경사항을 직접 시험해볼 수 있다는 점입니다.
질문이 있으면 앱의 특정 화면으로 이동해 달라고 요청한 다음, 제가 말하는 부분을 직접 보여줄 수 있습니다.
단일 명령 배포
전원이 켜지고 SSH 키로 프로비저닝된 새 대상 시스템이 준비되면 운영 체제를 구성하고 의존성을 설치하며 모든 서비스를 가동하고 애플리케이션을 배포·설정한 다음 데이터를 마이그레이션해 전체를 실행할 수 있어야 합니다.
그리고 이걸 배포 명령 하나로 할 수 있어야 합니다.
이상적으로는 그 명령이 여러 개의 하위 명령으로 구성되어, 이미 설정된 머신에서는 초기 환경 설정을 건너뛸 수 있으면 좋습니다.
저는 개인적으로 앤서블Ansible을 사용해 서버와 애플리케이션의 설정 및 업데이트를 모두 관리하는 것을 선호합니다.
운에 맡기지 마세요
개발 중에는 대략 주에 한 번 정도 원격 머신을 운영체제와 SSH 키만 남긴 기본 상태로 초기화하고, 배포 명령을 사용해서 애플리케이션을 여전히 실행할 수 있는지 확인합니다.
언젠가 새벽 세 시, 사이렌이 요란하게 울리는 가운데 미리 그렇게 해 둔 자신에게 감사하게 될 것입니다.
PRACTICE 12 에디터 완전히 장악하기
에디터 길들이기
에디터는 생각만큼이나 개인적이어야 하며, 사용자의 스타일과 선호, 워크플로우에 맞춰 나만의 것으로 느껴져야 합니다.
적어도 그래야 합니다.
마우스 사용은 질색
편집하는 동안 마우스를 전혀 사용하지 않는다고 말할 수 있습니다.
재밌는 건 하루가 끝날 무렵에 오른쪽 손목이 더 이상 아프지 않다는 겁니다.
PRACTICE 13 개발 장비 세팅 자동화하기
이 복구에는 두 가지 요소가 있습니다. 작업 파일과 구성이죠.
작업 파일은 비교적 쉬운 부분입니다.
버전 관리 시스템을 사용하고, 지금까지 한 작업을 잃어버리면 바보 같겠다 싶을 때마다 변경 사항을 커밋하고 푸시해야 합니다.
도구 및 구성 복구
저는 설치하는 애플리케이션과 도구를 관리하기 위해 두 가지 도구를 사용하고, 구성 관리는 별도의 앱 한 개로 처리합니다.
도구 재설치
두 개의 애플리케이션 설치 도구는 asdf와 홈브루Homebrew입니다.
asdf는 주로 개발과 직접 연관된 도구들, 컴파일러, 그리고 일부 에디터에 초점을 맞춥니다.
여러 프로젝트에서 이런 도구들의 여러 버전을 언어별 시스템(예: 루비의 rbenv) 없이도 쉽게 실행할 수 있어서 마음에 듭니다.
asdf에 포함되지 않은 것들은 홈브루를 사용합니다.
홈브루는 커버리지가 우수하며 패키지들에 대한 설명이 적극적으로 유지 관리됩니다.
구성 복구
구성 파일은 파일 시스템 전반에 흩어져 있습니다.
나중에 제가 무언가를 잘못 건드리거나(또는 새 기기를 사용하게 되면), 개별적으로든 묶음으로든 해당 항목들을 복구할 수 있어야 합니다.
이런 작업을 하는 도구가 여러 가지 있습니다.
일부 사람들은 GNU 스토우Stow를 강력히 추천하지만, 저는 개인적으로 야덤Yet Another Dotfile Manager(yadm)을 더 좋아합니다.
이 래퍼는 깃 명령을 매우 간단히 감싼 것입니다.
전체 하드 드라이브를 깃의 관리 대상에 넣지만, 깃의 스파스 체크아웃sparse checkout 기능을 사용해 사용자가 지정한 파일만 관리합니다.
도구를 추적하는 것을 잊지 마세요
다행히도 홈브루와 asdf에는 현재 설정을 기록하는 방법이 있습니다
정리 작업