Skip to content

Latest commit

 

History

History
1975 lines (1655 loc) · 143 KB

File metadata and controls

1975 lines (1655 loc) · 143 KB

코딩 인터뷰 대학(Coding Interview University)

나는 원래 이것을 소프트웨어 엔지니어가 되기 위한 짧은 연구 목록으로 만들었다. 그러나 지금 당신이 볼수 있듯이 이 목록은 매우 커졌다. 이 목록을 숙지 한 후, 나는 아마존에 소프트웨어 엔지니어로 채용됐다! 당신은 아마 내가 한 것처럼 많이 공부할 필요는 없을 것이다. 어쨌든 당신이 필요로 하는 모든 것은 여기에 있다.

몇 달 동안 하루에 8-12 시간 정도 공부했습니다. 이것이 제 이야기입니다. Google 인터뷰를 위해 8 개월 동안 풀 타임으로 공부 한 이유

여기에 나열된 목록들은 아마존, 페이스북, 구글, 마이크로소프트 같은 거대 기업을 포함한 거의 모든 소프트웨어 회사의 인터뷰를 준비하는데에 도움이 될것이다.

행운을 빈다!

번역:
진행 중인 번역:

코딩 인터뷰 대학이란?

코딩 인터뷰 대학은 (컴퓨터공학 학위 없이 독학한) 웹 개발자에서 큰 회사의 소프트웨어 엔지니어가 되기 위한 나의 몇 달간의 공부 계획이다.

Coding at the whiteboard - from HBO's Silicon Valley

이 글은 신입 소프트웨어 엔지니어 혹은 소프트웨어/웹 개발에서 (컴퓨터과학 지식이 필요한) 소프트웨어 엔지니어링으로 전환자고자 하는 사람들을 위한 글입니다. 만약 당신이 여러 해의 소프트웨어 엔지니어링 경력이 있다면, 더 어려운 인터뷰가 예상된다.

만약 당신이 여러 해의 소프트웨어/웹 개발 경험을 가지고 있다면, 구글과 아마존, 페이스북 그리고 마이크로소프트과 같은 큰 규모의 소프트웨어 회사들은 소프트웨어 엔지니어링을 소프트웨어/웹 개발과 다르게 바라보고 있으며 컴퓨터과학 지식을 요구한다는 사실에 주목하도록 하자.

믿음직한 엔지니어 혹은 시스템 엔지니어가 되고 싶다면, 선택적인 주제 목록(네트워크, 보안 등)을 더 공부하도록 하자.


목차

---------------- 여기부터는 선택사항입니다. ----------------


이걸 왜 써야하죠?

내가 이 프로젝트를 시작했을 때, 나는 힙이나 스택, 시간복잡도, 트리, 그래프 순회 등에 대하여 전혀 아는 바가 없었다. 만약 내가 정렬 알고리즘을 코딩해야 했다면, 나는 그리 잘하지 못했을 것이다. 모든 사용했던 모든 자료 구조는 언어 안에서 구현되어 있던 것들이고, 나는 그것들이 보이지 않는 곳에서 어떻게 작동하고 있는지 몰랐다. 나는 실행 중인 프로세스가 메모리 초과 에러를 메시지를 보내지 않는 한 메모리를 관리할 필요가 없었고, 나는 해결책을 찾아야만 했다. 나는 몇몇 다차원 배열이나 연관 배열을 사용해왔지만, 자료구조를 처음부터 구현해본 적은 없었다.

하지만 이 공부 계획을 진행하면서 나는 내가 고용될 것이라는 자신감을 갖게 되었다. 이 것은 내게 여러 달이 필요한 긴 계획이다. 만약 당신이 이 중 많은 내용에 익숙하다면 시간은 훨씬 덜 들 것이다.

어떻게 사용하면 되나요?

아래의 모든 것은 대략적인 개요이며 당신은 위에서 아래 순서대로 진행해야 한다.

이 문서는 진행 상황을 확인하기 위한 목록 작성부터 다른 곳에도, Github식 마크다운 문법을 사용하고 있다.

새 브랜치를 만들어서 중괄호에 x표를 넣는 식으로 항목을 체크하라: [x]

브랜치를 포크하고 아래의 명령을 따라라

포크 버튼을 눌러 Github https://github.com/jwasham/coding-interview-university 레포지토리를 포크하라.

로컬 레포지토리에 클론하라.

git clone [email protected]:<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

Github식 마크다운에 대하여

당신은 충분히 똑똑합니다

영상 자료에 관하여

몇몇 영상들은 Cousera, Edx에 등록을 해야만 접근할 수 있습니다. 이것들은 MOOCs라고 불리는데요. 강의가 없는 경우에는 몇 달 동안 기다려야 할 수도 있습니다.

여러분이 YouTube 온라인 강의 동영상과 같이 무료이고 항상 접근 가능한 동영상 소스들을 추가해주면 정말 감사하겠습니다.
저는 대학 강의 듣는 것을 좋아합니다.

인터뷰 과정 & 전반적인 인터뷰 준비 과정

인터뷰를 위한 언어 고르기

인터뷰때에 당신이 쓰기에 편한 언어를 선택해도 되지만, 큰 기업들은 보통 아래의 언어들을 선택합니다.

  • C++
  • Java
  • Python

아래 언어들을 사용할 수 있지만 주의하여야 합니다.

  • JavaScript
  • Ruby

코딩 인터뷰를 위한 언어를 선택하는 것과 관련하여 제가 쓴 글입니다: 코딩 인터뷰를 위한 언어 선택하기

당신은 당신의 언어에 매우 익숙하고 그 언어에 대해 잘 알아야 합니다.

언어 선택에 도움이 될 만한 읽을 거리들

프로그래밍 언어 참고목록

제가 공부하고 있는 C, C++, Python 강의를 아래서 볼 수 있습니다. 아래를 보시면 관련된 책들이 몇 개 있습니다.

도서 목록

아래의 목록은 내가 공부했던 책들보다는 적다. 당신의 시간을 절약하기 위해 몇몇 책들은 생략하였다.

인터뷰 준비를 위해서

만일 당신이 많은 여유 시간이 있다면:

하나를 선택:

특정 언어 관련

인터뷰를 위해 당신의 언어를 선택하여야 합니다 (윗글 참조) 아래는 제가 추천하는 언어들입니다. 이 언어들중에 부연설명이나 부가 자료들이 있다면 나눠 주세요.

이 중 하나를 읽으려면 코딩 문제 푸는 데 필요한 데이터 구조 및 알고리즘 지식이 있어야합니다.

검토(review)를 좋아하지 않는다면, 이 프로젝트의 모든 영상은 생략해도 됩니다.

Additional language-specific resources here.

C++

나는 아래의 두 책들을 읽지 않았습니다. 하지만 Sedgewick이 높게 평가한 책들입니다. 그는 정말 대단한 사람입니다.

C++에 대한 더 나은 추천 책이 있다면 알려주십시오. 포괄적인 자료를 찾고 있습니다.

Java

또는:

  • Data Structures and Algorithms in Java
    • by Goodrich, Tamassia, Goldwasser
    • UC버클리 대학의 CS입문 과정의 선택 텍스트로 사용됨
    • 아래에서 Python 버전에 대한 나의 책 보고서를 참조하십시오. 이 책은 동일한 주제를 다루고 있습니다.

Python

시작하기 전에

이 문서는 몇 달간 계속 업데이트 되고 있으며, 그런 이유로, 내가 감당할 수 없어지기 시작한 듯하다.

내가 저지른 몇 가지 실수들을 소개한다. 이를 통해 당신은 이 과정을 좀 더 효과적으로 진행할 수 있기를 바란다.

1. 당신은 이것을 다 기억하지 못할 것이다.

나는 수 시간의 비디오를 보고 방대한 양의 노트를 작성했지만, 몇 달 뒤에는 대부분의 내용을 기억하지 못했다. 나는 3일 동안 내가 작성한 노트를 보고 flashcard를 만들면서 내용들을 다시 검토해야 했다.

꼭 읽고 내가 한 실수들을 반복하지 않길 바란다.

Retaining Computer Science Knowledge

내가 추천받은 강좌 (아직 수업을 들어보지는 않았다): Learning how to Learn

2. Flashcard를 사용하자.

이 문제를 해결하기 위해 나는 2가지 종류(일반적인 내용, 코드)의 flashcard를 보관하고 추가할 수 있는 작은 사이트를 만들었다. 각 카드는 다른 서식을 가지고 있다.

이 사이트는 모바일에 최적화 되어있기 때문에 내 전화기나 태블릿 어디에서든 이를 확인할 수 있다.

당신만의 카드를 무료로 만들어보자:

앞에서도 언급했듯이 나는 불필요하게 많은 것을 공부하려고 했고, 내 카드의 내용들은 어셈블리 언어와 Python의 자잘한 지식들부터 기계 학습과 통계학까지 넘나들게 되었다. 결국 기업이 요구하는 것보다 훨씬 멀리 가버리고 말았다.

flashcard에 대한 참고사항: 답을 할 수 있더라도 처음부터 안다고 표시하지 말자. 정확히 알기 전까지는 같은 카드를 보고 여러 번 답변할 수 있어야한다. 반복 학습을 통해 해당 지식은 당신의 뇌에 깊이 각인될 것이다.

나의 flashcard site를 사용하는 대신 Anki를 사용해도 된다. 나는 이 것을 여러 번 추천받았다. 이것은 당신이 기억하는 것을 돕기 위해 반복적인 시스템을 사용한다.

이것은 사용자 친화적이며, 모든 플랫폼에서 사용가능하다. 또한 클라우드 동기화 시스템을 제공한다. 이것은 iOS에서는 $25이지만 다른 플랫폼에서는 무료로 사용 가능하다.

Anki format의 내 flashcard 데이터베이스: https://ankiweb.net/shared/info/25173560 (thanks @xiewenya)

3. 자료구조와 알고리즘을 배우면서 코딩 인터뷰를 시작하라

문제를 풀기 위해 배웠던 무언가를 적용하는 것이 필요합니다., 그렇지 않으면 까먹을 겁니다. 내가 이 실수를 했습니다. 한 주제를 익혔다면 , 링크드 리스트와 같이 그 주제에 좀 익숙해졌다면, 코딩 인터뷰 책 한권을 펴서 링크드 리스트와 관련된 문제를 몇개 풀어보십시오. 그리고 나서 다시 돌아가 다른 링크드리스트 문제를 해결하던, 회귀 문제나 다른 것을 하십시오. 하지만 배우면서 문제를 계속해서 푸십시오. 당신은 지식 자체의 소유가 아니라 그 지식을 적용할 수 있기에 고용되는 것입니다. 다음은 제가 추천하는 책과 사이트들입니다.. 좀 더 알아보고 싶다면: 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의 도움없이 메모리 할당과 해지 (파이선 빼고))
  • 빌트인 타입을 사용하여 나는 빌트인 도구에 대한 경험이 있게 되었다. (내 프로젝트의 링크 리스트 구현은 쓰지 않을 예정)

모든 주제에 대한 모든 것을 할 수 없지만 나는 노력했다.

나의 코드를 여기서 확인하세요:

당신은 모든 알고리즘에 대해서 기억할 필요는 없다.

컴퓨터에 코딩하지 말고 와이트보드나 종이에 적어보아라. 인풋 값으로 샘플 테스트를 해 보아라. 그리고 컴퓨터로 테스트해 보아라.

먼저 알아야 할 지식

알고리즘 복잡도 / Big-O / 점근적 분석

자료구조

추가 지식

트리

정렬

개략적으로 보자면, 여기에 시각적으로 나타낸 15가지 정렬 알고리즘들을 보세요. 이 주제에 대해서 더 자세히 알고 싶다면, 몇몇 주제에 대한 세부사항에서 "정렬" 섹션를 보세요.

그래프

그래프는 컴퓨터 과학의 여러 문제들을 표현하는 데 사용할 수 있다. 때문에 이 섹션은 트리나 정렬 섹션처럼 길다.

Skiena의 책(아래의 책 섹션 참조)과 인터뷰 책에서 더 많은 그래프 실습을 할 수 있습니다.

Even More Knowledge

시스템 디자인, 확장성, 데이터 핸들링


최종 검토

이 섹션에는 중요한 개념들을 빠르게 검토할 수 있는 짧은 영상들이 포함되어 있다.
복습을 하고자 한다면, 이 영상들이 도움이 될 것이다.

코딩 문제 연습

이제 당신은 위의 컴퓨터 과학 주제들을 모두 알고 있으므로, 코딩 문제에 답하는 것을 연습할 차례이다.

코딩 문제 연습은 프로그래밍 문제에 대한 답을 외우는 것이 아니다.

당신에게 프로그래밍 문제를 푸는 연습이 필요한 이유:

  • 문제 인식, 그리고 어떤 자료구조와 알고리즘이 언제 필요한지
  • 문제의 조건을 모으기
  • 인터뷰를 하듯 당신이 문제를 푸는 과정을 말하기
  • 컴퓨터가 아닌 종이나 화이트보드에 코딩하기
  • 당신의 풀이의 시간, 공간 복잡도를 제시하기
  • 당신의 해답을 테스팅하기

체계적이고 소통하는 인터뷰에서의 문제풀이에 관한 좋은 시작점이 있다. 당신은 프로그래밍 인터뷰 책에서 이 서식을 얻을 수도 있지만, 나는 이 것이 가장 좋다고 본다: Algorithm design canvas

집에 화이트보드가 없는가? 그럴 수 있다. 나는 커다란 화이트보드를 가진 괴짜이다. 화이트보드 대신에 상점에서 큰 도화지를 사오자. 소파에 앉아서 연습할 수 있다. 이 것은 내 "소파 화이트보드"이다. 크기 비교를 위해 사진에 펜을 추가하였다. 펜을 쓰면, 곧 지우고 싶어질 것이다. 금방 지저분해 진다.

my sofa whiteboard

보충:

읽고 프로그래밍 문제 풀기 (순서대로):

위의 도서 목록을 보세요.

코딩 연습/도전

공부하는 게 머리에 잘 안 들어올 때, 한번 해보세요. 가능한 한 매일 코딩 챌린지를 하는겁니다.

코딩 인터뷰 질문들 영상:

Challenge sites:

Language-learning sites, with challenges:

Challenge repos:

모의 면접:

인터뷰가 얼마 남지 않았을 때

이력서

  • 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 개념들에 대해 알 수 있을 것이며, 소프트웨어 엔지니어링 직업을 준비하는 데에도 도움이 될 것
이다. 더불어 당신은 훨씬 더 균형 잡힌 소프트웨어 엔지니어가 될 것이다.

*****************************************************************************************************
*****************************************************************************************************

Additional Books

아래는 당신이 흥미로워하는 주제에 대해 공부할 수 있는 자료들입니다.
  • The Unix Programming Environment

    • an oldie but a goodie
  • The Linux Command Line: A Complete Introduction

    • a modern option
  • TCP/IP Illustrated Series

  • Head First Design Patterns

    • a gentle introduction to design patterns
  • Design Patterns: Elements of Reusable Object-Oriente​d Software

    • aka the "Gang Of Four" book, or GOF
    • the canonical design patterns book
  • UNIX and Linux System Administration Handbook, 5th Edition

  • Algorithm Design Manual (Skiena)

    • As a review and problem recognition
    • The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview.
    • This book has 2 parts:
      • class textbook on data structures and algorithms
        • pros:
          • is a good review as any algorithms textbook would be
          • nice stories from his experiences solving problems in industry and academia
          • code examples in C
        • cons:
          • can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects
          • chapters 7, 8, 9 can be painful to try to follow, as some items are not explained well or require more brain than I have
          • don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material.
      • algorithm catalog:
        • this is the real reason you buy this book.
        • about to get to this part. Will update here once I've made my way through it.
    • Can rent it on kindle
    • Answers:
    • Errata
  • Write Great Code: Volume 1: Understanding the Machine

    • The book was published in 2004, and is somewhat outdated, but it's a terrific resource for understanding a computer in brief.
    • The author invented HLA, so take mentions and examples in HLA with a grain of salt. Not widely used, but decent examples of what assembly looks like.
    • These chapters are worth the read to give you a nice foundation:
      • Chapter 2 - Numeric Representation
      • Chapter 3 - Binary Arithmetic and Bit Operations
      • Chapter 4 - Floating-Point Representation
      • Chapter 5 - Character Representation
      • Chapter 6 - Memory Organization and Access
      • Chapter 7 - Composite Data Types and Memory Objects
      • Chapter 9 - CPU Architecture
      • Chapter 10 - Instruction Set Architecture
      • Chapter 11 - Memory Architecture and Organization
  • Introduction to Algorithms

    • 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
  • Computer Architecture, Sixth Edition: A Quantitative Approach

    • For a richer, more up-to-date (2017), but longer treatment
  • Programming Pearls

    • 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

두루 갖춘 소프트웨어 엔지니어가 되는데 도움이 될만한 것들을 추가했습니다. 이를 통해 더 큰 도구들을 다루실 수 있게 되실 겁니다.

몇몇 주제에 대한 세부사항

이미 언급한 몇몇의 개념에 대한 설명을 좀 더 보강하기 위해서 적었습니다.
하지만 더하길 원하지 않았어요. 왜냐면 그 양이 너무나 방대하기 때문이지요. 
하나의 주제에 대하여 지나치게 깊게 파고드는 것은 쉬운 일입니다.
이번 세기에 직장을 구하고 싶으시잖아요, 맞죠?

Video Series

편하게 보세요. "Netflix and skill"이라니까요 :P

컴퓨터 과학 강의들

학술 자료들

라이센스

CC-BY-SA-4.0