Cracking the Coding Interview, 189 Programming Questions & Solutions, Grale Laakmann McDowell

인터뷰에서 성공하기 위해서는 인터뷰 자체가 시작되기 훨씬 전에 시작되어야 합니다. 사실, 몇 년 전에 시작되어야 합니다. 다음 타임라인은 각 단계에서 생각해야 할 내용을 개요로 제시합니다. 이 프로세스를 시작하는 경우 걱정하지 마세요. 할 수 있는 만큼 “따라잡기”하고, 그런 다음 준비에 집중하세요. 행운을 빕니다!

Getting the Right Experience

훌륭한 이력서가 없다면 인터뷰가 이뤄지지 않습니다. 그리고 훌륭한 경험이 없다면 훌륭한 이력서도 없습니다. 따라서 인터뷰를 받기 위한 첫 번째 단계는 훌륭한 경험을 얻는 것입니다. 얼마나 미리 생각하느냐에 따라 더 좋습니다.

현재 학생인 경우 다음과 같은 점을 고려해야 합니다: • 큰 프로젝트 수업 듣기: 큰 코딩 프로젝트가 있는 수업을 찾아보세요. 이것은 공식적인 직장 경험이 없는 상태에서 어느 정도의 실제 경험을 얻는 좋은 방법입니다. 프로젝트가 실제 세계와 관련성이 높을수록 더 좋습니다. • 인턴십 경험 얻기: 학교에서 초기에 인턴십을 얻기 위해 최선을 다하세요. 이것은 졸업 전에 더 나은 인턴십을 얻는 길을 열어줄 것입니다. 많은 최고의 기술 회사들은 초년생과 2학년생을 위한 인턴십 프로그램을 가지고 있습니다. 스타트업도 고려해볼 수 있습니다. • 뭔가를 시작하기: 여가 시간에 프로젝트를 직접 만들거나 해커톤에 참여하거나 오픈 소스 프로젝트에 기여하세요. 무엇을 만드느냐는 그다지 중요하지 않습니다. 중요한 것은 코딩을 하는 것입니다. 이것은 기술적 기술과 실제 경험을 발전시키고 여러분의 주도성이 회사에 미치는 인상을 남길 것입니다.

전문가들은 이미 꿈의 회사로 전환하기에 적절한 경험을 가지고 있을 수 있습니다. 예를 들어, Google에서 개발자로 일하고 있다면 Facebook으로 전환하기에 충분한 경험이 이미 있을 것입니다. 그러나 덜 알려진 회사에서 큰 회사 중 하나로 이동하려고 하거나 테스트/IT에서 개발자로 전환하려는 경우 다음 조언이 유용할 것입니다: • 코딩 중심의 업무 책임 증가: 퇴사할 생각을 상사에게 알리지 않고도 더 큰 코딩 과제를 맡고자 하는 열망을 얘기할 수 있습니다. 가능한 한 이러한 프로젝트가 “실질적”이며 관련 기술을 사용하며 이력서에 몇 가지 항목으로 나타낼 수 있도록 노력하세요. 이러한 코딩 프로젝트가 이력서의 주요 부분을 형성할 것입니다. • 밤과 주말 활용: 여유 시간이 있다면 모바일 앱, 웹 앱 또는 데스크톱 소프트웨어를 개발하는 데 활용하세요. 이러한 프로젝트 작업은 새로운 기술에 대한 경험을 쌓는 좋은 방법이기도 하며, “즐거움으로만 만든 것”인 후보자가 인터뷰어에게 매우 인상적입니다. 이 프로젝트 작업은 반드시 이력서에 기재되어야 합니다.

이 모든 것은 회사가 보고 싶어하는 두 가지 큰 것으로 결국 이어집니다: 여러분이 똑똑하다는 것과 코딩할 수 있다는 것을 보여준다면 인터뷰를 통과할 수 있을 것입니다. 또한 미리 경력이 어느 방향으로 나아갈지 생각해야 합니다. 나중에 관리직으로 전환하려면 현재 개발자 포지션을 찾고 있더라도 지금은 리더십 경험을 개발하는 방법을 찾아야 합니다.

Writing a Great Resume

이력서 스크리너들은 면접관들이 찾는 것과 동일한 사항을 찾습니다. 여러분이 똑똑하고 코딩할 수 있는지 알고 싶어합니다. 따라서 이 두 가지를 강조할 수 있도록 이력서를 준비해야 합니다. 테니스, 여행, 마술 카드와 같은 비기술적인 취미는 이것을 보여주는 데 큰 도움이 되지 않을 것입니다. 비기술적인 취미를 위해 기술적인 항목을 더 줄이지 않기 전에 두 번 생각해보세요.

Appropriate Resume Length

미국에서는 경력이 10년 미만인 경우 이력서를 1 페이지로 유지하는 것이 강력히 권장됩니다. 더 많은 경험을 가진 지원자는 종종 1.5~2 페이지로 정당화할 수 있습니다. 긴 이력서에 대해 두 번 생각해보세요. 더 짧은 이력서가 종종 더 인상적일 수 있습니다.

• 채용 담당자는 이력서를 보는 데 일정한 시간(약 10초)을 소비합니다. 가장 인상적인 항목으로 내용을 제한하면 채용 담당자가 그 항목을 확실히 볼 것입니다. 추가 항목을 추가하면 채용 담당자가 실제로 보고 싶은 내용에서 주의를 분산시킬 수 있습니다. • 일부 사람들은 단순히 긴 이력서를 읽지 않기로 결정합니다. 이러한 이유로 이력서가 폐기되는 위험을 정말 감수하고 싶습니까?

지금 당장 경험이 많아서 모든 내용을 1 또는 2 페이지에 넣을 수 없다고 생각하고 있다면, 신뢰하세요. 긴 이력서는 많은 경험을 가지고 있다는 것을 반영하는 것이 아니라 내용을 어떻게 우선순위로 두느냐에 대한 이해가 부족한 것입니다.

Employment History

이력서는 모든 경력을 자세히 기술할 필요가 없으며, 관련 있는 포지션만 포함해야 합니다. 당신을 더 인상적인 후보로 만드는 포지션만을 포함하세요.

각 경력에 대해 다음과 같은 접근 방식으로 성과를 논의해보세요: “Y를 구현하여 X를 달성하였으며, 이로 인해 Z를 얻었습니다.” 다음은 예입니다:

• “분산 캐싱을 구현하여 객체 렌더링 시간을 75% 감소시켰으며, 로그인 시간을 10% 감소시켰습니다.”

다른 용어로 표현한 다른 예도 있습니다:

• “windiff를 기반으로 한 새로운 비교 알고리즘을 구현하여 평균 일치 정확도를 1.2에서 1.5로 증가시켰습니다.”

이러한 접근 방식에 모든 작업을 맞출 필요는 없지만, 원칙은 동일합니다. 당신이 무엇을 했는지, 어떻게 했는지, 결과가 무엇인지 보여주십시오. 가능하면 결과를 어떤 식으로든 “측정 가능”하게 만들려고 노력해야 합니다.

Projects

이력서의 프로젝트 섹션을 개발하는 것은 종종 더 경험이 풍부한 사람으로 자신을 표현하는 가장 좋은 방법입니다. 특히 대학생이나 최근 졸업생의 경우에는 더 그렇습니다.

프로젝트는 가장 중요한 2 ~ 4개의 프로젝트를 포함해야 합니다. 프로젝트가 무엇이었는지와 사용된 언어나 기술을 명시하십시오. 프로젝트가 개인 프로젝트인지 팀 프로젝트인지, 그리고 수업에서 완료된 것인지 독립적으로 완료된 것인지와 같은 세부 정보를 포함할 수도 있습니다. 이러한 세부 정보는 필수 사항이 아니므로 더 나아보이게 하기 위해 필요한 경우에만 포함하십시오. 일반적으로 독립 프로젝트는 수업 프로젝트보다 우대됩니다. 왜냐하면 이는 개인적으로 무엇을 시도했음을 나타내기 때문입니다.

너무 많은 프로젝트를 추가하지 마십시오. 많은 후보자들이 모든 이전 프로젝트 13개를 추가하는 실수를 하여 작고 인상적이지 않은 프로젝트로 이력서를 혼란스럽게 만듭니다.

그렇다면 무엇을 만들어야 할까요? 솔직히, 그렇게 중요하지 않습니다. 일부 고용주는 오픈 소스 프로젝트를 좋아합니다 (큰 코드베이스에 기여하는 경험을 제공합니다), 다른 사람들은 독립 프로젝트를 선호합니다 (개인적인 기여를 이해하기가 더 쉽습니다). 모바일 앱, 웹 앱 또는 거의 모든 것을 만들 수 있습니다. 가장 중요한 것은 무언가를 만들고 있는 것입니다.

Programming Languages and Software

Software

이력서에 나열하는 소프트웨어에 대해 보수적으로 생각하고 회사에 적합한 것을 이해하세요. Microsoft Office와 같은 소프트웨어는 거의 항상 삭제할 수 있습니다. Visual Studio 및 Eclipse와 같은 기술적 소프트웨어는 다소 관련성이 있지만, 최고의 기술 회사 중 많은 회사들은 심지어 그것에 대해서도 신경 쓰지 않을 것입니다. 결국, Visual Studio를 배우는 것은 정말로 어려운 일일까요?

물론 이 모든 소프트웨어를 나열하는 것은 해로울 것이 없습니다. 그러나 이는 귀중한 공간을 차지합니다. 이를 고려하고 트레이드 오프를 평가해야 합니다.

Languages

모든 사용한 것을 나열해야 할까요, 아니면 가장 편안한 것만 나열해야 할까요? 모든 것을 나열하는 것은 위험합니다. 많은 면접관은 이력서에 나열된 모든 내용을 면접에서 “공정한 게임”으로 여깁니다. 다른 대안은 사용한 언어의 대부분을 나열하되 경험 수준을 추가하는 것입니다. 아래에 이러한 접근법이 나와 있습니다. • 언어: Java (전문가), C++ (숙련), JavaScript (이전 경험). (‘전문가’, ‘유창’ 등으로 표현하는 것과 효과적으로 기술 세트를 전달하도록 사용하세요.

몇몇 사람들은 특정 언어의 경험 년 수를 나열하기도 하지만, 이것은 혼란스러울 수 있습니다. 예를 들어 Java를 처음 배운 지 10년이 지났고 그 동안 가끔 사용했다면 이 경험은 몇 년의 경험이 되는 것일까요? 이러한 이유로 경험 년 수는 이력서에 대한 좋지 않은 지표입니다. 평범한 영어로 무엇을 의미하는지 간단하게 설명하는 것이 더 나은 방법입니다.

Advice for Non-Native English Speakers and Internationals

일부 회사는 오타 때문에 이력서를 버릴 수 있습니다. 이력서를 최소한 한 명의 영어 원어민 스피커에게 교정해달라고 부탁하세요. 미국 직장에 지원할 때, 나이, 결혼 여부, 국적을 포함하지 마세요. 이러한 종류의 개인 정보는 회사에 법적 책임을 초래하므로 회사에서는 환영받지 않습니다.

Beware of (Potential) Stigma

특정 언어에는 그 언어 자체에 대한 편견이 있을 수 있습니다. 때로는 언어 자체 때문이지만, 종종 그 언어를 사용하는 장소 때문입니다. 이 편견을 방어하는 것이 아니라 알려드리는 것이니 참고하시기 바랍니다.

일부 주의해야 할 편견은 다음과 같습니다:

엔터프라이즈 언어: 특정 언어는 편견이 있으며, 그 중 많은 언어가 엔터프라이즈 개발에 사용됩니다. Visual Basic이 좋은 예입니다. VB에 대한 전문 지식을 나타내면 사람들은 여러분이 기술적으로 덜 뛰어나다고 가정할 수 있습니다. 이와 같은 사람들은 대부분 VB.NET이 실제로는 완전히 복잡한 응용 프로그램을 개발할 수 있는 능력이 있다고 인정합니다. 그러나 여전히 VB로 개발하는 응용 프로그램은 그다지 복잡하지 않습니다. 대형 실리콘 밸리 기업에서는 VB를 사용하지 않을 것입니다. .NET 플랫폼 전반에도 (약하지만) 동일한 주장이 적용됩니다. 주요 관심사가 .NET이며 .NET 역할에 지원하지 않는 경우, 기술적으로 강력하다는 것을 보여주기 위해 더 많은 노력을 기울여야 합니다.

언어에 너무 집착하기: 일부 최고 기술 기업의 인력 엔터티는 자신의 이력서에 Java의 모든 버전을 나열하는 이력서를 볼 때 후보자의 능력에 부정적인 가정을 합니다. 많은 곳에서 최고의 소프트웨어 엔지니어는 특정 언어를 중심으로 정의하지 않는다는 믿음이 있습니다. 따라서 후보자가 특정 언어 버전을 자세히 알고 있다고 보이면, 그 후보자를 “우리 타입이 아닌 사람”으로 분류하는 경우가 많습니다. 그러나 이것은 꼭 이력서에서 “언어 자랑”을 제거해야 한다는 것을 의미하지는 않습니다. 그 회사가 어떤 가치를 중요시하는지 이해해야 합니다. 일부 회사는 이를 중요하게 여깁니다.

자격증: 소프트웨어 엔지니어 자격증은 긍정적인 평가, 중립적인 평가 또는 부정적인 평가로 다양할 수 있습니다. 이것은 언어에 너무 집중하는 것과 관련이 있습니다. 언어 목록이 긴 후보자에 대한 편견을 가진 회사들은 자격증에 대해서도 부정적인 태도일 가능성이 높습니다. 이 경우 이력서에서 이러한 경험을 제거하는 것이 좋습니다.

하나 또는 두 가지 언어만 알고 있는 경우: 코딩에 투자한 시간이 많을수록 만든 것이 많을수록 다양한 언어와 작업하게 될 가능성이 높습니다. 따라서 하나 또는 두 가지 언어만 아는 이력서를 보면 후보자가 많은 문제를 경험하지 않았다고 가정합니다. 또한 후보자가 하나 또는 두 가지 언어만 알고 있다면 새로운 기술을 배우기 어려울 것이라고 걱정하거나 특정 기술과 너무 묶여있을 것으로 생각합니다. 따라서 가능한 경우 다양성을 실제로 확보하려고 노력하십시오. {Python, Ruby 및 JavaScript} 집합과 같은 언어 집합은 서로 다소 유사합니다. 보다 다른 언어를 배울 수 있는 경우 (예: Python, C++, Java)가 더 나은 것입니다.

Preparation Map

아래 지도는 면접 준비 과정을 어떻게 다룰지에 대한 아이디어를 제공해줄 것입니다. 여기서 주요 포인트 중 하나는 면접 문제만 고려하는 것이 아니라 프로젝트를 수행하고 코드를 작성하는 것입니다!

Map1

Map2