
Как создать быстрое программное обеспечение?
Неверный способ
Если вы программист, вы, вероятно, знакомы с этой цитатой Кнута:
Преждевременная оптимизация — корень всех зол.
Многие программисты считают, что это нормальный способ разработки продуктов:

Некоторые также думают, что производительность — это просто еще одна функция, которую можно добавить позже:

Я считаю эту логику ошибочной. Если ваша программа все еще является прототипом и выполняет, например, 1% (20%, 50%, 90%) того, что она должна делать, и она уже работает медленно, то она будет еще более медленной после того, как вы ее закончите, разве нет? Если вы заставите ее делать больше, почему он должна стать быстрее?
Если кто-то говорит:
Мы создаем программы сначала правильными, а потом — производительными. Мы оптимизируем их после того, как они будут реализованы.
На самом деле это означает: производительность в основном останется прежней, если только эти люди не найдут простые способы, которые позволят им сделать программу быстрой, не меняя слишком много из того, что они уже создали.
И у меня с этим проблемы. Это более или менее равносильно тому, что финальная производительность остается на волю случая. ЕСЛИ вам удастся найти какое-то огромное узкое место в производительности и если его изменение не повлияет на архитектуру, вы МОЖЕТЕ получить некоторое ускорение, да. Но никто не может вам этого гарантировать. Это ставка. Вы либо получите некое ускорение, либо нет. По сути, вы принимаете любую производительность с небольшим шансом на небольшое улучшение. И вы назовете это хорошей инженерией?
Может показаться, что в истории полно программ, которые после выпуска стали работать быстрее. Всего несколько примеров всплывают в памяти: Chrome известен как пионер многих улучшений скорости JS. Компиляторы Kotlin и Rust получили много ускорений. VS Code / Atom в конечном итоге стали более быстрыми версиями своих оригинальных прототипов Electron. И я не говорю, что невозможно ускорить программы после выпуска. Я говорю, что эти улучшения случайны. Им просто повезло. Они могли никогда не случиться так легко, как раньше.
Верный способ
Мой вывод таков: если вы хотите создать действительно быструю программу, с самого начала обращайте внимание на производительность. Никогда не бывает рано начинать измерять и работать над эффективностью. Ваши прототипы должны работать быстро, намного быстрее, чем окончательная программа.
Во-первых, если вы начнете с быстрой программы, гораздо легче предотвратить снижение производительности, чем начать с медленной программы и надеяться, что вы найдете простой способ ее ускорить.
Затем, если вы действительно серьезно относитесь к результативности вашей окончательной программы, каждое решение должно приниматься с учетом производительности. Платформа, язык, архитектура, фреймворк, пользовательский интерфейс, бизнес-задачи, бизнес-модель. Можно ли их сделать быстрыми? Можем ли мы использовать язык X или фреймворк Y, можно ли их сделать быстрыми? Можем ли мы сделать эту функцию быстрой? Если нет, то чем ее заменить? Как сделать интерфейс быстрым? Как сделать так, чтобы он появлялся быстро? Подобные решения легко принять на раннем этапе, но невозможно изменить позже. Например, за последние годы скорость JavaScript впечатляла, но он все еще не может быть таким же быстрым, как C ++ или даже Java. Если бы вы поставили перед собой цель создать быстрый язык, в итоге вы бы создали другой язык!
Позвольте мне сформулировать это так:
«Преждевременная оптимизация — корень всех зол» — это корень всех зол.
gleb_l
Полностью соглашусь!
О производительности нужно думать на этапе продумывания архитектуры. Вспомните Создателя — он придумал птицам, в числе прочего, трубчатые кости. Не стал их высверливать, увидев, что опытный экземпляр птицы способен лишь подпрыгивать, а придумал и сделал сразу )
Поэтому нельзя, проектируя аппарат передвижения по воздуху, “просто подкрутить что-то, или добавить памяти/ядер”, чтобы корабль стал самолетом. Не взлетит.
И ещё — посмотрите, как отличаются в фармакологии этапы создания препаратов, эффективные in vitro и in vivo. Между ними — «дистанция огромного размера». В инженерии все очень похоже — если опытный экземпляр с трудом оторвался от земли — то, чтобы серийный безопасно летал — нужно затратит ещё 10*X усилий. Поэтому если тестовая версия софта с трудом укладывается в требования по производительности — это не только не повод для радости, но и означает, что прод их гарантированно провалит )
sentyaev
С вами не согласты теория эволюции и экраноплан ;)
MagisterLudi
А вот EmDrive, похоже, согласен.
gleb_l
Если у Вас есть бесконечное время, бесконечный бюджет, и бесконечная энергия — можно, конечно, превратить рыбу в птицу, внеся стохастику в модель наследования, функцию штрафа за ошибку, и самому наблюдать, просто покуривая в сторонке. Но в условиях ограничений приходится интенсивно впрыскивать внешнюю информацию в модель системы, чтобы сократить количество итераций ;). Что касается амфибий и прочих межсредовых комбинаций — оно не может быть одинаково эффективно в обеих средах так, как это делают нативные организмы или устройства. Поэтому в естественной среде (эволюция), или искусственно-организованном выживании (война) амфибии неизбежно вымрут
apapacy
Эволюционная разработка то ли это что хочет заказчик? Типа отдам разработку трем мутантам и кто выжевет? Оптимизация на начальных тапах проектирование может быть практически бесплатной. А вто нет. Давайте запилим на PHP+Mysql а там может не взлетит и заказчик не догадается почему не взлетело.
Catslinger
Только если среда совершенно стабильна. Иначе амфибии получают огромный бонус, потому что могут пересидеть трудные времена одной среды в другой. Выживают не самые приспособленные животные — это ошибка перевода. Выживают самые способные приспособляться — самые универсальные. У крысы и таракана нет вообще никаких особенных фич — только способность жрать тухлятину, оптимальный для своего класса размер, и большая плодовитость.
poxvuibr
Насчёт экраноплана не скажу, не в курсе. А вот с эволюцией ситуация такая, что кости были с пустотами ещё у динозавров. И судя по всему даже у предков динозавров.
FenixFly
Вот кстати аналогии с птицами тут могут не подойти, изначально крыльев и оперения ни у кого не было, они появились в результате множества этапов эволюции и развития.
poxvuibr
Перья уже были у динозавров, крылья у некоторых из них тоже были и похоже, что некоторые из тех, что с крыльями, даже могли летать. У предков птиц уже было почти всё, что того, чтобы полететь. нужно было только немного подкрутить настройки.
Пасть там убрать, зубы всякие, хвост подрезать, крыло отрегулировать и так далее. С производительностью всё было уже готово. Включая производительную систему дыхания. И производительный мозг.
DrPass
Вообще, нет, не сразу. Это как раз побочная фича. Боженька сначала сделал архозавров, которые, оказавшись удачными доминирующими видами, стали основательно отжираться и расти в размерах, и возникла проблема облегчения тушки, чтобы оно не сломалось. Тогда боженька стал смотреть, где можно что выкинуть, и придумал пневматизацию костей, ну т.е. чтобы эти здоровые кальциевые штуки были не цельными, а с воздушными полостями внутри. Получилось неплохо, тушки до 20 метров стали отрастать. Заодно, чтобы мелкие тушки не замерзали (у крупных проблема терморегуляции сама собой решилась), боженька добавил им пуха, перьев всяких. Получились динозавры. Но потом они согрешили как-то, и боженька наслал на них
потопмеловое вымирание, и все крупные виды померли. А мелкие, они вдруг открыли сайд-эффект полученных фич:а) облегчённые тушки
б) оперение для маневрирования
И стали с их помощью сначала эффективно драпать/прыгать с деревьев от начинающих наглеть синапсид. А потом прокачали скиллы, и стали летать. Так что нет, птички, это когда старая фича нашла новое применение.
gecube
читал как увлекательный триллер! Пишите еще!
perfect_genius
Могу я написать? На дня появилась идея и не знаю вот с кем обсудить.
Думал про "что было первее — курица или яйцо", почитал в сети и оказалось, что точно не установить. Но зато появились мысли как могло появиться яйцо любого существа, необязательно курицы или динозавра.
Выкидыши во время беременности случаются у всех существ во все времена, даже бывают дефекты в генах у женщин, увеличивающие их частоту.
Так вот, когда-то у какого-то беременного существа на каком-то сроке случился выкидыш. Ничего необычного, но плод не только выжил, но потом смог оставить потомство, беременность которого тоже закончилась выкидышем и выживанием потомства — фича закрепилась.
Что это дало? Немного сократился срок беременности, т.е. беременное получило небольшое преимущество в том, что может чуть меньше обременяться беременностью и заниматься другими важными вещами — выживать и искать партнёра, чтобы снова забеременеть.
Почему же плод выжил? Скорее всего, он доразвивался до обычного новорождённого из-за питательных веществ, которые остались либо в маточной слизи, либо в нём самом.
В итоге круг оптимизации сформировался — стало выгодно оставлять всё больше питательного для плода, чтобы "выкидывать" его на всё более ранних сроках, чтобы быстрее освобождаться для выживание и новой беременности.
Одновременно с всё меньшим сроком развития и всё большим запасом веществ росла и защита плода — чаще выживали те, кто рождался с всё более прочной покрывающей слизью, а потом и твёрдой оболочкой с нужной формой. Внутренним органам будущей курицы тоже пришлось меняться, чтобы легко выводить уже не мягкое тельце, а всё более твёрдый предмет покрупнее.
Таким образом, вполне сформированное новорождённое животное со временем деградировало назад до предела — в "бульон" из питательных веществ-материала внутри твёрдой оболочки, в беременность вне тела.
Как философия Unix — пусть программа делает только одну вещь, зато хорошо. Предкам курицы оказалось неудобно выживать "с животом" и они разделились.
gecube
Вы говорите так, будто откладывание яиц более продвинутая форма, чем живорождение, но опыт показывает обратное.
Яйца — это развитие истории со спорами/икринками/etc
perfect_genius
Не говорю — у каждого существа свои условия жизни и свои способы эффективности.
А икринки как могли возникнуть? Делилась клетка и вторая эволюционно не развивалась?
sumanai
В смысле? Взрослый организм изменяться уже не может. Так что однозначно яйцо.
perfect_genius
Почему курица до яйца не могла быть живородящей? Потому что это уже не будет курицей?
Тогда что мешает так же родиться курице из яйца, которое нельзя классифицировать как куриное? Например, оно не той формы, не той прочности, чуть другой состав...
Если принять, что яйцо годится любое, тогда почему нельзя принять и любую курицу?
wataru
То, что яйцо — это уже курица. Зародыш курицы, если быть совсем точным.
perfect_genius
-Что было первее — яйцо или курица?
-Яйцекурица!
Курица вполне могла родиться из нестандартного яйца, они и сейчас так делают.
По-дилетантски предположу, что наверно можно даже генетическими методами родить курицу из страусиных или крокодильих яиц, если в них есть нужный состав.
perfect_genius
Курица могла родить цыплёнка в плёнке — первый вид яйца.
sumanai
Эм, предки куриц вплоть до динозавров/рептилий сносили яйца, какие плёнки?
perfect_genius
Эта фраза разве относится конкретно к курицам? Она относится к первым существам, способным откладывать яйца. Первые динозавры или их предки откладывали яйца с мягкой оболочкой: https://in-space.ru/myagkie-yajtsa-perevernuli-predstavlenie-ob-evolyutsii-dinozavrov-i-gigantskih-reptilij/
sumanai
Откуда в вопросе «Яйцо или курица» появились первые яйцекладущие?
perfect_genius
Из логики, что незачем обсуждать были ли яйца до того, как они потом снова появились.
Обсуждаем, что раз яйцо появилось, значит его создатель не был сам из яйца. Были ли яйца до них — к обсуждению не относится.
Поэтому для упрощения проблему можно отнести к первому появлению яйца, чтобы не уходить в оффтоп.
Яйцо и курица условны, вместо них можно подставить и икринку с рыбой, компилятор и его собственный исходный код, который он может скомпилировать...
wataru
Почитайте как работает эволюция. Сразу вопросы отпадут.
perfect_genius
Какой момент вас смущает?
wataru
Меня как раз ничего не смущает.
И потом почитайте, откуда берется изменчивость в биологической эволюции.
Отсюда станет очевидно, что первое яйцо с зародышем курицы отложила "недокурица".
perfect_genius
Что по вашему "курица"?
Чем ещё она, вырастив из этого яйца, должна отличаться от "недокурицы"-родителя, кроме как способностью кладки яиц?
(забавно, что мы обсуждаем то, что обсуждают тысячи лет разные философы и учёные, что названо в Википедии" проблемой". Будто мы сейчас вдруг решим этот вопрос)
sumanai
Это обычная языковая проблема. Если начать формализовать её, то решение без проблем найдётся. Но из-за неоднозначности человеческих языков формализовать её можно множеством разных, порой противоречащих друг другу способов. И я не вижу смысла обсуждать подобную проблему вообще, только разве что у вас куча свободного времени. Я беру первое решение из Википедии, основанное на знакомых мне вещах, и объявляю его истиной в последней инстанции. Всё одно это не хуже бесконечного словоблудия, что я тут написал по пустяковому поводу. Наверное у меня много свободного времени. А точнее просто высокая температура. Прости, Хабр.
perfect_genius
В Википедии упомянута "пракурица", но почему-то не упомянуто "праяйцо" — вот в чём ещё проблема.
Пракурица родила праяйцо и далее они эволюционно развивались вместе до курицы и яйца. И нет возможности определить кто из них развился быстрее, т.к. нет резкого перехода между пракурица -> курица и праяйцо -> яйцо, т.к.
sumanai
Это я и называю словоблудием, все эти пракурицы и праяйца.
trdm
Это какого создателя? Рода, Брахму, Ади Шакти, Саваофа?
Кто из них трубчатые кости придумал, я что-то запутался :)
perfect_genius
Посмотрите в Патентном бюро.