Коли ми повинні припинити роботу і зробити інструмент?


25

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

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



1
можливо, рефактор до інструменту і продовжувати працювати
Рей Тайек


1
Це XKCD в значній мірі, за винятком однієї речі: чи то час, який заощаджує інструмент, - це лише ваш власний, чи він множиться на велику базу користувачів у вашій організації або за її межами.
Каз

Відповіді:


27

Я "виготовляю інструменти", коли одна з них справжня:

  1. Завдання мене дратує
  2. Ризик людської помилки у завданні занадто великий

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

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

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


2
+1 за уникнення помилок, оскільки це більше, ніж зазвичай витрачається час проти часу, що економиться при виконанні.
k3b

1
Я додав би, "коли ви дуже часто повторюєте одне і те ж завдання". Мені, на диво, досить часто доводиться створювати випадковий рядок символів. Тож замість того, щоб написати фрагмент коду, щоб це зробити, я створив просту форму з кнопкою, щоб зробити це для мене
bsara

9

Маючи досвід, я виявив, що просто наполягати на бурхливій роботі, як правило, найбільш ефективно. Виготовлення інструменту часто спокушає. Я відмовляюся протистояти, коли:

  • Інструмент має кілька цілей. Хороший шахіст із кожним ходом домагався двох речей: блокував опонента та звільняв єпископа. Початківцю, мабуть, знадобляться два обороти для цього. Так само я вважаю, чи інструмент зробив би лише одне, або з невеликими додатковими зусиллями зробить два, наприклад, допоможе виправити декілька необроблених файлів даних, а також створити штучні тестові дані.
  • Майбутня корисність. Це може заощадити мені час для роботи на цьому тижні, але чи може це заощадити мені чи комусь час на новому проекті наступного тижня?
  • Настав час вивчити нову мову, бібліотеку, техніку дизайну чи що завгодно, і я маю час це зробити. Інструмент є сприятливим побічним ефектом робити щось освітою, використовуючи час, який вже надано на освіту.
  • Коли у нас виникають серйозні проблеми з налагодженням роботи. Як і парашути з парашутом, вам дійсно слід витратити час, щоб зробити або купити парашут. Якщо ви не можете отримати будь-яких значущих експериментальних результатів або новий веб-додаток взагалі не працюватиме, вам просто потрібно зупинитися і зробити або придбати інструмент для вимірювання того, що ви не можете бачити, керувати компонентами або замінити частину система. Коли робота повністю перестає потребувати інструменту, я не хвилююся майбутнім чи багаторазовим використанням. Необхідність важить досить.

3
"Інструмент має більше однієї мети", якщо вони насправді не застосовуються двома різними способами, на мій досвід, краще просто зробити два інструменти.
AJMansfield

5

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

На даний момент я не створюю повноцінний «інструмент», лише невеликий сценарій (зазвичай bash або python; perl теж буде працювати, або навіть PHP), який автоматизує те, що я робив раніше вручну. Це в основному застосування принципу DRY (або принципу "Єдине джерело правди", що по суті одне і те ж) - якщо вам доведеться змінити два вихідні файли в тандемі, має бути якась загальна правда, якою вони поділяються, і це істину потрібно враховувати і зберігати в одному центральному місці. Чудово, якщо ви можете вирішити це внутрішньо шляхом рефакторингу, але іноді це неможливо, і саме там входять спеціальні сценарії.

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

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

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

І тоді є ризик зробити це занадто пізно: легко переробити три абсолютно нові класи об’єкта даних у форму і написати сценарій, який генерує для них веб-форми, і як тільки ви це зробите, легко додати ще 27 класів, які також працюйте зі своїм сценарієм. Але писати цей сценарій майже неможливо, коли ви досягли точки, де існує 30 класів об'єктів даних, кожен із написаними вручну веб-формами, і без будь-якої послідовності між ними (він же "органічне зростання"). Підтримання цих 30 класів із їх формами - це кошмар багаторазового кодування та напівручного пошуку-заміни, зміна загальних аспектів займає тридцять разів довше, ніж слід, але написання сценарію для вирішення проблеми, що могло б стати перервою на обід, коли ніхто не подумав, коли проект розпочався, тепер це страхітливий двотижневий проект із жахливою перспективою місячного наслідку, що складається з виправлення помилок, навчання користувачів і, можливо, навіть здавання та повернення до стара база коду. За іронією долі, написання безладу в 30 класах зайняло більше часу, ніж чисте рішення, бо ви могли весь цей час їздити на зручному сценарії. На моєму досвіді, автоматизація повторної роботи надто пізно є однією з головних проблем у довготривалих великих програмних проектах. тому що ви могли весь цей час їздити на зручному сценарії. На моєму досвіді, автоматизація повторної роботи надто пізно є однією з головних проблем у довготривалих великих програмних проектах. тому що ви могли весь цей час їздити на зручному сценарії. На моєму досвіді, автоматизація повторної роботи надто пізно є однією з головних проблем у довготривалих великих програмних проектах.


4

Я просто згадав це:

xkcd - чи варто того часу?

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

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


1
Хороший! :-) Але заощаджений час може бути пов'язаний і з іншими завданнями - або тому, що інструмент можна використовувати для більшої мети, або через знання, які ви отримали під час написання інструменту.
Ганс-Пітер Стрер

3

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

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

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


2

Усі інші відповіді хороші, але я б додав ще одну причину, чому цінно витрачати час на створення невеликих інструментів (та налаштування ваших .vimrc, .emacs тощо):

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

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

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


1

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

Я використовую 2 обґрунтування, щоб підтримати це.

  • Це розширення принципу DRY. Якщо ми хочемо щось повторити, ручне зусилля - це найменш ефективне використання людських ресурсів.
  • Це ефективний спосіб записати те, що я зробив, тож якщо я щось побудував, то я (або хтось інший), можливо, захочу посилатися на те, як я це робив через кілька тижнів чи місяців, і він веде журнал роботи з проектом.

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

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