Как отучить стажёра от говнокода?

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

Первые дня два, он внимательно слушал и спрашивал. Показал ему, что такое HTML, CSS, PHP, MySQL.
Попросил его сделать выполнить простые задачи, небольшие функции. Но каждый раз наступаем на те же грабли. Он не хочет вникать в мануал.

Когда в результатах поиска, я ему посоветовал использовать регулярки, и прочитать про них. Он двух минут не задержался, пошёл писать. Ну я думал, что он понял. А он переписал функцию preg_replace() на свой лад. Полсотни линий кода и 4 часа работы. Я вник в задание и сделал с регулярками в 1 строку и за 5 минут.

Постоянно одно и то же. Чтение значений из файла, которые располагаются через запятую, он мудрил с поиском совпадений вычитанием лишнего, копировании данных и вычислении позиции символа. Минут 20 доказывал мне, что нельзя сделать проще. За 2 минуты, я нашёл в мануале strtok($string, $token), позволяет вытянуть слово, до определённого токена.

И в этой же задаче, передаются две переменные, которые могут содержать 2 из 5 типов. При том каждый тип, либо начинается с особого символа, либо имеет определённую длину. Его код состоял из серий if-else в несколько этажей, в итоге на 250 линий и 2 дня работы. С помощью strncmp($string1, $string2, $length) я уместил в 12 линий и 4 минуты в том числе на поиск функции.

Я понимаю, что у него меньше опыта. Может я неправильно что-то объясняю? Неужели так сложно спросить меня, или Гугл как сделать? Поделитесь опытом, как его поставить на правильный путь?
  • Вопрос задан
  • 11740 просмотров
Пригласить эксперта
Ответы на вопрос 38
butteff
@butteff
Раз в тысячу лет заправляю свитер в носки
Ну я кота к лотку приучил так:
Тыкал в говнокод и бил! Теперь он великолепно программирует на лотке
Ответ написан
Sterhel
@Sterhel
Вы родственника взяли, что ли?
Ответ написан
Я думаю, что регулярки он не понял, из-за того, что ето совсем другая для него вселенная. Ведь посмотрите на это реально, он новичёк, он хотел справиться с задачей => хорошо! НО!!! Если бы вы ему дали «лёгкий» мануал по автоматам и гарматикам, он бы понял, что такое preg_функции. К сожалению я думаю, что preg_функции нельзя хотеть от новичков сразу, там надо немного вникнуть в проблему. ;-)
Да и вообще, я в ВУЗе автоматы 2 года подряд сдавал, так что знаю, что это за хрень.
Может он себя плохо чувствует, давление, итд?.. Обясните ему, что у него много времени, и что програмированние, это 60% поиска, 30% мозговой активности и 10 написания кода… Я думаю, что главное, чтобы старался!
Ответ написан
taliban
@taliban
php программист
«Первые дня два, он внимательно слушал и спрашивал. Показал ему, что такое HTML, CSS, PHP, MySQL.» О.о Дайте ему штуки три книги, две недели времени и пусть сидит дома читает, через две недели проверьке как в школе что он прочитал, и если все читал исправно дальше работайте с ним, это Ваше «обучение» выйдет боком!
Ответ написан
@Next_Alex
Собственно самым эффективным всегда был удар по зарплате. Если нет возможности ввести штрафы за говнокод и перерасход времени на бред, то я бы попробовал затащить его на пиво и в непринужденной обстановке выведать что к чему, попытаться переубедить ( или просто заинтересовать в написании нормального кода, хотя бы на «слабо» ), ну и если необучаемый, то на воздух.
Ответ написан
Lifelover
@Lifelover
Рано или поздно начнёт ориентироваться на php.net и будет знать где что и как искать. =)
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
А на чем он до этого-то писал?
Ответ написан
@nldr
Если стажер работает меньше 3-х месяцев, то у вас отличный стажер.
Главное уметь решать задачи. А как это делать эффективнее придет с опытом. Я например очень страдаю от того, что вместо решений в лоб, те же 4 часа сижу и думаю как написать за 5 минут в 1 строчку.
Ответ написан
@Alexznadr
(Есть шанс, что вы взяли «не того» стажера. Судя по вашим комментариям выше я понял что опыт в программировании у него 0. И дело не в наличии/отсутсвии «опыта работы», а в том, что человек которому интересно этим заниматься — часто пишет программы «для себя». «Сильный интерес» — это одно из главных слагаемых успеха, а самостоятельно написанные хобби-программы — как раз признак наличия интереса.)

Как с ним работать (особенно хорошо если сроков жестких нет)
Cформулировать задание (желательно связанное с программированием, а не с изменением width:200px на wiidth 300px в css файле) (скорей всего на первых порах оно будет связано с процедурным программированием), попросить подумать над решением и (т.к. опыт 0) и записать его своими словами на листе бумаги/в текстовом файле в виде словесного описания алгоритма.
Как будет готов — вы просматриваете что он придумал. В этот момент вы сможете увидеть места в которых он пытается реализовать билиотечные функции и для этих мест посоветуете ему ознакомиться с соответсвующей документацией. Кроме того если в этот момент вы видите что получается ерунда, можно или наводящими вопросами подвести его к правильной мысли. Или если вопрос достаточно сложен — предложить свой вараинт и спросить что он по этому поводу думает: достоинства-недостатки-что-лучше.
Как только оно алгоритм скорректирован — ему останется просто, пользуясь словарём, перевести с одного языка на другой.

Когда с процедурным стилем будет получаться лучше — пришло время ознакомить его со стандартами кодирования принятыми в компании (Очень хорошо если они будут без глупостей и фанатизма).

ООП. Если вы уверены что у вас правильное ООП и оно вам действительно нужно, то «когда придёт время», то предварительно пусть ознакомится с принципами SOLID и основами UML (диаграммы классов, объектов, последовательностей) — этом поможет вам обсуждать архитектурные решения. А дальше тоже самое: формулируется задание. Он его обдумывает, рассазывает как решил делать декомпозицию и почему. Вы предлагаете свой вариант. Всё это обсуждается опираясь на принципы SOLID.

Вот примерно так. Не позволяем себе высокомерия и фразочек вроде «чему вас только в институте учат» и «ну кто так пишет», не забываем хвалить когда он всё делает правильно.

но, повторюсь, главное — чтобы он сам этого хотел. Если это есть — то успевай ему только книжки новые выдавать и задачи придумывать.
Ответ написан
Shedal
@Shedal
Думаю, изобрести несколько велосипедов для опыта не помешает :) В конце-концов, тогда начинаешь лучше понимать, как примерно работают уже готовые решения, которые используешь.
А как научить использовать готовое — сложный вопрос. Главное здесь — подход мышления. Когда начинаешь что-то делать, сначала поищи, не реализовал ли этого кто-то для тебя? Ведь 99%, что реализовал :)
Ответ написан
@GraD_Kh
Какой у него опыт работы? Ранее, чем через 3 месяца после начала требовать чего-то от новичка не надо, его главное задача в это время учится, а не закрывать таски вовремя.
Ответ написан
Mirgorod
@Mirgorod
Если он поймёт, что ему это нужно, то начнёт сам вникать в чужой код, интересоваться мнением колег, изучать паттерны, алгоритмы и т.д.

Без его желания будет очень сложно.
Ответ написан
Комментировать
@Yashin
А собственно программировать он умеет? Или сейчас он учится и программировать, и PHP заодно учит?
Ответ написан
@warbinox
я думаю ничего не нужно вообще делать, пусть пишет полсотни строк вместо одной, главное чтобы задача решалась, а со временем придет и опыт и лень :) приободрите, включите в проект, только поддерживать эту часть оставьте его же, когда придет время что-то исправлять или дополнять, он сам все поймет.
а идеального кода не существует, кто сказал что вашу задачу в 1 строку нельзя решить за половину? или вообще переписать этот кусок чтобы ее не было? вариантов масса, дайте человеку думать самому и решать :)
Ответ написан
kk86
@kk86
Я не хочу Вас обидеть, но посоветовать новичку регулярки использовать, это надо было догадаться.

А если конструктивно, то долбить, долбить и долбить, как правильно писать код. Парное программирование, код ревью и прочее. Повторение — мать учения.
Ну и книги какие-то вручить. Например, классический Code Complete.

Очень желаю Вам удачи. Выращивание кадров достойно уважения, не часто такое бывает.
Ответ написан
int02h
@int02h
Знаете как нас учили на первом курсе? Давали задание и запрещали пользоваться конструкциями языка или функциями стандартной библиотеки (хотя многие их и так не знали), которые позволяли решить данную задачу за пару десятков строк кода. Потом препод на лекции показывал как можно решить проще. Плюса два: во-первых, начинаешь понимать как работают стандартные функции, а во-вторых, запиминаешь их, так как сам, фактически, их изобретал.
Ответ написан
Комментировать
@Slonoed
Нормально, нормально. Это пройдет.
Сейчас просто у него период эйфории — ух ты, я программы умею писать!
Сам таким был вначале.
Просто пока выбрасывайте весь его код.
Надо мягко пока показывать правильный (свой) код
и обсуждать с ним его.
Ответ написан
Комментировать
Negor
@Negor
Простите, какой у Вас стаж? Думаю больше чем полгода+время на опыт. Стажёр ещё не умеет набирать опыт. Не занет где искать и что искать. Обучайте этому.
Ответ написан
Комментировать
Gibbzy
@Gibbzy
Вопрос о мотивации очень сложный.
Метод кнута и пряника говорят очень интересная вещь.
Мне часто было все равно на деньги, меня больше интересовало мнение о моих творениях окружающих людей, более опытные программисты снижали мне мораль по полной говорили что я никчемный что я сделал все неправильно итп. Я очень расстраивался хотел часто забросить все, но на следующий день я обязательно садился и пробовал еще раз и пробовал и пробовал… пока не научился.

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

Главное это ему понять, что в любой задачи есть наиболее правильный путь для ее решения, и иногда стоит потратить время чтобы подумать и поискать этот путь, а не городить первое попавшее в голову решение «В лоб».

Может быть человек своим сознанием еще в университете, и ему лишь бы работало.

Вообще в вашей сютуации многое зависит от личных качеств человека, которые мы сидя тут по другую сторону монитора никак не можем оценить. А вы, думаю сможете найти подход к этому человеку.
Ответ написан
KriegeR
@KriegeR
Software Engineer
Попробуйте говорить ему в какую сторону копать. Еще совсем недавно я публиковал топик, который наполовину, даже больше состоял из чистых костылей и говнокодинга (опыта у меня пока еще маловато, потому что сам стажер :) ). Люди в комментариях посоветовали куда копать и на что смотреть. Понял, посмотрел, попробовал запустить. Проблем с этим нет. Объясните ему, что уже все решения начального уровня давным-давно сделаны за него и пусть не пытается изобретать велосипед. На самом деле это не нужно… не здесь. Такой творческий подход нужен при решении задач, а не изобретении новых стандартов.
Ответ написан
Комментировать
Похоже просто плохо знает стандартную библиотеку. Заставьте прочитать php.net или книгу с описанием наиболее часто используемых функций.
Ответ написан
Комментировать
Kindman
@Kindman
Пусть пишет автоматические ТЕСТЫ для проекта.
Гораздо больше пользы будет от его активности.
Ответ написан
Nordvind
@Nordvind
Интересная практика. Не думал, что в стажеры берут человека, абсолютно не знакомого с программированием. Вместе с тем, что уже было высказано, советую дать почитать собственно статьи про говнокод (на лурке неплохая) и посмотреть презентацию А.Солнцева «WTF Code» http://www.devclub.eu/2010/08/13/video-wtf-code/.
Объясните, что код надо не только писать, но и сопровождать, в конце концов.
Ответ написан
Комментировать
savados
@savados
Нужно учить, а вы не учите. У вас сейчас: дал задание, он решил плохо, я сделал хорошо, показал ему. А надо: дал задание, он решил плохо, я объяснил, почему плохо, отправил переделывать, и так, пока не станет приемлемо.

Написал свой preg_replace()? Покажите, почему это неправильно, отправьте переписывать. Опять плохо? Опять переписывать.
Ответ написан
<jоke>А в этот вечер на стажёра найдёт просветление, он полезет в гугл за регулярками, наткнётся на хабр, зайдёт в qa, и....</jоke>
Хотя…
Ответ написан
mezastel
@mezastel
Финансовая математика, программирование
Учить, показывать как надо, ревьюить код.
Ответ написан
Комментировать
maratfmu
@maratfmu
По рукам бейте его!
Ответ написан
Комментировать
@resurection
Когда я начал изучать программирование (начал с php), то, наверное, первый год я просто узнавал основы синтаксиса и принципов. Например, если написать unset($arr[23]); — что будет: все последующие индексы сместятся или будет дырка? А как, что бы не было дырки? Если в двойных кавычках все переменные заменяются на значения, то будут ли кавычки влиять на ф-цию date(«Y-m-d»)? А что делать, если мне надо дату разбить на две строки br-ом? А как «склеить» два числа: 1+2=12?

В общем, очень много базовых вопросов, которые в документациях явно не прописаны или описаны как-то завуалированно (в пхп не существует нумированных массивов, только ассоциированные!). На такие вопросы я очень много времени тратил в первый год. Базы данных даже не щупал — всё в файлах. Но тогда я программил для себя и понимал, что пока не сделаю самостоятельно несколько сайтов, устраиваться на работу — тупо. А вы хотите: первые дня два,… показал ему, что такое HTML, CSS, PHP, MySQL. Дня два не хватит даже что бы выбрать удобное IDE, а Вы ему 4 языка!

В итоге: либо не экономьте на программерах, либо платите мелкую з/п за то что он ничего не успевает. А этому прогеру надо сначала написать хотя бы пару сайтов для себя/друзей и только после этого уже просить за свою работу денег.
Ответ написан
MpaK999
@MpaK999
Буду!
Рано ему писать, пустите его на документирование уже имеющегося кода, пусть разбирается в текущих проектах и комментирует каждую нужную строчку, после 1-2х файлов проверяйте правильно ли разобрался.
Ответ написан
Комментировать
ertaquo
@ertaquo
Просто дайте ему новое задание и подождите пару недель. Потом дайте ему его же старый код, скажите «надо быстро, срочно, аггрх!» Меня самого таким образом научили давать понятные названия переменным, оформлять код, читать доки на предмет «как сделать вот это быстро и в две строчки» и писать комментарии (хотя бы в трудных местах). Правда, проект тот я запорол и пришлось начать с нуля :-)
Ответ написан
Комментировать
terrier
@terrier
>> Может я неправильно что-то объясняю?
Ага, более, чем наверняка;)
Но научить стажера более-менее приемлимому стилю как правило проще, чем изменить себя.

Но вообще сложно требовать от человека без опыта программирования сразу писать в хорошем стиле. Тут помогут документация, положительная и отрицательная мотивация, разговоры о жизни и о профессии, но основное — это опыт, приходящий со временем.
Прямо сейчас, видимо, есть смысл признать, что он не понимает, чего вы от него хотите. Возможно, есть смысл дать ему документ с четкими формулировками хорошего стиля типа:
— требования к форматированию
— требования к именованию переменных
— для таких-то алгоритмов и структур данных использовать стандартные реализации
Код написаный с нарушениями этого документа просто не принимать.
Можно также признать его необучаемым и выгнать, но судя по описанию процесса набора сотрудников есть большой шанс принять такого же.
Ответ написан
hudson
@hudson
Веб-разработка, управление ИТ проектами
Ревьювить код.
Учить.
Курировать.

И опять
Учить…
Ответ написан
nolled
@nolled
Вы ему еще и платите? Сколько лет? Какое В/О? Если после школы — если бюджет позволяет оставляйте, если нет то пинок на улице без всяких сомнений.
Ответ написан
CKOPOBAPKuH
@CKOPOBAPKuH
ключевой момент — это хочет ли стажёр разбираться или не хочет. если он хочет, пытается, но у него ничего не получается — это одно. ему надо помочь и учить. если он не хочет ни в чём разбираться, и пытается только лишь бы вы от него отвязались — это другое.

м мне кажется, что не стоит воображать себя учителем и пытаться учить. раз за 3 года его не научили — то и у вас вряд ли выйдет. учиться он должен сам, а вы скорее старший товарищ, у которого можно что-то спросить и который может подробно объяснить и рассказать.
Ответ написан
Комментировать
@HighOctane
Как все закончилось? Точнее продвигается? Я думаю, что имеет смысл написать отдельный пост на хабре.
Ответ написан
Комментировать
@MaXyC
наберется опыта до определенного уровня и будет использовать мануалы/ я до какого то момента костыли больше любил? но однажды что то в голове того и у меня поселился дома мануал =)
Ответ написан
Комментировать
@Yaraife
Для простоты в общении, представим, что я стажер и хочу понять, что же вы от меня хотите?

Я считаю что я очень многое уже умею, ведь могу из простых функций написать все, что угодно! Только требуется время, но вы ведь меня не ограничиваете во времени? Так ведь? так зачем мне спешить, мне пока интересно разбираться во всем этом. А как будет работать код мне пока не важно, Вы ведь не ограничиваете меня по размеру выделенной памяти или процессорному времени (/ещё чему-то?)

Тогда чем вы недовольны? я ведь пишу код который работает! Я крут!

Надеюсь, намеки просты и понятны.

[Поясню на всякий случай: совет «используй только джедаевские методы в одну команду» непонятен и неприменим. Давайте более точные ограничения, того. что вам _действительно_ нужно. Вы хотите просто код в одну строку, и вам не важно как он работает? Ставьте ограничение на размер кода. Вам нужен быстрый и легкий код? Проверяйте скорость выполнения кода, написанного им. Он пока не так ленив, как вы, чтобы полчаса искать команду, чтобы написать код за 5 минут, это приходит только с опытом, а ещё для этого нужно понимание условий и ограничений, которые Вы, к сожалению, не ставите...]
Ответ написан
@mrkraftx
Помню себя таким, )) Это все навыки, грабли, получение знаний.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы