/google-interview-university

A complete daily plan for studying to become a Google software engineer.

Creative Commons Attribution Share Alike 4.0 InternationalCC-BY-SA-4.0

Google Interview University

Translations:

문서 소개

이 문서는 구글 Software 개발자가 되기 위한 계획적인 접근 방식을 제공한다. 이 문서의 최초 작성자는 John Washam 이며, 그 분의 git repository forking 하여 문서 번역 진행했습니다. 또한 이문서의 "나는" 이라는 것은 최초 작성자입니다.

Coding at the whiteboard - from HBO's Silicon Valley

아래 긴 리스트의 내용은 Google 의 코칭 노트 에서 참고 및 확장 했으니, 꼭 알고 있어야 하는 사항이니 명심하자.

인터뷰에서 나왔던 내용이나 문제를 푸는데 도움이 될 만한 것들을 문서 아래에 추가했다. 많은 내용들이 Steve Yegge's Blog "Get that job at Google" 에서 가져왔고, 때로는 Google 의 코칭 노트에서 단어 하나 하나를 반영했다.

나는 Yegge 가 권하는 방법에서 부터 당신이 알아야 할 것을 정리 드립니다. 그리고 새로이 software engineer 가 되고 싶다면(이 문서에는 web development 와 software engineer 에 차이가 있으며, 그 차이는 computer science 관련 지식등의 더 많은 것을 알고 있어야 하는 것으로 보입니다.) 만약, 당신이 computer science(컴퓨터 과학)에 지식과 경력이 있다면 interview 는 더욱더 힘들 것입니다.(더 어려운 문제가 주어진다는 의미로 생각됩니다.) Read more here

만약, system engineer 와 관련된 일을 했다면, networking 이나 security 관련된 지식을 조금 더 알아야 한다.


Table of Contents

---------------- Everything below this point is optional ----------------


문서 소개2

나는 나의 구글 인터뷰 준비를 위해 이 문서와 같은 계획을 만들고 실행했다. 나는 web 과 관련된 startup 을 1997년 부터 해왔었다. 나는 경제학 학위는 있지만, computer science 는 없었다. 나의 경력은 매우 성공적이었지만, 나는 구글에서 일하기는 원한다. 컴퓨터 시스템, 알고리즘 효율성, 데이터 구조 성능, 저수준 언어등이 어떻게 동작하는지 알고 싶고 만약 당신이 이중 어떤 것도 알기를 원치 않다면 구글은 당신을 고용하지 않을 것이다.

내가 이 프로젝트를 시작했을 때, 나는 stack, heap, Big-O, tree 와 graph 탐색 같은 것은 알지 못했다. 만약 내가 정렬(sorting) 알고리즘을 구현해야 했다면, 나는 그것을 하기 어렵다고 말했을 것입니다. 데이터 구조(Data Structure)는 사용한 적도, 어떻게 내부적으로 수행되는지도 알지 못했다. 또한 나는 "out of memory" error 를 보아도 메모리 관리를 해야하는 것도 몰라고, 다차원 배열은 몇번 써본 정도이다. 데이터 구조는 처음부터 생성해본적이 절대 없다.

하지만 이 공부를 시작하고 나서는 내가 고용(구글에)될 것이라는 강한 자신감을 갖게 되었고, 이것은 길게 보고 계획을 만들었다. 당연히 이것은 몇개월이라는 시간을 투자해야 한다. 만약 당신이 위에서 언급한 내용에 대해 친숙하다면 시간을 많이 단축할 수 있을 것이다.

[번역자] 모든 링크된 문서나 영상은 영어로 되어있다. 비슷한 참고할 만한 본인이 찾은 좋은 문서가 있다면 같이 링크하도록 하겠다.

문서 사용법

아래에 나오는 모든 내용은 개요이고, 당신은 여기서 부터 순차적으로 하나씩 접근해야 합니다.

나는 Github 의 markdown 을 이용하여 check list 를 만들고 이용합니다.

  • 새로운 브랜치를 만들고 이 파일에 있는 선택 항목에 대해, 완료했다면 'x' 를 대괄호 호([]) 사이에 입력합니다.

    브랜치를 "Fork" 하고 아래의 command 를 입력하세요. git clone https://your.github.com/...

    git checkout -b progress

    계획된 일들이 완료되면 check box 를 선택(x 입력) 하고 저장한뒤,

    git add .

    git commit -m "Marked x"

    git push origin progress 이렇게 하면, 새로운 브랜치 생성 및 자신의 계획 관리가 되는 md 파일이 된다.

More about Github-flavored markdown

Github 의 markdown 한글 문서

Get in a Googley Mood

"future Googler" 프린트 해서 잘보이는 곳에 두자.

future Googler sign

Follow Along with Me

My story: 구글 인터뷰 준비를 위해 왜 8 달 동안 공부를 했는지에 대한 나의 이야기

블로그 / 트위터 / Google+ / 링크드인:

John Washam - Google Interview University

Don't feel you aren't smart enough

구글에 대해

About Video Resources

어떤 영상들은 Coursera, EdX 나 Lynda.com 에서 enroll(등록)을 해야 볼수 있는 것들이 있다.(이를 MOOC 라 한다.) 때로는 몇달을 기다려야 그 강좌를 들을 수 있는 경우가 있고, Lynda.com의 경우 유료이다. (google 검색으로 coursera / Edx 를 검색하면 이용법등의 블로그들을 찾을 수 있을 것이다.)

Interview Process & General Interview Prep

Pick One Language for the Interview

이와 관련된 짧은 글을 소개 한다.: Important: Pick One Language for the Google Interview

당신이 원하는 언어를 선택할 수 있지만, 아래의 언어를 우선 선택하는 것이 좋다.:

  • C++
  • Java
  • Python

당신은 아래의 언어 또한 선택할 수 있지만, 약간의 손해(?) 사항이 있는 듯:

  • JavaScript
  • Ruby

당신은 선택한 언어에 매우 익숙하고 관련된 지식을 갖고 있어야 한다.

언어 선택에 있어 도움이 될 만한 글들:

See language resources here

C / C++ / Python 을 배울 때, 도움이 될만한 책들이 아래에 리스트되어 있다.

책 목록

아래의 리스트는 내가 이용한 책의 양보다는 작다. 당신의 시간을 절약할 수 있길 기대한다.

Interview Prep

당신이 정말 정말 시간이 많다면,

Computer Architecture

짧은 시간 안에:

  • Write Great Code: Volume 1: Understanding the Machine
    • 이 책은 2004년에 출간되어, 바뀐 부분이 있지만 이 책은 computer 를 이해하는데 훌륭한 리소스다.
    • 저자는 HLA(80x86 프로세서를 위한 high level assembler 임) 를 개발goTrh, HLA 에 사용한 예제등을 사용했다.
    • 아래의 챕터를 읽어보면 기본기를 다지는데 좋다:
      • 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 (CPU 아키텍쳐)
      • Chapter 10 - Instruction Set Architecture (명령어 집합 구조)
      • Chapter 11 - Memory Architecture and Organization (메모리 아키텍쳐와 구성)

만약 당신이 조금더 시간이 있다면:

Language Specific

당신은 꼭 인터뷰를 위한 선호하는(?) 언어를 선택해야 한다 위에서 언급했던 추천하는 언어를 위해 공부할 수 있는 책을 소개 한다.

만약에 당신이 아래의 한가지 정도를 읽었다면, 알고리즘과 데이터 구조에 대한 지식을 얻게 된 것이다. 다음으로 코딩 문제를 풀어보는 것이 좋다. 또한 새로운 언어를 선택하고 기본적인 부분을 빠르게 확인 하고, 정리하려고 한다면 sololearn[https://www.sololearn.com/]을 확인 해보길 바란다.

Additional language-specific resources here.

C++

나는 아래의 두 개를 읽지 않았지만, Sedgewick 이 쓴 것은 읽으면 정말 좋다.

만약, 더 나은 C++ 을 위한 책이 있다면 소개 바란다.

Java

OR:

  • Data Structures and Algorithms in Java
    • 공저 Goodrich, Tamassia, Goldwasser
    • UC Berkeley 에서 CS 기초 코스의 부교제로 사용됨.
    • 아래 python 버전도 있다. 같은 주제를 다루었다.

Python

Optional Books

어떤 사람들은 아래의 책을 추천했지만, 내 생각은 다년간 software engineering 경험이 있고 더 어려운 인터뷰가 기대된다면 봐야 할 것이다.

  • Algorithm Design Manual (Skiena)

    • 리뷰 및 문제 인식에 좋음.
    • 알고리즘 파트는 인터뷰에서 받을 어려움보다 훨씬 더 어렵다.
    • 이 책은 두 파트로 구성:
      • 자료 구조와 알고리즘
        • 장점:
          • 알고리즘 교과서로 좋은 리뷰를 받음.
          • 저자의 문제 풀이 경험으로 부터 나오는 좋은 이야기
          • C code 로 보여줌.
        • 단점:
          • 어떤 부분에서는 CLRS(Introduction to Algorithms) 보다 깊이가 있기도 하지만, 어떤 주제에 대해서는 CLRS 가 나음.
          • 챕터 7, 8, 9 는 이해하기가 정말로 어렵고, 게다가 어떤 부분은 자세히 설명도 안되있거나 이해하기 위해 노력을 많이 해야 한다.
          • 내가 틀린말을 하게 하지 마라: 나는 Skiena 의 가르치는 방식과 버릇(?)을 좋아하지만 뉴욕주립대의 교제가 될 수 없을 수도 있다. (오역일수도 있어서 원문을 남깁니다. don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material.)
      • 알고리즘:
        • 이책을 사야하는 진짜 이유는 이 파트에 있다.
        • about to get to this part. Will update here once I've made my way through it.
    • Yegge 말을 인용하면: "다른 어떤 책 보다 더 이 책은 Graph 가 얼마 평범하고 중요한지를 이해하는데 도움을 주었다 - 모든 프로그래머의 툴킷에 포함되어야 할 것이다. 이 책은 또한, 자료 구조와 정렬 알고리즘을 다룬다. 그러나 진짜 좋은 부분은 이 책의 후반부에 있는데, 그것은 유용한 문제들을 다양한 방법으로 너무 자세하지 않을 정도로 백과사전 처럼 구성을 해놓았다. 모든 1-pager(아마 하나의 문제를 다루는 범위?)는 간단한 그림을 사용해 기억하기 쉽게 도운다. 이것은 수백의 문제를 풀고 기억하기 위해 좋은 방법이라 생각한다."
    • kindle 에서 대여 가능
    • 좋은 가격으로 Half.com 에서 살수 있다. 국내에 번역본이 없는 것으로 보인다.
    • 답변들을 정리해 놓은 사이트:
    • Errata
  • Introduction to Algorithms

    • 중요: 이 책을 읽는 것은 제한적인 가치를 가질 수 있다. 이 책은 알고리즘과 자료구조에 대한 좋은 리뷰를 갖고 있지만, 좋은 코드를 작성하는 방법을 알려주지는 않는다. 당신은 어지간한 문제는 효율적으로 코드를 구현할 수 있어야 한다.
    • Yegge 말을 인용: "만약 당신이 인터뷰를 받기를 원한다면, 이 책에 대해 당신의 방법대로 진행이 완료될 때까지 지원서 내는 것을 조금 뒤로 미루는 것도 고민해보라. "
    • 좋은 가격으로 Half.com 에서 살수 있다.
    • 저자 이름을 따서 CLR 또는 CLRS 라 불린다.(Stein 이란 사람이 늦게 합류해서 CLR 로도 불린다는..)
    • 번역판
  • Programming Pearls

    • 첫 몇 챕터는 프로그래밍 문제에 대해 훌륭한 해결책을 보여주지만, 이것은 단지 소개정도일 뿐이다. 이 책은 프로그램의 디자인 및 설계에 대한 것이고 "Code complete" 보다 짧은 버전이다.
  • "Algorithms and Programming: Problems and Solutions" by Shen

    • A fine book, but after working through problems on several pages I got frustrated with the Pascal, do while loops, 1-indexed arrays, and unclear post-condition satisfaction results.
    • 다른 책이나 온라인 코딩 문제를 다루어 보는 것이 더 좋을 것 같다.

시작하기 전에

이 리스트들은 많은 달들이 지난, out-dated 된 내용 일 수 있다.

여기에 내가 한 실수들이 있다, 그로인해 당신이 더 나은 경험을 하길 바란다. (번역자) 한글로 된 비슷한 자료나 참고가 있으면 링크를 남기도록 하겠다.

1. 아마 다 기억할 수 없을 꺼야..

나는 많은 시간을 들여 영상을 보면서 노트도 했지만 몇개월 뒤에는 기억이 잘 안났어. 나는 3일을 소비해서 나의 노트와 flash card를 이용해서 다시 확인 했어.

이걸 꼭 읽어봐야에 나중에 내가 한 실수를 하지 않으려면: Retaining Computer Science Knowledge

2. Flashcard 를 이용하자.

기억이 안나는 문제를 해결하고자, 나는 작은 flashcard 사이트를 활용했다. 2가지 타입이 있는데, 일반적인 것과 코드를 구분해서 만들었고 각각은 서로 다른 포멧으로 만들어 졌다.

나는 처음 주로 이용한 것은 모바일 우선의 웹사이를 사용했다, 언제 어디서나 폰이나 타블릿으로 확인 할 수 있기 때문이다.

무료로 만들어 보자:

Flashcard 를 위한 조언: 처음에는 당신이 답을 충분히 인지 하겠지만, 이것을 안다고 확인(mark) 하지 말자. 당신은 같은 카드를 진짜(?) 알기 전까지 보고 또보자. 반복하는 것은 당신의 뇌의 깊은 곳에 지식으로 남게 해줄것이다.

다른 방법으로는 내가 사용하는 flashcard 사이트인 Anki 를 사용하는 것이다. 이걸 사용하므로써 반복하게 되고 기억에 오래 남도록 도와 줄 것이다. 그것은 user-friendly 하고, cloud 를 통해 동기화 되며 모든 플랫폼서 사용가능 하다. iOS 에서는 25 $ 이지만 다른 플랫폼에서는 무료다.

나의 anki 를 위한 flashcard data 포멧: https://ankiweb.net/shared/info/25173560 (thanks @xiewenya)

3. 리뷰, 리뷰, 또 리뷰

나는 ASCII, OSI 스택, Big-O 표기법 등에 대한 치트 시트를 가지고, 남는 시간에 그것들을 공부했다.

프로그래밍 문제를 풀다가 쉬는 30분에 flashcard 를 읽고 또 읽었다.

4. 집중

너의 값진 시간을 방해하는 요소들이 많이 있다. 집중하고 또 집중하자.

여기서 다루지 않는 것들

여기에 있는 많은 리스트된 것들은 구글 인터뷰 코칭 노트에서 나온 개인적인 to-do 리스트이다. 이것은 일반적인 내용을 담고 있으며, 아래 언급한 것은 다루지 않는다.:

  • SQL
  • Javascript
  • HTML, CSS, 그리고 다른 프론트엔드 기술.

일일 계획

어떤 주제는 하루에 끝낼수 있고, 어떤 것들은 몇 일이 걸릴 수도 있다. 어떤 것들은 어떤 구현도 없는 내용이 있을 수도 있다.

매일 나는 아래의 리스트에서 하나를 선택해서 관련 주제의 영상을 보고 관련된 내용을 구현했다.:

  • C - 함수의 인자로 struct * 를 넘겨 구현해노는 연습.
  • C++ - 빌트인 type 을 사용하지 않고 구현
  • C++ - 빌트인(built-in) type 을 사용하기(예, STL 의 std::list)
  • Python - using built-in types (to keep practicing Python)
  • 파이썬 - 빌트인 type 사용(지속적인 연습을 위해)
  • 그리고 내가 제대로 구현했는지 확인하기 위해 test 를 작성하기. 대로는 간단히 assert 문을 사용한다.
  • 당신은 JAVA 나 다른 언어를 사용할 수 있습니다. 위의 내용은 제가 했던 내용입니다.

당신은 위의 모든 언어를 연습할 필요가 없습니다. 하나만 선택하세요. 인터뷰를 위한 언어 선택.

왜 이 모든 것들이 코드를 만드는 것인가?

  • 지칠 때 까지, 연습, 연습, 또 연습하라. 그리고 문제 없이 진행 할 수 있도록 하라. (어떤 문제는 많은 Edge cases 들이 있으니 기억 할 수 있도록 기록 해두자.) /번역하면서 정확하게 "raw constraints" 에 대한 내용을 모르겠다./
  • Work within the raw constraints (allocating/freeing memory without help of garbage collection (except Python))
  • 가비지 컬렉션(garbage collection)과 같은 도움없이 메모리 할당/해제와 같은 것을 연습해보자.(파이썬은 제외)
  • 빌트인 type 들을 사용하는 연습을 많이 하자(실제로는 내가 구현한 연결 리스트를 제품 만드는데는 사용하지 않을꺼니까.)

나는 모든 주제에 대해 연습할 시간이 없었지만, 시도 해볼 것이다.

아래 github page 에 내가 작성한 코드들을 올려놓았다:

당신은 모든 알고리즘의 내용을 기억할 필요는 없다.

코드를 컴퓨터가 아닌 종이나 화이트 보드로 연습해보자. 샘플로 주어진 입력 값으로 테스트 해보자. 그다음에 컴퓨터로 코드를 만들어 테스트 하는 연습을 하는 것이다.

선행 지식

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

자료 구조

  • 배열

    • 자동으로 vector 의 크기조정(resizing)을 해주는 과정을 구현해보자.
    • 설명:
    • vector 구현 (자동 크기 조정을 통한 변하기 쉬운 배열):
      • 배열과 포인터를 사용해서 코딩 연습하고 숫자로 인텍싱하지 말고 포인터를 통해 접근 및 계산하도록 하자.
      • 할당된 메모리를 갖고 새로운 raw 데이터 배열
        • can allocate int array under the hood, just not use its features
        • start with 16, or if starting number is greater, use power of 2 - 16, 32, 64, 128
        • 아마 내부 feature 를 사용하지 않고 int array의 메모리를 할당 받아서 사용 할 수 있도록 하는 것일 텐데, 정확한 해석이 불가하여 원문을 남긴다.
      • size() - 배열의 크기를 반환
      • capacity() - vector 가 추가 공간 할당 없이 가질 수 있는 공간
      • is_empty() - 비어있는지 아닌지
      • at(index) - 주어진 index 의 값을 반환, 최대 인텍스를 넘어가면 안됨.
      • push(item) - vector 에 하나 추가
      • insert(index, item) - vector 에 아이템을 하나 추가하는데, index 로 들어온 곳에 추가 한다. index 이후의 데이터는 하나씩 오른쪽 쉬프트가 되어야 함.
      • prepend(item) - 인덱스 0 에 아이템 추가
      • pop() - 마지막에 있는 요소 제거함과 값을 반환
      • delete(index) - index 에 위치하는 요소 제거 및 모든 요소들은 왼쪽으로 쉬프트 되어야 함.
      • remove(item) - 값으로 요소를 찾아서 vector 에서 제거, 또한 같은 값의 여러 요소들이 제거 될 수 있다.
      • find(item) - 요소의 값으로 최초 일치하는 요소의 인덱스를 반환, 만약에 같은 요소가 없다면 -1을 반환
      • resize(new_capacity) // private 함수
        • 만약 vector 가 capacity() 를 넘어서면, 크기를 두배로 늘린다.
        • 요소들을 pop으로 빼내다가, 갖고 있는 요소의 개수가 capacity 의 1/4 이 되면, 크기를 반으로 재조정 한다.
    • 시간 복잡도
      • O(1) to add/remove at end (amortized for allocations for more space), index, or update 인텍스나 맨 마지막에 추가/삭제
      • O(n) : 어디에 위치하든 추가/삭제
    • 공간 복잡도
      • contiguous in memory, so proximity helps performance
      • 연속적인 메모리 공간은 성능에 좋게 작용?
      • space needed = (array capacity, which is >= n) * size of item, but even if 2n, still O(n)
  • 연결 리스트

    • 설명:
    • C 코드 (영상) - 전체 영상은 아니고, 노드 구조체와 메모리 할당 관련해서만 알려줌
    • 연결 리스트 vs 배열:
    • 연결 리스트를 피해야 하는 이유 (영상)
    • Gotcha: pointer to pointer 지식이 있어야 한다: (포인터를 함수에 인자로 넘길때 포인터의 포인팅을 변경할 수 있어야 한다. 즉, 포인터가 가리키는 값 뿐만 아니라 포이터 자체의 address 변경이 가능해야 할 것이다.) 아래의 링크는 단순이 pointer to pointer 에 대한 파악을 위한 것이다. 포인터에 대한 간략한 내용이니 확인 해보도록 하자.
    • 구현 (나는 tail pointer 를 사용/사용하지 않음 둘다 구현함):
      • size() - 리스트에 있는 요소의 개수를 반환
      • empty() - 리스트가 비어 있으면 true 반환 아니면 false
      • value_at(index) - n번째 아이템의 값을 반환 (리스트의 인텍스는 0 부터 시작함.)
      • push_front(value) - 리스트의 맨 앞에 아이템 하나 추가
      • pop_front() - 맨 앞의 아이템 제거 및 그 아이템의 값을 반환
      • push_back(value) - 리스트의 맨 앞에 아이템 추가
      • pop_back() - 리스트의 맨 뒤의 아이템 제거 및 값 반환
      • front() - 리스트 맨 앞 아이템의 값 반환
      • back() - 리스트의 맨 뒤 아이템의 값 반환get value of end item
      • insert(index, value) - 주어진 index 의 위치에 값을 추가하기, 그래서 현재 그 인텍스의 아이템은 새로 추가된 아이템의 포인터에 의해 접근 된다.
      • erase(index) - 주어진 인덱스에 있는 노드 삭제
      • value_n_from_end(n) - 맨 뒤에서 n 번째에 있는 노드의 값을 반환 한다.
      • reverse() - 리스트의 순서 뒤집기
      • remove_value(value) - 주어진 value 를 처음 찾은 인텍스의 아이템 삭제
    • 이중 연결 리스트
  • 스택

    • 큐 / First-In First-Out(영상)
    • 큐 (video)
    • 원형 큐/First-In First-Out
    • 우선순위 큐 (영상)
    • 연결 리스트를 이용하여 구현하자(tail 포인터 사용):
      • enqueue(value) - tail 포인터가 가리키고 있는 위치에 값 넣기
      • dequeue() - 값을 반환하고 맨 앞의 추가된지 가장 오래된 아이템 삭제 (front)
      • empty() - 비어있는지 확인, 비어있으면 true 반환
    • 고정 크기 배열로 구현:
      • enqueue(value) - 가용한 공간의 맨 마지막에 값을 추가
      • dequeue() - 가장 추가된지 오래된 요소의 값을 반환 하고 삭제
      • empty() - 비어 있는지 확인
      • full() - 가용한 공간에 요소들이 가득차 있는지 확인.
    • 복잡도:
      • a bad implementation using linked list where you enqueue at head and dequeue at tail would be O(n)
      • enqueue 를 head 포인터가 있는 곳에 하고, dequeue를 tail 이 가르키는 곳으로 하는 나쁜(?) 구현으로 하면 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])
      • dequeue: O(1) (linked list and array)
      • empty: O(1) (linked list and array)
  • 해쉬 테이블

추가 자료 구조

트리 - Tree

정렬

만약 당신이 이 주제에 대해 더 자세히 알고 싶다면 Additional Detail on Some Subjects 에서 정렬 부분을 참조.

그래프

그래프는 컴퓨터 과학에서 많은 문제들을 표현할 수 있다. 그래서 그래프 섹션은 좀 많다.

당신이 그래프 연습을 조금더 할 고 싶다면, 문서의 Skiena "책" 섹션을 참조해서 보도록 하자

더 많은 지식


시스템 설계, 확장, 자료 처리 (System Design, Scalability, Data Handling)


마지막 리뷰

이 섹션은 중요한 컨셉에 대해 빠르게 리뷰하기 위한 짧은 영상들로 구성했다.
이것은 당신이 지식을 상기 시키는데 아주 훌륭하다.

코딩 문제 연습

이제 당신은 컴퓨터 과학 주제를 위에서 모두 살펴보았다, 이제는 코딩 문제에 답변하기 위해 연습해야 한다.

코딩 문제연습은 문제를 프로그래밍을 위해 외어야 하는 것들은 없다. 연습을 많이 하란 얘긴듯

왜 당신은 프로래밍 문제를 풀기 위해 연습이 필요한가:

  • 문제 인지(recognition), 그리고 알맞은 자료 구조 및 알고리즘을 찾아야 함
  • 문제로 부터 요구사항을 모아야함
  • 인터뷰를 받는 것을 대비해서 니가 어떻게 풀것인지 말해보자
  • 코딩을 컴퓨터가 아닌 화이트 보드나 종이에 해보자
  • 너의 코드에 대한 시간/공간 복잡도를 생각해보자
  • 테스트

이것을 위해 훌륭한 진입방법을 알려줄 사이트를 소개한다. 물론, 관련 책들을 봐도 무방하지만, 내가 찾은 사이트는 정말 대단하다.: Algorithm design canvas

코딩 인터뷰 연습을 위한 나만의 프로세스

집에 화이트 보드가 없다고? 그럴수도 있다. 나는 이상한 사람이라 큰 화이트 보드가 있다. 화이트보드 대신, 미술용품점에서 큰 드로잉 패드를 사자. 그러면 당신은 소파에 앉아 연습을 할 수 있다. 이것은 나의 "소파 화이트 보드"이다. 나는 사진에 펜도 같이 넣었다. 당신이 펜을 사용하면, 또한 지울수도 있다. 그러면 빨리 지저분해진다.

나의 소파 화이트 보다

보충:

프로그래밍 문제를 읽고 풀어보자(순서대로):

위의 책 리스트

코딩 연습/도전

일단, 당신의 두뇌를 배우게 했다면, 그 두뇌를 일하게 하세요. 코딩 문제를 당신이 할 수 있는 한 많이 해보세요

문제 제공 사이트:

아마도:

일단 당신이 인터뷰에 가까이 갔다.

이력서

인터뷰가 다가올 때쯤 생각해볼 만한 것들

당신이 받을 20가지 인터뷰 문제를 생각해보자. 각각 2-3개의 답변을 준비하자. 당신이 성취한 것에 대한 내용을 스토리로 만들자.

  • Why do you want this job? 왜 이 일을 원하는가?
  • What's a tough problem you've solved? 당신이 해결한 어려운 문제는?
  • Biggest challenges faced? 당면한 문제중 가장 도전적인 것들?
  • Best/worst designs seen? 당신이 본 최고/최악 설계
  • Ideas for improving an existing Google product. 현존하는 구글 제품중 향상시킬 만한 아이디어
  • How do you work best, as an individual and as part of a team? 개인으로 또는 팀의 구성원으로 어떻게 최선을 다했나?
  • Which of your skills or experiences would be assets in the role and why? 당신의 기술이나 경험 중 어느 것이 그 역할에 자산이 될 것이며 그 이유는 무엇입니까?
  • What did you most enjoy at [job x / project y]? 일이나 프로젝트 중 가장 재미있게 했던 것은?
  • What was the biggest challenge you faced at [job x / project y]? 가장 도전적인 것?
  • What was the hardest bug you faced at [job x / project y]? 당면한 버그 중 가장 어려웠던 것?
  • What did you learn at [job x / project y]? 그 프로젝트로 부터 무엇을 배웠나
  • What would you have done better at [job x / project y]? 그 프로젝트에서 무엇을 더 잘할 수 있었나?

Have questions for the interviewer (번역안함.)

Some of mine (I already may know answer to but want their opinion or team perspective):
  • How large is your team?
  • What does your dev cycle look like? Do you do waterfall/sprints/agile?
  • Are rushes to deadlines common? Or is there flexibility?
  • How are decisions made in your team?
  • How many meetings do you have per week?
  • Do you feel your work environment helps you concentrate?
  • What are you working on?
  • What do you like about it?
  • What is the work life like?

Once You've Got The Job

Congratulations! 축하합니다.

Keep learning. 계속 배우세요

You're never really done. 여기서 끝내면 안됩니다.


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

추가적인 것들은 아래에 있습니다. 이것은 저의 단순 추천입니다. 이것들을 공부하면, CS 개념에 대해 더 많은 것을
배우게 되고 다른 소프트웨어 엔지니어링 개발 일을 얻을 수 있을 겁니다.
당신은 훨씬 더 균형 잡힌 소프트웨어 엔지니어가 될 것입니다.

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

추가적인 책

추가적인 배움

--

또다른 주제에 대한 상세

나는 특정 주제에 대해 조금더 상세히 설명하려고 한다. 하지만, 이것들을 원치 않는다면, 포함하지 않아도 된다. (너무 많거든)

영상 시리즈

앉아서 그냥 즐겨. "넷플릭스와 기술" :P

컴퓨터 과학