Спілкуючись із розробником, постійно ігноруючи крайові випадки у своїй роботі


25

У мене є цікава, досить поширена, напевно, проблема з одним із розробників моєї команди. Хлопець - чудовий розробник, працює швидко і продуктивно, виробляє досить гарну якість і все. Хороший інженер. Але з ним є проблема - дуже часто він не вдається розглянути крайові випадки у своєму коді.

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

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


11
Попросіть когось покрити його код одиничними тестами.
Робота

8
Найкраще кваліфікована особа для тестування коду - його автор.

16
@Developer Art: Повністю не згоден. Найгірша людина, яка зробила тестування коду, - це людина, яка розробила цей код. У кожного є сліпі плями, але людина, яка творить, має найбільшу сліпу пляму стосовно свого коду.
Джеймс П. Райт

2
@Developer Art: Я вважаю, що написання автоматизованих тестів насправді є досить поширеною роллю. Зазвичай це щось, що ви робите протягом року-двох, якщо ви не зовсім готові до пройм-тайму в компанії, в якій ви перебуваєте. Це свого роду чистильний період.
Морган Херлокер

19
Ви описуєте його як "великого розробника", "продуктивного", "хорошого інженера" ​​і виробляє "код хорошої якості". Але QA продовжує знаходити проблеми з його роботою. Чи справді ви використовуєте ці терміни, щоб описати того, хто регулярно і послідовно вводить дефекти у свій код? Мені цікаво, чи є в цій історії більше, оскільки опис особистості як професіонала та роботи, яку вони роблять, зовсім не відповідають
Томас Оуенс

Відповіді:


29

Попросіть його написати автоматичні одиничні тести для свого коду. Написання одиничних тестів змушує задуматися над кращими справами.

Деякі відомості:

  1. Щоб він не відчував себе відокремленим, це потрібно створити для всієї вашої команди. Потрібно від усіх написати автоматизовані тести на одиницю для нового коду чи коду, які вони модифікують.
  2. Потрібно, щоб назви одиничних тестів були описовими щодо випадку, який вони перевіряють.
  3. Покрийте тести автоматизованих одиниць у огляді коду на високому рівні. Нехай рецензенти шукають пропущені тестові справи (тобто ті крайові випадки, які він постійно пропускає). Після деякої кількості відгуків від його команди про пропущені крайові справи, він, ймовірно, навчиться розглядати їх перед оглядом.
  4. Застосовуйте це правило для всієї команди: Якщо QA виявляє помилку, відповідальний розробник зобов'язаний автоматизованому тестуванню, який підтверджує збій, а потім доводить, що вони його виправили. (перш ніж робити будь-яку іншу роботу)

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

@George Гарна ідея. TDD допоможе тут ще більше.
Матвій Родатус

3
Тестування підрозділу не стосується пошуку помилок - blog.stevensanderson.com/2009/08/24/…
Dainius

1
@Dainius Я згоден. Тестування блоку полегшує розробнику продумати крайові випадки, що може запобігти (але не визначити) помилки.
Матвій Родатус

After some amount of feedback from his team about missed edge cases, he will probably learn to consider thoseРозробники, які мають погану практику, часто стверджують про невідповідність додаткових зусиль, необхідних для належної практики (оскільки вони не бачать користі від цього). Хоча розробник може погодитися, коли ви додаєте додаткові крайові регістри, це не означає, що він вважає, що це актуально, чи не збирається він їх додавати сам.
Флатер

23

Дайте йому контрольний список, наприклад

  • нульові входи
  • входи в надзвичайно великому кінці діапазону
  • входи в крайньому малому кінці діапазону
  • комбінації
  • входи, що порушують припущені інваріанти (наприклад, якщо x = y)

Люди з питань якості можуть допомогти розробити контрольний список

Надайте контрольний список усім розробникам, а не лише цьому.


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

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

@ Алекс: контрольні списки - звичайна практика для одних розробників, і жахлива образа для інших. Спробуйте і подивіться, що станеться. Якщо він відмовиться, то якість вашого кодексу покращиться ;-)
Стівен А. Лоу

4
Ваші розробники не використовуватимуть контрольні списки? Якщо контрольний список міг би врятувати життя, чи використовували б вони їх? Багато лікарів цього не роблять, а пацієнти страждають. Читайте це: newyorker.com/reporting/2007/12/10/071210fa_fact_gawande
Баррі Браун

1
@Barry, я не сказав, що не буде. Контрольні списки в цьому випадку звучать, IMHO, як засіб проти симптомів проблеми, а не до самої проблеми. Проблема - дисципліна та старанність у цьому випадку. Якщо проблема полягає у складності системи, яка вимагає аварійного обслуговування з високим ступенем відповідальності та напруженості, це призводить до погіршення рівня уваги до деталей, то так, контрольні списки ftw (пілоти, лікарі тощо). Але це більше філософської дискусії, мабуть, поза межами цього питання.
Олексій Н.

17

Хороший інженер.

Гаразд.

Але з ним є проблема - дуже часто він не вдається розглянути крайові випадки у своєму коді.

Це якість, яку хороші інженери не поділяють.


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

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

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

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


6
+1 Це вміння, яке люди мають навчити бути хорошим програмістом. Однак я зазначу, що існують два типи крайових випадків: випадки, пов'язані з бізнес-вимогами ("Якщо ми замовимо 27 лівих тренерів і 28 правильних тренерів, то наказ, мабуть, неправильний"), які слід вирішити в проектних вимогах, і фактичні кодування крайових випадків (маючи справу з недійсними вводами, постійно повторюючи список, коли хештет був би більш розумним у швидкості, коли набір стає більшим, ніж x тощо), які є більш ніж то, про що ви просто повинні дізнатися.
Ед Джеймс

Дякую за розуміння. Дуже ціную це. Ви абсолютно праві на всіх фронтах тут, хоча мені цікаво, якщо він чудова людина, але просто не вистачає цього, що робить чудових інженерів чудовими, як я можу все-таки покласти його на іншу роботу і тримати його в організації, можливо перехід до іншої команди чи щось таке ... Хоча я думаю, що лише я можу відповісти на це питання :)
Алекс Н.

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

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

5

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


4

Навчіть його першим програмувати тест. Пара з ним. Ви напишете тестові випадки, і він напише код для проходження тестів.


3

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

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


3

Існує нескінченна кількість крайових справ, покриття їх усіх нездійсненно. Що робити, якщо хтось робить #define TRUE FALSE? Це додає крайові корпуси, чи ви їх також перевірите?

Крім того, я б не вважав дурним захист кожної функції приватного класу або внутрішньої функції.

Я вибрав підхід для коду, який повинен бути дуже міцним і стабільним:

if(conditions_met)
{
DoStuff();
}
else
{
CrashAppAndDumpMemory();
}

Таким чином ви отримуєте міцні демпінгові програми в QA, а до моменту виходу до програми додаток є надійним та безпечним.

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


#define ПРАВИЛЬНА ЛАЖА - це не кращий випадок, це звільнення від звільнення.
gnasher729

1

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

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

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


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

1
@Barry Brown Я погоджуюсь, що завжди існують крайові випадки, але є різниця між важливими крайовими справами, які зацікавлені сторони вважають важливими, які ми можемо назвати сценаріями та крайовими справами, які розробник вважає важливими. Якщо зацікавлений учасник вважає, що щось важливе, це слід обговорити на сесії планування і включити як сценарій в історію користувача, а не залишати розробника для роздумів, це повинно бути належною вимогою проти завдання. Це дуже трудомістко і не потрібно, а нульові перевірки параметрів для кожного непублічного методу.
Бронумський

1

Захоплення крайових випадків є причиною QA. Програмісти несуть відповідальність за своєчасну роботу. Витрачати весь свій час на пошуки крайових справ дуже неефективно. Якщо у вас досить швидкий ітераційний цикл, то це взагалі не повинно бути проблемою. Корпусні кромки близькі до нескінченної кількості. Якби це була проблема з "основними" випадками, я б трохи хвилювався. Так само, як розробники знають розробників, тестер повинен бути експертом у тестуванні. Коли тестер виявить проблему, вони надсилають її назад до розробки. Розробник виправляє проблему. Проблема вирішена. Час, щоб розробник відстежував кожен крайній випадок, значно довший, ніж повинен тривати цикл ітеративного тестування. Також зверніть увагу, коли я говорю про тестування, я маю на увазі не тести білого блоку, а строго чорні тести.


1
Це справді не правильна відповідь. Бути винагородженим за отримання половини якісної роботи - це погана практика. В цілому команда розробників повинна відповідати за високу якість роботи.
Девід

Гідному розробнику не потрібно шукати крайових справ. Деякий код написаний так, що він не має крайових регістрів, в інших випадках крайові випадки очевидні. Код, який не обробляє крайові регістри, є неповним кодом.
gnasher729

0

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

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