Skip navigation.
Home

Будни бытия


"Первым был запущен простейший полуавтомат-уборщик, который то и дело заклинивало, он беспомощно
застревал в громоздившихся повсюду завалах. Кибернетик, ходивший за ним с
инструментами, вытаскивал его, как таксу из лисьей норы, убирал обломки,
слишком крупные для его глотки, и снова его запускал."

С. Лем, "Эдем".


"Кто в армии служил, тот в цирке не смеется"

(с) Народ.

Я сделал открытие, которое, без сомнения, перевернет все представления человечества об эволюции приматов и происхождении человека. СТЭ (синтетическая теория эволюции) нервно курит в углу, а палеобиологи дружно жуют свои галстуки.

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

(дальше интересно только тем, кто зарабатывает на хлеб насущный в отладчике в поте лица своего)

Текущий клиент - солидная фирма с весьма известным именем, выпускающая разнообразную электронную аппаратуру. К этой аппаратуре идет софт, который предназначен для настройки оной, съема показаний, мониторинга и пр. Вот этим-то софтом я и занимаюсь: отлов багов, добавление фич (ну да, иногда наоборот - отлов фич и добавление багов), документация и пр. Рабочее место у меня теперь своеобразное: если раньше на столе стоял только компьютер, то теперь на огромном почти круговом столе стоит куча помигивающего лампочками и жужжащего железа, среди которого затерялся крошка-монитор на 26 дюймов.

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

Общая архитектура.

Проект пишут уже второй десяток лет, и он поддерживает _всю_ линейку оборудования, выпускаемого фирмой с 198..-не-помню-какого-года, т.е. около полутысячи устройств самого разного назначения. Т.е. вот кофемолка и стиральная машина (к примеру) управляются одной и той же софтиной, хотя общего между ними - только шильдик на корпусе. Больше 50000 исходных файлов, около 300 модулей, полная сборка проекта на далеко не последней машинке длится около двух часов.

В одном проекте собрано все: распознавание этих самых устройств, их настройка, обновление прошивок, мониторинг состояния, генерация отчетов, картография (угу, некоторые устройства имеют gps на борту) и работа с базами данных. Мне доводилось пару раз слышать от жалких нытиков стоны по поводу того, что, мол, "в некоторых задачах плохой интерфейс, потому как мол, четырехуровневое меню". Эти лузеры и бездельники не видели, как каждый пункт меню открывает диалоговое окно с подразделами, каждый из которых имеет в свою очередь, дополнительные подразделы, и 8-12 кликов мышью для доступа в соответствующий пункт меню - далеко не предел.

Теперь кошер и халяль, соссно:

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

Четвертое место, или русская рулетка:

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

Третье место или копи-пэйст, бессмысленный и беспощадный:

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

Второе место на нашем празднике жизни устойчиво держит следующий диалог с тестерами:

- Вот Вы упомянули эту ошибку в документе.
- Да.
- Простите, но проблема была исправлена мной три недели назад.
- Да? Ой, я не тот билд тестила.
- Вы _все_ тестили на "не том" билде?
- Ну да...

(дева, кстати, жгучая брюнетка).

И, наконец, первое место по праву делят три следующих цимеса:

А:

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

если первое_представление->столбец->цвет_столбца == красный
то
таблица->строка_номер->цвет = розовый.
конец.

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

Б:

Есть база данных, из нее берутся данные, составляющие дерево. Узлов в дереве может быть несколько тысяч. Значения данных в узлах меняются каждые 5 секунд, изменение данных обозначает, скажем, изменение цвета узла. Данных каждые 5 секунд может быть чуть больше или чуть меньше (некоторые узлы пропадают и появляются).

"Так как узлов много, и построение дерева на форме диалога (!!) идет долго (удивительно. Ц.А.), то мы сначала строим полностью все дерево, и заполняем вот эти массивы дополнительно:

массив_видимых_узлов
массив_невидимых_узов
массив_удаленных_узлов
массив существущих_узлов

и оперируем ими в зависимости от изменения ситуации" (с) конец цитаты. Да, господа, добавлю: это именно массивы, а не хеши, к примеру.

С:
Получить данные из контейнера в человеческом виде можно только вот так:
Контейнер->дай_данные (CEdit*)
Контейнер->дай_данные(CTreeCtrl*)
Контейнер->дай_данные(указатель_на_элемент_интерфейса)

Собственно, теперь меня ни юмористы, ни самые изошренные сюжеты литературы и кинематографа больше не прикалывают: ну что после _этого_ можно еще придумать?

На сегодня все.

P.S. А сервер я себе поставил все-таки LMDE 64-битный, и по результатам хочу сказать "спасибо" тем, кто посоветовал сделать именно это: поставилось без проблем и работает, как часы.