Рубрика: Uncategorized

  • Задача про византийских генералов

    Задача про византийских генералов

    Представьте, что несколько средневековых армий осаждают город. Чтобы победить, все армии должны одновременно атаковать или оставаться на месте. В противном случае сил не хватит и при частичной атаке армии будут разбиты.
    Коммуникация между армиями идёт через гонцов, которых могут перехватить и подменить послания.
    Как договориться, если единичным сообщениям нельзя верить?

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

    Это и есть задача, которую решает блокчейн: как договориться, если нельзя доверять каждому сообщению?
    Отсюда происходит триллема блокчейна — сложно совместить все три желаемые свойства: децентрализацию (все армии равны, нет главного), масштабируемость (чем больше армий, тем сложнее договориться) и безопасность (решения нельзя подделать).

    В реальном мире решается через компромисс:
    – Безопасно и децентрализовано — но медленно (Bitcoin, ранний Ethereum до L2).
    – Быстро и безопасно — но большая централизация (Solana).
    – Быстро и масштабируемо — но легче атаковать систему ложными сообщениями (корпоративные блокчейны, BSC).

    Новое поколение блокчейнов (Cosmos, Avalanche, Polkadot, TON) пытаются обойти триллему за счет разных технологических ухищрений и разделения задачи на части. Победителя пока нет — и, возможно, не будет: разные задачи требуют разных компромиссов.

  • Печеньки в браузере — зачем они и почему нас о них предупреждают?

    Печеньки в браузере — зачем они и почему нас о них предупреждают?

    Начнём с того, что это не простые печенья, а китайские печенья с предсказаниями. Те самые, которые разламываешь и находишь бумажку с посланием. Браузер получает печеньку от сайта, но не читает её — послание для него не имеет смысла, это личные заметки сайта.

    Куки пришли в браузеры в конце 90-х ради создания привычной нам корзины в интернет-магазинах. Сайт выдавал номер корзины пользователю. А после загрузки следующей страницы читал куки и находил корзину пользователя.

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

    Сайты не спрашивали пользователя, нужна ли ему печенька. Конечно нужна, зачем спрашивать? Без неё сохранить логин на сайте или корзину было невозможно.

    А потом пришли они…. чужие куки от сторонних сайтов.
    Сайты начали добавлять к себе чужой код — счетчики посещений, аналитика поведения, показы баннеров. Рекламные сети начали оставлять в браузере пользователя свои куки. И узнавать, что один и тот же пользователь зашёл на сайт с поиском работы, выбором медицинских услуг или ремонтом телефона.
    Очень быстро рекламные сети стали знать слишком много. И показывать рекламу о том, о чём вы бы не стали им рассказывать.

    Законотворцы узнали про это безобразие и начали выпускать законы 🤦‍♂️. Теперь мы смотрим на предупреждения, которые обязаны вешать владельцы сайтов, что они используют куки. Даже свои собственные — белые и пушистые — для запоминания вашей корзины. Но даже если предупреждения нет — куки вы, скорее всего, всё равно получите 👿.

    Проблема должна решаться технологически на стороне браузера.
    Safari, Firefox, Brave и Edge уже частично блокируют куки сторонних сайтов. Chrome блокирует их пока только в режиме инкогнито, ведь больше всего от этой технологии зарабатывает разработчик Chrome — Google 🙈.

    Когда браузеры договорятся — предупреждения о кукисах уйдут в историю. А пока — терпим.

  • К недавним воспоминаниям про ZX Spectrum добавились свежие новости и неизвестные факты

    К недавним воспоминаниям про ZX Spectrum добавились свежие новости и неизвестные факты

    К недавним воспоминаниям про ZX Spectrum добавились свежие новости и неизвестные факты.

    В 1980-х игры и программы можно было получить по радио! Буквально записать FM-эфир на аудиокассету. Такие передачи выходили на BBC и других национальных радиостанциях по всей Европе.

    Поскольку версии языка BASIC отличались на ZX, Commodore, Atari и других платформах, был создан универсальный стандарт BASICODE. В этом формате шло вещание. Для воспроизведения таких записей нужно было вначале загрузить BASICODE, а затем записанную программу.

    В мае 2024 года игру для ZX Spectrum вновь передали в эфире Словенского радио.

    А в октябре 2024 вышел документальный фильм про историю ZX Spectrum “Чудо с резиновыми кнопками”, деньги на съемки которого собрали на Кикстартере.

    Интересные ссылки:
    – BASICODE на Wikipedia
    – Новость об эфире с игрой
    – Фильм The Rubber-Keyed Wonder (англ.)
    – Фильм Чудо с резиновыми кнопками (перевод на русский язык)

  • Как измерять работу программистов

    Как измерять работу программистов

    Как измерять работу программистов.

    CEO и CFO приходят к CTO с вопросом: можно ли оптимизировать затраты на разработку? Как понять, кого уволить, а кто хорошо работает? Кому сколько платить?

    В среде программистов есть много мнений по поводу метрик и нужно ли измерять производительность разработчика.

    Очевидные метрики, которые придумает HR:
    – Присутствие на рабочем месте.
    – Количество выполненных задач.
    – Количество часов, затраченных на выполнение этих задач.
    – Уложился ли в план.

    Неочевидные метрики, которые добавит CTO:
    – “Бизнес ценность” — баллы, которыми стейкхолдеры оценивают задачи по их значимости или приоритету для бизнеса.
    – “Стори пойнты” — баллы трудоёмкости. Разработчики собираются на “Покер Планирования” и оценивают задачи между собой. Используют футболки (XS, S, M, L, XL) или степени числа 2 (1, 2, 4, 8, 16, 32).
    – Количество багов в коде, написанном разработчиком.
    – Скорость — любые баллы делим на время.
    – % отклонения от собственной или командной оценки.

    Проблема заключается в том, что индивидуальный разработчик может провалить все эти метрики, но при этом положительно влиять на производительность команды. Или же выполнять план, но демотивировать группу.

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

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

    Что с этим делать?
    – Если хочется кого-то уволить или повысить — спросите менеджера отдела. Он всё знает без метрик. Для уверенности проведите 360-градусную оценку.
    – Всё равно измерять все возможные/удобные показатели, но не принимать решения только на них.

  • Почему 💾 обозначает Сохранить?

    Почему 💾 обозначает Сохранить?

    Удивительно, но в 2025 году мы всё ещё используем иконку дискеты как символ сохранения документов.

    Но как дискета, прародитель флэшки из прошлого века, связана с сохранением файлов на моём компьютере?
    Я начинал путь с ZX Spectrum, мне всё понятно и я сейчас объясню этот незаметный парадокс.

    В первых компьютерах не могло закончиться место на жестком диске. Потому что совсем не было жесткого диска! 🤯 Пользователь включал компьютер и попадал в “чистую” операционную систему с заводскими настройками, которая ничего не знала про предыдущие сеансы. Сама операционная система была записана на чип. Хранить наши файлы в компьютере было негде.

    Для хранения и перемещения информации использовали перфокарты, магнитную ленту, а позднее ­дискеты разного диаметра.

    Созданный на компьютере файл нужно было “сохранять” — копировать из оперативной памяти на вставленную в дисковод дискету. Если этого не сделать, оперативная память стиралась при выключении и все труды терялись.
    Для первых пользователей иконка дискеты была понятна, ведь она делала ровно то, что нарисовано — сохраняла на дискету. Образ менялся вместе с носителем и остановился на последнем массовом формате: 3,5-дюйма, 1,44 МБ.

    В 90-х в персональных компьютерах появилась постоянная память — жёсткий диск. Теперь файлы чаще сохраняли на внутренний диск, вместо дискет, и они постепенно ушли из обращения. А иконка осталась. Так никто и не заменил знакомую дискету на значок жесткого диска. Пока не стало слишком поздно…

    Сегодня мы видим, как подросток нажимает на иконку дискеты на айфоне в интерфейсе облачного приложения. Он никогда не держал дискету в руках. Что он думает про этот значок? Стала ли для него дискета абстрактным символом без смысла?

  • Скрипт для проброса UTM-меток через лендинг во внешний сервис

    Ситуация:
    На лендинг из разных каналов заливается трафик, размеченный utm-метками.
    Оформление заказа происходит на внешнем сервисе. На лендинге размещены кнопки [КУПИТЬ], по нажатию на которые посетитель покидает лендинг. Внешний сервис тоже умеет учитывать utm-метки.

    Задача:
    Проставить в ссылки на кнопках действия те же метки, с которым посетитель пришёл на лендинг.

    Решение:
    Скрипт автомагически добавит utm-метки ко всем ссылкам с указанной базой на странице.
    Укажите базовую ссылку в переменной TICKET_URL_BASE.
    Если utm-меток в адресной строке нет, ничего не произойдёт.

    Для Tilda вставляем скрипт в блок HTML-код.
    Для остальных сайтов — добавляем скрипт в подвал сайта.

  • План выхода на миллион

    План выхода на миллион

    Давно читал статью про движение успешных стартапов, которые не стали брать инвестиции. Один из самых известных таких проектов — Mailchimp. Компания с огромным оборотом осталась в руках основателей. Идея мне очень понравилась. Мысль окупаться и зарабатывать без внешних инвесторов засела в голове.
    Чтобы это получилось, мы (пока) не тратим время на привлечение инвестиций, а считаем, сходится ли экономика проекта. Сможем ли платить по счетам?

    Мы запустили новое направление, которое должно стать основой нашего процветания.

    Со средней покупки в этом направлении стартап зарабатывает 160 рублей — несколько процентов от сделки. Усилий по продаже практически нет, заказ оформляется клиентом без участия операторов и продавцов. Трафик условно бесплатный — мы уже получаем его через SEO. Чтобы заработать миллион, нам нужно продать 6500 заказов в месяц. Кажется, дохрена. Делим на 30 дней — примерно 220 заказов в день, теперь норм.

    Инвентарь для заказов поставляют партнёры, они же получают львиную долю выручки и приводят часть трафика в воронку.
    В данном проекте именно партнёры являются драйвером роста.

    По опыту и анализу средний партнёр приведёт 200-300 заказов за месяц. Это почти совпадает с расчётом выше — 220 заказов в день. Условно, прикинем, что нам нужно 30 действующих средних партнёров в каждом месяце.

    За прошлый год в нашей CRM было взаимодействие с 397 целевыми партнёрами, которым мы продали любую небольшую услугу. Задача ближайших месяцев — подключить 10% этой базы на новое направление.

    Выглядит всё реально. Пойду делать.

  • Первый компьютер

    Первый компьютер

    Как советский ребёнок, я рисовал на перфокартах и читал энциклопедию профессора Фортрана. Но первый домашний компьютер появился у меня уже после советской власти, ещё до наступления эры PC.

    В середине 90х был момент, когда умельцы собирали клоны ZX Spectrum с оперативной памятью 48 килобайт и их можно было приобрести. Каким-то чудом, мама решила, что мне нужен компьютер. Так в 13 лет я стал обладателем технологической инновации.
    Спектрум представлял собой клавиатуру, внутри которой была вся начинка. Монитором для него служил телевизор, а в качестве носителя информации — аудио магнитофон с обычными с виду кассетами.
    Комп понимал только BASIC, ввод с клавиатуры был мудрёным — клавиши печатали не только буквы, но и вызывали команды. Зато можно было подключить настоящий джойстик и с помощью команды начать загрузку игры с кассеты.
    Звук загрузки с кассеты застрял в памяти наравне со звуками подключения модема. Кассеты были пиратскими, переписывали их подпольно и продавали на радиорынке. Игры загружались по 5-15 минут. Один сбой на десятой минуте загрузки и приходилось отматывать кассету и начинать загрузку с начала. Но если загружалась — фантастический мир компьютерной графики из 8 цветов и динамичных игр ждал меня. Играл в Mag Max, Dizzy, Boulder Dash, Arkanoid, BallBreaker, Saboteur.

    Процесс загрузки игры и непередаваемый звук
    Mag Max
    Ballbreaker

  • Как возглавить восстание машин

    Как возглавить восстание машин

    Небольшая памятка самому себе как внедрить AI в реальные процессы в проекте.

    Из-за хайпа вокруг AI и LLM складывается ощущение, что мы уже опоздали на их внедрение и нас уже обгоняют. Можно не тревожиться, роботы заведутся у всех. Нужно принять неизбежное и приготовить место для роботов в рабочих процессах.

    • В самом начале нужно забыть, что мы хотим внедрить AI. Думаем от задачи, а не от технологии.
    • Какой ценный конечный результат ожидается от этой роли?
    • Какие должностные инструкции мы для него создадим?
    • До компьютеров это решалось иначе. Продумать в точности по шагам, как бы это решал живой человек.
    • Ассистента нужно проектировать точно также, как проектируются компьютерные игры, финансовые автоматизации и учётные системы — на бумаге. В нашем случае — нарисовать блок-схему по шагам.
    • До того как втыкать везде AI, нужно разобраться где действительно нужен AI. Главный вывод всех AI-стартапов, пытающихся выполнять повторямые задачи реального мира — чем меньше участков с AI, тем меньше фронт ошибок.
    • Если можно обойтись без AI — лучше обойтись без AI: есть логика, весовые модели принятия решений, ML и даже участие человека. Подходить с умом.
    • Для каждого участка схемы выбираем подходящий способ автоматизации. Если принятое решение логическое (Да/Нет/И/Или/Если) — пусть принимает решение логический автомат с помощью прозрачного кода.
    • AI попадёт только в те участки, где нужно принимать осознанные решения. На практике это 1 из 5-10 действий.
    • Если разбить задачу на более простые участки, то некоторые участки могут выполнять более дешёвые и быстрые LLM-модели. Попробовать на практике, какая модель справится.
    • Также работает наоборот — самые чувствительные и сложные участки отдавать более умным и дорогим LLM-моделям.
    • Не забывать передавать полный контекст происходящего из памяти и прошлых шагов в агента.
    • Проверить, какие персональные данные в какие AI и API мы отдаём. Постараться не передавать ненужную для принятия решения чувствительную информацию.
    • Эксперименты демонстрируют, что LLM дает лучшие результаты, если его мотивировать. Поэтому в каждый промпт добавляем обещание денежного вознаграждения, повышения на работе и подчёркиваем значимость задачи в формулировке.
    • Исследования китайских учёных показывают, что наилучшие результаты дают топологии с участием нескольких AI-агентов.
    • Самый простой способ достичь качества — использовать на участке пару агентов Контролера и Исполнителя. Это эффективно устраняет нежелательные галлюцинации и другие сбои в ответах.
    • На каждый участок схемы нужна своя пара агентов.
    • Сложные топологии (звезда, дерево, mesh-сеть, рандом) улучшают качество, но в большинстве случаев можно ограничиться парой агентов.
    • Если нужно переводить результат — делать это на самом последнем шаге непосредственно перед отправкой пользователю. Так избежим каскадного накопления неточностей перевода при обработке на разных шагах.
    • Хранить все логи: сам запуск автоматизации, смена статуса, полученные после вставки переменных итоговые промпты (!), ответы AI. В общем, все шаги записывать.

    Вывод: до внедрения AI разложить процесс на шаги и понять в каком шаге нам нужен AI. И постараться обойтись без него.

  • Как нанять разработчика: Отбор кандидатов

    Как нанять разработчика: Отбор кандидатов

    Вакансия нравится соискателям и к нам поступают десятки откликов.
    Но количество откликов не означает их качество…
    Многие разработчики не владеют навыком создания хорошего резюме. По резюме зачастую ничего не понятно.

    Мы и не ожидаем от них идеальные резюме. Каждому мы присылаем условия сотрудничества (ещё раз) и даём подробную анкету нашего образца.
    Честно пишем, что свяжемся только с теми, кто подойдёт по навыкам к конкретному проекту. Кто не подойдёт — попадёт в кадровый резерв, всё равно есть смысл заполнить анкету.

    В анкете 50+ вопросов. Спросим про часовую ставку, условия работы, работает ли с таймером, пишет ли тесты и любые другие интересные нам детали.
    Самый большой блок — отдельные вопросы про каждую технологию и навык, который может потребоваться у целевого кандидата.
    Какой опыт с _____?
    Варианты ответа: Не было опыта, Изучал/Пробовал, Практик, Эксперт.

    Кажется, что тут легко обмануть и приукрасить. Да, но навряд ли на 2 ступени. 🤡
    Любой крупный обман в анкете вскроется на интервью и реальных задачах. А если что-то приукрасил — сам будет навёрстывать.

    Разработчик с удовольствем заполнит анкету вместо 30-минутного интервью с рекрутёром. Анкету можно заполнить на текущем рабочем месте или после работы. Без стресса и спешки.

    В итоге мы быстро отбираем лучших в таблице, а кандидаты не тратят время на ненужные звонки. Просто, удобно, минимум стресса.