구글 인터뷰 영상1 - How to Work at Google: Internship & Interview Insights, Software Engineering
요즘 들어가있는 IT 취업 오픈톡에 구글코리아 소프트웨어 엔지니어 공고가 떠서 들어가봄
내 실력으로는 당연히 광탈이겠지만 어떤 사람이 어떻게 구글에 들어가는지 궁금해서 이리저리 서치를 해보다가,
구글 면접 Mock 인터뷰 영상을 시청하게 됐다.
물론 신입대상으로 진행된 세션이지만 지원자 입장에서 궁금해할만한 점들을 잘 설명해주고 있다.
본문 영상 아래는 내용 정리.
코드는 내 주언어인 C#으로 기재했다.
How to Work at Google: Internship & Interview Insights, Software Engineering
내용 정리 (한국어)
기술 면접
면접 구조:
- 짧은 소개로 시작합니다.
- 후보자가 선택한 프로그래밍 언어(C, Java, Python 등)로 기술 평가에 주로 집중합니다.
- 면접이 끝날 때 후보자가 질문할 수 있는 시간이 배정됩니다.
면접관이 찾는 요소:
- 기술적 능력: 코딩 능력, 데이터 구조 및 알고리즘에 대한 지식.
- 분석적 및 문제 해결 능력: 후보자의 사고 과정과 문제 접근 방식을 평가합니다. 솔루션의 정확성뿐만 아니라 문제 해결 전략 및 설계 원칙에 중점을 둡니다.
면접 과정:
- 후보자는 면접 중에 생각을 소리 내어 표현하며 사고 과정을 설명해야 합니다.
- 문제를 완전히 이해하기 위해 명확한 질문을 하는 것이 중요합니다.
개발 경력 준비를 위한 요약
- 소개 참여: 배경에 대해 간략하게 이야기할 준비를 하세요.
- 선호 언어 선택: 기술 평가에 편안하게 사용할 수 있는 언어를 알고 있어야 합니다.
- 문제 해결 강조: 문제에 접근하는 방법에 집중하고, 사고 과정을 명확하게 전달하세요.
- 소통의 명확성 연습: 생각을 언어로 표현하여 분석 능력을 보여주세요.
- 질문 명확화: 문제를 완전히 이해하기 위해 질문하는 것을 주저하지 마세요.
모의 면접: 문제 해결
질문의 명확화:
- 첫 단계는 면접관이 제시한 질문을 명확히 하는 것입니다. 입력, 요구되는 출력, 데이터 구조 및 가정 사항을 이해하는 것이 포함됩니다.
- 후보자는 더 많은 정보를 수집하고 문제를 확실히 이해하기 위해 질문을 해야 합니다.
요구 사항 및 가정 사항 식별:
- 입력이 항상 양의 정수인지 또는 배열의 길이가 고정되어 있는지와 같은 가정을 진술하는 것이 중요합니다.
- 예제를 적어보면 문제를 시각화하고 가정을 검증하는 데 도움이 됩니다.
가능한 접근 방식 논의:
- 후보자는 코딩에 들어가기 전에 가능한 솔루션과 그 복잡성을 개요해야 합니다.
- 처음의 브루트 포스 솔루션(O(n²))과 해시 집합을 사용한 보다 최적화된 솔루션(O(n))을 비교하면서 후보자의 사고 과정과 알고리즘 효율성에 대한 이해를 보여줍니다.
솔루션의 트레이드오프:
- 시간 복잡성과 공간 복잡성 간의 트레이드오프에 대해 논의하는 것이 중요합니다.
- 예를 들어, 해시 집합을 사용하는 솔루션은 추가 공간을 희생하면서 시간을 절약합니다.
선택한 접근 방식 구현:
- 선호하는 접근 방식이 결정되면, 후보자는 코딩하기 전에 방법을 명확히 설명해야 합니다.
- 후보자는 자신의 사고 과정을 소리 내어 표현하며 코딩을 시작할 수 있습니다.
코드 품질 및 구문:
- 완벽한 구문이 최우선이 아니며, 이해하고 논리적으로 소통하는 것이 더 중요합니다.
- 코딩 중 실수를 하여 그것을 잡아내는 것은 비판적 사고를 보여주는 긍정적인 신호로 간주됩니다.
면접관과의 소통:
- 면접관과 지속적으로 소통하는 것이 필수적입니다. 여기에는 채택한 접근 방식, 잠재적 최적화 및 특정 결정 뒤에 있는 이유를 논의하는 것이 포함됩니다.
테스트 및 엣지 케이스:
- 솔루션을 마무리하기 전에 후보자는 엣지 케이스를 고려하고 다양한 테스트 시나리오에 대해 구현을 검증해야 합니다.
실용 예제 1
문제: 정수 배열에서 두 개의 서로 다른 요소가 목표 값 n에 합쳐지는지를 결정하시오. 제안된 솔루션은 다음과 같습니다:
- 브루트 포스 접근법: 각 쌍을 반복(O(n²)).
- 최적화된 접근법: 보완 요소를 확인하기 위해 해시 집합 사용(O(n) 시간, O(n) 공간).
- 정렬 및 이진 탐색 접근법: 배열을 정렬하고 이진 탐색 사용(O(n log n) 시간, O(log n) 공간)도 언급되었으나 구현에는 선택되지 않았습니다.
코드 분석
public bool PairWouldSum(int[] array, int n)
{
// 지금까지 본 요소를 저장할 해시 집합 초기화
HashSet<int> elems = new HashSet<int>();
// 배열의 각 요소를 반복
foreach (int cur in array)
{
// 보완 요소(n - cur)가 해시 집합에 존재하는지 확인
if (elems.Contains(n - cur))
{
return true; // 유효한 쌍 발견
}
// 현재 요소를 해시 집합에 추가
elems.Add(cur);
}
// 쌍을 찾지 못한 경우 false 반환
return false;
}
결론 이 구조적 접근 방식은 문제 해결 능력을 보여줄 뿐만 아니라 면접 과정에서 효과적인 소통 및 적응력을 보여줍니다. 후보자는 코딩 중 사고 과정을 명확히 하고 논의하여 협업적이고 유익한 면접 경험을 만드는 것을 목표로 해야 합니다.
실용 예제 2
질문: 요소를 삽입하고, 값으로 요소를 제거하며, 무작위로 요소를 선택하는 집합과 유사한 데이터 구조를 구현하시오.
명확화 질문: 요구 사항을 명확히 하며, 삽입, 제거 및 무작위 검색 메소드의 필요성에 집중하세요.
데이터 구조 옵션: 리스트와 집합과 같은 대안을 고려하세요. 해시 집합과 배열 리스트의 조합은 세 가지 메소드에 대한 성능을 최적화할 수 있습니다.
- 삽입: 배열 리스트의 끝에 요소 추가.
- 제거: 해시 집합을 사용하여 인덱스에 따라 빠르게 제거.
- 무작위 선택: 배열 리스트에서 무작위 인덱스를 선택하여 효율적으로 검색.
면접 전략 및 일반적인 질문
내장 함수 사용:
- 네, 코딩 면접에서 내장 라이브러리 함수를 사용하는 것은 허용됩니다. 후보자는 이러한 함수가 어떻게 작동하는지 및 그 복잡성을 이해해야 합니다.
- 낮은 수준의 역할에 지원하는 경우 면접관이 라이브러리 없이 솔루션을 어떻게 구현할 것인지 물어볼 수 있으므로, 이해를 설명하거나 시연할 준비를 하세요.
널 값 처리:
- 입력 값에 대한 가정을 항상 명확히 하세요. null 값이 없다고 가정할 수 있는지 묻는 것은 세부 사항에 대한 주의를 보여주는 좋은 습관입니다.
코딩 전 설계 제안:
- 네, 코딩에 들어가기 전에 코드 설계나 논리 흐름을 개요하는 것이 현명합니다. 이는 사고를 정리하고 면접관이 문제 해결 과정을 평가할 수 있게 합니다.
구글 문서에서 코딩하기:
- 구글 문서와 같은 플랫폼에서 코딩하는 것은 화이트보드에서 코딩하는 것과 비슷합니다. 자동 완성 기능이 없으므로 후보자는 문제 해결 기술을 개발하기 위해 손으로 코딩하는 연습을 해야 합니다.
면접 질문 난이도:
- 전화 면접에서 1-2개의 질문을 다룰 것으로 예상하세요. 첫 질문은 워밍업 역할을 할 수 있으며, 두 번째 질문은 더 복잡할 수 있습니다.
- 면접관은 솔루션에 가까울 경우 힌트를 제공하는 경우가 많습니다. 힌트를 주의 깊게 듣는 것이 문제 해결에 중요할 수 있습니다.
면접 중 막힐 경우:
- 막힐 경우 공개적으로 소통하세요. 사고 과정을 표현하고 구체적으로 어떤 점에서 명확한 설명이 필요한지 이야기하세요. 이러한 접근 방식은 면접관이 효과적으로 도와주는 데 도움이 됩니다.
동적 프로그래밍 질문:
- 후보자는 동적 프로그래밍 문제를 즉석에서 해결할 것으로 기대되지 않습니다. 면접관은 후보자가 다양한 접근 방식을 탐구할 수 있도록 논의를 촉진해야 합니다.
피해야 할 일반적인 실수:
- 막혔을 때 침묵하지 말고 면접관에게 생각을 전달하세요.
- 문제를 명확히 하지 않고 코딩을 시작하지 마세요. 질문을 통해 문제를 이해한 내용을 논의하세요.
- 문제를 해결할 수 있는 마법 같은 함수가 존재한다고 가정하지 마세요. 기본 원리를 이해하세요.
알고리즘에 대한 전문성:
- 데이터 구조 및 알고리즘 과정에 상응하는 기본적인 알고리즘 이해를 목표로 하세요. 검색 알고리즘, 트리 순회 및 기본 데이터 구조에 대한 친숙함이 중요하며, 특히 인턴십이나 주니어 역할에 지원하는 후보자에게는 필수적입니다.
결론
전반적으로 효과적인 소통, 알고리즘 및 데이터 구조에 대한 명확한 이해, 전략적 문제 해결이 코딩 면접에서 성공하는 데 필수적입니다. 후보자는 사고 과정을 설명하는 연습을 하고, 다양한 접근 방식을 논의할 준비를 해야 합니다.
이력서 주요 팁
필수 정보: 학교, 전공, GPA, 예상 졸업 날짜, 인턴십 및 연구 프로젝트를 포함하세요. 이 기본 정보는 채용 담당자에게 중요합니다.
프로젝트 및 경험 강조: 기술 프로젝트, 오픈 소스 기여, 해커톤 참가 및 관련 동아리나 협회의 경험을 언급하세요. 이러한 경험은 실질적인 맥락에서 귀하의 주도성과 기술을 보여줍니다.
깔끔하고 간결한 형식:
- 이력서는 한 페이지를 목표로 하세요.
- 긴 문단 대신 글머리 기호와 간결한 문구를 사용하여 가독성을 높이세요.
- 중요한 정보(대학 이름 및 학위)는 페이지의 왼쪽에 배치하세요.
내용 우선순위: 양보다 질에 집중하세요. 불필요한 세부사항으로 이력서를 채우지 마세요. 경력 경험이 부족하다면 개인 프로젝트, 해커톤 또는 포트폴리오 사이트를 강조하세요.
기술 제시:
- 관련 프로그래밍 언어 및 도구를 나열하되, 전문성을 과장하지 않도록 주의하세요. 면접에서 방어할 수 있는 기술만 포함하세요.
- 많은 분야에서 전문가라고 주장하기보다는 기술에 대한 미묘한 이해를 제공하는 것이 더 좋습니다.
길이 고려사항: 대학 주니어는 이력서를 한 페이지로 유지하는 것을 목표로 하세요. 상당한 경험(예: 박사학위)이 있는 경우, 두 페이지 이력서가 허용될 수 있지만, 첫 페이지는 중요성 면에서 독립적이어야 합니다.
피드백 및 조정: 커리어 박람회에서 채용 담당자로부터 피드백을 받으세요. 그들은 이력서를 다듬는 방법에 대한 통찰력을 제공할 수 있습니다.
기술 표현: 언어에 대한 경험이 제한적이라면 기술 목록에 나열하기보다 프로젝트의 맥락에서 설명하는 것이 더 나을 수 있습니다.
이러한 점들은 채용 담당자의 관심을 끌고 자격을 명확히 전달하는 효과적인 이력서를 작성하는 데 도움이 되는 확고한 틀을 제공합니다.
(English)
Technical Interview
- Structure of the Interview:
- Begins with a short introduction.
- Main focus is a technical assessment in a programming language of the candidate's choice (e.g., C, Java, Python).
- Time is allocated for the candidate to ask questions at the end.
- What Interviewers Look For:
- Technical Skills: Coding proficiency, knowledge of data structures, and algorithms.
- Analytical and Problem-Solving Skills: Candidates are assessed on their thought processes and how they approach problems, not just the correctness of their solutions.
- Emphasis is placed on design principles and problem-solving strategies.
- Interview Process:
- Candidates should think out loud during the interview, articulating their thought processes.
- It’s important to ask clarifying questions to fully understand the problems presented.
Summary for Development Career Preparation
- Engage in Introductions: Be prepared to discuss your background briefly.
- Choose a Preferred Language: Know the language you're comfortable coding in for the technical assessment.
- Showcase Problem-Solving: Focus on how you approach problems; communicate your thinking clearly.
- Practice Clarity in Communication: Verbally process your thoughts to demonstrate your analytical skills.
- Clarify Questions: Don't hesitate to ask questions to ensure you understand the problem completely.
Mock Interview: Solving a Problem
- Clarification of the Question:
- The first step is to clarify the question posed by the interviewer. This includes understanding inputs, required outputs, data structures, and any assumptions.
- Candidates should ask questions to gather more information and ensure a solid understanding of the problem.
- Identifying Requirements and Assumptions:
- Stating assumptions, such as whether the input will always be positive integers or if the array has a fixed length, is crucial for aligning expectations with the interviewer.
- Writing down examples helps in visualizing the problem and validating assumptions.
- Discussing Potential Approaches:
- Candidates should outline possible solutions and their complexities before jumping into coding.
- Discussing the first brute-force solution (O(n²)) compared to a more optimized one using a hash set (O(n)) illustrates the candidate's thought process and understanding of algorithm efficiency.
- Trade-offs in Solutions:
- It's important to discuss the trade-offs between time complexity and space complexity.
- For example, a solution using a hash set saves time at the expense of additional space.
- Implementing the Chosen Approach:
- Once a preferred approach is determined, candidates should clearly outline their method before coding.
- Candidates can begin coding while vocalizing their thought process to maintain clarity.
- Code Quality and Syntax:
- Perfect syntax is not the priority; understanding and communicating the logic is more important.
- Making mistakes during coding and catching them is seen positively as it shows critical thinking.
- Engagement with the Interviewer:
- Continuous communication with the interviewer is essential. This includes discussing the approaches taken, potential optimizations, and reasoning behind certain decisions.
- Testing and Edge Cases:
- Before concluding the solution, candidates should consider edge cases and validate the implementation against various test scenarios.
Practical Example 1
The problem presented is to determine whether two distinct elements in an integer array sum to a target value n. The proposed solutions include:
- Brute-force Approach: Looping through each pair (O(n²)).
- Optimized Approach: Using a hash set to check for complements (O(n) time, O(n) space).
- Sorting and Binary Search Approach: Sorting the array and using binary search (O(n log n) time, O(log n) space) is also mentioned as a potential method but was not chosen for implementation.
Code Breakdown
public bool PairWouldSum(int[] array, int n)
{
// Initialize a hash set to store elements seen so far
HashSet<int> elems = new HashSet<int>();
// Iterate over each element in the array
foreach (int cur in array)
{
// Check if the complement (n - cur) exists in the hash set
if (elems.Contains(n - cur))
{
return true; // A valid pair is found
}
// Add the current element to the hash set
elems.Add(cur);
}
// If no pair found, return false
return false;
}
Conclusion
This structured approach not only demonstrates problem-solving abilities but also showcases effective communication and adaptability during the interview process. Candidates should strive to clarify, articulate, and discuss their thought processes while coding, making for a collaborative and informative interview experience.
Practical Example 2
- Question: Implement a set-like data structure with methods to insert an element, remove an element by value, and return an element chosen uniformly at random.
- Clarifying Questions: Begin with clarifying the requirements, focusing on the need for insert, remove, and random retrieval methods.
- Data Structure Options: Consider alternatives like lists and sets. A combination of a hash set and an array list can optimize performance for all three methods.
- Insert: Use an array list to add elements at the end.
- Remove: Use a hash set to facilitate quick look-up and removal by index.
- Get Random: Select a random index from the array list for efficient retrieval.
Interview Strategies and Common Questions
Using Built-in Functions:
- Yes, it's acceptable to use built-in library functions in coding interviews. Candidates should understand how these functions work, including their complexities.
- If applying for lower-level roles, interviewers may ask how you would implement a solution without libraries, so be prepared to explain or demonstrate your understanding.
Handling Null Values:
- Always clarify assumptions regarding input values. Asking if you can assume no null values is a good practice, as it shows your attention to detail.
Proposing Design Before Coding:
- Yes, it's wise to outline your code design or logic flow before jumping into coding. This can help you organize your thoughts and allow the interviewer to assess your problem-solving process more effectively.
Coding in Google Docs:
- Coding on platforms like Google Docs is similar to coding on a whiteboard; you won't have autocompletion features. Candidates should practice writing code by hand to develop problem-solving skills.
Interview Question Difficulty:
- Expect to tackle one or two questions during a phone screen. The first question might serve as a warm-up, while the second could be more complex.
- Interviewers often provide hints if you’re close to the solution. Listening carefully to hints can be crucial for solving the problem.
Getting Stuck During the Interview:
- Communicate openly if you get stuck. Express your thought process and the specific points where you need clarification. This approach helps interviewers assist you effectively.
Dynamic Programming Questions:
- Candidates are not expected to solve dynamic programming problems on the spot. The interviewer should facilitate a discussion that allows candidates to explore different approaches.
Common Mistakes to Avoid:
- Don’t remain silent when stuck; communicate your thoughts to the interviewer.
- Avoid coding without clarifying the problem first. Discuss your understanding of the question before jumping to a solution.
- Don't assume that a magical function exists to solve the problem. Make sure you understand the underlying principles.
Expertise in Algorithms:
- Aim for a foundational understanding of algorithms equivalent to a data structures and algorithms course. Familiarity with search algorithms, tree traversals, and basic data structures is crucial, particularly for candidates applying for internships or junior roles.
Conclusion
Overall, effective communication, a clear understanding of algorithms and data structures, and strategic problem-solving are essential for success in coding interviews. Candidates should practice articulating their thought processes and be prepared to discuss various approaches to solutions.
Key Resume Tips
- Essential Information: Include your school, major, GPA, expected graduation date, internships, and research projects. This foundational information is crucial for recruiters.
- Highlight Projects and Experience: Mention technical projects, open-source contributions, hackathon participation, and any relevant clubs or associations. These experiences showcase your initiative and skills in a practical context.
- Clean and Concise Format:
- Aim for a one-page resume.
- Use bullet points and concise phrases instead of long paragraphs to enhance readability.
- Keep important information (like university name and degree) on the left side of the page.
- Prioritize Content: Focus on quality over quantity. Avoid padding your resume with unnecessary details. If you lack work experience, emphasize personal projects, hackathons, or your portfolio site.
- Skills Presentation:
- List relevant programming languages and tools, but be cautious not to overstate your expertise. Only include skills you can defend in an interview.
- It’s better to provide a nuanced understanding of your skills rather than claiming to be an expert in many areas.
- Length Considerations: For juniors in college, aim to keep your resume to one page. If you have substantial experience (e.g., a Ph.D.), a two-page resume may be acceptable, but the first page should stand alone in terms of importance.
- Feedback and Adjustment: Seek feedback from recruiters during career fairs. They can provide insights on how to refine your resume.
- Skill Representation: If you have limited experience with a language, it may be better to describe it in the context of projects rather than listing it as a skill.
These points provide a solid framework for crafting an effective resume that captures the attention of recruiters and clearly communicates your qualifications.