제목에서 알 수 있듯이 가장 좋아하는 화이트 보드 인터뷰 문제는 무엇이며 왜 효과가 입증 되었습니까?
주니어, 시니어, 자바, C, 자바 스크립트, PHP, SQL, 의사 코드 등
제목에서 알 수 있듯이 가장 좋아하는 화이트 보드 인터뷰 문제는 무엇이며 왜 효과가 입증 되었습니까?
주니어, 시니어, 자바, C, 자바 스크립트, PHP, SQL, 의사 코드 등
답변:
저는 후보자 가 일상 업무에서 실제로 겪고있는 문제에 대한 해결책 을 설계 하도록 요청합니다 . 그렇게하면서 나는 나와 후보자 사이에 대화를 만들려고합니다. 나는 마치 이전에 문제를 생각한 적이없는 것처럼 그가 만들고있는 디자인에 대해 논의하려고합니다.
내가 평가하려고하는 것은 우리가 서로를 이해할 수 있는지, 혼란없이 기술적 문제에 대해 이야기 할 수 있는지 여부입니다.
(자바 데스크톱 개발자 용)
웹 브라우저 의 탐색 히스토리 (이전 페이지, 다음 페이지, 10 개의 이전 페이지 나열) 를 처리 할 API를 설계 하고 애플리케이션의 많은 부분에서 재사용 할 수 있습니다 (여기서는 앱에서 구체적 예제를 제공함). 그런 다음 구현을 스케치하십시오.
나는 이것이 간단하기 때문에 설명하기 쉽고, 단계별로 해결할 수 있으며 (모두를 파괴하지 않고 추가 동작 추가) 가장자리 사례와 오류 처리에 대해 이야기 할 수 있으며 데이터에 대해서도 이야기 할 수 있습니다. 구조.
후보자를 인터뷰하고 거기에 사업이없는 사람들을 걸러 낼 때 이것이 매우 밝게 나타났습니다. Fizz Buzz와 복잡성은 비슷하지만 데이터베이스 기술에 중점을 둡니다.
Assuming the following basic table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)
Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995
Part 2: Documents that contain the keyword "Blue"
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"
나는 그들이 원하는 모든 SQL 변형으로 작성하도록하고 사소한 구문 문제에 너무 까다 롭지 않습니다. 나는 그들이 기본 관계형 DB 개념을 이해한다는 것을 주로 알고 싶다.
대부분의 응시자는 전혀 문제없이 3 부를 통과 할 수 있습니다. 파트 4에 대한 답은 where 절에서 연산자를 OR에서 AND로 변경하는 것이라고 생각하는 사람들이 얼마나 놀랍습니다.
"민감한 디테일을 밝히지 않고 마지막으로 작업 한 프로젝트의 디자인을 화이트 보드에 그린다."
구현 strcpy
, strcmp
친구.
atoi()
.
strdup()
입니다.
strrev()
역전 기능 을 구현 하거나 요청했습니다 . 저의 화이트 보드 솔루션이 그들에게 깊은 인상을 주었고 지금 일하고 있습니다.
몇 가지 원칙을 포함하는 내가 가장 좋아하는 것은 인터페이스 (C #)가 주어진 이진 트리의 노드 수를 계산하는 것입니다.
public interface IBinaryTree<T>
{
IBinaryTree<T> Left
{
get;
}
IBinaryTree<T> Right
{
get;
}
T Data
{
get;
}
// Other properties and methods not germane to this problem.
}
인터뷰 대상자가 이것을 볼 필요는 없지만 재미를 위해 구현이 있습니다.
public sealed class BinaryTree<T> : IBinaryTree<T>
{
private readonly IBinaryTree<T> left;
private readonly IBinaryTree<T> right;
private readonly T data;
public BinaryTree(
IBinaryTree<T> left,
IBinaryTree<T> right,
T data)
{
this.left = left;
this.right = right;
this.data = data;
}
public IBinaryTree<T> Left
{
get
{
return this.left;
}
}
public IBinaryTree<T> Right
{
get
{
return this.right;
}
}
public T Data
{
get
{
return this.data;
}
}
// Other properties and methods not germane to this problem.
}
보조 클래스 :
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
// TODO: What goes here?
}
}
내가보고 싶은 해결책은 다음과 같습니다.
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
return tree == null
? 0
: 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
}
}
다음과 같은 지식을 보여줍니다.
저에게 흥미로운 화이트 보드 토론을 이끌어 낸 두 가지 질문은
그들은 단순하게 시작한 다음 점점 더 복잡해집니다.
퍼즐이나 디자인 질문을 화이트 보드 질문으로 사용하고 싶지 않습니다. 후보자의 코드 작성 능력을 테스트하는 간단하고 간단한 질문을 선호합니다. 내가 가장 좋아하는 것은 :
1) 단독으로 연결된 목록을 뒤집는 함수를 작성하십시오. (3 개의 포인터가 필요하다는 것을 깨닫기까지 시간이 걸립니다.)
2) 이진 트리가 주어지면 이진 트리의 깊이를 찾으십시오. (이 질문은 재귀 코드를 작성하는 능력을 테스트합니다. 기본 사례가 그대로인지 확인할 수 있습니다.)
3) 정수 배열을 이진 검색하는 절차를 작성하십시오. (Jon Bentley와 마찬가지로 (Programming Pearls에서) 많은 사람들이 이진 검색을 작성하는 데 실수를 범하는 경향이 있습니다. 그런 다음 버그 찾기, 테스트 케이스 작성, 코드 실행 등을 수행 할 수 있습니다.)
우리는 내가 일한 한 회사에서 이것을 사용했습니다.
우리는 후보자에게 시간 추적에 사용되는 종이를 건네 주었다. 하나 또는 우리 부서에서 사용하는 실제 작업 표였습니다. 우리는 응시자에게 더 나은 시간 추적 도구를 만들기위한 디자인 프로세스를 안내해달라고 요청했습니다. 경계가없고, 어떤 언어 등을 말하지 않았으며, 후보자가 "전체 수명주기"에 얼마나 능숙했는지 알고 싶었습니다. 이를 통해 요구 사항을 어떻게 수집했는지 실제로 알 수있었습니다. 데이터베이스 테이블을 구성한 방법, 수행 할 UI 종류 이 작업에는 의사 소통 기술이 분명히 필요했습니다. 일반적으로 여러 개의 큰 화이트 보드가있는 방에서 이루어졌으며 2 시간 동안 지속되었습니다.
우리는이 과정을 사용하여 여러 사람을 고용했고 그들이 실제로 그 일을 잘 수행했다면 그들은 우리를 위해 정말 잘했습니다. 그들이 한계가 있고 어쨌든 (별도의 주제) 그들을 고용하기로 결정했다면 그들은 한계 프로그래머였습니다.
프로그래밍 도메인과 관련된 문제를 사용합니다.
웹 응용 프로그램을 개발하는 경우 레코드를 삭제하는 웹 양식을 작성하는 방법과 데이터베이스에서 레코드를 제거하기 위해 어떤 방법을 사용해야하는지 알고 싶습니다. 기본 데이터베이스 원칙을 알고 있는지, 사용자와 상호 작용하여 삭제를 확인하는 방법 및 소프트 삭제가 무엇인지 알 수 있습니다.
나는 좋아하는 것이 없습니다. 내가 선택한 문제는 직업에 따라 크게 다릅니다.
인터뷰에서 문제를 완전히 해결할 수 있는지, 어떤 기술과 언어를 사용하는지, 화이트 보드에서 코드가 어떻게 엉망인 지에 대해서는 신경 쓰지 않습니다. 생각 패턴을 찾고 있습니다. 그들이 생각하고 문제를 해결하는 방법을 알고 있는지 알고 싶습니다.
내가 가장 좋아하는 친구는 내 친구였다.
첫 번째 "n"소수를 생성 / 인쇄 / 저장하고 작동 방식과 효율성을 설명하는 함수를 작성하십시오.
다음과 같은 이유로 잘 작동합니다.
알고리즘 질문이므로 인터뷰 대상자가 생각하고 생각을 설명 할 수 있어야합니다. 따라서 뇌가 어떻게 작동하는지 확인할 수 있습니다.
언어 독립적입니다.
거의 모든 사람이 그것을 제대로 얻지 못합니다 (일반적으로 빠진 경우 (1 또는 2 보통) 또는 음수를 처리하지 않으므로 버그를 처리하고 잘못되었다는 것을 알 수 있습니다.
대부분 간단하지만 매우 느린 체로 사용합니다 (예 : 사람들의 80 %가 n을 n보다 작은 모든 정수로 나눔으로써 주요한 것입니다). 이는 알고리즘 기반의 알고리즘을 개선하는 방법에 대한 대화의 범위를 넓 힙니다. 시공간 트레이드 오프 (off / off)에 관한 것, 예를 들어 "2로 나눌 수 없다는 것을 이미 알고 있다면 왜 4를 나눕니 까?" 또는 "sqrt (n)보다 작은 모든 소수로만 나눌 필요가 있지만 그 숫자를 어딘가에 저장해야하므로 그 의미는 무엇입니까?")
그들이 정답을 얻을 필요는 없습니다. 누군가 자신의 생각을 생각하고 설명 할 수 있다면 그들은 좋은 후보자가되기위한 길을 먼 길입니다.
공학 학교의 C 시험의 일부인 aff_z라고하는 것이 휴일에서 돌아올 때 학생들이 실패하도록하는 "더미"테스트로 사용되었습니다 (마킹 시스템은 테스트에 실패하면 마킹을 중단 했으므로 더미 테스트에 실패 함) 전체 테스트를 무효화합니다 (자세한 내용에주의를 기울여야합니다). 인터뷰 중에 한두 번 재사용했습니다.
어쨌든 ... 나는 정확한 공식을 잊어 버렸지 만 이런 식이었습니다 ...
Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:
- if c is bigger or equal to 0, then print 'z' to standard output
- if c is stricly smaller than 0 , then print 'z' to standard output
- in any other case, print the letter 'z' to standard output
안타깝게도 대답이 분명 할 때 일부 학생들은 매우 복잡한 해결책을 제시 할뿐만 아니라 일부는 실패 할 수도 있다는 것입니다.
그리고 믿거 나 말거나, 인터뷰 중에도 일어났습니다.
인터뷰에서 그것을 실행하는 것은 일부 지원자가 가능한 가지를 작성하기 시작한 다음 무엇이 잘못되었는지 알기 때문에 상당히 재미있었습니다. 서면으로 알려주십시오, 수수께끼가 있습니다 ...)
멍청하지만 최소한의 스크리닝이라고 생각합니다 (유사하게 JS 프로그래머를 고용 할 때 항상 변수를 선언하는 방법을 묻습니다. 그런 다음 var 사용 여부에 따라 var를 사용하여 차이가 나는지 여부에 따라 답변에 따라 달라집니다. 솔직히.)
variablename = variablevalue;
있었지만 좋은 사람은 전화 나 직접 대면 웃고 직접 다른 사람과 함께 또는 위트가 무엇인지 말해 줄 것입니다. var
).
이미지와 관련하여 많은 동적 웹 작업을 수행하는 조직으로서, 당신이 찾고있는 것에 정말로 달려 있습니다. 나는 작업과 관련된 지오메트리 질문을하는 경향이 있습니다. 어쨌든 지오메트리 질문을하는 경향이 있습니다. 좋은 시각적 테스트는 훌륭하고 시각적이며 문제를 통해 시각적으로 작업을 수행하고 체계적으로 작동하는 후보 능력을 보여줄 수 있기 때문입니다.
고급 지원자에게는 때때로 다음과 같은 질문을합니다.
이 이미지는 초승달을 보여줍니다. B에서 D까지의 초승달 너비는 9cm이고 E와 F 사이는 5cm입니다. C는 더 큰 원의 중심입니다.
a) 초승달 면적을 계산하십시오.
b) 주어진 크기에서 내부 원에 맞게 이미지 크기를 조정하는 데 필요한 계산을 설명하고 중심점이 알려진 경우 원 안에 배치하십시오.
더 쉬운 질문을 위해 나는 보통 같은 종류의 질문을하지만 "사각 안의 원 안에있는 사각형"예제를 사용합니다. 이것은 매우 쉽지만 완벽한 대수를 기대합니다.
그 이상으로, 나는 그들에게 가변 길이 데이터 세트의 모든 조합을 생성하는 알고리즘을 두드 리도록 요구하는 경향이 있습니다.
내가 본 최고의 FizzBuzz 답변은 다음과 같습니다.
SQL Server 2008
;WITH mil AS (
SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
FROM master.sys.all_columns as c
CROSS JOIN master.sys.all_columns as c2
)
SELECT CASE WHEN n % 3 = 0 THEN
CASE WHEN n % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
WHEN n % 5 = 0 THEN 'Buzz'
ELSE CAST(n AS char(6))
END + CHAR(13)
FROM mil
C # (단순)
foreach (int number in Enumerable.Range(1, 100))
{
bool isDivisibleBy3 = (number % 3) == 0;
bool isDivisibleBy5 = (number % 5) == 0;
if (isDivisibleBy3)
Console.Write("Fizz");
if (isDivisibleBy5)
Console.Write("Buzz");
if (!isDivisibleBy3 && !isDivisibleBy5)
Console.Write(number);
Console.WriteLine();
}
C # (영리한)
Enumerable
.Range(1, 100)
.Select(i =>
i % 15 == 0 ? "FizzBuzz" :
i % 5 == 0 ? "Buzz" :
i % 3 == 0 ? "Fizz" :
i.ToString())
.ToList()
.ForEach(s => Console.WriteLine(s));
인터뷰 한 후보에서 몇 가지를 찾습니다. 온라인상에서 설명 할 수없는 이유로, 우리는 아주 가난한 후보들을 얻었고, 그것을 기대하게 되었기 때문에, 나는 그들에 대해 꽤 편합니다. 여전히, 나는 찾습니다 :
디자인 인식.
"전화 번호가 여러 개인 전화 번호를 가질 수있는 이름과 성을 가진 연락처가있는 주소록 프로그램의 테이블 구조를 보여주십시오 (셀 / 가정 / 직장 등).
여기서 UML 2.0 사양 다이어그램을 찾지 않고 간단한 버블 다이어그램이 좋습니다. 그것이 합리적이라면
데이터베이스 작업에 대한 지식 (예 : SQL)
테스트 지식
public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
이전에 쿼리 결과를 리턴 하는 서명 이 있는 메소드가 있다고 가정하십시오 . 메소드에 널을 전달하면 NullReferenceException이 발생한다고 가정하십시오. 이 기능을 보여주는 테스트를 작성하십시오.
GetPhoneNumbers에서 "smith"라는 성의 집 전화 번호 (123)456-7890을 반환한다는 것을 보여주는 테스트를 작성하십시오.
코드를 작성하는 방법에 대한 지식
작성한 테스트 요구 사항을 충족시키는 방법을 구현하십시오.
지원자의 수와 질을 고려하여, 진지하게 지원 한 모든 사람을 인터뷰했습니다. 나는 아무도 고용하지 않았습니다.
다음 문제에 대한 알고리즘을 작성하십시오 . 숫자 n이 주어지면 n 개의 노드 가있는 (고유 한) 이진 트리의 총 수를 출력하십시오 .
따라서 n = 0이고 n = 1 인 경우 답은 1입니다. n = 2 인 경우 2 : 루트 노드가 있고 두 번째 노드는 왼쪽 또는 오른쪽입니다.
설계 기술에 대한 통찰력을 얻고 재귀 또는 메모 또는 동적 프로그래밍 솔루션을 생각하는지 확인할 수 있습니다.
[ 이진 검색 트리의 관련이지만 다른 경우에 대해서는이 StackOverflow 토론 을 참조하십시오 .]
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
많은 사람들이 이것에 붙어 수 있습니다. 일부 솔루션이 제공되면 일반적으로 재귀를 사용합니다. 그 후 :
Implement the same via 'for'-loop
후보자의 50 % 인 두 명의 작업을 완료하지 못한 동료 수는 몇 명인지 알 수 없습니다.
그게 내가 좋아하는 이유입니다 :)
fib(n)=round(power(PHI,n)/SQRT5)
있습니다. PHI와 SQRT5는 각각 황금비 (1.618 ...)와 5의 제곱근을 나타내는 상수입니다.
데이터베이스의 경우 :
테이블 : 것들 아이디 이름 1 Bodkin Van Horn 후스 푸스 2 개 3 Hoos-Foos 4 핫샷 5 마빈 오그라 블 풍선 얼굴 6 스 니머 7 마빈 오그라 블 풍선 얼굴 8 마빈 오그라 블 풍선 얼굴 9 데이브
이름을 기반으로 이와 같은 테이블을 중복 제거하는 SQL을 작성하십시오 (그리고 어떤 ID를 가져 오는지는 신경 쓰지 않지만 반환되는 ID는 해당 이름에 유효해야 함). 따라서 올바른 SQL이 적용된 테이블은 다음과 같습니다.
테이블 : 것들 아이디 이름 1 Bodkin Van Horn 후스 푸스 2 개 4 핫샷 5 마빈 오그라 블 풍선 얼굴 6 스 니머 9 데이브
난 그게 좋아 왜냐하면:
(이곳 에서이 작업을 수행하는 데 사소한 방법이 있다는 것을 알았으며 수년 동안 너무 복잡했습니다.)
SELECT min(ID), Name FROM Things GROUP BY Name
.
HAVING count(Name) > 1
샘플 답변이 Bodkin Van Horn, Hot Shot, Snimm 및 Dave를 생략해야한다고 생각합니다.
DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. 선호하는 솔루션이 있습니까?
내가 가장 좋아하는 C ++ 화이트 보드 문제는 후보자가 구현하도록하는 것입니다
Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;
이것으로부터 나는 배울 수있다
표준 52 카드 덱을 어떻게 표현 하시겠습니까? 모든 프로그래밍 언어는 괜찮습니다. 카드를 어떻게 섞으시겠습니까?
내가 가장 좋아하는 것은 printf의 프로토 타입을 묻는 것부터 시작하는 것입니다. 그런 다음 한 수준의 문자를 인쇄하는 printf를 구현하는 저수준 API printc (char c)가 주어집니다. 스택이 CPU의 일부인 것처럼 모든 종류의 흥미로운 응답을 제공합니다. 당신이 짐작할 수 있듯이 나는 C와 임베디드 배경에서 왔습니다.
varargs()
그런 함수 를 호출해야 합니다. 제가 맞습니까? 나는 한 번만 한 일을 한 적이 있습니다.
200 마리의 물고기가 담긴 그릇이 있습니다. 이 물고기 중 99 %는 구피가 아닙니다. 남은 것의 2 %가 구피가되도록 얼마나 많은 물고기를 제거해야합니까? 당신의 일을 보여주십시오.
혼란스러운 요구 사항에 관한 것입니다. 같은 질문에서 관점을 여러 번 바꾸는 방법이라고합니다. 그들은 실제로 무슨 일이 일어나고 있는지 알아낼 수 있는지 확인하기위한 것입니다.
얼마나 많은 사람들이 잘못했는지 놀라게 될 것입니다.
answer = 100
입니다. [다른 물고기를 선택적으로 선택할 수 있다고 가정합니다. 구피를 제거하면 다른 답변이 있습니다.] 좋은 질문입니다. 프로그래머가 아이의 놀이를해야한다고 생각하는 사람은 거의 없습니다.
몇 가지 즐겨 찾기가 있지만 여기에 거의 항상 나타나는 커플이 있습니다. 대부분의 경우 최종 라운드 기술 (C ++) 인터뷰를 수행하므로 더 길고 더 많은 공개 질문이있어 새로운 관심 분야로 이어집니다. '올바른'대답은 없으며 다른 대화의 시작일뿐입니다.
1) 기본 공유 포인터 구현, tr1 또는 boost의 공유 포인터와 비교하여 결함이있는 위치에 대한 설명, 사용 방법 등
2) 코드 검토. 숙련 된 직원의 경우 설계 문제, 오류, 코딩 공포 및 유지 관리 가능성 문제에 대해 제공된 코드를 자신있게 검토 할 수있을 것으로 기대합니다. 물론 그들이 어떻게 고쳤는지; 때로 그들이 격추하는 하급 개발자에게 그 메시지를 전하는 방법이 있습니다.
그것이 나에게 사용 된 이래로 사용해 왔던 한 가지 질문은 다음과 같습니다.
1에서 100 사이의 모든 숫자를 인쇄하는 함수를 작성하십시오.
내가 사용한 이유의 대부분은 솔루션을 가져 와서 다양한 방향으로 이동할 수 있기 때문입니다.
1과 1000, 10000 또는 n 사이의 모든 숫자를 인쇄하도록 함수를 어떻게 수정 하시겠습니까?
이러한 질문에 대한 답변은 성능 요구 사항을 인식 할 수있을뿐만 아니라 변화하는 요구 사항에 어떻게 대응하는지에 대한 통찰력을 제공 할 수 있습니다. 강력한 후보자는 함수 호출 빈도에 필요한 기능과 관련하여 질문에 응답 할 수 있습니다.
다른 방향으로 이동 :
이 함수가 1 분에 여러 번 호출되고 성능이 문제가된다는 것을 알고 있다면 어떻게 변경 하시겠습니까?
나는 이것을 그들의 측면 적 사고를 점검하는 방법으로 사용합니다. 최대 값이 클수록 소수를 계산하는 것이 느릴 수 있으므로 때로는 해결하려는 문제에 따라 조정되는 계산 또는 사전 계산 된 룩업 테이블을 사용하는 것이 더 합리적입니다.
다음은 약간의 생각을 불러 일으키는 방법입니다. 간단하고 약간의 수학이 필요하며 기본적인 컴퓨터 디자인 (오버플로, 숫자 표현 등)에 대한 후보자의 지식을 확인합니다.
정수 X, Y 쌍을 입력으로 사용하고 X * Y를 10으로 균등하게 나눌 수 있는지 여부를 결정하는 프로그램 (또는 프로 시저)을 작성하십시오. 중요 참고 : X * Y는 사용 가능한 최대 정수 유형을 오버플로 할 정도로 충분히 클 수 있습니다. 당신의 기계에.
T_BOOL MultipleOfTen(int x, int y)
{
return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}
1000x1000이라고 말하지만 최대 100이 아닌 항목을 가진 예비 행렬을 어떻게 표현 하시겠습니까?