Я думаю, что трудно достичь всех трех. Два, я думаю, могут быть осуществимы. Например, я думаю, что в некоторых случаях возможно достичь эффективности и читабельности, но с микро-настройкой кода может быть затруднено сопровождение. Самый эффективный код на планете, как правило, испытывает недостаток как в удобстве сопровождения, так и в удобочитаемости, что, вероятно, очевидно для большинства, если только вы не из тех, кто понимает ручной векторизованный SoA-код многопоточного SIMD-кода, который Intel пишет со встроенной сборкой, или самый режущий Алгоритмы, используемые в промышленности, с 40-страничными математическими работами, опубликованными всего 2 месяца назад, и 12 библиотеками кода для одной невероятно сложной структуры данных.
Micro-Efficiency
Я бы сказал, что это может противоречить распространенному мнению, что самый умный алгоритмический код зачастую сложнее поддерживать, чем самый простой микро-настраиваемый алгоритм. Эту идею о том, что улучшения масштабируемости дают больший эффект от микротонизированного кода (например, шаблоны доступа с поддержкой кэша, многопоточность, SIMD и т. Д.), Я бы оспорил, по крайней мере, работая в отрасли, наполненной чрезвычайно сложным структуры данных и алгоритмы (индустрия визуальных эффектов), особенно в таких областях, как обработка сеток, потому что эффект может быть большим, но доллар стоит очень дорого, когда вы вводите новые алгоритмы и структуры данных, о которых никто никогда раньше не слышал, поскольку они являются брендом новый. Далее я
Так что идея о том, что алгоритмическая оптимизация всегда превосходит, скажем, оптимизацию, связанную с шаблонами доступа к памяти, всегда была чем-то, с чем я не совсем согласился. Конечно, если вы используете пузырьковую сортировку, никакая микрооптимизация не поможет вам в этом ... но в разумных пределах я не думаю, что это всегда так ясно. И, возможно, алгоритмические оптимизации сложнее поддерживать, чем микрооптимизации. Я бы обнаружил, что гораздо проще поддерживать, скажем, Intel Embree, который использует классический и простой алгоритм BVH и просто настраивает из него дерьмо, чем код Dreamwork OpenVDB для передовых способов алгоритмического ускорения симуляции жидкости. Так что, по крайней мере, в моей отрасли я хотел бы, чтобы больше людей знакомо с микро-оптимизацией компьютерной архитектуры, как Intel, когда они вышли на сцену, в отличие от тысяч и тысяч новых алгоритмов и структур данных. Благодаря эффективной микрооптимизации люди могут найти все меньше и меньше причин для изобретения новых алгоритмов.
Я работал в унаследованной кодовой базе ранее, где почти каждая пользовательская операция имела свою уникальную структуру данных и алгоритм за ней (добавляя до сотен экзотических структур данных). И большинство из них имели очень искаженные рабочие характеристики, будучи очень узко применимыми. Было бы намного проще, если бы система могла вращаться вокруг пары десятков более широко применяемых структур данных, и я думаю, что это могло бы иметь место, если бы они были оптимизированы микрооптимизацией намного лучше. Я упоминаю этот случай, потому что микрооптимизация потенциально может значительно улучшить удобство сопровождения в таком случае, если это означает разницу между сотнями микропессимизированных структур данных, которые даже нельзя безопасно использовать для строгих целей только для чтения, которые включают в себя пропуски кэша и право против
Функциональные языки
Между тем, часть наиболее поддерживаемого кода, с которым я когда-либо сталкивался, была достаточно эффективной, но чрезвычайно трудной для чтения, поскольку они были написаны на функциональных языках. На мой взгляд, удобочитаемость и удобство обслуживания являются противоречивыми идеями.
Действительно трудно сделать код читабельным, обслуживаемым и эффективным одновременно. Как правило, вам нужно немного пойти на компромисс в одном из этих трех, если не на двух, например, ухудшить удобочитаемость для удобства обслуживания или поставить под угрозу удобство обслуживания для повышения эффективности. Обычно это сопровождается ремонтопригодностью, когда вы ищете много других двух.
Удобочитаемость и ремонтопригодность
Как я уже сказал, я считаю, что удобочитаемость и ремонтопригодность не являются гармоничными понятиями. В конце концов, наиболее читаемый код для большинства из нас, смертных, очень интуитивно отображает шаблоны человеческого мышления, а шаблоны человеческого мышления по своей природе подвержены ошибкам: « Если это происходит, делайте это. Если это происходит, делайте это. В противном случае сделайте это. Я что-то забыл! Если эти системы взаимодействуют друг с другом, это должно произойти так, чтобы эта система могла сделать это ... о, подождите, а как насчет этой системы, когда происходит это событие?«Я забыл точную цитату, но кто-то однажды сказал, что если бы Рим был построен как программное обеспечение, то для того, чтобы свалить его, понадобилась бы только посадка птицы на стену. Так обстоит дело с большинством программного обеспечения. Это более хрупко, чем мы часто заботимся Подумайте. Несколько строк, казалось бы, безобидного кода здесь и там могут остановить его до такой степени, что заставят нас пересмотреть весь дизайн, и языки высокого уровня, которые стремятся быть максимально удобочитаемыми, не являются исключением из таких ошибок человеческого дизайна. ,
Чисто функциональные языки примерно настолько близки к неуязвимым, насколько это возможно (даже не близко к неуязвимым, но относительно гораздо ближе, чем большинство). И это отчасти потому, что они не соответствуют интуитивно человеческой мысли. Они не читаются. Они навязывают нам шаблоны мышления, которые заставляют нас решать проблемы с как можно меньшим количеством особых случаев, используя минимально возможный объем знаний и не вызывая побочных эффектов. Они чрезвычайно ортогональны, они позволяют часто изменять и изменять код без неожиданностей, настолько эпических, что мы должны переосмыслить дизайн на чертежной доске, даже до такой степени, чтобы изменить свое мнение об общем дизайне, не переписывая все. Кажется, его легче поддерживать, но код все еще очень трудно читать,