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


문과생에서 서버 개발자 jaylene이 되기까지

안녕하세요! 톡플랫폼개발팀 메일개발파트에서 서버 개발자로 일하고 있는 jaylene입니다. 2021 카카오 여름 개발자 인턴십을 거쳐 한 달 전부터 카카오 크루로 합류하게 되었습니다.

저는 학부에서 인문사회 계열을 전공했는데요. 조금 특이한 이력에, 주위에서 개발자가 되기 위해 준비해온 것들을 많이 물어보시고는 합니다. 이번 글을 통해, 카카오 인턴십에 참여하기 전까지 제가 경험해온 것들, 그리고 인턴십 진행 과정과 관련된 내용을 공유해 보고자 합니다. 전공의 벽을 넘어 카카오 개발자를 꿈꾸시는 분들에게 작은 도움이 되었으면 좋겠습니다.


카카오 인턴십에 참여하기 전 준비해온 것들

카카오 인턴십에 참여하기 위해서는 (코딩 테스트 – 이력서 및 자기소개서 제출 – 면접)의 과정을 거치게 됩니다. 코딩 테스트를 보거나, 서버나 클라이언트와 같은 세부 분야를 한정해 이력서를 제출하기 위해서는 관련된 지식을 쌓고 직무에 맞는 경험을 하는 것이 중요한데요. 저는 졸업 후 진로를 바꾸었기 때문에, 직무 경험을 쌓기 위해 무엇부터 시작해야 할지 감이 잡히질 않았고 조언을 구할 사람도 주위에 없었습니다. 혼자 막연히 공부를 하며 ‘개발자가 되기도 전에 맨 땅에 헤딩만 하거나 제풀에 지치겠구나’라는 생각을 많이 했는데요. 끝내 제가 찾은 해결책은 효율적으로 기술을 습득할 수 있는 루틴 한 환경을 만드는 것에 있었습니다.

#1 지식 창구 만들기

우선 프로그래밍을 배울 수 있는 교육 기관을 찾았습니다. 다만, 제가 교육 기관을 다니는 목적은 친절한 교육을 받기 위해서만은 아니었어요. 친절한 교육을 받게 되면, 코드를 한 줄 한 줄 따라치거나 주어진 개념을 표면적으로만 이해하는 것에 만족하게 되더라고요. 그걸 인지한 뒤로는 특정 언어나 프레임워크들을 활용하기 위한 래퍼런스들은 인터넷상의 공식 문서를 통해 얻고 RDB, TCP/IP, OS, 통계 등 기본 CS 지식들은 기술 서적을 통해 얻는 것을 우선시하였습니다.

오히려 교육장에서는 다양한 기술을 미리 경험해 본 친구들이나 현업에 계신 개발자분들과 교류하는 것에 가치를 두곤 했는데요. 특정 도구를 잘 쓰는 것은 개인의 노력에 달려있지만, 기술이나 업계의 트렌드에 맞는 도구를 찾고 활용해 보는 것은 많은 사람들의 시선과 경험, 그리고 공감이 필요한 영역이기 때문입니다. 그리고 주변 친구들과 직접 토이 프로젝트를 진행하는 과정에서, 기획 / 서비스 아키텍처 설계 및 클라우드 서비스 활용 / 프론트 및 백엔드 개발 등등 다양한 포지션을 경험하며 가장 재미있고 앞으로 수행하고 싶은 직무가 무엇인지를 정할 수 있었습니다.

#2 지치지 않을 환경 조성하기

빠르게 지식을 얻는 것만큼 중요한 것이, 새로운 공부를 하며 지치지 않을 환경을 만드는 것이었습니다. 그리고 저는 그 핵심이 일상의 관심사를 개발의 영역으로 들여오는 것에 있다고 보았습니다. 가장 간단하게는 알고리즘 대회를 준비하거나 현업 개발자분들이 계신 카카오 오픈 채팅방에 참여하고, CS 지식을 쉽게 풀어서 설명하는 유튜버들을 구독하는 것으로 시작했습니다. 그 외로는 여러 테크 블로그에서 발행되는 이슈들을 메일로 받아보고, 관심 있는 기술과 관련된 새로운 뉴스에 바로 접속할 수 있도록 브라우저 홈 피드를 구성하는 등 일상에서 개발에 대한 관심이 연장될 수 있도록 노력을 해왔습니다. 이러한 노력은 프로그래밍을 하며 능력의 한계에 부딪혀 공부가 하기 싫을 때조차, 개발에 대한 아주 작은 관심의 끈을 이을 수 있도록 도와주었습니다.

#3 지식 공유하기

마지막으로, 프로젝트를 수행할 때 마주한 문제 상황과 해결 과정들을 기록해 놓을 수 있는 블로그를 운영하는 것이 의미가 있었습니다. 공개된 공간에 지식을 공유하다 보면, 독자에 대한 일말의 책임감을 가지게 되어서 정확한 지식과 정보가 공유될 수 있도록 노력하게 되는 것 같습니다. 그리고 블로그는 개발 영역에서 자신의 관심사를 보여줄 수 있는 매개체로 활용할 수 있어 포트폴리오 제출에 용이한 측면이 있었습니다.

PS와 관련해 문제 풀이 과정을 블로그에 올리는 것이 큰 도움이 되기도 했는데요. 저는 많은 알고리즘 문제를 풀기보다는, 하나의 문제를 풀더라도 문제에 접근한 방식과 해결한 논리적인 과정들을 글로 정리해 보고 도식화하는 과정을 더 중요하게 생각했습니다. 트리/스택/큐/링크드 리스트 등 특정 자료구조를 활용하는 유형의 문제가 나올 때 이전에 정리해놓은 풀이를 참고해 공통점과 차이점을 찾는 것이 문제 해결의 키가 되는 경우가 많았고, 테스트 fail 시 edge case들을 정리해둔 것이 도움이 될 때가 많았습니다.

인턴십 진행 과정 및 얻은 교훈 정리

저는 두 달간의 인턴십 기간 동안 개인 과제를 진행했습니다. 파트 내에는 구현한 서비스를 발표하고 피드백을 받는 1차/2차 리뷰가 마련되어 있고, 정식 크루가 되기 위한 최종 전환 면접이 있습니다. 발표와 면접을 준비하는 시간들을 제외하면, 과제에 필요한 스펙을 정의하고 구현하기까지 약 한 달의 기간이 주어지는데요. 이 과정 속에서 중요하다고 생각했던 몇 가지 절차를 정리해 보고자 합니다.

#1 Context 중심으로 과제 이해하기 

인턴십 초기에 과제 구현에 앞서 사내 위키들을 읽는 시간을 마련했었습니다. 팀 내 통용되는 용어와 개발 히스토리를 찾아보고, 앞으로 구현할 컴포넌트가 사내 컴포넌트와 어떻게 연계되는지 그 맥락을 찾기 위해서였습니다. 위키뿐 아니라 스크럼 시간에 멘토님과 대화를 통해, 현재 속한 파트에서 과제와 유관한 이슈가 무엇이 있고, 그 이슈가 어플리케이션단 혹은 운영단에서 어떻게 관리되고 있는지에 대한 정보를 많이 얻을 수 있었습니다. 당장의 코드 구현보다 더 큰 시각으로 과제를 조망하고 이해해 보려는 노력은 인프라를 설계하거나 Domain-specific 한 관점으로 캐시 및 스케줄링 전략을 짜보는 데 도움이 되었습니다.

그리고 서비스 흐름도를 그리는 경험도 도움이 되었는데요. 도식화는 필요한 내용을 글로 풀어쓰지 않아도, 불특정 다수의 사람들이 서비스 구동 흐름을 올바르게 이해할 수 있도록 도움을 주는데 그 목적이 있습니다. 사실 저는 서비스 흐름도를 도식화하는 부분에서 난항을 겪었어요. 아무런 기준점 없이 컴포넌트들을 나열하고 task를 처리하는 과정에만 초점을 두었기 때문이었습니다. 셀원분들의 피드백을 통해 여러 task를 처리할 때 서비스 주축이 되는 컴포넌트가 무엇인지를 강조하고, 유저의 액션과 api end point가 어떻게 연결되는지를 볼 수 있도록 흐름도를 수정할 수 있었는데요. 이 과정에서 직접 구현한 서비스를 올바르게 스토리텔링하는 법을 익힐 수 있었습니다.

#2 질문을 바탕으로 위키 정리하기

저에게 위키 정리가 가장 의미 있었을 때는, 자문자답 형식으로 새로운 지식이나 혼동되는 내용을 정리할 때였습니다. 실제 릴리즈된 서비스와 관련된 기술 문서는 정확한 API 스펙 및 개념 전달을 위해 발행하는데 의미가 있지만, 인턴십 과정에서 문서를 발행하는 목적은 조금 다르다고 보기 때문입니다. 인턴 크루는 보통 생소한 도메인과 기술을 단시간에 사용해야 하는 경우가 많기 때문에 “현재 내가 뭘 정확하게 알고 있고 뭘 잘 모르고 있는지, 혼동되는 내용은 무엇인지”를 분간해 보며 글을 구조화하고 정리하는 과정이 더 중요하다고 생각합니다.

#3 Rule base로 과제 진행하기

저희 팀에는 JIRA 이슈를 공유하거나 코드 리뷰를 받을 때 따라야 하는 그라운드 룰이 존재합니다. 과제를 할 때 Git-Flow에 따라 브랜치들을 관리하는 방식이나 PR Template을 적용해 리뷰어가 중점적으로 봐야 할 부분을 정리하는 등, 기존 크루 분들이 공통적으로 적용하고 계신 작업 방식을 경험해 본 것이 현재 카카오에서 일하는데 큰 도움이 되었습니다. 그리고 사내 그라운드룰을 충실히 따르는 것뿐만 아니라, 본인만의 룰을 만들어 과제를 진행하는 것도 의미 있는 작업이 될 수 있다고 생각합니다. 저의 경우 일정한 컨벤션을 두고 커밋 내역을 관리했고, 그 덕분에 과제의 진척 사항을 매일 관리하는 것이 용이했으며, 코드 내 문제가 발견되었을 때 보수 작업을 빠르게 진행할 수 있었습니다.

#4 빠른 구현 하기 < 논리적 구현 하기

제가 카카오 인턴십을 하면서 들었던 의외의 이야기는 “개발자는 논리적으로 생각하는 사람”이라는 것이었어요. 세상에는 정말 많은 오픈소스와 코드 스니펫들이 존재하지만, 빠르게 외부 소스를 가져와 짜 맞추어 개발을 하는 것을 지양해야 했는데요. 특정 코드를 작성했을 때 그게 최선의 방법인지(중복이 많거나 클래스 혹은 함수 간 coupling 현상이 심하지는 않는지 / 불필요한 로직이 들어가는 것은 아닌지 / 기술 부채를 늘리는 임시방편의 조치는 아닌지/ side effect로 발생할 수 있는 여지가 있는지 등등)를 논리적으로 설명하며 코드로 구현하는 것이 더 중요하다는 조언을 많이 들을 수 있었습니다. 이러한 경험들 속에서 카카오가 추구하는 개발자의 모습과 문화가 무엇인지를 더 잘 알 수 있었습니다. 

#5 카카오 인턴십은 Positive selection의 과정임을 잊지 말기

면접 당시에 뵀던 면접관님들과 멘토님, 파트 내 크루 분들은 저에게 항상 “성장의 경험이나 주도적으로 몰입한 순간”들을 궁금해하셨습니다. 기술적인 역량이 부족한 것 같다는 말씀을 드릴 때조차 “부족함을 인지했다면 그걸 만회하기 위해 발휘하는 끈기나 열정, 그리고 주어진 문제를 어떻게 해서든 해결하고자 하는 집념 어린 태도가 더 중요하다”라는 조언을 건네주셨습니다. 이러한 조언들로부터 카카오 인턴십은 지원자들의 결점을 찾고 떨어뜨리기 위한 과정이 아님을 알 수 있었습니다. 그보다는 주도적인 몰입과 성장에 대한 갈망을 계속 이어갈 수 있는 사람, 자신의 강점을 끝내 찾아 한 명의 카카오 크루로서 영향력을 발휘할 수 있는 사람을 채용하기 위한 과정이라고 이해할 수 있었습니다. 따라서, 발표나 면접에서 자신의 단점을 숨기기 위해 노력하는 것보다는, 카카오 인턴십을 통해 본인이 찾은 강점을 중심으로 어필하는 것이 중요하다고 생각합니다.

크루로서의 여정을 시작하며 

저는 인턴십에 참여할 때 “딱 1년만 더 있다가 카카오에 들어오면 좋지 않았을까?”라는 생각이 종종 들었습니다. 아주 간단한 리눅스 명령어를 사용하는 것이 어려울 때도 있었고 네트워크나 OS에 대한 지식, 동기/비동기 처리 방식 등에 대한 이해도가 많이 부족하다는 생각했기 때문입니다. 그런데 요즘에는 “살면서 1부터 100까지를 아는 일을 만날 수는 없고, 알고 있는 지식이라고 생각했던 것을 오히려 잘못 알고 있을 수도 있다. 그냥 아주 작은 일들부터 부딪혀 일해봐야 올바른 지식이나 경험, 혹은 자신감을 쌓을 수 있을거다”라는 생각을 많이 하고 있습니다. 

이제는 카카오 크루답게 가본 길은 더 단단하게 하는 것은 물론, 새로운 기술과 환경에 뛰어들 때 두려움을 갖지 않고 “무엇이든 해보자”라는 적극적인 태도를 갖추며 일하려고 합니다. 어떤 일을 하건 현재 능력의 한계를 규정짓고 실패의 위험을 재단하기보다는, 스스로 몰입하는 시간을 귀중히 여기고 실패를 새로운 해답을 찾아가는 연결고리로 삼는데 집중하고 싶습니다. 가슴 설레는 성장의 여정을 카카오와 함께 할 수 있어 굉장히 기쁩니다. 

긴 글 읽어주셔서 감사합니다.  🙌    


함께 하면 좋은 글 🔎

jaylene.shin
jaylene.shin 메일플랫폼개발셀에서 서버 개발자로 일하고 있습니다.
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
codereview
coding
coding test
Collaborative Filtering
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
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
extract-text
Feature List
Featured
Feedback
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
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
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
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
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
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
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-cache
web-worker
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
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
codereview
coding
coding test
Collaborative Filtering
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
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
extract-text
Feature List
Featured
Feedback
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
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
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
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
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
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
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-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업

위로