Истории с тегом: мысли о вечном

Всего историй: 830

10789

Пусть оно просто работает

Каждый пользователь компьютера должен быть компьютерно грамотным? Окей, давайте посмотрим на аналогию.

Вы покупаете новый телевизор. Прежде всего заходите в настройки и выбираете параметры приёмного тракта: частоты входящего сигнала (с точностью до герца), частоту гетеродина, тип кодирования цветности, выставляете тайминги. Ура! Телевизор показывает какой-то канал. Но вы-то хотели посмотреть другой? Срочно читать инструкцию, найти частоту нужного канала, выставить все параметры заново. Помехи? Не беда — в нашем телевизоре стоит система цифровой обработки, вот только надо будет её активировать, потом подобрать параметры, чтобы затереть шумы. Запомните все эти шаги, потому что скоро вы захотите снова переключить канал. Документация по PAL/SECAM/NTSC прилагается, функциональные схемы и описание настроек — тоже.

Может быть, вы не смотрите телевизор? Тогда давайте возьмём мобильный телефон. Заходим в инженерное меню, смотрим, на каких частотах сейчас работают ближайшие базовые станции. Выбираем нужную, настраиваем телефон на работу с определёнными таймслотами. Имейте в виду: при перемещении может потребоваться перенастройка телефона. Описание сетей GSM и SS7 прилагается, изучите его внимательно.

Или вот автомобиль. С бортового компьтера выставьте правильные тайминги подачи искры, отрегулируйте состав горючей смеси, следите за температурой и датчиком кислорода, не забывайте регулировать это при смене скоростного режима. На дорогу иногда посматривайте. Графики, схемы и настроечные таблицы попросите у производителя и желательно держите всё время при себе.

Или всё-таки нет? Вы хотите переключать канал кнопкой на пульте, болтать по мобильнику в дороге и спокойно ехать на своей машине хоть в гору, хоть по лужам? А почему? Наверное, потому что вы — тупой идиот, овощ, недостойный звания человека, желающий переложить проблемы настройки и управления своими гаджетами на электронщиков, телефонистов и автомехаников. Может быть, у вас даже Мак или Андроид вместо нормального компьютера, поэтому-то вы и не разбираетесь в тонкостях установки драйверов по ID производителей и хотите, чтобы компьютер управлялся одной кнопкой.

10776

Тем дальше бежать за трактором

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

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

О том, что надо обрабатывать вырожденный случай — линейное уравнение, — каждый двадцатый.

О потере точности не вспоминает практически никто. После моих намёков код переписывается и распухает раза в три.

О потере точности в комплексных числах никто сам так и не вспомнил.

Сопроцессор в архитектуре х86 при денормализованном результате может генерировать исключение (ошибку). Народ матерится и начинает устанавливать флаги сопроцессора. После намёка, что такой финт может повлиять на выполнение кода во вложенных вызовах, в соседних потоках и колбэках, матерится и переписывает ещё раз. Потом вопрос: а что будет, если кто-то поменял флаги сопроцессора извне? Потом я задаю вопрос про SSE, ARM, PowerPC, режимы округления 80x87. Прошу оценить погрешность вычислений. Что делать, если погрешность вычислений такова, что влияет на знак дискриминанта? Намекаю, что при большой погрешности надо сменить метод решения… К этому моменту не совсем тупой народ начинает понимать, что сильно попал.

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

Если человек говорит, что пишет программы без ошибок, увольняйте его немедленно. Полное совершенство и всеведение доступно только Аллаху, но он программ не пишет. Для прочих смертных — это верный признак, что человек умеет сваливать ответственность на других, и за ним придётся все переписывать. Чем круче джип, тем дальше бежать за трактором.

10775

Пора начинать думать

У меня очень интересная работа: я консультирую по вопросам безопасности в широком смысле этого слова.

Например, вы закрыли чёрный ход в ваш офис модной железной дверью с магнитным замком, подключённым к навороченной СКУД. Вот только эту дверь можно открыть умелым рывком. И не надо мне показывать спецификацию замка с усилием на разрыв в полтонны — если не верите, можем пройти и открыть. А если даже я и не смогу со своими 70 килограммами, то вон тот дядя в центнер с гаком сможет.

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

Подобных рисков повсюду полно: плохо защищённые вайфай-сетки, неудачно разведённая сигнализация, непродуманная логика работы СРМ и так далее. Косяки в электрике, механике, программах, поведении людей и организации процессов.

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

«Очевидно, что самолёт летит выше уровня моря» — для кого очевидно? Для меня вот совсем не очевидно. Во-первых, ещё в школе на уроках географии говорилось про Прикаспийскую низменность, где высота поверхности ниже уровня океана. Во-вторых, само понятие «уровень океана» — синтетическое, усреднённое, и оно не обязательно точно совпадает с измеренным в конкретной точке. Вполне очевидно, что высота может быть отрицательной, это допустимый случай. Вот если бы речь шла о показаниях радара — там да, там физика не позволяет получить отражённый сигнал раньше излучённого, и там задержка, а следовательно, и расстояние до поверхности не могут быть отрицательными. При программировании надо было всего лишь не ориентироваться на свой так называемый «здравый смысл», а вспомнить, что это за величина и откуда она берётся. Не бояться неведомых «глюков софта», не надеяться на высшие силы, а просто заранее подумать как следует. О чём вам и говорили.

В качестве примера можно ещё вспомнить автонавигаторы. Казалось бы, несложно сделать машину, которая будет ехать по навигатору. Да, несложно. Почему не делают? Боятся глюков софта, ответственности за жизнь людей? Те, кто так считают, просто ничего не понимают в проблеме. Дело всего лишь в том, что карта в навигаторе — тоже «синтетическая величина», не отражающая текущей реальной обстановки на дороге: сегодня там проезд, а завтра — встречное движение. Поэтому без дополнительного оборудования контроля за обстановкой сделать такую машину нельзя. А вот с ним можно: Гугл уже сделал. А то, что сейчас всё ещё требуется водитель, — не из-за возможных глюков, а из-за того, что имеющегося оборудования пока может быть недостаточно.

Прекращайте бояться. Начинайте думать.

10771

Помни о подводном истребителе

Говорят, парашютные инструкторы больше всего не любят учеников, которые не боятся.

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

Очевидно, что для самолёта нулевая высота там, где лежит Мировой океан. Вот кто знал, что F-16 может летать на несколько метров ниже этого уровня? Однако над Красным морем на бреющем полёте это возможно.

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

А представляете, что будет, если лётчик пассажирского самолёта включит реверс двигателей в воздухе? Давайте проверим входные параметры, разрешим это делать, только когда шасси выпущено и начало вращаться за счёт контакта со взлётно-посадочной полосой? Правда, при гололёде может возникать неприятная ситуация…

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

Однажды инженер из AT&T по ошибке выдернул блок не из выведенной в режим обслуживания стойки АТС, а из стоящей рядом рабочей. Соседние АТС этого не оценили и веером отключились. Наземную связь на территории половины США восстанавливали около суток.

Вы все ещё уверены в своём коде и не боитесь? А были бы так уверены, если бы от вашего кода зависели жизни людей?

10768

Сначала думаю, потом пишу

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

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

Есть входные данные — они могут поступать из разных источников, значит, надо продумать защиту от того, чтобы эти данные могли привести к сбоям.

Есть опечатки в коде — для этого в нормальных языках программирования предусмотрены специальные инструменты. И никакая «неопределённая переменная» вам не будет страшна. Кстати, не забывайте инициализировать переменные — это ведь нетрудно!

Есть ошибки, когда кто-то перепутал местами переменные или использовал не ту функцию, но для этого у вас должен быть продуман сценарий тестирования модуля. Сделали — собрали — протестировали. Ведёт себя не так, как должен? Устраните проблему! И делайте это на уровне отдельных модулей, ещё до того, как готовая система уйдёт в отдел тестирования.

Не надо городить сложноинтегрированные системы. Разбивайте их на отдельные функциональные блоки! Каждый блок должен работать идеально. Надо будет — лучше потом написать ещё один интерфейсный блок для сопряжения.

Не используйте говнобиблиотеки, «потому что модно». Если решили использовать какую-то стороннюю библиотеку, постарайтесь разобраться в вопросе, не забывайте предусмотреть проверку данных и продумать защиту от нарушения логики на стороне библиотеки.

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

Ну вот, чувствую, как на голове материализуется фуражка Капитана Очевидность. Вам ведь наверняка всё это уже говорили, писали в книгах по программированию. Так откуда же берутся горе-программисты, которые привыкли быстренько, тяп-ляп, практически не думая, набросать код, который вроде примерно как надо работает, но в определённую фазу Луны при снижении котировок куриных окорочков на Нью-Йоркской бирже во время снегопада в Норвегии начинает вести себя совершенно непредсказуемо?

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

Не знаю. Я работаю по старинке: сначала думаю, потом пишу. Что характерно, на глюки потом никто не жалуется. Может быть, потому, что я уверен в своём коде.

10765

Спасение не по комплаенсу

На Лондон надвигается наводнение. Всех оповестили. В числе прочих оповестили и сотрудников крупного инвестиционного банка. Надо завести заявку, чтобы сотруднику, хорошему менеджеру, выдали лодку. Завели. Лодки нет. Кто-то шепнул, что лодки лежат в соседней комнате, а насосы, чтобы их накачать, — этажом выше. Эскалировали три часа назад — лодок нет.

Вода прибывает. Уже по щиколотку. Менеджер упорно строчит письма главному менеджеру: «Вы что, не понимаете? Нам срочно нужна лодка и насос!»

Воды по пояс. Некоторые компы уже затопило, и они вырубились. Какой-то индус тащит лодку, на ходу накачивая её насосом.

— Эй, ты! Тебе апрувнули лодку?

— Нет, я сам взял.

— Ты что, это же не по комплаенсу!

Менеджер срочно строчит письмо вверх по иерархии: тут индус без апрува взял лодку и надувает её! Отвечают: «Мы подумали и решили: вам необходима не лодка, а двухмоторный катер. Катер уже заказали, как только апрувнут, он будет у вас. Дело индуса передано куда следует. Спасибо за бдительность».

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

Вода подходит к груди. Хороший менеджер уже эскалировал эскалированную эскалацию до самой высшей инстанции. Держа компьютер под мышкой, стоит на столе, в одной руке — телефон, в другой — клавиатура. Набирает письмо: «Для своевременного завершения намеченного этапа проекта нам необходимо выделить дополнительные ресурсы в количестве одной надувной лодки и одного насоса для надувной лодки». Носом нажимает Enter. Письмо отправлено. Пытаясь перехватить поудобней системник, роняет клавиатуру в воду. Всё. Письма больше писать не получится, остаётся ждать апрува.

Воды по шею. Стоя на носочках, подняв над головой системник и монитор, с надеждой и собачьей преданностью менеджер смотрит в экран. Письмо: «Постройка вашего катера апрувнута. Бюджет на покупку деталей утверждён. Перенаправляем вашу заявку непосредственно на верфь, где будет построен ваш двухмоторный катер».

Глаза хорошего менеджера подёргиваются пеленой. Вода подступает к горлу. Зато все комплаенс-полиси и процесс соблюдены.

* * *

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

10763

Код под капотом Родины

Не стоит приставать к киношникам. Не знает львиная часть населения о том, как пишутся и ломаются программы. И только два процента, узрев на суперкрутом компе пришельцев из соседней галактики DOS Navigator, заходятся от смеха.

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

10755

Полукругом или линейно?

В последнее время на IT happens развелось поколение админов, которые, как дети малые, пытаются доказать, какая же операционная система лучше. Вам ещё не надоело? Абсолютно все системы хороши. Просто кому-то надо «научиться их готовить».

Вы долгое время просидели на линуксе, и вдруг приспичило вернуться на винду, но драйвера не ставятся и найти не получается? Научитесь их ставить. Нет на сайте производителя — ищите по вендору и ID девайса. На худой конец драйвер-паки есть, а «семёрка» (у линуксоидов будет шок) может сама драйвера искать и ставить.

Приспичило пересесть с винды на линукс? Ставьте Убунту — не ошибётесь. Ищите мануалы, которые написаны человеческим языком, а не «возьмите яйцо дракона, кровь девственницы…»

Не надо ругать то, куда зашёл впервые, или то, что плохо знаешь.

Моя сфера работы — IT, но больше всего на свете я люблю метро. Впервые поездив на «номерных», очень быстро привыкаешь к контроллеру. Пересесть на какой-то другой подвижной состав страшно: всё совершенно не так. Но проездив два-три круга на линии, уже и забываешь о том, что кран машиниста спрятан под экран, а рукоять контроллера ходит не полукругом, а линейно.

Ко всему надо привыкать, всему надо учиться. А нытьё о том, что же лучше, — показатель самых низших качеств администратора.

10713

Не ходите в программисты — их пути весьма тернисты

Сижу я в тёмной комнате

Перед открытой «Студией»

И парочку регэкспов я

Пытаюсь разобрать.

Компилю — не компилится,

Дебажу — не дебажится;

Дедлайны приближаются —

Проект пора сдавать.

Структура усложняется,

Экзешник разрастается,

Светает за окошками

И смысла нет уж спать.

Последний билд я делаю…

Ух, господи, работает!

Совсем почти не падает —

Всё, можно сохранять.

Быть программистом — здорово!

Тут многие пытаются,

Но пару слов всем школьникам

Мне хочется сказать:

Учитесь вы на сварщика,

На токаря, на слесаря;

Но сишным девелопером

Не дай вам боже стать.

10710

Google Drill

Еду в автобусе. Мимо проплывает рекламный щит: «Оплачивай со своего счёта „Билайн“ приложения в Google Play». А у меня на коленях коробка с дрелью Metabo, на которой написано: «Work. Don’t play». Призадумался.