Лаборатория Математики и Программирования Сергея Бобровского – Telegram
Лаборатория Математики и Программирования Сергея Бобровского
1.29K subscribers
1.19K photos
24 videos
930 links
ЛаМПовое с Бобровским
Download Telegram
Создавать хорошо масштабируемые серьёзные архитектурные решения очень, очень сложно (особенно если за это берутся госконторы). Смешная история, как Пентагон пытается десятки лет разработать "военный интернет вещей", и получается пока сильно хуже, нежели у частных корпораций -- приходится идти на поклон к Илону Маску например.

"Я приехал и обнаружил отсутствие бюджета, отсутствие полномочий, отсутствие согласованности взглядов, отсутствие людей, отсутствие компьютеров, отсутствие сетей, протекающий потолок и даже сломанные шторы".

Напомнило сериал "Космические войска" :)
Тот уровень проектирования, которому я стремлюсь вас научить, включает в себя, в частности, концепцию typestate , когда множество потенциальных логических ошибок вылавливается на фазе компиляции.

Понятно, что в любом типизированном языке присвоить строку целочисленной переменной невозможно; имею в виду более продвинутые вещи, например когда целочисленной переменной разрешается присваивать только положительные значения (а ведь Паскаль/Delphi это умел...).

Так вот, typestate позволяет добавлять в систему типов протоколы. Примерно 10-20% объектов в типовом проекте протоколы "поддерживают" (были научные исследования по их выявлению), только некорректно, а то и потенциально ошибочно. Речь о том, что методы класса в рамках протокола должны вызываться в определённом порядке. Скажем, вы должны сперва открыть файл до того, как будете его читать. Обычный компилятор корректность протокола open => read конечно не проверяет, вы просто получите ошибку рантайма при попытке считать из закрытого файла.

Typestate же позволяет вытащить протокол на уровень синтаксиса: у вас фактически будут отдельные типы файлов -- для открытого файла и для закрытого, у которого нет метода чтения. Это чуть-чуть похоже на микро-протокол Go, когда вам надо явно инициализировать переменную с помощью := перед дальнейшим её изменением, иначе компилятор выдаст ошибку, если выявит попытку присваивания = переменной, которая не была инициализирована явно особой синтаксической конструкцией.
Это всё, что нужно знать о функциональном программировании на JavaScript:

['1', '7', '11'].map(parseInt) == [1, NaN, 3]
...Однако, четыре фундаментальных языка (в разных парадигмах), на которых всё ИТ стоит и стоять будет, и которые полезно изучать максимально глубоко (включая понимание, как для них пишутся компиляторы и интерпретаторы) -- это Си, Лисп, SQL и JavaScript.
"Пофиксить баг", который был выявлен, например, в ходе code review, и который в работающей системе пока не проявлялся, на практике часто означает перевести систему из состояния "без наблюдаемых ошибок" в состояние "большое количество наблюдаемых ошибок".
Иногда спрашивают, а что сегодня самый топчик в computer science, но при этом имеет прямое прикладное значение? Ну например DSL для реализации тайп-чекера. Единственной программой на таком языке будет декларативное описание конкретной системы типов в некотором прикладном языке программирования, исполняемая формальная спецификация (вычисляемая математика по Алану Кэю), если хотите. Это уровень ведущих разработчиков MMANGA, и имея подобный проект на гитхабе, вполне можно претендовать на отличный оффер в обход бесконечных типовых собеседований по решению литкодовских задачек. Напишите тайп-чекер для конкретного языка, для Apple Swift например, ну и просто это будет большой пожизненный +1 в вашей карьере.
Метапрограммирование, аланкэевщина -- это в значительной степени про DSL (domain specific language) -- прикладные языки предметных областей. Отличие метапрограммирования от lowcode в том, что мы не берём одно готовое "универсальное", а сами делаем подходящие DSL чётко под нашу проектную семантику. Про DSL относительно мало материалов (это очень продуктивный подход, но и весьма сложный), хотя некоторые относительно популярные языки (например Ruby) парадигму DSL поддерживают.

Но есть в этом контексте другой топчик, ещё более аутентичный -- TSL (type specific language). Идея, что в коде есть функция, которая принимает например регулярное выражение, и когда компилятор это видит, он автоматически переключается на парсер регэкспов, и таким образом можно смешивать много разных языков, много разных синтаксисов в одном файле -- гораздо более концептуальным и элегантным способом, чем другие решения. В некотором смысле например C# можно считать TSL, когда мы нативно используем в коде LINQ.
Полноценный пример TSL -- это язык Wyvern разработка которого была профинансирована Агентством национальной безопасности США, потому что подходы DSL/TSL позволяют существенно повысить надёжность и выразительность кода.
Определений абстракции в программировании существует множество, и возможно вы встречались с одним из них, если изучали учебник "Структура и интерпретация компьютерных программ" (SICP), который считается одной из двух самых великих классик в информатике -- наряду с "Concepts, Techniques, and Models of Computer Programming" (CTM), которая на русский не переводилась (кроме моих курсов :). Так вот, уже первая глава SICP называется "Построение абстракций с помощью процедур", но насколько она адекватно отражает концепцию абстракции?

Gerry Sussman (один из авторов SICP) продолжает успешно профессорствовать в MIT, и наши с вами PhD-друзья из Массачусетса этой весной 2022-го года специально обратились к мэтру, чтобы он окончательно пояснил за его версии абстракций :) По мнению Sussman, абстракция -- это "чемоданный термин", который означает слишком много разных вещей, хотя он видит ровно два её подходящих определения, прямо относящихся к разработке программного обеспечения.

Первое определение: давать имена сущностям, созданным в соответствии со вторым определением. :)

А вот второе определение естественно вытекает из первой теоремы о гомоморфизмах и её обобщений в универсальной алгебре (и тут, говорят, гуру постучал по пухлому учебнику по алгебре на его столе).

В СильныхИдеях в мае разберу эту тему более подробно, на пальцах, доступно любому программисту-нематематику :) Ну и, надеюсь, разберём со временем, как доказать первую теорему о гомоморфизме в HoTT на питончике, в каком-нибудь теорем-прувере.

Стратегически всем без исключения порекомендую по этой теме хороший и понятный учебник
"Элементы универсальной алгебры и ее приложений в информатике" (Бениаминов, Ефимова) (алгебраическое моделирование абстрактных типов данных)
как важный шаг в правильном направлении.
Думаю, это явился в мир киллер JavaScript )))
pynoscript.net

Поддержка добавляется просто двумя строчками в html-страничке.
Ддосят большого и богатого клиента (не скажу какого - ***.info), а мой скромный учебный сервис оказался с ним у хостера на одном серваке и немного попал под раздачу -- подтормаживает 2-3 секунды :)
Админы пообещали перебросить в более спокойную зону.
Не понимаю, почему NashStore сегодня преподносится как какое-то эпичнейшее достижение российского ит )))
Ну да, полезная альтернатива гуглмаркету для страховки, поставил себе, но не более.
"более 1000 приложений" (с) )))

Совершенно рядовой во всех отношениях проэкт, коих в России успешно делались многие сотни, а может и тысячи. В отечественном геймдеве например есть проекты на 1-2 порядка круче нашегостора и по сложности, и по масштабу.

P.S. Так то это уровень дипломного проекта наших универов.
P.P.S. На фрилансерских сайтах можно за сотку долларов найти исполнителя, который прототип такого стора запилит за недельку-другую :)
Что очень важно понимать по Go, который активно пропагандирую , в контексте своей карьеры (важный нюанс, не говорю тут про технический аспект)?

Ну, вот на Java (8 :) и Python (2.7 :) написаны наверное терабайты кода, и всё это легаси работает вокруг нас в огромном количестве, и на его сопровождение и сейчас полно очень вкусных вакансий, и будет становиться только больше.

А на Go-программистов такого ажиотажного спроса нету просто потому, что пока не нафигачены все эти тонны говнокода, которые надо суппортить и хоть как-то развивать :) Лет через 10, ну возможно.
Нытьё на РИФе, просто поразительно.

"У российских разработчиков есть несколько проектов по созданию отечественных игровых движков, однако на их реализации нужно финансирование в несколько миллиардов рублей, несколько лет и опытные программисты."

Зачем?? Очень надеюсь, что им не дадут ни копейки.

Как надо:

- тем, кто даёт деньги - организовывать побольше конкурсов для разработчиков игр, с нормальными бюджетами, чтобы побольше участников что-то получали, + помогать им в продвижении;

- разработчикам - делать акцент на сильных идеях и, главное, качественном контенте. Пусть посмотрят на инди-фестивали, там многие лучшие игры сделаны на бесплатных опенсорсных движках 10-летней давности.

P.S. Вышедшая на днях Songs of Conquest — изумительный клон Heroes of Might and Magic, сделана как раз в олдскульных технологиях :)
Возможно, вы уже читали: на днях гугловский Deep Mind устами профессора Nando de Freitas заявил, что близок к созданию AI человеческого уровня (AGI), причём весьма бескомпромиссно: "the game is over", и теперь достаточно лишь смасштабировать Gato, чтобы получить полноценные результаты.

Вообще, подобные анонсы ожидались только лет через 10-15, и пока это заявление раскритиковали авторитетные конкуренты (например, LeCun).

В новостях пишут, что Gato обучили 604 задачам самых разных классов (управлять рукой робота, играть в игры, вести диалоги, классифицировать изображения...), которые она успешно выполняет во многих случаях лучше людей. Сегодня это особого интереса уже бы и не вызвало, если не тот факт, что Gato -- это мультимодальная нейросеть, то есть она обучается всему этому одновременно, это один агент! Причём реализована Gato в той же архитектуре, что и GPT-3, однако в сотни раз её меньше.

Сильно недолюбливаю этот подход (тупо токенизируем данные и тупо запускаем градиентный поиск...), однако факт, что на этом пути удаётся получать совершенно неожиданные и совершенно непредсказуемые результаты. А что будет способна делать Gato, когда вырастет до размеров GPT-3? В каких областях внезапно покажет способности уровня людей-экспертов и выше? Уже сегодня нейросетки проектируют специализированные чипы и управляют истребителями лучше людей например.

Короче говоря, прогноз, что с мая 2022-го роль сильного AI во многих (всех?) областях деятельности будет возрастать экспоненциально. Самоубийственно сегодня вкладывать миллиарды в создание заводов по производству чипов 20-летней давности, и не вкладывать миллиарды в создание сильного AI.
Просили пояснить по парадигме TSL (type specific language) -- в чём отличие от DSL, в частности?

Ну, да, это можно назвать и DSL, а фишка в том, что когда вы вызываете функцию, которая ожидает аргумент определенного типа, и если он имеет явный "тип" DSL (например, регэкспа или скрипт на lua), то компилятор автоматически подключает нужный DSL-компилятор/интерпретатор и корректно обрабатывает результаты.
На днях СБ одобрил проект Основ госполитики по защите критической IT-инфраструктуры. Очень, очень, очень большое препятствие к защите и развитию таких систем, да и к общественному прогрессу в целом в том, что все направления социального роста рано или поздно упираются в нашу ограниченную способность развивать (изменять, защищать...) существующее программное обеспечение. И такое развитие и защита намного труднее, чем это реально необходимо. И есть также чисто технические решения этой проблемы, технические решения, которые могут снизить стоимость сопровождения и развития сложного программного обеспечения во всей стране в 100 раз в относительно короткие сроки - примерно, за десятилетие (но этого конечно не будет).

Пока же фактически всё ИТ развивается в таком направлении, что кода программисты пишут всё меньше, а сопровождения кривого легаси на их долю приходится всё больше, и дальше будет только хуже. Появилась даже такая профессия: Maintenance Programmer.

Недаром на днях Минцифры предложило сокращение до 30% доли расходов на разработку ПО в общем цифровом бюджете неайтишной организации -- хорош уже плодить десятки клонов с одинаковой функциональностью, лучше покупайте готовое (хотя и тут свои засады ждут).

Но это всё борьба с симптомами, а корень проблемы -- в повсеместно неверно организованном подходе к сопровождению софта. ПО исходно надо проектировать так, чтобы его далее всегда было удобно и легко развивать, но этому почти нигде не учат.
Неплохая вакансия :) $750,000/год

3+ years of experience writing, testing, deploying, and verifying Solidity applications.

А главное Remote. Может, вписаться к ним? Крипта сегодня легко бьёт типовые вакансии Кремниевой Долины по зарплате в 2-5 раз.

Берусь подготовить среднего сеньора до уровня такой вакансии за 500 часов тренировок.

P.S. Вот интересно, а российские стартапы могут по зарплатам с такими ребятами конкурировать в рамках, хм, технологического суверенитета?

P.P.S. Наверное придётся таки делать курсы по криптографии, формальным методам, EVM-языкам... Вообще, мантра Code is Law должна быть дико уважаема в современных взрослых проектах, это будущее программирования, отвечаю.
Это, типа, когда баг в коде проекта вы не можете пофиксить в принципе )))
Garbage collection -- это когда удаляешь свои профили на hhru linkedin и т. п., потому что все твои наивные мечты о классной работе в ИТ превратились в мусор )))
Очевидно же, что книги вроде "Искусства программирования" Кнута давно устарели и стали бесполезны. Никому сегодня не надо разбираться, как правильно реализовывать разные структуры данных, или как оптимально закодировать на ассемблере вычисления с плавающей запятой. Нам требуется ещё больше хипстерских курсов, как обернуть микросервисом left-pad из npm, и как задействовать для этого Kubernetes, по одной кластерной ноде на каждый добавляемый пробел.
Просили пояснить за мою гипотезу , что большое количество действующих ИТ-систем можно заоптимизировать в 100 раз относительно небольшими усилиями. Ok, ну вот первый простой пример.

Имеется база "цифрового концлагеря", где хранятся "хипстеры" и "кураторы". Поступил запрос найти всех кураторов, которые отслеживают только тех хипстеров, которые подписаны на паблик по алгебраическим криптоатакам, и физически эти кураторы находятся в том же городе, где имеется хотя бы один подходящий хипстер. Это довольно сложный и медленный SQL-запрос, если думать "технически", на уровне кода, и трудно сказать, поддаётся ли он вообще оптимизации. Попробуйте кстати для практики подобный запрос написать.

Если же подняться на более высокий уровень, о чем пишу в Сильных Идеях, то начинаем думать прежде всего на уровне т.н. семантической оптимизации . Например, некоторым образом удалось вытянуть из хмурого заказчика факт-ограничение "все хипстеры-криптографы живут в msk и spb". Вуаля: получаем тупой запрос "найти всех кураторов в msk и spb, которые отслеживают только тех хипстеров, которые подписаны на паблик по алгебраическим криптоатакам". Ну пару порядков выигрыша на таком запросе, когда в базе триллионы записей, мы должны получить.

Как работать с такой семантической оптимизацией, и вообще, с ограничениями в БД, отдельная тема. Тут нужно и мастерство проектировщика БД, и желательна хоть какая-то помощь со стороны СУБД (потому что классическая поддержка транзакций начинает вредить и мешать применению семантических ограничений -- надо уходить на уровень отдельных предложений), и AI потенциально поможет, но окупаются вложения в подобные вещи очень здорово. Как в той притче про мастера, который берёт 99% платы просто за то, что знает, куда именно надо ударить молоточком, чтобы всё заработало.
И вот ещё один тревожный факт...

Многие разработчики с зарплатами в многие сотни тысяч рублей всё ещё живут от зарплаты до зарплаты.

Вы можете не верить в это, но это происходит регулярно.

И слишком многие разработчики сегодня застревают в тонущих компаниях. Обычно они просто выживают, а самое ужасное при этом -- не развивая свои навыки и не увеличивая свои доходы.

И когда компания в конце концов терпит крах -- а сегодня такое случается постоянно, они оказываются выброшенными в безжалостное море ледяной конкуренции cо слабым алгоритмическим мышлением, с примитивными, давно устаревшими и никому сегодня не нужными скиллами по "стеку" и "фреймворку" -- и с нулём денег на банковском счету...

Штош... Надеюсь, у этих ребят готовы спасательные шлюпки.