Зашла девушка из соседнего отдела (но другого, не того, где сильные программисты).
-- А где ваш начальник? -- Он ушёл пять минут назад. -- А где студенты? -- Они ушли одну минуту назад. -- Да что ж такое! Мне сегодня весь день не везёт!
И ушла. Вернулась она через джва часа. К тому моменту я остался один. (гусары, молчать!)
-- А можно у вас два листочка напечатать? У нас принтер не работает. -- Можно. Но... с принтером у нас тоже могут быть проблемы.
У нас действительно принтер печатает не каждый раз. Он сетевой, и иногда с некоторых компьютеров документ просто висит в очереди, а эффекта нет. В этом случае единственный способ -- перезапустить компьютер.
У меня уже был такой висящий документ, поэтому я сразу начал с перезагрузки компьютера. Перезагружалось всё очень медленно. Потом медленно открывался браузер.
-- Ты же программист! Почему у тебя всё так медленно работает?
С одной стороны, мне стало стыдно. А с другой стороны... я тебе по доброте душевной пытаюсь документ напечатать, а у тебя ещё и претензии? Это что такое? Я ответил:
-- Именно поэтому медленно и работает.
Но на самом деле поведение компьютера было нетипично. Браузер открывался раз в пять медленнее обычного. Потом я не мог открыть почту, куда она прислала документ. Потом почту я открыл, но документ не удавалось скачать. Я открыл диспетчер, там оказалось, что браузер занял уже 4 гб памяти и 1 ядро целиком, это спустя 5 минут после старта! Кончилось это тем, что мне пришлось запускать другой браузер, который предназначен для других целей. Там всё получилось. Я напечатал листочки и она ушла.
И после её ухода всё стало летать.
***
Я могу только подозревать, в чём было дело. Но как оккультист могу сделать предположение. Эта девушка занимается йогой. Надо было её спросить, не проводила ли она в последнее время медитаций в местах... скажем так, подозрительных? О кладбищах я даже не говорю. Какая-нибудь лесная полянка, которая симпатично выглядит, но почему-то никем не используется, как вам такое?
Я не раз писал, что у меня арахнофобия. А точнее, меня пугают только сенокосцы.
У меня подозрение, что это связано со сценой из первой Матрицы, которую я смотрел в детстве. Помните, когда Нео устанавливали жучок в пупок? Это и представить-то страшно.
Что вызывает у меня страх кроме сенокосцев? Всё, что похоже. Водомерки. Длинноногие комары. Однажды я испугался летающей пушинки от растения.
А недавно я смотрел видео с жирафами. Пока жирафы стояли на месте, всё было нормально. Но когда жирафы побежали -- и стали перебирать своими длинными тонкими ногами, то я почувствовал, что да. Что это огромный сенокосец!
В соседнем отделе понадобился функционал, близкий к тому, что мы уже сделали. Мы добрые, мы дали им несколько файлов с исходным кодом, который делает то, что им надо, и готовую DLL-библиотеку. В исходном коде есть тёмные места, с которыми не разобраться без наших об'яснений, но нам сказали, что у них сильный программист. DLL-библиотека двоичная, но как раз та часть, которая касается её использования, у них была полностью.
Потом зовут, нужен совет. Я пришёл, смотрю, что они написали. А там написано:
Сначала Евгений Евгеньевич, наш доктор наук, что-то рассказывал про атомную энергетику, и в этом-то и была причина последующего казуса.
Потом он рассказывал про что-то ещё, я не помню, про что.
Потом он неожиданно перешёл к Японии.
-- Как говорят японцы, кто ни разу не был на Фукусиме, тот не жил. А кто был там дважды, тот дурак.
У меня ушло какое-то время, чтобы переварить то, что он сказал.
-- Что-что вы сказали? -- Народная мудрость. -- Какая? -- Что на Фукусиме надо побывать хотя бы раз, но два раза -- уже перебор. -- Может быть, на Фудзияме?
Продолжаю (а точнее, заканчиваю) знакомиться с творчеством фантаста-аутиста, который любит описывать технические подробности, а остальное -- не любит.
Из трёх книжек -- Марсианин, Артемида и вот это -- я выбираю вот это. Это произведение самое масштабное, самое навороченное, и тут много сюжетных ходов.
Нет, в других тоже много сюжетных ходов но... не таких. Здесь ходы с откровением, если можно так сказать.
Я начал читать, ничего не зная о сюжете -- и это было отлично. Так что всем советую бросать читать этот пост и переходить к самой книге.
Оставшимся сообщаю для информации. В Марсианине герой спасал себя. В Артемиде -- город. Тут мы добрались до планетарного масштаба. Герой с помощниками отправляется в космическую научную экспедицию, чтобы провести in situ наблюдение одного явления, которое надо срочно прекратить, иначе все погибнут. Но вот как его прекратить -- это и предстоит выяснить, попутно выяснив много всего другого весёлого.
Комментария к книге у меня три.
Первый -- излишний оптимизм по поводу того, как человечество может об'единиться при подготовке такой миссии. ДА, человечество способно к кооперации, но показанный уровень примерно в 10 раз превышает то, что я себе представляю. Я буду рад, если на практике всё будет действительно так.
Второе -- для меня главным тезисом книжки стало "мы должны использовать только проверенные технологии". Мы по работе делаем приборы различной степени серийности. Поэтому я по опыту знаю, что первые экспериментальные образцы -- это кринж. Нужны месяцы или годы, чтобы устройство начало работать стабильно и правильно. (поэтому меня веселит, когда, к примеру, Донателло из Черепашек-Ниндзя на коленке собирает крутую штуку, которая сразу правильно работает и не ломается)
Третье -- баланс главных героев. Союз меча и орала. Учёного и инженера (который кстати по способностям близок к Донателло). На первый взгляд, баланс выглядит симпатично. Но у меня он вызывает какое-то чувство неудобства. Инженер смотрится как-то приниженно по сравнению с учёным. Его гениальные конструкторские навыки должны компенсировать недостаток знаний и интеллекта, но почему-то не компенсируют. Возможно потому, что способности учёного продемонстрированы в натуре, то есть -- в виде мыслительного процесса. Работу инженера тоже ведь можно было так показать, верно? Вместо этого мы видимо только результат работы. Получается Мэри Сью. Это неестественно.
Надеюсь, Вейер ещё что-нибудь напишет. Текущие три произведения показывают, что он может писать достаточно разнообразно, хотя основной жанр один -- производственный роман.
Яйца к Пасхе красили без меня. Все яйца стали тёмные, а потом их обернули термонаклейкой. Разложили на специальном блюде с углублениями.
Я пришёл, смотрю.
Я: А почему не все яйца покрашены? Мама: Как это не все? Я: А вот одно, белое! Папа: Оно от салата осталось. Мама: Ох, куда это годится? Оберните его, а то оно одно перед остальными голое!
Вышел ночью после работы на стоянку -- вижу на стене свет фар. Как будто бы светит со стороны моей машины!
"Блин, неужели я забыл выключить фары?" "Целый день светили -- должен был аккумулятор сесть" "И как я уеду? Не заведётся ведь" "Но у меня же есть пускач! Вот и протестирую" "Что-то слишком ярко светят для целого дня работы" "А вообще мои ли это фары?"
Это была соседняя машина. Там сидел водитель.
***
Самые частые вопросы про мою машину: -- Какого года? -- Инжектор или карбюратор? -- А сменить не хочешь? -- За сколько продашь?
(насколько я понимаю, последние два вопроса периодически значат одно и то же)
Стою на заправке, жду пока зальётся бензин. Тут за мной под'езжает жигуль абсолютно такого же цвета (и той же модели). Но выглядит немного не так. Тарахтит невозможно. Бампер мятый и ржавый. И фары разного цвета. Выходит бурят.
-- А у вас какого года? -- 2009. -- Охуеть. Инжектор или карбюратор? -- Инжектор. А у вас какого года? -- 2007. -- У вас карбюратор? -- Да нет, тоже инжектор. -- А почему такой звук? -- Клапан прогорел. -- Что ж... чинить надо...
В Леруа Мерлене плохо сделана система ввода нескольких товаров. Нужно: 1. Нажать "ввести количество" 2. Выбрать количество 3. Приложить товар
В других магазинах на кассах самообслуживания сделано не так: сначала прикладываешь товар, потом либо жмёшь плюсик, либо выбираешь количество.
Тут из-за того, что всё сделано наоборот, а после ввода количества не выдаётся никакой информации, есть риск пробить неправильное количество, а потом искать, кто может отменить (потому что на таких кассах всегда можно увеличить число товара, но уменьшить можно только с помощью Галины).
Например, пробиваю пять лампочек. Пробил первую. Потом жму "ввести количество". Ввожу пять. Не работает. Ладно, пробью по одной. Прикладываю, и вижу в чеке:
1 лампочка 5 лампочек
*пингвин кланяется*
ВЫВОД. Если число товара не применяется, то нажмите ещё раз и выберите НА ОДИН МЕНЬШЕ.
Не знаю, кто это придумал, но точка на нумпаде превращается в запятую, если у вас русская раскладка. Потом это видишь, тянешься к точке на основной клавиатуре. Получается "ю". Материшься, сдвигаешься вправо на одну кнопку, попадаешь наконец в точку.
В программировании выбора нет, но в пользовательских интерфейсах выбор есть. Оказывается, не так мало стран используют десятичную запятую.
В полях ввода надо всегда обнаруживать "неправильные" разделители и как-то их обрабатывать.
Наилучшее решение: всегда во всех числовых полях трактовать запятую и точку взаимозаменяемо. Написал пользователь 1,5? Это полтора. Написал 1.5? Это тоже полтора. Это уберёт ряд проблем, особенно в математическом ПО.
Среднее решение: выбрать стандарт и ему следовать. Если пользователь вводит не тот разделитель, сообщать ему об этом и дальше не пускать.
А вот чего делать нельзя никогда — нельзя игнорировать неправильный разделитель. Обнаружил в доставшейся мне программе ситуацию, когда всё, что после десятичной запятой, отбрасывается без сообщений об ошибках. И таким образом 1,5 превращается в 1, а 2,5 превращается в 2.
Такое у меня бывает и в переписке, и в устной речи, но когда в переписке -- это гораздо хуже.
Например, об'ясняешь кому-то, как пройти в библиотеку. И в определённом месте надо сказать, куда надо повернуть после столба -- налево или направо. Ты хорошо понимаешь, куда надо поворачивать, но всё равно оговариваешься.
Я: Идёшь-идёшь до столба и поворачиваешь направо. Я: Ой, то есть, налево!
Разговор может быть и поважнее, чем поход в библиотеку, но смысл в том, что ты говоришь противоположное, тому что надо. И эта разница имеет принципиальное значение.
Если собеседник следит внимательно, он может заметить нестыковки в пояснениях или увидеть, что присутствуют оба варианта. Но собеседник может пропустить правильный вариант и увидеть только неправильный. Или при текущем прочтении всё понять, а при следующем сделать наоборот. Это очень плохо.
В устной речи можно правильный вариант (идущий за неправильным) выделить интонацией или вообще начать рассказывать с начала. Но даже в таком случае это путает собеседника там, где путаница совершенно не нужна. В письменной речи избежать путаницы сложнее.
Даже если после неправильного варианта написать правильный, можно даже несколько раз, правильный и неправильный варианты всё равно будут соседствовать друг с другом. Что же делать в таком случае? Я лично удаляю неправильное сообщение и пишу заново. Пусть лучше будет "сообщение было удалено", а потом правильный вариант, чем несколько вариантов в соседних сообщениях. (хорошо если это не емейл, но емейл можно перечитать перед отправкой, в чатах общение происходит гораздо быстрее)
Ну и есть ещё один метод, применимый и для устной, и для письменной речи. Дублирование. Если лево-право имеет принципиальное значение, то в об'яснениях его надо проговаривать несколько раз, причём с интервалами. И во всех местах должно быть написано одно и то же. Это будет служить подтверждением для собеседника, что информация сообщается точно. Для меня это тоже самопроверка. И если хоть где-нибудь информация будет отличаться, то это будет явным сигналом об ошибке. А уж кто поймает ошибку -- я или собеседник -- это дело десятое.
Далее только две цитаты, но длинные. Прочтите их внимательно.
(стр. 14-15) (статья 3, пункт 4; внесение изменений в 53-ФЗ "О воинской обязанности и военной службе") раздел I дополнить статьей 71 следующего содержания: "Статья 7-1. Временные меры, направленные на обеспечение явки по повестке военного комиссариата <...> 4. Неявка без уважительной причины гражданина, состоящего на воинском учете, по врученной повестке по истечении 20 календарных дней со дня, указанного в повестке, влечет применение в отношении такого гражданина временных мер, направленных на обеспечение его явки, в виде: а) запрета на государственную регистрацию физических лиц в качестве индивидуальных предпринимателей; б) запрета на постановку на учет в налоговом органе физического лица в качестве налогоплательщика, применяющего специальный налоговый режим "Налог на профессиональный доход"; в) приостановки на постановку недвижимого имущества на государственный кадастровый учет и (или) государственную регистрацию прав, осуществляемые в соответствии с Федеральным законом от 13 июля 2015 года № 218-ФЗ "О государственной регистрации недвижимости"; г) ограничения на пользование гражданином правом на управление транспортными средствами, предоставленным Федеральным законом от 10 декабря 1995 года № 196-ФЗ "О безопасности дорожного движения"; д) запрета на государственную регистрацию транспортных средств, осуществляемую в порядке, установленном Федеральным законом от 3 августа 2018 года № 283-ФЗ "О государственной регистрации транспортных средств в Российской Федерации и о внесении изменений в отдельные законодательные акты Российской Федерации"; е) отказа в заключении кредитного договора, договора займа.
*** (стр 39-40) (статья 3, пункт 14; внесение изменений в 53-ФЗ "О воинской обязанности и военной службе")
в статье 31: а) пункт 2 изложить в следующей редакции: "2. Граждане, подлежащие призыву на военную службу, обязаны получать повестки. Повестки указанным гражданам направляются в письменной форме и дублируются в электронной форме. В повестках должны быть указаны правовые последствия невыполнения гражданами изложенных в них требований. Граждане, подлежащие призыву на военную службу, обязаны получать повестки военного комиссариата в письменной форме под расписку. Повестки направляются военным комиссариатом указанным гражданам по почте заказным письмом с уведомлением о вручении по адресу места жительства или места пребывания либо вручаются гражданам работниками военного комиссариата или по месту работы (учебы) гражданина руководителями или другими ответственными за военно-учетную работу должностными лицами (работниками) организаций лично. Повестки военного комиссариата, направленные в письменной форме по почте гражданам, подлежащим призыву на военную службу, считаются врученными под расписку в день доставки (вручения) соответствующих заказных писем указанным гражданам при наличии в уведомлении о вручении заказного письма отметки организации почтовой связи о доставке (вручении) заказного письма гражданину. Повестка в электронной форме направляется гражданину, подлежащему призыву на военную службу, в порядке и способами, которые установлены Правительством Российской Федерации, и считается врученной с момента ее размещения в личном кабинете гражданина на соответствующем информационном ресурсе, в информационной системе. В случае, если повестка не считается врученной одним из способов, указанных в абзацах первом - четвертом настоящего пункта, повестка считается врученной по истечении семи дней с даты ее размещения в Реестре повесток.";
Я бы хотел придумать какое-нибудь средство от следующего явления.
Встречался я с ним в разных обстоятельствах, так что приведу конкретный пример, который был со мной несколько лет назад.
Еду в метро, вижу рекламу: на таком-то автосервисе цена за нормо-час такая-то. А что такое нормо-час? Надо посмотреть. Интернета нет. (не помню, его тогда в метро ещё не было, или был, но я им не пользовался по тактическим соображениям) Ладно, приеду домой -- посмотрю.
Дома я про нормо-час ничего не думаю и не вспоминаю.
На следующий день опять еду в метро, опять то же об'явление. И я такой -- ба! Я так и не посмотрел про нормо-час.
ТО ЕСТЬ.
Ситуация 1. Надо сделать дело А, но сделать его нет технической возможности. Отложим. Ситуация 2. Возможность сделать дело А есть, но я про него забыл. Потом снова ситуация 1. Ах ты ж ёшки-матрёшки! Вспомнил, но сделать опять не могу!
Наиболее перспективным мне кажется установление себе напоминалок в смартфон. На практике я, однако, пока ни разу таким приёмом не воспользовался. У этого метода есть два недостатка: а) нужен смартфон б) нужно предугадать время, в которое я буду в правильном контексте. В большинстве случае с обоими пунктами проблем не возникает. И всё же, хочется универсальное решение без применения технических средств.
История довольно запутанная, так что приготовьтесь. Сначала придётся рассказать, о чём анекдот, а потом сам анекдот.
Началось всё с того, что зимой у машины плохо поворачивался замок. В ответ на это я перестал машину запирать вовсе, о чём я уже писал.
Настала весна. Выяснилось, что замок закис окончательно -- не поворачивался. Я решил его смазать. Для этого я демонтировал внутреннюю обшивку двери, подлокотник и ручку стеклопод'ёмника. Без обшивки я ездил неделю. Окно мне открывать надо, поэтому я поставил на место ручку. Ручка сама не держится, там есть фиксатор.
Фиксатор сам тоже не держится, если нет обшивки. Если неосторожно крутить -- он выпадает.
Пока всё понятно? Дверь без обшивки -- ручка -- фиксатор. Фиксатор выпадает. Такой себе фиксатор. Зачем было вообще ставить фиксатор тогда? Потому что без него ещё хуже!
***
Сцена вторая. Я ехал к коням и опаздывал. Простоял в пробке тут, там и сям. Передо мной по яндекс-пробкам было ДТП и кусок красного перед ним. И вдобавок у меня кончался бензин. Я заехал на заправку, но там была очередь, поэтому я сразу же оттуда уехал. Я решил воспользоваться аварийным запасом бензина, который у меня в канистре. Я встал в удобном месте, залил 10 литров и поехал дальше.
Пробка рассосалась, поэтому я не опоздал. Приезжаю, открываю дверь и вижу ручку стеклопод'ёмника у себя под ногами. А фиксатор где? А фиксатора нет. Обыскал коврик и щели вокруг него -- нет. Обыскал землю рядом с дверью -- нет. И тогда-то я и понял, где он отвалился. Там, где я заливал бензин!
***
Сцена третья. Дело в том, что я встал заливать бензин не просто посреди дороги, а в месте, где есть очень чёткие ориентиры. Да, население там скудное, но там есть ПЕШЕХОДНЫЙ СВЕТОФОР. Не очень понятно, для кого он, но он есть. И вот перед этим-то светофором (примерно в 20 метрах) я и заливал бензин. Что же я решил сделать на обратной дороге? Правильно, остановиться с другой стороны, перейти дорогу и посмотреть, не валяется ли фиксатор там, в грязи.
Я так и сделал. Ну и не было бы этого поста, если бы не одно обстоятельство.
У нас железка в трёх версиях, 1, 2 и 3. Каждой версии существует разное число экземпляров.
На все версии у меня один проект прошивки. При помощи условной компилации в нём написано:
#ifdef VERSION_1 //низкоуровневые настройки для 1-й версии #endif
И так далее. Различий между версиями немного, но они очень важны. Прошивка, скомпилированная для одной версии, не будет работать на другой. Даже не запустится.
Естественно, у меня всё автоматизировано. В компиляторе есть нужное число конфигураций, есть кнопка batch build. Когда я готовлю "релиз", я собираю все версии прошивки одним махом и кладу в целевую папку.
И вот мы стали обновлять ПО у пользователя с самой старой версией железки. А оно не запускается. Не перепрошивали ему железку давно, прошло уже много релизов. Мне пришлось перебрать несколько версий прошивок, прежде чем я нашёл ту, на которой всё перестало работать. Причина была тупая. Я случайно внёс изменения в раздел, который не компилируется, когда идёт сборка для самой новой железки. А тестировали мы всё именно на ней. Когда же идёт компиляция под старую версию, ошибка попадает в прошивку. Ошибку я исправил. (теперь иди, под новой версией железки проверь!)
Это что за кринж такой? Почему мы не тестируем на старой железке перед релизом? Да потому что нет у нас её. Все экземпляры находятся у пользователей. Единственное нормальное решение -- иметь у себя по одному экземпляру каждой версии. И так можно было бы сделать, если бы железки стоили по сто баксов. Но они стоят гораздо дороже. Получается, что выгоднее ловить баги у пользователей, чем держать у себя три (а в перспективе ещё больше) тестовых стенда.