....и о работе.
Вбегает лось в бар:
- мне 20 граммов водки!
- Ты такой здоровый, почему всего 20 грамм?
- Мне только для запаху, дури у меня своей хватает!
Большая часть контрактной работы (во всяком случае в моей жизни) - это помесь археологии с ассенизаторством: заказчик нанимает контрактника примерно на той же стадии, когда среднестатистический гражданин идет к врачу: когда лечить уже, как правило, поздно. При этом молчаливо подразумевается, что: "ну ты же специалист, сделай что-нибудь". Вот прямо сейчас я в очередной раз стою (точнее, сижу) над вскрытым телом кодом заказчика и мучительно пытаюсь понять: здесь нужен экскаватор, или хватит осинового кола лома и лопаты? Заказчик при этом искренне считает, что речь идет всего лишь о незначительных трудностях, и если чуть-чуть подшаманить скальпелем, то наступит благодать и благорастворение воздухов.
Впрочем, судите сами:
1. Передаваемые между клиентом и сервером данные описаны в структурах. Разработчики конторы не парились такими приземленными вещами, как повторное использование этих самых структур: объявления абсолютно одних и тех же классов встречаются в проекте от двух до 5 (рекорд) раз. Т.е. каждый разработчик ничтоже сумняшеся копировал себе в библиотеку структуру и даже не переименовывал ее. При этом во все поля используется копирование памяти, сравнение памяти и так далее.
2. Проект условно делится на старый (написан на чистом С) и новый (написан на С++) связи между проектами никакой, но каждый файл проекта выглядит примерно так:
#ifdef СТАРЫЙ_КОД
код старого проекта
#else
код нового проекта
#endif
Чтение этого добра (менять я его еще не пытался, я пока только читаю написанное предшественниками) бодрит с утра неимоверно, доставляя много приятных минут. Нет, табуляцию придумали евреи, негоже истинным джедаям пользоваться богомерзским форматированием текста.
3. Сумрачный безымянный гений упихал в std::vector некие данные. Оперирует он с этими данными вот так:
std:vector<Хрень> МояХрень;
Хрень* p1 = &МояХрень[0];
Хрень* p2 = &МояХрень[5];
Хрень* p3 = &МояХрень[7];
...
..
...
if (*p1.....)
и так далее.
При этом в вектор кто-то еще в параллель что-то запихивает, удаляет, вставляет и меняет. Понятно, что если неловко чихнуть, то это падает с оглушительным грохотом. Но! Выработана система правил, когда можно чихать и когда - не стоит.
4. О существовании такой штуки, как std::map люди не знали. И поэтому для хранения пар "ключ-значение" используется следующая гениальная конструкция:
std::vector
storage[0] - первый ключ первой пары.
storage[1] - размер значения в байтах.
storage[2] - storage[2 + storage[1]] - собственно, само значение.
...
storage[2 + storage[1] + 1] - второй ключ второй пары.
и так далее.
Для того, чтобы увеличить градус экстаза, сообщаю, что этот вектор в последнем примере - тот же, что и вектор в предыдущем примере.
На этом фоне 11 (одиннадцать) одинаковых объявлений по коду:
#define MAX_BUFFER_SIZE 2048
Смотрятся уже чем-то типа утренника в начальных классах католической школы для девочек-сирот.
Нет, я не назову название фирмы-клиента. Исключительно на смертном одре.
- cynic's blog
- Login to post comments