Какие стандарты можно ожидать от выпускников / младших инженеров? [закрыто]

38

Допустимы ли переполнения буфера от дипломированного разработчика? Мы устанавливаем планку слишком высоко? Каковы ожидаемые возможности выпускников / младших инженеров?

Контекст:

В настоящее время мы набираем на должность младшего разработчика, работающего в основном в C на Linux.

В рамках этого процесса мы требуем, чтобы кандидаты проходили тестирование кода на досуге в C.

До сих пор мы отклонили двух кандидатов на основании того, что их код, хотя и читаемый и в одном случае довольно идиоматический, страдает от ошибок переполнения буфера из-за неограниченной записи в буфер.

[Редактировать]:

  • Мы явно просим проверенный на ошибки код качества производства.
  • Мы предоставляем тестирование и сборку для кандидатов

[Обновить]:

В результате этой цепочки и личных бесед с другими разработчиками мы меняем способ проведения тестов кода и на кого мы нацеливаемся при наборе персонала.

Мы решили, что кандидат не может исправить или понять, что переполнение буфера означает, что он не подходит для той работы, которую мы выполняем, в частности, ему потребуется больше наставничества, чем нам удобно. Поэтому мы все равно будем отклонять кандидатов, которые в конечном итоге не смогут представить надежный образец кода.

Однако мы приняли некоторые меры, чтобы сделать процесс набора персонала более продуктивным как для нас, так и для кандидатов.

Особенно:

  • Мы делаем наши ожидания более четкими, с четким объяснением того, что мы подразумеваем под качеством продукции, и с предупреждением о том, что код должен быть надежным в отношении ввода и ошибок.
  • Теперь мы связываем кандидатов с ресурсами по защитному программированию и стандартной библиотекой C в описании теста кода.
  • Мы изменили нашу целевую аудиторию с младших разработчиков и выпускников на целевых людей с некоторым соответствующим опытом.
  • В случае, если представленный код каким-либо образом дает сбой, но в противном случае будет принят, мы сейчас предоставляем минимальный тестовый пример, который вызывает условие ошибки и дает кандидатам возможность исправить свои ошибки (если код не отклонен по какой-либо другой причине). Мы также укажем проблемные линии / функции, если это необходимо.
  • Цель самих тестов теперь немного изменилась: от входного фильтра появился шанс создать лучшую картину кандидата, в частности, это сообщит наше телефонное обсуждение. Тем не менее, мы по-прежнему готовы отказаться, основываясь исключительно на коде.

[Обновление 2015-07-09]: Энди Дэвис из Nujob написал интересную и актуальную статью об использовании теста кода с точки зрения кандидата, и эту статью стоит посмотреть. Найдите это здесь .

Brice
источник
29
Может быть...? Учитывая, что, похоже, многие люди в школе сейчас имеют гораздо больший опыт работы с Java, чем с C. Если кандидаты еще не учились в школе, и 2/3 их работы в области кодирования - это Java, их C может быть недостаточно сильным, чтобы пройти мимо тест. НО ... если они открыты и готовы учиться, то что бы вы сказали? В конце концов, это младшая позиция ...
FrustratedWithFormsDesigner
4
Это также код, написанный в интервью, возможно, простительный, учитывая временные ограничения. Я бы по крайней мере , не забудьте упомянуть им , что их потребность кода , чтобы не страдать от переполнения буфера.
Мэнсфилд
4
Я второй @FrustratedWithFormsDesigner. Я младший разработчик, и единственный раз, когда мне приходилось иметь дело с Си, было несколько заданий в классе по архитектуре процессора. Между тем, я считаю себя вполне нормально в C #, Java и Ruby.
Кевин - Восстановить Монику
4
И включает ли тестовая структура тест, который вызывает переполнение буфера?
FrustratedWithFormsDesigner
44
Я не могу сказать, что вы делаете что-то не так, но после интервью с десятками выпускников крупных колледжей CS за последние несколько лет я обнаружил, что большинство из них не имеют понятия о том, что подразумевается под «кодом качества производства». Я не думаю, что большинство инструкторов CS заботятся о написании кода для использования другими.
Джим в Техасе

Ответы:

109

Я не думаю, что вы установили планку слишком высоко, я думаю, вам может понадобиться другая планка.

Я думаю, что тесты кода полезны для определения компетентности кандидата, но они не должны быть успешными. Вы должны использовать результаты теста кода, чтобы начать диалог с кандидатом.

Если вы видите ошибки, которые они совершили (особенно если они младшие разработчики), укажите на них и спросите, что они будут делать по-другому, или если они поймут, почему существует проблема.

Tombatron
источник
1
+1 это правда, и это хорошее предложение. На самом деле мы просили кандидатов проверить свой код на наличие ошибок, предоставив им достаточно времени для этого, но они вернулись с неправильными исправлениями, в некоторых случаях ухудшающими код, без исправления ошибок, вызвавших переполнение. в первую очередь.
Брайс
15
@brice Довольно убедительная демонстрация того, что они на самом деле младшие разработчики. Предотвращение кажущихся очевидными ошибок приходит с практикой и опытом.
Томбатрон
34
@brice: он говорил обсуждать с ними конкретные ошибки; не говорите, что были ошибки, и попросите их вернуться к вам. Обсудите ошибки в реальном времени - дайте им подсказку (номер строки или, возможно, описание и функцию и попросите дать вам номер строки), затем спросите, как это можно было предотвратить. Целью является не безошибочный тестовый код, а хорошее понимание сильных и слабых сторон заявителей.
jmoreno
6
Если бы младший разработчик смог увидеть проблему, они бы исправили проблему. Если бы это был я, я бы проверил их способность работать с тобой. Скажите им, в чем заключается проблема и где ее можно найти, примените к ним такое же отношение, как и к вашим коллегам, и посмотрите, как они реагируют. Если работа с ними - рутина, они не подходят для этой должности. Если работать с ними одно удовольствие, то наймите их.
zzzzBov
67

Я думаю, что младший отбор - вот что имеет значение здесь. Детей младшего возраста не следует проверять на компетентность, их следует проверять на способность к обучению, любопытство, страсть, этику и, безусловно, смирение. Предполагается, что с младшими они не компетентны , это ваша работа как старшего сделать их таковыми.

Очевидно, они должны уметь писать базовый код, такой как fizzbuzz, и иметь общее представление о концепциях; если бы вы указали им на это, а они даже не знали, что такое переполнение буфера, то я бы сказал, что это бесполезно, но я не ожидаю, что младший напишет более 5 строк кода без ошибок.

В тот день, когда вы доверяете компетенции вашего младшего, вы должны подвергнуть сомнению ваши вопросы, к юношам следует относиться с большим наставничеством и здоровой дозой «доверяй, но проверяй». Однажды я был младшим, и всем тем, кто был там в то время: извините. Помните ужасные вещи, которые вы сделали, когда были младшими? (Пожалуйста, не говорите мне, что это был только я; вы дадите мне комплекс ..)

Джимми Хоффа
источник
1
Я официально еще «младший инженер-программист» с опытом работы 2 года! Мой опыт не связан ни с CS, ни с SW Engineering (это по физике). Я бы не стал охотно сдавать код, который подвергался ошибкам на любом входе, сейчас или когда меня завербовали.
Брайс
31
Исправление, вы не будете сознательно сдавать код, который segfaults на любом входе. Если вы только что заявили, что никогда не пишете ошибок, то извините, что беспокою вас, Джон Кармак.
Джимми Хоффа
HArg! идти на попятный! Это, конечно, не утверждение, которое я делаю. Я выпустил код ошибки, некоторые хуже, чем другие. Но ни один из них не выглядел как первый пример того, чего не следует делать, когда вы гуглили «переполнение буфера»
Брайс
Мы даже предоставляем тестовую среду для кода, включая тесты, которые вызвали переполнение!
Брайс
@brice Когда вы сказали, что предоставили среду тестирования, предоставили ли вы такой инструмент, как valgrind, для проверки проблем с памятью?
BЈовић
15

Я вижу несколько вопросов здесь.

Первый предполагает, что среднестатистический выпускник информатики знает, что угодно. Они не Честно говоря, я приятно удивлен, когда вижу выпускника факультета компьютерных наук, который знает, как установить и настроить Visual Studio . Черт возьми, я недавно работал с парнем, утверждающим, что у него более пяти лет опыта в написании стека Microsoft .NET- кода, который не мог понять, что такое TFS и как подключаться.

Второй - ваш очень ограниченный бассейн. У нас также есть кандидаты на тестирование по программированию. Есть пять отдельных «программ», которые они должны написать. Они делают это дома и отправляют код. Тесты чрезвычайно просты (без базы данных, без внешних зависимостей) и могут быть легко выполнены с использованием Express-версии Visual Studio. Сами тесты легко выполняются старшим парнем примерно за 30 минут. Обратите внимание, что мы обычно делаем это только для недавних выпускников, имеющих опыт работы до трех лет.

Мы подсчитали, что около 70% из тех, кто прошел тест, просто никогда не возвращаются к нам. Примерно 15% включают вещи, которые не будут компилироваться, обычно из-за явных синтаксических ошибок (например, отсутствующих ;). Еще 10% компилируется, но не выполняет требуемые действия.

Это оставляет колоссальные 5%. На данный момент мы даже не рассматриваем такие условия, как ввод буквенного алфавита в качестве ввода, когда требуется числовой. Это чисто из-за очень ограниченного набора X в качестве входных данных, приложение делает соответствующий вывод. Кроме того, эти цифры получены примерно от 500 кандидатов за последние четыре года: мы вели статистику, потому что хотели знать.

Если бы мы больше смотрели на структуру кода и методы защитного кодирования, такие как правильное распоряжение неуправляемыми ресурсами или использование try .. catchоператоров, то почти никто бы не прошел.

Вопрос, конечно, почему?

Почему ребенок со степенью в этой области из четырехлетнего университета не может выполнить простые задачи программирования? Ответ заключается в том, что колледжи совершенно не связаны с потребностями бизнеса и на много лет отстают от того, что мы считаем современным. 10 лет назад стандарты кодирования были такими, что безопасность была чем-то, что вы делали после свершившегося факта; и юнит-тесты еще даже не были в моде. Принимая во внимание, что сегодня безопасность должна быть на переднем плане с каждой функцией или улучшением. Просто помните: большинство профессоров либо никогда не работали в этой области, либо не работали в ней в течение длительного времени. Как только вы это знаете, вы начинаете понимать, почему они так далеко позади. Хуже того, некоторые из этих профессоров проводят слишком много времени на определенной технологии ( Java , PHPи так далее) и не могут обсуждать серьезные фундаментальные вопросы, такие как структура кода или приемлемые подходы (и ПОЧЕМУ!).

Просто побочный пример. Недавний выпускник рассказывал мне о своем опыте написания мобильной ОС для одного из своих классов, но он не мог объяснить, даже в основных терминах, как работает веб-сервер. Он просто не знал. 15 или 20 лет назад, наверное, было подходящее время для понимания того, как сделать ОС. Сегодня ... не так много. Тем не менее, это был обязательный класс, когда класс по защитному программированию был бы гораздо более полезным для них И для внешнего мира.

Так что же нам делать?

Из этих 5% мы проведем собеседование немного дальше, чтобы понять их индивидуальность и форму. Затем мы выбираем «лучших» с полным знанием того, что мы собираемся потратить около шести месяцев на «перепрограммирование» их, чтобы избавиться от дерьма, которым их профессора наполнили их.

Не я
источник
2
Полностью согласен здесь, я узнал больше за 2 с половиной года в промышленности, чем когда-либо учился в колледже. Я с трудом узнал об этом после того, как получил свою первую стажировку в качестве веб-разработчика, еще будучи в школе.
Райан
5
Теперь я хочу попробовать ваш программный тест ..
Акаш
1
В самом деле? Опыт установки конкретных программных продуктов и способность дать упрощенную версию того, что делает веб-сервер, - это то, что вы ищете? Если кто-то может заняться написанием мобильной ОС, он может узнать, как работают веб-серверы.
Майкл Шоу
@MichaelShaw: Если кто-то пишет операционную систему, но еще не обучен основным операциям наиболее распространенного типа сервера, то это показывает, что его школа пропускала большие (и очень важные) области своего образования. Тогда возникает вопрос, что еще было пропущено?
NotMe
2
@ChrisLively: я не вижу, как любая из этих вещей является большой проблемой. У нас нет крошечного поля, которое движется медленно. Обучение на работе будет происходить. Я думаю, что вы можете иметь здесь по существу хорошую мысль, но примеры не убедительны. Если есть проблема с учебным планом CS, добавление «Как установить Visual Studio 101» и «Основы веб-серверов 101» не решит проблему. (Мне нравится идея урока «Защитное программирование».)
Майкл Шоу
5

Я думаю, что вы смотрите на проблему неправильно. Вы должны спросить себя: что мы требуем от кандидата, чтобы они могли выполнять эту работу? Вы должны правильно оценить положение и что это влечет за собой. Ниже приведены некоторые предложения о том, когда нанимать младшего разработчика, а когда нет.

Когда нанимать младшего разработчика: - Если есть излишняя легкая работа, которая будет пустой тратой времени для более старшего разработчика. - Если вы готовы наставлять и обучать этого человека в течение следующих нескольких лет. - Если вы пытаетесь вырастить компанию и хотите кого-то, кто останется надолго. Младший разработчик, который останется только на год, будет пустой тратой ресурсов компании, они мало что сделают для производства чего-либо, и большинство результатов будет в их личном росте. - Когда вам хочется тратить деньги на чей-то рост. Снова, большинство преимуществ будет тем, что они изучают.

Когда не нужно нанимать младшего разработчика. - Когда работа слишком сложная. В этом случае это просто вне их лиги. - Когда вы хотите сэкономить деньги. Старший разработчик должен выполнять те же задачи в кратчайшие сроки с лучшими качественными результатами, и, следовательно, всегда должен быть дешевле. - Когда работа является аутсорсинговой или ее недостаточно для того, чтобы работник был занят. В таких случаях было бы лучше переложить часть работы на частного подрядчика.

Последний важный момент. Не нанимайте младшего разработчика, потому что «это все, что мы можем себе позволить», или «это все, что мы готовы потратить», когда они не подходят для работы. В конце концов, все, что вы в конечном итоге будете делать - это сбрасывать деньги в унитаз Кроме того, как только они приобретут эти навыки, они все равно будут запрашивать большие деньги.

Обо мне:

  • Степень в физике почти без формального обучения.
  • Два года опыта работы. Так что я знаю, что такое учебный процесс.
  • Начать разработку программного обеспечения. Я проделал очень сложную работу и видел разные уровни квалификации от разных людей. Многие из них не могут справиться с тем, что я делаю.
Мэтью Уэльетт
источник
4

Как уже упоминалось, младшие должности могут иметь небольшой опыт работы с C. Меня лично очень мало учили о переполнении буфера в C, и даже если бы я мог следить за ними, вполне вероятно, что я все еще буду вводить некоторые (особенно если дано назначение, которое предоставляет сам к созданию переполнения буфера). Вероятно, у многих начинающих разработчиков будет похожая ситуация, когда они могут знать о переполнении буфера, но они не были готовы идентифицировать и обрабатывать их каким-либо обширным образом.

Учитывая это, я думаю, что правильным ответом будет поднятие проблемы в следующем возможном взаимодействии и спросить их, что они знают о переполнении буфера, чтобы проверить свои общие знания. После этого скажите им, что вы нашли такой код в готовом к работе коде. Это даст вам хорошее окно, чтобы судить, как они будут реагировать на исправления и инструкции.

Разве распространенная мысль, что младший разработчик, который знает меньше, но хочет и способен учиться и совершенствоваться, более ценен, чем младший разработчик, который знает больше, но не может или не будет совершенствоваться?

При этом в одном из ваших комментариев вы упомянули, что передали им тесты, которые указали бы на переполнение буфера в их коде, если бы они их использовали. Поэтому, возможно, главный вопрос заключается в том, почему они не запускали тесты (если они это сделали, то почему они превратили код с ошибками)?

Lawtonfogle
источник
3

Переполнение буфера является абсолютным запретом. Вы можете иметь соответствующий код вопроса. В том, что все не так (может пойти не так) с этим фрагментом кода, кандидат должен быть в состоянии точно определить проблему. Вопрос в том, является ли проблема неактуальной, так как вы все равно запускаете Клинт.

Однако в искусственном тесте кода в свободной форме я был бы легок в нарушении, подобном sprintf. Слишком мало времени (предполагается), гиперактивность ума, слишком большое желание представить что-то работающее.

Joop Eggen
источник
10
Я почти написал тот же самый ответ, пока не заметил, что он имеет в виду «младшего», имейте это в виду ... Я видел некоторых острых младших, но даже все же они делают глупые вещи, не осознавая, что многим из разработки программного обеспечения можно только научиться по опыту
Джимми Хоффа
@JimmyHoffa да просто прочитайте свою первую строчку, исправьте мой "абсолютный запрет". Ваша точка зрения заслуживает рассмотрения. До сих пор я мог использовать и оценивать каждого программиста, кроме одного психического случая и одного «лжеца».
Joop Eggen
@JoopEggen: Я уверен, что «экстрасенс» - это не то слово, которое вы искали. В противном случае они должны были бы читать ваши мысли ...;)
NotMe
2

Я думаю, что вы задаете неправильный вопрос. Нет профессиональной цели быть профессиональным программистом. Если бы было, то был бы стандартный экзамен по программированию, но это не так. Ваша индивидуальная планка должна быть установлена ​​исходя из того, насколько вы требовательны, сколько вы можете позволить себе заплатить, сколько ошибок может позволить себе ваше программное обеспечение и сколько времени вы можете потратить на преподавание.

В этом случае, я предполагаю, что переполнение буфера, вероятно, означает, что этот код, который кандидат представил в качестве примера образцовой работы, завершается с ошибкой сегментации вместо выполнения того, что вы просили. Итак, вы должны принять кодер, который пишет код, который дает сбой с ошибкой сегментации, вместо того, чтобы делать то, что вы просили? Спросить:

  • Ваша организация способна привлечь любого, кто может написать рабочий код?

  • Является ли ваш процесс разработки достаточно прочным , таким образом, что кто - то , кто может почти написать код мог бы написать рабочий код с помощью экспертной оценки и тестирование поддержки?

  • Способны ли вы научить своего рода программистов быть программистами, и готовы ли вы потратить эти усилия и подождать, может быть, несколько лет и надеяться, что внутренний талант кандидата будет реализован?

Кристофер Мартин
источник