Где-то в 2010 году меня спросили: знаю ли я кого-то, кто разрабатывает на FoxPro, а то "Все резюме на hh каких-то дедов, 55+ лет".
До этого FoxPro в последний раз я видел еще за 8 лет до этого, в одном маленьком региональном сотовом операторе. Там на нем был написан весь front-end: от абонентского отдела до бухгалтерии. Вы, наверняка, не знаете что такое FoxPro. Это такой очень затейливый дедовский React для баз данных, который сам разрабатывающий его Microsoft закопал в 2007 году.
Выяснилось что нужно было доделать какую-то специфичную для рекламного агентства программу. Переделывать, как казалось, несложный функционал на что-то более современное никто не хотел. Моими напутственные словами были: "Вот такие, как вы и откладывают наступление сингулярности".
10 лет спустя, в канун нового 2020 года, можно заявить официально: сингулярности не будет. Нет, ну не то что бы совсем не будет. Будет, наверное. Но это не точно. И мы вряд ли доживем.
Нет, виноват не программист на FoxPro. И даже не тот, кто его в итоге нанял.
Виноваты мы с вами. Все мы. Но особенно виноваты разработчики. Мы должны были бороться со злом, а не примкнуть к нему.
У нас появился docker, javanoscript на backend, типизированный javanoscript, react, куча функциональных языков, куча не функциональных языков, базы для документов, базы для графов, базы для аналитики, блокчейны и все такое, всех цветов. А еще нейросети, github, telegram. Не то чтобы это всё было нужно для сингулярности, но раз начал коллекционировать технологии, то иди в своём увлечении до конца. Единственное, что меня беспокоило — это ORM. В мире нет никого более беспомощного, безответственного и безнравственного, чем человек, использующий ORM. И я знал, что довольно скоро мы в это окунёмся.
До этого FoxPro в последний раз я видел еще за 8 лет до этого, в одном маленьком региональном сотовом операторе. Там на нем был написан весь front-end: от абонентского отдела до бухгалтерии. Вы, наверняка, не знаете что такое FoxPro. Это такой очень затейливый дедовский React для баз данных, который сам разрабатывающий его Microsoft закопал в 2007 году.
Выяснилось что нужно было доделать какую-то специфичную для рекламного агентства программу. Переделывать, как казалось, несложный функционал на что-то более современное никто не хотел. Моими напутственные словами были: "Вот такие, как вы и откладывают наступление сингулярности".
10 лет спустя, в канун нового 2020 года, можно заявить официально: сингулярности не будет. Нет, ну не то что бы совсем не будет. Будет, наверное. Но это не точно. И мы вряд ли доживем.
Нет, виноват не программист на FoxPro. И даже не тот, кто его в итоге нанял.
Виноваты мы с вами. Все мы. Но особенно виноваты разработчики. Мы должны были бороться со злом, а не примкнуть к нему.
У нас появился docker, javanoscript на backend, типизированный javanoscript, react, куча функциональных языков, куча не функциональных языков, базы для документов, базы для графов, базы для аналитики, блокчейны и все такое, всех цветов. А еще нейросети, github, telegram. Не то чтобы это всё было нужно для сингулярности, но раз начал коллекционировать технологии, то иди в своём увлечении до конца. Единственное, что меня беспокоило — это ORM. В мире нет никого более беспомощного, безответственного и безнравственного, чем человек, использующий ORM. И я знал, что довольно скоро мы в это окунёмся.
Концепцию mvc (model-view-controller) сформулировали больше 40 лет назад в застенках xerox для языка smalltalk.
18 лет назад свет увидел шаблонизатор smarty для языка php. Одно упоминание этого названия повышало стрит кридабилити (конференций тогда не было) до недостижимых высот.
Опыт предыдущих поколений говорит: отделяй мух от котлет, Карл!
Пример. Все мы используем docker. А знаете, что можно управлять им из javanoscript?
Вот, взгляните: https://github.com/AgustinCB/docker-api
Из python: https://github.com/docker/docker-py
Из go: https://github.com/docker/go-docker
И при этом никто не пишет docker-compose на js, все пишут на yaml.
Мы научились делать html-шаблоны и отделили от них css. Локализация - это отдельные конфиги, а не куча if’ов в коде. Docker-compose это yaml. Json-schema это json :)
Это разные языки и форматы, но мы как-то с этим справились.
И только смешивание описания структуры базы данных с кодом до сих пор не считается позорным.
¯\_(ツ)_/¯
18 лет назад свет увидел шаблонизатор smarty для языка php. Одно упоминание этого названия повышало стрит кридабилити (конференций тогда не было) до недостижимых высот.
Опыт предыдущих поколений говорит: отделяй мух от котлет, Карл!
Пример. Все мы используем docker. А знаете, что можно управлять им из javanoscript?
Вот, взгляните: https://github.com/AgustinCB/docker-api
Из python: https://github.com/docker/docker-py
Из go: https://github.com/docker/go-docker
И при этом никто не пишет docker-compose на js, все пишут на yaml.
Мы научились делать html-шаблоны и отделили от них css. Локализация - это отдельные конфиги, а не куча if’ов в коде. Docker-compose это yaml. Json-schema это json :)
Это разные языки и форматы, но мы как-то с этим справились.
И только смешивание описания структуры базы данных с кодом до сих пор не считается позорным.
¯\_(ツ)_/¯
GitHub
GitHub - AgustinCB/docker-api at morioh.com
Docker Remote API driver for node.js. It uses the same modem than dockerode, but the interface is promisified and with a fancier syntax. - GitHub - AgustinCB/docker-api at morioh.com
Для пользователей твиттера, порекомендую пару аккаунтов.
https://twitter.com/M0rtyMerr
it-степдап, фронтенд, rx
https://twitter.com/_bravit
Тролль 80 lvl, булит фронтов, преподаватель haskell
https://twitter.com/M0rtyMerr
it-степдап, фронтенд, rx
https://twitter.com/_bravit
Тролль 80 lvl, булит фронтов, преподаватель haskell
Несколько подборок потери полимеров из-за багов.
Есть шансы, что трезвым после прочтения жить уже не получится…
1 штука: https://zen.yandex.ru/media/code/oshibka-v-kode-privela-k-nevernym-rezultatam-v-kuche-issledovanii-5da6bcc4e4fff000af4c21aa
4 штуки: http://www.syssoft.ru/portal/novosti/bag-na-milliard-skolko-na-samom-dele-stoyat-oshibki-v-programmnom-obespechenii/
8 штук: http://smartnews.ru/articles/10950.html
50 штук: https://dou.ua/lenta/columns/dangerous-mistakes-in-prorgamming/
Есть шансы, что трезвым после прочтения жить уже не получится…
1 штука: https://zen.yandex.ru/media/code/oshibka-v-kode-privela-k-nevernym-rezultatam-v-kuche-issledovanii-5da6bcc4e4fff000af4c21aa
4 штуки: http://www.syssoft.ru/portal/novosti/bag-na-milliard-skolko-na-samom-dele-stoyat-oshibki-v-programmnom-obespechenii/
8 штук: http://smartnews.ru/articles/10950.html
50 штук: https://dou.ua/lenta/columns/dangerous-mistakes-in-prorgamming/
Одна компания с веселым названием «злые марсиане» и не менее веселым логотипом ведет свой канал в телеграмме.
Вот он: @evilmartians
Каждый второй пост там - как они прикрутили к ruby graphql.
Да, они пишут на ruby. В 2020. И, видимо, там есть большие проблемы с graphql :)
Но я не об этом. Последний их пост о том, как они мужественно в обход ActiveRecord (это класс из ORM Ruby On Rails, из-за которой когда-то в 2004 этот язык и приобрел хоть какой-то смысл) добавляют в базу триггеры для инкремента счетчиков в отдельной таблице postgresql при каждом INSERT/UPDATE вместо того, чтоб считать (внимание!) эти суммы в ElasticSearch.
После того, как ко мне вернулся дар речи, единственное, что я смог произнести: «Как тебе такое, Илон Маск»
Прочувствовать можно по ссылке:
https://evilmartians.com/chronicles/pulling-the-trigger-how-to-update-counter-caches-in-you-rails-app-without-active-record-callbacks
(судя по всему, раньше они это делали через колбеки в приложении :) )
Тут прекрасно все:
- и синтаксис ActiveRecord для создания таблиц
- и то как эти таблицы заполняются: User.insert_all(10_000.times.map { { created_at: Time.now, updated_at: Time.now } })
- и запуск EXPLAIN из кода
- и, конечно, царь горы - триггер. На каждый insert и update делается upsert в сводную таблицу на основании выборки count и sum. Upsert в postgres делается на синтаксисе on conflict update, и так себе работает при параллельных запусках (расскажу об этом при случае). Чтобы победить race condition, мужественные марсиане решают провернуть уличную магию с рекомендательными блокировками (не делайте так никогда, во имя святого Стоунбрейкера).
С триггерами в рельсах, кстати, какие-то проблемы и предлагается использовать специальный форк отдельного пакета (!!!) для триггеров от автора статьи.
And one more thing...
Эти ребята приложили руку к @rocketbank.
Похоже, тинькофф что-то знал, когда буллил ракетчиков :)))
PS: На одной из конференций встретил двух знакомых, пишущих на ruby. Они, еле находя время на вздох, хором ржали над людьми, пишущими на серверном js...
Вот он: @evilmartians
Каждый второй пост там - как они прикрутили к ruby graphql.
Да, они пишут на ruby. В 2020. И, видимо, там есть большие проблемы с graphql :)
Но я не об этом. Последний их пост о том, как они мужественно в обход ActiveRecord (это класс из ORM Ruby On Rails, из-за которой когда-то в 2004 этот язык и приобрел хоть какой-то смысл) добавляют в базу триггеры для инкремента счетчиков в отдельной таблице postgresql при каждом INSERT/UPDATE вместо того, чтоб считать (внимание!) эти суммы в ElasticSearch.
После того, как ко мне вернулся дар речи, единственное, что я смог произнести: «Как тебе такое, Илон Маск»
Прочувствовать можно по ссылке:
https://evilmartians.com/chronicles/pulling-the-trigger-how-to-update-counter-caches-in-you-rails-app-without-active-record-callbacks
(судя по всему, раньше они это делали через колбеки в приложении :) )
Тут прекрасно все:
- и синтаксис ActiveRecord для создания таблиц
- и то как эти таблицы заполняются: User.insert_all(10_000.times.map { { created_at: Time.now, updated_at: Time.now } })
- и запуск EXPLAIN из кода
- и, конечно, царь горы - триггер. На каждый insert и update делается upsert в сводную таблицу на основании выборки count и sum. Upsert в postgres делается на синтаксисе on conflict update, и так себе работает при параллельных запусках (расскажу об этом при случае). Чтобы победить race condition, мужественные марсиане решают провернуть уличную магию с рекомендательными блокировками (не делайте так никогда, во имя святого Стоунбрейкера).
С триггерами в рельсах, кстати, какие-то проблемы и предлагается использовать специальный форк отдельного пакета (!!!) для триггеров от автора статьи.
And one more thing...
Эти ребята приложили руку к @rocketbank.
Похоже, тинькофф что-то знал, когда буллил ракетчиков :)))
PS: На одной из конференций встретил двух знакомых, пишущих на ruby. Они, еле находя время на вздох, хором ржали над людьми, пишущими на серверном js...
evilmartians.com
Pulling the trigger: How to update counter caches in your Rails app without Active Record callbacks—Martian Chronicles, Evil Martians’…
Keeping your counter caches in sync using nothing but database triggers

