[dev] 이펙티브 엔지니어

[dev] 이펙티브 엔지니어

원문 : https://gist.github.com/rondy/af1dee1d28c02e9a225ae55da2674a6f

읽기전에 : 저는 여기에 제시된 내용(에드몬드 라우의 책의 개요)을 제작하지 않았습니다. 인터넷 어딘가에서 복사하여 붙여 넣었지만 원본 소스가 정확히 무엇인지 기억나지 않습니다. 또한 저자의 이름을 찾을 수 없었기 때문에 적절한 크레딧을 줄 수 없습니다.

이펙티브 엔지니어

이펙티브 엔지니어란?

이펙티브 엔지니어란 일을 제대로 끝내는 사람들입니다. 그들은 결과를 산출합니다.

올바른 사고 방식 채택

큰 영향을 미치는 일에 집중하라

  • 레버리지 = 생성된 임팩트 / 투자한 시간
  • 레버리지을 효율성의 척도로 사용하세요.
  • 임팩트의 80%는 작업의 20%에서 발생합니다.
  • 쉬운 승리 만이 아니라 높은 레버리지에 집중하십시오.

학습을위한 최적화

  • 필요한 경우 작업을 변경하십시오.
  • 학습 최적화는 높은 레버리지를 가져옵니다.
  • 성장을 위한 사고 방식을 채택하십시오.
    • 사람들과 대화하세요. 스토리 텔링에 능숙해지세요. 시간을 들일수록 나아집니다.
    • 성장을 위한 사고 방식을 가진 사람들은 노력을 통해 지식과 기술을 습득하고 발전시킬 수 있다고 생각합니다.
    • 당신의 이야기를 만드세요.
  • 학습 속도에 투자
    • 다양한 분야를 학습하세요. 다양한 분야에 대한 학습은 기하 급수적인 성장으로 이어집니다. 학습은 빨리 시작 될수록 좋습니다.
    • 쉬운 작업을 수행하는 것은 엄청난 기회 비용입니다. 복합 학습의 기회를 놓칠 수 있습니다.
    • 수익성보다는 학습을 우선시하십시오.
    • 학습속도가 가장 높은 활동에 시간을 투자하십시오.
  • 학습에 도움이되는 작업 환경을 찾으십시오.
    • 빠른 성장을 할 수 있는 회사 (# 문제 수 >> # 자원). 해결했을 떄 영향력이 큰 문제를 선택할 수 있는 기회를 잡으세요.
    • 우선 순위가 높은 프로젝트를 수행하고 있는지 확인하십시오.
    • 개방성 : 호기심을 가지고 문제를 해결하려는 문화를 찾으십시오.
    • 빠른 페이스의 속도.
    • 사람들은 당신보다 똑똑합니다.
    • 자율성 : 작업 대상을 선택할 자유. 소규모 회사 => 더 많은 자율성.
  • 업무 중 가져야 할 마음가짐.
    • 새로운 기술을 매일 습득하는 습관을 만드십시오.
    • 뛰어난 엔지니어가 작성한 코드를 읽습니다.
    • 모르는 코드는 두려움없이 뛰어 들어보십시오.
    • 항상 배우십시오. 수요가 많은 기술에 투자하십시오.
    • 책을 읽으십시오. 회의에 참석하십시오.
    • 강력한 인간 관계를 구축하고 유지하십시오.

정기적인 우선 순위 지정

  • 잘못된 아이디어를 다루는 데 드는 기회 비용으로 인해 성장이 지연 될 수 있습니다.
  • ROI(Return On Investment) = 투자수익을 기준으로 작업의 우선 순위를 정하십시오.
  • 정기적인 우선 순위 지정은 높은 레버리지를 취하는 방법입니다.
  • TODO 목록에서 :
    • 투두 리스트를 나열 할 때 '단일작업’의 목록을 유지하십시오.
    • 무언가를 기억하려고하지 마십시오. 뇌는 기억력이 좋지 않습니다. 오히려 처리에 능숙합니다.
  • 정기적으로 자문 해보십시오. 이것이 내가 작업해야 할 가장 중요한 것인가요?
  • 직접 가치를 창출하는 것에 집중하십시오.
  • 아니오라고 말하는 것을 배우십시오.
  • 중요하고 긴급하지 않은 것에 집중하십시오.
  • 깊이 집중하는 방법을 찾으십시오. “플로우 단계의 집중은 너무 깊어서 시간 감각과 자신의 문제마저 잃게합니다.”
  • 가능하면 일정에 더 긴 집중의 시간 블록을 계획하십시오.
  • 진행중인 작업량을 제한하십시오.
    • 컨텍스트 전환 비용은 높습니다.
  • 우선 순위를 정하는 것은 어렵습니다.
  • 우선 순위는 높은 이익을 가져다 줍니다. 올바른 작업 순서는 수행하는 능력에 큰 영향을 미칩니다.

반복 학습에 대한 투자

  • 지속적인 배포(CD/CI)는 큰 레버리지를 가져다 줍니다.
    • 지속적인 배포는 코드를 수동으로 배포 할 때에 비해 많은 시간을 절약 해줍니다. 엔지니어는 일을 끝내는 사람들입니다. 이펙티브 엔지니어는 결과를 산출합니다.
  • 빨리 배우기 위해 빨리 움직이십시오.
    • 빨리 움직이면 빠르게 문제를 해결할 수 있습니다.
    • 빠르게 움직이면 더 많은 것을 쌓고, 더 빠른 속도로 배울 수 있습니다.
  • 시간 절약 도구에 투자하십시오.
    • 두 번 이상 무언가를 해야하는 경우 세 번째에는 도구를 만드십시오.
    • 도구는 '하루’라는 경계를 넘는 영향을 줄 조력자입니다.
    • 빠른 도구가 더 자주 사용됩니다.
    • 빠른 툴은 이전에는 불가능했던 새로운 워크 플로우를 가능하게합니다.
    • 도구로 생산성이 급증합니다.
    • 도구의 시간 절약 속성도 팀 채택에 따라 확장됩니다.
  • 디버깅 및 유효성 검사 루프를 줄입니다.
    • 디버깅 워크 플로를 최적화하는데 소요되는 추가 시간은 적은 노력으로 성가신 버그를 해결하는 데 도움이 됩니다.
    • 디버깅은 어렵습니다. 시간이 많이 걸립니다. 디버깅 루프를 단축하기위한 사전 투자는 그만한 가치가 있습니다.
  • 넓은 범위의 테스트는 빌드 및 사이트 깨짐을 줄여줍니다.
  • 사람들이 프로그램을 실행하도록 장려하기 위한 빠른 단위 테스트.
  • 개발 시간을 단축하기 위한 빠른 incremental 컴파일 및 리로드.
  • 당신의 프로그래밍 환경을 마스터하십시오.
    • 하나의 에디. 하나의 프로그래밍 언어를 다루는 고급 스킬. Shell과 키보드로 수동 워크 플로우를 자동화합니다. Interactive shell을 사용하십시오. 특정 테스트를 쉽게 실행할 수 있습니다.
  • 더 빠르게 반복하면, 빠르게 배울 수 있습니다.

개선하고 싶은 것을 측정하십시오

  • 메트릭을 사용하여 진행 상황을 주도하십시오.
    • 측정 할 수 없으면 개선 할 수 없습니다.
    • 좋은 통계.
      • 올바른 일에 집중할 수 있도록 도와줍니다.
      • 앞으로 전진합니다.
      • 향후 회귀에 대비할 수 있습니다.
      • 성능 튜닝 : 모든 변경은 메트릭을 엄격하게 개선해야합니다.
      • 메트릭이 잘못되면 원치 않는 동작이 발생할 수 있습니다.
      • 예 :
        • 일한 시간 < 생산성.
        • 클릭률 < 긴 클릭률.
    • 선택한 측정 항목은 결정 및 행동에 영향을줍니다.
    • 최적화되면 팀에 대한 영향을 극대화하는 측정 항목을 찾으십시오.
    • 실행 가능한 메트릭 : 팀의 노력을 통해 팀원의 행동을 편하게 설명 할 수 있습니다.
    • 반응 형 메트릭 : 특정 변경 사항이 = ve 또는 -ive 인지에 대한 피드백을 제공하기 위해 빠르게 업데이트됩니다.
    • 메트릭을 선택하는 것은 높은 레버리지를 취합니다.
    • 올바른 측정 항목을 선택할 시간을 정하십시오.
  • 무슨 일이 일어나고 있는지 이해하기 위해 모든 것을 측정 하십시오.
    • 무엇이든 측정하고 모든 것을 측정하십시오.
    • Graphite, StatsD. 한 줄의 코드로 새로운 카운터 또는 타이머를 즉석에서 정의 할 수 있습니다.
    • 달성하고자하는 목표를 측정하는 것은 높은 레버리지를 취하는 것 입니다.
  • 유용한 숫자를 내면화하십시오.
    • 유용한 숫자에 대한 지식은 이익을 극대화하기위한 노력을 어디에 투자해야하는지 알 수 있는 귀중한 지름길을 제공합니다.
    • 선행 작업이 필요합니다. 정확할 필요는 없으며 대강의 아이디어만으로 충분합니다.
    • 유용한 숫자를 알면 엔벨로프 계산을하여 실제로 디자인을 만들지 않고도 디자인의 성능 속성을 신속하게 평가할 수 있습니다.
    • 유용한 숫자를 내면화하면 이상을 발견하는 데 도움이됩니다. 데이터 무결성에 대해 회의적이 되십시오.
  • 데이터를 자유롭게 기록하십시오.
  • 데이터 정확도를 더 빨리 반복 할 수있는 도구를 구축하십시오.
  • 더 빨리 데이터를 검사하십시오.
  • 숫자가 떨어지면 더 빨리 파 내십시오.

✔️ 진행 상황을 측정하십시오. 최상위 측정 항목을 신중하게 선택하십시오. 시스템을 계측하십시오. 당신의 숫자를 파악하세요. 데이터 무결성을 우선시하십시오.

아이디어를 조기에 자주 확인하라.

  • 조기에 검증하지 않으면 노력이 낭비됩니다.
  • 피드백을 지연시키지 마십시오.
  • 작업을 검증하는 노력이 적은 방법을 찾으십시오.
  • 소규모 배치작업의 힘. 흐름을 중지하여 큰 실수를하지 않도록 도와줍니다.
  • 반복적으로 문제에 접근하십시오.
  • 큰 구현을 하지마시오.
  • 혼자 일하나요? 조심하세요. 추가로 목소리를 내고 피드백을받으세요.

프로젝트 추정 기술을 향상시킵니다.

  • 맨 먼스(인력)의 환상을 조심하세요. 커뮤니케이의 오버 헤드는 매우 큽니다.
  • 위험을 조기에 줄이십시오.
  • 프로젝트 재 작성하세요 - 초기의 작성본은 거의 항상 실패합니다.
  • 추가 시간은 생산성을 저하시킵니다. 번아웃을 일으킵니다.
  • 가장 위험한 작업을 먼저 수행하십시오.
  • 미지의 위험에 대비한 시간 계산을 허용하십시오.

실용주의와 품질의 균형

  • 높은 코드 품질. 코드 가독성.
  • 지속 가능한 코드 검토 프로세스를 설정하십시오.
  • 코드 리뷰 도움말 :
    • 버그 및 디자인 문제를 조기에 파악하십시오.
    • 코드베이스에 대한 실무 지식 공유
    • 장기 민첩성이 향상됩니다. 이해하기 쉽고 수정이 쉽습니다.

추상화를 통한 복잡성 관리

  • 예 : MapReduce.
  • 올바른 추상화는 큰 차이를 만듭니다.
  • “올바른 것을 고르면, 프로그래밍은 자연스럽게 디자인에서 흘러 나옵니다. 모듈은 작고 간단한 인터페이스를 갖습니다. 광범위한 재구성없이 새로운 기능이 더 적합 할 것입니다. "
  • “잘못된 것을 고르면, 프로그래밍은 놀라 울 정도로 놀라운 일이 될 것이다. 인터페이스는 예상치 못한 상호 작용을 수용해야하므로 인터페이스가 바로크하고 어색해지며 심지어 가장 간단한 변경조차하기가 어렵다.”
  • 올바른 추상화는 엔지니어링 생산성을 몇 배나 높일 수 있습니다.
  • 간단한 추상화는 여러 개념을 서로 섞지 않아도되므로 함께 고려하지 않고 독립적으로 추론 할 수 있습니다.
  • 좋은 추상화를 설계하려면 작업이 필요합니다.
  • 추상화의 사용법과 인기는 그 품질에 대한 합리적인 대리를 제공합니다.

테스트 자동화

  • 단위 테스트 사례 및 일부 통합 테스트는 점점 커지는 코드베이스를 관리하는 확장 가능한 방법을 제공합니다.
  • 광범위하고 자동화 된 테스트 모음은 품질을 검증하고 회귀를 방지함으로써 전반적인 오류율을 줄일 수 있습니다.
  • 또한 테스트를 통해 엔지니어는 특히 큰 리팩토링을 크게 변경할 수 있습니다.
  • 이러한 이점에도 불구하고 자동화 된 테스트 문화를 정착시키기가 어려울 수 있습니다.
  • 높은 레버리지 테스트에 중점을 둡니다.
  • 더 많은 테스트를 작성하고 선의의 피드백주기를 만들고 더 많은 개발 시간을 절약하십시오.

기술 부채 상환

  • 기술 부채는 코드베이스의 건강과 품질을 개선하는 데 필요한 모든 연기 된 작업을 말하며 다루지 않은 채 방치하면 속도가 느려집니다.
  • 기술 부채는 시간 내에 상환되는 한 괜찮습니다.
  • 자주 리팩토링하십시오.

운영 복잡성 감소

  • 낮은 기술을 지속적으로 거부하세요. 빛나는 신기술에 흔들리지 마십시오.
  • 추가적인 기술은 결국 잘못을 일으킬 수 있습니다. 당신의 시간이 필요합니다.
  • 간단한 일을 먼저하십시오.
  • 운영의 단순성을 받아들입니다.
  • 가장 먼저 떠오르는 솔루션은 일반적으로 복잡합니다. 멈추지 마십시오. 양파 층을 벗겨 내십시오.
  • 아키텍처를 단순화하여 운영 부담을 줄입니다.
  • “우리의 미래 운영 부담을 줄이면서 작업을 수행 할 수있는 가장 간단한 솔루션은 무엇입니까?”
  • 단순성에 중점을 둔 분야는 높은 활용입니다.

이른 실패

  • 즉시 그리고 눈에 띄게 실패합니다.
  • 반드시 사용자를 위한 프로그램의 충돌을 의미하지는 않습니다.
  • 문제를 신속하게 해결할 수 있습니다.
  • 빠른 실패는 디버깅 시간을 절약하므로 활용도가 높습니다.

끊임없이 자동화

  • 기계적인 부분의 자동화는 좋습니다.
  • 의사 결정 자동화는 안됩니다.
  • 신속하게 대응하고 회복 할 수 있는 능력을 연마하십시오.
    • 장애 방지 보다는 신속하게 복구 활용을 활용합니다.
  • “성공을위한 스크립트”, 실패 시나리오를 연습하고 신속하게 복구 할 수있는 능력에 노력하십시오.
  • 배치 프로세스를 견고하게 만들기
  • 프로세스를 재시도 가능하게하십시오 (즉, 전역 상태를 떠나지 않음).

팀의 성장에 투자

  • 조직의 합류에 투자하십시오.
  • 엔지니어링 단계를 올라 갈수록 개인의 기여가 아니라 주변 사람들에게 미치는 영향으로 효과가 더 많이 측정됩니다.
  • "당신은 팀 전체를 다른 팀보다 향상시킬 경우 직원 엔지니어입니다. 회사 전체를 다른 팀보다 개선 할 경우 주요 엔지니어입니다. ‘업계를 개선하고 있습니다.’ - 주변의 모든 사람이 성공하도록하는 데 중점을 둡니다.
  • 당신의 커리어는 팀의 성공에 달려 있습니다.
  • 모두의 책임을 다하십시오.
  • 코드의 공유 소유권.
    • 버스지수를 두 명 이상 유지하십시오.
    • 공유 소유권은 격리 된 정보를 제거합니다.
  • 사후 모템을 통해 집단적 지혜를 쌓으십시오.
  • 자동화 된 테스트에 투자하십시오.
    • 자동화 된 테스트 케이스는 리팩토링시 신뢰도가 높아집니다.
    • 코드가 최신 인 경우 테스트 사례를 작성하십시오.
    • 100 % 코드 범위에 대해 독단적으로 행동하지 마십시오.
    • 테스트 가치는 시간이 지남에 따라 증가하고 작성 비용은 줄어 듭니다.
  • 최고를 고용하십시오.
  • 훌륭한 조언자와 함께하십시오

☀️“레버리지는 효과적인 엔지니어가 활동을 보는 데 사용되는 렌즈입니다. ☀️

읽어볼 만한 책 10권 :

  • Peopleware Productive projects and Teams. Amazon. My Summary.
  • Team Geek: A Software Developer’s Guide to Working Well with Others. (Debugging Teams) Amazon. My Summary.
  • High Output Management
  • Getting Things Done: The Art of Stress-Free Productivity
  • The 4-Hour Workweek: Escape 9-5, Live Anywhere, and Join the New Rich
  • The 7 Habits of Highly Effective People: Powerful Lessons in Personal Change
  • Conscious Business: How to Build Value Through Values
  • Your Brain at Work
  • Flow: The Psychology of Optimal Experience
  • Succeed: How We Can Reach Our Goals

팔로우 추천 블로그 :

  • http://www.theeffectiveengineer.com/ - Effective Engineer는 개인의 블로그로 엔지니어링 습관, 생산성 팁, 리더십 및 문화에 대해 글을 씁니다.
  • http://www.kalzumeus.com/ - Patrick McKenzie는 자체 소프트웨어 비즈니스를 운영하고 있으며 경력 조언, 컨설팅, SEO 및 소프트웨어 판매에 관한 많은 훌륭한 기사를 작성했습니다.
  • http://katemats.com/ - Microsoft 및 Amazon과 같은 대기업 및 신생 기업에서 근무한 Kate Matsudaira는 블로그에서 기술, 리더십 및 생활에 대한 조언을 공유합니다.
  • http://randsinrepose.com/ - Michael Lopp은 Netscape, Apple, Palantir 및 Pinterest에서 수년간 리더십 직책을 수행했으며 기술 수명 및 엔지니어링 관리에 관해 글을 썼습니다.
  • http://softwareleadweekly.com/ - Oren Ellenbogen은 엔지니어링 리더십과 문화에 관한 주간 주간 뉴스 레터를 큐 레이션합니다.
  • http://calnewport.com/ - Georgetown의 컴퓨터 과학 조교 인 Cal Newport는 성공적이고 만족스러운 삶을위한 증거 기반 조언에 중점을 둡니다.
  • http://www.joelonsoftware.com/ - Stack Exchange의 공동 창립자 인 Joel Spolsky는 블로그에 모든 종류의 지혜로운 프로그래밍 진주를 제공합니다.
  • http://martinfowler.com/ - 리팩토링 (Refactoring) 책의 저자 인 Martin Fowler는 소프트웨어 팀의 생산성을 극대화하는 방법에 대해 쓰고 일반적인 프로그래밍 패턴에 대한 자세한 내용을 제공합니다.
  • http://pgbovine.net/ - 컴퓨터 과학 교수 필립 구오는 대학원과 직장 경험에 대해 광범위하고 공개적으로 글을 썼습니다.
donaricano-btn

댓글

이 블로그의 인기 게시물

[IOS] AppDelegate는 뭐하는 녀석이지?

[git] git의 upstream과 origin 헷갈리는 사람 손!

[git] Github 이슈 라벨(issue labels)