Чи варто жертвувати читабельністю коду тим, наскільки ефективний код? [зачинено]


37

Чи варто жертвувати читабельністю коду тим, наскільки ефективний код?

наприклад, 3 рядки коду в 1 рядок.

Я читав у Code Craft Піта Гудліффа, що читабельність є ключовою.

Ваші думки?


13
Чому ви вважаєте, що код з меншою кількістю рядків, ймовірно, більш ефективний? Це рідко трапляється з сучасними мовами, хоча це може застосовуватися до 8-бітових інтерпретаторів BASIC.
Девід Торнлі

69
Ні читаність, ні продуктивність не вимірюються рядками.

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

1
Відповідна відповідь: programmers.stackexchange.com/questions/39047/…
Ніколь

Я б завжди підтримував читабельність, поки продуктивність не стане проблемою. Тоді я б почав турбуватися про це.
Піт

Відповіді:


62

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

Програми повинні бути написані для того, щоб люди могли читати, і лише випадково для машин для виконання.

-Абелсон і Суссман, структура та інтерпретація комп'ютерних програм

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

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


3
+1 Є зменшення прибутку, але я також виявив, що коротку програму взагалі легше читати, ніж довгу.
Майкл К

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

1
Я згоден з Ватином. Коли-небудь повертайтеся назад і намагайтеся з'ясувати те, що ви колись вважали "ідеально зрозумілим" шляхом назад?
Wonko the Sane

+ 1 для SICP. Дивовижна книга.
Джейсон Йео

30

Іноді так.

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

Для прикладу останнього дивіться статтю " Швидкий зворотний квадрат" у Вікіпедії.

Я, як правило, вважаю, що краще зробити щось читабельне спочатку і хвилюватися про продуктивність після того, як будуть вжиті заходи щодо здорового глузду, такі як не вибір алгоритму O (n ^ 2) над O (n). На мою думку, жертва читанні лише заради стислості є помилковою.


4
Я думаю, що може бути різниця між "читабельним кодом" та "знанням алгоритму". Я думаю, що будь-який код, якщо ви не знаєте алгоритму, буде більш-менш важким для читання та розуміння. Наприклад, у згаданому випадку FISR, звичайний код насправді є досить читабельним, але алгоритм не задокументований. Якби ви знали FISR-алгоритм, наскільки читабельніше ви могли б написати код? Можливо, тісно пов'язане питання: коли вибрати химерний алгоритм?
Маглоб

@Maglob Я спеціально мав на увазі використання 0x5f3759df. Без огляду на продуктивність, ви можете використовувати реалізацію алгоритму ISR, використовуючи регулярний поділ, який, ймовірно, буде більш читабельним для людини, менш знайомої з комп'ютерними внутрішніми системами.
Адам Лір

3
Це, можливо, може бути виражене як "Іноді правильно замінити наївний алгоритм, виражений у 5 рядках коментарів та 20 рядків коду, на складний алгоритм, виражений у 15 рядках коментарів та 5 рядках коду".
Пітер Тейлор

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

одне з чудес Інтернету -> при впровадженні складного алгоритму (наприклад: відстань Левенштейна з діагональною оптимізацією ... я саме над цим працюю;)) можна або посилатися на статтю, або навіть копіювати статтю в документації проекту та покласти в код посилання. Таким чином, люди, які знають алгоритми, просто слідують за коментарями, які пояснюють конкретні тести / оптимізації, тоді як початківцям спочатку доведеться прочитати про алгоритм, а потім повернутися до реалізації.
Матьє М.

22

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

Це не говорить про те, що перезапис повинен бути, звичайно, нечитабельним.


22

Я цитував це раніше , і я його цитую ще раз:

Зробіть це правильним,
поясніть,
зробіть лаконічним,
зробіть це швидким.

У тому порядку.

Уес Дайер


2
+1 Я швидко прокручував униз, щоб переконатися, що ця цитата включена. Тепер мені не потрібно ставити відповідь. :-)
RationalGeek

9

Чи варто жертвувати читальністю коду тим, наскільки ефективний код?

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

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

На мій погляд, абсолютно немає приводу не мати декількох основних коментарів. Очевидно if ( x == 0 ) /* check if x is 0 */, абсолютно марно; не слід додавати зайвий шум у код, але щось подібне:

; this is a fast implementation of gcd
; in C, call as int gcd(int a, int b)
; args go in rdi, rsi, rcx, r8, r9
gcd:
    push rdp
    ; ...

Це дуже корисно.


6

Чи варто жертвувати читальністю коду тим, наскільки ефективний код?

Якщо ефективність - ваша поточна мета (як, наприклад, на етапі оптимізації), і ви знаєте - у вас є показники, чи не так? - що рядки коду є поточним вузьким місцем, тоді так.

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


4

Ніхто не виграє Code Golf

наприклад, 3 рядки коду в 1 рядок

Особливо страшна ідея.

Вартість гри в код-гольф - дуже висока.

Вартість на підтримку нечитабельних програм - астрономічні.

Значення цього виду мінімізованого коду - нуль. Він все ще працює, але не працює «краще».

Мудро вибрана ефективність

Вартість на вибір правильного алгоритму та структури даних - помірна.

Вартість підтримки правильного алгоритму та структури даних - низька.

Значення правильного алгоритму та структури даних - високе. Використання ресурсів низьке.

Дурне ("мікрооптимізація") Ефективність

Вартість на мікрооптимізацію - висока.

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

Значення мікрооптимізації - варіюється. Коли тут є нульове значення, витрати все ж переважають його.


2

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

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



2

Я не приймаю аргумент "читабельність над ефективністю". Дозвольте дати вам відповідь з іншим спіном.

Деякі передумови: Ви знаєте, що мене нудить? Коли я двічі клацну на "Моєму комп'ютері", і мені доводиться чекати, поки він заповниться. Якщо це займе більше 5 секунд, я дуже засмучуюся. Дурне, і не просто звинувачуйте Microsoft у цьому, це те, що в деяких випадках причина цього займає так довго, що потрібно приймати рішення про те, який значок показувати! Це вірно. Тож ось я сиджу, цікаво лише зайти до свого C: диска, і мені доведеться чекати, коли драйвер отримає доступ до мого компакт-диска та прочитає піктограму звідти (якщо припустити, що в диску є компакт-диск).

ДОБРЕ. Тож на секунду уявіть всі шари між мною, двічі клацнувши на Мій комп'ютер, і він насправді розмовляє через драйвери на компакт-диску. А тепер уявіть, що кожен шар був ... швидшим ...

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

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


"Добре. Тож на секунду уявіть, що всі шари між мною двічі клацніть на" Мій комп'ютер ", і він насправді розмовляє через драйвери на компакт-диску. Тепер уявіть, що кожен шар був ... швидшим ..." миттєвим для мене з 2 DVD Диски
Рангорік

Одне слово: Upgrade
jmort253

2
Хлопці, працюйте зі мною тут, це ілюстрація ...
Мальтрап

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

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

2

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

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


1

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

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

Хороший приклад - ім’я змінної: $a

Що таке $a?? Це поза контекстом, тому ви не можете на це відповісти, але чи стикалися ви з цим у фактичному коді? Тепер припустимо, що хтось написав $file_handle- тепер що це? Це зрозуміло навіть поза контекстом. Довжина імені змінної робить незначну різницю для комп'ютера.

Я думаю, що тут є здоровий глузд.

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

* це залежить від промисловості та інших подібних речей. Я дивлюся на це з точки зору розробника бізнес-програмного забезпечення (Business Information Systems).


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

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

Тож на практиці я думаю, що ви швидше зашкодите собі чи іншим ... (я б швидше повернувся до вихідних.)


1

У більшості випадків відповідь - "Довіряйте вашому компілятору виконувати свою роботу" та пишете код, який можна прочитати. Це означає, що код є логічно структурованим (тобто відсутні спагетті) та самодокументуванням (тобто досить чіткими назвами змінних, функцій тощо). Код доповнення, який не документально підтверджений змістовними коментарями. Не коментуйте заради коментування, тобто

x++; // Add one to x

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


+1 для "Довіряйте своєму компілятору робити його". Це мій новий коментар Skype.
jmort253

0

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

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

Коли я працюю над якоюсь продуктивністю, такою як графіка, я час від часу жертвую читабельність / ремонтопридатність, коли роблю такі речі, як обробка зображень, коли я працюю над найглибшими вкладеними алгоритмами, де невеликі оптимізації можуть мати великий вплив. І навіть тоді я це роблю лише після профілювання, щоб переконатися, що зміни насправді пришвидшили. Я не можу сказати вам, скільки разів я пробував «оптимізацію», кодовану рукою, лише щоб виявити, що це насправді сповільнило додаток через те, що компілятор оптимізував рукописний код.


-1

Читання - це привід для некомпетентних та ледачих програмістів (насправді те саме стосується "простоти", коли використовується як аргумент для захисту хитрого алгоритму / дизайну)!

Для кожної заданої проблеми слід прагнути до оптимального рішення! Те, що комп’ютери сьогодні швидкі, не є приводом для того, щоб витрачати цикли процесора. Єдиним обмеженням має бути "час доставки". Зауважте, що "оптимальне рішення" означає те, що ви можете придумати (ми не всі можемо придумати найкраще рішення; або маємо навички / знання для їх реалізації).

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

Мені справді важко повірити, що там є програмісти, які, коли постають перед проблемою, думають у рядках "... це потрібно зробити так, але я зроблю такий спосіб менш ефективним, але читабельнішим / ремонтовані та інші подібні лайно ... ". Помилковість цього полягає в тому, що наступний розробник (бачачи неефективність), швидше за все, модифікує код, а наступний зробить те саме і так далі ... Кінцевий результат полягає в тому, що після кількох версій код стане тим, що початковий розробник повинен був написати на 1-му місці. Єдиним приводом для оригінального розробника є. він / вона не думав про це (досить справедливо) та (як згадувалося раніше) b. обмеження часу та ресурсів.


-2

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

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