Стимулювання періоду часу, коли кожен може спробувати будь-які ідеї, щоб зробити програмне забезпечення швидшим?


17

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

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

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

Які методи дозволять нам швидко спробувати ідею оптимізації? Чи потрібна швидка швидкість кодування для отримання хороших результатів від тестування?

Нарешті, скільки "часу" слід виділити для забезпечення хороших результатів, не створюючи можливості відшаровування?

Чи потрібні експерименти, щоб довести, що "швидший спосіб зробити щось" існує? (Додано 2011-06-07)

Пов'язані:

(Тільки для цілей винагороди - -2011/06/07, розмір команди - 2-4 розробники, не призначений QA. Весь код, тест одиниць і тест на продуктивність, зроблений розробниками. Через характер проекту результат профайлера корисний для показу пропорційний час виконання, навіть якщо він не виявляє жодного вузького місця.)


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

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

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

Відповіді:


21

Ваша найкраща ставка - визначити гарячі точки з профілером та - як команда - обговорити, як виправити точки доступу.

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

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


6

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

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

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


1

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


1

Однією успішною практикою, яку ми провели в деяких моїх попередніх командах, було те, що ми мали концепцію Deep Dives. Кілька людей зібралися б у конференц-залі, визначились із певним сценарієм користувача та почали або переглядати код, або переглядати журнали профілю. У деяких випадках дані чітко показували вузькі місця, що дозволяло переконати скептиків у тому, що дійсно існували проблеми з перф у власному коді! Щоб зробити це успішним, ми дотримувалися деяких ключових положень:

  1. Постарайтеся зосередитись на критичних сценаріях або кодових шляхах, де підозра на вузькі місця. Не витрачайте час на оптимізацію матеріалів, які не потрібно оптимізувати (якщо вони не зламаються ...)
  2. Тримайте групу невеликою та зосередженою на тих, хто найкраще знає код. Не забудьте включити тестер і програмний менеджер функції - вони мають ключову інформацію та можуть отримати користь від участі або збору інформації для того, як вони можуть перевірити краще.
  3. Почніть сеанс, давши власнику області дати діаграму рівня архітектурного блоку високого рівня та огляд місцевості. Назвіть ключові компоненти та коротко опишіть, що вони роблять. Ви здивуєтеся, скільки разів блок-схема не відображала реальність, коли ми вкопалися в код. (Фактична цитата: "Я не знав, що ми все ще використовуємо цей компонент. Я думав, що ми позбулися цього року тому!")
  4. Очікуйте знайти функціональні помилки, а також проблеми з перф. Це гарна річ. Також очікуйте, що іноді ви не знайдете нічого важливого. Це теж може бути хорошою справою.
  5. Очікуйте на кілька довгих сеансів. Це робочі зустрічі. Будьте комфортні і працюйте над цим. Ви набагато більше зробите, коли всі зможете співпрацювати протягом тривалих розтяжок.
  6. Робіть замітки, хороші записки. Якщо ви використовуєте базу даних відслідковування дефектів, розгляньте питання про відкриття негайно для відстеження, навіть якщо вони мають низький пріоритет.

Уникайте участі всієї команди в "Push Push". Зазвичай вони не мають результатів, яких очікує керівництво з причин, про які Торбьорн Равн Андерсен згадував в іншій відповіді. Ви отримаєте великі вигоди в деяких областях, регресії в інших областях, де люди не знайомі, і важко передбачити / відстежити, скільки ви отримаєте, щоб сказати "ви зробили". Це складна розмова з керівництвом.


0

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

... І щоб виконати завдання, в цьому порядку є два етапи:

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

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


0

Взагалі (**) ви не отримаєте кращих показників експериментів.

Ви отримуєте це

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

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

Перевірте цю відповідь на ваше інше запитання.

** Винятками можуть бути жорсткий залежний від апаратного коду код, наприклад, перегляд графіки, конвеєр процесора чи поведінка CUDA або експерименти з мережевими або протоколами БД, де просто потрібно ознайомитися з найкращим способом його використання.

ДОБАВЛЕНО: Є багато чого, що багато програмістів великих систем вважають дивовижним. Це те, що у великих ідеально добре побудованих програмах можуть виникнути великі невидимі проблеми з продуктивністю, і профілі не можуть їх знайти, оскільки вони не локалізовані підпрограми. Вони є частиною загальної структури програми, навіть якщо програма може бути виконана в найкращому стилі.

Просто, щоб навести конкретний приклад, ось програма з вихідним кодом (на C ++), яка виконує роботу. Це дистильована з реальної програми С, над якою я працював.

Він робить те , що він мав намір зробити, але то , що частину свого пір не на самому ділі потрібно? На скільки це можна було пришвидшити?

Що ж, у першій версії програми щось ідеально розумне та нелокальне (невидиме для профілера) займало 33,3% часу. Коли його замінили, цей час було збережено, і це була друга версія програми.

У другій версії програми щось інше (невидиме для будь-якого профілера), яке можна було видалити, займало 16,7% часу. Видалення призвело до версії 3.

У версії 3 було видалено 13%. З того, що залишилося, було видалено 66%. З того, що залишилося після цього, було видалено 61%!

Потім, нарешті, із того, що залишилося після цього, було видалено 98%!

То яка велика картина? З кожних 1000 циклів, проведених за початковою програмою, скільки було видалено? 998!

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


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

@ Thorbjørn: Це все в проекті, підсумоване у слайд-шоу PDF, і, як я вже сказав, кожна програма відрізняється. Єдине, що саме - метод.
Майк Данлаве
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.