본문 바로가기메뉴 바로가기


뉴크루 온보딩 코드 리뷰어로 참여하기 – 카카오는 주니어와 함께 성장합니다.

안녕하세요. 카카오 SA개발파트에서 검색광고 DSP 서버 개발을 하고 있는 제노스입니다. 이번 글에서는 2021 뉴크루 온보딩에 코드 리뷰어로 참여하기 위해 체계적으로 교육받고 리뷰를 준비했던 과정부터 실제 코드 리뷰어로 활동하면서 얻게 된 경험들을 공유드리고자 합니다.


망설여졌던 코드 리뷰어 지원기

이미 부서에서 프로젝트별 코드 리뷰를 진행하고 있음에도 코드 리뷰에는 정해진 규칙이 없기에 뉴크루 코드 리뷰어 모집 톡에 지원이 망설여졌습니다.  그러나 그다음 날아온 지원 요건을 보고 지원하기로 마음을 먹게 되었습니다. 평소에 관심 있었던 분야의 강의를 전문강사로부터 듣고, 전문 코드 리뷰어에게 직접 코드 리뷰도 받으면서 뉴크루들에게 도움도 줄 수 있는 너무 좋은 기회였기 때문입니다.

뉴크루 코드 리뷰어 모집 톡

그렇게 시작된 두 달간의 코드 리뷰어 교육기간

모든 일이 그렇듯 항상 시작하기 전에는 두려움 반 설렘 반으로 어떤 일이 벌어질지 상상해보게 되는데 이번에도 어떻게 교육을 받을지, 미리 준비해둬야 하는 건 없을지 혼자서 이 생각 저 생각 하면서 첫 번째 교육 전날에는 밤잠을 설쳤습니다. 

코드 리뷰어 교육은 넥스트스텝 박재성 님이 주관하셨고, 뉴크루가 받게 되는 교육방식, 콘텐츠와 유사하게 진행되었습니다. 뉴크루가 받게 될 커리큘럼을 중심으로 코드 리뷰어도 학습하게 되었고, 하나의 미션이 끝나는 시점마다 해당 미션에 대한 피드백을 받고 질의응답 시간을 가지며 학습자 관점과 코드 리뷰어 관점을 동시에 경험할 수 있는 교육으로 이루어졌습니다.

각 미션별로 진행할 때 단위 테스트, TDD, FP, OOP와 같이 코드 리뷰를 통해 중점적으로 다룰 주제들이 정해져 있었습니다. 

< 클린 코드 과정의 학습 목표 >

  • TDD, 리팩토링, 클린 코드
  • 순수 자바로 객체지향 프로그래밍
  • 레거시 코드 리팩토링

클린 코드 과정의 학습 목표를 달성하기 위함인가? 프로그래밍 자체가 얼마나 재미있는 활동인지 경험하고, 효과적으로 프로그래밍을 학습하는 방법을 경험하고, 프로그래머로 어떻게 성장하고, 어떻게 살아갈 것인지 같이 고민하는 시간으로 만들기 위함이다.

전체 과정에 대한 학습목표가 경험을 강조하고 있어서 인상 깊었습니다. 소프트웨어 개발에는 정답이 없고, 그때그때 상황에 따라 달라질 수 있는 수많은 트레이드오프 상황에 많이 놓이기 때문에 경험을 중심으로 제시된 학습 목표에 크게 공감했습니다. 과정에 얼마나 열심히 참여하느냐에 따라 많은 것을 얻고 크게 성장할 수 있는 기회라는 생각이 들어서 진심을 다해 노력해보기로 했습니다.

객체지향 생활 체조 원칙

규칙 1: 한 메서드에 오직 한 단계의 들여쓰기(indent)만 한다.
규칙 2: else 예약어를 쓰지 않는다.
규칙 3: 모든 원시값과 문자열을 포장한다.
규칙 4: 한 줄에 점을 하나만 찍는다.
규칙 5: 줄여쓰지 않는다(축약 금지).
규칙 6: 모든 엔티티를 작게 유지한다.
규칙 7: 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
규칙 8: 일급 콜렉션을 쓴다.
규칙 9: 게터/세터/프로퍼티를 쓰지 않는다.

‘소트웍스 앤솔러지’ 책에 나오는 ‘제프 베조’의 ‘객체지향 생활체조’라는 제목의 에세이에서 더 나은 객체지향 설계를 위한 9가지 원칙을 제시하고 있습니다. 이 원칙들을 하나둘씩 지켜가며 미션을 수행할 수 있도록 과정이 설계되었습니다. 미션을 진행할 때마다 지켜야 하는 원칙의 수를 늘려가다가 마지막 미션에서는 모든 원칙을 지킬 수 있도록 가이드 되었습니다.

‘생활 체조’라는 단어가 원칙에 들어가 있듯이 지속적인 수련을 강조하고 있습니다. 과정을 슬기롭게 소화하기 위해서는 매일 1, 2시간 이상 꾸준히 연습할 시간을 확보하기 위해 주변 환경을 바꾸고, 게임을 하거나 TV를 보며 쉬는 대신 프로그래밍 관련 책만 읽는 등의 우선순위 조정이 필요하다고 배우기도 했습니다. 저는 개인적으로도 더 성장하고, 동료들에게도 좋은 내용들은 공유하기 위해서 교육과정과 관련된 몇 가지 목표를 추가로 정했습니다.

< 자체적인 목표 >

  • 학습 로드맵에 나온 개발 관련 서적 모두 읽고, 이미 읽었던 책은 다시 훑어보기
  • 외출 자제하기
  • 미션을 시작하면 리뷰 요청을 할 수 있을 때까지 다른 행동하지 않기(화장실 제외)
  • 교육 과정에서 배우거나 미션 수행 중에 적용한 내용들은 틈틈이 파트원들에게 공유하기

 자체적인 목표와 함께 미션을 진행하며 넥스트스텝의 코드 리뷰어들로부터 코드 리뷰를 받기 시작했습니다. 사람을 만날 때 첫인상이 가장 강렬하게 남듯이 첫 번째 미션을 수행할 때 받았던 코드 리뷰들이 가장 기억에 많이 남습니다.

전문 코드 리뷰어의 상세한 피드백

기능 구현도 잘 되었고 테스트도 잘 작성해서 ‘이 정도면 되겠지?’라는 마음으로 리뷰를 요청했습니다. 그런데 생각보다 많은 양의 코멘트가 있어서 놀라는 마음에 리뷰를 확인하였는데 미션을 수행하는 각 단계마다 모든 코드에 대해서 세세하게 코멘트를 남겨주셔서 감동했습니다. 직접 코드를 작성한 제 자신보다 더 큰 애정을 가지고 있다고 느껴질 정도로 꼼꼼하게 리뷰해 주셨습니다. ‘클린 코드’라는 책을 읽긴 했지만 실제로 코드를 작성할 때는 많은 부분들을 적용하지 못하고 있었다는 사실에 반성하면서 읽었던 책들을 뒤적이며 리팩토링을 하고 다시 리뷰를 요청했습니다. 

다시 받은 코멘트를 읽어보니 이전에 남겨주셨던 코멘트임에도 같은 실수를 반복했을 때, 친절하게 다시 코멘트를 남겨주셔서 클린 코드를 작성하는 데 방해가 되는 습관들을 결국에는 조금씩 고쳐갈 수 있었습니다. 혹시라도 예전에 받았던 코멘트를 다시 받을까 봐 커밋 하기 전에 작성한 코드를 좀 더 꼼꼼하게 살펴보는 습관도 생기게 되었습니다. 평소에 TDD를 실천하려고 신경 쓰고 있었지만 TDD 사이클 중에 리팩토링 하는 부분을 항상 놓치고 있었다는 사실을 깨닫게 되었습니다.

< 테스트 주도 개발(Test Driven Development, TDD) 사이클 >

  1. 실패하는 단위 테스트를 추가한다.
  2. 테스트를 통과하도록 구현한다.
  3. 구현한 코드를 리팩토링한다.
  4. 요구 사항을 만족할 때까지 1~3단계의 사이클을 반복한다.

TDD 사이클을 유지하면서 객체지향 생활체조 원칙과 피드백 받은 코멘트들을 지속적으로 반영하다 보니 미션에서 요구하는 기능을 만족하면서 깔끔하게 코드를 작성하는 경험을 하게 되었습니다. 수백 가지의 원칙을 지키려고 한 것이 아님에도 불구하고, 9가지의 원칙과 코드 리뷰를 통해서 전보다 훨씬 더 나은 코드를 작성할 수 있다는 경험은 정말 신선했습니다. 처음 코드 리뷰어로 지원했을 때만 해도 뉴크루들에게 ‘도움 될만한 코드 리뷰를 남기는 것’이 목표였는데 이런 멋진 경험을 할 수 있도록 도와주어야겠다는 욕심이 생겼습니다. 코드 작성에 정답이라는 것은 없지만 몇 가지 원칙을 같이 일하는 동료들과 정해서 실무에 반영하다 보면 코드의 품질이 향상될 수 있을 거라는 확신도 들게 되었습니다. 

다행히 ‘TDD, Clean Code with Java’ 강의의 미션들은 모두 완료했고, ‘카카오 코드 리뷰어 양성 과정’의 미션을 통해 코드 리뷰어로 지정된 크루들끼리 서로 리뷰를 해주는 단계까지 갈 수 있었습니다.

본격적으로 시작된 한 달간의 코드 리뷰

화끈하게 불살랐던 교육기간이 끝남과 동시에 코드 리뷰어로서 뉴크루들을 맞이하게 되었습니다. 뉴크루들은 첫날부터 열심히 미션을 수행하며 리뷰를 요청했습니다. 하나의 미션이 진행될 때마다 코드 리뷰어 당 3명의 뉴크루들을 리뷰하게 되었고, 리뷰 요청이 온 코드를 받아서 실행해보고, 테스트도 돌려보고, 기능을 위한 코드와 테스트 코드도 하나씩 살펴봤습니다. 

교육받는 동안 제가 받았던 코드 리뷰어들의 친절하고 자세한 코멘트들을 떠올리며 저도 그렇게 코멘트를 하나씩 남기려고 노력했습니다. 혹여나 제시한 방법만이 정답이라는 고정관념을 심어주게 될까 봐 ‘이런 방향으로 고민해 보면 어떨까요?’, ‘이 방법으로도 가능한데 한번 공부해보면 어떨까요?’와 같이 제안하는 방식을 많이 사용하며, 뉴크루들이 질문한 사항에 대해서 가급적 이미 나와있는 자료들을 기반으로 제안하고 답변하기 위해서 코멘트를 달기 전에 꼭 검색을 해보거나 읽었던 책들을 다시 살펴봤습니다. 너무 딱딱한 말투로 보이는 건 아닐지 염려도 되어서 ‘ 🙂 ’ 같은 이모티콘도 간간이 코멘트에 넣기도 했습니다.

한 번에 너무 많은 양의 코멘트를 남기면 다음 단계로 나가기가 너무 벅찰 수 있기에 한 번에 남기는 코멘트의 개수는 20개 이내가 되도록 가이드가 되어서 개수도 조절했고, 리뷰 요청이 몰리는 날에는 저녁시간부터 리뷰를 시작해서 12시를 넘기는 날들도 있었지만 뉴크루에게 피드백을 반영하면서 코드가 개선되는 경험을 하도록 도와주고 싶어서 리뷰를 게을리할 수 없었습니다. 빠진 코멘트는 없는지 다시 확인하기도 했습니다.

다른 코드 리뷰어들과 다 같이 한마음으로 뉴크루들의 성장을 위해서 고군분투하며, 그 누구도 강요하지 않았지만 모두들 열정적으로 코드 리뷰에 임했습니다. 사내 인프라를 사용하는 방법이나 서버 개발에 관련된 다른 강의를 진행해 주시는 크루 분도 계셨습니다.

업무와 병행하면서 코드 리뷰하는 것도 만만치 않은데 강의까지 준비해 주시는 다른 크루들을 선망의 눈빛으로 바라보면서 ‘난 아직 멀었구나’라는 생각과 함께 코드 리뷰를 하는 데 있어서 좀 더 분발하게 되었습니다.

리뷰 요청과 함께 열정적으로 질문하는 뉴크루들

이런 노력들에 응답이라도 하듯이 뉴크루들도 코멘트를 보고 빠르게 피드백을 반영한 후, 새벽에 리뷰 요청을 보내기도 했습니다. 그리고 하나라도 더 배우기 위해서 고민되는 부분들이나 잘 이해가 되지 않는 내용들, 공부할 수 있는 자료들에 대해서 질문하기도 했습니다. 전에 미처 생각하지 못했던 부분들을 같이 고민하고 질문에 대한 답변을 해주기 위해 자료를 찾아보며 공부하면서 ‘이런 것이 바로 함께 성장하는 거구나’라는 생각을 하게 되었습니다. 

그렇게 한 달이라는 시간이 흐르고, 코드 리뷰어 활동도 거의 막바지에 다다르게 되었습니다. 한 달간의 성심성의껏 코드 리뷰를 했지만 정말 뉴크루들에게 도움이 많이 되었을지 걱정이 많이 되었습니다. 시간이 지날수록 뉴크루들의 코드 품질이 좋아지는 것을 보면서 뉴크루들이 성장하는 데 도움이 되었다고 느끼고는 있었지만 확신은 없었습니다. 

뉴크루의 회고 중 기억에 남는 발표 슬라이드

뉴크루들의 교육기간이 끝나고 각자의 부서로 배치되기 전에 회고 시간을 통해 코드 리뷰가 너무 좋았다는 피드백을 받았습니다. 발표 자료에 캡처된 코멘트 숫자를 보면서 ‘와 진짜 다들 열심히 했구나. 어떤 분이 저렇게 많은 코멘트를 주고받았을까?’라는 궁금증이 생겨서 리뷰 요청 글들을 찾아봤습니다.

리뷰 요청 글들을 하나씩 보다 보니 다른 코드 리뷰어들의 리뷰에서도 배울 점이 굉장히 많았습니다. ‘아 이런 내용을 알려줄 수도 있었구나. 자료를 찾아서 링크만 공유하기보다 필요한 내용들을 좀 정리해서 코멘트를 남기면 더 전달이 잘 되겠구나.’ 코드 리뷰를 잘하는 데 있어서 자체적으로 좋은 회고 시간이 되었습니다.

계속 보다 보니 63개의 코멘트를 주고받은 코드 리뷰어는 다름 아닌 저였습니다. 다른 코드 리뷰어들과 함께 열심히 활동을 했다고 인정받는 기분이었습니다. 3개월간의 노력이 뉴크루들의 좋은 경험으로 이어졌다는 생각에 뿌듯하기도 했습니다. 이후 뉴크루들을 대상으로 진행된 설문조사에서도 코드 리뷰에 대한 긍정적인 피드백이 많았고, 그제야 조금 안도의 한숨을 내쉴 수 있었습니다. 

코드 리뷰어 활동을 마친 후

코드 리뷰어 활동을 하면서 뉴크루들에게 미처 전달하지 못했던 부분들에 대한 아쉬움이 남아서, 그 아쉬움을 달래고자 파트 내에서 전보다 더 열심히 코드 리뷰를 하고 있습니다. 코드 리뷰어 활동은 저에게 있어서 너무 좋은 경험이었고 좋았던 경험들을 정리하자면 다음과 같습니다.

  • 작성한 코드를 커밋 하기 전에 다시 검토하는 습관을 들이게 된 경험
  • TDD 사이클을 유지한 채로 객체지향 생활체조 원칙과 코드 리뷰를 통해 피드백을 지속적으로 반영했을 때, 요구 사항을 만족하면서 코드가 점진적으로 개선되는 경험
  • 일방적인 주입식 교육이 아닌, 코드 리뷰를 통해 서로 커뮤니케이션하면서 함께 성장하는 경험
  • 다른 사람의 역량을 키우는 데 도움이 되는 교육자로서의 경험

 

카카오는 많은 개발자들이 주니어 개발자들과 함께 성장할 수 있는 환경과 기회를 적극적으로 만들어 가고 있습니다. 그런 기회를 주신 많은 분들 그리고 열심히 피드백을 반영하며 함께 성장했던 뉴크루들 덕분에 저도 이런 좋은 경험들을 더 수월하고 즐겁게 할 수 있었습니다.

이렇게 좋은 성장 환경을 주니어 개발자들이 많이 관심을 가져 주시면 좋겠습니다. 저 또한 앞으로도 동료와 함께 성장하는 개발자가 되도록 노력하겠습니다.

모든 분들께 감사의 말씀을 드리며 코드 리뷰어 활동기를 마치겠습니다.


2021 카카오 신입 개발자 온보딩 과정

genos.lee
genos.lee 카카오 SA개발파트에서 어제보다 더 나은 코드를 작성하고 함께 성장하는 개발자가 되기 위해 꾸준히 노력하고 있습니다.
Top Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codereview
coding
coding test
competition
Compliance
component
conference
consul
container
contents
contest
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
employeecard
emscripten
eslint
Feature List
Featured
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
github
globalpollution
go
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mobil
monad
monorepo
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
parallel
PBA
performance
planning poker
Platform
polyfill
programming-contest
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
sharding
shopping
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
Thread-Debugging
time-wait
tmux
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web-cache
webapp
webgl
WebSocket
webworkers
weekly
work
workplatform
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
All Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codereview
coding
coding test
competition
Compliance
component
conference
consul
container
contents
contest
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
employeecard
emscripten
eslint
Feature List
Featured
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
github
globalpollution
go
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mobil
monad
monorepo
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
parallel
PBA
performance
planning poker
Platform
polyfill
programming-contest
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
sharding
shopping
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
Thread-Debugging
time-wait
tmux
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web-cache
webapp
webgl
WebSocket
webworkers
weekly
work
workplatform
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석

위로