В контексте мифического задержания Дурова пошла очередная волна разговоров про "свой мессенджер" (за очередной миллиард рублей из кармана налогоплательщиков). Чтобы в нём зарегистрироваться, потребуется личная явка в МФЦ и нотариально заверенное фото с паспортом и военным билетом. Он будет настолько безопасный, что даже сами создатели не смогут в него войти.
А под капотом у него будет (только это военная тайна) что-то из этого:
-- Rocket.Chat : куча фич: чаты, каналы, видео-/аудио-звонки, множество интеграций... заодно Meteor 3.0 полезно поизучать
-- Mattermost : микросервисный аналог слака
-- Matrix -- децентрализация, федеративные чаты и каналы (неплохой выбор, потому что пользователям можно будет рассказывать сказки про его безопасность, конфиденциальность супер-защищённость за счёт end2end шифрования)
-- Zulip -- интересная фишка, внутри чата можно выделять разные тематические потоки.
и т.п.
Только в их доморощенной версии вы будете неделями смотреть на колёсико "Ожидание одобрения сообщения": каждое "привет" надо будет согласовывать с тремя начальниками и пятью департаментами.
=
Первое правило конспирологии: "Что бы ни случилось, это то, что они задумали с самого начала".
Во-первых, арест Дурова -- вполне может быть операция прикрытия, когда он на самом деле решил перейти на недружественную сторону.
Во-вторых, вы видели хотя бы одно неофициальное фото/видео, как Дуров в аэропорту ходил, как его арестовывали, из зала суда и т.п.?
Всё что нам показали, напоминает недавний фантастический фильм "Атлас" с Дженнифер Лопес. Она весь фильм сидит в каком-то жестяном корыте с рычажками, где её периодически трясёт, а она корчит страдальческие рожи. А всё действо полностью компьютерно сгенерено.
Думайте 😎
А под капотом у него будет (только это военная тайна) что-то из этого:
-- Rocket.Chat : куча фич: чаты, каналы, видео-/аудио-звонки, множество интеграций... заодно Meteor 3.0 полезно поизучать
-- Mattermost : микросервисный аналог слака
-- Matrix -- децентрализация, федеративные чаты и каналы (неплохой выбор, потому что пользователям можно будет рассказывать сказки про его безопасность, конфиденциальность супер-защищённость за счёт end2end шифрования)
-- Zulip -- интересная фишка, внутри чата можно выделять разные тематические потоки.
и т.п.
Только в их доморощенной версии вы будете неделями смотреть на колёсико "Ожидание одобрения сообщения": каждое "привет" надо будет согласовывать с тремя начальниками и пятью департаментами.
=
Первое правило конспирологии: "Что бы ни случилось, это то, что они задумали с самого начала".
Во-первых, арест Дурова -- вполне может быть операция прикрытия, когда он на самом деле решил перейти на недружественную сторону.
Во-вторых, вы видели хотя бы одно неофициальное фото/видео, как Дуров в аэропорту ходил, как его арестовывали, из зала суда и т.п.?
Всё что нам показали, напоминает недавний фантастический фильм "Атлас" с Дженнифер Лопес. Она весь фильм сидит в каком-то жестяном корыте с рычажками, где её периодически трясёт, а она корчит страдальческие рожи. А всё действо полностью компьютерно сгенерено.
Думайте 😎
1🤔56👍14😁7🫡3🤯2
С каждым днём в Сети появляется всё больше контента, сгенерированного AI, и одна из сопутствующих бед в том, что поисковики всё чаще по запросам текста, рисунков, фото (а скоро и видео) выдают искусственные результаты. Например, "похожие" на оригинал фото -- только вылизанные и облагороженные, словно после фотошопа (и постепенно они уходят всё дальше и дальше от оригинала), или цитаты великих, "похожие" на реальные. Кстати, уже для немалого числа известных личностей, и ныне прекрасно здравствующих, по запросам по ним начинают выдаваться "их слова", сгенерённые нейронкой :)
Фанатичные Свидетели AGI-евы, мега-секта которых располагается в Кремниевой Долине, делают сегодня невиданные ранее в мировой истории инвестиции, чтобы ускорить замену реального на фиктивное. В таких условиях ситуация очень скоро может зайти в тупик -- почти наверняка в течение следующих 12 месяцев.
Фанатичные Свидетели AGI-евы, мега-секта которых располагается в Кремниевой Долине, делают сегодня невиданные ранее в мировой истории инвестиции, чтобы ускорить замену реального на фиктивное. В таких условиях ситуация очень скоро может зайти в тупик -- почти наверняка в течение следующих 12 месяцев.
5🤔57👍8🫡4💯3⚡1
С 3-го (ретроградный Меркурий всё "Я календарь переверну...") или 4-го сентября (Марс в Раке:) начинаю выкладывать для донов в этой группе новый уникальный контент: около 100 материалов СильныхИдей (сейчас они доступны только моим курсантам), причём расширенные и дополненные множеством примеров (Java).
Уровень? полезно будет всем, от крепкого джуна до сеньора, особенно тем, кто в университетах не обучался.
Материалы будут выходить минимум 1 раз в неделю, но когда выложу 5-й материал, самый старый удалю, и т.д. То есть всегда будет не более 4-х материалов (чтобы не получалось так, что через полгода стал доном разик, всё выкачал, и слился).
И с того же дня стоимость подписки для новых донов вырастет.
Первые материалы будут такие:
1. Три уровня рассуждений о программной системе.
Вы когда-нибудь задумывались о том, что значит "программа работает неправильно", "программа ошибочна"? Что-то вроде "ну, это когда она вылетает с ошибкой... но если она вроде работает, а может сломаться гипотетически, при определённых условиях... кхм, подождите...".
...Программа ошибочна, если причина, по которой она должна быть правильной, ошибочна.
...Мы перешли от ясного и простого определения проблемы к тому, что выглядит какой-то логической головоломкой, парадоксом или софизмом, и что вообще невозможно использовать :) На самом деле, это определение довольно строгое, и мы разберёмся с ним, освоив несколько понятий из области формальной верификации кода...
2. Три уровня рассуждений о программной системе-2
Вы завершили стадию предварительного планирования, и включились в циклы коротких итераций, как рекомендует agile. У вас есть доска с множеством листков-задачек, пользовательских требований, которые вам просто надо реализовать. И во всей этой гибкой движухе всё более соблазнительно отказаться от ведения отдельного документа по проектированию — в пользу того, чтобы просто начать фигачить модный самодокументирующийся код.
И это ваша роковая ошибка.
Мы рассуждаем о поведении программы на трёх уровнях...
3. Три уровня рассуждений о программной системе-3
Впечатление, что программирование с каждым днём всё больше превращается в запоминание кусков кода со stackoverflow и стандартных функций (а сегодня добавилась ещё и генерация кода LLM-ками) и последующее их комбинирование в надежде "угадать" правильное решение. Сторонники запоминания длиннющих перечней шаблонов проектирования и методов рефакторинга при этом даже не понимают разницу между метриками method-method coupling, method parameter coupling и method invocation coupling, с которых начинается запутывание и рост сложности в любом проекте.
Забудьте об этой тотально ложной парадигме, которую вам навязывает мэйнстрим. Изучая фигню, вы и специалистом станете по фигне, и работу будете искать соответствующую. Пока ещё можно много выиграть, просто изучив общие принципы computer science...
=
Там же продолжу и трек "Элитный Программист" (первая дюжина материалов выложена). Про что он?
...Программирование уже давно не считается профессией для фриков, ботаников и социофобов. Работа программистом стала очень престижной — в частности, потому, что за неё очень хорошо платят. Многие ребята буквально мечтают войти в ИТ и сделать там успешную карьеру. Однако большая засада в том, многие из этих многих, кто пытается это сделать, очень быстро упираются в потолок своей карьеры. Многие даже с трудом находят первую работу.
Если вы один из таких, и чувствуете, что застряли в своей ИТ-карьере, упёршись лбом в стеклянно-бетонный потолок, то самое первое, дорогие, что вам важно понять: это не ваша вина! Против вас ведётся тщательно продуманная и очень хорошо организованная война.
Самая главная причина, по которой люди застревают в своей карьере в сфере ИТ, заключается в том, что такая работа и такая карьера требуют очень хорошей способности концентрироваться. Но в наши дни вокруг вас так много отвлекающих факторов, что порой сосредоточиться очень трудно. И все это скорее специально, чем случайно.
Уровень? полезно будет всем, от крепкого джуна до сеньора, особенно тем, кто в университетах не обучался.
Материалы будут выходить минимум 1 раз в неделю, но когда выложу 5-й материал, самый старый удалю, и т.д. То есть всегда будет не более 4-х материалов (чтобы не получалось так, что через полгода стал доном разик, всё выкачал, и слился).
И с того же дня стоимость подписки для новых донов вырастет.
Первые материалы будут такие:
1. Три уровня рассуждений о программной системе.
Вы когда-нибудь задумывались о том, что значит "программа работает неправильно", "программа ошибочна"? Что-то вроде "ну, это когда она вылетает с ошибкой... но если она вроде работает, а может сломаться гипотетически, при определённых условиях... кхм, подождите...".
...Программа ошибочна, если причина, по которой она должна быть правильной, ошибочна.
...Мы перешли от ясного и простого определения проблемы к тому, что выглядит какой-то логической головоломкой, парадоксом или софизмом, и что вообще невозможно использовать :) На самом деле, это определение довольно строгое, и мы разберёмся с ним, освоив несколько понятий из области формальной верификации кода...
2. Три уровня рассуждений о программной системе-2
Вы завершили стадию предварительного планирования, и включились в циклы коротких итераций, как рекомендует agile. У вас есть доска с множеством листков-задачек, пользовательских требований, которые вам просто надо реализовать. И во всей этой гибкой движухе всё более соблазнительно отказаться от ведения отдельного документа по проектированию — в пользу того, чтобы просто начать фигачить модный самодокументирующийся код.
И это ваша роковая ошибка.
Мы рассуждаем о поведении программы на трёх уровнях...
3. Три уровня рассуждений о программной системе-3
Впечатление, что программирование с каждым днём всё больше превращается в запоминание кусков кода со stackoverflow и стандартных функций (а сегодня добавилась ещё и генерация кода LLM-ками) и последующее их комбинирование в надежде "угадать" правильное решение. Сторонники запоминания длиннющих перечней шаблонов проектирования и методов рефакторинга при этом даже не понимают разницу между метриками method-method coupling, method parameter coupling и method invocation coupling, с которых начинается запутывание и рост сложности в любом проекте.
Забудьте об этой тотально ложной парадигме, которую вам навязывает мэйнстрим. Изучая фигню, вы и специалистом станете по фигне, и работу будете искать соответствующую. Пока ещё можно много выиграть, просто изучив общие принципы computer science...
=
Там же продолжу и трек "Элитный Программист" (первая дюжина материалов выложена). Про что он?
...Программирование уже давно не считается профессией для фриков, ботаников и социофобов. Работа программистом стала очень престижной — в частности, потому, что за неё очень хорошо платят. Многие ребята буквально мечтают войти в ИТ и сделать там успешную карьеру. Однако большая засада в том, многие из этих многих, кто пытается это сделать, очень быстро упираются в потолок своей карьеры. Многие даже с трудом находят первую работу.
Если вы один из таких, и чувствуете, что застряли в своей ИТ-карьере, упёршись лбом в стеклянно-бетонный потолок, то самое первое, дорогие, что вам важно понять: это не ваша вина! Против вас ведётся тщательно продуманная и очень хорошо организованная война.
Самая главная причина, по которой люди застревают в своей карьере в сфере ИТ, заключается в том, что такая работа и такая карьера требуют очень хорошей способности концентрироваться. Но в наши дни вокруг вас так много отвлекающих факторов, что порой сосредоточиться очень трудно. И все это скорее специально, чем случайно.
6👍54❤10✍7😎1
...Существует множество компаний, которые хотят отнять у вас буквально всё ваше внимание. Ваше внимание конвертируется в их прибыль. На эту борьбу работают многие тысячи профессиональных психологов и специалистов по Бигдате и AI. А так как вы противостоите этой профессиональной армии фактически в одиночку, и при этом вы самый обычный гражданский человек, совершенно не обученный военным действиям за своё внимание и свой здоровый ум, то вы обречены проиграть.
Ваше внимание — это очень ограниченный ресурс ума, и вы постоянно проигрываете в битве за него; в результате у вас остаётся мало ресурсов, чтобы сосредоточиться на продуктивной работе. Именно поэтому многие ИТ-специалисты упираются в потолок своей карьеры, дальше которого они не могут продвинуться. Проблема не в том, что им не хватает соображалки, нет: в 90% случаев им не хватает умения длительное время сосредотачиваться на одном главном, и не тратить при этом энергию ума на постоянные отвлечения.
У меня для вас однако хорошая новость: вы можете выиграть эту войну, хотя это и будет нелегко. Но вы сможете победить все отвлекающие факторы и стать чётким, собранным, дисциплинированным и продуктивным разработчиком, которого все жаждут взять на работу. Этому и посвящён трек "Элитный программист", который научит вас, как это сделать.
=
Краткое описание всех материалов СИ, ЭП и курса карьеры (для курсантов) выкладываю тут.
Ваше внимание — это очень ограниченный ресурс ума, и вы постоянно проигрываете в битве за него; в результате у вас остаётся мало ресурсов, чтобы сосредоточиться на продуктивной работе. Именно поэтому многие ИТ-специалисты упираются в потолок своей карьеры, дальше которого они не могут продвинуться. Проблема не в том, что им не хватает соображалки, нет: в 90% случаев им не хватает умения длительное время сосредотачиваться на одном главном, и не тратить при этом энергию ума на постоянные отвлечения.
У меня для вас однако хорошая новость: вы можете выиграть эту войну, хотя это и будет нелегко. Но вы сможете победить все отвлекающие факторы и стать чётким, собранным, дисциплинированным и продуктивным разработчиком, которого все жаждут взять на работу. Этому и посвящён трек "Элитный программист", который научит вас, как это сделать.
=
Краткое описание всех материалов СИ, ЭП и курса карьеры (для курсантов) выкладываю тут.
7❤45👍14⚡7✍1🔥1
Культура ФП на самом деле очень прагматична: сначала вы определяете типы и пишите функции, и только потом формируете более сложные абстракции. На определённом уровне вы просто садитесь за IDE vim и начинаете сразу фигачить достаточно качественный код (потому что, в частности, хорошая система типов сразу сильно ограничивает в написании фигни).
Если же вы используете ООП, то вам сперва придётся достаточно чётко продумывать объектные абстракции и схемы их взаимодействия (что весьма сложно; например, с помощью АТД; у меня отдельный трек ООАП этому посвящён), и только потом писать логику методов.
Вчера я говорил, что "...всё более соблазнительно отказаться от ведения отдельного документа по проектированию — в пользу того, чтобы просто начать фигачить модный самодокументирующийся код. И это ваша роковая ошибка...", но это относится к мэйнстриму конечно. Сегодня тотально учат "ООП" с самого начала, просто как "удобный" скилл кодирования. Правильно же начинать учить ООП с концепции обмена сообщениями (каким ООП и был в оригинале у Алана Кэя), немного затронуть сигма-исчисление (формальная модель ООП Луки Карделли), потом плавно переходить к модели акторов. А в идеале, лучше вообще начинать с разбора вычислительных моделей (декларативная, императивная, объектная...).
Если же вы используете ООП, то вам сперва придётся достаточно чётко продумывать объектные абстракции и схемы их взаимодействия (что весьма сложно; например, с помощью АТД; у меня отдельный трек ООАП этому посвящён), и только потом писать логику методов.
Вчера я говорил, что "...всё более соблазнительно отказаться от ведения отдельного документа по проектированию — в пользу того, чтобы просто начать фигачить модный самодокументирующийся код. И это ваша роковая ошибка...", но это относится к мэйнстриму конечно. Сегодня тотально учат "ООП" с самого начала, просто как "удобный" скилл кодирования. Правильно же начинать учить ООП с концепции обмена сообщениями (каким ООП и был в оригинале у Алана Кэя), немного затронуть сигма-исчисление (формальная модель ООП Луки Карделли), потом плавно переходить к модели акторов. А в идеале, лучше вообще начинать с разбора вычислительных моделей (декларативная, императивная, объектная...).
2🤔37👍33❤8⚡6🫡2
Ёлки-палки, плохи наши дела ))
LLMs can function not only as databases, but also as dynamic, end-user programmable neural computers.
LLMs cannot reason. Many are working on fixing this. For example, below is a proposal to add logic programming (Prolog) by teaching an LLM to translate natural language queries into Prolog statements, which are then answered by a Prolog processor...
... the integration of Prolog enables LLMs to achieve high performance on the NLR dataset, which even the most advanced language models (including GPT4) fail to solve using text only.
Автор тот самый Эрик Мейер ("Why the fuck do we let people that have no computer science backgrounds write code? Unacceptable!").
LLMs can function not only as databases, but also as dynamic, end-user programmable neural computers.
LLMs cannot reason. Many are working on fixing this. For example, below is a proposal to add logic programming (Prolog) by teaching an LLM to translate natural language queries into Prolog statements, which are then answered by a Prolog processor...
... the integration of Prolog enables LLMs to achieve high performance on the NLR dataset, which even the most advanced language models (including GPT4) fail to solve using text only.
Автор тот самый Эрик Мейер ("Why the fuck do we let people that have no computer science backgrounds write code? Unacceptable!").
❤38🤔26👍7🫡4
Думаю, как сделать Школу максимально элитарной: буду объяснять темы так, будто твой дедушка лауреат премии Тьюринга, и ты просто обязан понимать всё с полуслова
примерно как бренд Birkin (люксовые сумки). Бренд позиционирует себя настолько крутым, что потенциальным клиентам нужно сперва долго обхаживать продавца сумок, делать ему подарки, и в целом для начала купить товаров как минимум на 10,000 евро.
У меня первым шагом к подобной илитарности будет полный запрет таких слов, как SOLID, DRY, CRUD, MVC, Clean и DDD.
примерно как бренд Birkin (люксовые сумки). Бренд позиционирует себя настолько крутым, что потенциальным клиентам нужно сперва долго обхаживать продавца сумок, делать ему подарки, и в целом для начала купить товаров как минимум на 10,000 евро.
У меня первым шагом к подобной илитарности будет полный запрет таких слов, как SOLID, DRY, CRUD, MVC, Clean и DDD.
2😎52🤔24👍10🏆7❤4
В ряде ситуаций, когда вы провалили собес, это может быть к лучшему не только в плане опыта. Например, Брайан Эктон не прошёл в 2009-м стандартное техническое собеседование в facebook, и с горя запилил whatsapp. Сперва, кстати, это была просто мобильная программка для показа статусов из списка контактов, и только потом Брайан с Яном Куном решили добавить возможность обмена сообщениями. Потом появились уведомления и смс, появилась годовая подписка за один доллар (причём первый год бесплатно) -- и уже в 2014-м фейсбук купил вотсап за 19 миллиардов долларов.
P.S. На собесах в фейсбук кстати спрашиваются стандартные вещи
("Как я получил оффер от Фейсбука и в итоге к ним не пошёл"),
например: "как изменится твоя модель, если водитель не привязан жёстко к автомобилю (скажем, компания-таксопарк может назначать одному и тому же водителю разные машины в разные дни)? Как будет устроена связь автомобиля с поездкой?"
Товарищи курсанты, это вам ничего с моих проектов не напоминает? :)
P.S. На собесах в фейсбук кстати спрашиваются стандартные вещи
("Как я получил оффер от Фейсбука и в итоге к ним не пошёл"),
например: "как изменится твоя модель, если водитель не привязан жёстко к автомобилю (скажем, компания-таксопарк может назначать одному и тому же водителю разные машины в разные дни)? Как будет устроена связь автомобиля с поездкой?"
Товарищи курсанты, это вам ничего с моих проектов не напоминает? :)
1👍66😁9❤🔥3
Лаборатория Математики и Программирования Сергея Бобровского
В ряде ситуаций, когда вы провалили собес, это может быть к лучшему не только в плане опыта. Например, Брайан Эктон не прошёл в 2009-м стандартное техническое собеседование в facebook, и с горя запилил whatsapp. Сперва, кстати, это была просто мобильная программка…
"Термы -- это деревья, а деревья -- это термы"
-- Банчи (книга "Конечные автоматы, их алгебры и грамматики – к теории формальных выражений")
Компиляторы, автоматы, AST, правила вывода, разбор json, редьюсинг алгебраических выражений, паттерн матчинг и многое многое другое -- это всё про переписывание термов.
На F# пацаны разбирают что-то вроде (^f.(^x.f(^y.xxy))(^x.f(^y.xxy))) легко и просто (редуцируется этот терм к нормальной форме?неа, он рекурсивен; подумайте, почему ), а вот если термов сотня миллионов?? )))
Например, можно запилить hott-плагин для Lean , сэмулировав аксиому унивалентности:
universe u
constant U : Type u
-- простейшая версия эквивалентности типов :)
constant equiv : U → U → Type u
axiom univalence : ∀ (A B : U), equiv A B → A = B
example (A B : U) (e : equiv A B) : A = B := univalence A B e
Или расширить новыми теориями инструменты формальной верификации криптографических протоколов ProVerif или Tamarin (в них тоже активно используются термы и правила их переписывания) ...
=
Однако с лёгкой печалью обнаружил, что vds с озу 200 гиг под подобные задачки стоит дороже, чем дедик, меньше $100/месяц не получается...
(и хорошо масштабируемый русский облачный сервис для Jupyter я тоже не нашёл)
Рабочие станции Dell 7920, HP Z8 G4, Lenovo P920 (потенциально терабайты оперативки) продаются с 16 гб (!) от трёх тысяч долларов (а серваки уже от $5 тыс). Какие-то мутные материнки вроде ASUS ROG Rampage VI Extreme Encore 128гб продаются за 100 долларов, но крайне сомнительно, reconditioned сгорит через неделю.
-- Банчи (книга "Конечные автоматы, их алгебры и грамматики – к теории формальных выражений")
Компиляторы, автоматы, AST, правила вывода, разбор json, редьюсинг алгебраических выражений, паттерн матчинг и многое многое другое -- это всё про переписывание термов.
На F# пацаны разбирают что-то вроде (^f.(^x.f(^y.xxy))(^x.f(^y.xxy))) легко и просто (редуцируется этот терм к нормальной форме?
Например, можно запилить hott-плагин для Lean , сэмулировав аксиому унивалентности:
universe u
constant U : Type u
-- простейшая версия эквивалентности типов :)
constant equiv : U → U → Type u
axiom univalence : ∀ (A B : U), equiv A B → A = B
example (A B : U) (e : equiv A B) : A = B := univalence A B e
Или расширить новыми теориями инструменты формальной верификации криптографических протоколов ProVerif или Tamarin (в них тоже активно используются термы и правила их переписывания) ...
=
Однако с лёгкой печалью обнаружил, что vds с озу 200 гиг под подобные задачки стоит дороже, чем дедик, меньше $100/месяц не получается...
(и хорошо масштабируемый русский облачный сервис для Jupyter я тоже не нашёл)
Рабочие станции Dell 7920, HP Z8 G4, Lenovo P920 (потенциально терабайты оперативки) продаются с 16 гб (!) от трёх тысяч долларов (а серваки уже от $5 тыс). Какие-то мутные материнки вроде ASUS ROG Rampage VI Extreme Encore 128гб продаются за 100 долларов, но крайне сомнительно, reconditioned сгорит через неделю.
1🤯59🔥10👍8🫡4❤2
Вкатываемся в понедельник 💪🏻💪🏻💪🏻
По картинке кстати ничего странного, совершенно типовая ситуация: пацан явно не проходил мой курс по software design, который так и называется: "Незримые механизмы логики". В частности, часть 2 "Как так получается, что вроде бы давно работающий код всё ещё содержит баги?".
По картинке кстати ничего странного, совершенно типовая ситуация: пацан явно не проходил мой курс по software design, который так и называется: "Незримые механизмы логики". В частности, часть 2 "Как так получается, что вроде бы давно работающий код всё ещё содержит баги?".
1⚡38😁19👍7🤔3🫡2
Почему в своё время стали так популярны нетипизированные языки (PHP, Python, ...)? Потому что компьютеры тогда были столь слабы, что если пишешь код на языке со статической типизаций и включённым тайпчекингом, то каждое сохранение файла может длиться десятки секунд. Это дико бесило :)
Поэтому в то время нетипизированные языки и тесты были основным инструментом разработки. Тесты в целом конечно работают медленнее, чем тайпчекинг, но запускаются они считанные разы, а файлы мы сохраняем постоянно.
Сейчас компьютеры шустрые, поэтому проверка статических типов гораздо лучше и надёжнее выполняет свою задачу, чем вы.
С тех пор однако мэйнстрим тянет и тянет в массы "культуру" тестирования, объявляя её обязательной, хотя 90% закодированных вручную тестов в любой современной системе бесполезны (например, потому, что тесты нужны только если они не работают), и вместо них должны (бы) быть статические типы.
В любом случае, каждому разработчику, который хочет стать Программистом с большой буквы, 💯 полезно поиграть в такие высокоинтеллектуальные игры, как система типов в F# (и в F*), мета-программирование на темплейтах плюсов, генерики TypeScript, боль и страдание Rust :) и т.п. Такой этап в карьере стратегически весьма важен.
Поэтому в то время нетипизированные языки и тесты были основным инструментом разработки. Тесты в целом конечно работают медленнее, чем тайпчекинг, но запускаются они считанные разы, а файлы мы сохраняем постоянно.
Сейчас компьютеры шустрые, поэтому проверка статических типов гораздо лучше и надёжнее выполняет свою задачу, чем вы.
С тех пор однако мэйнстрим тянет и тянет в массы "культуру" тестирования, объявляя её обязательной, хотя 90% закодированных вручную тестов в любой современной системе бесполезны (например, потому, что тесты нужны только если они не работают), и вместо них должны (бы) быть статические типы.
В любом случае, каждому разработчику, который хочет стать Программистом с большой буквы, 💯 полезно поиграть в такие высокоинтеллектуальные игры, как система типов в F# (и в F*), мета-программирование на темплейтах плюсов, генерики TypeScript, боль и страдание Rust :) и т.п. Такой этап в карьере стратегически весьма важен.
10👍65❤10🫡10🔥3
"На смену изумлению приходит ужас"
Последние новости от наших курсантов :)
В планах включить настройку по отключению/включению всех шедулеров, поскольку сейчас висит техдолг на их локальную отладку. В данный момент мы руками прописываем в начале выполнения шедулера return, чтобы он не стучался к той базе, к которой локально нет доступа:)
---
1. Мозг - глючное. Если не переносить мышление и особенно проектирование в экзокортекс - всегда просочится подобная "все-фигня" (читаю Левенчука понемногу :)
2. С протекшим в реализацию "не правильным" обобщением бороться можно, и в коде и инфраструктуре, но все как то сплошными костылями. Иногда эти костыли настолько ущербны и к тому же не очень просты (как минимум не дешевы по времени), что проще жить дальше, ибо...
3. Нормально делать и пытаться делать нужно было с самого начала. Тут мы плавно возвращаемся к пункту 1, где на примере опыта никто экзокортекс не использовал.
---
Есть таблица с историей какой-то сущности, например банковская карта, и требуется отобрать счета имевшие определённый статус на конкретную дату. Прямым запросом к этой таблице результат не получить - этот статус относится к второстепенным признакам и фиксируется отдельно, вместе с ещё примерно полусотней признаков. В этой дополнительной таблице тоже так просто не получить результат - там для этих 50..100 признаков всего штук пять колонок - внешний ключ к первой таблице, дата изменения, цифровой код признака который был изменён, значение этого признака (или код значения). В итоге, бизнес требования на языке запросов выглядят наподобие
select ...
from card
join card_adv ca1 on card.id = ca1.id and ca1.field1 = 15 and ca1.field2 = 53
join card_adv ca2 on card.id = ca2.id and ca2.field1 = 48 and ca2.field2 = 19
...
---
По итогу перепроверили айпишники и правда, срок договора выделенных прямых айпи истек, аналитик продлил его и запрос отправился, шаг выполнился, но не следующий...
А все потому что 1с решил поменять жсон ответ с Да на "Да", наша кукухазачеркнуто десериализация по дто полетела на попытки спарсить булеву :)
--
Когда заглядываешь во внутрь тех структур данных которыми активно пользуешься, с них спадает магическая вуаль, и ты поражаешься что не так уж замысловато все устроено.
На смену изумлению приходит ужас, когда смотришь на свой старый код с этими структурами, понимая сколько лишних телодвижений происходит.
Благодаря курсу я немного пролечил свой синдром самозванца.
(Когда-то на собеседовании не смог динамический массив реализовать, теперь гештальт закрыт :)
Последние новости от наших курсантов :)
В планах включить настройку по отключению/включению всех шедулеров, поскольку сейчас висит техдолг на их локальную отладку. В данный момент мы руками прописываем в начале выполнения шедулера return, чтобы он не стучался к той базе, к которой локально нет доступа:)
---
1. Мозг - глючное. Если не переносить мышление и особенно проектирование в экзокортекс - всегда просочится подобная "все-фигня" (читаю Левенчука понемногу :)
2. С протекшим в реализацию "не правильным" обобщением бороться можно, и в коде и инфраструктуре, но все как то сплошными костылями. Иногда эти костыли настолько ущербны и к тому же не очень просты (как минимум не дешевы по времени), что проще жить дальше, ибо...
3. Нормально делать и пытаться делать нужно было с самого начала. Тут мы плавно возвращаемся к пункту 1, где на примере опыта никто экзокортекс не использовал.
---
Есть таблица с историей какой-то сущности, например банковская карта, и требуется отобрать счета имевшие определённый статус на конкретную дату. Прямым запросом к этой таблице результат не получить - этот статус относится к второстепенным признакам и фиксируется отдельно, вместе с ещё примерно полусотней признаков. В этой дополнительной таблице тоже так просто не получить результат - там для этих 50..100 признаков всего штук пять колонок - внешний ключ к первой таблице, дата изменения, цифровой код признака который был изменён, значение этого признака (или код значения). В итоге, бизнес требования на языке запросов выглядят наподобие
select ...
from card
join card_adv ca1 on card.id = ca1.id and ca1.field1 = 15 and ca1.field2 = 53
join card_adv ca2 on card.id = ca2.id and ca2.field1 = 48 and ca2.field2 = 19
...
---
По итогу перепроверили айпишники и правда, срок договора выделенных прямых айпи истек, аналитик продлил его и запрос отправился, шаг выполнился, но не следующий...
А все потому что 1с решил поменять жсон ответ с Да на "Да", наша кукухазачеркнуто десериализация по дто полетела на попытки спарсить булеву :)
--
Когда заглядываешь во внутрь тех структур данных которыми активно пользуешься, с них спадает магическая вуаль, и ты поражаешься что не так уж замысловато все устроено.
На смену изумлению приходит ужас, когда смотришь на свой старый код с этими структурами, понимая сколько лишних телодвижений происходит.
Благодаря курсу я немного пролечил свой синдром самозванца.
(Когда-то на собеседовании не смог динамический массив реализовать, теперь гештальт закрыт :)
3⚡35👍28✍6🤔3🏆2
😁57🤔28✍7🤓3👍2
Смотрю, сейчас многие ноют дескать "найм сломан", "у меня 100500 лет опыта, а на моё резюме 0 отлкиков" бла бла бла.
Ну, тут либо твой опыт программирования столь впечатляющ, что кадровики просто не верят, что ты настоящий, а не AI 😂
либо это скрытая награда от Вселенной за то, что ты освободился от участия в очередном кругеада собеседований на давно уже закрытые вакансии.
Но вообще интересно, как там на самом деле. Несколько лет назад я делал эксперимент: выложил резюме в духе "27 лет, опыт 4 года", и за полдня мне накидали с десяток приглашений пообщаться (некоторые были столь душевные, что я едва удержался:). И сейчас стану такой же экс-пе-римен-татор (и опытным, и джуном без опыта), причём постараюсь ситуацию максимально ухудшить, как можно дальше отойти от всех шаблонов и рекомендаций эйчаров. Всё буду делать наоборот, и потом вам расскажу.
Осень самое горячее время хантинга, сезон сбора фруктов и талантливых разработчиков. Рекрутеры, как белки, запасают побольше программистов на зиму, в результате вакансии растут быстрее, чем ты успеваешь собирать грибы.
Или нет?
Ну, тут либо твой опыт программирования столь впечатляющ, что кадровики просто не верят, что ты настоящий, а не AI 😂
либо это скрытая награда от Вселенной за то, что ты освободился от участия в очередном круге
Но вообще интересно, как там на самом деле. Несколько лет назад я делал эксперимент: выложил резюме в духе "27 лет, опыт 4 года", и за полдня мне накидали с десяток приглашений пообщаться (некоторые были столь душевные, что я едва удержался:). И сейчас стану такой же экс-пе-римен-татор (и опытным, и джуном без опыта), причём постараюсь ситуацию максимально ухудшить, как можно дальше отойти от всех шаблонов и рекомендаций эйчаров. Всё буду делать наоборот, и потом вам расскажу.
Осень самое горячее время хантинга, сезон сбора фруктов и талантливых разработчиков. Рекрутеры, как белки, запасают побольше программистов на зиму, в результате вакансии растут быстрее, чем ты успеваешь собирать грибы.
Или нет?
1👍75🔥14🫡7🏆3❤2
Когда тебе дают 60 миллиардов рублей на то, чтобы внедрить технологию, которая будет официально работать на 96%, и ни эти мифические проценты, не само "внедрение" проконтролировать ну никак невозможно (хотя для отчётности конечно нарисуют красивые kpi), понятно, ты будешь в первую очередь вкладывать миллионы рублей в свой пиар, чтобы создавалась видимость твоей активности. Например, проплачивать популярным ютуберам, чтобы они побольше ныли, что дескать средств доступа становится всё меньше. В ЦРУ очередная раздача премий 😎
В учебнике по языку спецификаций TLA+ вводится понятие формальных свойств системы -- не как инженерная характеристика, а как некоторый инвариант (в СильныхИдеях разбираю этот момент в материале "Формализуем понятие надёжности системы").
Самый сильный инвариант -- STRONG:
"во всех состояниях x находится под контролем (в допустимом диапазоне)"
Ну а в случае с 60 млрд. мы получим самый слабый инвариант WEAK:
"по крайней мере, в одном состоянии x находится под контролем"
И когда вокруг "весь этот горький катаклизм, который я здесь наблюдаю, и Владимир Николаевич тоже", инвариант WEAK совершенно бессмысленен.
В учебнике по языку спецификаций TLA+ вводится понятие формальных свойств системы -- не как инженерная характеристика, а как некоторый инвариант (в СильныхИдеях разбираю этот момент в материале "Формализуем понятие надёжности системы").
Самый сильный инвариант -- STRONG:
"во всех состояниях x находится под контролем (в допустимом диапазоне)"
Ну а в случае с 60 млрд. мы получим самый слабый инвариант WEAK:
"по крайней мере, в одном состоянии x находится под контролем"
И когда вокруг "весь этот горький катаклизм, который я здесь наблюдаю, и Владимир Николаевич тоже", инвариант WEAK совершенно бессмысленен.
2✍46👍12🤔12🫡1
"Wildberries крадёт заказы. Жёсткий баг заставляет покупки СРАЗУ уезжать обратно на склад, даже если срок хранения не истёк. Деньги при этом списываются! Проблема висит уже больше четырёх часов."
В СильныхИдеях разбираю подобные случаи и рекомендую, что с ними можно поделать:
"...В 98% проектов, где более-менее организовано нормальное тестирование, от вас ожидают множества модульных/регрессионных тестов, и небольшого количества высокоуровневых тестов. Причина в том, что интеграционные и сквозные тесты дорогие и медленные, и "покрыть" ими обычно удаётся лишь малую часть пространства состояний программы. Поэтому в мэйнстриме подразумевается, что лучше сосредоточиться на тестировании всех частей по отдельности, чем на тестировании того, как они все работают вместе.
Но глобальная корректность вообще никак не следует из локальной корректности. Вполне возможно, что каждая часть по отдельности будет надёжной, но система в целом поломается. Более того, вполне возможен эффект эмерджентности: ваша система начнёт проявлять совершенно непредсказуемое и никем не планировавшееся и не ожидавшееся поведение :) Чаще всего это случается, когда нестандартная комбинация фич нарушает глобальное поведение...
Зачастую нет очевидно неправильного прогнозируемого состояния. Система выглядит так, будто работает нормально, пока всё не сломается...
Данный класс ошибок -- глобальное свойство системы, модульные тесты не могут найти их через тестирование локального взаимодействия функций, и не могут подтвердить, что вы их избежали. Нам нужна трассировка поведения от начала до конца. Однако это огромное пространство состояний, и E2E тесты могут покрыть только (совсем небольшую) часть этого пространства...
Мы ничего не можем поделать с последствиями ошибок данного класса -- обычно они весьма серьёзны, хотя мы и можем сделать эти вещи немного более управляемыми..."
Извините, вы обречены.
В СильныхИдеях разбираю подобные случаи и рекомендую, что с ними можно поделать:
"...В 98% проектов, где более-менее организовано нормальное тестирование, от вас ожидают множества модульных/регрессионных тестов, и небольшого количества высокоуровневых тестов. Причина в том, что интеграционные и сквозные тесты дорогие и медленные, и "покрыть" ими обычно удаётся лишь малую часть пространства состояний программы. Поэтому в мэйнстриме подразумевается, что лучше сосредоточиться на тестировании всех частей по отдельности, чем на тестировании того, как они все работают вместе.
Но глобальная корректность вообще никак не следует из локальной корректности. Вполне возможно, что каждая часть по отдельности будет надёжной, но система в целом поломается. Более того, вполне возможен эффект эмерджентности: ваша система начнёт проявлять совершенно непредсказуемое и никем не планировавшееся и не ожидавшееся поведение :) Чаще всего это случается, когда нестандартная комбинация фич нарушает глобальное поведение...
Зачастую нет очевидно неправильного прогнозируемого состояния. Система выглядит так, будто работает нормально, пока всё не сломается...
Данный класс ошибок -- глобальное свойство системы, модульные тесты не могут найти их через тестирование локального взаимодействия функций, и не могут подтвердить, что вы их избежали. Нам нужна трассировка поведения от начала до конца. Однако это огромное пространство состояний, и E2E тесты могут покрыть только (совсем небольшую) часть этого пространства...
Мы ничего не можем поделать с последствиями ошибок данного класса -- обычно они весьма серьёзны, хотя мы и можем сделать эти вещи немного более управляемыми..."
Извините, вы обречены.
2✍49👍13🫡5🔥3❤1
2🤔46👍4✍3🔥1
Ну, дорогие, вы чего ↑ ↑ ↑
"немного копиписты логики" быстро разрастётся в 100500 мест по всему коду, да ещё и с небольшими "местными" правками. И когда вы вздумаете этот код отрефакторить (причём вручную), всё равно получится зависимость, только не маленькая, а функция со 128 параметрами в попытке учесть все контексты, да ещё и не факт, что вы поймаете в рефакторинг все "похожие" куски кода.
А если вы сразу добавите немного зависимости -- компактная функция с чётко определённой спецификацией, во-первых, теперь править можно только одно место в коде, а во-вторых, главное, весь внешний код в 100500 мест теперь будет писаться с учётом сигнатуры этой функции, и неприятных побочных последствий практически не возникнет.
Но тут конечно нужен разумный баланс, который рождается из опыта + правильного обучения. Например, вы можете чрезмерно увлечься IoC, хотя все подобные проблемы естественно решаются иммутабельностью, и т.п.
Короче, всем срочно на мой курс по software design "Незримые механизмы логики" 🙏
P.S. Shittier с картинки забираем тут.
"немного копиписты логики" быстро разрастётся в 100500 мест по всему коду, да ещё и с небольшими "местными" правками. И когда вы вздумаете этот код отрефакторить (причём вручную), всё равно получится зависимость, только не маленькая, а функция со 128 параметрами в попытке учесть все контексты, да ещё и не факт, что вы поймаете в рефакторинг все "похожие" куски кода.
А если вы сразу добавите немного зависимости -- компактная функция с чётко определённой спецификацией, во-первых, теперь править можно только одно место в коде, а во-вторых, главное, весь внешний код в 100500 мест теперь будет писаться с учётом сигнатуры этой функции, и неприятных побочных последствий практически не возникнет.
Но тут конечно нужен разумный баланс, который рождается из опыта + правильного обучения. Например, вы можете чрезмерно увлечься IoC, хотя все подобные проблемы естественно решаются иммутабельностью, и т.п.
Короче, всем срочно на мой курс по software design "Незримые механизмы логики" 🙏
P.S. Shittier с картинки забираем тут.
1✍50👍7🔥7🐳5🫡5