Software Engineering at Google논문 요약자동차it융합학과20183382서정연1. 소프트웨어 개발- 소스 리포지토리- 빌드 시스템- 코드 검토- 테스트와 버그 추적- 프로그래밍 언어- 릴리스 엔지니어링2. 프로젝트 관리- 20% 시간- 목표 및 주요 결과- 프로젝트 승인 및 기업 개편- 연간 해커톤 주간3. 인력관리- 역할- 시설- 교육- 이동 및 성과 평가4. 느낀점1. 소프트웨어 개발1.1 소스 리포지토리대부분의 Google 코드 단일 통합 소스 코드 저장소에 저장되며 Google의 모든 소프트웨어 엔지니어가 액세스할 수 있다. 대부분의 Google 프로젝트는 같은 저장소를 공유한다. 일반적으로 모든 엔지니어들은 코드 조각에 액세스할 수 있고, 체크 아웃 및 빌드할 수 있으며, 로컬 수정을 수행하고, 테스트 등을 할 수 있다. 거의 모든 개발은 저장소의 “헤드에서 발생한다. 브랜치가 없으므로 문제를 조기에 식별하고 필요한 병합 작업의 양을 최소화하는 데 도움이 된다. 보안 수정 사항도 훨씬 쉽고 빠르게 넣을 수 있다.자동화된 시스템은 테스트를 자주 실행한다. 테스트가 실패한 경우에는 몇 분 이내에 테스트가 실패한 변경 사항을 작성자와 검토자에게 자동으로 알린다. 이후 변경 사항의 작성자와 팀이 협력하여 문제를 신속하게 수정하거나 문제가 되는 변경 사항을 롤백함으로써 테스트가 계속해서 통과하도록 한다.1.2 빌드 시스템Google은 소프트웨어 컴파일 및 연결, 테스트 실행을 담당하는 Blaze라는 분산 빌드 시스템을 사용한다. 전체 리포지토리에서 작동하는 소프트웨어를 빌드하고 테스트하기 위한 표준 명령을 제공함으로써 엔지니어들이 저장소에 있는 소프트웨어를 빌드하고 테스트하는 것은 매우 간단하고 빠르다. 프로그래머는 Blaze가 소프트웨어 구축 방법을 결정하는 데 사용하는 ”BUILD“파일을 작성한다. 각 빌드의 작업은 수백, 수 천대의 기계에 분산되어 있으며 선언된 입력에만 의존한다. 또한 개별 빌드 단계는 결정적으로 빌드 결과를 캐시할 수 있다. 빌드 시스템은 변경 사항에 대한 종속성을 추적하고 신뢰할 수 있다. 최종적으로 빌드 결과는 ”클라우드“에 캐시된다.1.3 코드 검토Google은 웹 기반 코드 검토 도구를 구축했다. 작성자가 검토를 요청하고 검토자가 차이점을 보고 의견을 남긴다. 기본 소스 코드 저장소에 대한 모든 변경 사항은 최소한 한 명의 다른 엔지니어가 검토한다. 엔지니어는 각 개별 변경 사항을 작게 유지하도록 권장된다. 큰 변경 사항을 분할하는 것을 선호한다.1.4 테스트와 버그 추적구글은 단위 테스트를 강력히 권장되며 널리 시행하고 있다. 모든 코드에는 단위 테스트가 있어야 하며 통합테스트 및 회귀 테스트도 널리 시행되고 있다.Google은 버그, 기능 요청, 고객 문제 및 프로세스를 추적하기 위해 Buganizer라는 버그 추적 시스템을 사용한다. 버그는 계층적 구성요소로 분류된다. Google팀이 구성요소의 미해결 문제를 정기적으로 스캔하여 우선순위를 지정하고 적절한 경우 특정 엔지니어에게 할당하는 것이 일반적이다. 많은 팀은 버그 라벨을 사용하여 버그가 분류되었는지와 각 버그가 수정될 대상이 되는 릴리스를 나타낸다.1.5 프로그래밍 언어Google의 소프트웨어 엔지니어는 Google에서 공식적으로 승인한 5가지 프로그래밍 언어(C++, Java, python, go, javascript)중 하나로 프로그래밍할 것을 강력히 권장한다. 사용되는 언어의 수를 최소화하면 코드 재사용 및 프로그래머 협업에 대한 장애물이 줄어들기 때문이다. 5가지 언어 외에도 많은 전문 도메일 특정 언어를 특정 목적을 위해 사용하기도 한다. 언어뿐만 아니라 프로세스의 공통화도 구글이 사용하는 기술 중 하나이다. 같은 명령을 프로젝트나 언어에 관계없이 사용할 수 있기 때문이다.1.6 릴리스 엔지니어링릴리즈는 가능한 자주한다. 릴리즈 작업은 대부분 자동화되어있다. 런치 전에는 개발팀 외부의 다수 승인이 필요하다.2. 프로젝트 관리2.1 20% 시간엔지니어는 관리자나 다른 사람의 승인 없이 자신의 선택한 프로젝트에 최대 20%의 시간을 할애할 수 있다. 구글은 좋은 아이디어를 가진 사람이라면 누구나 자신의 아이디어를 가치를 보여줄 프로토타입등을 개발한 충분한 시간을 준다. 또한 관리자에게 숨겨져 있을 수 있는 활동에 대한 가시성을 제공한다. 엔지니어가 자신이 하는 일에 동기를 부여하고 흥분하게 하고 지치지 않게 한다. 구글은 혁신 문화를 장려한다.2.2 목표 및 주요 결과Google의 개인과 팀은 목표를 명시적으로 문서화하고 이러한 목표를 향한 진행 상황을 평가해야 한다. 팀은 분기별 및 연간 목표를 설정하고 측정 가능한 주요 결과를 제공한다. 목표 즉 OKR은 높게 설정하며, 회사의 각 부서에서 수행하고 있는 작업을 전달하고 사회적 인센티브를 통해 직원의 좋은 성과를 장려하기 위한 핵심 매커니즘을 제공한다.2.3 프로젝트 승인 및 기업 개편Google에는 프로젝트 승인 또는 취소에 대해 잘 정의된 프로세스가 없다. 출시 승인에 대해 잘 정의된 프로세스만 있을 뿐이다. 모든 수준의 관리자는 팀이 수행하는 프로젝트에 대한 책임을 지고 적절하다고 판단되는 재량권을 행사한다. 엔지니어는 팀 범위 내에서 작업할 프로젝트를 자유롭게 선택할 수 있다. 때때로 경영진이 대규모 프로젝트를 취소하기로 한 후 해당 프로젝트에 참여했던 많은 사람이 새 팀에서 새 프로젝트를 찾아야 할 수도 있다.2.4 연간 해킹 주간Google이 혁신을 장려하는 방법의 하나는 ”해커톤“을 개최하는 것이다. 정규 일정에서 벗어나 새로운 혁신적인 프로젝트를 수행할 수 있는 1주일간의 ”해커톤“ 형식을 취한다. 사람들은 아이디어를 발표하고, 그 아이디어를 기반으로 팀을 구성하고, 최종적으로 청중과 심사위원단에게 데모를 발표한다.3. 인력관리3.1 역할Google은 엔지니어링과 관리를 분리한다. 주요 역할 6가지를 소개할 것이다. 엔지니어링 관리자는 유일한 사람 관리 역할이다. 상당한 기술 전문 지식과 사람 기술을 보유하고 있어야한다. 소프트웨어 엔지니어는 소프트웨어 개발 작업을 하는 대부분 사람들이 이 역할을 한다. 연구 과학자는 출판 기록 및 코드 작성 능력으로 입증되는 탁월한 연구능력이 필요하다. 독창적인 연구를 수행하고 논문을 발표할 수 있으며 새로운 제품 아이디어와 신기술을 개발할 수 있다. 사이트 안정성 엔지니어는 운영 시스템의 유지관리를 맡는다. 제품 관리자는 제품 관리를 담당한다. 제품 사용자의 옹호자로서 소프트웨어 엔지니어의 작업을 조정하고 해당 사용자에게 중요한 기능을 전파하고, 다른 팀과 조정하고, 버그 및 일정을 추적한다. 프로그램 관리자 혹은 기술 프로그램 관리자는 제품 관리자와 대체로 유사한 역할을 가지고 있지만 제품을 관리하는 것이 아니라 프로젝트, 프로세스 또는 작업을 관리한다.3.2 시설Google은 슬라이드, 볼 구덩이, 게임룸과 같은 재미있는 시설로 유명하다. 이는 우수한 인재를 유치하고 유지하는 데 도움이 된다. 직원들의 편의를 위한 시설들이 많이 존재한다. 직원의 건강과 행복을 유지하는 데 도움이 되어 생산성과 유지력을 향상한다. 업무적으로는 좌석은 개방형이며 상당히 밀집되어 있다. 최첨단 화상 회의 시설이 완비된 회의실도 갖추고 있다.