Я думаю, що важко досягти всіх трьох. Два, на мою думку, можуть бути здійсненими. Наприклад, я думаю, що можливо досягти ефективності та читабельності в деяких випадках, але можливість ремонту може бути важким з мікронастроенним кодом. Найбільш ефективному коду на планеті, як правило, не вистачає як ремонтопридатності, так і читабельності, що, мабуть, очевидно для більшості, якщо ви не такий, який може зрозуміти ручний SoA-векторизований багатопотоковий код SIMD, який Intel пише з вбудованою збіркою, або найрізніший алгоритми обробці даних, що використовуються в галузі, з 40-сторінковими математичними документами, опублікованими лише 2 місяці тому, та 12 бібліотеками, що кодуються для однієї неймовірно складної структури даних.
Мікроефективність
Я б припустив, що це може суперечити загальноприйнятій думці - це те, що найрозумніший алгоритмічний код часто важче підтримувати, ніж найпростіший мікро-налаштований алгоритм. Ця ідея про те, що поліпшення масштабованості приносить більше ударів за долар над мікронастроенним кодом (наприклад: зручні в кеші шаблони доступу, багатопотоковість, SIMD тощо) - це те, що я викличу, принаймні працюючи в галузі, наповненій надзвичайно складною структури даних та алгоритми (візуальна галузь FX), особливо в таких областях, як обробка сітки, тому що вибух може бути великим, але долар надзвичайно дорогий, коли ви впроваджуєте нові алгоритми та структури даних, про які ще ніхто не чув, оскільки вони бренд нові. Далі я
Тож ця ідея, що алгоритмічна оптимізація завжди козирна, скажімо, оптимізація, пов'язана з моделями доступу до пам’яті, - це завжди те, з чим я не дуже погоджувався. Звичайно, якщо ви використовуєте міхурний сорт, жодна кількість мікрооптимізації не може вам тут допомогти ... але всередині розуму, я не думаю, що це завжди так чітко. І, певно, алгоритмічну оптимізацію важче підтримувати, ніж мікрооптимізацію. Мені було б набагато легше підтримувати, скажімо, Embree Embree, який використовує класичний і простий алгоритм BVH і просто мікронастроює лайно з нього, ніж код OpenVDB Dreamwork для передових шляхів алгоритмічного прискорення моделювання рідини. Тож хоча б у своїй галузі я хотів би бачити більше людей, які знайомі з мікрооптимізацією архітектури комп’ютера, як Intel, коли вони вийшли на сцену, на відміну від створення тисяч і тисяч нових алгоритмів та структур даних. Завдяки ефективним мікрооптимізаціям люди можуть потенційно знайти все менше і менше причин для створення нових алгоритмів.
Я працював у застарілій базі даних коду, коли майже кожна операція користувача мала власну унікальну структуру даних та алгоритм (додаючи до сотні екзотичних структур даних). І більшість з них мали дуже перекошені експлуатаційні характеристики, оскільки були дуже вузько застосовними. Це було б набагато простіше, якби система могла обертатися на пару десятків більш широко застосовуваних структур даних, і я думаю, що це могло б бути, якби вони були мікрооптимізовані набагато краще. Я згадую цей випадок, оскільки мікрооптимізація може потенційно значно покращити ремонтопридатність у такому випадку, якщо це означає різницю між сотнями мікро-песимізованих структур даних, які навіть не можуть бути безпечно використані для суворих цілей лише для читання, які передбачають пропуски кешу, залишені та право проти
Функціональні мови
Тим часом деякі з найбільш досяжних кодів, з якими я коли-небудь стикався, були досить ефективними, але надзвичайно важко читатими, оскільки вони були написані функціональними мовами. Взагалі читабельність та ремонтопридатність uber - це суперечливі ідеї.
Насправді важко зробити код читабельним, бездоганним та ефективним. Зазвичай вам доведеться трохи піти на компроміс в одному з цих трьох, якщо не двох, як, наприклад, компрометація читабельності для ремонтопридатності або компрометація ремонту для підвищення ефективності. Зазвичай це ремонтопридатність страждає, коли ти шукаєш багато інших.
Читання та ремонтопридатність
Як уже було сказано, я вважаю, що читабельність та ремонтопридатність не є гармонійними поняттями. Зрештою, найбільш читаний код для більшості з нас смертних дуже інтуїтивно відображає людські думки, а людські думки мають властиві помилки: " Якщо це станеться, зробіть це. Якщо це станеться, зробіть це. Інакше зробіть це. На жаль , Я щось забув! Якщо ці системи взаємодіють одна з одною, це має статися, щоб ця система могла це зробити ... о, зачекайте, що з цією системою, коли ця подія запускається?"Я забув точну цитату, але хтось одного разу сказав, що якби Рим був побудований як програмне забезпечення, знадобиться лише птах, що висаджується на стіну, щоб її знищити. Такий випадок з більшою частиною програмного забезпечення. Це більш крихко, ніж ми часто дбаємо про те, щоб Подумайте. Декілька рядків, здавалося б, нешкідливих кодів тут і там можуть зупинити його до того, щоб змусити нас переглянути весь дизайн, а мови високого рівня, які мають на меті бути максимально читабельними, не є винятком із таких помилок дизайну людини. .
Чисті функціональні мови приблизно настільки ж близькі до невразливих до цього, як це можна отримати (навіть не близькі до невразливих, але відносно набагато ближчі, ніж більшість). І це частково тому, що вони не інтуїтивно відображають людську думку. Вони не читаються. Вони змушують нас мислити, що змушує нас вирішувати проблеми з якомога меншими випадками, використовуючи мінімально можливий обсяг знань і не спричиняючи побічних ефектів. Вони надзвичайно ортогональні, вони дозволяють коду часто змінювати та змінювати без сюрпризів, настільки епічного, що нам доведеться переосмислити дизайн на кресленні дошки, навіть до того, щоб змінити свою думку про загальний дизайн, не переписуючи все. Здається, це не легше підтримувати, ніж це ... але код все ще дуже важко читати,