이 글은 원래 제가 소프트웨어 엔지니어가 되기 위해 정리한 짧은 주제들이었습니다. 그러나 지금은 보다시피 주제들이 굉장히 많아졌습니다. 아래 내용을 모두 습득한 후, 저는 아마존에 소프트웨어 엔지니어로 채용되었습니다! 여러분은 아마 아래 글들을 모두 다 공부할 없을 겁니다. 아무튼 여러분에게 필요한 모든 것은 여기에 있습니다.
몇 달 동안 저는 하루에 8-12시간 정도 공부했습니다. 다음 글에는 제 이야기를 적어놓았습니다. Google 면접을 위해 8개월 동안 풀 타임으로 공부한 이유
반드시 읽어주세요: 다시 한번 말하지만, 여러분은 여기에 있는 글들을 모두 알 필요는 없습니다. 저는 제가 알지 않아도 될 것에 많은 시간을 뺏겼습니다. 여러분의 귀중한 시간을 잃지 않게 해당 파트에 더 자세하게 적어놓겠습니다.
여기에 정리된 글들은 아마존, 페이스북, 구글, 마이크로소프트 같은 거대 기업을 포함한 거의 모든 소프트웨어 회사의 면접을 준비하는 데에 도움이 될 것입니다.
행운을 빕니다!
이 글은 저의 대기업의 소프트웨어 엔지니어가 되기 위한 여러 달에 걸친 공부계획을 적어놓은 것입니다.
필요한 것:
주의) 이 글은 소프트웨어 엔지니어가 되기 위한 계획이지 웹 개발을 배우기 위한 것이 아닙니다.구글, 아마존, 페이스북 그리고 마이크로소프트 같은 대기업은 소프트웨어 엔지니어링이랑 웹 개발을 서로 다른 것으로 봅니다. 예를 들어, 아마존에는 프론트엔드 엔지니어와 소프트웨어 개발 엔지니어가 있습니다. 이 두 역할은 서로 나뉘어져있으므로 면접 역시 같게 보진 않을 것이고, 갖추어야할 역량 역시 다릅니다. 위의 회사들은 소프트웨어 개발자/엔지니어 역할에 좀 더 전문적인 컴퓨터 과학 지식을 요구합니다.
---------------- 이 아래로는 전부 선택사항입니다 ----------------
대기업에서 소프트웨어 엔지니어로 일하기 위해서는 알아야 할 것들이 많습니다.
만약 여러분이 저처럼 컴퓨터 관련 전공이 아니라면 이 과정은 전공자들을 따라잡으면서도 4년이라는 시간을 절약하게 해줍니다.
제가 이 프로젝트를 시작했을 때, 저는 힙이나 스택, 시간 복잡도, 트리, 그래프 순회 등에 대하여 전혀 아는 바가 없었습니다. 만약 그 때의 제가 정렬 알고리즘을 직접 코딩해야 할 일이 있었다면, 아마 제 코드는 끔찍한 상태였을 겁니다. 제가 사용했던 모든 자료 구조는 이미 언어 안에서 구현되어 있던 것들이고, 저는 그것들이 보이지 않는 곳에서 어떻게 작동하고 있는지 몰랐습니다. 실행 중인 프로세스가 메모리 초과 에러를 메시지를 보내지 않는 이상 메모리를 관리할 필요조차 없었고, 에러가 발생하면 그제야 해결책을 찾곤 했습니다. 또한 저는 몇몇 다차원 배열이나 연관 배열을 사용한 적은 있지만, 자료구조를 완전 밑바닥부터 구현해 본 적은 없었습니다.
매우 긴 과정이고 몇 달이나 걸릴지 모릅니다. 그렇치만 여러분이 이런 분야에 익숙하다면 분명 훨씬 더 적은 시간이 걸릴 겁니다.
아래에 있는 모든 것들은 대략적인 개요이며 여러분은 위에서 아래 순서대로 차근차근 진행해야 합니다.
이 글은 진행 상황 파악을 위해 목차를 만드는 등 Github 특유의 마크다운을 이용한 방식을 사용하고 있습니다.
새 브랜치를 만들어서 중괄호에 x를 추가하는 식으로 항목을 체크하세요: [x]
브랜치를 포크(fork)하고 아래의 커맨드들을 입력하세요
포크 버튼을 눌러 Github https://github.com/jwasham/coding-interview-university 레포지토리를 포크하세요.
로컬 레포지토리에 클론(clone)하기:
git clone git@github.com:<your_github_username>/coding-interview-university.git
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
끝났으면 박스를 x로 체크하기:
git add .
git commit -m "Marked x"
git rebase jwasham/main
git push --set-upstream origin progress
git push --force
몇몇 영상들은 Cousera, Edx에 등록을 해야만 접근할 수 있습니다. 이들을 MOOCs라고 부르기도 합니다. 가끔씩 강의가 진행중이지 않아서 몇 달 동안 기다려야 할 수도 있습니다.
YouTube 온라인 강의 동영상과 같이 무료이고 항상 접근 가능한 동영상 소스들을 추가해주신다면 많은 분이 온라인 강의가 다시 시작할 때까지 기다리지 않고 언제나 공부할 수 있게 될 테니 정말 감사하겠습니다.
여러분은 코딩 면접용 프로그래밍 언어도 선택해야하지만, 컴퓨터 과학을 배우기 위한 프로그래밍 언어 역시 선택해야합니다.
왠만하면 둘 다에 해당하는 언어를 골라서 일단 하나에 숙달되도록 하는 것을 추천합니다.
제가 공부할 때에는 C와 Python이란 2가지의 언어를 주로 썼습니다.
C: 굉장히 저급 언어입니다. 포인터와 메모리 할당 및 해제를 직접 다루어서 데이터 구조와 알고리즘을 뼈 속 깊이 새겨둘 수 있게 됩니다. Python이나 Java와 같은 고급 언어들은 이런 걸 알아서 처리하기 때문에 가려져 있습니다. 이는 일상 업무를 할 때에는 아주 훌륭하지만 만약 저급 수준 데이터 구조가 어떻게 짜여져있는지 자체를 배우는 중이라면 c 언어를 사용해 기계와 가까워 지는 것이 더 좋습니다.
Python: 현대적이고 굉장히 많은 것들을 할 수 있습니다. 저는 그냥 완전 유용하고 면접 때 써야할 코드를 줄여주기도 해서 배웠습니다.
이건 물론 제 취향일 뿐이고 여러분은 원하시는 걸 하시면 됩니다.
아마 필요없으실 수도 있지만, 새 언어를 배우기 위한 여러 사이트 주소들입니다.
면접에서는 여러분이 쓰기에 편한 언어를 사용해도 되지만, 대기업들은 보통 다음과 같은 정해진 언어들을 사용합니다:
아래 언어들을 사용할 수도 있지만 제대로 확인하셔야합니다. 주의사항이 있을 수도 있습니다:
코딩 면접를 위한 언어를 선택하는 것과 관련하여 제가 쓴 글입니다: 코딩 면접을 위한 언어 선택하기 이 글은 제가 기반으로 사용한 원본 글입니다: http://blog.codingforinterviews.com/best-programming-language-jobs/
여러분은 여러분이 선택한 언어에 대해 매우 익숙하고 잘 알아야 합니다.
언어 선택에 도움이 될 만한 읽을 거리들
이 책들은 여러분의 컴퓨터 과학에 대한 기반을 다져줄 책들입니다.
그냥 아무거나 하나 여러분이 편한 언어와 관련된 것으로 선택하세요. 엄청나게 많은 책 읽기와 코딩을 하게 될 겁니다.
여러분이 선택하세요:
여러분이 선택하세요:
여러분은 이 책 뭉터기들을 다 살 필요는 없습니다. 솔직하게 말해서 "Cracking the Coding Interview"라는 책 하나면 충분합니다. 하지만 저는 더 준비해보기 위해 많이 사보았습니다. 결국 항상 너무 과했지만 말이죠.
저는 이 책을 둘 다 샀습니다. 굉장히 많은 걸 준비하게 해주었습니다.
하나를 선택하세요:
이 문서는 많은 달에 걸쳐서 추가되고 있고, 맞습니다, 이미 제 손을 떠났습니다.
여기에 제가 저지른 몇 가지 실수들을 적어놓았으니 여러분은 참고하시고 더 나은 방향으로 나아가시길 바랍니다. 물론 몇 달의 시간도 절약하실 겁니다.
저는 수 시간의 비디오를 보고 방대한 양의 노트를 작성했지만, 몇 달 뒤에는 대부분의 내용을 기억하지 못했습니다. 저는 3일에 걸쳐 제가 작성한 노트를 보고 flashcard를 제작해서 복습할 수 있게 만들었습니다. 그 많은 지식들까지는 사실 필요 없었습니다.
꼭 읽고 제가 한 실수들을 반복하지 않길 바랍니다:
Retaining Computer Science Knowledge
이 문제를 해결하기 위해 2가지 종류(일반적인 내용, 코드)의 요약집을 보관하고 추가할 수 있는 조그만 사이트를 만들었습니다. 각 정리본은 다른 형식을 가지고 있습니다. 저는 모바일 우선인 웹사이트를 만들어서 제 휴대폰이나 태블릿 등 어디서나 볼 수 있게 했습니다.
여러분만의 요약집을 무료로 만들어봅시다:
제 요약집을 그대로 사용하시는 건 추천하지 않습니다. 거기엔 너무 많은 것들이 있고 대부분은 여러분이 필요하지 않은 것들뿐입니다.
하지만 제 말을 듣고 싶지 않은 청개구리 같은 분들을 위해, 주소는 남겨두겠습니다:
앞에서도 언급했듯이 저는 불필요하게 많은 것을 공부하려고 했고, 카드의 내용들은 어셈블리 언어와 Python의 자잘한 지식들부터 기계 학습과 통계학까지 넘나들게 되었습니다. 이건 필요한 것에서 엇나가도 너무 엇나간 겁니다.
flashcard에 대한 참고사항: 한 번 답을 맞췄다고 해서 안다고 표시하지 맙시다. 정확히 알기 전까지는 같은 카드를 보고 여러 번 맞추어 보아야합니다. 반복 학습은 그 지식을 뇌에 깊이 각인시켜 줄 겁니다.
제 사이트를 사용하는 대신 Anki를 사용해도 됩니다. 여러 번 추천받았던 사이트입니다. 이 사이트는 반복 시스템을 통해 여러분의 기억을 돕습니다. 사용자 친화적이며, 모든 플랫폼에서 사용 가능합니다. 또한 클라우드 동기화 시스템을 제공합니다. iOS에서는 2만 5천 원이지만 다른 플랫폼에서는 무료입니다.
Anki 형식의 내 요약집 데이터베이스: https://ankiweb.net/shared/info/25173560 (@xiewenya에게 감사의 말을 전합니다).
어떤 분들이 공백과 관련된 포맷팅 문제가 있다고 언급하셨는데 다음 방법으로 해결할 수 있습니다: open deck, edit card, click cards, select the "styling" radio button, add the member "white-space: pre;" to the card class.
굉장히 중요합니다!
코딩 면접 질문들을 여러분이 데이터 구조와 알고리즘을 배우는 동안에 봐두세요.
한 주제를 공부하고 충분히 익숙해졌다고 느낀다면(예를 들어 그것이 연결 리스트라면):
반드시 여러분이 배우는 동안에 문제를 푸세요, 다 배우고 나서가 아니라.
여러분은 지식 자체가 필요해서 고용되는 것이 아니라 그 지식을 활용하기 위해서 고용되는 것입니다.
이를 위한 엄청나게 많은 자료들이 아래에 있습니다. 계속 합시다.
주의를 산만하게 만드는 많은 것들이 우리의 귀중한 시간을 뺏어갑니다. 주의를 집중하는 일은 물론 힘듭니다. 가사 없는 음악을 듣다보면 좀 더 쉽게 집중하실 수 있습니다.
이 기술들은 널리 퍼져 있는 기술이지만, 여기서 다루는 부분은 아닙니다:
이 과정에는 엄청나게 많은 주제가 있습니다. 어떤 주제들은 며칠이 걸리거나 심지어 아마 일주일이나 그 이상이 걸릴지도 모릅니다. 여러분의 일정에 달려있습니다.
매일매일, 다음 주제로 넘어가면서, 주제에 관한 동영상들을 보고, 그리고 실제로 선택한 언어의 데이터 구조나 알고리즘을 구현하세요.
여기서 제 코드들을 볼 수 있습니다:
모든 알고리즘을 외울 필요는 없습니다. 그저 그걸 이해하고 나만의 방식으로 구현할 수 있으면 됩니다.
왜 이게 여기 있죠? 전 아직 면접볼 준비가 안되어 있는데요.
왜 프로그래밍 문제들을 풀면서 연습히야하는가:
면접에서 방법론적인, 양방향 소통인 문제 해결에 대한 훌륭한 소개글이 있습니다. 물론 프로그래밍 면접 책들에서도 배울 수 있겠지만 이 글이 더 미친 수준이라 봅니다: Algorithm design canvas
컴퓨터가 아니라 화이트보드나 종이에 직접 코드를 적어보세요. 그리고 여기에 값들을 넣어보면서 테스트해보세요. 그리고는 컴퓨터에 코드를 치고 테스트해보세요.
만약 화이트보드가 집에 없다면, 문방구에 가서 그림용 공책을 사서 거기서 연습해보세요. 이건 제 "소파 화이트보드"입니다. 크기 비교를 위해 사진에 펜을 추가해봤습니다. 펜을 쓰신다면 몇 분 후 지워지지 않는 펜을 원망하는 자신을 보게 될 겁니다. 엄청 빨리 더러워집니다. 저는 그래서 연필과 지우개를 썼습니다.
코딩 문제 연습은 프로그래밍 문제에 대한 답을 외우는 연습이 아니다.
여기 있는 코딩 면접 책들을 잊지마세요.
문제 푸는 법들:
코딩 면접 질문 관련 동영상들:
도전 사이트들:
네, 잡설은 그만하고, 배워봅시다!
하지만 위의 코딩 문제를 배우는 중에 같이 풀어보는 거 절대 잊지마세요!
[ ] 온라인 강의들:
[ ] distributed hash tables:
[ ] Linear probing을 사용하여 배열로 구현해보기
hash(k, m) - m은 해시 테이블의 크기
add(key, value) - 키가 이미 존재한다면, 값을 갱신한다.
exists(key)
get(key)
remove(key)
insert
하려면 필요extract_max
하려면 필요하다heap_sort
하려면 필요[ ] Notes:
힙소트의 경우, 위의 힙 데이터 구조를 보세요. 힙 정렬은 훌륭하지만 안정적이지 못합니다.
[ ] UC Berkeley:
[ ] Bubble Sort (영상)
[ ] 삽입 (영상)
[ ] 병합 정렬 (영상)
[ ] 퀵 정렬 (영상)
[ ] 선택 정렬 (영상)
[ ] 병합 정렬 코드:
[ ] 퀵 정렬 코드:
[ ] 구현:
[ ] 필요한 건 아니지만, 아래도 추천합니다:
개략적으로 보자면, 여기에 시각적으로 나타낸 15가지 정렬 알고리즘들을 보세요. 이 주제에 대해서 더 자세히 알고 싶다면, 몇몇 주제에 대한 세부사항에서 "정렬" 섹션를 보세요.
그래프는 컴퓨터 과학의 여러 문제들을 표현하는 데 사용할 수 있다. 때문에 이 섹션은 트리나 정렬 섹션처럼 길다.
노트:
[ ] MIT(영상):
[ ] Skiena의 강좌 - 시작하기 아주 좋습니다:
[ ] 그래프 (검토, 그 외 여러가지):
Full Coursera Course:
내가 구현할 것:
Skiena의 책(아래의 책 섹션 참조)과 인터뷰 책에서 더 많은 그래프 실습을 할 수 있습니다.
이 주제를 더 자세히 알고 싶으시다면, 몇몇 주제에 대한 세부사항에서 "문자열 매칭" 섹션을 읽어보세요.
이 섹션에는 중요한 개념들을 빠르게 검토할 수 있는 짧은 영상들이 포함되어 있다.
복습을 하고자 한다면, 이 영상들이 도움이 될 것이다.
이제 당신은 위의 컴퓨터 과학 주제들을 모두 알고 있으므로, 코딩 문제에 답하는 것을 연습할 차례이다.
코딩 문제 연습은 프로그래밍 문제에 대한 답을 외우는 것이 아니다.
당신에게 프로그래밍 문제를 푸는 연습이 필요한 이유:
체계적이고 소통하는 인터뷰에서의 문제풀이에 관한 좋은 시작점이 있다. 당신은 프로그래밍 인터뷰 책에서 이 서식을 얻을 수도 있지만, 나는 이 것이 가장 좋다고 본다: Algorithm design canvas
집에 화이트보드가 없는가? 그럴 수 있다. 나는 커다란 화이트보드를 가진 괴짜이다. 화이트보드 대신에 상점에서 큰 도화지를 사오자. 소파에 앉아서 연습할 수 있다. 이 것은 내 "소파 화이트보드"이다. 크기 비교를 위해 사진에 펜을 추가하였다. 펜을 쓰면, 곧 지우고 싶어질 것이다. 금방 지저분해 진다.
보충:
읽고 프로그래밍 문제 풀기 (순서대로):
위의 도서 목록을 보세요.
공부하는 게 머리에 잘 안 들어올 때, 한번 해보세요. 가능한 한 매일 코딩 챌린지를 하는겁니다.
코딩 인터뷰 질문들 영상:
Challenge sites:
Language-learning sites, with challenges:
Challenge repos:
모의 면접:
아래의 아이템들에 따른 너가 받을 20개의 인터뷰 질문에 대해 생각하라. 각각 2-3개의 대답을 준비해라. 당신이 성취한 것에 대해 데이터 뿐만 아니라 스토리를 만들어라.
내 경우에는 이랬다. (I already may know answer to but want their opinion or team perspective):
축하드립니다!
꾸준히 공부하시길 바랍니다.
끝난게 아니니까요.
*****************************************************************************************************
*****************************************************************************************************
아래의 모든 것들은 선택 사항이다.
당신은 이것들을 공부함으로써 더 많은 CS 개념들에 대해 알 수 있을 것이며, 소프트웨어 엔지니어링 직업을 준비하는 데에도 도움이 될 것
이다. 더불어 당신은 훨씬 더 균형 잡힌 소프트웨어 엔지니어가 될 것이다.
*****************************************************************************************************
*****************************************************************************************************
아래는 당신이 흥미로워하는 주제에 대해 공부할 수 있는 자료들입니다.
Computer Architecture, Sixth Edition: A Quantitative Approach
두루 갖춘 소프트웨어 엔지니어가 되는데 도움이 될만한 것들을 추가했습니다. 이를 통해 더 큰 도구들을 다루실 수 있게 되실 겁니다.
AVL trees
In practice:
From what I can tell, these aren't used much in practice, but I could see where they would be:
The AVL tree is another structure supporting O(log n) search, insertion, and removal. It is more rigidly
balanced than red–black trees, leading to slower insertion and removal but faster retrieval. This makes it
attractive for data structures that may be built once and loaded without reconstruction, such as language
dictionaries (or program dictionaries, such as the opcodes of an assembler or interpreter).
Splay trees
In practice:
Splay trees are typically used in the implementation of caches, memory allocators, routers, garbage collectors,
data compression, ropes (replacement of string used for long text strings), in Windows NT (in the virtual memory,
networking and file system code) etc.
MIT Lecture: Splay Trees:
Red/black trees
these are a translation of a 2-3 tree (see below)
In practice:
Red–black trees offer worst-case guarantees for insertion time, deletion time, and search time.
Not only does this make them valuable in time-sensitive applications such as real-time applications,
but it makes them valuable building blocks in other data structures which provide worst-case guarantees;
for example, many data structures used in computational geometry can be based on red–black trees, and
the Completely Fair Scheduler used in current Linux kernels uses red–black trees. In the version 8 of Java,
the Collection HashMap has been modified such that instead of using a LinkedList to store identical elements with poor
hashcodes, a Red-Black tree is used.
Aduni - Algorithms - Lecture 4 (link jumps to starting point) (video)
2-3 search trees
In practice:
2-3 trees have faster inserts at the expense of slower searches (since height is more compared to AVL trees).
You would use 2-3 tree very rarely because its implementation involves different types of nodes. Instead, people use Red Black trees.
2-3-4 Trees (aka 2-4 trees)
In practice:
For every 2-4 tree, there are corresponding red–black trees with data elements in the same order. The insertion and deletion
operations on 2-4 trees are also equivalent to color-flipping and rotations in red–black trees. This makes 2-4 trees an
important tool for understanding the logic behind red–black trees, and this is why many introductory algorithm texts introduce
2-4 trees just before red–black trees, even though **2-4 trees are not often used in practice**.
N-ary (K-ary, M-ary) trees
note: the N or K is the branching factor (max branches)
binary trees are a 2-ary tree, with branching factor = 2
2-3 trees are 3-ary
B-Trees
재밌는 사실: it's a mystery, but the B could stand for Boeing, Balanced, or Bayer (co-inventor)
In Practice:
B-트리는 데이터베이스에 광범위하게 사용됩니다. 가장 현대적인 파일시스템은 B-트리를 씁니다 (or Variants).
데이터베이스에 사용될 뿐만 아니라, B-트리는 특정한 파일의 임의의 블록에 '빠른 무작위 탐색'을 가능하게 합니다.
기본적인 문제는 파일블록 주소 i를 하나의 디스크 블록(또는 아마도 실린더-헤드-섹터) 주소로 바꾸는 것입니다.
MIT 6.851 - Memory Hierarchy Models (video)
- covers cache-oblivious B-Trees, very interesting data structures
- the first 37 minutes are very technical, may be skipped (B is block size, cache line size)
이미 언급한 몇몇의 개념에 대한 설명을 좀 더 보강하기 위해서 적었습니다.
하지만 더하길 원하지 않았어요. 왜냐면 그 양이 너무나 방대하기 때문이지요.
하나의 주제에 대하여 지나치게 깊게 파고드는 것은 쉬운 일입니다.
이번 세기에 직장을 구하고 싶으시잖아요, 맞죠?
SOLID
Union-Find
More Dynamic Programming (videos)
Advanced Graph Processing (videos)
MIT Probability (mathy, and go slowly, which is good for mathy things) (videos):
**문자열 매칭
정렬
편하게 보세요. "Netflix and skill"이라니까요 :P
List of individual Dynamic Programming problems (each is short)
Excellent - MIT Calculus Revisited: Single Variable Calculus
Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory
CSE373 - Analysis of Algorithms (25 videos)
UC Berkeley CS 152: Computer Architecture and Engineering (20 videos)
Carnegie Mellon - Computer Architecture Lectures (39 videos)
MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)
MIT 6.050J: Information and Entropy, Spring 2008 (19 videos)