morfizm (morfizm) wrote,
morfizm
morfizm

Category:

Программирование, исторический обзор

Выкладываю небольшой braindump моих воспоминаний, связанных как с моим личным путём узнавания разных программерских технологий и процессов, так и с "веяниями моды", насколько мне это было заметно. На полноту не претендую, и буду рад дополнениям и размышлениям на эту тему.

1993 - Basic для непрограммистов, Borland Pascal для всех, C для крутых. Простые алгоритмы, рекурсия. Компонентизация через модульность. Разбитие задачи на функции. Группировка функций в юниты.
1995 - Кстати, а вы знаете, что PHP (на котором написан Фейсбук) расшифровывается как "Personal Home Page"? Hypertext Preprocessor это уже придумано позже, дабы осветлить это название :) Помню Yahoo-директории, Geocities для домашних страничек, HTML-чаты и новинку: поиск через Altavista.
1995 - ООП. Turbo Vision. Reusability через инкапсуляцию, наследование и полиморфизм, причём полиморфизм подчёркивался, как самый мощный и правильный инструмент. Никто ещё не подозревает, что это, на самом деле, влечёт к созданию несопровождаемого кода.
1995 - Коментарии в коде - это признак качественного кода. Пишите побольше комментариев!
1995 - Все "нормальные" алгоритмы - быстрые сортировки, динамическое программирование, деревья - вплоть до красно-чёрных, хешфункции. Новинкой и изюминкой были продвинутые строковые алгоритмы вроде KMP, Boyer-Moore, суфиксные деревья.
1998 - Популярность T-SQL. Oracle, Microsoft SQL, Postgre SQL, mysql. Грамматики, автоматы, компиляторы.
1998 - C++, STL.
1998 - Visual Studio 6.0. Лучшая версия, после которой всё пошло по спирали вниз.
1998 - Delphi. Это для учёбы, для прототипов, для быстрых тулов и для лохов. А для серьёзных парней и system level programming - Visual Studio 6.0 и Unix: gcc/vim.
2002 - ООП-мания набирает обороты и достигает своего пика: UML-диаграммы. Late-binding. COM-объекты (бр-р-р).
2003 - Функциональный подход - это экзотика. Изучают в теории, наряду с Прологом, но никто не воспринимает всерьёз.
2005 - Windbg на своём пике, но, наверное, я был разбалован секретными плагинами для внутреннего пользования, вроде анализа heap'а для поиска leak'ов, appverifier и приватными виндозными символами. Новинка: time-travel debugging.
2005 - Зарождается важность многопоточных алгоритмов. Жонглировать локами - великое искусство и плодит кучу багов.
2005 - Война функций, возвращающих статус ошибки, с функциями, кидающие исключения. Исключения победят, но очень нескоро, потому что они всё ещё медленные.
2005 - Boost. Стандартизация стандартных классов. Уход от самопальных реализаций строк, битвектора и т.п. базовых вещей, потому что людям приходит осознание, что написать самопальную реализацию без багов принципиально невозможно, а баги эти жуткие. Можно месяц ловить и не поймать.
2005 - Начало понимания, что dead code надо удалять, он вреден.
2007 - Agile & Scrum восходит до уровня секты и начинает проникать в умы высшего начальства, насаждающего по всюду ежедневные stand-up'ы. Примерно в этот момент начинается глобальная промывка мозгов в сторону удешевления девелопмента через open space, офисы начинают уходить в историю. Всё это подаётся под соусом, что, мол, open space способствует активному collaboration, а это важно. Waterfall чморят в пользу коротких итераций, что фактически означает - херачим без дизайна и без тестирования-стабилизации. Результат будет очевиден через несколько лет.
2008 - От секты ООП-UML не осталось почти ничего. Бай-бай, Греди Буч. Кроме редких извращенцев, никто не помнит детали формальных диаграмм, кроме базового data flow и иерархии наследования. Последнее тоже уходит в анналы, потому что обществу по опыту последних 10 лет открывается истина, что от ООП единственное, что хорошо - это инкапсуляция и интерфейсы. Агрегация - ещё куда ни шло. Наследование чётко плохо, но иногда необходимо на уровне библиотек. Полиморфизм - отвратительно. Множественное наследование - вообще ужас.
2009 - Новая болезнь - design patterns. Считается модным в любой design discussion вплетать про заводы, строителей, адаптеры, фасады и прочее. Забегая вперёд, скажу, что за следующие 5 лет выжил только синглтон и итератор, про которые было известно ещё до design-pattern-мании. В Java community фабрики продолжали процветать, впрочем, опять же, там у них это было давно. Чтобы полюбить джаву минимальная необходимость это научиться по-философски улыбаться, строя очередную фабрику фабрик фабрик фабрик для прокси итератора колбека.
2009 - Distributed systems. C++ из "инструмента для всего" вытесняется вниз, на уровень OS kernel, компиляторов, игровых движков и отдельных tight-loop библиотек, а также в саппорт монстроидальных систем с 10-20 летней codebase. Принципиальная линейная scalability важнее 10x перформанса. Потому что вбросить железо для решения на ЯВУ - дешевле, чем вбросить 10x времени на разработку на C++. Компонентизация через SOA.
2010 - В корпоративных культурах новый вирус - ценности и принципы. Компании соревнуются в том, у кого круче рабочий набор. Менеджеры на совещаниях устраивают бои, стреляя аргументами из базовых принципов и базовых ценностей. Bs Bingo в самом расцвете сил. Зарождается популярность дивёрсити.
2011 - Machine learning стартует, начинает набирать обороты в реальных нагруженных задачах.
2011 - Понимание, что dead code надо удалять, поднимается на новый уровень. Сообщество программеров доходит до понимания, что надо избегать любого кода, который исполняется редко, потому что в нём точно будет много багов. Стартует идея, что защита от сбоев возможна только если специально вывести их на регулярную основу. Начиная с chaos monkey от Netflix'а до "crash-only deployment", когда выкатывание новой версии имплементируется через убийство хоста и его замену. Реакция на сбой неотличима от обычного deployment'а, значит, возникает часто, значит, работает надёжно.
2012 - Control loop theory. Дешевле, быстрее и надёжнее написать само-корректирующуюся систему, чем делать расчёт и планирование всех случаев. Признаётся невозможность для человеческой биомассы заранее учесть все случаи.
2012 - Распределённые системы стали стандартом. Железа уже так много, что хардварные сбои считаются нормой. Никто не дебаггает проблемы, случающиеся один раз, если они корректируются рестартом или заменой хоста. Становится важнее писать error-resilient software, чем пытаться делать error-proof. Кстати, в дебаггере и профайлере теперь сидят очень редко, потому что в распределённых системах это сложно. Легче использовать отладочную печать и мониторинг.
2012 - JavaScript переходит из разряда быстрого языка для детей, чтобы делать вебстраницы, в разряд мощного инструмента, сочетающего в себе плюсы из разных парадигм. Значительно ускоряется виртуальная машина для JS в браузерах. К сожалению, на средней зарплате UI программистов это пока не сильно отразилось.
2012 - Map-reduce-мания и Hadoop-мания.
2013 - Начинают рулить нечёткие алгоритмы, основанные на хэшировании. Повсюду распускаются бутоны блумфильтров.
2013 - Набирает обороты C++ 11, впитавший в себя функциональную парадигму и разные другие полезные стандарты, без компромисса по производительности. Переход на C++ 11 это качественный переход, это как новый язык, новая культура программирования.
2013 - Функциональный подход и немутабельные структуры данных как ответ на необходимость многопоточности, но так, чтобы не наступать на грабли с локами. Использование локов и даже явных тредов - плохой тон. Многопоточность в рамках одного процесса начинает напоминать распределённую систему с её микросервисами и streamed data-flow, но в миниатюре.
2014 - Начинает набирать обороты виртуализация и микросервисы. Спустя три года это уже стандарт разработки.
2015 - Коментарии в коде - это признак сложного кода, а сложность это почти всегда плохо. Код должен самодокументироваться и не нуждаться в комментариях. Комментарии это как deadcode, быстро протухают, вводят в заблуждение, тормозят прогресс.
2015 - От Agile не осталось практически ничего. Scrum и ежедневные стендапы - удел редких извращенцев, таки поверивших в обещания секты о рае в загробном мире, если они будут каждое утро стоять. От test-driven-development осталась идея testability. Да, надо писать тестируемый код, и да, тесты надо писать сразу с кодом. Но не обязательно сначала тесты. Процесс разработки свёлся к гибриду между водопадом и итерацией.
2016 - Machine learning набрал обороты и внедряется везде. Deep learning. The deeper the better. Микросервисы и контейнеры тоже везде. По крайней мере, в новых системах.
2016 - Map-reduce-мания и Hadoop-мания заменяется на потоковый дизайн (Flink). Он куда гибче и эффективнее по утизилации железа. Набирает обороты функциональный подход, который хорошо вписывается в это направление. Прогресс в нечётких алгоритмах и хешировании ведёт к общему прогрессу в передаче данных, например, использование Merkle trees для синхронизации как один из этапов передачи и преобразования данных в stream-based data pipeline.
2016 - В прогрессивных местах офисов уже почти нигде нет, open space победил. Личным офисом всё ещё могут заманивать компании, которые не предпочтительны по ряду других параметров: неинтересная система, куча legacy кода, ограниченный карьерный рост, низкая зарплата и пр.
2017 - Слово "дивёрсити" уже нельзя произносить с сарказмом, по крайней мере, открыто. Закрепляется устойчивый набор "правильных" религиозных убеждений, не демонстрируя которые, трудно устроиться на работу. На собеседованиях актуализируется culture fit. Выбирают кандидатов, которые показывают, как они с высунутым языком готовы работать за идею, а еда и зарплата - это незначительные мелочи. Впрочем, для хорошего кандидата это хорошо, потому что ему легче отфильтровать коллектив, в котором лицемерие будет зашкаливать.
2017 - В силу увеличения объёмов данных, нечёткие алгоритмы продолжают всё больше рулить. Давать очень хороший ответ в 99% случаев может быть на порядок дешевле, чем давать лучший ответ в 100%. Вот, я тут про BitFunnel написал в прошлом посте.
2017 - Cache is the new RAM, RAM is the new disk. Все знания, связанные с локальностью и скоростью доступа к диску по отношению к памяти, можно смело переносить на оптимизацию под процессорный кэш. Про диски можно почти забыть. В нагруженных распределённых системах они нужны только для логов, билда и разных данных, нужных только во время деплоймента и первого старта, вроде docker images и ML моделей.
2017 - Актуализация блокчейна как парадигмы софтварных систем. Про него, наверное, стоит написать отдельно.
2017 - Java значительно улучшилась и во многих случаях приближается к производительности C++. Это удивительный рывок. Ещё каких-то 7 лет назад Eclipse был отвратительной тормознёй, а сегодня IntelliJ Idea - это шустрая IDE, которой приятно пользоваться.
2018 - ? Я не знаю, что нас ждёт, но думаю, что основной двигатель прогресса будет переход на machine learning, и какие-то следствия (которые пока не очень ясны) из этого процесса. Есть одно опасение: если раньше группа из 20 человек делала систему со сложными эвристиками "вручную", то сегодня группа из 5 человек может сделать то же самое на machine learning'е. А завтра сможет группа из 2, потому что будут всё более мощные универсальные решения, которые можно будет лишь сконфигурить или расширить под свои нужды. Это довольно большая оптимизация по человеческому ресурсу, и не очень понятно, хватит ли роста индустрии для того, чтобы этим 15 (а завтра - 18) человекам, которые не попали в уменьшенную группу, было чем заняться. Мне кажется, карьерный impact от перехода на machine learning может быть более радикальным, чем карьерный impact от перехода на распределённые системы в 2008-2009. По моим наблюдениям, человек такого же уровня по опыту и сообразительности, но оставшийся вне сферы high load, big data and scalable systems, в среднем, зарабатывает вдвое меньше. Я опасаюсь, что следующий переход может быть ещё более внушительным, и нужно внимательно следить, чтобы случайно не сделать неверный шаг в сторону от того, куда оно всё идёт. Я уже ощущаю необходимость специально делать какие-то телодвижения, чтобы за этим активно следить.

Upd.: я понимаю, что этот рассказ очень biased в сторону моего личного пути. В отдельных индустирях, скажем в играх, базах данных, операционных системах, open source, и даже в том же ML более детально, можно было бы написать про другое. Я не призываю спорить, приводя свой путь в качестве контраргумента (хотя мне было бы жутко интересно прочесть аналогичные исторические обзоры под другим углом). Но мои личные впечатления охватывают не только лично меня, а и круг знакомств, похожих людей, я делаю какие-то обобщающие выводы. Мне интересны замечания, когда я совсем не попал про какие-то общие тенденции, или попал, но заметил их с задержкой лет в 5, или пропустил что-то важное и интересное, а также интересно другое видение на 2018+, исходя из вашего опыта.
Tags: 1, bio, software development
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 17 comments