Только что помогал какому-то (или каким-то?) индусам на cplusplus.com. Эти удивительные «программисты» решили написать 3D-игруху на «плюсах», только начиная осваивать их. Но дело не в этом. Они упорно спрашивали, «как сделать GUI», а на мой вопрос, какой: виндоусный (а вдруг настройщик, снаружи валяющийся) или игровой, они лишь дали ссылку: «Как в этой игре». Мой вопрос про движок был проигнорирован — видимо, у них сейчас важное заседание на тему этого движка. Сначала мне хотелось смеяться, потом плакать. Жду не дождусь их нового сообщения.
Истории с тегом: программизмы
Всего историй: 900
Ускорено серым веществом
Во времена моего программерского расцвета, в первой половине девяностых, из всех вменяемых междумордных библиотек (для DOS/Windows) существовало всего две: трубо-вижн-борландюшатник и Цинк. Были и ещё какие-то: либо со строго закрытым коммерческим API, доступным только за очень отдельные деньги, либо откровенно лажающие на самых примитивных контролах. В общем, всего две. И ни одна из них не прикручивалась к Clipper 5.x напрямую — всё равно надо было кодить пакет-посредник, что вдвое снижало время отклика.
В общем, мы с коллегой решили: нужен набор интерфейсных примитивов, написанный на самóм Клиппере (и примкнувшем к нему ассемблере). Благо 5.2+ уже в полной мере был вменяемым объектным языком, и всего лишь нужно было заэксплуатировать недокументированное. Сели, обдумали концепт, за пару недель создали ТЗ, ещё через пару месяцев на свет появилась библиотека (статическая, само собой: дело-то под «доской» происходило), которая из текстового описания динамически порождала экранные формы с полнофункциональными контролами. Это вам не из бинарных .FRM вынимать поток — это реальный конструктор форм. Вплоть до того, что сами описания форм можно было хранить в таблице БД и при необходимости править при помощи банального memoedit'а... Да-да, и мета-язык тоже был! Это оно сейчас, когда визуальноe программирование стало нормой, кажется смешным. У нас на тот момент выбор был небогатый.
В середине девяностых на моём домашнем компе умер винч. Умер зонами, в одну из которых попали исходники этой самой библиотеки. Причём и сама бибилиотека, и .OBJ для неё выжили. Пока ещё был некий коммерческий спрос на DOS-программы, эта либа честно поучаствовала в нескольких вполне продаваемых проектах. При этом переписать её не было никакой физической возможности: исходники вымерли вместе с винчестером, а Клиппер-декомпилятор смог возродить менее трети текстов. Остальное не воспроизводилось, так как опиралось на вскрытые, но таки недокументированные особенности языка.
Так к чему я это всё? Ах, да... Среди модальных диалогов был и прогресс-бар. Который, само собой, нельзя было перерисовывать при каждой итерации: обрабатываемые таблицы вполне могли содержать миллионы записей, а рантайм Клиппера — это интерпретатор прекомпилированных байт-кодов (Явы тогда ещё и в проекте не существовало). То есть, это сразу стало ясно, нужен вменяемый пересчёт отношения «current/total» в размер окна с прогресс-баром, то есть нормализация на единице квантования бара. Было немножко арифметики вне цикла, после чего внутри цикла отрабатывались только пороговые значения, которые продвигали бар на полоску вперёд. Правда, именно на Клиппере это решалось чуть проще: часть арифметики делал рантайм, подсаженный на коллбек (и это под ДОСом).
Короче говоря, я до сих пор встречаю два вида прогресс-баров: первый, жутко тормозной, и второй, чётко и шустро отщёлкивающий прогресс — сделанный по тем же принципам, что и у меня, с учётом размера кванта. Второе решение более затратно по серому веществу (ровно на знание арифметики), первое — наповерхностно-очевидно и, следовательно, неверно. Привет коллегам-программерам из девяностых!
Регресс-бар
Лет пять-шесть назад рассказывал я студентам об итеративных алгоритмах и о принципе 20/80. В качестве иллюстрации и отвлечения для припомнил одну историю, приключившуюся со знакомым в конце 90-х. Его попросили посмотреть, почему счётная программа работает в разы медленнее, чем должна. Затык оказался в том, что прогресс-бар состояния расчёта обновлялся после каждой итерации. В итоге время обновления прогресс-бара со всеми сопутствующими операциями и перерисовкой окна было сопоставимо со временем расчёта одной итерации. Программист этого просто не заметил — для него во время отладки, на малых размерах задачи и паре десятков итераций, разница в десяток секунд никакой роли не играла. Всё «исправление» свелось к вызову злополучной процедуры ввода-вывода каждую сотую итерацию.
И что же вынесли из лекции студенты? Несколько человек из других групп потом подходили и спрашивали, правда ли я читал лекцию о том, что графический интерфейс тормозит программы, и его нельзя использовать ни при каких условиях.
На самом деле всё совсем не так, как кажется
Сижу за компом. Некоторое время читаю с экрана, потом — короткая очередь по клавишам и щелчок мыши. На что похоже со стороны? Посиделки в аське или чате, не правда ли?
Ан нет: «плюсы» осваиваю. Взгляд в учебник — и пометка в Блокноте на случай, если после большого перерыва придётся вспоминать, что к чему, или тык в Билдер. Не торопитесь с выводами!
Кулхацкер и коровушка
На IT happens есть жанр студенческих историй про некомпетентных айти-преподавателей. Идеальная история в этом жанре выглядит приблизительно так.
К автору-кулхацкеру приходит знакомая коровушка-блондинка и просит написать программу на сдачу. Кулхацкер пишет ей таковую программу, обладающую многими достоинствами. Коровушка пытается сдать программу доценту, но доцент программу отвергает либо принимает на низкую оценку, причём кулхацкеру доподлинно известно, что оный доцент на высшую оценку принимал программы, многими достоинствами не обладающие или даже вовсе не работающие. В качестве бонуса иногда приводятся высказывания доцента, демонстрирующие его некомпетентность. Следует либо подразумевается вывод: доцент тупой, система образования прогнила, доколе и т. п.
Попробуем, однако, предположить, как такое может произойти, если доцент таки вполне компетентен и добросовестен. Варианты следующие.
1) Доцент, как и полагается, оценивал не текст программы, а его защиту коровушкой, которая при этом ни мычала, ни телилась. Тут следует отметить, что если программа нестандартна, именно квалифицированный доцент обязательно поинтересуется у коровушки, из каких соображений она сделала то-то и то-то. Вероятность завала резко повышается. В то же время если другая аналогичная леди неоднократно подходила к доценту с различными нерабочими вариантами программы, консультировалась, кровью и потом добилась какого-то прогресса, доцент может поставить высшую оценку и за неработающий код — из педагогических соображений. Да и сердце-то не каменное.
2) Быстроглазый и шустрый кулхацкер выхватил глазами только часть задания, не учёл граничные условия, не поинтересовался названиями ни дисциплины, ни лабораторной работы. В результате, например, вместо рекомендованного Паскаля был использован C#. Или же вместо демонстрации возможностей цикла for были продемонстрированы возможности команды jne.
3) Кулхацкер не справился с заданием, но сам этого не понял: проконсультироваться-то возможности не было.
Что же до некомпетентных высказываний доцента, следует помнить, что кулхацкеру они известны только со слов обиженной и заведомо некомпетентной коровушки, а читателям ещё и со слов обиженного кулхацкера, так что ожидать корректной передачи их смысла было бы в высшей степени наивно.
Спасите наши души
Недавно меня лишили премии, сделали выговор и даже собирались уволить. А всё почему? Я решил ради прикола повторить то, что когда-то вычитал: ребята добавили в лицензионный договор (кто его хоть раз читал?) строку о том, что пользователь передаёт им душу, и подсчитали, сколько душ у них накопилось. В общем, к одной простенькой программке, которая позволяет отслеживать привязанную к уходящим по сети файлам информацию, я писал этот договор и добавил туда строчку про душу. Договор читали наши юристы, потом его читали в ОФЭРНиО, куда программу в числе других повезли регать, — никто, естественно, ничего не заметил. Программу выложили на сайте. За время, которое она там провисела, её скачало чуть менее тысячи человек. Сначала я следил за числом скачавших и заключивших соглашение, но через месяц-другой надоело.
Несколько дней назад меня вызвал начальник. Ему написал какой-то серьёзный дяденька из Штутгарта, который был очень озабочен проблемой владения собственной душой. Этот дяденька не только не поленился это соглашение прочитать, но и, удивившись, отнёс в бюро переводов, оплатив услугу из своего кармана, удивился второй раз и решил написать нашему директору. И зачем дяденьке-немцу только понадобилась программа на русском языке?
В общем, я обещал так больше никогда не делать. Заодно меня заставили перевести специально для этого дяденьки программу на немецкий — благо я учил его шесть лет. Так что цените ваши души, господа, и... да нет, к чёрту эти лицензионные договоры!
Непутёвый релиз
Пишу приложение на Qt в Creator. Машинка у меня не сильно шустрая, а Creator — не больно проворная среда. Программа при запуске загружает много картинок, поэтому каждый пробный запуск в дебаге затягивается неимоверно. Решил под релизом запускать: не столько код отлаживаю, сколько работу сценария. Но в самой IDE и в конечном релизе пути к ресурсам разные, поэтому я написал два варианта путей, и к комментарию «Отладочный дебаг» добавились записи: «Отладочный релиз» и «Релизный релиз».
Бесценный бездарь
Однажды у нас в институте уволился завкафедры программирования. Пока искали ему замену, я услышал разговор на другой кафедре, занимающейся подготовкой специалистов в области информационных систем в экономике. Собеседники обсуждали предложение одному из их коллег стать новым завкафедры и горячо поддерживали его нежелание. В разговоре часто проскальзывали фразы: «Он так хорошо разбирается в программировании»; «Он такой хороший преподаватель»; «Что ему делать на этой разгильдяйской кафедре?»
Попросила одна знакомая помочь с лабораторкой по программированию на C++, занятия по которому вёл тот самый бесценный препод. Тема лабораторной: «Массивы и работа с динамической памятью». Подчёркиваю, ни слова про классы. Задание: ввести с клавиатуры массив произвольной длины и отсортировать чётные строки по возрастанию, а нечётные по убыванию.
Через 15 минут была готова программа из 10 строк. Никаких лишних условий. Если номер строки был чётным, то происходила сортировка по элементам строки. Если нечётным, то по этим же элементам, умноженным на −1. Программу препод забраковал, так и не сумев внятно объяснить, что не так, но принял другую, сдутую у кого-то из соседей. Что было в той программе:
— класс «строка», где имелся массив конечной длинны (да-да, если пользователь хотел больший массив, то программа не работала) и переопределённые операторы [] и =;
— класс «массив», состоящий из статического массива объектов класса «строка» и переопределённых операторов [] и =;
— куча функций непонятного предназначения c неведомыми параметрами;
— куча глобальных переменных, в том числе и сортируемого массива.
Но больше всего убило то, что автор сего творения не удосужился никуда инкапсулировать сортировку. Сортировка происходила в цикле, как с обычным массивом. При этом на каждом шаге внутреннего цикла (когда сравнивались элементы строки) происходила проверка на чётность строки и вызов кучи тех самых непонятных функций.
Эту программу препод принял без вопросов с оценкой «отлично». Слава тебе, Господи, что этот человек не стал нашим завкафедрой.
Два процента толка
Вы тут ругаете бухгалтеров, а на самом деле злейший враг программера — его же брат программист. За 25 лет программерской деятельности я сменил несколько фирм и много чего насмотрелся.
Для написания «перделки», которая на VB делается за полчаса, надо непременно использовать С++, желательно под линуксом — и наплевать, что пользователь сидит под виндой. Времени уйдёт несколько месяцев.
Если в проекте используется сторонняя библиотека, её надо объявить дерьмом и написать свою. Если в проекте встретилась слишком простая функция — её надо обязательно переписать на ассемблере.
Если поставлена задача написать виндовую программу, то надо обязательно писать кроссплатформанный проект, довести до половины, а потом потом бросить поддержку парочки платформ.
Если делать нечего и всё работает, надо объявить архитектуру устаревшей, придумать новую (упаси боже посмотреть при этом, как сделали другие) и переписать парочку подсистем, чтобы взвыли коллеги из соседних отделов.
Если можно прикрутить какой-то хак, специфичный для конкретного билда ОС или видеокарты, это сделать попросту обязательно.
Думаете, смешно? А я насмотрелся на поделки, где одновременно используется три самопальных класса для одних и тех же кнопок на тулбаре, три библиотеки для работы со строками и пять подпрограмм для умножения матриц — с ошибками, естественно. На программы, где на ассемблере с SSE переписаны функции копирования памяти, при этом один и тот же файл открывается и закрывается в цикле двадцать раз, чтобы прочесть первые три байта сигнатуры. На проги, где используются параллельно оконная библиотека MFC и своя, с ней несовместимая. Программы, у которых после наведения «архитектурной чистоты» начинались тормоза, а размер своп-файлов поднимался с единиц мегабайтов до терабайтов. Многопоточные программы, которые не в состоянии были загрузить процессор на 40%, потому что потоки дрались за критические секции...
КПД программерского коллектива — как у паровоза Черепановых: все пыхтят и создают работу друг для друга. Полезный выход — два процента.
Думаете, отчего я такой злой? Просто я всё это добро портирую с платформы на платформу, просматривая и исправляя чужой код по мегабайту в день.
Двое во флаконе, не считая юзера
Работаю сами-знаете-кем. Попал в руки интересный проект, а VS 2008, чтобы открыть его, под рукой не было. Дистрибутив нашёлся на флешке, после чего незамедлительно был скопирован на винчестер. В процессе установки в окне справа был обнаружен сборник лучших цитат Мелкософта. Одна из них касалась AJAX: «Лучшее взаимодействие между дизайнером и разработчиком». Да уж, учитывая, что большинство из нас — дизайнеры и кодеры в одном флаконе, мы должны требовать двойной оклад.