diff --git "a/general/Software Engineer Level\352\263\274 \353\240\210\353\262\250\354\227\205 \353\260\251\353\262\225.md" "b/general/Software Engineer Level\352\263\274 \353\240\210\353\262\250\354\227\205 \353\260\251\353\262\225.md" new file mode 100644 index 0000000..a1ceb78 --- /dev/null +++ "b/general/Software Engineer Level\352\263\274 \353\240\210\353\262\250\354\227\205 \353\260\251\353\262\225.md" @@ -0,0 +1,182 @@ +# Job Ladder: Software Engineer + +## Overview + +Software Engineer는 프로턱트에 들어가는 소프트웨어는 물론 개발에 필요한 제반 인프라, 도구 등을 개발하는 모든 소프트웨어 개발 단계에 걸친 업무를 수행한다. 이 과정에서 Software Engineer의 각 레벨 별 요구하는 역할과 업무 기대치를 이해하여 개발자로서 어떤 방향으로 성장해 나가야하는지 방향을 설정한다. + +참고 자료: + +- [Google Software Engineer Levels: A Comprehensive Guide](https://www.theknowledgeacademy.com/blog/google-software-engineer-levels/) + +### Job Ladder and Levels + +각 레벨(L3 ~ L7) 별 기준과 그에 대한 설명은 아래와 같다. + +- Difficulty, Scope, Complexity: 업무 범위 및 복잡도 얼마나 크고, 모호하고, 난이도가 있는 업무에 대해 오너십을 가지고 있는지 나타내는 척도. +- Leadership, Influence: 리더쉽, 영향력에 대한 부분으로, 주어진 문제를 해결하기 위해 또는 목표를 달성하기 위해 공식적인 역할의 유무를 떠나 맡은 혹은 심지어 담당자가 없는 업무에 있어 얼마나 주도성을 가지고 처리하는지, 주변에 어떤 영향력을 미치는지에 대한 척도. +- Impact: 업무를 통해 직접적으로 기여한 부분에 대한 척도. +- Teamwork: 업무를 처리함에 있어 얼마나 팀을 우선순위에 두고 진행하는가에 대한 척도. +- Knowledge, Skills: 각 레벨에서 적적한 수준의 기여를 하기 위해 기본적으로 갖추어야 하는 지식/기술 역량에 대한 척도. + +## L3 + +> 개인 개발자로서 직접적인 기술 기여를 한다. 메니저, Technical Lead(TL) 또는 기타 시니어로부터 주요한 가이드, 피드백 및 지원을 받는다. +> +- 해결이 어려운 문제에 대해서는 적절한 시점에 시니어나 매니저의 도움을 받는다. +- 컴포넌트 설계에 참여하고, 해당 시스템에 대한 구현, 테스트 및 유지보수를 한다. + - 보통 한 분기 이내에 끝낼 수 있는 단위로 일이 주어진다. + - 이미 개발된 복잡한 프로젝트간의 관계/흐름의 파악이 가능하며, 재설계, 재구현이 필요한 컴포넌트 코드를 유지보수하고 개선할 수 있다. +- 해결하는 문제는 일반적으로 중요한 가정이 충분히 명확해진 상태이며, 가능한 해결 방안에 대해 파악 후 활용 가능한 도구, 리소스, 프로젝트를 사용해서 적절한 실행을 한다. +- 완성된 결과물은 품질이 기대 수준을 충족해야 한다. +- 할당된 업무 영역과 관련된 지식을 공유하여 팀워크에 기여한다. +- 팀 외부와의 협업 관계를 확대하면서 프로젝트/팀 간 협업에 기여한다. + +### 다음 단계로 성장하기 위해 + +시니어의 가이드를 최소화하면서 팀 업무에 효과적으로 기여하는 데 필요한 기술과 역량을 습득한다. 시간이 지남에 따라 L4에 도달하는 데 적합한 일의 범위, 결과물의 크기 및 복잡도, 영향력 등을 기르고, 지속적으로 팀의 문화와 운영 측면에서 개선점을 찾아간다. + +### 기준 + +- Difficulty, Scope, Complexity: + - 간단한 데이터 파이프라인 설계, 개발, 테스트, 릴리즈 및 유지보수 + - 애플리케이션 컴포넌트 단위의 설계, 개발, 테스트, 릴리즈 및 유지보수 + - 적당히 복잡한 MVP 시나리오에 대한 연관 컴포넌트의 설계 기여 + - 적절한 난이도의 버그 해결 + - 기술 데이터 평가 + - 복잡한 프로젝트의 컴포넌트 간 관계 탐색 +- Leadership, Influence: + - 정기적인 피드백을 통해 오너십을 가진 소규모 작업에 대한 계획 수립 및 실행 주도 + - 개발한 컴포넌트의 전체 기능에 대한 완전한 이해 및 결과 공유 +- Impact: + - 본인의 작업의 양과 품질, 정확성, 적시성이 속한 팀에 직접적으로 영향 + - 본인의 팀과 밀접하게 관련있는 팀의 결과물에 기여 + - 개별 작업을 독립적으로 추진하고 프로젝트의 전체 방향에 맞게 조정 +- Teamwork: + - 새로운 팀원을 위한 멘토링 제공 + - 다른 팀원의 원활한 업무 진행을 위한 우선적 지원 +- Knowledge, Skills + - 코드에 대한 이해 능숙 + - 기본 데이터 구조 및 알고리즘에 능숙 + - 프로젝트 사용 언어 중 하나 이상에 능숙 + - 문제의 근본 원인 파악, 문제점 분리, 해결 등을 포함한 디버깅 및 버그 수정 가능 + +## L4 + +> 프로젝트의 하나 이상의 컴포넌트에 대해 거의 독립적으로 기여한다. 매니저, TL, 시니어의 지원을 최소화하면서 더 큰 목표를 향한 E2E 작업을 스스로 수행한다. +> +- 독립적으로 주어진 일을 계획하고, 우선순위를 정하고, 실행한다. 종종 가이드를 받아 중간 이상 크기의 시스템 설계에 참여한다. 요구 사항과 관련된 기술적 문제를 식별하고 수정한다. +- 주어진 업무에 따른 결과물은 지속적으로, 기대한 품질을 만족시켜야 한다. +- 공통적으로 올라오는 이슈들에 대해 주도적으로 해결하거나 선별하여 배분할 수 있다. +- 자신 및 팀을 위해 다음에 해야 할 일, 범위애 대해 적극적으로 파악, 발굴한다. +- 하나 이상의 팀 내에서 작업하면서 광범위한 업무 범위와 관련된 지식을 전달한다. +- 주요 이해 관계자를 식별하고 팀 간 협업에 기여한다. +- 할당된 업무에 대한 일정, 목표를 조정함에 있어 종속성 및 업스트림/다운스트림 영향을 포함하여, 맡은 업무가 관련 프로젝트 또는 구성 요소와 어떻게 연결되는지 이해하고 실행한다. + +### 다음 단계로 성장하기 위해 + +모호한 문제를 해결하는데 필요한 요구 사항을 지속적으로 파악할 수 있고, 직무 관련 기술 또는 방법론의 독립적인 적용, 코딩 이외의 E2E 작업의 모든 단계에 기여할 수 있음을 보여주고, 지속적으로 팀의 문화와 운영 측면에서 개선점을 찾아간다. + +### 기준 + +- Difficulty, Scope, Complexity: + - 적당히 복잡한 하위 시스템에 대한 설계, 개발, 테스트, 프로덕트 개선 + - 여러 시스템에 영향이 가는 중소 규모 프로젝트 작업 + - 복잡한 서브 시스템 간 인터페이스 설계 + - 복잡한 시스템의 구성 요소 이식 + - 경쟁(유사) 기술을 비교하고 분석하여 시스템 설계 결정에 활용 + - 최적화 가능한 리팩토링 요소의 식별 및 개발, 이해관계자에게 변경사항 전달 +- Leadership, Influence: + - 약간의 가이드 하에 다른 L3들을 이끌면서 서브 시스템 개발, 테스트, 릴리즈 주도 + - 전체 팀을 돕기 위한 다양한 활동 수행 + - 개선된 단위 테스트, 코드 리뷰 방법 등과 같은 개발 프로세스 전파 + - 팀 내외 다른 구성원들과 활발히 지식 공유 수행 + - 하나의 목표를 위해 분산된 팀/프로젝트 안에서, + - 커뮤니케이션 및 릴리즈 일정 조율 + - 다양한 컴포넌트와 기능에 대한 종속성을 파악하고, 관련 팀원과 협력 +- Impact: + - 자신의 역할 및 결과물이 속한 팀, 프로젝트에 중대한 영향 + - 자신의 작업이 밀접히 관련된 다른 팀, 도메인의 기능/품질/일정/생산성에 기여 + - 하나의 목표를 위해 분산된 팀/프로젝트 안에서, + - 다양한 컴포넌트의 원활한 업데이트 및 릴리즈 보장 + - 다른 팀/프로젝트 지원을 위한 구축 시간 보장 + - 다른 팀/프로젝트의 개선 기회를 적극적으로 식별하고 긍정적인 기여 +- Teamwork: + - 주니어 팀원 및 신규 팀원에게 멘토링 제공 + - 다른 팀원의 원활한 업무 진행을 위한 우선적 지원 + - 개선된 팀 문화를 제안하고 리딩 +- Knowledge, Skills: + - L3 항목 모두 + - 문제의 근본 원인 파악, 문제점 분리, 해결 등을 포함한 디버깅 및 버그 수정 능숙 + - 코드 건강성을 위한 도구 개발 능숙 + - 기술 부채에 대한 파악 및 개선 가능 + - 업무와 관련된 기술에 대한 심층적인 이해와 능숙 + +## L5 + +> 개인 업무 범위를 훨씬 넘게 영향력을 보여준다. 종종 소프트웨어 엔지니어링 작업의 모든 측면에 대한 오너십을 가지고 소수의 팀 동료들이 기술 방향 및 우선 순위를 설정하는데 기여한다. +> +- 당면한 업무에 대한 결과물을 주도적으로 전달한다. 통상적으로 리드하는 업무는 여러 분기에 걸쳐져 있고 직접적 가이드를 필요로 하지 않는다. +- 문제가 모호하더라도 문제를 해결하는데 필요한 아이디어를 내고 종종 코딩 이외의 모든 활동을 포함하여 해결 방안의 완전한 오너쉽을 가진다. + - 명백한 “최상의” 솔루션이 없는 경우에도 합리적인 설계 판단을 내린다. +- 기술적인 기여뿐만 아니라 프로젝트 계획 수립과 범위 설정 과정에서 자기 주도성을 보여준다. 문제에 직면하면 범위를 지정하고 가능한 솔루션과 기술을 연구하며 단기 및 장기 요구 사항을 모두 포함하는 솔루션을 제안한다. + - 단순히 다른 사람의 아이디어를 구현하지 않는다. + - 해결 방안 중 일부를 동료들에게 이관, 가이드하면서 팀 결과를 내는데 기여한다. + - 문제에 대해 빠른 이해와 단기, 중장기의 해결 방안에 대해 제시하고, 단계적으로 전달할 수 있다. + - 미래에 발생할 문제를 예측하고 해결하기 위해 노력한다. +- 팀 리더쉽과 탁월한 개인 기여가 어느 정도 결합된 모습을 보인다. +- 인접한 여러 프로젝트 일정, 목표 및 목표의 통합에 기여한다. +- 안정성 모니터링, 보안 및 프라이버시 고려 설계, 고품질 문서화, End-to-End 시스템 통합 테스트 등이 가능하다. 공용 리소스, 유틸리티, 프레임워크 및 활동에 대한 포괄적인 지식을 활용하여 리드가 올바른 결과물을 내는데 필수적인 도움을 제공한다. +- 관리하는 팀원이 있는 경우, 팀 구성원의 적절한 배치와 그들의 경력 및 성과 관리 등 성공적인 팀 관리를 함으로써 팀의 임무를 완수한다. 팀의 기술적 복잡성을 관리할 수 있는지 확인하고 . 더 큰 전략적 노력에 기여하는 다른 매니저 및 이해 관계자와 함께 OKR을 공동으로 정의한다. + +### 다음 단계로 성장을 위해 + +모호한 문제를 해결하는데 필요한 요구 사항을 지속적으로 파악할 수 있고, 직무 관련 기술 또는 방법론의 독립적인 적용, 코딩 이외의 E2E 작업(안정성 모니터링 및 경고, 보안 및 프라이버시 기술, 문서화, 통합 테스트)의 모든 단계에 기여할 수 있음을 보여준다. + +### 기준 + +- Difficulty, Scope, Complexity: + - 팀 내 혹은 타팀의 도메인과의 의존성이 있는 시스템 아키텍처 설계 및 개발 + - 데이터와 비즈니스 요구의 평가 및 분석을 통해 적합한 솔루션 제안 및 결정 + - 중간 규모 문제에 대한 기술 부채 대응 + - 독립적으로 기술을 평가하고, 권장사항(framework)을 개발하여 기술 문제 해 +- Leadership, Influence: + - 스크래치부터 정책 수립, 프로세스 정의, 서브 시스템 설계, 구현, 릴리즈 단계 리드 + - 프로젝트 우선 순위 및 기술 리소스를 관리하고, 관련된 여러 파트너 팀, 이해 관계자와의 관계 관리 + - 엔지니어링 모범 사례 적용 + - 프로젝트 품질 관리, 잠재적 문제에 대한 예측 및 관리, 긴급한 문제에 대한 수정 + - 프로덕트의 방향성과 설계, 디자인에 대한 리더쉽 제공 + - 개발 일정과 비즈니스 일정을 조율하여 균형있는 진행 유도 + - 업무의 우선 순위를 단-중-장기 프로젝트 목표에 맞게 지속 조정 + - 프로젝트에 참여한 각각의 개인 기여자에게 조언(생산성과 퀄리티 향상) + - 본인의 팀/프로젝트 이외의 프로젝트에 대한 컨설팅 + - 기술 토크, 강의, 컨설팅 등을 통한 Best Practice 기반의 조언 및 공유 + - 하나의 목표를 위해 분산된 팀/프로젝트 안에서, + - 커뮤니케이션 및 릴리즈 일정 조율 + - 다양한 컴포넌트와 기능에 대한 종속성을 파악하고, 관련 팀원과 협력 + - 프로덕트의 기능 및 우선순위에 대한 명확한 이햐를 바탕으로 개발 복잡성 및 일정과 관련된 다양한 유관부서, 의사결정권자(PO 등), 외부 업체 등과 긴밀한 커뮤니케이션 +- Impact: + - 하나의 목표를 위해 분산된 팀/프로젝트에 영향 + - 다양한 컴포넌트와 기능에 대한 원활한 업데이트 및 릴리즈 보장 + - 다른 팀/프로젝트 지원을 위한 구축 시간 보장 + - 다른 팀/프로젝트의 개선 기회를 적극적으로 식별하고 긍정적인 기여 + - 팀 프로세스 개선에 상당히 핵심적 기여 + - 팀 전체에 영향이 가는 코드나 본인 외의 팀의 코드에 기여 +- Teamwork: + - 주니어 팀원 및 신규 팀원에게 멘토링 제공 + - 다른 팀원의 원활한 업무 진행을 위한 우선적 지원 + - 개선된 팀 문화를 제안하고 리딩 +- Knowledge, Skills: + - 코드에 대한 이해 숙달 + - 데이터 구조 및 알고리즘에 숙달 + - 프로젝트 사용 언어 중 하나 이상에 숙달 + - 문제의 근본 원인 파악, 문제점 분리, 해결 등을 포함한 디버깅 및 버그 수정 숙달 + - 코드 건강성을 위한 도구 개발 숙달 + - 아키텍처에 대한 이해 및 설계 능숙 + - 소프트웨어 테스팅 능숙 + - 기술 부채에 대한 파악 및 개선 가능 + - 업무와 관련된 기술에 대한 심층적인 이해와 능숙 + - 비즈니스 도메인에 대한 전문성 및 문제 해결 능력 능숙 + +## L6 & L7 + +L6 이상은 Senior Staff Software Engineer, Principal Engineer의 레벨이기 때문에 아무리 노력해도 10년 안에 달성하기 어렵.. L5 먼저 달성하고 생각하기로 하자.