Очередной проект по доделке и переделке авторских недоделок в программе заказчика. Угу.
Заявлена кроссплатформенность - используется Qt, есть клиенты для Windows и никсов. Клиентов беспокоит, как Гондурас странная особенность: под никсами программа уверенно работает отовсюду, кроме каталогов, расположенных в /home (например - на рабочем столе, что должно быть интуитивно понятно и привычно для пользователей Windows). Угу.
Авторы грешили на особенности сборки Qt, на примечания к документации QFileSystemWatcher "о зависимых от системы лимитах на количество одновременно наблюдаемых путей". Но почему-то программистов заказчика не обеспокоила такая особенность систем, под которые портировалась изначально виндозная программа, как чувствительность к регистру путей файловой системы. Аффтары нечувствительно приводили путь к lowercase, а потом проверяли существование каталогов типа Desktop или "Рабочий стол" для пользователей типа Vasya_Pupken.
А метод проверки QDir::exists(), спроектированный с учетом особенностей *nix, имел их всех в виду.
Был у нас в универе один вредный препод. Не любили его, так как предмет свой он преподавал просто отвратно. И вот однажды надо было сдать ему на зачет какую-то программу. Мой друг написал ее. Сдал. Со второго раза получил допуск к экзамену. Мне стало интересно. Запускаю - работает. Обрадованный беру код, смотрю. Спустя пару секунд падаю под стол от такой строчки:
for (int i=0; i<N; i++) M[i]=M[i]+0;
- Что это? - спрашиваю. - Инициализация - отвечает мне друг. Да, конечно, инициализация. Прогрев памяти перед работой... Загадка - как препод пропустил все это? Наверное, код не открывал даже. Работает, и ладно.
Кажется, было это на 3 курсе, году в 2000. Приношу я на сдачу лабу на делфях, препод берёт дискетку и говорит: "Сейчас я посмотрю у себя кабинете и вас позову". Ну ладно, стою в коридоре, жду.
Через две минуты это чудо вылетает из кабинета с бешеными глазами и вопрошает: "А как вы сделали, что у вас Edit по форме можно перетаскивать?!" Я, естественно, офигеваю и прохожу вслед за преподом в кабинет, пытаясь вспомнить, что это я там мог наваять, drag&drop что ли какой, да вроде не писал его... В полной задумчивости подхожу к компу и вижу, что "гуру программирования" не запустил компиляцию в делфи и перетаскивает всяческие элементы по форме с крайне умным видом
Разрабатываем одну большую корпоративную систему - огромная база данных, большие нагрузки на сервера ну и веб-интерфейс, куда ж без него. Интерфейс этот пишется с использованием одной библиотечки, которая в свою очередь вовсю использует AJAX. Библиотека open-source, но как-то раз преподнесла совершенно неожиданный сюрприз.
Решил я ее обновить, скачал новую версию, пересобрал, залил - все вроде в порядке. Но при заходе на одну из страничек сервер стал тут же падать! Не поняв с первого раза, как стабильно работающее приложение может вдруг выкинуть такой фокус, стал внимательно изучать логи. И обнаружил там, о ужас, StackOverflowException! При этом, точно зная что рекурсию нигде не использую, порылся в своем коде пару минут, да и решил заглянуть в код библиотеки. А там увидел вот такую прелесть на месте того метода, который вызывал ошибку:
/** * @return * @see #getPage() * @deprecated */ public int getPageIndex() { return getPageIndex(); }
Вот оказывается как надо объявлять метод устаревшим, чтобы его впредь больше никогда не использовали!
Работаю тестировщиком в офшорной софтверной компании. На одном проекте со мной трудятся китайские разработчики, которые регулярно, простите, жгут. Не могу не поделиться последним их подвигом.
Есть на одной из форм поле "Дата рождения". Во время тестирования было выяснено, что значения туда могут быть введены уж очень фантастические (люди столько не живут), крайней датой, которую можно сохранить, было 1 января 1573 года, после крайней даты система вываливала страшный ексепшен.
Иду в багтрек и пишу предложение китайским друзьям - ребята, есть смысл во-первых, определить приемлемый диапазон дат (это ж не просто дата, а дата рождения), во-вторых сделать юзер-френдли сообщение, на случай если пользователь опечатается в этом поле, дабы не пугать его.
В следующей версии приходит фикс. Иду проверять, ввожу какую-то, совсем уж мохнатую дату, на что получаю "user friendly" сообщение: "The date should be between January 1, 1753 and December 31, 9999"
Это ж как масштабно мыслят эти парни - система, видимо должна работать не только с супер-долгожителями, но и с людьми, которые родятся только через несколько тысячелетий...
Пришёл к нам парнишка на испытательный срок. Теория от зубов просто отлетает... А вот как садится что-то делать, вечно что-то отмочит: то в sql where код группы товаров с кодом площадки приравняет, то ещё чего.
Один раз такой случай был. Дали парню написать одну задачу. Сделал, значит, и несёт руководителю отдела на проверку (я рядом сижу). Написал что-то типа:
declare date_1 DATE; date_2 DATE; ... select ... into date_1 from ......; select ... into date_2 from ......; select ... where some_date between date_1 and date_2;
Ему говорят: "Не мучай сервер несколькими запросами, заверни всё в один запрос, а переменные убери" (там это можно было сделать очень логичным образом). Парень подумал-подумал и уточнил: "Ну, одним запросом я сделаю... А куда мне переменные девать?"
Мы с нач.отдела не выдержали и почти хором ответили: "Ну удали, что ли?"
Некоторая конторка подвизалась для одного из округов большого города сваять систему расчета коммунальных услуг населению. Умолчим про то, что она была написана на MS Visual Basic for Applications., а потому требовала на машинах Клиентов в обязательном порядке MS Office. Сама база лежала на MS SQL, клиенты цеплялись к базе напрямую. И как-то в том округе сложилось, что сервер был несколько слабее рабочих станций, и потому были написаны гениальные перлы. Загружаем, например, все на рабочую машину в память (SELECT * FROM) - потом считаем. Распечатать квитанции за месяц - да пожалуйста, тем же SELECT * FROM надергали из массива в шаблон отчета - печатайте!
Все это не смотря ни на что прекрасно работало с парой-другой тысяч клиентов и понравилось какому то чиновнику из области и стал он продвигать это на места в города, городишки и прочая. Одного только не учли, что в среднем таком городке лицевых счетов - несколько десятков тысяч. И понеслось - бесконечные оптимизации, доработки, исправления, решения проблем. Постоянное зависание рабочих станций ввиду того, что нету там свободной памяти в гигабайтах, а если и есть, то ворочать такие объемы - мрак.
А сервер с четырьмя гигами оперативами и двумя Xeona`ми по 3ГГц стоял в сторонке и спокойно отдыхал... Русский деревенский код.
Вторая половина 90-х. Выпускали мы обучающие курсы на CD. Шеф приходит и просит сделать по быстренькому какую-нибудь защиту от копирования CD. Человек он был далекий от программинга, но весьма адекватный и к нашим доводам "за деревянным забором, который мы сможем вам построить много не спрячешь" отнесся с пониманием. Тем не менее попросил что-нибудь все-таки придумать.
Подумали, сделали. В те времена 700-метровые болванки были достаточно большой редкостью, не говоря уж про многочисленные утилиты для работы с образами дисков. Написали генератор мусора (300-метровый файлик), долили его внутрь архива с ресурсами - вуаля, на обычную болванку физически не влазит, и мусор просто так из архива не вырвать.
Несколько лет тому назад одним из способов побочного заработка у меня было "оффшорное программирование" — в Москве собирал заказы на сайты, а сам передавал их на разработку в страны ближнего зарубежья, где ставки работы программеров были существенно ниже "рассейских".
До тех пор, пока делались сайты-визитки и прочая мура с ежедневным числом до ста человек, все было хорошо. Но тут нарисовался заказ на переделку движка одного тематического новостного сайта, на котором было от 15 до 30 тысяч посетителей в сутки и размер дампа базы новостей был около 300 мегабайт. Движок переделали под требования заказчика, на стадии тестирования все прошло отлично — отправили в релиз. Через 10 минут после запуска — звонок с истошным воплем заказчика: "На вашем сайте вирус и он сломал нам сервер!!!". И действительно, минут через 10 после включения сервер с хостящимся сайтом переставал отзываться на внешние раздражители, разве что пинговался. top и ps, запущенный на серваке, показывали сумасшествие mysqld, который с потрясающей скоростью отбирал под себя проценты CPU и мегабайты памяти. my.cnf был перелопачен вдоль и поперек — без толку.
От безысходности залез в код движка — и вот тут волосы встали дыбом, стул подо мной сломался. Обращение к БД было реализовано весьма оригинальным способом — SELECT * FROM список_таблиц, а уже потом из такой вот 300-метровой глобальной переменной вычленялись необходимые компоненты.