Истории с тегом: программизмы

Всего историй: 897

5073

Экономим нервы и такты

Вот все говорят: женская логика, женская логика... Мол, неописуемое и непонятное явление. А если проявить сообразительность? Да ещё не простую, а нашу, айтишную? Поясню на примере.

Давеча договариваюсь по аське со знакомой о встрече.

— Как сделаем: я тебе позвоню или буду ждать от тебя эсемеску?

— Да, так сделаем.

Казалось бы, вот он, яркий пример этой самой женской логики. Вот какой вариант она имела ввиду? Я спросил — оказалось, тот, в котором я ей позвоню.

Теперь берём учебник по С++. В разделе «Логические операции» читаем:

Логические операции сокращённого вычисления:

— сокращённая конъюнкция (conditional-AND) &&;

— сокращённая дизъюнкция (conditional-OR) ||.

Правый операнд сокращённых операций вычисляется только в том случае, если от него зависит результат операции: если левый операнд конъюнкции имеет значение true или левый операнд дизъюнкции имеет значение false.

Рассуждаем. В описанном выше примере имеем операцию дизъюнкции, которая должна обязательно вернуть true (так как один из предложенных вариантов должен быть выбран). Ответ знакомой — это передаваемое значение операнда. Читаются выражения слева направо — значит, значение присваивается левому операнду. А если левый операнд дизъюнкции равен true, правый уже не рассматривается, что придаёт ответу однозначность.

Логично? Логично. Ничуть не сложнее, чем в компьютере. Так-то! Читайте мануалы, товарищи.

5060

Всё, что движется

Как-то наши программисты писали игру с живым миром. Встречаются два тушкана разного пола, хоп! — и рядом появляется маленький тушкан. В первых версиях тушканы, встретившись, плодились неконтролируемо, поэтому программеры немного переписали код и сделали так, чтобы после любви тушканы драпали в разные стороны.

При тестовом прогоне мира всплыла такая картина. Высокий утёс, на утёсе два тушкана. Встретились, полюбились — и прыг с утёса в разные стороны. Ну, в лепёшку, конечно. Тоже не дело: а вдруг дети малые увидят? Внесли ещё правку, запретив тушканам прыгать с большой высоты.

Очередной тестовый прогон. Летит гриф, на нём сидит тушкан, и они размножаются. Тушкан-то спрыгнуть не может, а, как выяснилось, ему что гриф, что тушканиха — всё едино...

5039

Код-самоед

Ведём разработку на ПЛИС известной компании. С появлением встраиваемых процессоров возможности построения цифровых систем стали практически безграничными. Работа сложная и интересная. Приходится совмещать изменения железа и софта: переконфигурировал процессор или шину памяти — переписывай программу. А уж насколько богатые возможности для глюков, когда не поймёшь, где проблема...

Из последнего: обратили внимание на неполадки с памятью в стандартной конфигурации. Запустили тест памяти — всё зависло. Посмотрели размер адресного пространства: 64 МБ, а на плате физически присутствуют только 32. Тут у нас возникли некоторые подозрения. Оказалось, что в примере от производителя, кроме неверного размера памяти, ещё и банки памяти адресованы вперемешку. Выходит, что тест памяти стирает из неё сам себя, и процессор исполняет какие-то случайные инструкции. Интересно, что будут писать о глюках через десять лет, если подобная технология станет повсеместной?

5037

Извилистые дорожки и стройные ножки

Благополучно отучился на отделении информатики физфака. Был и курс «Введение в системы автоматического проектирования радиоэлектронных устройств» (разводка печатных плат, проще говоря), и с микросхемами элементарной логики мы знакомились как в теории, так и на лабораторных. В дипломной работе я использовал микроконтроллер, то есть был не понаслышке знаком с тем, что можно получить, накодив на C несколько сотен строк. Одногруппник, которому больше нравилось высокоуровневое программирование, взял меня в напарники для разработки светоматрицы — платки 8×12 светодиодов, которая должна была управляться с компьютера. Ни у него, ни у меня не было абсолютно никакого опыта, не считая вышеописанного обучения в университете, поэтому неудивительно, что даже с чисто организаторской стороны было много факапов. Однако я хочу рассказать о моих программно-железячных косяках. Мало ли, вдруг кому пригодится.

Free Serial Port Monitor — хорошая программа. Но показывает она не то, что пришло в буфер COM-порта, а то, что прочитала использующая его программа. Поэтому надо было не покупать новую микросхему MAX232, решив, что предыдущая сгорела, а просто добавить в отладочную программу чтение.

Altium Designer — тоже хорошая программа. Только вот все библиотеки в ней созданы в расчёте на английскую систему мер. Если вы используете десять деталей из стандартной библиотеки и одну свою, подумайте о том, обязательно ли делать её в СИ. На чертеже очень трудно заметить, что четыре проводка к пятивыводному разъёму подцепились, а один остался в полупикселе от положенного места. В итоге на плате не оказалось одной дорожки. Хорошо, что использовалась она только для программирования! Спасла конструкция «проволока, с одной стороны прикрученная к штырьку для программирования, иголка и рука, тыкающая в малюсенькую ножку микросхемы».

От аппаратных глюков никто не застрахован, даже если микросхемы покупались у поставщика, работающего напрямую с производителем. Прежде чем десятый раз просматривать собственный код, который идеален, пишите тестовые программы. В моём случае проблема была в том, что при замыкании одной из ножек на землю микроконтроллер начинал слать в USART мусор (точнее, циклический мусор: каждые три байта всё повторялось, но от этого не легче). Хорошо, были свободные ножки, так что ситуацию спасло припаивание проводка, разрезание дорожки и исправление программы.

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

А ещё источник постоянного тока (5 В, 12 А) не любит, когда от него требуют то 0 А, то 2 А (не говоря уж обо всех двенадцати) с частотой всего полкилогерца, да ещё не по синусоиде, а ступеньками. Нет, сам источник не сгорел. Но вот напряжение от таких скачков чувствовало себя нестабильно, а вместе с ним и блютус-модуль, в результате чего связь с компьютером терялась. Эта проблема оказалась самой лёгкой: я впаял перед модулем диод, чтобы заряд обратно не утекал, а падение напряжение на полвольта скомпенсировал уменьшением токоограничительного сопротивления, и всё заработало. Интересно, что микроконтроллерам ATmega16 скачки были нипочём, хотя по документации они должны были отключаться раньше модуля.

Это, конечно, далеко не все трудности, с которыми пришлось столкнуться (или придётся: работа ещё не совсем закончена). Надеюсь, своим рассказом я уберегу какого-нибудь начинающего разработчика от нескольких дней битья головой о стену.

4980

Археологические раскопки в Древней Индии

Итак, все ругают плохо написанный код. Давайте-ка посмотрим...

Если в коде много goto, возможно, программу перетащили с Фортрана; чем их больше, тем древнее версия.

Если в названиях идентификаторов присутствуют дикие сочетания букв, разбавленные подчёркиванием, возможно, исходно это был Фортран БЭСМ-6, где позволялись русские буквы.

Если все переменные в программе глобальные — скорее всего, программа «познакомилась» с третьей версией микрософтовского Фортрана, где надо было распихать переменные по 64-килобайтным common-блокам.

Если сишный код плохо отформатирован, скорее всего, код был знаком как с Борландом (три пробела на отступ), так и с Микрософтом (одна табуляция).

Если в коде на С++ много указателей на функции, значит, изначально код был сишным.

Если системные вызовы завёрнуты во множество вложенных «обёрток», которые просто перекладывают параметры из пустого в порожнее и ничего не делают, это годовые кольца: их столько, сколько платформ сменил продукт.

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

Если всё сказанное выше замешано в крутой коктейль с кусками вменяемого кода, значит, пытались рефакторить.

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

Если встречается эмуляция RTTI и интерпретируемого кода, в предках кода было что-то типа Клиппера.

Ну и, естественно, в коде присутствуют следы идеологической борьбы между разными фракциями программистов и архитекторов, следы модных некогда концепций из Прологa и Смоллтока, попытки имитировать одну платформу на другой...

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

4973

Высшая школа неучей

О балбесничестве в рядах студентов я был наслышан, но такого я не ожидал. Итак, студенты, страждующие помощи, делятся на две группы.

Первые являются непробиваемыми танками. Выдвигают тезис работы без более-менее подробного описания задания. На просьбы уточнить задание повторяют то же самое, но другими словами — это может продолжаться довольно долго. Примерно понимаешь, что ему нужно, объясняешь, как написать заданную прогу, но тут же сталкиваешься со стеной непонимания: «А мы такого не проходили». Ладно, Ктулху с тобой, пишешь код с краткими комментариями для этого балбеса, но тот опять ничего не понимает! Несколько минут исступлённо бьёшься головой об стену, пишешь полные, разжёванные до мельчайших подробностей комментарии. Это чудо сдаёт работу, получает оценку. Всё, я помог человеку!

Вторые воспринимают помощь как должное. Обычно пишут: «Очень срочно!!!» и «HELP» (всё это с кучей смайлов и восклицательных знаков). Вот этим объяснения не нужны: просто не поймут. Пишешь код, они его удачно копипастят и на «отлично» сдают работу. От таких даже «спасибо» не дождёшься.

Как часто бесит это недопонимание и расхлябанность! Ты попросил помощи, и я, рассчитывая на то, что страждущий — подготовленный человек, объясняю проблему... по сто раз. И не стыдно вам, товарищи студенты из крупных городов с хорошо развитой структурой образования, что материал вам втолковывает пятнадцатилетний мальчишка из маленького дальневосточного городка? Вы же будущие программисты! Научитесь отличать FASM от TASM, научитесь более-менее грамотно писать на C++, а то ваши посты «Где ошибка (прога выдаёт неправильный результат)?» смотрятся очень глупо: в них код, который в принципе не смог бы скомпилироваться.

4941

Желаете заложить фамильный замок?

Сидим с девушкой, пишем ей программу по учёбе — карточную игру. Пользователь имеет некоторый начальный бюджет, делает ставку, если угадывает карту — получает выигрыш.

Тестовый прогон. Ставим все деньги и успешно их проигрываем. Программа участливо спрашивает: «Желаете сыграть ещё?» В непонятках нажимаем «Да». Следующее сообщение заставило нас искренне забиться в истерике: «Удачи!»

Я ярко представил, как бы это выглядело в реальном казино. Проигравшему только что все деньги джентльмену крупье вежливо предлагает: «Не желаете ли сыграть ещё?» — и после утвердительного ответа выталкивает мужичка из-за стола со словами: «А вот фиг вам!»

Конечно, ошибка была элементарной: проверку на нулевой баланс разместили не в том месте.

4939

Индус: пробная версия

Разбираем исходники программной системы для делопроизводства: надо перевести на русский и подправить кое-где логику под местные реалии. Не будем удаляться в частности, но код натурально индийский.

Разбирали — ругались, тем более что поддержка от разработчиков по емейлу была отвратительной. Немного зауважали авторов после того, как обнаружили, что они всё-таки способны к самокритике. Один из методов, посвящённый промышленному дизайну, был назван «Indus_Design».

4933

Все умны как на подбор

Лет эдак шесть назад попросил меня друг заскочить «по компьютерному делу». Итак, ситуация: завтра у знакомой зачёт в вузе по какому-то зубодробительному предмету. Зачёт сдаётся на программе-тестере. После прохождения теста вылазит окошко: «Правильных ответов: xx%». Программу девушка умудрилась спереть. Сдать «легально» шансов почти нет. Времени три часа.

Идея первая: а как хранятся вопросы? А хранятся они в зашифрованной БД. Вскрыть такое на тот момент возможности у меня не было, равно как и знаний.

Идея вторая: перебор ответов. Не проканывает: в базе вопросов явно больше тех пятнадцати, которые задаются на зачёте, и нету никаких промежуточных результатов на экране.

Идея третья: скриптик для подмены значения в окне. Не помню, почему не взлетело.

Начинаю копаться во всех внутренностях, которые вижу. Так, что у нас тут? Инишник, в который зачем-то выведены значения всех текстовых полей. Зачем, не пойму: локализовывать они, что ли, это убожество собирались? Неважно, ведь в файлике нашлась и та самая строка: «Правильных ответов:». Не помню я, на чём была писана та программа, но тот гениальный язык автоматически подгонял размер лейбла под текст. Немного везения с z-order — и на зачёт девушка пошла с диверсионной дискетой в сумочке.

Как вы уже догадались, строка «Правильных ответов: 75%» аккуратно перекрывала настоящее значение. После девушки зачёт на той машине успело «сдать» ещё два человека; потом зачёт прекратили, и консилиум сел разбираться, в чём дело. Думаю, разбирались долго, но зачёт уже стоял.

4930

Остановите у переезда

Краткое техзадание: на рельсах стоит тележка. Мотор тележки понимает только три команды: «вперёд», «назад» и «стоп». Мотор включается, если в серийном порту есть сигнал, и работает, пока сигнал не пропадёт. Тележка очень тяжёлая, и мотор, который её двигает, разгоняется и останавливается с ощутимой задержкой: процесс разгона-торможения может занимать до десяти секунд. При этом скорость движения тележки в разных местах пути разная: и окалина может быть на рельсах, и масло разлитое, и кирпич бесхозный. Заказчик хочет, чтобы компьютер сам мог поставить тележку в нужном месте.

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

Подходит дедлайн, и недовольное начальство вламывается в комнату разработчиков: «В чём задержка? Уволю!» Программер чуть ли не в слезах жалуется, что не получается гарантировать точную установку тележки.

— Вот за два дёрга туда-сюда позиция X плюс-минус пять сантиметров есть всегда, а точно X получается, только если повезёт, или после десятка включений мотора.

— Ты, балбес, в техзадание заглядывал? Оно и видно, что только заглядывал. Ты где там видел запрос на точность в ноль сантиметров? Это ж транспортники, они же «тележкой» тепловоз называют. Чтобы подать хоппер под погрузку, точность нужна всего до метра!