Якщо коротко: це залежить
У подробицях
Вам потрібні будуть очищені, блискучі речі?
Тут слід бути обережними, і вам потрібно визначити межу між реальним, вимірюваним виграшем і тим, що є лише вашими особистими уподобаннями та потенційною шкідливою звичкою торкатися коду, якого не повинно бути.
Більш конкретно, знайте це:
Це анти-шаблон, і він поставляється з вбудованими проблемами:
- він може бути більш розтяжним , але може не бути простішим ,
- це може бути не простіше зрозуміти ,
- останнє, але, безумовно, не в останню чергу тут: ви можете уповільнити весь код.
Дехто також може згадати принцип KISS як орієнтир, але тут це контрінтуїтивно: чи оптимізований спосіб простий спосіб чи чіткий архітектурний шлях? Відповідь не обов’язково абсолютна, як пояснено у решті нижче.
Принцип YAGNI не є повністю ортогональним з іншим питанням, але він допомагає задати собі питання: чи вам це потрібно?
Чи справді більш складна архітектура для вас приносить користь, окрім того, що виглядає як більш доглянута?
Напишіть це на великому плакаті і повісьте його біля екрана або на кухонній зоні на роботі, або в залі для засідань розробників. Звичайно, існує багато інших мантр, які варто повторити, але саме ця важлива, коли ви намагаєтесь виконати "роботи з технічного обслуговування" і відчуєте потяг "вдосконалити" її.
Нам природно, що ми хочемо "вдосконалити" код або навіть просто торкнутися його, навіть несвідомо, коли ми читаємо його, щоб спробувати його зрозуміти. Це добре, адже це означає, що ми впевнені в собі і намагаємося глибше зрозуміти внутрішнє, але це також пов'язане з нашим рівнем кваліфікації, нашими знаннями (як ви вирішите, що краще чи ні? Ну, дивіться розділи нижче ...), і всі припущення, які ми робимо про те, що ми думаємо, що ми знаємо програмне забезпечення ...:
- насправді так,
- насправді потрібно робити,
- врешті-решт потрібно буде зробити,
- і як добре це робить.
Чи справді її потрібно оптимізувати?
Все це говорило, чому в першу чергу це було «оптимізовано»? Вони кажуть, що передчасна оптимізація - корінь усього зла, і якщо ви бачите недокументований і, здавалося б, оптимізований код, зазвичай ви можете припустити, що він, ймовірно, не дотримується Правил оптимізації , не дуже дорого потребує зусиль з оптимізації, і що це просто звичайний голос розробника починає бити. Знову ж таки, можливо, це зараз тільки ваше.
Якщо це так, то в яких межах це стає прийнятним? Якщо в цьому є потреба, цей ліміт існує і дає вам можливість вдосконалити речі, або жорстку лінію, щоб вирішити його відпустити.
Також остерігайтеся невидимих характеристик. Швидше за все, ваша "розширювана" версія цього коду ви також збільшите більше пам’яті під час виконання, і представите ще більший слід статичної пам'яті для виконуваного файлу. Блискучі функції OO мають такі неінтуїтивні витрати, як ці, і вони можуть мати значення для вашої програми та середовища, на якому вона повинна працювати.
Міряти, міряти, міряти
Як зараз Google, це все про дані! Якщо ви можете створити резервну копію даних, то це необхідно.
Існує ця не така давня казка, що за кожні 1 долар, витрачений на розробку, буде проведено щонайменше 1 долар на тестування і хоча б 1 долар підтримки (але насправді це набагато більше).
Зміни впливають на багато речей:
- вам може знадобитися виготовити нову збірку;
- ви повинні написати нові тестові одиниці (безумовно, якщо таких не було, а ваша більш розширювана архітектура, ймовірно, залишає місце для більше, оскільки у вас більше поверхні для помилок);
- ви повинні написати нові тести на ефективність (щоб переконатися, що це залишатиметься стабільним у майбутньому, і побачити, де є вузькі місця), і це складно зробити ;
- вам потрібно буде документувати його (і більш розширюваний означає більше місця для деталей);
- вам (або комусь іншому) потрібно буде провести ретельний тест на якість;
- код (майже) ніколи не буває помилок, і вам потрібно буде його підтримати.
Отже, тут потрібно вимірювати не лише споживання апаратних ресурсів (швидкість виконання або слід пам’яті), це також командне споживання ресурсів . І те й інше потрібно передбачити, щоб визначити цільову мету, виміряти, врахувати та адаптувати на основі розвитку.
А для вас, менеджер, це означає вписати його в поточний план розвитку, тому повідомте про це і не потрапляйте в люте кодування хлопчика / підводного човна / чорного типу.
Загалом...
Так, але...
Не зрозумійте мене неправильно, загалом я б прихильнився зробити те, чому ви пропонуєте, і я часто виступаю за це. Але вам потрібно знати про довгострокову вартість.
У ідеальному світі це правильне рішення:
- комп'ютерне обладнання з часом покращується,
- компілятори та платформи виконання з часом покращуються,
- ви отримуєте близький до досконалого, чистий, підтримуваний та читабельний код.
На практиці:
ви можете зробити це гірше
Щоб переглянути це, вам потрібно більше очних яблук, і чим більше ви його комплексуєте, тим більше очних яблук вам потрібно.
Ви не можете передбачити майбутнє
Ви не можете з абсолютною впевненістю знати, чи вам це коли-небудь знадобиться, і навіть якщо "розширення", які вам знадобляться, було б легше і швидше реалізувати в старій формі, і якщо самі повинні бути супер-оптимізовані .
з точки зору керівництва, це представляє величезну вартість без прямого виграшу.
Зробіть це частиною процесу
Ви згадуєте тут, що це досить мала зміна, і ви маєте на увазі деякі конкретні проблеми. Я б сказав, що в цьому випадку це нормально, але у більшості з нас є також особисті історії про невеликі зміни, майже хірургічні редагування, які врешті-решт перетворилися на кошмар технічного обслуговування та майже пропущені або порушені терміни, оскільки Джо Програміст не бачив цього причини цього коду та торкнулися чогось, чого не повинно було бути.
Якщо у вас є процес вирішення таких рішень, ви приймаєте їх особисту перевагу:
- Якщо ви тестуєте речі правильно, ви швидше дізнаєтесь, чи все порушено,
- Якщо виміряти їх, ви дізнаєтесь, чи покращилися вони,
- Якщо ви переглянете його, то дізнаєтесь, чи він відкидає людей.
Покриття тестування, профілювання та збір даних є складними
Але, звичайно, ваш тестовий код та показники можуть страждати від тих самих проблем, які ви намагаєтеся уникати для свого фактичного коду: чи ви перевіряєте правильні речі, чи вони є правильною справою для майбутнього, і чи вимірюєте ви правильність речі?
І все-таки загалом, чим більше ви тестуєте (до певної межі) і вимірюєте, тим більше даних збираєте і тим безпечніші. Поганий час аналогії: подумайте про це як за кермом (або життям загалом): ви можете бути найкращим водієм у світі, якщо машина зламається на вас або хтось вирішив вбити себе, в’їхавши у свій автомобіль зі своїм сьогоднішнім, вашим навичок може бути недостатньо Є як екологічні речі, які можуть вас вразити, так і людські помилки також мають значення.
Огляди коду - це тестування передпокою Команди розвитку
І я думаю, що остання частина тут є ключовою: робіть огляди коду. Ви не знаєте цінності ваших удосконалень, якщо зробите їх сольними. Огляди коду - це наше «тестування на коридорі»: дотримуйтесь версії Закону Лінуса Реймонда як щодо виявлення помилок, так і для виявлення над інженерних та інших анти-шаблонів, а також для того, щоб код відповідав можливостям вашої команди. Немає сенсу мати "найкращий" код, якщо ніхто інший, крім вас, не може зрозуміти і підтримувати його, і це стосується як критичних оптимізацій, так і 6-шарових глибоких архітектурних конструкцій.
Як заключні слова, пам’ятайте:
Всім відомо, що налагодження вдвічі складніше, ніж написання програми в першу чергу. Отже, якщо ви настільки розумні, як ви можете бути, коли пишете це, як ви коли-небудь налагодите це? - Брайан Керніган