10777

Отставить обновление!

Я программист, а не админ. До той работы виндовые сервера вообще даже не видел, но кое-как разобрался и уже более-менее уверенно в них тыкался, но тогда…

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

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

Ладно, разобрался, как знал: написал небольшой сервис, который зорко следил за процессом wuauclt.exe и, как только тот начинал кушать больше положенного, просто его убивал. Ну, а с переходом на Windows 7 всё вылечилось само собой.

10776

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

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

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

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

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

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

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

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

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

10775

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

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

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

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

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

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

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

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

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

10774

Файлик в утке, утка в зайце, заяц в флешке

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

Такой лакомый кусочек памяти сразу облюбовал младший братишка, до этого успешно баловавшийся со всякими дисками с суффиксом RW. В компьютерной грамотности подрастающего я как-то даже не сомневался и регулярно давал попользоваться девайсом.

Однажды флешка у него заигралась на неделю. По возвращении я не столько удивился сильной помятости устройства (брат хоть и младший, но будет покрупнее меня и повспыльчивей), сколько обнаруженной в корне диска одной папки «Съёмный диск (J:)», а в ней — «Съёмный диск (Q:)», а в ней — «Съёмный диск (K:)», а в ней — «Съёмный диск (G:)», а в ней… Рандом по английскому алфавиту большой вложенности, а на каком-то этапе появлялись файлы.

Как так человек измудрился сделать, как этим пользовался, почему в приступе ярости покалечил ни в чём не повинный корпус и какого Гейтса никто не подсказал и не помог, умалчивает и история, и сам человек. Робкие объяснения сводились к идее: «Хотел скопировать содержимое на ряд компьютеров в институте. В общем, вроде что-то получилось, но вышло не то, а вот так».

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

10773

С чувством выполненного долга

SVN — удивительная вещь.

Удалили объёмную папку с репозитория. Я решил сразу её удалить у себя. Обновляюсь. Выкачивает. Отменяю, проверяю. Всё равно выкачивает. Обречённо разрешаю. Жду.

Как оказалось, он её выкачал, чтобы удалить.

10772

No Data, No Cry

Работаю в IT-аутсорсинге. Выехал как-то к клиентам машинки их посмотреть, вирусы погонять, бэкапы сделать. На одном ПК (давно купленный фирменный системник HP) была куча ПО этого самого производителя. Дай, думаю, удалю лишнее, всё равно время есть. Среди всего этого набора установлена была HP Backup & Recovery. Так как мы пользуемся другим софтом для бэкапов, то эта программа на ПК явно без надобности. Специально запустил её на всякий случай, увидел окно «Что хотите сделать?», как при первом запуске, запустил удаление. Прога намекнула, что могут быть проблемы с восстановлением, если её удалить. Эх, прислушаться бы тогда…

Нажал ОК — и с удивлением увидел, что пропал весь рабочий стол. Захожу в «Мой компьютер» и наблюдаю полное отсутствие диска D: со всеми данными. В управлении дисками неразмеченных областей нет, раздел С: — на весь HDD. Ни откат системы, ни попытки найти удалённый диск результата не дали.

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

10771

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

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

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

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

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

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

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

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

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

10770

От нашего стола — нашему столу

Работаю IT-консультантом в крупной компании. Cегодня познал рекурсию: у пользователя на рабочем столе ярлык, ведущий на рабочий стол. Долго думал.

10769

//это код

Довелось мне унаследовать работу одного, несомненно, талантливого программиста. Был у него всего один недостаток: не писал он комментариев. Во многих тысячах строка кода изредка лишь вкрапливалось что-то типа //new, //modified. Самый информативный комментарий, который мне попался: //product.

Коллеги-программисты! Не умеете описывать свои гениальные функции по стандартам — хотя бы не ленитесь писать информативные комментарии между строк, если не хотите, чтобы вас прокляли.

10768

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

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

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

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

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

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

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

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

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

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

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

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