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


저는 2020년 겨울에 추천팀에서 2개월의 짧은 인턴 생활을 마치고, 정식 크루로 전환된 추천팀 추천 기술 1파트의 charlie입니다. 인턴 생활을 하면서 어떤 경험을 했는지 이야기해 보려고 합니다.


추천팀 인턴십?

인턴 생활기를 말씀드리기 전에, 먼저 추천팀 인턴십은 무엇이고, 어떻게 지원하게 되었는지 간략히 말씀드리려 합니다.

추천팀은 카카오에서 진행하는 인턴십 프로그램과 별개로, 팀 내에서 독자적인 인턴십을 운영하고 있습니다. 즉, 인턴십에 지원하는 순간부터 추천팀을 목표로 한다고 보시면 되는데요. 이러한 독자적 운영의 이유는 조금 더 추천팀에 적합한 인재를 선정하기 위함에 있고, 인턴십 대상자 선발 과정도 추천팀에 필요한 역량을 지녔는지 확인하는 과정으로 구성되어 있습니다.

추천팀 인턴십은 2018년부터 시작해서 3년째 진행되고 있습니다. 이 3년이란 기간 동안 인턴십 프로그램에 정말 많은 분들이 거쳐가셨고, 2020년 겨울에도 이 인턴십에 참여하기 위해 많은 분들이 지원해 주셨습니다. 저 역시 그 많은 지원자분들 중 하나였는데요. 제 관심 분야인 기계학습을 활용하여 추천 기술에 적용하고 있다는 점이나, 추천을 통해 사람들에게 원하는 정보를 제공해 줌으로써 더 나은 사용자 경험을 제공해 줄 수 있다는 점이 저에겐 큰 가치로 느껴져서 겨울 인턴십에 지원하게 되었습니다.

추천팀 인턴 모집 공고에 적혀있는 조직 소개

지원 이후 코딩 테스트와 면접 등 일련의 심사 과정을 거치게 되었고, 감사하게도 인턴십 프로그램에 최종 합격하게 돼서 2개월의 인턴 생활을 추천팀에서 시작하게 되었습니다.

인턴십 과정

입사 첫날에는 카카오에서 진행하는 사내 온보딩 프로그램에 참여하여 회사 생활에 필요한 기초적인 내용들을 배웠습니다. 이후, 추천팀에서 진행하는 팀 내 온보딩 프로그램에 참여하여 인턴십에 대한 설명을 들으며, 본격적인 인턴 생활을 시작했습니다.

2020년 겨울 기준으로, 추천팀에서 진행되는 인턴십 프로그램은 크게 두 단계로 구성되어 있었습니다. 

바로 1차, 2차 프로젝트를 진행하는 것인데요. 1차의 경우 추천팀 업무에 익숙해지기 위한 목적으로 진행되고, 2차는 1차에서 쌓은 경험을 바탕으로 추천팀에서 필요한 업무를 수행하기 위한 목적으로 진행됩니다. 그리고 각 프로젝트가 끝날 때마다, 수행한 프로젝트 결과물을 팀에게 공유하기 위해 발표를 하게 되고 프로젝트를 마무리하게 됩니다.

1차 프로젝트

1차 프로젝트에서는 추천팀의 실제 추천 서비스 중 하나를 배정받고, 서비스에 적용되는 추천 기술들의 성능 향상을 통한 지표 개선을 목적으로 프로젝트를 수행하게 됩니다. 현재 추천 기술들이 적용된 카카오의 서비스는 카카오톡, 다음 뉴스, 브런치, 멜론, 그리고 카카오 페이지 등 이 있습니다. 저는 이 서비스들 중 (현재는 뷰탭으로 바뀐) 카카오톡 샵탭의 카페 글 연관 추천 프로젝트를 진행하게 되었습니다. 연관 추천이란 주어진 아이템과 연관된(유사한) 아이템들을 추천하는 것을 의미합니다. 그리고 카카오톡 샵탭 카페 글이란, 카카오톡 서비스 중 샵탭에서 볼 수 있는 다음 카페의 인기글을 의미합니다. 즉, 사용자가 카카오톡 샵탭을 통해 다음 카페의 글을 확인하게 되면, 확인한 글과 연관이 있으면서 동시에 사용자들이 관심 있어 할 만한 다른 글들을 잘 추천해 주는 것이 이번 1차 프로젝트의 목표였습니다.

카카오톡 샵탭의 카페 인기글 추천
(빨간 영역이 추천된 연관 게시글이며,
2021년 8월 이후로 샵탭 서비스는 종료되고 뷰탭 서비스가 새롭게 런칭되었습니다.)

1차 프로젝트의 진행은 팀으로 이루어졌습니다. 그래서 입사 첫날 온보딩을 진행하면서 함께할 팀과 버디를 배정받고, 바로 프로젝트를 진행했었는데요. 처음엔 모든 것이 낯설게만 느껴지고, 어디서부터 시작해야 할지 몰라서 막막하기만 했었습니다 (심지어 팀에서 사용하는 Mac OS 환경을 이때 처음 접했습니다). 다행히 저에게는 버디와 팀원분들이 있었고, 팀에서 사용하는 github 그리고 slack에 프로젝트를 진행하기 위해 필요한 내용이 잘 문서화되어 있었기 때문에 빠른 시일 내에 원활히 업무에 적응할 수 있었습니다. 그리고 slack에서 도움을 구하면, 굳이 버디가 아니라도 추천팀의 많은 분들이 마치 내 일처럼 열심히 도와주셨고, 매주 팀과 버디 간 티타임 시간을 가지며 팀 문화에 적응하는데도 큰 도움을 받았습니다. 

github을 통해 확인할 수 있는 추천팀 인턴을 위한 문서 

1차 프로젝트에서 가장 기억에 남았던 순간을 꼽자면, 열심히 고민해서 기획하고 구현한 추천 알고리즘이 실제 서비스에 적용되는 순간이었습니다. 프로젝트를 진행하면서 알게 됐지만, 제가 맡은 카페 샵탭 추천 서비스는 이미 서비스 지표 향상을 위해 많은 시도가 있었고 이에 따른 많은 실험 결과가 있었습니다. 즉, 그만큼 숙지해야 될 내용들이 많았고, 기존에 시도되지 않았던 방식을 찾기 위해 더욱 열심히 고민해야 함을 의미했습니다. 코로나로 인해 원격 근무 체제에 있었던 저희 팀은 밤낮을 가리지 않고 프로젝트 기간 동안 매일같이 온라인으로 회의를 했었고, 많은 시행착오를 겪은 뒤 저희가 구현한 추천 알고리즘을 성공적으로 실제 서비스에 적용하는데 성공했습니다. 지금 와서는 자주 겪는 일이지만, 수많은 사용자들이 카카오톡을 통하여 저희가 적용한 알고리즘을 이용하게 된다는 경험은 참 인상 깊었습니다.

감격의 순간

프로젝트 막바지에 이르러서는 지금까지 시도했던 내용들을 정리하고, 해당 내용을 발표하기 위한 자료를 준비했습니다. 안타깝게도 저희 팀이 진행한 실험에서는 서비스 지표 개선을 이루진 못했는데요. 발표를 준비할 때 이런 부분이 마음에 걸렸었습니다. 하지만 1차 프로젝트에서 지표 개선은 어디까지나 보너스의 개념일 뿐이고, 추천 시스템을 명확히 이해하면서 합리적인 실험 설계를 구성하는 것이 더 중요하다는 버디의 말씀을 듣고, 이에 맞추어 발표를 준비했습니다. 실제로 과거에 진행된 1차 프로젝트에서도 서비스 지표 개선이 있었다는 경우는 많이 없었고, 이를 조사하며 그만큼 추천 성능을 올리기란 참 쉬운 일이 아님을 크게 느꼈습니다.

발표날에는 팀 별로 돌아가며 발표를 진행했고, 발표를 마친 뒤에는 다른 추천팀 크루 분들이 질문하시는 시간을 가졌습니다. 발표를 들으면서 다른 팀의 다양하고 참신한 아이디어를 확인할 수 있었고, 프로젝트를 위해 다들 정말 열심히 노력했다는 느낌을 받을 수 있었습니다. 또한, 질문 시간에는 많은 크루 분들이 날카로운 질문들을 던져주셨습니다. 예를 들면,

“이 방식에서 사용하는 hyperparameter는 어떤 값으로 설정하셨고, 왜 그 값으로 설정하셨나요?” 

“적용하신 방식이 기존 방식보다 어떤 장점이 있나요?”

“실제로 적용해보니 말씀하신 장점을 확인할 수 있었나요?”

와 같은 질문들을 하셨는데, 어떤 질문들은 정말 생각하지 못했던 질문이어서 잘 대답을 못한 경우도 있었습니다. 하지만 던져주신 여러 질문 덕분에 프로젝트가 끝난 뒤에도 많은 생각을 할 수 있었고, 이후 2차 프로젝트를 진행할 때 과제 해결에 대한 접근 방향을 설정하는데 큰 도움을 얻을 수 있었습니다.

코로나로 인해 원격 발표로 진행된 1차 프로젝트 발표 모습

2차 프로젝트

1차 프로젝트를 무사히 마쳤다는 여운이 채가시기도 전에 2차 프로젝트를 수행하게 되었습니다. 1차와 달리 2차에서는 1차에서 진행했던 서비스 지표 개선 업무를 포함하여, 팀 내의 여러 부서에서 실제로 필요한 업무들을 프로젝트 과제로 수행하게 됩니다. 또한, 추천팀에서는 미리 수행할 과제들에 대해 인턴분들이 선호하는 정도를 설문으로 조사하고, 조사한 내용에 기반하여 개개인의 역량을 최대한 보여줄 수 있는 과제를 부여하게 됩니다. 그래서 대부분 개인 프로젝트로 진행하게 되지만, 일부 과제의 경우 팀 프로젝트로 진행하는 경우도 있었습니다.

저는 정들었던 1차 프로젝트의 팀원분들을 뒤로하고 개인으로 과제를 진행하게 됐습니다 (물론 완전히 헤어진 건 아니고, 프로젝트 진행 도중에 종종 안부를 물으며 사이좋게 지냈습니다). 제가 맡았던 2차 프로젝트 과제의 주제는 scalable random walk collaborative filtering(CF)였습니다. 이 연구 과제에 대해 간략히 설명드리자면, graph에서 수행하는 random walk 방식은 CF 추천 방식 중 하나인데, graph 크기에 따라 추천 시스템에게 영향을 주는 정도를 최소화하면서 좋은 추천 성능을 낼 수 있도록 다양한 방법을 통해 random walk 수행 방식을 최적화해야 하는 과제였습니다. 사실 이 과제를 받았을 때, random walk에 대해서 거의 아는 바가 없었지만, 오히려 이런 점이 프로젝트를 더욱 열심히 해야겠다는 동기가 되어주었습니다.

github issue에서 확인할 수 있는 다양한 2차 프로젝트 과제

프로젝트의 내용은 달라졌지만, 진행과정은 크게 다르진 않았습니다. 과제 수행을 위한 실험 아이디어를 계획 및 구현하고, 필요한 문서를 조사하는 과정이 주를 이뤘습니다. 다만, 팀으로 진행했었던 1차와 다르게 2차에서는 혼자였기 때문에 조금은 쓸쓸했습니다. 특히 코로나 때문에 원격 근무를 진행했던 터라 더욱 적적하게 느껴졌었는데요. 하지만, 제가 진행하는 과제와 연관된 부서가 진행하는 회의에 참가하여 함께 의견을 나누면서 피드백을 받을 수 있었고, 프로젝트 진행 중간에 열리는 온라인 행아웃을 통해 다른 크루 분들과 친목을 도모할 수 있어서 외로움을 이겨내는데 큰 도움을 받을 수 있었습니다.

gather에서 진행된 추천팀 행아웃 

2차 프로젝트에서 재밌었던 점은 프로젝트 기간이 1차보다 길기 때문에 (1차는 2주, 2차는 6주 정도), 과제 해결을 위한 다양한 시도를 해볼 수 있었다는 점입니다. 특히, 과제 해결을 위한 방식에 제한을 두지 않았던 점도 인상 깊었습니다. 오픈 소스를 가져와서 적용해도 괜찮았으며, 개발에 필요한 자원도 마음껏 지원받았었습니다. 다만, 흔히들 자유에는 책임이 따른다고 말하는 것처럼, 어떤 방식을 시도하려 할 때는 그에 따른 데이터와 근거를 스스로 찾으며 시도의 이유를 마련할 필요가 있었습니다. 

긴 프로젝트 기간이었지만 시간이 금방 지나가버렸고, 막바지에 이르러서는 1차 때와 마찬가지로 발표 자료를 준비했습니다. 프로젝트 기간이 길었던 만큼 여러 실험을 진행했고 그만큼 많은 결과를 얻었습니다. 하지만, 발표 시간은 한정되었기 때문에 팀에게 공유할만한 핵심적인 내용들을 추려야 했었고, 이 과정에서도 많은 걸 배울 수 있었습니다. 그리고 1차 프로젝트 발표에서 받았던 질문들을 생각하면서, 비슷한 질문을 받을 경우 대답을 잘 못하는 경우가 없도록 노력했습니다. 

발표날에는 1차 때와 마찬가지로 각자 돌아가며 발표를 진행하고 질문 시간을 가졌습니다. 다만, 팀으로 진행하던 1차와 달리 개인 프로젝트가 많은 2차여서, 거의 하루 종일 발표를 듣고 질문을 했었던 기억이 납니다. 그리고 설문 조사에서 수행할 과제들의 리스트를 볼 때는 잘 몰랐는데, 발표를 들어보니 추천팀에서 해결해야 할 과제의 스펙트럼이 정말 넓고 다양하다는 것을 알 수 있었습니다. 제 차례에는 나름 열심히 준비했다는 생각으로 자신 있게 발표를 했습니다. 질문 시간에는 여전히 예상치 못한 질문을 주시는 크루 분들이 많았지만 최선을 다해 답변을 했고, 이날 발표를 마지막으로 두 달간의 여정에 마침표를 찍게 되었습니다.

마무리 

2차 프로젝트까지 마무리된 뒤에는 추천팀 전통(?)인 방명록을 통해 인턴 생활을 도와주신 여러 크루들에게 감사 인사를 전하고 훈훈하게 추천팀을 떠나게 되었습니다. 비록 제가 수행한 업무가 완벽하다고 생각하지 않았지만, 인턴 기간 동안 최선을 다했다는 생각에 후회는 없었습니다. 이렇게 추천팀에서 완전히 떠나는듯했지만, 이후에 감사하게도 전환 기회를 통해 다시 추천팀에 합류할 수 있었습니다. 

되돌아보면 짧은 2개월이었지만, 인턴 생활을 통해 참 많은 기회를 얻을 수 있었습니다. 우선 카카오의 기업 문화에 대해서 체험해 볼 수 있는 기회가 되었으며, 단순히 추천 서비스를 위한 기술을 체험해 보는 것을 넘어서, 추천팀의 일원으로써 팀의 역량 향상에 기여할 수 있는 기회를 얻을 수 있었습니다. 그리고 제 관심분야였던 기계 학습이 추천 서비스를 제공하는 현업에서는 어떤 방식으로 사용되고 있었는지 체감할 수 있었습니다. 또한, 다른 크루 분들과의 매주 티타임을 통해 서로 친목을 다질 수 있었고, 연구 및 개발자로의 커리어 패스에 대한 멘토링까지 제공받을 수 있었습니다.

추천 기술 파트에 합류한 지금은 추천 기술 고도화를 위한 R&D 업무를 하고 있습니다. 여전히 코로나 여파가 심해서 원격 근무를 하고 있지만, 이런 생활이 인턴 기간부터 익숙해진 터라 별 탈 없이 업무를 해나가고 있습니다. 그리고 어느 정도 시간이 지나긴 했지만 아직도 배워야 할 것들이 너무 많고, 이렇게 제가 열심히 따라잡는 사이에도 추천팀은 카카오 서비스를 이용하는 분들에게 더 나은 추천을 제공하기 위해 새로운 도전을 하고 있습니다. 저도 열심히 노력하여 추천팀의 역량을 올려줄 수 있는 크루가 되고자 합니다. 

지금까지 저의 긴 글을 읽어주셔서 감사드립니다. 만일 여러분들이 이 글을 읽으시면서 조금이라도 흥미가 생기셨다면 카카오 추천팀 합류에 도전하시길 추천합니다!


📌 채용 링크

charlie.cs
charlie.cs 추천팀 R&D 업무를 맡고있습니다.
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
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codegame
codereview
coding
coding test
Collaborative Filtering
communication
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
culture
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
event
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
GHC
github
globalpollution
go
Grace Hopper Celebration
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
KnowledgeGraph
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mobile
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
pair programming
parallel
PBA
performance
planning poker
Platform
polyfill
preview
programming-contest
project
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
session
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
Women Technologists
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
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codegame
codereview
coding
coding test
Collaborative Filtering
communication
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
culture
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
event
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
GHC
github
globalpollution
go
Grace Hopper Celebration
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
KnowledgeGraph
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mobile
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
pair programming
parallel
PBA
performance
planning poker
Platform
polyfill
preview
programming-contest
project
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
session
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
Women Technologists
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업

위로