Я ставлю це питання програмістам на 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 було скопійовано. І - тільки стає краще - він повторив ту саму схему на трьох інших класах, тож це не одноразовий підсумок. Вся концепція помилкова на стільки рівнях.
Я почував би більше розуміння, якби це походило від тотального послушника. Але цей хлопець займався цим вже багато років і протягом останніх кількох місяців дуже акцентував навчання та поради. Я усвідомлюю, що він працював без наставництва чи рецензування у більшій частині цього часу, але я починаю відчувати, що він не може змінитися. Отже, моє запитання, чи наполягаєте ви на тому, хто пише такий очевидно поганий код?