대학원 / 주니어 엔지니어는 어떤 표준을 기대할 수 있습니까? [닫은]


38

대학원 개발자가 버퍼 오버플로를 수용 할 수 있습니까? 바를 너무 높게 설정하고 있습니까? 대학원 / 주니어 엔지니어의 예상 기능은 무엇입니까?

문맥:

우리는 현재 Linux에서 주로 C로 일하는 Junior Developer 직책을 모집하고 있습니다.

이 과정의 일부로 응시자는 C에서 여가 시간에 코드 테스트를 완료해야합니다.

지금까지 우리는 코드가 읽을 수 있고 어떤 경우에는 관용적이기는하지만 무제한 버퍼 쓰기로 인한 버퍼 오버플로 오류로 인해 두 후보를 거부했습니다.

[편집하다]:

  • 오류 확인 된 생산 품질 코드를 명시 적으로 요청합니다.
  • 우리는 응시자를위한 테스트 및 빌드 프레임 워크를 제공합니다

[최신 정보]:

이 스레드와 다른 개발자와 직접 대화 한 결과 코드 테스트 수행 방식과 채용 대상자를 대상으로 변경되었습니다.

우리는 버퍼 오버 플로우를 고치거나 이해할 수없는 후보가 우리가 수행하는 작업에 부적합하다는 것을 의미하며, 특히 우리가 편한 것보다 더 많은 멘토링을 할 것이라고 결정했습니다. 따라서 강력한 코드 샘플을 제출할 수없는 후보는 여전히 거부합니다.

그러나 채용 프로세스를보다 생산적으로 만들어 우리와 후보자 모두에게 도움이되는 몇 가지 조치를 마련했습니다.

특히:

  • 우리는 생산 품질의 의미에 대한 명확한 설명과 입력 및 오류와 관련하여 코드가 강력하다는 경고를 통해 기대를보다 명확하게합니다.
  • 이제 코드 테스트 설명에서 방어 프로그래밍 및 C 표준 라이브러리의 리소스에 후보를 연결합니다.
  • 주니어 개발자 및 졸업생의 대상 고객을 변경하여 관련 경험이있는 사람을 대상으로했습니다.
  • 제출 된 코드가 어떤 방식 으로든 실패하지만 다른 방식으로 승인 될 경우, 오류 조건을 유발하고 후보자가 실수를 바로 잡을 수있는 최소 테스트 사례를 제공합니다 (다른 이유로 코드가 거부되지 않는 한). 또한 적절한 경우 문제가있는 라인 / 기능을 지적 할 것입니다.
  • 테스트 자체의 목표는 프런트 엔드 필터에서 후보자에 대한 더 나은 그림을 만들 수있는 기회로 약간 변경되었습니다. 특히 전화 토론에 도움이됩니다. 즉, 우리는 여전히 코드만을 기반으로 거부 할 의향이 있습니다.

[Update 2015-07-09] : Nujob의 Andy Davis는 응시자의 관점에서 코드 테스트를 사용하는 데 흥미롭고 관련있는 기사를 작성했으며이 기사를 살펴볼 가치가 있습니다. 여기에서 찾으 십시오 .


29
아마도...? 학교에있는 많은 사람들이 현재 C보다 Java에 대한 경험이 훨씬 더 많은 것 같다는 것을 고려할 때, 지원자가 신입생이고 코딩 노출의 2/3가 Java 인 경우, C가 강하지 않을 수 있습니다. 테스트. 하지만 ... 열려 있고 배우고 자한다면 어떻게 말 하시겠습니까? 결국, 이것은 주니어 위치입니다 ...
FrustratedWithFormsDesigner

4
또한 인터뷰에서 작성된 코드이며 시간 제약이있을 경우 용서받을 수 있습니다. 적어도 그들에게 그들의 코드가 버퍼 오버플로로 고통받을 필요가 없다는 것을 언급해야합니다 .
맨스필드

4
두 번째 @FrustratedWithFormsDesigner입니다. 저는 주니어 개발자이며 C를 다루어야 할 유일한 시간은 CPU 아키텍처에 대한 수업에서 두 ​​번의 과제를 수행하는 것입니다. 한편 저는 C #, Java 및 Ruby에서 꽤 괜찮다고 생각합니다.
Kevin-복원 자 Monica Monica

4
그리고 테스트 프레임 워크에 버퍼 오버 플로우를 유발하는 테스트가 포함되어 있습니까?
FrustratedWithFormsDesigner

44
나는 당신이 잘못하고 있다고 말할 수는 없지만 지난 몇 년 동안 수십 명의 주요 대학 CS 졸업생을 인터뷰 한 후 '생산 품질 코드'의 의미에 대한 개념이 거의 없다는 것을 알았습니다. 나는 대부분의 CS 강사들이 다른 사람들이 사용할 코드 작성에 관심이 없다고 생각합니다.
Jim In Texas

답변:


109

바를 너무 높게 설정했다고 생각하지 않습니다. 다른 바가 필요할 수도 있습니다.

코드 테스트는 응시자의 역량을 결정하는 데 유용하지만 패스 / 실패해서는 안된다고 생각합니다. 응시자와의 대화를 시작하려면 코드 테스트 결과를 사용해야합니다.

그들이 저지른 실수 (특히 주니어 개발자 인 경우)를 발견하면 그 점을 지적하고 다르게 행동 한 것이 무엇인지 또는 왜 문제가 있는지 이해하는지 물어보십시오.


1
+1 맞습니다. 좋은 제안입니다. 실제로 응시자들에게 코드에 대한 오류를 검토하여 시간을 충분히 줄 것을 요청했지만 오버플로를 일으킨 오류를 수정하지 않고 코드를 더 나쁘게 만드는 경우가 있습니다. 처음에.
brice

15
@brice 실제로 주니어 개발자라는 확실한 증거입니다. 명백한 실수를 피하는 것은 연습과 경험으로 이루어집니다.
Tombatron

34
@ brice : 그는 그들과 구체적인 오류에 대해 이야기하고 있었다; 오류가 있다고 말하지 말고 다시 연락하도록 요청하십시오. 오류를 실시간으로 토론하십시오-힌트 (행 번호 또는 설명 및 기능을 제공하고 행 번호를 알려달라고 요청한 후)가 어떻게 방지 될 수 있는지 물어보십시오. 목표는 오류가없는 테스트 코드가 아니라 지원자의 강점과 약점을 잘 이해하는 것입니다.
jmoreno

6
주니어 개발자가 문제를 볼 수 있다면 문제를 해결했을 것입니다. 그것이 내가 당신과 함께 일할 수있는 능력을 테스트합니다. 문제가 무엇이고 어디에서 찾을 수 있는지 알려주고 실제 동료에게 제공하는 것과 동일한 치료법을 제공하고 그들이 어떻게 반응하는지 확인하십시오. 그들과 함께 일하는 것이 번거로운 일이라면 그들은 그 입장에 맞지 않습니다. 그들과 함께 일하는 것이 즐거움이라면 고용하십시오.
zzzzBov

67

주니어 한정자가 여기에서 모든 차이를 만드는 것 같아요. 주니어는 역량을 테스트하지 말고 학습 능력, 호기심, 열정, 윤리 및 겸손을 테스트해야합니다. 후배와의 가정은 그들이 유능하지 않다고 가정해야합니다 . 선배로서 그렇게하는 것이 당신의 일입니다.

분명히 그들은 fizzbuzz와 같은 기본 코드를 작성하고 개념에 대한 일반적인 지식을 가지고 있어야합니다. 당신이 그들에게 그것을 지적하고 심지어 버퍼 오버 플로우가 무엇인지 알고하지 않은 경우, 다음 나는 그것이 더 이동 없습니다 말할 것입니다,하지만 난 중학교 버그없는 코드의 5 개 이상의 라인을 작성하는 기대하지 않습니다.

주니어의 역량을 신뢰하는 날은 귀하가 의문을 제기하는 날이며, 주니어는 많은 멘토링과 건강한 신뢰의 "신뢰하지만 확인"으로 치료해야합니다. 나는 한때 주니어 였고 당시에 있었던 모든 사람들에게 미안합니다. 후배로서 끔찍한 일을 기억하십니까? (단지 나에게 말하지 말고 복잡하게 해주십시오 ..)


1
저는 공식적으로 2 년의 경험을 가진 '주니어 소프트웨어 엔지니어'입니다! 내 배경은 CS 또는 SW 공학 (물리학에 있음)에 없습니다. 나는 지금, 또는 내가 모집되었을 때 어떤 입력에도 segfaults하는 코드를 기꺼이 전달하지 않을 것입니다.
브라이스

31
수정 하면 입력에 segfaults 코드를 의도적 으로 전달 하지 않습니다 . 방금 버그를 쓰지 않았다고 주장했다면 John Carmack을 귀찮게해서 죄송합니다.
Jimmy Hoffa

!! 백 페달! 그것은 내가 주장하는 것이 아닙니다. 나는 버그 코드를 발표했다. 그러나 "버퍼 오버플로"를 검색 할 때 Google이하지 말아야 할 첫 번째 예처럼 보인 것은 없습니다
brice

오버플로를 유발 한 테스트를 포함하여 코드에 대한 테스트 프레임 워크도 제공합니다!
brice 2014 년

@brice 테스트 프레임 워크를 제공했다고 말할 때 메모리 문제를 테스트하기 위해 valgrind와 같은 도구를 제공 했습니까?
BЈовић

15

여기 몇 가지 문제가 있습니다.

첫 번째는 일반적인 컴퓨터 과학 졸업생이 무엇이든 알고 있다고 가정합니다. 그들은하지 않습니다. 솔직히 Visual Studio 를 설치하고 설정하는 방법을 알고있는 컴퓨터 공학 졸업생을 보면 매우 놀랍습니다 . Heck, 나는 최근에 TFS 가 무엇인지 또는 연결하는 방법을 알 수없는 .NET 코드를 작성하는 Microsoft 스택에서 5 년 이상의 경험을 가지고 있다고 주장하는 사람과 협력했습니다 .

두 번째는 매우 제한된 수영장입니다. 우리는 또한 후보자들이 프로그래밍 테스트를하도록합니다. 그들이 작성해야하는 5 개의 개별 "프로그램"이 있습니다. 그들은 집에서 그것을하고 코드를 전달합니다. 테스트는 매우 간단하며 (데이터베이스, 외부 종속성 없음) Express 버전 의 Visual Studio를 사용하여 쉽게 수행 할 수 있습니다 . 시험 자체는 약 30 분 안에 선임 직원이 쉽게 완료 할 수 있습니다. 우리는 일반적으로 검증 할 수있는 업무 경험이 최대 3 년인 최근 졸업생만을 대상으로합니다.

우리가 정량화 한 것은 테스트를받은 사람들의 약 70 %가 단순히 우리에게 돌아 오지 않는다는 것입니다. 일반적으로 명백한 구문 오류 (예 : missing ;) 로 인해 컴파일되지 않는 항목의 약 15 %가 전환됩니다 . 다른 10 %는 컴파일되지만 필요한 조치를 수행하지 못합니다.

이것은 무려 5 %를 남깁니다. 이 시점에서는 숫자가 필요할 때 알파 문자를 입력으로 입력하는 것과 같은 조건을 고려하지도 않습니다. 입력이 응용 프로그램이 적절한 출력을 수행함에 따라 매우 제한된 X 세트가 주어집니다. 또한이 숫자는 지난 4 년 동안 약 500 명의 후보자로부터 나왔습니다. 우리는 알고 싶어서 통계를 유지했습니다.

관리되지 않는 리소스를 올바르게 처리하거나 try .. catch명령문을 사용하는 것과 같은 코드 구조와 방어 적 코딩 기술에 대해 더 자세히 살펴보면 아무도 통과하지 못할 것입니다.

물론 질문은 왜 그렇습니까?

4 년제 대학 에서이 분야 의 학위 가진 어린이가 왜 간단한 프로그래밍 작업을 수행 할 수 없습니까? 그 답은 대학들이 비즈니스 요구에 완전히 맞지 않고 우리가 최첨단 기술로 생각하는 것보다 몇 년 뒤떨어져 있다는 것입니다. 10 년 전 코딩 표준은 보안이 사실 이후에 한 일이었습니다. 단위 테스트는 아직 유행하지 않았습니다. 오늘날의 보안은 모든 기능 또는 향상 기능을 통해 최전방에있는 것이 좋습니다. 기억하십시오 : 대부분의 교수들은 실제로이 분야에서 일한 적이 없거나 오랫동안 일한 적이 없습니다. 일단 당신이 그것을 알면, 왜 그들이 훨씬 뒤에 있는지 이해하기 시작합니다. 더 나쁜 것은, 그 교수들 중 일부는 특정 기술에 너무 많은 시간을 소비한다는 것입니다 ( Java , PHP코드 구조 또는 수용 가능한 접근 방식 (및 WHY!)과 같은 심각한 기본 문제에 대해서는 논의하지 않습니다.

부수적 인 예입니다. 최근 졸업생이 자신의 수업 중 하나를 위해 모바일 OS를 작성한 경험에 대해 이야기했지만 기본 용어로는 웹 서버의 작동 방식을 설명 할 수 없었습니다. 그는 단순히 몰랐다. 15 년 또는 20 년 전에는 OS를 만드는 방법을 이해하기에 적절한시기 였을 것입니다. 오늘은 ...별로 요 그러나 방어 프로그래밍 에 대한 수업 이 그들과 외부 세계에 훨씬 더 유용 할 때 필요한 수업이었습니다 .

그래서 우리는 무엇을합니까?

그 5 % 중에서, 우리는 그들의 개성과 적합성에 대한 아이디어를 얻기 위해 조금 더 인터뷰를 할 것입니다. 그런 다음 우리는 교수들이 채운 쓰레기를 없애기 위해 약 6 개월을 "재 프로그래밍"하는 데 충분한 지식을 갖춘 "가장 좋은"것을 선택합니다.


2
여기에 동의합니다. 저는 업계에서 2 년 반 동안 더 많은 것을 배웠으며 그때는 대학에서 배웠습니다. 학교에 다니면서 웹 개발자로 첫 인턴쉽을받은 후이 사실을 배웠습니다.
Ryan

5
이제 여러분의 프로그래밍 테스트를 해보고 싶습니다.
Akash

1
정말? 특정 소프트웨어를 설치하고 웹 서버의 기능을 지나치게 단순화 한 버전을 제공하는 기능을 경험해보십시오. 누군가가 모바일 OS 작성을 처리 할 수 ​​있으면 웹 서버 작동 방식을 배울 수 있습니다.
Michael Shaw

@MichaelShaw : 누군가 OS를 작성하고 있지만 가장 일반적인 서버 유형의 기본 작업을 아직 배우지 않았다면 그의 학교가 그의 교육의 넓은 영역을 건너 뛰고 있음을 보여줍니다. 그러면 그 질문은 또 무엇이 넘어 갔습니까?
NotMe

2
@ChrisLively : 그중 하나가 어떻게 큰 문제인지 모르겠습니다. 서서히 움직이는 작은 들판이 아닙니다. 직업에 대한 학습이 일어날 것입니다. 나는 당신이 본질적으로 좋은 지적을 가지고 있다고 생각하지만, 그 예는 설득력이 없습니다. CS 커리큘럼에 문제가있는 경우 "Visual Studio 101 설치 방법"및 "Basics of Webservers 101"을 추가해도 문제가 해결되지 않습니다. (나는 "방어 프로그래밍"수업의 아이디어를 좋아한다.)
Michael Shaw

5

문제를 잘못보고 있다고 생각합니다. 당신이 스스로에게 물어봐야 할 것은 이것입니다 : 우리는 그들이 일을 할 수 있도록 후보자에게 무엇을 요구합니까? 위치와 그 내용을 올바르게 평가해야합니다. 다음은 주니어 개발자를 고용 할 때와하지 말아야 할 때에 대한 제안입니다.

주니어 개발자를 고용 할 때 :-수행하기 쉬운 작업이 너무 많으면 상급 개발자에게는 시간 낭비가됩니다. -향후 몇 년 동안이 사람을 멘토하고 훈련시키려는 경우. -회사를 키우고 오랫동안 머무를 사람을 원한다면. 1 년 동안 만 머무르는 주니어 개발자는 회사 자원을 낭비하고, 아무것도 생산하는 데 거의 도움이되지 않으며, 대부분의 결과는 자신의 개인적 성장에있을 것입니다. -누군가의 성장에 돈을 쓰는 느낌이들 때. 다시 한 번, 대부분의 이점은 그들이 배우는 것입니다.

주니어 개발자를 고용하지 않을 때. -작업이 너무 복잡한 경우. 이 경우 리그에서 벗어난 것입니다. -돈을 저축하고 싶을 때. 선임 개발자는 짧은 시간 안에 동일한 작업을 더 나은 품질의 결과로 완료해야하므로 항상 저렴해야합니다. -작업이 아웃소싱 가능하거나 직원을 바쁘게 유지할만큼 충분하지 않은 경우. 이러한 경우 일부 작업을 개인 계약자에게 오프로드하는 것이 좋습니다.

마지막으로 중요한 점입니다. "저희가 감당할 수있는 전부"또는 "적절하지 않은 경우"라고 주니어 개발자를 고용하지 마십시오. 결국 당신이 할 일은 화장실에서 돈을 씻는 것입니다. 게다가 일단 그 기술을 습득하면 어쨌든 큰 돈을 요구할 것입니다.

나에 대해서:

  • 공식적인 훈련이 거의없는 물리학 학위.
  • 2 년의 경력. 그래서 나는 학습 과정이 무엇인지 알고 있습니다.
  • 소프트웨어 개발자를 시작하십시오. 나는 매우 까다로운 작업을 수행했으며 다양한 개인의 기술 수준을 모두 보았습니다. 그들 중 많은 사람들이 내가하는 일을 많이 처리 할 수 ​​없습니다.

4

다른 사람들이 언급했듯이, 주니어 포지션은 C에 대한 경험이 거의 없을 것입니다. 개인적으로 C의 버퍼 오버플로에 대해 간략히 배웠으며, 조심할 수 있다고해도 여전히 일부를 소개 할 것입니다 (특히 빌려주는 과제가 주어지면) 버퍼 오버플로 생성 자체). 아마도 많은 주니어 개발자들은 버퍼 오버플로에 대해 알고있는 비슷한 상황 일 것입니다. 그러나 그것들을 광범위하게 식별하고 처리 할 준비가되지 않았습니다.

이를 감안할 때, 적절한 대응은 다음 가능한 상호 작용에서 문제를 제기하고 전체 지식을 테스트하기 위해 버퍼 오버플로에 대해 알고있는 내용을 묻는 것입니다. 그런 다음 프로덕션 준비 코드에서 코드를 찾았다 고 알려주십시오. 이것은 그들이 교정과 지시에 어떻게 반응 할 것인지 판단 할 수있는 좋은 창입니다.

덜 알고 있지만 기꺼이 배우고 개선 할 수있는 주니어 개발자가 더 많이 알고 있지만 개선 할 수 없거나 개선 할 수없는 주니어 개발자보다 더 가치가 있다고 생각하는 것은 일반적인 생각이 아닙니까?

즉, 귀하의 의견 중 하나에서 버퍼 오버플로를 사용한 경우 코드에서 버퍼 오버플로를 지적했을 테스트를 건네주었습니다. 아마도 더 큰 문제는 왜 테스트를 실행하지 않았는지 (왜냐하면, 버그가있는 코드로 전환했는지)입니다.


3

버퍼 오버 플로우는 절대적입니다. 해당 코드 질문이있을 수 있습니다. 이 코드 조각으로 모든 것이 잘못 (잘못 될 수있는) 상황에서 응시자는 문제를 정확히 찾아 낼 수 있어야합니다. 문제는 어쨌든 클린트를 실행하면서 문제가 관련이 없는지 여부입니다.

그러나 인공 자유형 코드 테스트에서는 sprintf와 같은 위반에 경미합니다. 너무 적은 시간 (가정), 마음의 과잉 행동, 너무 큰 일로 무언가를 제시하려는 충동.


10
나는 그가 "후배"를 언급하고 있음을 알아 차릴 때까지 똑같은 대답을 거의 썼다. 경험으로
Jimmy Hoffa

@JimmyHoffa 네, 그냥 당신의 첫 줄을 읽고 내 "절대 노고"를 수정했습니다. 당신의 요점은 고려할 가치가 있습니다. 지금까지 나는 모든 프로그래머를 사용하고 평가할 수 있었지만, 하나의 심령적인 경우와 하나의 "거짓말".
Joop Eggen

@JoopEggen : "psychic"이 당신이 찾고 있던 단어가 아니라고 확신합니다. 그렇지 않으면 그들은 당신의 마음을 읽을 수 있었을 것입니다 ...;)
NotMe

2

나는 당신이 잘못된 질문을하고 있다고 생각합니다. 전문 프로그래머가되기위한 객관적인 바는 없습니다. 있다면, 표준 프로그래밍 시험이있을 것입니다. 개별 바는 얼마나 까다 롭고, 얼마를 지불 할 수 있는지, 소프트웨어가 얼마나 많은 돈을받을 수 있는지, 가르치는 데 얼마나 많은 시간을 할애 할 수 있는지에 따라 설정되어야합니다.

이 경우 버퍼 오버런은 아마도 후보자가 예제 작업의 샘플로 제시 한이 코드가 요청한 작업을 수행하는 대신 세그먼트 화 오류와 충돌한다는 것을 의미한다고 생각합니다. 따라서 요청한 작업을 수행하는 대신 세그먼트 오류로 충돌하는 코드를 작성하는 코더를 수락해야합니까? 물어보기:

  • 귀사에서 작업 코드를 작성할 있는 사람을 유치 할 수 있습니까?

  • 코드를 거의 작성할 수있는 사람 이 동료 검토 및 테스트 지원을 통해 작업 코드를 작성할 수있을 정도로 개발 프로세스가 충분히 강력 합니까?

  • 당신은 일종의 프로그래머에게 프로그래머가되는 방법을 가르 칠 수 있습니까? 그리고 그러한 노력을 기울이고 몇 년을 기다렸다가 후보자의 내면의 재능이 실현되기를 희망합니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.