Pull to refresh
276
0
Георгий Шуклин @amarao

Забанен за упоминание войны. Больше не на хабре.

Send message

Я обращал внимание на то, что каждая задача в скорости своего решения натыкается на боттлнек:

  • Невозможно понять, что нужно, из описания задачи. Начинается долгий интерактивный процесс выяснения о чём речь. Бывает, что задача содержит в себе описание решения, которое не работает и нужно отдельно доказывать, что надо делать "не так". Это communication bottleneck.

  • Задача реализуется в продукте с большим неудобным feedback loop'ом (у этого может быть миллион уважительных причин, речь не про это). В этой ситуации задача с одной стороны env bottleneck, с другой стороны всё равно занимает мозг, потому что нельзя выкинуть контекст из головы. Даже если затык не на CI, а на компиляции в 20 минут, это всё равно та же проблема "компилируется". Сюда же включаются все внешние сущности, которых нужно "ждать" (пока выкачается, пока загрузится, пока запустится, пока whatever).

  • Задача требует объективно большого числа нажатий кнопок. Например, перевести все workflow на новую технологию. 400 файлов по 20 строк в каждом, не поддающиеся механическому изменению (требующие чуть-чуть внимания и локальных адаптаций). Это typing bottleneck. Это же относится к задачам уровня CRUD и большого числа boilerplate. Надо печатать. Но думать. Но печатать.

  • Задача алгоритмически сложная. Не обязательно это 'state of art'. Может быть, это что-то уровня "как мы обеспечим инвариант этой функции". Над такой задачей надо думать, и она чаще всего приводит к самому сложному и плотному коду, иногда к 3-10 строкам, выражающим решение задачи. Это local hard-thinking bottleneck.

  • Задача не решаемая в существующем коде и нужно сделать тонкий сложный рефакторинг в множестве мест для того, чтобы решение оказалось консистентным с остальным кодом. Сам новый код может быть тривиальным, но его последствия распространяются на множество малосвязных сущностей и из-за этого изменения затрагивают несчётное (не удерживаемое в голове) количество "мест" (компонент и т.д.). Это global hard-thinking bottleneck.

  • И есть задачи, решения которых не существует в настоящий момент, потому что не понятно что делать, как делать, делать ли, или изменять условия задачи. Часто это связано с новыми технологиями, новыми обстоятельствами или передумыванием подхода на уровне архитектуры. Это research bottleneck.

Соответственно, у разных классов боттлнеков разные ресурсы являются дефицитными. Для communication - это количество сессий с разными людьми (завершённых дискуссий). Худший паттерн - это множество сессий между несколькими людьми, когда с одним человеком возникают новые и новые сессии из-за новых обстоятельств от других людей.

env bottleneck зависит только от часов на стене. Можно три дня по 8 часов отлаживать ci, который падает "в самом конце" в рамках одной задачи. Нагрузка на мозг есть, но она напоминает нагрузку на водителя на трассе. Смотришь, смотришь, иногда чуть-чуть делаешь, дальше смотришь.

typing bottleneck зависит от модели клавиатуры ресурсов человека для контроля этих мелких обстоятельств и является комбинацией запаса концентрации и времени (т.е. тихого времени и неуставшего мозга). Оно напоминает вождение на горной дороге или в городе в условиях плотного движения без пробок. Множество мелких действий, которые происходят почти постоянно и требуют большого внимания.

Оставшиеся три - это чистый стресс на мозг, причём каждый имеет свой профиль по нагрузке. Именно для этих трёх типов человек продолжает работать даже когда не печатает (более того, самая важная работа происходит в перерывах между нажатиями кнопок, потому что сами кнопки - это typing bottleneck, а реальные решения происходят в голове между сеансами typing).

Это моё имхо. Почти пост?

UFO landed and left these words here

Кроме side effects есть ещё и side causes, и я даже не знаю, что сложнее для управления.

Сама модель side effects очень ограничена и не полностью описывает "ожидаемое" от программы.

Вот представьте себе такую программу

fn add_user(email_str: &str) -> User{
  let parsed_email = Email::new(email_str);
  match parsed_email{
    Ok(email) => User::new(email)
    Err(_) => loop{}
  }
}

Что тут написано в сигнатуре. Что функция всегда возвращает User по его email. Что эта функция делает? Строго соответствует своей сигнатуре. Когда она завершается, она возвращает пользователя с валидным email'ом. Что происходит, если email на входе не валидный? Функция ...решает проблему, посредством bottom type.

Что полностью соответствует ожиданиям системы типов, но полностью не соответствует ожиданиям пользователей.

Почему такая наглость прокатывает? Потому что time не является side effect для программы в рамках модели. Почему? Потому что так удобнее считать программы.

А ведь в side effects с бытовой точки зрения входит "сожрать батарейку", "зависнуть" и "начать тупить". А с точки зрения теории - не входит.

Если вендор обнаруженной уязвимости не входит в список CNA на странице cve.mitre.org/cve/request_id.html#cna_participants, то идентификатор можно быстро зарегистрировать через форму митре по сути даже не представляя весомых доказательств подтверждающих уязвимость и не дожидаясь ответа самого вендора
Далее они рассматривают заявку в течении суток и высылают на указанную почту письмо с зарезервированным CVE-xxx-xxx и полями которые вы заполнили в форме.
После чего необходимо опубликовать эту информацию на каком-либо публичном источнике, можно даже на github.
Далее частой ошибкой является отправка публичной ссылки ответом на почту, которая у них криво работает, поэтому стоит высылать через cveform.mitre.org в категории «Notify CVE about a publication»
Еще сутки и CVE успешно опубликована по ссылке cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-XXXX-XXXX
Спустя время также появится и на nvd.nist.gov/vuln/detail/CVE-XXXX-XXXX

Итого:
запрос через веб-форму -> публикация -> запрос через веб-форму =
2 дня по длительности и CVE опубликовано

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

Пример одной из моих CVE оформленных за 2 дня: cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-25749.
Я недавно перевёл весь свой УД с SmartThings на Hubitat Elevation. Как раз из-за облаков. На Hubitat всё работает локально. В конце концов это готовое коммерческое устройство в поддержкой и большим комьюнити. Соответственно есть резервное копирование, обновления и тд.

Я сейчас плавно учу Rust, и там тестирование даётся в главе №11, а основы ввода-вывода — в главе №12. И это офигенный подход. Написал трейт? Напиши тест.


Главная боль всякого php — в том, что начинающий начинает писать раньше, чем понимает что пишет.

Linear Book Scanner
Потомок Гугловского проекта по сканированию книг.
Делается из куска пластика, бытового пылесоса и простого планшетного сканера. Сам листает и сканирует книгу. Их есть довольно много версий, последние довольно быстрые и надежные
Да, я тоже не ожидал. Более того, Numba еще очень неплохо и прозрачно интегрируется с GPU и тоже, всего лишь за счет аннотаций "@cuda.jit". В общем, очень интересный проект.

Код я выложил:
github.com/alkalinin/open-nuance/tree/master/src-cpp/tests
github.com/alkalinin/open-nuance/tree/master/src-py/open_nuance/tests
Да они и сейчас есть. Хотите скачать мультики? #NEWS@irc.rizon.net, делаем find. Хотите скачать книги? #ebooks@irc.irchighway.net, делаем find.
Очень дорого так делать. Если у софта цена тестирования — это лишь цена времени программиста, то чтобы в железе сделать юнит-тест «релюхи на 20кА» — нужно сделать целый дорогущий стенд, причем состоящий не просто из релюхи на 20кА, а еще источника на 20кА и того, куда эти 20кА утекут (целая комната силовых шкафов). Делать такой стенд только ради того, чтобы проверить, что у контроллера ножка ставится в единицу, которая эту релюху включает, конечно, никто не будет. Если вы, конечно, не производитель этой релюхи, а не её пользователь как готового продукта. Более того, сами такие объекты, где надо коммутировать 20кА, это единичные объекты, а скорее даже это может оказаться один специализированный софт для одного единственного объекта с этой релюхой. И делать по кусочкам еще один такой же объект только для юнит-тестов — учетверенная цена объекта. Но такие «юнит-тесты» на самом деле делают, но называется это пусконаладкой устройства/объекта. Никто не приходит на только собранную электрическую вундервафлю на 20кА и не нажимает кнопку «поехали», где она сразу включается в номинальный режим. Сначала собираются аппаратчики и программисты на заводе-производителе, где начинают постепенную наладку устройства, включая узлы по кусочкам и проверяя, что на выходе то что надо. Потом включают это нечто на холостом ходе, небольшом токе, всё измеряют, осциллографируют, правят косяки. Потом дают небольшую мощность, тестовый прогон, проверяют все защиты, имитируя те или иные отказы. Если есть сомнение в каком-то узле, могут уже на оборудовании поставить какой-то эксперимент, приняв нужные меры предосторожности. Потом номинал, прогон на тепло с записью всей телеметрии, потом разборка на куски и отправка заказчику, там монтаж, первое включение там, продолжение правки косяков (которые вдруг повылезали еще), прогон 72 часа, сдача объекта… потом начало тестовой эксплуатации, где всё еще продолжают вылезать иногда косяки, которые приезжают и правят… И так постепенно оборудование входит в строй.
Поэтому — нет, для 20кА юнит-тестов не делают, или делают, только если сомневаются в каком-то физическом явлении, но это не тест уже, а скорее исследовательская работа, и делается она только если ни на модели, ни на объекте это проверить никак нельзя. Все юнит-тесты софта в основном делаются софтом же, либо совсем простым оборудованием типа еще одного контроллера-имитатора, тумблеров, лампочек и т.п.
Но, как я уже сказал, реальное устройство имитатором полноценно не описать, а поэтому особо интеллектуальные куски кода, увы, приходится рожать во время пусконаладки. И даже если это делается всё на заводе-изготовителе, то всё равно для программиста — это уже не отладка «на столе», это настоящие шкафы в пыльном цеху, где и сесть особо негде, и удлиннителей для зарядки ноутбука вечно нет, и провода силовые везде висят, и шум, и брызги то масла, то тосола летят, и интернет еле ловит (хорошо если из репозитория запуллить что-то получится или спросить консультации в чате у коллег) — никакой комфортной отладки. А ещё обязательно рядом будет стоять заказчик, который будет смотреть через плечо в ноутбук и спрашивать: «Почему не работает? Мы должны были поставить оборудование еще на той неделе! Вы же говорили, что программа написана, почему не включаете? Как это ток пульсирует, зачем он так делает?»…
Поэтому нужно заранее иметь все инструменты, которыми можно быстро и эффективно понять, в чем может быть проблема и оперативно исправить её. Как программист, я бы с удовольствием согласился бы на юнит-тесты железа, но реалии обычно таковы что «Мы заказали силовые ключи и трансформатор, поставка долгая, вы пока пишите спокойно программу, а они придут через шесть месяцев на завод, там их смонтируют в силовые шкафы за две недели, потом вы поедете настроите все (недели вам хватит?), а на к концу седьмого месяца оборудование должно быть у заказчика». Вот и все юнит-тесты на этом…
А можно просто снимать соответствующие кадры за рубежом, где-нибудь в Европе/Азии.
Начните свой день в iPython с «import sh» (https://pypi.python.org/pypi/sh). Делает именно то, что вы хотите, только на питоне: «for a in ls('/'): [...]».
Есть хороший мануал в виде презентации по autoconf: PDF
Читается быстро и легко, разъясняются многие тонкие моменты и то, как происходит все внутри. Очень рекомендую новичкам.
Эх, счастливый Вы человек. Не видели Вы видимо никогда дисков с проблемными fw/неправильно функционирующем контроллером, который намертво вешает всю бекенд петлю массива. Как бывший сервисный инженер по кое-каким мидренджевым массивам, могу сказать что такая проблема — это основная причина всех серьёзных даунтаймов после кривых рук администраторов и электропитания.

Такие диски иногда вообще не опознаются контроллером как сбойные и найти без использования определенных утилит (не доступных конечному заказчику) невозможно.
Предлагаю зарегистрировать multicast-адрес all-search-engines (я про ipv6) и использовать SECP (Search engine communication protocol) для подобных вещей. Во-первых уменьшает нагрузку на людей, во-вторых позволяет мгновенно индексировать документы, в третьих отвязывает от конкретных поисковиков, в четвёртых любой желающий может включить себя в группу мультикаста и получать информацию о новом контенте…

Звучит страшно? Наверное, да. Никто ещё не использовал multiast до сих пор в масштабах интернета. А если попробовать?

… Ну пусть не любой, а любой с регистрацией в чём-то вроде RIPE, то есть анонсируешь себя как recivier, на граничных маршрутизаторах на твои адреса делают resent всего, что прошло по мультикаст-адресу.

Я понимаю, что не взлетит. Но так было бы грамотнее, чем своё API у каждого поисковика (о котором ещё знать надо).

… Кстати, протокол можно было бы вообще называть не SECP, а New Content Announce Protocol. Типичный мультикаст, практически полная аналогия RSS, но в push, а не в pull-модели.
UFO landed and left these words here
Опыт Автоваза доказывает, что количество «блинов комом» ограничено лишь общим количеством блинов.
С другой стороны, если бы это был действительно российский смартфон, полный цикл производства которого осуществлён здесь, ещё можно было бы о чём-то говорить. А так — ну, взяли обычное дешёвое китайское говно, коего на дилэкстриме сотни лежат и красная цена которому — баксов сто пятьдесят, ну, написали на нём «МТС», и что?
Лучше бы продолжали Хуавеи брендировать. Они хотя бы сами по себе достаточно удачные.
Попробую пролоббировать это решение. Главный вопрос, что делать, если кто-то в форму с ключиком что-нибудь аплоаднет типа iso'шки.
1

Information

Rating
Does not participate
Registered
Activity