나는 원래 이것을 소프트웨어 엔지니어가 되기 위한 짧은 연구 목록으로 만들었다.
그러나 지금 당신이 볼수 있듯이 이 목록은 매우 커졌다. 이 목록을 숙지 한 후,
나는 아마존에 소프트웨어 엔지니어로 채용됐다!
당신은 아마 내가 한 것처럼 많이 공부할 필요는 없을 것이다. 어쨌든 당신이 필요로 하는 모든 것은 여기에 있다.
코딩 인터뷰 대학은 (컴퓨터공학 학위 없이 독학한) 웹 개발자에서 큰 회사의 소프트웨어 엔지니어가 되기 위한 나의 몇 달간의 공부 계획이다.
이 글은 신입 소프트웨어 엔지니어 혹은 소프트웨어/웹 개발에서 (컴퓨터과학 지식이 필요한) 소프트웨어 엔지니어링으로 전환자고자 하는 사람들을 위한 글입니다. 만약 당신이 여러 해의 소프트웨어 엔지니어링 경력이 있다면, 더 어려운 인터뷰가 예상된다.
만약 당신이 여러 해의 소프트웨어/웹 개발 경험을 가지고 있다면, 구글과 아마존, 페이스북 그리고 마이크로소프트과 같은 큰 규모의 소프트웨어 회사들은 소프트웨어 엔지니어링을 소프트웨어/웹 개발과 다르게 바라보고 있으며 컴퓨터과학 지식을 요구한다는 사실에 주목하도록 하자.
믿음직한 엔지니어 혹은 시스템 엔지니어가 되고 싶다면, 선택적인 주제 목록(네트워크, 보안 등)을 더 공부하도록 하자.
내가 이 프로젝트를 시작했을 때, 나는 힙이나 스택, 시간복잡도, 트리, 그래프 순회 등에 대하여 전혀 아는 바가 없었다.
만약 내가 정렬 알고리즘을 코딩해야 했다면, 나는 그리 잘하지 못했을 것이다.
모든 사용했던 모든 자료 구조는 언어 안에서 구현되어 있던 것들이고, 나는 그것들이 보이지 않는 곳에서 어떻게 작동하고 있는지 몰랐다.
나는 실행 중인 프로세스가 메모리 초과 에러를 메시지를 보내지 않는 한 메모리를 관리할 필요가 없었고, 나는 해결책을 찾아야만 했다.
나는 몇몇 다차원 배열이나 연관 배열을 사용해왔지만, 자료구조를 처음부터 구현해본 적은 없었다.
하지만 이 공부 계획을 진행하면서 나는 내가 고용될 것이라는 자신감을 갖게 되었다. 이 것은 내게 여러 달이 필요한 긴 계획이다.
만약 당신이 이 중 많은 내용에 익숙하다면 시간은 훨씬 덜 들 것이다.
어떻게 사용하면 되나요?
아래의 모든 것은 대략적인 개요이며 당신은 위에서 아래 순서대로 진행해야 한다.
이 문서는 진행 상황을 확인하기 위한 목록 작성부터 다른 곳에도, Github식 마크다운 문법을 사용하고 있다.
문제를 풀기 위해 배웠던 무언가를 적용하는 것이 필요합니다., 그렇지 않으면 까먹을 겁니다. 내가 이 실수를 했습니다. 한 주제를 익혔다면 ,
링크드 리스트와 같이 그 주제에 좀 익숙해졌다면, 코딩 인터뷰 책 한권을 펴서 링크드 리스트와 관련된 문제를 몇개 풀어보십시오. 그리고 나서 다시 돌아가 다른 링크드리스트 문제를 해결하던, 회귀 문제나 다른 것을 하십시오. 하지만 배우면서 문제를 계속해서 푸십시오. 당신은 지식 자체의 소유가 아니라 그 지식을 적용할 수 있기에 고용되는 것입니다.
다음은 제가 추천하는 책과 사이트들입니다..
좀 더 알아보고 싶다면: Coding Question Practice
4. 검토, 검토, 검토
나는 ASCII, OSI 구조, Big-O 표기법 등에 관한 일련의 치트시트를 만들어 놓고, 여유 시간이 날 때마다 공부한다.
30분 동안 프로그래밍 문제를 해결하고, flashcard를 살펴보자.
5. 집중
주의를 산만하게 만드는 많은 것이 있으며, 이것들은 우리의 귀중한 시간을 뺏어간다. 주의를 집중하는 것은 힘든 일이다.
다루지 않을 것
이 기술들은 널리 퍼져 있는 기술이지만, 여기서 다루는 부분은 아닙니다:
SQL
Javascript
HTML, CSS, 그리고 다른 프론트엔드 기술들
하루 하루의 계획
어떤 주제들은 하루가 걸리고, 어떤 것들은 며칠이 걸릴 것이다.
또 어떤것은 구현할 것들이 없이 그냥 배우는 것들이다.
아래 리스트에 있는 것에서 매일 하나의 주제를 택했고, 그 주제에 대한 강의를 보고, 구현을 했다:
C - 인자를 가지는 구조체와 함수 사용
C++ - 빌트인 타입 사용하지 않음
C++ - 링크리스트를 위한 STL's std::list 같은 빌트인 타입 사용
Python - 빌트인 타입 사용 (파이선 연습을 계속 하려고)
제대로 하고 있는지 테스트를 했고 가끔은 간단한 assert() 사용
당신은 아마 자바나 그 어떤 언어를 이용하겠지만 이것은 그냥 내 것들이다.
당신은 이것을 다 할 필요는 없다. 단지 인터뷰를 위한 하나의 언어를 할 것..
왜 이 모든것을 코딩해야 하는가?
나는 이것에 미칠때까지 연습하고 또 연습했고, 아무런 문제 없이 할 수 있게 되었다 (어떤 것들은 다양한 케이스가 있고 이것을 기억하기 위해 기록을 보관했다.)
있는 그대로의 제한 속에서 연습 (garbage collection의 도움없이 메모리 할당과 해지 (파이선 빼고))
빌트인 타입을 사용하여 나는 빌트인 도구에 대한 경험이 있게 되었다. (내 프로젝트의 링크 리스트 구현은 쓰지 않을 예정)
짚고가기: 이중 포인터에 대한 지식이 필요하다면:
(for when you pass a pointer to a function that may change the address where that pointer points)
이 페이지는 포인터가 포인터를 가리키는 것을 파악하는 정도입니다. 저는 아래 목록을 순서대로 읽지 않기를 권장합니다. 가독성과 유지 보수성이 더 좋기 때문입니다.
dequeue() - value를 반환하고 가장 최근에 추가된 원소(front)를 제거한다.
empty()
고정 길이 배열을 사용하여 구현하기:
enqueue(value) - 사용 가능한 저장 공간의 끝에 item을 추가한다.
dequeue() - value를 반환하고 가장 최근에 추가된 원소를 제거한다.
empty()
full()
비용:
a bad implementation using linked list where you enqueue at head and dequeue at tail would be O(n)
because you'd need the next to last element, causing a full traversal each dequeue
enqueue: O(1) (amortized, linked list and array [probing])
Know about the most famous classes of NP-complete problems, such as traveling salesman and the knapsack problem,
and be able to recognize them when an interviewer asks you them in disguise.
Scalability and System Design are very large topics with many topics and resources, since
there is a lot to consider when designing a software/hardware system that can scale.
Expect to spend quite a bit of time on this.
For even more, see "Mining Massive Datasets" video series in the Video Series section.
Practicing the system design process: Here are some ideas to try working through on paper, each with some documentation on how it was handled in the real world:
이제 당신은 위의 컴퓨터 과학 주제들을 모두 알고 있으므로, 코딩 문제에 답하는 것을 연습할 차례이다.
코딩 문제 연습은 프로그래밍 문제에 대한 답을 외우는 것이 아니다.
당신에게 프로그래밍 문제를 푸는 연습이 필요한 이유:
문제 인식, 그리고 어떤 자료구조와 알고리즘이 언제 필요한지
문제의 조건을 모으기
인터뷰를 하듯 당신이 문제를 푸는 과정을 말하기
컴퓨터가 아닌 종이나 화이트보드에 코딩하기
당신의 풀이의 시간, 공간 복잡도를 제시하기
당신의 해답을 테스팅하기
체계적이고 소통하는 인터뷰에서의 문제풀이에 관한 좋은 시작점이 있다. 당신은 프로그래밍 인터뷰 책에서 이 서식을 얻을 수도 있지만, 나는 이 것이 가장 좋다고 본다: Algorithm design canvas
집에 화이트보드가 없는가? 그럴 수 있다. 나는 커다란 화이트보드를 가진 괴짜이다. 화이트보드 대신에 상점에서 큰 도화지를 사오자.
소파에 앉아서 연습할 수 있다. 이 것은 내 "소파 화이트보드"이다.
크기 비교를 위해 사진에 펜을 추가하였다. 펜을 쓰면, 곧 지우고 싶어질 것이다. 금방 지저분해 진다.
See Resume prep items in Cracking The Coding Interview and back of Programming Interviews Exposed
인터뷰가 다가오면 생각해보기
아래의 아이템들에 따른 너가 받을 20개의 인터뷰 질문에 대해 생각하라. 각각 2-3개의 대답을 준비해라.
당신이 성취한 것에 대해 데이터 뿐만 아니라 스토리를 만들어라.
왜 이 직업을 원합니까?
당신이 풀었던 문제 중 힘들었던 문제는?
큰 도전에 직면한 적은?
최고의/최악의 디자인을 본 적이 있는가?
현존하는 제품을 향상시킬 수 있는 아이디어
개인적으로 일할 때 가장 잘 일 하는가? 아니면 팀원으로서 있을 때?
어떤 기술과 경험들이 당신의 역할에서 자산이 되었으며 그 이유는?
어떤 것이 가장 즐거웠는가 [job x / project y]?
무엇이 가장 큰 도전이었는가 [job x / project y]?
무엇이 가장 힘들었던 버그였는가? [job x / project y]?
무엇을 배웠는가 [job x / project y]?
무엇이 향상되었는가 [job x / project y]?
면접관에게 받았던 질문들
내 경우에는 이랬다. (I already may know answer to but want their opinion or team perspective):
얼마나 큰 팀에 있었나요?
당신의 개발 사이클은 어떤 모습인가요? 폭포수(워터폴)/스프린트/애자일인가요?
보통 마감까지 달리시는 편인가요? 아니면 여유롭게 하시는 편인가요?
팀 내에서 의사 결정은 어떻게 하나요?
당신은 한 주에 미팅을 얼마나 한다고 생각하나요?
업무 환경이 집중력에 도움이 된다고 생각하나요?
지금은 어떤 일을 하고 계신가요?
What do you like about it?
어떤 Work life를 생각하시나요?
워라밸은 어떤게 좋나요?
취직했다면
축하드립니다!
꾸준히 공부하시길 바랍니다.
끝난게 아니니까요.
*****************************************************************************************************
*****************************************************************************************************
아래의 모든 것들은 선택 사항이다.
당신은 이것들을 공부함으로써 더 많은 CS 개념들에 대해 알 수 있을 것이며, 소프트웨어 엔지니어링 직업을 준비하는 데에도 도움이 될 것
이다. 더불어 당신은 훨씬 더 균형 잡힌 소프트웨어 엔지니어가 될 것이다.
*****************************************************************************************************
*****************************************************************************************************
Important: Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently.
aka CLR, sometimes CLRS, because Stein was late to the game
The first couple of chapters present clever solutions to programming problems (some very old using data tape) but
that is just an intro. This a guidebook on program design and architecture.
Additional Learning
두루 갖춘 소프트웨어 엔지니어가 되는데 도움이 될만한 것들을 추가했습니다. 이를 통해 더 큰 도구들을 다루실 수 있게 되실 겁니다.
적어도 하나의 타입의 균형 이진 트리에 대하여 알고 계시는 게 좋습니다 (그리고 어떻게 적용되는지까지요):
"Among balanced search trees, AVL and 2/3 trees are now passé, and red-black trees seem to be more popular.
A particularly interesting self-organizing data structure is the splay tree, which uses rotations
to move any accessed key to the root." - Skiena
Of these, I chose to implement a splay tree. From what I've read, you won't implement a
balanced search tree in your interview. But I wanted exposure to coding one up
and let's face it, splay trees are the bee's knees. I did read a lot of red-black tree code.
splay tree: insert, search, delete functions
If you end up implementing red/black tree try just these:
search and insertion functions, skipping delete
I want to learn more about B-Tree since it's used so widely with very large data sets.
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).
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.
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.
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.
재밌는 사실: 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)
k-D Trees
great for finding number of points in a rectangle or higher dimension object