animated

Про право на риск

Вообще, все эти карантины, дают понимание - насколько хреново работает руководство, и насколько на тонкого там все устроено.

Ну вот взять те же перчатки в метро. Если кто не в теме - в Москве везде заставляют надевать маски и перчатки. Все увешано плакатами и предупреждениями про маски и перчатки. Все в масках, на перчатки похуй вообще всем без исключения. А это как-бы власть издает указ. Как-бы Собянин говорит нам, через подчиненных ниже: "хочу чтобы все горожане в перчатках были". Но результат, прошедший через слоя 3-4 управления, такой: нам, уважаемый Собянин, на ваши перчатки искренне похуй, а маски мы наденем потому что, говорят, помогают. Мы бы и без вас, может, одели бы. И так думают единогласно все - от таджика до ментов. Всем похуй на мнение и волю высшего руководства. А дальше-то что? "Мы может быть и без вас плитку бы в нужное место бы положили"? Предельно хуево отработали 3-4 слоя управления, факт.

Ну или много других примеров в новостях, не суть. Но к делу, я же не хотел холивар за маски.

Я хотел сказать, что можно прям как через призму смотреть, как менеджмент страны устроен. Сидят ли рядом с политиками специалисты? Слушают ли их (или как в кино - что-то пиздят там, но всем срать)? Имеют ли руководящие чины право на ошибку (а следовательно - вообще свободу действий)? Может ли кто-то снизу сказать: "Собянин, я конечно понимаю ваше величество, но перчатки никто не наденет, и у вас жопа будет обосратая. Давайте не будем?".

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

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

Проебали лето?

Арсений Тарковский

Вот и лето прошло,
Словно и не бывало.
На пригреве тепло.
Только этого мало.

Всё, что сбыться могло,
Мне, как лист пятипалый,
Прямо в руки легло.
Только этого мало.

Понапрасну ни зло,
Ни добро не пропало,
Всё горело светло.
Только этого мало.

Жизнь брала под крыло,
Берегла и спасала.
Мне и вправду везло.
Только этого мало.

Листьев не обожгло,
Веток не обломало...
День промыт, как стекло.
Только этого мало.

1967 г.
animated

Про разработку программ и продуктов

Я тут может очевидное кому-то скажу, а кому-то может неочевидное.

Часто бывают программеры, которые типа "на проекте был бардак - ни четких ТЗ, ни куда гребем непонятно". Это от непонимания, что никто никогда не знает зачем ПО вообще делают, и куда дорога вывезет. За редкими исключениями.

Давайте от противного. Вот есть, условно, MS Word. Туда никаких фичей, кроме текущих - и не надо. Да и тех что есть - можно выкосить половину. Можно ли сделать точно также? Да, думаю где-то за 100M баксов - вполне. Что копейки по сравнению с продажами. Можно ли достать 100 лямов, переписать Word - и зарабатывать как MS? Неа. Потому что срать будет всем на ваш новый Word. Чтобы стать продуктом, Office-у пришлось прожить с людьми десятилетия, делать фичи типа "радужный 3D-текст Comic Sans-ом с тенью" - потому что тогда это было модно. А потом - поддерживать эти фичи. Учить поколения людей форматировать пробелами. И так, не мытьем, но катаньем, они захватили рынок.

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

Сам код - вообще имеет отрицательную ценность - чем его больше, тем хуже, если ценность продукта постоянна.
animated

Ковид, Беларусь

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

Нас выгнали на удаленку уже в марте, поднадоело если честно.

Так вот, несколько историй.

1. В ближайшем магазине стою в очереди. Два мужика, по ощущению - по бутылке в каждом, покупают бутылку третью. И один стаканчик. Продавщица им "возьмите что-ли два стаканчика, ковид все-таки".

2. Курю на балконе, час ночи. Во дворе лавочка, и там народ негромко бухает. Народу прям много, человек 15. Не думал что 15 человек могут тихо бухать, но такая страна. Подъезжают менты, издалека поворачивают машинку на них, пару раз моргают фарами и мигалкой. Народ понимает намёк, и тихо расходится. У нас бы ОМОН с дубинками приехал.

3. У кореша батю вынули с того света, 1.5 недели на ИВЛ.

4. Семья в подъезде заболела вся. Там по-простому, без ИВЛ всяких. Предлагали помочь чем - но походу и без нас есть кому. Но никаких ебнутых бабок и взглядов типа "какого ты без маски" - не наблюдается.

Мы вот живем как жили, с поправкой на работу из дома. Насчет выйти погулять - как обычно. Только стараемся подальше от других держаться - скажем детские площадки подальше обходим, и в ТРЦ без нужды не гоняем. В ТРЦ где-то 30% от обычного. Народ гуляет в парках и на природах - чуть ли не больше обычного. Но все деликатно держатся подальше. Но никаких вообще нервов, все приветливо и на позитиве. Не смотрел бы новости - вообще бы разницы не заметил.

Маски даже не разбирался где вообще покупать - пусть параноикам побольше достанется, им нужнее. Во всех общепитах персонал в масках, но просто так может 5% носят от силы.

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

Ну и очень интересно быть в одной из двух стран, которые будут референсными. Ну типа "а чо, так можно было?"
animated

Регекспы - хуйня

Был момент - ребята релизили полгода работы. И все, даже кто не в деле был - включились, помогали. И там был full-text-search постгри, и юзер вводил "Java traini", и надо было чтобы искалось разумно - типа "Java traini*". А штатной функции сконвертить ввод юзера, в запрос к full text search в Postgress - не имелось. Поэтому пришлось парсить ввод юзера, и конвертить в синтаксис поиска постгри.

Забрал задачку, сел решать с дома, но, каюсь, был нетрезв. Регексы под 0.5 водки не проканали, а парсер-комбинатор - проканал.
Покупайте парсер-комбинаторы!

    public static class SearchProcessor
    {
        private const string PunctuationPattern = @"[\p{P}-[/.]]";
        private const string ContinuesLine = ":*";
        private const string PlainToTsQueryName = "PlainToTsQuery";
        private const string ToTsQueryName = "ToTsQuery";
        private const string WhiteSpace = " ";

        public static IDictionary<char, string> SpecialSymbolsWordsMap => new Dictionary<char, string>
        {
            { '#', "Sharp" },
            { '+', "Plus" },
            { '-', "Minus" }
        };

        private static string SpecialSymbolsRegexPattern => string.Join("|", SpecialSymbolsWordsMap.Keys.Select(x => $@"\{x}"));

        // Безусловно всякий, прочтя этот метод подумает: "Яша блядь ебнулся".
        // Перед тем как идти и рассказывать всем, прочти это:
        // - я правда пытался сделать это говно регексами 2 часа
        // - если в коде ниже проблемы - проще не разбираться, а обновится до Postgres11, и заюзать websearch_toTsQuery
        // - если ты пытлив умом, ты можешь дописать ниже парсер и интерпретатор выражений, например:
        //      - ".NET or Java basecamp" => "('.NET' or 'Java') and 'basecamp'
        //      - "(2+2)*2" => "8"
        //      - "(+ 2 (2+2))" => "8"
        // - вообще, если увлечься, тут можно написать интерпретатор турбо-паскаля
        // - если увлечься, можно понять парсеры, затем монады, а потом - глубины теории категорий
        // - увидеть что материя и мысль - суть одно
        // - взять бога за яйца
        // - сжать богу яйца
        // - сильно прям блядь сжать
        // - и орать в небо "КАКОГО ХУЯ ТЫ УЕБОК НАРОДИЛ ИДИОТОВ, КОТОРЫЕ ПРИДУМАЛИ РЕГЕКСЫ"
        private static readonly Lazy<Parser<IEnumerable<string>>> Parser = new Lazy<Parser<IEnumerable<string>>>(() =>
        {
            var specialSymbolsRegex = new Regex(SpecialSymbolsRegexPattern, RegexOptions.IgnoreCase);

            var quoted =
                from notCare1 in Parse.Char('"')
                from body in Parse.CharExcept('"').Many()
                from close in Parse.Char('"')
                select new[] { '"' + new string(body.ToArray()) + '"' };

            var word =
                from w in Parse.Char(char.IsPunctuation, "punctuation")
                    .Or(Parse.LetterOrDigit)
                    .Or(Parse.Char(x => SpecialSymbolsWordsMap.ContainsKey(x), "special symbols"))
                    .Many()
                select new string(w.ToArray());

            var words = (from w in word
                         from s in Parse.WhiteSpace.Optional()
                         select specialSymbolsRegex.Replace(w, x => $" {SpecialSymbolsWordsMap[x.Value[0]]} ")).Many();

            var search = quoted.Or(words).Many().Select(p => p.SelectMany(x => x));

            return search;
        });
animated

Вопросы на собесах №3

Что я понял со своего опыта - на собесе надо обязательно просить писать код. Причём не на бумажке - а в приближенных к боевым условиям: в IDE, в консоли хрома, где удобно. Очень часто люди либо подкупают хорошими soft skills, либо хорошо рубят в теории - и ты под впечатлением такой: "ну тут - джедай, тут даже как-то неудобно просить задачки решать". Но надо заставлять писать код, и смотреть как это кандидат делает. Ты же не пиздабола покупаешь, а программиста. Бывает, что люди с улыбкой и весело рассказывают про заоблачные дали, а код писать - не умеют. Банально не умеют простейшие алгоритмы написать с третьего раза, не умеют пользоваться IDE.

Короче. Я даю такую примерно задачку C#-ерам:

string[] cities = { "Moscow", "Minsk", "Kyiv" };
string input = "I live in Moscow.";

Написать алгоритм, который найдет в input ровно одно вхождение строки из массива cities, и выведет его. Если вхождений ноль, или больше одного - выведет "none".

Дальше события развиваются по-разному. Некоторые - про LINQ только слышали, да и через foreach не могут решить. Люди которые не смогли даже это за час нормально сделать - мне попадались. Это уже даже не смешно.

Дальше мы усложняем, в зависимости от успеха с предыдущим заданием, и смотрим как умело человек жонглирует кодом и IDE:

1. Добавляем еще такое:
string[] skills = { ".NET", "Java", "JS" };
string input = "I write .NET in Minsk";
И просим найти ровно одно вхождение из обоих массивов.
2. Представим что городов 100к. Как ускорим твой O(N)?
3. Давай обработаем "HELLO,MINSK!"
4. У городов бывают разные написания (Kyiv/Kiev), давай заведем каждому городу синонимы
5. Что будет если справочники в БД?
- какая табличка будет
- какие индексы повесить
(кстати нетривиально, если подумать - мы же не знаем на клиенте какие слова означают города)

Человека умеющего - видно сразу. У него и пальцы по кнопкам попадают. И F5 ему религия не позволит нажать пока ни одного лишнего пробела не по conventions не будет. И чик-чик подрефачили - ибо перфекционизм. И ничего лишнего в коде не будет.

Короче просите человека сделать то, ради чего вы его нанимаете. А не "как работает GC"? Если бы меня спросили "как работает GC", я бы ответил: "заебись он работает, за свои 12 лет с дотнетом - ни разу туда не лазил".
animated

Вопрос на собесах #2

Любые, претендующие на какую-либо работу с вебом - как правило это фронтэндеры-еры JS-еры, подвергаются мною чудовищному, нечеловечному испытанию:

Есть разметка:
<div class="parent">
  <div class="child child1">
    Child1
  </div>
  <div class="child child2">
    Child2
  </div>
</div>


Очевидно, без какого-либо CSS - дивы "child" отобразятся один под другим. Какие есть способы, в т.ч. извращенные, в т.ч. и применимые в каких-то специфических случаях - чтобы эти два дива встали горизонтально - в ряд друг за другом, типа:
[ Child 1 ] [ Child 2 ]
?

--- дальше спойлер ---

Жду два-три способа. С извращениями от бывалых и толковых - насобирал штук восемь. По ходу беседы - записываю тут же на доске названные - так задорнее. Юзаю как повод проверить hands on на flexboxes - по ним копаю глубже, типа "а как сделать минимумум в 100px". Вопрос работает и как повод для разговора: "а в наши-то времена оооо", "в вилобаджо уже сверстали всё на таблицах, и ебашат друг друга в квейк", и "слышали ли вы про новые веяния с grid layout?". У вопроса нет дна - один раз закончили на том, что transform - работает лучше чем position: absolute - потому что врубается композитинг GPU.

Спрашиваю это от входа, потому что нет никакого смысла брать даже супер-джедая-реактера - который не умеет хакать браузер. Бывает "5 лет опыта в JS, видел только бустрап, я разберусь в CSS по ходу". Но сорян - так оно не работает. Я тоже думал что CSS - это просто почитать чутка, но нет.
animated

Вопросы на собесах #1

Людям, у которых в CV богатый опыт в SQL, на собесе задаю вопрос:

Есть таблица relations, с полями: subordinateId, managerId, roleId, ...
На ней есть индекс с полями (subordinateId, managerId)
Есть запрос
select subordinateId from relations where managerId = 123
Вынуждена ли БД сделать full scan - т.е. полный перебор всех записей? Вопрос со звёздочкой - а будет ли вообще использован индекс и зачем?

Я вот уверен что благородные доны-читатели живут в окружении людей, для которых ответ будет очевидным. Но по моим приборам, примерно 70% кандидатов на этом вопросе отлетают.

Интересно ваше мнение. А чтобы вам было проще, вот варианты:

1. Плохой вопрос - понимание индексов/хешей/бинарного поиска/etc. можно проверять более доходчиво
2. К тебе ломятся тонны зомби, не пускай их к нам в IT
3. А я сам вот не сразу придумал ответ - и живу без этого в IT уже 10 лет, и всё у меня хорошо
4. Свой вариант.

Если кому зайдет история про мои вопросы на собесах - пишите, у меня много такого.
animated

IT - говно

Тут важные темы ребяты поднимают:

Процессор репостит:
Your Computer is Not A Fast PDP-11
https://queue.acm.org/detail.cfm?id=3212479
https://nponeccop.livejournal.com/646483.html

Всеми уважаемый Тонский, продолжает про Software Disenchantment
Good times create weak men
https://tonsky.livejournal.com/324161.html

Я об этом всём думаю чуть попроще. В IT индустрии, один умный чувак может сокращать издержки в 10 раз, да и в 100 может. За счёт более правильных инструментов, за счёт понимания какие люди нужны, что и как что с ними делать, за счёт "зуб даю, давайте ебанём это на Rust". За счёт "давай план глянем... о давай ебанём туда вон индекс - о збс помогло". Или даже за счёт "а вот это закажи долбоёбам на headhunter на node". Спрос на людей, которые это могут - растёт. И надо потихонечку-полегонечку учиться это сакральное понимание конвертировать в денюжку.
animated

Физики-лирики

На вменённых мне проектах, я наблюдаю такую хуйню:

Бекендер, со стажем, за выслугу лет, идет лидить проект. Но он нихуя не понимает простую вещь: бекенд нужен чтобы xx.com вообще открылась, и чтобы когда там пыщ-пыщ на UI нажимают - не проёбывались данные. Всё. Блядь всё. Всё остальное в продукте - делает фронт-энд.

Просто раньше фронт делали те же бекендеры. Или там было так жостко сложно, что "хоть бы как". А теперь - REST-API хуйнул: "нате, хуярьте свой UI", и пошел дальше докерами развлекаться.

Короче. Если вас не бесит UX микроволновки дома, и если вы сходу не придумываете как пиздануть охуенный UX для кастоюли с ТЭН-ами, если вы не видите что UI на один пиксель поехал и это "не аккуратненько" - вы из прошлого века, ваше время прошло, нельзя вам доверять тех-лидство. Можно взять себе "сделаем API как надо фронту, сделаем чтобы БД не тормозило, посрёмся с BA потому-что-пошли-они-нахуй-это-требование-всё-положит". Но отвечать за результат - уже не. Потому что результат - это что чик-чик кнопочки клацают, юзер доволен. Ну и данные не проебались, да.

К сожалению, пока часто UI-лид - 25 лет, бекенд-лид - 35 лет, "иди нахуй мальчик со своей хуйней, мы деплоим микросервисы", и на выходе блевотина.