SE@Google
구글 엔지니어는 이렇게 일한다
컴퓨터학과
출판 기획/편집
9+년
소프트웨어 엔지니어
10+년
* 40권 이상 출간
* 집필/번역 가이드
시간 위를 걷는 프로그래밍
“저는 소프트웨어 엔지니어링이라는 용어에 막연한 거부감을 느끼며 살아왔습니다. ..중략..�이 책에서 소프트웨어 엔지니어링을 ‘시간 위를 걷는 프로그래밍’으로 정의한 표현을 읽는 순간 거부감이 사라졌습니다. 지금까지 중요하게 여기고 강조했던 많은 활동이 소프트웨어 엔지니어링에 해당했기 때문입니다.”
박재성 <우아한테크코스 총괄>
원서 제목 <Software Engineering at Google>이
<구글 엔지니어는 이렇게 일한다>로 번역된 이유
시간 위를 걷는 프로그래밍(Programming Over Time)
소프트웨어 엔지니어링: 코드를 작성하는 행위에 더하여,�시간의 흐름에 발맞춰 한 조직이 코드를 구축하고�유지보수하는 데 이용하는 모든 도구와 프로세스 포괄
시간이 흐르면 → 변경 발생, 규모 증가, 조직 성장
프로그래밍,
문화
도구,
프로세스
<소프트웨어 엔지니어링이란?>
Programming over Time
아키텍처 설계, 코딩 시 이러한 변화에 따른 비용과 트레이드오프를 고려해 의사결정
개발자께서 “안 돼”라고 말씀하셨다
개발자들이 매번 안 된다고 말하면서�쪼으면 결국 해내는 이유는?
소프트웨어 엔지니어링
프로그래밍
쪼을수록 프로그래밍에 집중하고
쪼을수록 프로그래밍에 집중하고
이 일들을 생략하고 진행하기 때문!
‘중요하게 여기고
강조했던 많은 활동’
주인을 찾습니다
소프트웨어 엔지니어링을 올바르게 이해하고,�적어도 거부감은 갖지 않았으면..
소프트웨어 엔지니어?
개발자(디벨로퍼)?
프로그래머?
코더?
→ 소프트웨어 엔지니어임을 자각하고
→ 소프트웨어 엔지니어링을 주도해야
제대로 일하고 성장할 수 있다!!
오늘 발표 목표
발표 구성
A. 주니어와 개발 문화
0부. 구글은 다르게 일한다
- 무엇이 다른가?
- 왜 달라야 했나?
- 어떻게 달라질 수 있었나?
구글은 무엇이 다른가?
예시 1 - 코드 리뷰
| 대다수 기업 | 구글 |
.. | O | O |
리뷰 전 자동 검증 | △ | 정적 분석,�(대다수의) 테스트 |
테스트 누락 시 리뷰 거부 | X | O |
리뷰어 역할 구분 | X | 다른 엔지니어,�코드 소유자,�가독성 인증자 |
예시 2 - 버전 관리와 브랜치 관리
| 대다수 기업 | 구글 |
리포지터리 | (프로젝트별/팀별 리포지터리) 멀티리포 | 모노리포 |
의존성 관리 | 원격 저장소 활용 | 원-버전�(모든 의존성을 리포지터리에,�안정된 버전은 단 하나만) |
개발 브랜치 | 적극 활용 | X�(모든 개발을 트렁크에서) |
예시 3 - 문서자료도 코드처럼
코드 | 문서자료 |
규칙, 지침, 스타일 가이드 | 규칙, 구문 규정, 스타일 가이드 |
소유자 배정 | 소유자 배정 |
원-버전 규칙 | 주제별 표준 문서 지정 |
버전 관리 | 버전 관리 |
코드 리뷰 | 변경 시 리뷰�(코드와 해당 문서자료를 하나의 변경으로 묶어 처리) |
이슈 추적 | 이슈 추적 |
예시 4 - 테스트 스위트 분류
일반적인 분류 | 구글의 주된 분류 |
단위 테스트, 통합 테스트, 시스템 테스트 | 작은 테스트, 중간 크기 테스트, 큰 테스트 |
예시 5 - 빌드 시스템
| 대다수 기업 | 구글 |
빌드 시스템 유형 | 태스크 기반 | 아티팩트 기반 |
빌드 정의 형태 | | |
init
compile
deploy
태스크
의존 관계
lib a
lib b
제품 c
아티팩트�(산출물)
의존 관계
예시 6 - 내부 개발도 오픈소스st
구글
A
B
C
…
Y
Z
모노리포
인터넷
a
b
c
y
z
오픈소스
접근, 버그 패치, 심지어 기능 추가까지 OK
예시 7 - 비욘세 규칙
적용: B팀이 CI에 등록해둔 테스트가 모두 통과한다면�→ 문제해결은 전적으로 B팀 책임�→ A팀은 CI만 믿고 계속 개발
상황
비욘세 규칙
“네가 진심으로 좋아했다면 반지를 줬어야지”�- <싱글 레이디스> 가사 중�
누구 책임??
�해석: “너에게 중요한 기능이었다면 테스트를 준비했어야지”
A팀
B팀
왜 달라야 했나?
소프트웨어 개발 생태계가 달라졌기 때문
→ 기존 틀에 갇혀서는 변화하는 환경에서 경쟁력을 유지할 수 없음
어떻게 달라질 수 있었나?
끊임없는 변화의 원동력
(★ 우리가 어떻게 일해야 하는가는 우리가 고민하여 발전시켜야 한다!)
모든 비밀은
이 책 안에!
이제부터 책 내용을 중심으로
중요한 주제를 몇 가지 살펴보겠습니다.
책의 구성
1부. 소프트웨어 엔지니어링 (1장)
2부. 문화 (2~7장)
팀워크, 지식 공유, 공정 사회,
팀 리딩, 조직 성장, 생산성 측정
3부. 프로세스 (8~15장)
스타일 가이드, 코드 리뷰,
문서자료, 테스트, 폐기
프로그래밍
(다루지 않음)
거의 모든 조직 공통
개발 조직 이야기
4부. 도구 (16~25장)
버전/브랜치 관리, 코드 검색, 빌드, 코드 리뷰, 정적 분석,
의존성 관리, 대규모 변경, 지속적 통합/배포, 서비스형 컴퓨트
구글 특화 내용
다수 포함
1부. 전제
1장. 소프트웨어 엔지니어링이란?
1장. 소프트웨어 엔지니어링이란?
소프트웨어 엔지니어링과 시간
1장. 소프트웨어 엔지니어링이란?
프로그래밍 소프트웨어 엔지니어링
�
개발
시간
개발
개념: 흐르는 시간 위에서 순간순간의 프로그래밍을 모두 합산한 것�(programming integrated over time)
목표: 기대 생애 동안 요구되는�모든 가치 있는 변경에 대응할 수 있는�지속 가능한 소프트웨어 작성
1.0
2.0
1.1
1.2
규모를 확장할 수 있는 소프트웨어가 되려면?
1장. 소프트웨어 엔지니어링이란?
�
시간
변경비용
확장 가능
평가
단기적 개발 능력뿐 아니라�여러 비용 요인들을 종합적으로�모니터링하고 개선해야 함
규모가 확장돼도 효율성을 유지하려면?
1장. 소프트웨어 엔지니어링이란?
★ 100m 달리기만 해서는 마라톤을 뛸 수 없다. 엔지니어들에게 지구력도 함께 키울 여유를 주자.
변경 비용을 줄이려면
1장. 소프트웨어 엔지니어링이란?
비용 요인: 금융 + 리소스 + 인적 + 거래 + 기회 + 사회적 비용
창의력이 핵심인 분야에서는 인적 비용이 가장 큼
→ 엔지니어들이 행복을 느끼고
일에 집중하고 능동적으로 참여할 수 있게 해줘야 함
프로그래밍 vs. 소프트웨어 엔지니어링
1장. 소프트웨어 엔지니어링이란?
프로그래밍: 코드를 생산하는 즉각적인 행위
소프트웨어 엔지니어링: 활용 가치가 남아 있는 한 오랫동안 코드를 유용하게 관리하고 팀 간 협업을 가능케 하는 정책, 관례, 도구 모두를 아우르는 종합 개념
프로그래밍 공부를�시작했어요
응원할게�
선물이야
프로세스
도
구
문 화
그래서 소프트웨어 엔지니어링이..
그래서 준비했습니다.�
평범한 한 엔지니어가 ‘더 나은 개발자를 꿈꾸며’ 걸어온 길을 SE 관점에서 따라가 보겠습니다.
알듯 말듯 한데, 구체적인 예는 없나요?
제 삶 속에서의 소프트웨어 엔지니어링 (Link)
IDE 스토킹
정적 분석 도구
프로그래밍
프로그래밍
프로그래밍
프로세스
프로세스
도구
프로세스
도구
프로세스
문화
도구
도구
문화
우당탕탕
첫 프로그램
중 1 여름방학
객체지향과 리팩터링
학부 1
디자인 패턴과 점진적 개발
군바리
버전 관리와 지속적 통합
스타트업
핵심은 사람
학부 4
애자일
현업 5 (팀 리딩)
대규모
지속적 통합
현업 6
생각해보기
2부. 문화
2장. 팀워크 이끌어내기
3장. 지식 공유
4장. 공정 사회를 위한 엔지니어링
5장. 팀 이끌기
6장. 성장하는 조직 이끌기
7장. 엔지니어링 생산성 측정하기
2장. 팀워크 이끌어내기
팀워크가 왜 중요인가?
2장. 팀워크 이끌어내기
소프트웨어 개발 = ‘팀의 단합된 노력’
But 사람 = 간헐적 버그들의 집합�
훌륭한 소프트웨어 엔지니어는 기술뿐 아니라�사람까지 잘 이해해야 한다.
동료와 나 자신
종종 실수를 하며
그마저도 일관되지 못하다.
우리 팀엔�돌I가 없네..
혹시 난가?
천재 vs. 팀
2장. 팀워크 이끌어내기
▼ 천재 신화 예시
천재 | 신화 | 진실(더 중요한 일) |
리누스 | 리눅스 커널 개발 | 수천 명의 인재들이 협업하여 지속적으로 개선하도록 이끔 |
귀도 반 로섬 | 파이썬 개발 | 첫 번째 버전 이후로는 수천 명이 직간접적으로 참여하여 개발 |
빌 게이츠 | PC용 베이식 언어 인터프리터 개발 | 마이크로소프트라는 회사를 일굼 |
마이클 조던 | 약팀의 선수로 데뷔하여 NBA 6회 우승을 이끔 | 필 잭슨 감독이 조던을 중심으로 드림 팀 구성 |
모든 건 팀에 달렸다
2장. 팀워크 이끌어내기
초월적인 업적 대부분 위대한 팀이 이루어낸다. 비전을 공유하고, 역할을 나누고, 다른 이로부터 배우며 멋진 팀을 만들자.
★ 신뢰가 거저 주어지지는 않는다.�
겸손
존중
신뢰
위대한 팀
겸손, 존중, 신뢰 실천하기
2장. 팀워크 이끌어내기
3장. 지식 공유
지식 공유 = 함께 자라기
3장. 지식 공유
지식이 제대로 공유되려면?
왜 공유하는가?
배움을 가로막는 장애물
3장. 지식 공유
심리적 안전 부족
전문가
or
초심자
짹
짹!
짹?
짹?!
이해 없이 흉내내기
유령의 묘지
정보 독점
(단일 장애점)
정보 섬
심리적 안전이 가장 중요
3장. 지식 공유
심리적 안전
시니어의 걱정
주니어의 걱정
대답하는 자세가 중요
3장. 지식 공유
모르는 게 많은 건 당연하다!
OO님 정도 경력이면
이 정도는 알아야죠
저번에도 말씀드렸다시피..
당연히 아실 줄 알았는데..
→ 나와 같은 사람이 한 명 두 명 늘다 보면
금세 팀 분위기가 달라질 것이다.
질문에도 노하우가 필요
3장. 지식 공유
“지금 이 프로젝트를 하면서
OO님에게 가장 중요한 것은 무엇인가요?”
“내가 무엇을 도와주면 좋을까요?”
“질문만 살짝 바꿔 던지면서
진득하게 듣기만 해도
인간관계 그리고 삶 자체가
달라질 수 있다.”
5장. 팀 이끌기
소프트웨어는 결국 ‘사람’이 ‘모여’ 만든다
5장. 팀 이끌기
어떤 사람이 리더가 되어야 하느냐…
5장. 팀 이끌기
팀원(개인 기여자) 역할
리더 역할
필요한 역량이
굉장히 다름
★ 경영진은 이 차이를 잘 고려하여 리더를 발탁해야..
★ 리더로 성장하고 싶다면�사회적 스킬도 갈고 닦고 어필해야..
리더의 종류와 역할 @ 구글
5장. 팀 이끌기
엔지니어링
관리자
테크 리드
리더십, 코칭, 멘토링에 관심 많음
(기술, 코드 < 사람, 제품)
‘관리자’ 트랙
실무와 기술적 전문성 추구
(사람, 제품 < 기술, 코드)
‘기술 전문가’ 트랙
<테크 리드>
<엔지니어링 관리자>
(Link)
vs.
성공적인 리더가 되기 위한 조언 1
5장. 팀 이끌기
안티패턴
올바른 패턴
성공적인 리더가 되기 위한 조언 2
5장. 팀 이끌기
구글이 리더에게 권장하는 그 외 조언과 요령
동기 부여 (TED 강연)
3부. 프로세스
8장. 스타일 가이드와 규칙
9장. 코드 리뷰
10장. 문서자료
11장. 테스트 개요
12장. 단위 테스트
13장. 테스트 대역
14장. 더 큰 테스트
15장. 폐기
구글의 개발 워크플로
코드�리뷰
코드 리뷰
편집
컴파일
디버그
서브밋
릴리스
후보
(RC)
프로덕션
빠르고 안정적인 테스트
+ 느리고 덜 결정적인 테스트
정적 분석
단계별 RC 승격
리뷰어 역할�구분
가독성 인증�제도
변경 생성
스타일 가이드,�규칙,�지침
작은/중간 크기/큰 테스트
지속적 배포
지속적 빌드
다른 엔지니어,�코드 소유자,�가독성 인증자
+ (승격 때마다) RC 전체를�광범위하게 검증하는 테스트
9장. 코드 리뷰
코드 리뷰 이점
9장. 코드 리뷰
코드 정확성 검증
코드 이해 용이성 향상
코드 일관성 향상
심리적, 문화적 이점
지식 공유
변경 이력 기록
9장. 코드 리뷰
코드 리뷰 성공
프로세스
도구(Critique)
리뷰어 선정 지원
리뷰어 역할 @ 구글
9장. 코드 리뷰
프로젝트 A
전체의 소유자
모듈 2 소유자
모듈 1 소유자
가독성 인증자 양성과 효과
9장. 코드 리뷰
가독성 인증 프로세스
변경 목록 제출
가독성
리뷰어
그룹
경지에 이르면
가독성 인증서
다양한 영역에서 모범 사례나 지침과 맞지 않는 부분
피드백
코드 리뷰 모범사례
9장. 코드 리뷰
공손하고 전문가답게
작게 변경하기
변경 설명 잘쓰기
가능한 한 자동화
리뷰어는 최소한으로
코드 리뷰, 이렇게 시작해보세요 (분할 정복)
9장. 코드 리뷰
팀 단위
코드 리뷰, 이렇게 시작해보세요 (분할 정복)
9장. 코드 리뷰
팀 단위
전사 단위
가독성 인증자 양성
11장. 테스트 개요
구글의 테스트 스위트 분류 1
11장. 테스트 개요
분류 고려 기준
분류
작은 테스트
확실한 피드백을 빠르게 전달
구글의 테스트 스위트 분류 2
11장. 테스트 개요
중간 크기 테스트
큰 테스트
작은 테스트가 중요한 이유
11장. 테스트 개요
구글의 규모
(구글이 아니더라도)�소프트웨어의 규모와 수명은 계속 늘어가는 추세�→ 테스트 범위와 상관 없이� 작은 테스트로 작성 권장
코드 리뷰
서브밋
+ 느리고 덜 결정적인 테스트
변경 생성
빠르고 안정적인 테스트
정적 분석
테스트 품질 개선과 정착을 위한 노력
11장. 테스트 개요
기억할 점
4부. 도구
16장. 버전 관리와 브랜치 관리
17장. Code Search
18장. 빌드 시스템과 빌드 철학
19장. Critique: 구글의 코드 리뷰 도구
20장. 정적 분석
21장. 의존성 관리
22장. 대규모 변경
23장. 지속적 통합
24장. 지속적 배포
25장. 서비스형 컴퓨트
구글의 도구들
리포지터리
Piper
모노리포
‘20억+ 라인’ 코드
하루 수만 건 커밋
트렁크 기반 개발
원-버전 규칙 준수
대규모 변경
Rosie
서비스형�컴퓨트
Borg
빌드
Blaze�/Forge
아티팩트 기반
분산 빌드
지속적�빌드
TAP
코드�리뷰
Critique
온라인�IDE
Cider
변경 생성�리뷰 요청�댓글
변경 수정�승인
커밋
정적 분석
Tricoder
커버리지
Zapfhahn
각종 컴파일러
Code Search
모노리포�전체 인덱싱,
랭킹, ..
크래시 리포팅 도구,�로그 뷰어, ..
UI
상호참조 분석
Kythe
백엔드
시간 흐름과 S/W·조직 규모 확장에�어떻게 대응하는가?
5. 덧붙여서
A. 주니어와 개발 문화
(멘탈 부여잡고) 좋은 문화 뿌리내리기 (Link)
같은 편 되기: 내게 이롭더라도 싫어하는 사람이 추진하는 일에는 협력하기 싫은 게 인지상정.�→ 내가 무언가 추진하려면 상대가 나를 같은 편으로 생각해야..
공감 끌어내기: 공감되지 않은 일에 내 시간을 쓰지 않음. 혹은 시늉만 함.�→ 함께 변해야 할 사람들이 공감해야 추진력이 생김.
실패하고 다듬기: 문화, 즉 사람을 바꾸는 일을 한 번의 실패도 없이 성공하기는 거의 불가능.
우선순위
1. 조직의 변화에 적극 동참하자
한편, 조직 차원의 변화를 주니어가 주도하기는 어려움
2. 그렇다면
옵션 1: 자신의 변화부터 주도
⇒ 서서히 신뢰가 쌓이고 영향력이 커짐
⇒ 변화를 주도할 기회가 왔을 때� 성공 확률 증가
옵션 2: 한 계단 윗 사람 포섭
(한 계단 윗 사람 = A)
방법:
→ 내가 주도할 때보다 성공 가능성 up
주의점
비중 이동: 스펙 쌓기 → 신뢰 쌓기
스펙: 상대에 대한 신뢰가 없을 때 중요
연차가 쌓일수록 인맥으로 이직/팀 이동
★ 현재 프로젝트, 함께 일하는 동료에게 소홀하지 말자!
(마지막으로) 끊임없는 변화의 원동력
Q1. ‘프로그래머’, ‘개발자’, ‘엔지니어’라는 명칭의 차이가 있다고 생각하나?
Q2. 성공적인 개발팀 리더로 성장하길 원하는 사람을 위해 추천하는 책, 강의 등의 자료가 있다면?
Q3. 신입 개발자에게 해주고 싶은 조언이나 공부법이 있다면?
(참고) 개발 분야별 로드맵: https://roadmap.sh
Q4. 단 하나의 개발 문화를 도입한다면?
코드 리뷰
Q5. 관성에 젖은 개발자들의 저항을 극복하여 좋은 문화를 뿌리내리려면?
Q6. 가장 재미 있던 팀 스터디는?
Q7. 한국의 개발 문화에 적용하기 어려운 부분은?
Q8. 구글의 테스트 커버리지 기준은?
Q9. 다른 신입 개발자와 차별화되는 신입 개발자가 되려면?
Q10. 주니어 개발자의 성장을 위한 구글의 시스템 혹은 문화는?
Q11. 모든 팀원이 동의하고 공감할 수 있는 개발 문화를 채택하려면 어떤 프로세스를 거쳐야?
Q12. 좋은 사람들과 함께 성장하며 일하고 싶다.�좋은 회사를 알아보고 선택하는 방법은?
Q13. 책에서 가장 마음에 드는 챕터와 이유는?
Q14. 비전공자라서 주변에 아는 선배 개발자가 적다.�많은 선배 개발자/멘토를 만나 배우고 성장하려면?
왜?
Q15. 코드 리뷰 문화의 성과를 보여주는 방법이 있을지?
Q16. 챗GPT가 개발 공부에 유용하지만, 한편으론 사고력을 기르는 데 방해된다. 어느 수준까지 활용해야 하나?
프로그래밍 소프트웨어 엔지니어링
�
개발
시간
개발
1.0
2.0
1.1
1.2
Q17. 시니어가 없는 조직에서 주니어끼리의 코드 리뷰가 의미가 있을지?
Q18. ‘개발자’들만의 문화는 어떤 특징이?
Q19. 구글의 모델이 소규모 스타트업에도 어울릴까?
Q20. (전공자 출신 기획자) 필요한 건 직접 개발/검증해 보고 싶지만 손 놓은지 오래라 자신이 없음. 조언?
Q21. 코드를 짜기 힘들거나 일을 자꾸 미루게 될 때, 자신만의 해법이 있다면?