Skip to content

Latest commit

 

History

History
2020 lines (1683 loc) · 142 KB

File metadata and controls

2020 lines (1683 loc) · 142 KB

코딩 면접 대학(Coding Interview University)

이 글은 원래 제가 소프트웨어 엔지니어가 되기 위해 정리한 짧은 주제들이었습니다. 그러나 지금은 보다시피 주제들이 굉장히 많아졌습니다. 아래 내용을 모두 습득한 후, 저는 아마존에 소프트웨어 엔지니어로 채용되었습니다! 여러분은 아마 아래 글들을 모두 다 공부할 없을 겁니다. 아무튼 여러분에게 필요한 모든 것은 여기에 있습니다.

몇 달 동안 저는 하루에 8-12시간 정도 공부했습니다. 다음 글에는 제 이야기를 적어놓았습니다. Google 면접을 위해 8개월 동안 풀 타임으로 공부한 이유

반드시 읽어주세요: 다시 한번 말하지만, 여러분은 여기에 있는 글들을 모두 알 필요는 없습니다. 저는 제가 알지 않아도 될 것에 많은 시간을 뺏겼습니다. 여러분의 귀중한 시간을 잃지 않게 해당 파트에 더 자세하게 적어놓겠습니다.

여기에 정리된 글들은 아마존, 페이스북, 구글, 마이크로소프트 같은 거대 기업을 포함한 거의 모든 소프트웨어 회사의 면접을 준비하는 데에 도움이 될 것입니다.

행운을 빕니다!

완료된 번역:
진행 중인 번역:

Become a sponsor and support Coding Interview University!

Special thanks to:

Gitpod

Dev environments built for the cloud

Natively integrated with GitLab, GitHub, and Bitbucket, Gitpod automatically and continuously prebuilds dev environments for all your branches. As a result team members can instantly start coding with fresh dev environments for each new task - no matter if you are building a new feature, want to fix a bug, or work on a code review.


이건 대체 뭐하는 건가요?

Coding at the whiteboard - from HBO's Silicon Valley

이 글은 저의 대기업의 소프트웨어 엔지니어가 되기 위한 여러 달에 걸친 공부계획을 적어놓은 것입니다.

필요한 것:

  • 조금이라도 코딩을 해본 경험 (변수, 반복문, 메서드/함수 등등)
  • 인내심
  • 시간

주의) 이 글은 소프트웨어 엔지니어가 되기 위한 계획이지 웹 개발을 배우기 위한 것이 아닙니다.구글, 아마존, 페이스북 그리고 마이크로소프트 같은 대기업은 소프트웨어 엔지니어링이랑 웹 개발을 서로 다른 것으로 봅니다. 예를 들어, 아마존에는 프론트엔드 엔지니어와 소프트웨어 개발 엔지니어가 있습니다. 이 두 역할은 서로 나뉘어져있으므로 면접 역시 같게 보진 않을 것이고, 갖추어야할 역량 역시 다릅니다. 위의 회사들은 소프트웨어 개발자/엔지니어 역할에 좀 더 전문적인 컴퓨터 과학 지식을 요구합니다.


목차

공부 계획

공부 주제

구직 & 취업하기

---------------- 이 아래로는 전부 선택사항입니다 ----------------


이걸 왜 해야하죠?

대기업에서 소프트웨어 엔지니어로 일하기 위해서는 알아야 할 것들이 많습니다.

만약 여러분이 저처럼 컴퓨터 관련 전공이 아니라면 이 과정은 전공자들을 따라잡으면서도 4년이라는 시간을 절약하게 해줍니다.

제가 이 프로젝트를 시작했을 때, 저는 힙이나 스택, 시간 복잡도, 트리, 그래프 순회 등에 대하여 전혀 아는 바가 없었습니다. 만약 그 때의 제가 정렬 알고리즘을 직접 코딩해야 할 일이 있었다면, 아마 제 코드는 끔찍한 상태였을 겁니다. 제가 사용했던 모든 자료 구조는 이미 언어 안에서 구현되어 있던 것들이고, 저는 그것들이 보이지 않는 곳에서 어떻게 작동하고 있는지 몰랐습니다. 실행 중인 프로세스가 메모리 초과 에러를 메시지를 보내지 않는 이상 메모리를 관리할 필요조차 없었고, 에러가 발생하면 그제야 해결책을 찾곤 했습니다. 또한 저는 몇몇 다차원 배열이나 연관 배열을 사용한 적은 있지만, 자료구조를 완전 밑바닥부터 구현해 본 적은 없었습니다.

매우 긴 과정이고 몇 달이나 걸릴지 모릅니다. 그렇치만 여러분이 이런 분야에 익숙하다면 분명 훨씬 더 적은 시간이 걸릴 겁니다.

어떻게 하면 되나요?

아래에 있는 모든 것들은 대략적인 개요이며 여러분은 위에서 아래 순서대로 차근차근 진행해야 합니다.

이 글은 진행 상황 파악을 위해 목차를 만드는 등 Github 특유의 마크다운을 이용한 방식을 사용하고 있습니다.

새 브랜치를 만들어서 중괄호에 x를 추가하는 식으로 항목을 체크하세요: [x]

브랜치를 포크(fork)하고 아래의 커맨드들을 입력하세요

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

로컬 레포지토리에 클론(clone)하기:

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와 Python이란 2가지의 언어를 주로 썼습니다.

  • C: 굉장히 저급 언어입니다. 포인터와 메모리 할당 및 해제를 직접 다루어서 데이터 구조와 알고리즘을 뼈 속 깊이 새겨둘 수 있게 됩니다. Python이나 Java와 같은 고급 언어들은 이런 걸 알아서 처리하기 때문에 가려져 있습니다. 이는 일상 업무를 할 때에는 아주 훌륭하지만 만약 저급 수준 데이터 구조가 어떻게 짜여져있는지 자체를 배우는 중이라면 c 언어를 사용해 기계와 가까워 지는 것이 더 좋습니다.

    • C 언어는 어디에나 있습니다. 여러분은 공부하는 내내 이 사실을 깨닫게 될겁니다.
    • The C Programming Language, Vol 2
      • 이 책은 짧은 책이지만 여러분이 C 언어를 잘 다루게 만들어주고, 만약 조금씩 연습해본다면 더 빠르게 발전할 겁니다. C 언어를 이해하면 프로그램이 어떻게 돌아가고 메모리가 어떻게 작동하는지 이해하는데 도움을 줍니다.
      • 여러분은 이 책을 깊게 파고들 필요는 없습니다(심지어 다 안 읽으셔도 됩니다). 그저 여러분이 C 언어를 읽고 쓰는 데에 익숙해질 정도면 됩니다.
      • 이 책의 문제에 대한 정답들
  • Python: 현대적이고 굉장히 많은 것들을 할 수 있습니다. 저는 그냥 완전 유용하고 면접 때 써야할 코드를 줄여주기도 해서 배웠습니다.

이건 물론 제 취향일 뿐이고 여러분은 원하시는 걸 하시면 됩니다.

아마 필요없으실 수도 있지만, 새 언어를 배우기 위한 여러 사이트 주소들입니다.

면접을 위해서

면접에서는 여러분이 쓰기에 편한 언어를 사용해도 되지만, 대기업들은 보통 다음과 같은 정해진 언어들을 사용합니다:

  • C++
  • Java
  • Python

아래 언어들을 사용할 수도 있지만 제대로 확인하셔야합니다. 주의사항이 있을 수도 있습니다:

  • JavaScript
  • Ruby

코딩 면접를 위한 언어를 선택하는 것과 관련하여 제가 쓴 글입니다: 코딩 면접을 위한 언어 선택하기 이 글은 제가 기반으로 사용한 원본 글입니다: http://blog.codingforinterviews.com/best-programming-language-jobs/

여러분은 여러분이 선택한 언어에 대해 매우 익숙하고 잘 알아야 합니다.

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

프로그래밍 언어 참고목록

자료구조와 알고리즘에 대한 도서

이 책들은 여러분의 컴퓨터 과학에 대한 기반을 다져줄 책들입니다.

그냥 아무거나 하나 여러분이 편한 언어와 관련된 것으로 선택하세요. 엄청나게 많은 책 읽기와 코딩을 하게 될 겁니다.

C

Python

Java

여러분이 선택하세요:

C++

여러분이 선택하세요:

면접 준비 관련 도서

여러분은 이 책 뭉터기들을 다 살 필요는 없습니다. 솔직하게 말해서 "Cracking the Coding Interview"라는 책 하나면 충분합니다. 하지만 저는 더 준비해보기 위해 많이 사보았습니다. 결국 항상 너무 과했지만 말이죠.

저는 이 책을 둘 다 샀습니다. 굉장히 많은 걸 준비하게 해주었습니다.

만일 당신이 시간이 넘쳐난다면

하나를 선택하세요:

저와 같은 실수는 하지마세요

이 문서는 많은 달에 걸쳐서 추가되고 있고, 맞습니다, 이미 제 손을 떠났습니다.

여기에 제가 저지른 몇 가지 실수들을 적어놓았으니 여러분은 참고하시고 더 나은 방향으로 나아가시길 바랍니다. 물론 몇 달의 시간도 절약하실 겁니다.

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

저는 수 시간의 비디오를 보고 방대한 양의 노트를 작성했지만, 몇 달 뒤에는 대부분의 내용을 기억하지 못했습니다. 저는 3일에 걸쳐 제가 작성한 노트를 보고 flashcard를 제작해서 복습할 수 있게 만들었습니다. 그 많은 지식들까지는 사실 필요 없었습니다.

꼭 읽고 제가 한 실수들을 반복하지 않길 바랍니다:

Retaining Computer Science Knowledge

2. 요약집(Flashcard)을 만들자

이 문제를 해결하기 위해 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.

3. 배우는 동안에 코딩 면접 질문들을 보기

굉장히 중요합니다!

코딩 면접 질문들을 여러분이 데이터 구조와 알고리즘을 배우는 동안에 봐두세요.

한 주제를 공부하고 충분히 익숙해졌다고 느낀다면(예를 들어 그것이 연결 리스트라면):

  1. 코딩 면접 책들이나 더 밑에서 다룰 코딩 문제 사이트들을 준비합니다.
  2. 연결 리스트에 관한 문제를 두세 문제 풀어봅니다.
  3. 다음 배울 주제로 넘어갑니다.
  4. 나중에, 다시 돌아와서 또 다른 두세 문제를 연결 리스트와 관련해서 풀어봅니다.
  5. 이를 새 내용을 배울 때마다 반복합니다.

반드시 여러분이 배우는 동안에 문제를 푸세요, 다 배우고 나서가 아니라.

여러분은 지식 자체가 필요해서 고용되는 것이 아니라 그 지식을 활용하기 위해서 고용되는 것입니다.

이를 위한 엄청나게 많은 자료들이 아래에 있습니다. 계속 합시다.

4. 집중하기

주의를 산만하게 만드는 많은 것들이 우리의 귀중한 시간을 뺏어갑니다. 주의를 집중하는 일은 물론 힘듭니다. 가사 없는 음악을 듣다보면 좀 더 쉽게 집중하실 수 있습니다.

다루지 않을 것

이 기술들은 널리 퍼져 있는 기술이지만, 여기서 다루는 부분은 아닙니다:

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

하루하루의 계획

이 과정에는 엄청나게 많은 주제가 있습니다. 어떤 주제들은 며칠이 걸리거나 심지어 아마 일주일이나 그 이상이 걸릴지도 모릅니다. 여러분의 일정에 달려있습니다.

매일매일, 다음 주제로 넘어가면서, 주제에 관한 동영상들을 보고, 그리고 실제로 선택한 언어의 데이터 구조나 알고리즘을 구현하세요.

여기서 제 코드들을 볼 수 있습니다:

모든 알고리즘을 외울 필요는 없습니다. 그저 그걸 이해하고 나만의 방식으로 구현할 수 있으면 됩니다.

코딩 질문 연습하기

왜 이게 여기 있죠? 전 아직 면접볼 준비가 안되어 있는데요.

그렇다면 이걸 다시 읽어보세요

왜 프로그래밍 문제들을 풀면서 연습히야하는가:

  • 문제 인식, 그리고 어디에 어떤 데이터 구조와 알고리즘을 썼어야했는지 알 수 있음
  • 문제의 요구사항이 뭐였는지 이해할 수 있음
  • 실제 면접처럼 자신만의 방식으로 문제를 설명할 수 있음
  • 컴퓨터가 아니라 화이트보드나 종이에 코딩함
  • 시간과 공간 복잡도를 함께 생각하게 됨(아래의 Big-O를 볼 것)
  • 코드가 맞나 확인하게 됨

면접에서 방법론적인, 양방향 소통인 문제 해결에 대한 훌륭한 소개글이 있습니다. 물론 프로그래밍 면접 책들에서도 배울 수 있겠지만 이 글이 더 미친 수준이라 봅니다: Algorithm design canvas

컴퓨터가 아니라 화이트보드나 종이에 직접 코드를 적어보세요. 그리고 여기에 값들을 넣어보면서 테스트해보세요. 그리고는 컴퓨터에 코드를 치고 테스트해보세요.

만약 화이트보드가 집에 없다면, 문방구에 가서 그림용 공책을 사서 거기서 연습해보세요. 이건 제 "소파 화이트보드"입니다. 크기 비교를 위해 사진에 펜을 추가해봤습니다. 펜을 쓰신다면 몇 분 후 지워지지 않는 펜을 원망하는 자신을 보게 될 겁니다. 엄청 빨리 더러워집니다. 저는 그래서 연필과 지우개를 썼습니다.

제 소파 화이트보드

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

코딩 문제들

여기 있는 코딩 면접 책들을 잊지마세요.

문제 푸는 법들:

코딩 면접 질문 관련 동영상들:

도전 사이트들:

이제 시작해봅시다

네, 잡설은 그만하고, 배워봅시다!

하지만 위의 코딩 문제를 배우는 중에 같이 풀어보는 거 절대 잊지마세요!

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

자료구조

  • 배열

    • 자동 리사이징 벡터 구현하기
    • 설명:
    • 벡터 구현하기 (자동 리사이징을 포함한 동적 배열):
      • 배열, 포인터 및 인덱싱 대신하여 특정 인덱스에 접근하는 포인터 연산을 통한 코딩 연습
      • 메모리 할당을 포함한 새 배열
        • 배열 메소드 등의 기능을 활용하지 않으면서 정수 배열에 메모리를 할당할 수 있어야 함
        • 16으로 시작하거나 시작하는 숫자가 크다면 2의 제곱수(16, 32, 64, 128)로 시작
      • size() - 항목의 개수
      • capacity() - 들어갈 수 있는 항목의 최대 개수
      • is_empty()
      • at(index) - 인덱스에 있는 항목을 돌려주고, 인덱스가 범위 밖이면 에러를 냄
      • push(item)
      • insert(index, item) - index에 item을 삽입하고 기존 인덱스의 값부터 쭉 오른쪽으로 쉬프트
      • prepend(item) - 맨 앞에 원소를 삽입
      • pop() - 마지막 원소를 삭제하고 값을 돌려준다
      • delete(index) - delete item at index, shifting all trailing elements left
      • remove(item) - looks for value and removes index holding it (even if in multiple places)
      • find(item) - looks for value and returns first index with that value, -1 if not found
      • resize(new_capacity) // private 함수
        • 용량이 꽉 차면, 그 두배로 크기를 조정한다.
        • item을 하나 꺼낼 때, 용량이 1/4이라면, 용량을 절반으로 줄인다.
    • 시간 복잡도
      • 접근, 수정, 끝에 추가/삭제하는 데 O(1)
      • 다른 곳에 추가/삭제하는 데 O(n)
    • 공간 복잡도
      • 메모리에 연속적으로 있어서, 근접성이 성능을 향상시킨다.
      • 필요한 공간 = (n 이상인 배열의 용량) * item의 크기, 하지만 2n 크기에서는 여전히 O(n)
  • 링크드 리스트

    • 설명:
    • C Code (video) - 전체 영상은 아니고, 노드 구조와 메모리 할당에 대한 부분입니다.
    • 연결 리스트 vs 배열:
    • 왜 연결 리스트를 기피해야 하는지 (영상)
    • 짚고가기: 이중 포인터에 대한 지식이 필요하다면: (for when you pass a pointer to a function that may change the address where that pointer points) 이 페이지는 포인터가 포인터를 가리키는 것을 파악하는 정도입니다. 저는 아래 목록을 순서대로 읽지 않기를 권장합니다. 가독성과 유지 보수성이 더 좋기 때문입니다.
    • 구현 (저는 tail 포인터가 있는 것과 없는 것 모두 구현했었습니다.):
      • size() - 리스트 안의 데이터 개수를 반환한다.
      • empty() - 리스트가 비어있다면 true를 반환한다.
      • value_at(index) - index번째 위치의 value을 반환한다. (가장 앞은 0부터 시작한다.)
      • push_front(value) - 가장 앞에 value를 추가한다.
      • pop_front() - 가장 앞에 있는 것을 제거하고, 그 value를 반환한다.
      • push_back(value) - 가장 끝에 value을 추가한다.
      • pop_back() - 가장 끝에 있는 것을 제거하고, 그 value를 반환한다.
      • front() - 가장 앞에 있는 것의 value를 가져온다.
      • back() - 가장 끝에 있는 것의 value를 가져온다.
      • insert(index, value) - index번째 위치에 value를 추가한다. 즉, index번째에 새로 추가된 것이 기존의 index번째에 있던 것을 가리킨다.
      • erase(index) - index번째에 있는 노드를 삭제한다.
      • value_n_from_end(n) - 뒤에서부터 n번째에 있는 노드의 value를 반환한다.
      • reverse() - 리스트를 뒤집는다.
      • remove_value(value) - value와 같은 값을 가지는 첫 번째 노드를 제거한다.
    • 이중 연결 리스트
  • 스택

    • Stacks (video)
    • Will not implement. Implementing with array is trivial.
    • Queue (video)
    • Circular buffer/FIFO05_04-priorityQueuesAndDeques.mp4)
    • tail 포인터가 있는 연결 리스트를 사용하여 구현하기:
      • enqueue(value) - tail이 가리키는 곳에 value를 추가한다
      • 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])
      • dequeue: O(1) (linked list and array)
      • empty: O(1) (linked list and array)
  • 해시 테이블

추가 지식

트리

정렬

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

그래프

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

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

더 많은 지식

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


최종 검토

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

코딩 문제 연습

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

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

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

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

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