본문 바로가기
일 잘하기 & 운영

이펙티브 엔지니어

by 민휘 2024. 1. 17.
💡 레버리지가 높은 활동을 해야 하는 이유 : 시간이라는 제한된 자원을 더 효율적으로 사용하기 위해서
💡 아직 회사에 속하지 않은 내가 실천할 수 있는 활동은 무엇인가?
  • 프로젝트 과정에서 코드 소유권을 공유하고 집단 지성 기록하기
  • 더 간단하고 효과적이고 직관적인 해결책 고민하기
  • 비즈니스든 기술이든 빨리 실패하고 피드백받아서 빨리 개선하기

 

1부 올바른 마인드셋을 갖춰라

 

1장 레버리지가 높은 활동에 집중하라

  • 이 책에서 얻을 것 : 지속적으로 스스로 성장하는 방법, 개인과 조직이 성장할 수 있는 방법과 그 실천 기회
  • 엔지니어링의 효과성을 측정하는 방법인 레버리지(aka ROI) : 제한된 시간 안에서 높은 투자 효과를 내는 활동에 집중하기. 레버리지 포인트가 높은 활동에 집중하고 습관 만들기
  • 레버리지 높이기 : 시간을 줄이거나, 작업의 영향력을 높이거나, 더 높은 레버리지를 지닌 활동으로 바꿀 방법 찾기 (기획, 채용, 개발 등 여러 영역에서 공통적으로 적용할 수 있는 방법)

 

2장 학습을 위해 최적화하라

  • 성장 마인드셋 갖추기 : 실패와 도전은 새로운 것을 배울 기회. 자신의 능력을 통제할 수 없는 고정된 양으로 볼 것인지, 자신을 발전시키는데 자신의 노력과 에너지를 쓸 것인지? → 무기력을 타파할 수 있는 마인드라고 생각함
  • 자신의 이야기는 스스로 써라 : 경로를 이탈한 이력에 대해 사과할 것이 아니라, 자신이 어떤 사람이고 어떤 기술을 배웠으며 앞으로 어떤 일을 할지, 기대하는 이유가 무엇인지 자신의 이야기를 들려주어야 한다. → 면접 때 보여주어야 하는 자세
  • 스스로를 스타트업으로 여겨라. 스타트업은 성공 확률을 높이기 위해 처음에는 수익성보다는 학습을 우선시한다. 장기적인 성공을 꿈꾼다면 자신에게 매일 투자하고 개발 주기를 반복하는 스타트업의 베타 버전이라고 생각하라.
  • 학습률에 투자하기 : 학습은 레버리지가 높은 투자. 학습은 지수 성장 곡선을 따른다. 배운 지식을 기반으로 더 많은 지식을 더 빨리 쌓을 수 있다. → CS 기초가 중요한 이유
  • 근무 환경의 핵심 요소 : 직장에서 오랜 시간을 보내므로 학습에 최적화된 근무 환경을 선택하는 것이 중요. 성장률, 교육 기회, 의사결정의 개방성, 빠른 반복 주기, 뛰어난 팀원들, 자율성과 영향력
  • 직장에서 학습 기회 활용하기 : 코어 라이브러리 코드와 오픈소스 프로젝트 검토, 능동적으로 코드 작성, 20%의 시간을 활용해 학습 기회 창출하기 (인접 분야 공부하기)
  • 직장 밖에서 지속적으로 학습하기 : 새로운 언어와 프레임워크 배우기, 수요 많은 기술에 투자하기, 독서 토론, 컨퍼런스, 인맥 네트워크 구축, 글 쓰기, 블로그 팔로우, 사이드 프로젝트, 좋아하는 것 추구하기 (개발과 관련된 것이 아니더라도) → 업무 이후 삶의 루틴

 

3장 우선순위를 정기적으로 점검하라

  • 체크 리스트 작성하기 : 뇌는 기억 수단이 아닌 처리 수단이다. 하나의 통합된 목록을 작성한다. 모든 요소에 대해 우선순위를 측정하려고 하지 말고, 가장 우선순위가 높은 것이 무엇인지 판단하여 수행할 업무를 고른다.
  • 직접적으로 가치를 생산하는 일에 집중하기 : 업무 성과를 평가할 때 중요한 것은 얼마의 가치를 창출했는지이다. 가장 적은 노력으로 가장 큰 가치를 생산하는 업무 우선시 → 비즈니스적인 의미가 더 강한 것 같음 - 출시한 제품, 확보한 사용자, 고객, 매출 등
  • 중요하지만 급하지 않은 일에 집중하기 : 2사분면 (중요하지만 급하지 않은 일)에 일정한 시간 투자하기. 1사분면의 생산성을 높일 수 있는 근본적인 시도를 할 수 있을 것 → 2사분면에 투자하는 시간 정하기, 예를 들어 3시간 (학생 기준)
  • 일정 보호하기 : 몰입 유지를 위해 일정에 집중하는 시간 블록의 길이를 길게 유지하기. 중요하지 않은 활동을 거절하는 방법 배우기
  • 동시에 진행할 작업의 양 제한하기 : 업무가 선형적으로 증가할 때 실패 확률은 기하급수적으로 증가한다. 동시에 할 수 있는 작업량은 사람마다 다르다. 시행착오를 겪으며 본인의 처리량을 찾아야 함.
  • 작업의 최초 활성화 에너지 소비 줄이기 : 만약 다음 회의까지 20분이 남는다면, 코드 리뷰 끝내기 등의 만약 ~한다면 계획 세우기 → 최초 활성화 에너지 소비를 줄이기 위해 해야할 일을 습관으로 만드는 것도 추천하는 방법
  • 우선순위를 정하는 자신만의 루틴 만들기 : 우선순위를 정하는 방법론보다는 우선순위를 정하는 습관을 들이는 것이 더 효과적. 팁 - 타임 블록 활용, 시간 단위별로 우선순위 정하되 방향성 반영하기(하루, 일주일, 한달) → 시간관리 매트릭스로 우선순위를 추리고, 타임 블록 수량을 작성해서 연속된 타임 블록에 할일 처리할 수 있게 하기, 만약 ~한다면 계획에 타임 블록을 기준으로 할일을 지정하는데 도움이 될 듯

 

2부 실행, 실행, 실행 → DX와 애플리케이션 현대화 주제를 다루는 듯

요약 : 지표 선택 → 실험할 가설 설정 → 프로토타이핑, 중간 검증은 추정으로 → 다음 반복 때 반영, 반복 속도는 빠르게

 

4장 반복 속도에 투자하라얻을 수 있는 효과

  • 사용자로부터 빠른 피드백 받기
  • 문제 발생 시 신속 정확하게 파악하고 복구
  • 즉 비즈니스적, 기술적인 위험이 감소한다

실천 방법

  • 자동화 도구나 작업 흐름을 작게 만드는 도구를 사용해 시간 절약하기
  • 디버깅이나 검증 작업 흐름을 단축하기 → 테스트 코드로 소스 코드 리팩터링하기
  • 작업 환경에 익숙해지기 : 툴 숙지 미숙으로 어리바리하느라 시간 낭비하지 말기
  • 엔지니어링 외적인 병목을 무시하지 말기 : 소통으로 우선순위 맞추기. 주요 병목 지점은 리뷰 프로세스와 의사 결정의 지연 → 주인의식 있는건 좋은데.. 이렇게까지 해야하나?

추가 의견

  • MSA 방법론의 목표도 결국 비즈니스 민첩성을 위해 변경 범위를 모듈과 팀 수준으로 제한하는 것
  • MSA 의심 : 과도한 비용과 복잡성 증가, 관리 더 힘들어
  • 모놀리스에서 소규모 변경을 효과적으로 적용할 수 있을까? (의미가 있을까?)
  • 레버리지 높은 활동 : 소규모 변경을 반복적이고 점진적으로 반영하기

 

5장 개선하려는 사항을 측정하라얻을 수 있는 효과

  • 주요 지표는 작업할 내용의 방향성을 제시함
  • 측정 가능한 지표는 일의 진행 상황과 개선 정도를 평가하는 척도로 사용할 수 있음

실천 방법

  • 좋은 지표 선택 : 팀 전체에 가장 크고 지속적인 효과를 내고, 인과성이 비교적 분명하고, 외부 요인에 영향을 받지 않는 견고함
  • 시스템의 주요 부분을 모니터링 : 시스템의 안정적인 운영과 비즈니스 통찰 얻기
  • 유용한 수치 체득 : 성능 지표의 빠른 예측, 개선 영역과 범위 결정, 성능 수치 평가
  • 데이터 무결성 의심 : 왜 이러한 수치가 나왔는지 의심하기

활용할 수 있는 지표

  • 등록된 사용자 수, 주간 활성 사용자 수, 월간 사용자 수
  • 초당 요청 수
  • 저장된 데이터 양과 수용 가능한 총 용량
  • 매일 기록되고 접근되는 데이터양
  • 해당 서비스를 지원하는데 필요한 서버 개수
  • 다른 서비스나 종단점의 처리량
  • 트래픽 증가율
  • 평균 페이지 로딩 시간
  • 제품 여러 부분에 걸친 트래픽 분포
  • 웹 브라우저, 모바일 기기, 운영체제 버전별 트래픽 분포

 

 

6장 아이디어는 일찍 그리고 자주 검증하라

 

얻을 수 있는 효과

  • 적은 노력과 비용으로 프로젝트의 가정과 목표를 검증
  • 장기적으로 낭비될 수 있었던 수고를 절약할 수 있다

실천 방법

  • A/B 테스트 : 프로토타입과 수집 지표 사이에 인과 관계가 있는지 검증하여 사용자 행동 데이터를 이해하고 실행할 수 있는 지식으로 변환
  • 지속적으로 피드백 받고 실천할 수 있는 환경 만들기 : 코드를 작성하기 전에 설계를 검토하고 맥락 공유하기

추가 의견

  • 비디오로 주요 기능 목업, 화면에 버튼 만들어두고 곧 출시할거에요^^ → 사용자 반응 수집할 때 활용할 수 있을 듯
  • 사용자를 가짜 페이지로 보내는 구글 애드워즈 → 이래도 되나???????
  • 레버리지 높은 활동 : 제품 조기 검증

 

7장 프로젝트 추정 기술을 향상시켜라

 

얻을 수 있는 효과

  • 프로젝트 계획을 성공적으로 세울 수 있음
  • 일정을 과소평가해서 마감 기간을 못 맞추는 실패 사례 감소
  • 변화하는 요구 조건에 적응하고 관리자의 압박 쳐내기

실천 방법

  • 정확한 추정 팁 : 더 작은 작업으로 분할하기, 실제 업무 담당자가 실제로 작업에 드는 시간을 추정하게 하기, 유입 데이터로 추정치 검증
  • 미지의 방해 요소를 고려해 여유 시간 추가하기 → 코어 타임 명시 : 각 팀원이 프로젝트에 현실적으로 매일 얼마의 시간을 쓸 수 있는지 명시하고 실제 측정치 기록하기
  • 진행 상황 관리 : 정확한 목표를 세우고 마일스톤으로 진행 정도 측정. 마일스톤을 세우려면 목표가 정확해야 분할할 수 있다.
  • 위험한 부분은 초기에 처리 : 필요한 기능만 만들고 통합해서 처리
  • 재작성 프로젝트 주의사항 : 단계를 명확하게 나눌 것. 코드 개선과 기능 개선을 한번에 하려고 하지 말기

추가 의견

  • 혼자 리팩터링하려다 중단한 이유가 요기 있네
  • 프로젝트 추정은 어느 타이밍에 하는거지?? 무의 상태일 때? (베이스코드가 없는 시기에?) 지표를 선택할 수 없을 정도로 데이터가 없을 때?
  • 프로젝트 추정 방법 중 프로젝트를 하루 단위 작업으로 분해하라 → 이거 말이 되나?
  • 코드 작성하기 전에 해야할 일이 너무 많은거 아님? 설계 설계 설계만 하다가 지칠 것 같은데요.. 작게 시작하라며 (프로젝트 추정, 도메인 모델, 시스템 다이어그램, API 스펙, 테스트 케이스 작성, 위험한 부분 처리, 지표 수집과 선택)
  • 레버리지 높은 활동 : 프로젝트 정확하게 추정하기

 

3부 장기적인 가치를 구축하라

 

8장 품질과 실용주의 사이에서 균형을 유지하라

  • 소프트웨어 품질이 뛰어나면 변화에 빠르게 대응할 수 있다. 개발자가 가치를 생산하는 속도가 높아지고 조직이 확장될 수 있다.
  • 지속 가능한 리뷰 프로세스 만들기 : 코드 리뷰를 통과하면 평균 85%의 버그가 제거된다. 향상된 품질과 리뷰에 투자하는 시간의 균형을 위해 핵심 기능의 까다로운 부분만 리뷰하는 방법도 있다.
  • 추상화를 통해 복잡성 관리 : 추상화는 복잡성을 줄이고 재사용 가능한 솔루션을 제공하며 유지보수 비용이 줄고 개선사항을 적용하기 쉽게 한다. 레버리지를 높이려면 팀원이 크게 의존하는 소프트웨어에 추상화를 적용해야한다. 다만 유스 케이스를 이해하지 못한 채 추상화하면 투박하고 쓸모 없는 결과물이 될 것.
  • 테스트 자동화 : 단위 테스트와 통합 테스트로 시스템이 예상한대로 동작하는지 확인할 수 있다. 특히 대규모 리팩터링 작업에 유용하다. 아직 테스트가 없다면, 레버리지가 높은 테스트부터 시도하라.
  • 기술 부채 상환 : 기술 부채란 코드베이스의 품질을 개선하는데 필요함에도 불구하고 방치해둔, 개발 속도를 지연시킬 수 있는 모든 작업을 말한다. 가장 큰 이자를 발생시키는 부채부터 집중하라.

 

9장 운영 부담을 최소화하라

  • 운영 부담을 최소화하는 것은 레버리지가 높은 활동이다. 운영 때문에 반복해서 발생하는 비용은 레버리지가 높은 다른 활동에 쓸 수 있는 시간과 에너지를 빼앗아간다.
  • 매력적이거나 도발적인 신기술 대신 가능한 확고히 검증된 기술 사용하기. 특히 프로덕션이라면!
  • 단순하게 만들기 : 아키텍처가 복잡하다면 SPOF가 발생할 위험이 높고, 더 많은 분야에 대한 기술적 지식이 필요해 이해하기 어려워지고, 개선에 드는 노력이 여러 시스템에 분산된다.
  • 빨리 실패하는 시스템 만들기 : 문제를 즉시 드러내는 동시에 최대한 빨리 오류의 실제 원인에 최대한 가깝게 접근. 소프트웨어 유지보수와 디버깅에 드는 시간을 줄인다.
  • 자동화 : 작업을 수동으로 하는 것, 자동화 비용을 선불로 내는 것 중 어느 것이 전체적인 시간을 더 절약할 수 있는가? 일련의 작업을 자동화하는 것은 간단하고 테스트도 쉽다. 하지만 의사 결정 자동화는 훨씬 어렵고 자동화 보상도 적다. 그러니 매커니즘 자동화에 먼저 집중하라.
  • 실패 회복력 : 실패 회복력을 뛰어나게 만들려면 복구 프로세스를 멱등성 있게 만들어 여러번 시도할 수 있게 하라. 멱등성 있게 만들 수 없다면 재시도나 재진입 할 수 있는 프로세스를 만들라.
  • 고장 유형을 계획하고 연습하라 : 예상되는 실패에 대한 시나리오를 만들고 미리 연습하면 운영 부담을 줄이고 중요한 순간에 효과적으로 의사결정을 할 수 있다.

 

10장 팀의 성장에 투자하라

  • 팀이 성공할수록 개인이 성공할 가능성이 더 커지기 때문
  • 채용 우선시
  • 온보딩과 멘토링에 투자하기 : 목표 세우기 → 실천 방법 (코드랩, 온보딩 강연, 멘토링, 첫 임무 부여)
  • 코드 소유권을 공유하기 : 본인이 개발의 병목이 되지 않도록 하기. 그러면 레버리지가 높은 다른 활동에 집중할 유연성이 생긴다.
  • 집단 지성을 디브리핑하고 기록하기 : 왜라고 5번 묻고 비행 규칙 작성하기. 규칙과 교훈, 상세한 시나리오를 작성한다. 제품과 팀을 발전시키겠다는 공동의 목표가 있어야 한다.
  • 훌륭한 엔지니어링 문화 만들기 : 개발 주기 반복 속도 최적화, 끊임없이 자동화 추구, 올바른 소프트웨어 추상화 구축, 코드 리뷰로 품질 유지, 서로 존중하는 근무 환경, 코드 소유권 공유, 자동 테스트 투자, 20%의 시간을 해커톤이나 실험할 시간으로 사용, 학습하고 꾸준히 발전하는 문화 조성, 최고의 개발자 고용