7. IMPACT-CONNECT SEMINAR
2
0
2
3
경험은 무엇이고, 지식은 무엇일까?
문제해결능력
• 경험: 프로젝트를진행하며,실제문제를해결하는과정을통해얻는노하우와능력
- 소프트웨어 코드 작성
- 서버 아키텍처 설계
- 트러블 슈팅
- 안정적인 서비스 운영 경험
• 지식: 책, 강의 등에서 습득한 이론적인 내용
- 프로그래밍 언어
- 프레임워크 & 라이브러리
- 운영체제, 네트워크, 데이터베이스
- 자료구조, 알고리즘
8. IMPACT-CONNECT SEMINAR
2
0
2
3
• 경험만 있다면
- 자주 경험해본 특정 패턴은 쉽게 해결하겠지만, 새롭고 복잡한 문제를 풀기 어렵다.
- 문제 발생 시 더 근본적인 원인에 접근하기 어려워, 표면적인 부분만 해결하고 넘어가기 쉽다.
• 지식만 있다면
- 이론적인 내용만 알고 있어, 실제 문제를 해결해본 경험이 없다. 즉, 실상황에서의 응용이 어렵다.
• 경험과 지식의 시너지
- 지식은 기반을 제공하지만, 실제 상황의 문제를 해결할 수 있는 능력은 경험으로부터 온다.
-경험을통해이론만알고있던지식을응용하거나,새로운문제를마주하며부족한지식이무엇인지깨닫는다.
- 지식을 통해 더 복잡하고 새로운 문제를 해결하는 경험을 쌓아나간다.
경험과 지식의 시너지
문제해결능력
10. IMPACT-CONNECT SEMINAR
2
0
2
3
야생학습과 학교학습
문제해결능력
- 야생 학습은 대부분 협력적이다 (학교 학습은 대부분 개별적이다).
- 야생 학습은 대부분 비순차적이다 (학교 학습은 대부분 공부 순서가 정해져 있다).
- 야생 학습은 대부분 자료에 한정이 없다 (학교 학습은 대부분 교과서, 교재, 시험 범위 등이 정해져 있다).
- 야생 학습은 대부분 명확한 평가가 없다 (학교 학습은 대부분 시험이라는 명확한 평가기준이 있다).
- 야생 학습 대부분 정답이 없다 (학교 학습은 무엇이 정답이라고 하는 것이 명확 하다).
- 야생 학습은 목표가 불분명하고 바뀌기도 한다 (학교 학습은 대부분 합격, 자격증 같은 목표가 분명하다).
김창준, 함께 자라기 (인사이트, 2018), 12p.
11. IMPACT-CONNECT SEMINAR
2
0
2
3
• 프로그래머는 목표가 끊임없이 바뀌는 문제를 다룬다.
비즈니스 상황에 따라 어제의 좋았던 선택이, 오늘의 나쁜 선택이 될 수 있다.
• 프로그래머는 정답이 없는 문제를 다룬다.
Trade-Off* 만 있을 뿐이다.
• 프로그래머는 항상 새롭고 복잡한 문제를 다룬다.
우리는 모두 다른 도메인*, 레거시 코드, 리소스, 마감기한에 처해있다.
• 누군가 제시한 길을 그대로 걷기보다 (학교학습),
스스로 문제를 정의하고, 자료를 찾고, 고민하고, 결정할 수 있어야 한다 (야생학습).
야생학습과 학교학습
문제해결능력
* 도메인: 소프트웨어로 해결하고자 하는 비즈니스 영역. 예를 들어 토스의 도메인은 금융이다.
* Trade-Off: 어느 한편을 늘리면 다른 한편은 그 만큼 줄어드는 것을 이르는 말
12. IMPACT-CONNECT SEMINAR
2
0
2
3
• IT 산업의 변화는 너무나도 빠르다.
• 프로그래밍 언어, 프레임워크는 유행을 따르는 도구일 뿐이다.
• 더 깊은 곳에 있는 기반 지식에 집중하자.
주의! 도구와 사랑에 빠지지 마시오
문제해결능력
10년이면 강산도 변한다고 합니다. IT 산업에서 10년은 너무나 유구한 시간입니다. 5년, 혹은 그보다 짧은 기간 안에 IT 산업은 크게 변모합
니다. … 세상이 빨리 변하므로 개발자는 유행보다는 기본 지식을 쌓는 데 투자해야 합니다. 제 첫 프로그래밍 언어는 베이식입니다. 첫 상용
프로그램을 코볼로 짰습니다. 아르바이트를 할 때는 포트란을 사용했습니다. IT 30년 내내 줄곧 쓰는 언어는 없습니다. 프로그래밍 언어는
유행을 따르는 도구일 뿐입니다. 그래서 빠르게 새로운 걸 터득하는 능력과 기반 지식이 중요합니다.
박종천, 개발자로 살아남기 (Golden Rabbit , 2022), 30~31p.
14. IMPACT-CONNECT SEMINAR
2
0
2
3
기반지식이란 무엇일까?
문제해결능력
• 쉽게 변하지 않는 것들, Fundamental
언어, 프레임워크가 건축물이라면, 기반지식은 땅과 같다.
• 애플리케이션이 동작하는 환경
- 우리가 만든 애플리케이션은 운영체제 위에서 동작한다.
- 애플리케이션은 데이터를 생산하는데, 그 데이터는 데이터베이스에 저장된다.
- 데이터는 네트워크를 통해 전송된다.
• 애플리케이션을 만들기 위한 철학
- 프로그래밍 패러다임 (객체지향, 함수형 프로그래밍)
- 가독성, 유지보수성, 확장성
- 디자인/아키텍처 패턴
16. IMPACT-CONNECT SEMINAR
2
0
2
3
왜, 사이드 프로젝트?
사이드 프로젝트로 경험 쌓기
* 자료출처: https://www.educationcorner.com/the-learning-pyramid.html
수동적 학습
능동적 학습
17. IMPACT-CONNECT SEMINAR
2
0
2
3
• 사이드 프로젝트를 시작하면, 자연스럽게 모르는 부분이나 막히는 부분이 등장한다.
• 이미 해결할 문제가 있다면, 그 자체로 학습에 대한 동기가 자연히 생기게 된다.
• 동기가 부여된 상태에서 높은 학습 효율으로 더욱 적극적으로 지식을 습득할 수 있다.
왜, 사이드 프로젝트?
사이드 프로젝트로 경험 쌓기
그래서 튜토리얼을 읽다가도 이 정도면 그 프로그램을 작성할 수 있겠다는 생각이 들면 그 자리에서 읽기를 멈추고 코딩을 시작합니다. 프로
그램을 완성하면 잠시 멈췄던 자리로 돌아와서 읽기를 계속합니다. 이때에는 다음 프로그램을 목표로 두면서 말이죠. 이런 것을 적극적 읽기
라고 합니다. 무언가를 읽을 때 구체적인 질문이나 목적을 가지고 있는 방법을 말합니다.
김창준, 함께 자라기 (인사이트, 2018), 83p.
19. IMPACT-CONNECT SEMINAR
2
0
2
3
• 개발자 지망생은 아직 현업 경험이 없다.
하지만, 기업은 현업의 문제를 해결할 수 있는 문제 해결능력이 높은 개발자를 원한다.
• 사이드 프로젝트가 실제 유저가 많은 빅테크의 제품이라고 가정해보자.
100명이 사용하는 서비스와 1000만명이 사용하는 서비스는
문제의 다양성, 규모, 깊이 측면에서 큰 차이가 있다.
• 의도적으로 현재보다 과한 문제 상황을 가정하고, 해결하자.
간접적으로 현업에서 겪고 있는 문제를 체험할 수 있는 좋은 방법이다.
의도적인 오버 엔지니어링
사이드 프로젝트로 경험 쌓기
* 오버 엔지니어링: 현재 필요한 것 보다 더 과하게 설계하는 행위
20. IMPACT-CONNECT SEMINAR
2
0
2
3
• 한정 수량이 100개인데, 동시에 요청이 들어와 101개가 팔려버리면 어쩌지?
DB, 애플리케이션, 혹은 분산 아키텍처 수준의 Lock을 사용한다.
• 거대한 트래픽이 한번에 들어올텐데, 견딜 수 있을까?
부하 테스트를 통해 서비스가 견딜 수 있는 트래픽 수준을 측정하고,
코드 성능 최적화, WAS 및 쿼리 튜닝, 캐싱 등을 사용해 전체적인 성능 수준을 높인다.
• 큰 트래픽은 일정 시간대만 짧게 발생할텐데, 고성능 서버를 항상 돌리기 아까워!
Scale Out과 Auto Scaling을 통해 리소스를 유연하게 사용한다.
의도적인 오버 엔지니어링: 선착순 공연 티켓 판매 시스템
사이드 프로젝트로 경험 쌓기
* 위 내용은 의도적 오버 엔지니어링의 예시이며, 이해가지 않아도 괜찮습니다.
21. IMPACT-CONNECT SEMINAR
2
0
2
3
• 사용할 모든 기술에 대해 완벽한 학습을 끝내고 시작하려고 하지 말자.
완벽한 학습이란 허상이다. 지금 바로 시작하자.
• Learning By Doing, 사이드 프로젝트를 통한 경험과 지식 잇기.
사이드 프로젝트를 통해 스스로가 부족했던 지식을 깨닫게 되고,
원래 알고 있던 지식을 통해 더 깊이 있는 문제를 해결하게 될 것이다.
• 완벽한 서비스를 만드는데 집착하지 말자.
MVP* 수준이어도 좋다. 하나의 기능이라도 수준 높은 기술적 고민이 있었다면 말이다.
완벽하지 않아도 괜찮아
사이드 프로젝트로 경험 쌓기
* MVP: Minimum Viable Product, 최소 기능 제품
22. IMPACT-CONNECT SEMINAR
2
0
2
3
• 그냥저냥 동작하기만 하는 애플리케이션으로 만족해선 안된다.
프로젝트를 완성했다는 사실 그 자체로는 크게 매력적인 경험이 될 수 없다.
많은 기능을 구현한 프로젝트 경험이 항상 좋은 프로젝트 경험은 아니다.
• 기능 구현 그 자체에 목표를 두지 말고, 지금이 최선인지 치열하게 의심해보자.
지금 작성한 코드가, 구조가, 성능이 과연 최선일까? 더 좋게 만들 방법은 없을까?
• 모든 코드와 설계는 합리적인 근거를 기반으로 만들어져야 한다.
‘그냥’, ‘좋아 보여서’, ‘많이들 쓰니까’ 라는 건 없다.
내가 작성한 코드, 설계의 근거를 동료에게 자신있게 설명할 수 있을 수준으로.
치열한 고민을 하고 있나요?
사이드 프로젝트로 경험 쌓기
24. IMPACT-CONNECT SEMINAR
2
0
2
3
인출하는 학습
기록으로 지식 쌓기
* 자료출처: Improving students' learning with effective learning techniques: Promising directions from cognitive and educational psychology
25. IMPACT-CONNECT SEMINAR
2
0
2
3
인출하는 학습
기록으로 지식 쌓기
* 자료출처: Improving students' learning with effective learning techniques: Promising directions from cognitive and educational psychology
요약하기
강조하기
키워드 암기하기
심상 만들기
다시 읽기
26. IMPACT-CONNECT SEMINAR
2
0
2
3
인출하는 학습
기록으로 지식 쌓기
* 자료출처: Improving students' learning with effective learning techniques: Promising directions from cognitive and educational psychology
연습 시험보기
나눠서 연습
여러 문제를 섞어 연습
정교화 질문
스스로 설명하기
27. Input
( )
IMPACT-CONNECT SEMINAR
2
0
2
3
인출하는 학습
기록으로 지식 쌓기
요약하기
강조하기
키워드 암기하기
심상 만들기
다시 읽기
여러문제를 섞어 연습
연습 시험보기
나눠서 연습
정교화 질문
스스로 설명하기
학습의 완성은 지식을 머리 속으로 입력하는 것이 아닌, 밖으로 인출하는 것에 있다
Output
( )
👍
☹️
28. IMPACT-CONNECT SEMINAR
2
0
2
3
• 배운 것, 고민한 것, 해결한 것을 꾸준히 기록하자
• 되도록이면, 다른 모든 사람들이 볼 수 있는 곳에 기록을 공개하자 (=블로그)
혼자만 보는 공간에 기록해도 좋지만, 공개된 곳에 기록을 공개하는 것이
남들이 본다는 부담감으로 더 정확하고 깊이있는 내용을 학습할 수 있게 해준다.
• 모르는 사람을 가르치는 것 처럼, 자세하고 깊게 기록하자 (메타인지)
앞선 자료에서 알 수 있었듯 타인을 가르치는 것이 가장 효과적인 학습 방법이다.
초심자가 여러분들의 게시글을 본다고 생각하며, 친절한 선생님의 마음으로.
기록 과정에서 스스로가 잘 이해하지 못한 부분을 깨우칠 수 있다. 이 과정에서 메타인지가 상승된다.
• 과거의 기록물을 통해 누적적으로 성장하자
인간은 망각의 동물이다. 잊은 지식을 되찾는 시간을 아껴보자.
기록과 메타인지
기록으로 지식 쌓기
30. IMPACT-CONNECT SEMINAR
2
0
2
3
• WHAT: 내가 마주한 개념이 ‘정확히’ 무엇인지?
‘그냥’ 학습하지 말고, 등장한 모든 개념에 대해 ‘정의’를 정확히 알고 넘어가자.
• WHY: 이기술은왜등장한것인지,내프로젝트의어떤문제를해결하기위해필요한지?
모든 기술은 어떠한 문제를 해결하기 위해 등장했다. 그 등장 배경을 알아보는 것도 좋다.
• HOW: 이 기술은 내부적으로 어떻게 동작하는 것 인지?
기술의 내부 동작 원리를 깊게 이해해야, 문제가 발생했을 때 더 능숙히 대처할 수 있다.
• WHAT?WHY?HOW?를스스로에게3Depth로질문을던지자
3 Depth로 고민하자
기록으로 지식 쌓기
31. 3 Depth로 고민하자: 가상 면접으로 감잡기
기록으로 지식 쌓기
로그인 기능을 만드셨네요. 어떻게 만드셨나요?
면접관
세션을 사용한 방식으로 구현했습니다.
지원자
어떻게 해결하나요?
면접관
Sticky Session을 사용하거나, 세션 클러스터링을 사용하거나,
Redis 등을 사용해서 세션 저장소를 별도로 둘 것 같습니다
지원자
음.. 세션 저장소간 동기화가 되지 않아 정합성 이슈가 발생할 것 같습니다.
지원자
지금 프로젝트가 분산환경이 아닌데,
애플리케이션 서버를 Scale-Out 하면 어떤 문제가 생길까요?
면접관
32. 괜찮은 방법이네요. 그런데 스티키 세션은 로드밸런서에 부담이 되고,
세션 클러스터링은 클러스터 과정 자체에서 오버헤드가 클 것 같네요.
타이밍에 따라 정합성 이슈가 그대로 존재할 것 같기도 하고요.
세션 저장소를 별도로 두는 방법은 세션 저장소가 SPOF가 될 것 같네요.
이런 부분을 개선하려면 어떻게 해야할까요?
면접관
Stateless 한 방법으로 해결할 것 같습니다.
지원자
* SPOF: Single Point of Failure, 단일 장애점
3 Depth로 고민하자: 가상 면접으로 감잡기
기록으로 지식 쌓기
33. 자세히 설명해주세요.
면접관
JWT와 같은 토큰을 사용하는 것은 어떨까요?
지원자
앞서 이야기한 문제는 해결될 것 같네요.
말씀해주신 무상태 토큰 방식은 그렇다면 문제가 없나요?
면접관
많은 문제가 있겠지만, 탈취 시 치명적 문제가 발생할 것 같습니다.
지원자
어떻게 해결하나요?
면접관
리프레시 토큰을 도입하고, 액세스 토큰의 만료기한을 짧게 유지하면 어떨까요?
지원자
리프레시 토큰을 탈취당할수도 있지 않나요?
면접관
3 Depth로 고민하자: 가상 면접으로 감잡기
기록으로 지식 쌓기
35. IMPACT-CONNECT SEMINAR
2
0
2
3
• 프로그래밍에도 분야가 굉장히 많다.
웹 프론트엔드/백엔드, 앱 iOS/안드로이드, 임베디드, 윈도우 프로그래밍, 게임 프로그래밍 …
• 조급하지 말고 느긋하게, 끌리는 것 부터 시도해보자.
좋은 음식이 가득한 뷔페에 온 것 처럼, 여유롭게.
• 대단한 걸 만들지 않아도 된다.
튜토리얼 수준이어도 괜찮으니, 동작하는 아주 작은 프로그램을 만들어보자.
• 최대한 많은 경험을 해보자.
그 경험 중 가장 즐겁고 몰입되는 나만의 분야를 찾아보자.
천천히, 느긋하게
나만의 분야 찾기