• Про PHP

    Что, уже все отшутились про PHP? Уже каждый клоун из Твиттера запостил картинку? Точно никого не осталось? Хорошо, тогда выскажусь и я.

    Был бы я помоложе, на этом месте была бы шутка про дырявый пых. Но сегодня шутить про PHP мне кажется глупо. Дело не в том, что я возлюбил этот язык, что вы… Просто практика показывает: косячат все независимо от языка и платформы. Кто-то мелко, кто-то крупно и ничего: утираются и идут дальше.

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

    Помните эпизод с Джавой и Log4j? Если коротко, то за тридцать лет в Джаве не договорились, как сделать нормальный логгинг. В итоге появились логгеры-монстры с Тьюринг-полными шаблонами и загрузчиками классов. Логгер загружал произвольный java-класс из интернета(!!!) и выполнял в процессе приложения. Это настолько тупо, что я не нахожу слов.

    Помните случай с Leftpad в Джаваскрипте? Это еще фееричней. Жил-был типичный одноклеточный Js-разработчик: писал пакеты-однострочники вроде isArray, isNumber и выкладывал в npm. В числе прочего он залил в него пакет kick. Оказалось, есть мессенджер Kick, где сидят одни педофилы и охотники на педофилов. Юристы Кика потребовали у npm удалить пакет. Основанием для этого должен быть товарный знак, которого, конечно, не было. Однако админы npm прогнулись и удалили kick без каких-либо обсуждений. Его автор обиделся и в знак протеста удалил все свои пакеты.

    Казалось бы, ну и катись к х…м со своими isArray и isNumber. Но дело в том, что через цепь зависимостей от пакета Leftpad зависел сам Реакт – и он перестал собираться по всему миру. Другими словами, разработчики Реакта оказались такими же одноклеточными, потому не проверили, а от чего, собственно, зависит их творение и насколько оно надежно. Инцидент показал столько гнили в экосистеме Js, что уже за это я испытываю к ней отвращение. Но ничего – починили, шоу продолжается.

    Или другой случай – миграция со второго Питона на третий. Я начинал с Питона 2.4 и активно писал на нем до 3.2. На мою долю выпала миграция 2->3. Скорее всего, большинство читателей сразу сели за тройку, а я все это разгребал.

    Миграция была очень, очень, очень сложной. В тройке поломали строки – центральный тип языка. Да, они стали лучше и правильней (как в Джаве), но беда в том, что за время двойки все уже привыкли к сишным восьмибитным строкам. Не было ни одной библиотеки, которую бы не пришлось дорабатывать. Изменения раскололи сообщество: против тройки выступил сам Армин Ронахер, разработчик Flask, Jinja2 и других бессмертных библиотек. Позже Армин передал свои наработки сообществу и ушел в Раст. И все-таки Питон мигрировал, ошибки дизайна остались в прошлом, поезд идет вперед.

    Что касается PHP, то уже одна его популярность говорит о многом. Его автор угадал ключевую фишку – удобство. PHP – это попытка сделать программирование удобным, и притом попытка удачная. К сожалению, языку не повезло с технической частью: не нашлось местного Торвальдса или Кармака, которые написали бы технически безупречный интерпретатор. Уж что есть, то есть.

    Ошибки, найденные в PHP, связаны с памятью, а для любого сишного кода это родовая травма. Код на Си – это прямые действия с памятью, и при ошибке в лучшем случае программа свалится с сегфолтом. В худшем начнется неопределенное поведение: затирание данных, исполнение произвольного кода. Но как мы видим, в других языках были ошибки еще хуже, при этом вызваны они не сишными фокусами, а разгильдяйством. Лично я за второе наказывал бы сильнее, чем за первое.

    Так что держись, пых. Уже двадцать лет тебя хоронят, а ты все трудишься, старичок. Ничего, пропатчат тебя и пойдешь дальше крутить сайты на Джумле.

  • Про батарею

    Заметка самому себе о том, как настроить батарею на яблочном ноуте.

    Самое главное: отключить флажок “Slightly dim the display on battery” (слегка погасить экран при питании от батареи). Суть в том, что когда вы отключаете питание, экран делается темнее, и нужно прибавлять яркость вручную. Всегда раздражало это поведение, потому что в выборе на чем экономить – зрении или батарее – ответ очевиден.

    Далее: поставить галку “Prevent automated sleeping on power adapter when the display is off” (не засыпать, когда питание включено и экран выключен). Тоже всегда раздражало поведение по умолчанию. Например, поставил файл на закачку, включил питание и ушел – а ноут уснул и закачка оборвалась.

    Optimize video streaming while on battery – тут не знаю, я ничего не стримлю, но пусть будет.

    Режим питания на зарядке – принудительно High Power, чтобы не оставить системе выбора. Если вы не знали: в зависимости от того, работает ли ноут от батареи или зарядки, его производительность отличается (не все ядра загружены).

    Параметры зарядки: ограничить на 80%. Другими словами, батарея никогда не будет заряжаться выше этого порога. Это общее правило для всех батарей: их оптимальный уровень от 75 до 85 процентов от общей емкости. При стремлении к 100% возрастает нагрузка, нагрев -> износ -> деградация. Имеет смысл сделать то же на телефоне.

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

    И еще: поменять аккум в макбуке можно, в каждом городе найдется мастер. Но лучше до этого не доводить. В некоторых моделях все пригнано настолько плотно, что вздувшийся аккум может надавить на материнку и даже прогнуть ее – в точности мой случай.

  • Маргарет Гамильтон

    Умерла Маргарет Гамильтон – выдающаяся программист NASA. Та самая женщина со снимка, где она со стопкой бумаг в полный рост. На бумаге – распечатки исходников корабля “Аполлон”.

    Я никогда не говорил этого, но все-таки: я всегда немножко вдохновлялся Маргарет. Когда-то давно снимок стоял у меня на рабочем столе. Он напоминал мне, что лучшие инструменты – наши голова и мотивация. Остальное вторично.

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

    Не буду писать о том, что мне жаль. Маргарет прожила 90 лет: это достойно, это полностью завершенная жизнь, пришедшая к финалу. Спасибо этой замечательной женщине за ее труд. Спасибо за мотивацию, которая хоть чуть-чуть, но передалась мне.

  • Господин Хуанг об образовании

    Открыл интернет – а там кипит-бурлит, пенится, через край выливается, течет по стенке.

    Господин Хуанг, патриарх всея Энвидиа, высказался в том ключе, что, мол, натуральные дроби – это сложно, квадратные корни – еще сложнее, и вообще учить детей этому барахлу не нужно. Есть эй-ай, который все посчитает за нас, им и пользуйтесь.

    Зная мое отношение к теме, вы, наверное, предвидите волну негодования. Однако мне в голову пришла другая мысль, и я постараюсь внятно ее передать.

    Со своей колокольни господин Хуанг совершенно прав. С учетом того курса, что ведут основные поставщики ИИ-услуг, обучение в школах действительно нужно менять в сторону упрощения. Поэтому ничего другого Хуанг сказать не мог, и видимо, мы услышим еще много подобных заявлений. Например, что обучение в школе нужно сократить до пяти классов, университеты проредить, заменить бумажные учебники ИИ-помощником и так далее.

    Курс, которым идут условные хуанги и биллы гейтсы, называется “технофашизм”. Смысл в том, чтобы сделать человека настолько зависимым от технологий, чтобы без них он не мог выжить. Без установленных приложений, без учетных записей, без взаимодействия с сетью в нужной мере человек оказался бы в такой нужде, за такой чертой бедности, что выбраться оттуда уже нереально. Там человек либо умирает, либо живет в общине с подобными ему, либо его съедают гиены вроде домов труда или чего-то такого, связанного с рабством.

    Подобные режимы показал нам жанр киберпанка. Хотя формально это другое, я не вижу разницы между технофашизмом и киберпанком: одно переходит в другое. В киберпанке власть принадлежит корпорациям, которые встраивают свой продукт в каждую ступень общества. Государства как такового нет, полиции и армии тоже – только продажные чиновники и частные военные организации. Жизнь конкретного человека зависит от того, насколько удачно он встроен в сеть, построенную корпорациями.

    Это и есть мир, который хочет построить Хуанг сотоварищи. В этом мире все задачи перекладываются на ИИ: законодательство, суд, международные отношения, конфликты. Чтобы подступиться к этим вершинам, ИИ закладывают еще на этапе образования. Например, уроки ведет ИИ-ассистент, для которого нужна подписка. Хочешь дополнительный курс – покупай премиум-план. Образование должно быть поверхностным и не в коем случае не развивать ребенка, только давать ответы. Получится идеальный потребитель ИИ, абсолютно зависимый во всех сферах жизни: учебной, рабочей, личной (эй, чат, напиши признание в любви).

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

    Так что повторюсь: со своей точки зрения мистер Хуанг говорит то, что должен. Скорее всего, он искренне верит, что дроби и корни не нужны, а обучение в школе должно занимать пять лет. После этого часть детей идут на завод клепать чипы, часть становятся безработными на подачках и тратят эти подачки на ИИ-контент, а дети элиты идут в корпорацию. Очень даже может быть.

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

    Силы наши не равны, но мы еще посмотрим.

  • Хокинг об AI

    Когда-то я читал Стивена Хокинга. Про черные дыры было интересно, и я даже стал лучше их понимать. Остальное – гоголевская маниловщина на тему ИИ. Как искусственный интеллект избавит нас от болезней, Африку – от голода и вообще настанут пони и радуга.

    Конечно, посмеиваться над великим человеком не хорошо. Кто я такой и чего добился, чтобы подтрунивать на Хокингом? Но обращаю внимание вот на какую его ошибку: Хокинг и современники считали, что искусственный интеллект будет открыт – в буквальном смысле открыт как физический закон. Полагалось, что ИИ вокруг нас словно закон всемирного тяготения, просто мы его не замечаем. А как научимся замечать, так он заработает в каждом доме. Если на Северном полюсе яблоко падает к центру Земли, то и на Южном произойдет то же самое. Стало быть, ИИ будут пользоваться как воздухом — все и бесплатно.

    Оказалось, что подобие ИИ, которым мы пользуемся сегодня, не открыто, а возделано. Наш искусственный “интеллект” – это программа, запущенная на мощных чипах. Собрать такую машину обычному человеку дорого и трудно. Поэтому мы получаем ИИ либо в ограниченном режиме (в телефоне в обмен на личные данные), либо по подписке. А это значит, никаких поней и радуг – за искусственный интеллект надо платить.

    Напомню, что прямо сейчас в пяти европейских странах идут бунты против властей. Началось все со студентов, но позже примкнули обычные граждане. Все они недовольны дороговизной жизни, проблемами образования, низким качеством социальных услуг. Казалось бы, есть Чат-джипити, с которым можно учиться и вообще легко шагать по жизни: описываешь проблему и делаешь как он говорит. Кодинг, я слышал, вообще solved. Разве это не то волшебное средство, о котором говорил Хокинг?

    И тем не менее, что-то идет не так. Бог с ними с бунтами – это все загнивающая Европа. Но тот факт, что на руководителей оказывают адский прессинг, чтобы те внедряли ИИ, очевиден всем — такое шило в мешке не утаишь. При этом я не вижу качественного рывка в разработке – но груза на наших плечах стало больше.

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

  • О печатной машинке

    Стоим мы такие в качалке, мускулистые и потные, как персонажи Гачимучи, и разговариваем о… девятом “Резиденте” (Resident Evil 9 Requiem, игра такая).

    Объясняю одному качку: на трудном уровне сложности ресурсы уходят на то, чтобы крафтить ленты, а на патроны не остается. Иногда ленты попадаются, но их не хватает, потому что хочется сохраняться чаще. Собеседник удивляется: какие ленты? Я: ну, ленты для печатной машинки. Собеседник: а зачем печатной машинке ленты?

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

    Однако уж если начал с Resident Evil, то сперва короткая вводная. “Резидент” — игра про зомби, интересная по многим направлениям. В том числе тем, что сохранения в ней были сделаны в виде печатных машин. Считалось, что персонаж садится за машинку и печатает свою историю, чтобы в случае смерти ее прочли. Для машинок были нужны расходники — чернильные ленты, те самые, о которых вопрошал мой собеседник в качалке. Ленты давались изредка, и каждое сохранение занимало одну. Тем самым игра не позволяла сохраняться после каждого убитого зомби. Еще школьником, проходя “Резидента”, я взял за правило: всегда иметь ленту в запасе, чтобы, если родители сгонят с приставки, быстренько сохранится.

    Система лент, интересная вначале, позже приелась. В третьем “Резиденте” игроку наконец дали бесконечную ленту. Но и здесь было неудобство: чтобы сохраниться, лента должна быть в инвентаре, а инвентарь маленький. Поэтому ленту хранили в сундуке, освобождали ячейку, доставали ленту, сохранялись, клали обратно в сундук и шли дальше. В четвертой части и далее машинки работали без лент: просто подошел и сохранился. В девятой части эту милую деталь добавили в виде челленжа для олдов.

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

    Печатать на машине я не умел, разве что “Чижик-пыжик” одним пальцем. Учиться было тяжело, да и незачем. Мои занятия с машиной сводилось к тому, что я бесконечно ее обслуживал: протирал, чистил, подтягивал и без конца покупал чернильные ленты в комиссионке.

    Вижу, что текст выше не отвечает на вопрос: так зачем печатной машине ленты? Терпение. Чтобы это понять, нужно представлять устройство машины.

    Механизм печатной машинки напоминает… пианино! Мой отец работает мастером музыкальных инструментов, и все детство я прожил в окружении разбитых пианин. Сходство между первым и вторым следующее: когда вы жмете клавишу, механизм взводит молоточек, и он ударяет в определенное место. Машинка — по бумаге, пианино — по струне. Разница в том, что у пианино у каждого молоточка своя позиция. Можно нажать три клавиши и получить аккорд (совместное звучание), а в машинке так не получится. В ней каждый молоток ударяет в одно и то же место, и если нажать две клавиши, машина “залипнет”: молотки зацепятся на полдороге, и нужно будет разогнуть их пальцами.

    Вопрос: если молотки ударяют в одно и то же место, как получается строка? Сверху машины есть подвижный блок — по-русски каретка, по-английски carriage (повозка, коляска). В нее заправлена бумага. Каждый удар молотка двигает каретку влево, и отпечаток оказывается справа от прошлой буквы.

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

    Думаю, теперь понятно, откуда возникли термины “возврат каретки” и “перенос строки”. Очень важно, что это не одно и то же. Если вернуть каретку, но не перенести строку, мы будем печатать поверх прошлой. Если перенести строку на середине, получим текст как в стихах Маяковского. Именно поэтому Микрософт выбрал комбинацию \r\n для разделения строк в файлах. Это именно два действия, а не одно! Я согласен, что просто \n удобней, но за \r\n стоит железная – буквально механическая – аргументация.

    На всякий случай уточню, что \r означает “carriage return”, а \n — new line.

    Итак, молоточек ударяет по бумаге, и что? Ничего, если в машину не заправлена лента. Если точнее, молоток оставит на бумаге легкую вмятину и не больше. Чтобы появилась буква, между молотком и бумагой помещали ту самую ленту, которых не хватало в “Резиденте”. Лента была из ткани, густо пропитанной чернилами. Молоток ударял по ленте, выпуклое место касалось бумаги, и на ней оставался оттиск буквы. Считайте ленту своего рода копиркой (карбоновой бумагой), которой пользовались точно так же: подкладывали между вторым листом бумаги, чтобы получить оттиск ручки.

    У ленты тоже были свои хитрости. Если бы молоточки били в одно и то же место, она бы быстро порвалась. Поэтому лента была намотана на катушку; свободный конец протягивали сквозь окошечко, куда ударяли молотки, и тянули к пустой катушке. Как аудиокассета, понимаете? При нажатии клавиши обе катушки чуть прокручивались, чтобы место удара смещалось. Когда лента заканчивалась, катушки меняли местами: полную направо, пустую — влево.

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

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

    На головке молоточка располагались два символа, как правило строчная буква и прописная, примерно так (только в зеркальном отражении):

    E
    e
    

    В обычном состоянии молоточек ударял по бумаге нижним оттиском, то есть строчной e. Клавиша Shift опускала весь молотковый механизм на сантиметр или около. В результате, если взвести молоток, он ударял верхним оттиском, то есть E. Вот откуда идет термин Shift — это буквальный сдвиг. Технически он был реализован так: молотковый блок парил в воздухе на очень тугих пружинах. Клавиша Shift была рычагом с большим плечом, чтобы эти пружины продавить. Они же поднимали блок обратно, если клавишу отжать.

    Не поверите, но у печатной машинки был капс-лок! Технически он тоже был устроен просто. Молотковый механизм опускался вниз и крепился особой защелкой. Повторное нажатие снимало эту защелку, и блок прыгал на место.

    Во всех интерфейсах слово “настройки” заменяется иконкой шестеренки. Вы когда-нибудь думали, почему? Как связаны настройки софта с гайками и шестернями? А так, что настройка печатной машины означала механические действия: подкручивание гаек, подтягивание валов и всего остального. Увеличить межбуквенное расстояние? Такая-то гайка. Межстрочный интервал? Другая. На каждую опцию приходился валик, который нужно было переставить, как в механической коробке передач. Конечно, все эти опции настраивались только раз и позже – при техобслуживании. В обычной жизни никто не менял межбуквенный интервал, потому что это трудно. Использовали пробелы и переносы строк.

    В каждом почтовом клиенте есть поле cc – кому отправить копию. Дословно cc означает carbon copy, то есть дубликат, полученный копиркой. Когда набирали важный документ, его копия должна была остаться в архиве. Чтобы не печатать одно и то же дважды, в каретку заправляли комбо из бумаги, копирки и еще раз бумаги. На первом листе, который ближе к нам, оставался чернильный оттиск ленты, а на втором – оттиск копирки. Так что и в электронной почте печатные машины оставили след.

    Расскажу теперь несколько интересных фактов. Первый – печать на машине плохо влияла на суставы пальцев. У профессиональных машинисток в старости были убитые кисти – настолько, что иные женщины не могли себя обслуживать. Печатные машины были механическими, нужно было вкладывать порядочную силу, чтобы молоток оставлял читаемый оттиск. Механизм изнашивался, местами ржавел, проседал и поэтому изрядно напрягал руки.

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

    Машины требовали обслуживания. Оттиски на обслуженной машине и убитой отличались разительно. Прежде всего это влияло на ход молотков, вероятность их столкновения и залипания. Чем лучше они смазаны, тем быстрее взводились и падали, реже сталкивались. На головках скапливалась каша из частичек бумаги и чернильной ленты. Грязь заполняла пустоты, и буквы “пухли”, например у буквы A могло не оказаться пустоты в треугольнике. В детстве я читал криминальный рассказ, где преступника определили в том числе по характеру писем, что он набирал на машинке. Оттиск был столь безупречным, словно машинку чистили перед каждым набором. Эта маниакальная педантичность косвенно указала на нужного человека.

    Вот и все, что я хотел рассказать о печатных машинах. Вспоминая о той, что была у меня в детстве, я понимаю, что она пошла мне на пользу. Хоть я и не умел печатать, зато понял ее устройство, и лишними эти знания не оказались. Может быть, машинка станет неплохим подарком ребенку: детям не помешает знание того, как работают аналоговые вещи. Даже если не зайдет, отдайте машинку в местный бар, где она украсит интерьер.

  • Детство и телефон

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

    Если дарите телефон в 13 лет, есть шанс, что вы успели заложить хороший фундамент книгами и совместным чтением. Если в 7 — уже вряд ли. Если суете телефон годовасику, то поздравляю: вы посадили ребенка на цифровой героин. Детства у него не будет.

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

  • Базы данных на клиенте

    Современные веб-приложения работают так. Есть апишка на сервере, которая возвращает данные в JSON. Бекенд ничего не знает о рендере, а только раздает данные и обрабатывает команды. И есть js-приложение на клиенте, которое забирает данные с бека и рендерит их. Все это понятно, и все так делают – но не думают вот о чем.

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

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

    Ключевая беда фронтенда в том, что там нет базы данных. Есть ублюдочные LocalStore и IndexedDB, которые по недоразумению называют базами данных. Да, в IndexedDB можно создать индекс btree по произвольному полю. Но в целом эти два ничто иное, как KV-хранилища. А судьба любого KV-хранилища одна – быть помойкой.

    Дело в том, что KV не предполагает схемы. В коде нет никакой информации о том, что лежит в словаре. Вижу, что одно событие вынимает словарь, а другое пишет словарь. Что в них – неизвестно.

    Сейчас работаю над сложным веб-приложением (UI-частью). Ему около семи лет, сменилось много разработчиков. И все подтверждает мой тезис – для работы с данными KV не годится абсолютно, совершенно. База данных приложения – огромный словарь, сущая помойка. Одни и те же данные читаются с бека и пишутся под разными ключами. Визуализатор базы – студенческая поделка: тысячи ключей не помещаются на экран, нет нормального поиска.

    Спрашивается: если веб-приложения так активно работают с данными, то почему в браузере нет нормальной базы? С плоскими таблицами, проверкой целостности, NOT NULL, джоинами и так далее? Чтобы любой открыл схему и сразу понял, что к чему. Ведь когда схема открыта, каждый видит, что и где хранится. При попытке добавить лишнюю таблицу коллеги скажут: друг, эти данные уже хранятся здесь. А когда у вас один KV на всех, каждый тихонько подсирает в него свое барахло. Это проще, чем читать проект или спрашивать коллег, что где лежит. Проще дернуть бек и положить данные под своим ключиком – и плевать, что так поступают пять других разработчиков.

    Что самое ужасное и что заставляет меня чуть ли не скрипеть зубами от досады – так это то, что лет десять назад был сделан шаг(!) в правильном направлении. Появился стандарт WebSQL, предлагавший SQL в браузере. Все по классике: таблицы, типы, not null, реляционная алгебра. В качестве бекенда – Sqlite, который мало того, что является общественным достоянием, так и работает в каждом(!) устройстве. Оглянитесь вокруг: на каждом ноуте, компе и смартфоне работают много-много Sqlite-баз. Интегрировать ее в браузерер и прокинуть через JavaScript- апишку, пусть даже в ограниченном виде, должно быть нетрудным делом.

    Казалось бы, в вебе была возможна нормальная работа с данными. Но нет! Постепенно поддержку WebSQL выкинули изо всех браузеров, а в 2024 году спецификацию прикрыли. Что мы получили взамен? Ублюдочные LocalStore и IndexedDB, унылые хранилища по ключу.

    А ведь реляционная база в браузере – это только начало! Можно было б пойти дальше и сделать бинарный формат для синхронизации серверной базы с клиентской. Сегодня все базы работают с бинарными данными, и нужно только написать спецификацию. Представьте: выполняешь запрос, и бинарный поток из базы сразу идет клиенту безо всяких жысонов и сериализаций. Там они подхватываются в Sqlite. Просто, доступно, открыто.

    Так что когда я думаю о том, что мы потеряли и в угоду чего, хочется кататься по полу от отчаяния. От словаря на тысячу ключей, где половина данных дублируется, просто хочется плакать. От убогих инструментов, которые годятся разве что для TODO-листа, тоже хочется горевать.

    И вот что решительно непонятно – на что уходят все усилия? На веб тратят страшные деньги и часы, пилят все эти реакты-вуи, улучшают апишку JavaScript в Хроме. А данные – фундамент любого приложения – по-прежнему хранить негде. Почему?

  • Игры (3). Покахонтас

    Ненадолго вернусь к теме игр. С 8-битными играми закончили, перехожу к 16-битным (то есть Сеге). Первая игра на ней, достойная воспоминания — “Покахонтас”.

    Как ясно из названия, игра в точности повторяет мультфильм Диснея. Сделана она с теплотой и любовью, присущим ранним произведениям студии. Пейзажи, животные и герои нарисованы профессиональными аниматорами, качество картинки замечательное. Сохранены основные музыкальные темы, в том числе главная “Colors of the Wind”.

    Мультфильм интересен тем, что все описанное в нем было в реальности. Он стал первым произведением Диснея, основанным на достоверных событиях, а не сказке или легенде, как до этого.

    В 1707 году англичане, после успешной экспедиции испанцев, тоже поплыли в Америку в поисках золота. И действительно была Покахонтас, дочь вождя, и действительно был капитан Джон Смит. Последний попал в плен и должен был казнен, но Покахонтас закрыла его собой перед казнью. Это растрогало вождя и он отдал Покахонтас капитану в жены. Племя и отряд Смита заключили мир.

    Увы, история закончилась не так хорошо, как в мультике. Смит увез жену в Лондон, где она сразу же умерла от гриппа. У индейцев был нулевой иммунитет к европейским болезням, так что иначе и быть не могло. Поэтому в мультике паре не суждено быть вместе: раненый Джон уплывает в Лондон, Покахонтас остается с племенем.

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

    За героиней следует ручной енот. Иногда управление переключается на него, чтобы проникать через норы и решать головоломки. Уровни излагают сюжет фильма: сначала мы знакомимся с лесом, встречаемся с Джоном Смитом, делаем вылазки в лагерь. Ближе к концу нужно успеть к месту казни до рассвета, чтобы его спасти.

    Игра довольно короткая и проходится за 40 минут, однако в детстве я долго ей любовался. “Покахонтас” – целостное произведение: на деревья и водопады приятно смотреть, красивую музыку – слушать. Эта отличная работа, выполненная командой сценаристов, аниматоров и программистов. Как “Алладин”, только в другом ключе.

    Если накатит на вас 16-битная ностальгия, знайте: “Покахонтас” будет отличным выбором.

    Прохождение

  • Теория несжимаемой сложности

    Есть у меня идея, которую я называю “теория несжимаемой сложности”. Звучит так:

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

    Подтверждений этому тезису достаточно – например, вся современная разработка. Все мы видели мемы, что в 2026 году, чтобы запустить сайт, нужны десять технологий, а чтобы устроиться джуном – все двадцать. Люди, которые внедряют эти технологии, не понимают: хотя каждая что-то упрощает, общая сложность процесса не снижается. Упрощение конкретного шага компенсируется тем, что внедрили новый инструмент, который нужно знать, обновлять, понимать его слабые стороны.

    Сюда же относятся микросервисы. Полагаю, сегодня очевидно всем: фрагментация сервисов не упрощает систему. Когда сервис А идет в сервис B, а тот в C и D, сложность устремляется в потолок. Нужен тулинг, чтобы отслеживать цепочки вызовов, находить сетевые задержки, воевать с сериализацией данных, находить тех, кто кого-то ди-доссит, разворачивать сложный CI. Где здесь упрощение?

    В нулевых годах скрипт на PHP ходил в базу, собирал HTML-страничку и выплевывал клиенту. Сегодня на стороне клиента работает приложение, состоящее из сотен библиотек. На одну страничку совершается 50 аякс-запросов, после чего запускается локальный рендер. Что именно этим хотели упростить, я не знаю. Но зато знаю, что условная Джира загружается около 20 секунд. Когда я открываю вкладку с Джирой, то уже выработал привычку переключаться на что-то другое, чтобы дать ей прогрузиться в фоне.

    Под теорию несжимаемой сложности подходит вся веб-разработка. В нулевые года мы писали на смеси HTML и неудачного языка – PHP. Сегодня мы пишем на смеси HTML и другого неудачного языка – JavaScript. Чтобы “упростить” процесс, Микрософт выкатила свой TypeScript, который тоже нужно учить, понимать, местами – бороться. За двадцать лет, после вложения адских денег и миллинов человеко-часов, мы в лучшем случае остались при своих.

    В теорию вписываются не только айтишные, но и общие процессы. Скажем, 25 лет назад школьные олимпиады проводились просто – давали листок с заданиями, листок для чистовика, черновик, канцелярию – и все. Сегодня олимпиады проводят на сайтах образовательных платформ, а входить на них нужно через Госуслуги. Как айтишник я вижу, где именно упростили процесс – в проверке. Если раньше проверяли учителя, то теперь программа читает базу данных, сравнивает ответы с образцом и выставляет баллы – и все это за микросекунды.

    Однако сложность никуда не делась: ее перекинули на учителей и детей. Должны быть компьютеры с интернетом. У ребенка должен быть телефон, почта, учетка на Госуслугах. Пароль от нее должен быть не менее 8 символов с решетками и долларами, при этом ребенок обязан помнить его, чтобы ввести на чужой машине. Спрашиввается: что именно этим упростили?

    Я давно заметил то, что выражено в начале статьи: многие улучшения на самом деле не снижают сложность, а выдавливают ее на другой участок, перекладывают на чужие плечи. Дробим микросервисы – растет сложность их взаимодействия. Выносим логику на фронтенд – там ничего не работает, а мы даже не знаем об этом. Обложились технологиями – тонем в их несогласованности. Цифровизировали образование – втянули детей в цифровое болото, хотя должны были оттягивать этот момент. И так далее.

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

    А теперь у нас эйай, и все сказанное умножается на бесконечность. Теперь на каждом участке что-то отчаянно “упрощают”: генерят код, тесты, скрипты, документацию. Обещают десятикратное повышение всего и вся, но пока что видно обратное. Если и раньше было трудно обуздать сложность, то теперь она льется через край.

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

Страница 1 из 117