На днях принимал на работу креативщика. Проверяю тестовое задание. Весь код выполнен в стиле:
char t = malloc(SIZE);
if (t == NULL)
return 0xFFFUUU;
if (...)
return !(PALM += 0xFACE);
Парня приняли, но с наказом больше так не шутить.
Всего историй: 896
На днях принимал на работу креативщика. Проверяю тестовое задание. Весь код выполнен в стиле:
char t = malloc(SIZE);
if (t == NULL)
return 0xFFFUUU;
if (...)
return !(PALM += 0xFACE);
Парня приняли, но с наказом больше так не шутить.
Администрируйте Sharepoint. Вам никогда не будет скучно, и каждый день вы будете узнавать что-то новое. Вы познаете дао гугления и научитесь читать мануалы и форумы на таких языках, о существовании которых ранее и не подозревали. Вы узнаете о новых видах логики, начнёте в них разбираться и строить выводы на их основе. После того, как вы настроите Service Level Dashboard, установка Gentoo покажется вам плёвым делом, а после того, как напишете веб-часть, любая открытая CMS, даже если она создана в качестве курсовой работы студентом-индусом, покажется вам верхом логичного и структурированного программирования.
Вы не застали Советский Союз? Вам не хватает бюрократии? Общайтесь с программистами 1С! Ознакомившись со списком требований к изменению одного параметра в одном скрипте, вы поймёте, что Sharepoint — самая логичная система в мире, а серверная группа — самая лёгкая на подъём. Вы думаете, что вам тяжело живётся, приходится много работать, от вас слишком многого хотят и нечётко формулируют требования? Поговорите со специалистами по 1С, и вы поймёте, что хуже всего им, а вы — зажравшийся буржуй, не подвластный дрессировке, заставляющий их страдать!
Место действия — провинциальный, но в целом довольно неплохой вуз. Время действия — около пяти лет назад. Основное действующее лицо: экстравагантный, очень бородатый, худощавый и малолюбимый преподаватель с весьма компьютерной фамилией Мышев. Студенты боялись его как огня, так как на лекциях и семинарах он любил сыпать всяческими терминами вроде «когнитивный» и «вербально-логический», объясняя вроде бы вполне понятную и интересную теорию кодирования информации. Но это всё было ерундой по сравнению с его лабораторными работами.
* * *
Задал он лабораторку: напиши, говорит, архиватор, чтобы мы файл зажали ARJ, RAR и твоим архиватором, и твой оказался бы в полтора раза меньше. Мы, конечно, прошли Хаффмана к тому времени, но чтобы так с разбегу коммерческие решения переплюнуть... Я припух, но апеллировать к здравому смыслу было бесполезно.
Выкрутились! «Архиватор» создавал «архив» весом примерно в 10% от исходного файла и закидывал всё на сетевой диск — с глаз подальше. При «разархивации» исходник тупо возвращался на место, если «архив» не модифицировался. На приёме препод-садист искорёжил «архив» и был доволен сообщением «archive corrupt».
* * *
Задал Мышев моим одногрупникам лабораторку: распознавание текста из графических файлов. Есть кусок отсканированной газеты. Показываем её на экране, пользователь выделяет прямоугольную область и должен получить текст из символов, которые в этот прямоугольник попали.
За ящичком пива собрались и придумали обходной манёвр. Хоть картинка и большая, но вряд ли у препода ещё такие есть. В общем, долгими мучениями составили они список с координатами прямоугольников, в которые попадает каждый символ на газете этой. Когда пользователь выделяет область, нехитрым вычислением отбираются те символы, которые должны в эту область попасть, и выдаются на выход.
Отладились хорошо. Пошли сдавать — засыпались! Этот гад сначала поигрался: то так выделит, то так — всё распознаётся, даже временная задержка зависит от размеров области. А потом взял он и картинку с газетой в Пейнте измалевал до неузнаваемости. Программа, конечно, и такую картинку «распознала»...
* * *
Последнюю историю рассказали мне сокурсники. Постановка задачи: препод в микрофон говорит что-то типа «два плюс два», программа должна распознать, сосчитать и вывести на экран ответ.
Народ сделал так: программа пишет бред с микрофона в wav-файл, шлёт его по сети в общагу, где на «серверной стороне» сидит человек, который файл этот слушает и ответ пишет, а иногда для правдоподобности ошибку распознавания шлёт.
Показали — Мышев в экстазе! Бегает, бородой трясёт, ребят на конференции и симпозиумы зовёт. Так разволновался, что уже к своей докторской это дело присовокупить хотел... Ну, народ не сдержался и от хохота в коридор повалил. Когда препод всё понял, зачёт не поставил никому.
Играю в браузерную игрушку: пятые «Герои», только онлайн. Те же расы, прокачка, магия, артефакты, дуэли, групповые бои, убийство толп монстров, — короче, жутко нравится. Деньги зарабатываются так: вводишь код, через час получаешь наличность и возможность ввести код опять. 500 монет в час — заработок небольшой, но стабильный. Что ещё надо герою на достройку замка? Ещё можно купить ресурсов и с прибылью в 4 монетки продавать на предприятия по производству артефактов. От Москвы, где стоит сервер, я далеко, и продать ресурсы можно только ночью, иначе живущие в ста метрах от дата-центра на стомегабитной выделенке продадут быстрее. Короче, только геморрой наживать.
Пару месяцев назад админы срезали количество денег с ввода кодов на 40%. Дескать, хотите играть часто и интересно — закиньте настоящих денег. Я студент, денег на сытный обед не каждый день хватает, не то что на игрушку. Погоревал я три дня. Как жить дальше? Денег нет, но ведь есть мозг! Полез изучать JavaScript.
Первый бот, которого я писал два дня из-за незнания синтаксиса, состоял из трёх строчек: проверял наличие формы продажи, вводил данные, отправлял форму и обновлял страницу через полсекунды. Через две недели мой бот проверял баланс на предприятии; наличие свободных мест; время до конца смены; вычислял, сколько времени выжидать до обновления страницы с учётом средней активности игроков на предприятиях; скупал нужные ресурсы и много-много чего ещё, — короче, вовсю эмулировал присутствие человека за компом.
Теперь я знаю JavaScript, пишу для знакомых ботов для голосования и прочие мелкие браузерные удобства. Кто-то тут ещё не верит, что игры развивают?
Если бы наш гендир был Лоренцо Медичи, а наш отдел программирования — Микеланджело с соучениками, заказ на роспись Сикстинской капеллы выглядел бы так.
— Сделайте мне на халяву роспись здесь вот, синенькую и зелёненькую, причём к воскресенью, и предоставьте мне отчёт со статистикой работы. В статистике отразите количество фигур на каждой стене: мужчин, женщин и детей-ангелов, а также святых в алфавитном порядке по рангам. Запросите у местного священника количество посетивших работы по должностям, рангам, сословиям и профессиям.
— Там краски нужны специфические...
— Возьмёте у маляров, они дешевле. В пятницу проверю!
Как-то давно набрёл в сети на довольно интересный инструмент под названием AutoIT: язык программирования, что-то типа VBS, только проще, заточенный на автоматизацию мышиных и клавиатурных нажатий. Написав пару инсталляторов, я решил поприкалываться и написать пару программок-шуток, например, «кукушку», которая каждый час отбивает склянки, открывая и закрывая CD-ROM и воспроизводя птичий крик. Поприкалывался, подсовывая эти програмки на компы коллег, посмеялся и забыл. С тех пор скрипты на Автоите завсегда стояли у нас на боевом дежурстве: если пользователь обращался с тривиальной проблемой, решаемой в пару кликов, ему просто говорили, какой скрипт запустить, чтобы всё работало нормально. И вот однажды звонок:
— У меня принтер не печатает.
После нескольких вопросов становится ясно, что стоит галочка «Приостановить печать». Нахожу скрипт для устранения этой проблемы, даю пользователю ссылку с рекомендацией запустить и после сообщения программы об успешном устранении неполадки снова отправить документ на печать. Через десять минут звонок:
— Не работает ваша программа. Никакого сообщения она не выдала, и вообще компьютер теперь себя странно ведёт.
Не веря своим ушам (ведь программа была протестирована и отлажена на множестве машин), отправился к пользователю.
— Смотрите, что он мне выдаёт.
Смотрю и непроизвольно начинаю смеяться. После отправки документа на печать вижу сообщение якобы от операционной системы: «Извините, принтер не готов. У вас есть карандаш?» Оказывается, я перепутал скрипты и дал пользователю один из своих приколов. С тех пор все шутки я храню отдельно.
По работе часто приходится анализировать BSoD-дампы. В процессе поиска причин для одного такого дампа я наткнулся на форумную ветку, где новичок вывесил сделанный на скорую руку анализ дампа в WinDbg и спрашивал мнения экспертов: дескать, что можно сказать о причине падения его системы на основе этого анализа?
Намётанный глаз сразу выхватил из текста анализа «CRITICAL_OBJECT_TERMINATION» (причину падения), «MODULE_NAME: smss» (тот самый critical object, что и вызвал BSoD) и «PROCESS_NAME: Clicker.exe» (кто этот самый объект прихлопнул). Уже хотел закрыть вкладку, так как этот случай меня не интересовал, но решил пролистать ответы:
Эксперт: «PROCESS_NAME: Clicker.exe». Что за кликер?
Новичок: Моя программа.
Эксперт: Ещё подсказки нужны?
Только что помогал какому-то (или каким-то?) индусам на cplusplus.com. Эти удивительные «программисты» решили написать 3D-игруху на «плюсах», только начиная осваивать их. Но дело не в этом. Они упорно спрашивали, «как сделать GUI», а на мой вопрос, какой: виндоусный (а вдруг настройщик, снаружи валяющийся) или игровой, они лишь дали ссылку: «Как в этой игре». Мой вопрос про движок был проигнорирован — видимо, у них сейчас важное заседание на тему этого движка. Сначала мне хотелось смеяться, потом плакать. Жду не дождусь их нового сообщения.
Во времена моего программерского расцвета, в первой половине девяностых, из всех вменяемых междумордных библиотек (для DOS/Windows) существовало всего две: трубо-вижн-борландюшатник и Цинк. Были и ещё какие-то: либо со строго закрытым коммерческим API, доступным только за очень отдельные деньги, либо откровенно лажающие на самых примитивных контролах. В общем, всего две. И ни одна из них не прикручивалась к Clipper 5.x напрямую — всё равно надо было кодить пакет-посредник, что вдвое снижало время отклика.
В общем, мы с коллегой решили: нужен набор интерфейсных примитивов, написанный на самóм Клиппере (и примкнувшем к нему ассемблере). Благо 5.2+ уже в полной мере был вменяемым объектным языком, и всего лишь нужно было заэксплуатировать недокументированное. Сели, обдумали концепт, за пару недель создали ТЗ, ещё через пару месяцев на свет появилась библиотека (статическая, само собой: дело-то под «доской» происходило), которая из текстового описания динамически порождала экранные формы с полнофункциональными контролами. Это вам не из бинарных .FRM вынимать поток — это реальный конструктор форм. Вплоть до того, что сами описания форм можно было хранить в таблице БД и при необходимости править при помощи банального memoedit'а... Да-да, и мета-язык тоже был! Это оно сейчас, когда визуальноe программирование стало нормой, кажется смешным. У нас на тот момент выбор был небогатый.
В середине девяностых на моём домашнем компе умер винч. Умер зонами, в одну из которых попали исходники этой самой библиотеки. Причём и сама бибилиотека, и .OBJ для неё выжили. Пока ещё был некий коммерческий спрос на DOS-программы, эта либа честно поучаствовала в нескольких вполне продаваемых проектах. При этом переписать её не было никакой физической возможности: исходники вымерли вместе с винчестером, а Клиппер-декомпилятор смог возродить менее трети текстов. Остальное не воспроизводилось, так как опиралось на вскрытые, но таки недокументированные особенности языка.
Так к чему я это всё? Ах, да... Среди модальных диалогов был и прогресс-бар. Который, само собой, нельзя было перерисовывать при каждой итерации: обрабатываемые таблицы вполне могли содержать миллионы записей, а рантайм Клиппера — это интерпретатор прекомпилированных байт-кодов (Явы тогда ещё и в проекте не существовало). То есть, это сразу стало ясно, нужен вменяемый пересчёт отношения «current/total» в размер окна с прогресс-баром, то есть нормализация на единице квантования бара. Было немножко арифметики вне цикла, после чего внутри цикла отрабатывались только пороговые значения, которые продвигали бар на полоску вперёд. Правда, именно на Клиппере это решалось чуть проще: часть арифметики делал рантайм, подсаженный на коллбек (и это под ДОСом).
Короче говоря, я до сих пор встречаю два вида прогресс-баров: первый, жутко тормозной, и второй, чётко и шустро отщёлкивающий прогресс — сделанный по тем же принципам, что и у меня, с учётом размера кванта. Второе решение более затратно по серому веществу (ровно на знание арифметики), первое — наповерхностно-очевидно и, следовательно, неверно. Привет коллегам-программерам из девяностых!
Лет пять-шесть назад рассказывал я студентам об итеративных алгоритмах и о принципе 20/80. В качестве иллюстрации и отвлечения для припомнил одну историю, приключившуюся со знакомым в конце 90-х. Его попросили посмотреть, почему счётная программа работает в разы медленнее, чем должна. Затык оказался в том, что прогресс-бар состояния расчёта обновлялся после каждой итерации. В итоге время обновления прогресс-бара со всеми сопутствующими операциями и перерисовкой окна было сопоставимо со временем расчёта одной итерации. Программист этого просто не заметил — для него во время отладки, на малых размерах задачи и паре десятков итераций, разница в десяток секунд никакой роли не играла. Всё «исправление» свелось к вызову злополучной процедуры ввода-вывода каждую сотую итерацию.
И что же вынесли из лекции студенты? Несколько человек из других групп потом подходили и спрашивали, правда ли я читал лекцию о том, что графический интерфейс тормозит программы, и его нельзя использовать ни при каких условиях.