5349

MD5.1

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

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

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

5348

Домушные сети

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

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

5342

Плед до добра не доведёт

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

5337

126 тысячных

Пришёл спам в контакте. Интересно же посмотреть — перехожу по ссылке.

Для Вас сгенерировано 1350 голосов!

Это единственный легальный способ получить голоса БЕСПЛАТНО.

Голоса нужно использовать до 31.02.2011.

НЕ нужно указывать e-mail или пароль.

Всё делается одним кликом мышки.

Нажми на кнопку, чтобы забрать свои голоса:

Забрать 1350 голосов

Уже выдано голосов: 1213820.

Не знаю, что меня больше напугало: то ли 31 февраля, то ли осознание факта, что голоса забрали 1213820 / 1350 = 899,126 пользователей. 0,126 пользователя — это, наверное, кусочек мяса, ещё меньший кусочек мозга — и везде кровь… Ужас.

Одним кликом мышки всё сделать не получится: надо выбрать, сохранить и запустить (пусть даже с клавиатуры). Ссылка ведёт на .zip.exe (пожат UPX, но весит 925 КБ), который даже не запустился под Вайном. Обидно. Прогнал через онлайн-проверку Доктора Веба — у них это давно есть в базах. Скучно.

В общем, я всё понял: эту хрень написали те самые 126 тысячных юзера, они же её и тестировали. А ведь так хотелось запустить, порадоваться за автора, узнать, что же он хотел от нас… Отправил предложение переписать под Ubuntu, а ещё выучить ассемблер и не страдать х@#нёй.

5335

Гладко было на бумаге

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

Я не программист, я математик. И 25-летнего стажа у меня нет — мне всего 27. Тем не менее, на моём счету нахождение ошибки в вычислительной программе по телефону (неправильное соотношение шагов в сеточном методе для уравнения теплопроводности — в итоге деталь охлаждалась до −3000 градусов) и ещё пара подвигов в этом духе, но рассказ не об этом.

Недавно меня попросили реализовать один алгоритм (если кому интересно, Savitzky-Golay smoothing). Ерунда вопрос. Два дня, чтобы прочитать, что же это за зверь, два дня, чтобы вспомнить синтаксис C, два дня, чтобы не торопясь написать и протестировать консольную программу (напоминаю, я не программист). И вот в процессе тестирования вылезает глюк: в результате сглаживания у положительной функции появляются отрицательные участки. Понятно, что на такой функции и с такими параметрами метод не работает, но как понять, где его можно применять, а где нет? И вот я погружаюсь в глубины интернета в поисках оценок погрешности метода, но их нигде нет. Самому оценки вывести не получается — метод сформулирован в таких терминах, что непонятно, с какой стороны к нему подходить. Алгоритм опубликован в 1964 году, но за сорок лет никто не удосужился его протестировать и обосновать?! Невероятно, но факт. В принципе, после этого можно было бы сдать работу и сказать, что оно сорок лет у всех работало и у нас поработает, но совесть не позволила. На реализацию ушла неделя, на поиск альтернативных решений или обоснований — два месяца. Вот такое вот «чтобы работало». Решайте сами, как бы вы поступили в такой ситуации.

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

5332

Уберите руки от моего аптайма

Есть у меня на работе одна женщина, несколько неадекватная. У неё бзик на почве того, что её все стараются уволить. Как-то подняла шум из-за того, что один из «программистов» что-то ей испортил. Когда она выключает компьютер, тот её спрашивает: «Завершить работу?»

— Мне завершить? Совсем — и с вещами на выход? Я ещё вас тут всех пересижу, вы меня не уволите!

5331

О сложности простоты

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

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

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

Оверинжиниринг — вот мировое зло, вот дьявол всеохватный. Надо же обязательно показать всему миру длину своей пиписьки, свою «современность» и владение всякими супер-пупер-технологиями. Как? Ты до сих пор ищешь четыре максимальных элемента в массиве при помощи цикла? Так ведь в последней версии надстройки для последнего Visual C++, которая продаётся всего за $1600, давно реализован готовый класс для этого! Или можно взять готовую функцию qsort, которая всего-то отсортирует зря остальные 4 миллиона элементов, зато ты потом просто сможешь взять e[0], e[1], e[2], e[3] — и всё!

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

for (b=a=0, a

Возможно, после пары тумаков он станет нормальным программистом и начнёт писать так:

for (MaxVal=i=0, i
if (MaxVal
// Ищем максимальный элемент и его номер. Массив полностью нулевым не бывает (проверено выше), поэтому MaxIndex всегда определён.


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

5330

Золотая раздача платинового альбома

«Left its seeds while I was sleeping», — пели Саймон и Гарфанкел в далёком 1965 году, задолго то того, как на нашем национальном трекере ввели систему подсчёта рейтинга.

5321

Проскочим с разгона

Когда-то купил Final Fantasy IX. Игра в своём жанре едва ли не лучшая. Я предвкушал кучу приятного игрового времени: шутка ли — четыре диска! Игра сделана для первой Sony PlayStation, а у меня только комп, поэтому играл я на эмуляторе. За счёт мощной видеокарты и современного процессора при выключенном FPS-лимите эмулятор дурел и, отрываясь на сравнительно примитивной графике, выдавал далеко за 300 кадров в секунду вместо положенных 30–60. Играл я, соответственно, только при включённом FPS-балансе, который автоматически понижал количество кадров в секунду до обычных показателей.

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

Когда началось то самое видео, игру я поставил на паузу. Настройки → FPS, снимаем все ограничения и запускаем игру дальше. В итоге комп на радостях загрузил процессор на 100%, выел всю оперативку и, объединившись с мощностями видеокарты, начал показывать видео на дикой скорости. Когда дело дошло до участка с артефактами, за несколько секунд мелькнуло около двадцати кадров с битыми текстурами, пару раз экран моргнул чёрным — и игра пошла дальше.

5320

«Тру» не по нутру

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

* * *

«Гении». Берутся за всё, делают на треть. Потом говорят: «Остальное тривиально», и за них доделывают другие. Любой совет со стороны воспринимают как повод унизить собеседника: «Чё ты ваще понимаешь?»

«Архитекторы». Эти лучше только тем, что берутся не за всё сразу. Зато любят изобретать свои архитектурные решения. Казалось бы, для типовой задачи за полвека придуман не один десяток типовых решений — нет, надо изобрести очередной велосипед с квадратными колёсами. Чуть не забыл: в архитектуре, по их мнению, я тоже ничего не понимаю.

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

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

«Оптимизаторы». Могут веками переписывать что-то на ассемблере (внося баги, конечно), считать такты процессора в Java-приложении и хранить биты в SQL-сервере.

* * *

А что же быдлокодеры, к коим принадлежу и я? Принцип «сделай быстро, сделай тупо, не пиши лишнего кода» — он не от хорошей жизни.

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

Ладно, ребята, гордитесь, только не при мне. Я видел ваш код. С точки зрения унитаза люди различаются довольно слабо.