Чи слід наполягати на тому, щоб працівник все-таки писав поганий код через багато років? [зачинено]


13

Я ставлю це питання програмістам на C ++, оскільки: a) Тільки програміст на C ++ може судити про технічні достоїнства прикладів; b) Тільки програміст відчує темперамент іншого програміста, який пише такий код.

HR та директори знають, що існує проблема просто тому, що вони бачать докази на місцях. Це мій дзвінок, чи дамо програмісту більше часу. Багато помилок знаходяться на дуже базовому рівні - моє запитання (до програмістів) полягає в тому, чи повинен хтось, хто вважає старшим розробником C ++, отримувати сумніви на основі зразків свого поточного коду. Непрограмісти - навіть люди поза програмою C ++ - не можуть з цього приводу судити.

З іншого боку, мені поклали завдання керувати розробниками добре зарекомендуваної компанії. У них є єдиний розробник, який спеціалізується на всіх своїх кодуваннях C ++ (з тих пір назавжди), але якість роботи є безглуздою. Огляди та тестування коду виявили багато проблем, одна з найгірших - це витоки пам'яті. Розробник ніколи не перевіряв свій код на предмет протікання, і я виявив, що додатки можуть витікати багато МБ лише за хвилину використання. Користувач повідомляв про величезні уповільнення, і його прийняття було: "це нічого спільного зі мною - якщо вони вийдуть і перезапустяться, все знову добре".

Я дав йому інструменти для виявлення та відстеження витоків, і сів з ним протягом багатьох годин, щоб продемонструвати, як інструменти використовуються, де виникають проблеми та що робити, щоб їх усунути. Ми 6 місяців на шляху, і я призначив йому написати новий модуль. Я переглянув його ще до того, як він був інтегрований у нашу більшу базу коду, і злякався, коли виявив таке ж погане кодування, як і раніше. Те, що мені здається незрозумілим, - це те, що кодування є гіршим, ніж любительське. Наприклад, він хотів клас (Foo), який міг би заселити об'єкт іншого класу (Bar). Він вирішив, що Foo матиме посилання на Bar, наприклад:

class Foo {
public:
    Foo(Bar& bar) : m_bar(bar) {}
private:
    Bar& m_bar;
};

Але (з інших причин) він також потребував конструктора за замовчуванням для Foo, і замість того, щоб ставити під сумнів його початковий дизайн, він написав цей дорогоцінний камінь:

Foo::Foo() : m_bar(*(new Bar)) {}

Тому щоразу, коли викликається конструктор за замовчуванням, панель протікає. Що ще гірше, Foo виділяє пам'ять з купи для двох інших об'єктів, але він не написав деструктора чи конструктора копіювання. Таким чином, кожне виділення Foo насправді протікає 3 різних об'єктів, і ви можете уявити, що сталося, коли Foo було скопійовано. І - тільки стає краще - він повторив ту саму схему на трьох інших класах, тож це не одноразовий підсумок. Вся концепція помилкова на стільки рівнях.

Я почував би більше розуміння, якби це походило від тотального послушника. Але цей хлопець займався цим вже багато років і протягом останніх кількох місяців дуже акцентував навчання та поради. Я усвідомлюю, що він працював без наставництва чи рецензування у більшій частині цього часу, але я починаю відчувати, що він не може змінитися. Отже, моє запитання, чи наполягаєте ви на тому, хто пише такий очевидно поганий код?


15
Якщо ви вже бачили, що він пише поганий код, чому ви дозволили йому писати лайно протягом 6 місяців, не наглядаючи за ним?
Біллі МакНуггетс

4
ІМО, коли ви бачите, що хтось робить погану роботу на деякий час, ви не можете дозволити йому працювати сам, навіть якщо це лише налагодження / ремонт. Якщо ви хочете тримати його у вашій компанії, ви повинні контролювати його і ПІСЛЯ побачити, чи все ще отримаєте від нього погані результати. Дозволити йому працювати один протягом 6 місяців, не дивлячись на нього, це IMO - погане управління.
Біллі МакНуггетс

3
@ user94986 Тоді, якщо ви проводите з ним час, пояснюючи йому, що його звички погані, слідкуйте за ним, і якщо нічого не зміниться, не чекайте 6 місяців, щоб поговорити з ним.
Біллі МакНуггетс

4
Якщо він не вважає, що витоки пам’яті є проблемою, немає сенсу вчити його, як їх уникати та надавати інструменти, що допомагають у цьому. Основна проблема може полягати в тому, що він неправильно розуміє цілі та вимоги до товару.
maxim1000

2
Це питання видається поза темою, оскільки йдеться про те, що є ефективно юридичною консультацією з питань людських питань, що нам в кращому випадку надати.
Світовий інженер

Відповіді:


22

Моєю порадою було б протистояти йому щодо цього конкретного прикладу і подивитися, що він говорить. Якщо він заперечує, що в коді є щось погане, то я боюся, що ти мало що можеш зробити. Якщо він визнає, що допустив помилку (навіть якщо він з цього приводу захищається), то, принаймні, є місце для вдосконалення. Якщо ви приймаєте час і зусилля на його вдосконалення, то вам або старшому програмісту потрібно буде сісти за ним і кодувати разом, поки всі ці тенденції не будуть вирівняні (будьте готові присвятити цю людину принаймні протягом 1 місяця).

Поганий програміст, з яким я зазвичай можу працювати, але програміст, який не може покращитись, не можу.


12
+1 для "Поганий програміст, з яким я зазвичай можу працювати, але програміст, який не може покращитись, не можу".

Так, я також дав би хлопцеві знати, що це досить серйозно. Це здається, що йому не сказали або не визнали, що є проблема роками. Підійдіть до розмови готові вказати приклади речей, які він не повинен був робити, і як це вплинуло на якість програми. Якщо він все ще не готовий розібратися з проблемою свого коду, я, мабуть, відпустив би його. І я, мабуть, не дав би йому багато часу, щоб зібрати свій вчинок, якби він це зробив. Вам, безумовно, потрібно підкреслити, що його майбутнє в компанії поставлено на карту і що йому не вистачає досить критичної майстерності для розробника C ++.
Ерік Реппен

@ErikReppen Я згоден, але я також думаю, що програмісти можуть бути найвпертішими типами людей на землі. Якщо ви надто сильно натискаєте, він може заперечувати будь-які проблеми зі своїм кодом просто через захист. Я думаю, що важливо підкреслити серйозність ситуації, але я б все одно намагався співчувати йому "Я випадково помітив цю маленьку помилку. Чи траплялося і ви її зловити? Чи вважаєте ви, що ви зробили цю саму помилку в інших областях ваша програма? "
Ніл

@Neil Єдиний шлях через стіну впертого - удар в попу. І я висловлююся з досвіду як вперта дупа цього рівняння. Тим не менш, якщо це перший, коли він чув про те, що виникає проблема з його кодом, так, я б пішов трохи м'якше, але це здається, що вони намагалися
донести

@ErikReppen Можливо, але ти ризикуєш, що він сформується просто для того, щоб тебе зірвати з хвоста. З такою швидкістю ви також можете сказати: "Зробіть, або вас звільнять". Принаймні, такий підхід з'ясовує, чи сумління він у своїх помилках.
Ніл

18

Отже, моє запитання, чи наполягаєте ви на тому, хто пише такий очевидно поганий код?

Ні. Я б звільнив будь-якого професійного розробника C ++, якому бракувало базового розуміння управління пам'яттю.

Якщо це хтось із Java або C # або щось таке, я б дав їм широту, але це чиста некомпетентність.


9
Я не можу зрозуміти, як можна відповісти на цю відповідь. Звільнення когось - це не питання, до якого слід ставитися з легкістю.
Флоріан Маргайн

3
@FlorianMargaine - Звичайно, але це здається очевидним випадком. Скільки цей співробітник коштує компанії у втрачених продажах через витоки пам’яті чи вразливості безпеки? Скільки втрачено часу на тестування / виправлення цієї лайки? Скільки в тому, щоб ОП їх няні? Наскільки страждають інші програмісти від його простої присутності ? Якщо працівник не має абсурдної кількості доменних знань (або шантажу), немає можливості замінити їх дорожче.
Теластин

1
@FlorianMargaine, Цей тип співробітників - той, хто не звільняється достатньо, він калічить компанію, що важко виправити технічну заборгованість. На великих червоних вогнях написано: "Їм все одно, то чому ми повинні?". Знаєте, що сказав би працівник, якого ви справді хочете? "... але мені все одно, тому мені потрібно їхати в таке місце". Погані вже не хвилювались, тому вони залишаються у вашому офісі. Ви ОБОВ'ЯЗКОВО усунете людей, які шкодять продуктивності, більше ніж вони сприяють. Це не вибір, який сприймається легко, однак це дійсно чітка лінія, недіяльність - це чітка дія.
Дж. М. Бекер

13

Ми не можемо відповісти на більш широку частину вашого питання. А саме, чи слід утримувати або звільняти цього працівника. Звільнити працівника важко, але це рішення, яке не належить до такої громади.

Ви оновили своє запитання, щоб обмежити відповіді програмістам на C ++. Для мого досвіду / кваліфікації: я ріжу зуби в C, і я можу кодувати в C ++, C # і Java. І я люблю переслідувати умови перегонів між нитками, тому що думаю, що це весело. Так, я "отримую" трохи подвійне.

Ваша відповідь і рішення обертається навколо цього: чи може хтось змінитись, залежить від людини і чи хоче вона змінитись.

Але почнемо з кількох питань:

  1. Ви запитували його про код та приклад, який ви згадали? Яким було враження від огляду?
  2. Ви давали йому конкретні дані протягом тих 6 місяців щодо розуміння маніпулювання пам'яттю та переконання, що його код не витік пам'яті?
  3. Чи надавали ви досить часті відгуки протягом цих 6 місяців, щоб вказати, чи він прогресував чи ні.
  4. Ви чітко закликали, що його старий спосіб кодування вже не прийнятний у новому коді?

Вам потрібно переконатися, що ви можете відповісти на всі ці питання. Якщо ні, то все ще є тягар доказування з вашого боку для спілкування з ним.

Його відповідь на ваш останній огляд стане найбільш вагомою частиною.

Якщо він намагається і виявляє певні ознаки прогресу, можливо, вам потрібно переглянути процес наставництва. Якщо що, можливо, вам потрібно подумати про те, щоб поєднати його з більш досвідченим програмістом, щоб він міг отримати негайний зворотній зв'язок під час прийняття дизайнерських рішень. Я не прихильник парного програмування, але це може бути дуже корисно у такому випадку. Постійно відсилаючи його, щоб робити все нові і нові зміни старого коду, не завжди є практичним маршрутом для навчання.

Якщо він не намагався, то потрібно краще зрозуміти його мотивацію. Хіба він не розумів, що йому потрібно постаратися більше? Невже йому просто все одно? Чи є в колективі інші сфери, де його вміння краще підходять, і він більше цікавиться цим? Якщо йому було все одно, щоб спробувати, то потрібно зрозуміти, чому.

Звідти ви дізнаєтесь, чи хоче він змінитися і чи може він змінитися. Жодне бажання змінити рівнозначно неможливо змінити. Якщо є бажання і певний прогрес, тоді рішуче задумайтесь про те, щоб змінити те, як ви намагаєтесь його реабілітувати.


1
+1 за "Постійно відсилаючи його, щоб робити все нові і нові зміни старого коду, не завжди є практичним маршрутом для навчання"
Білл

+1 за останні пункти. Прогрес, досягнутий кимось проти зусиль, вкладених у те, щоб комусь потрібно було брати участь у будь-якому оцінці ефективності.
Мар'ян Венема

10

Боюся, його поганий код - не єдина проблема у вашій команді.

  1. Хто переглядає його код? Чому він вислизнув без попередження про прийняття коду з уразливістю витоку пам'яті?
  2. Чому не виявили цієї проблеми стрес-тести? Ви їх використовуєте? Якщо так, то чому вони не працюють?
  3. Його тривалий час залишали без нагляду. Чому?
  4. Він не використовує інструменти, які ви йому дали. Як ти мотивував його почати використовувати належні інструменти?

Ви кажете, що він тривалий час був у компанії. Звільнення такої людини рідко є доброю ідеєю (якщо тільки він не є співробітником типу Wally). Їх знання про потреби клієнта, продукти, якими ви володієте тощо, часто набагато цінніші, ніж код, який вони пишуть.

Рішення:

  • перемістіть його до QA, щоб він міг навчитися чого уникати
  • пару програмування з тим, хто може вказати на його помилки
  • розширені зусилля з контролю якості щодо його коду
  • змусити його писати стрес-тести, якщо він побачить, що його автомат розбився після створення та знищення 10 000 об'єктів, можливо, він навчиться
  • декілька / всі вони вище :)

3

Прийняття рішення звільнити когось - важке рішення для когось. Ваша ситуація, однак, складається з декількох факторів:

  1. Виявляється, цей розробник був у компанії кілька років
  2. Розробник пише всім кодам компанії C ++
  3. Виявляється, раніше ви ніколи ще не обговорювали рівень поганого коду з розробником
  4. Як новий менеджер, ви не маєте уявлення про те, хто / що розробник знає в / про компанію та які політичні наслідки звільнення розробника.

Це означає, що ви витратили останні 6 місяців, показуючи розробнику помилку його способів, і його новий код ще не покращився.

На цьому етапі вам дійсно потрібно почати деяке проактивне управління, щоб протягом 3 місяців у вас було

  • Гідний програміст на C ++, який знає, що робить

або

  • Припинено розробника.

Для цього, хоча вам потрібно сісти з розробником, поясніть, що не так у письмовій формі / електронному листі, поясніть, як розробник може покращитись і дуже чітко заявляйте, що якщо очікуване покращення не здійсниться, він буде припинений через 3 місяців.

Вам також потрібно бути чітко зрозумілим, що з цього моменту очікується покращення протягом усієї його роботи в компанії, а не лише на тримісячний період!

Ви також повинні повідомити про це власного менеджера та відділ кадрів (за наявності).

Під час цього процесу вам доведеться активно керувати розробником та переглядати завдання / код кожні 1-2 дні та стежити за тим, щоб вони не надходили, деталізуючи ті, що їх немає, та поясніть, що можна зробити для їх вдосконалення.


1

Або вам не було зрозуміло, наскільки серйозно ви ставитеся до його поганої роботи (тобто можливо, він бачить, який час ви провели з ним як варіант, якщо він хоче покращити, а не абсолютну необхідність), або він неймовірно поганий ставлення, яке нестійке. Якщо для цього розробника вже не зрозуміло, що ви розглядаєте його позицію щодо цього питання, тоді це потрібно прописати (якщо припустити, що у вас лідерство нормально, якщо ваші повноваження припинятимуться). Шок, сподіваємось, призведе до змін.

Рішення про працевлаштування має набагато ширші наслідки, ніж тільки для цього хлопця, вам потрібно врахувати вплив на команду. Якщо його ставленню дозволено процвітати, воно може викликати або обурення оточуючих, або інші люди вважають, що подібні речі теж нормальні. З точки зору команди, має бути абсолютно зрозуміло, що якщо він пішов, то це було з правильних причин, і він мав достатньо можливостей для вдосконалення.

Один дорогоцінний камінь, який я взяв на курсі років тому, - це той факт, що люди, які мають технічні знання, яких у інших немає, можуть керувати керівництвом, щоб дати їм слабкість. Це погано для команди. Ви можете побоюватися втратити єдиного розробника c ++, але їх можна замінити. Очевидно, що притаманні ризики, якщо він добре знає випущену продукцію, але часто я бачив людей, які, здавалося б, незамінні продукти / технічні знання, замінюються легше, ніж передбачалося. Команди та організації часто можуть заповнювати прогалини, які спочатку здаються важкими для заповнення. Звичайно, якщо він не володіє навичками c ++ або специфічними для організації знаннями, які, на вашу думку, буде важко замінити, проблем набагато менше!


1
Я підозрюю, що цей хлопець мав би бути абсолютно здивованим, дізнавшись, що його менеджер думає звільнити його. Деякі люди, яким ви просто повинні вдарити по голові дошкою і розправити, говорять їм, що вони повинні покращитися, або вони будуть звільнені.
HLGEM

0

Звичайно, не слід. Пам'ятайте, це не благодійність, ви обмінюєте гроші на роботу. Якщо він не тримає свою сторону угоди, то, як і будь-яку транзакцію, я б перестав платити.


-1

Якщо ви хочете дати йому шанс, розробіть стандартизований тест, який збирає метрики щодо витоку пам'яті. Щотижня контролюйте його прогрес, наполягаючи на тому, щоб побачити код, який він змінив, і шукати вдосконалення. Якщо він не зможе впоратися в цей момент, звільнити марну підказку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.