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

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

3190

Студент спит — скрипт идёт

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

Снится мне квадратная матрица для светодиодов 16 на 16 ячеек какого-то непонятного серо-графитного цвета. При подходе к последней ячейке (i, j) матрица разрастается в стороны и увеличивается в замкнутом цикле. «А ведь хорошо, — думаю, — что i++; j++; не забыл вписать — так ведь и поспать можно, пока матрица считается. А считаться она будет долго...»

С мыслью о бесконечности внезапное переполнение стека меня разбудило. Начинались следующие сутки.

3187

Если вдуматься, ноль нам совсем не нужен

Я студент, на полставки работаю на кафедре начертательной геометрии. По заданию начальника разрабатываем систему автоматического тестирования на AutoLISP. Вкратце: скрипт вычерчивает условие нужной задачи, после чего студент решает её с помощью урезанных до минимума инструментов Автокада и жмёт кнопку «Проверить». Программа смотрит, где и что начерчено, и даёт за каждый элемент баллы, которые потом суммируются в оценку.

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

(SETQ

PROEB NIL

PROEBAL NIL

PROEBAN NIL

PROEBEM NIL

...

Ну и как объяснить хихикающим казахам и багровому от стыда начальнику, что функция проверки начинается с обнуления баллов за линии проекционной связи для точки B и связанных с ней отрезков AL, AN, EM?

Вам смешно, а меня премии лишили.

3173

Небольшими порциями

Работала давным-давно в отделе автоматизации девочка-программист — ваяла на FoxPro программки по обработке данных. Однажды увидел я кусочек кода, призванного убрать в каждой записи базы данных лишние пробелы слева от фамилии. Код выглядел примерно так:

scan 'цикл по базе

if(at(a.fieldname,” ”)) 'если в первой позиции пробел,

replace a.fieldname with substr(a.fieldname, 2) 'то исключаем первый символ

endif

endscan

Код убирал в каждой записи один пробел слева. «А что, если слева будет 17 пробелов?» — спрашиваю. Девочка потупила взор и поняла, что придётся запускать программу 17 раз.

Каково же было её удивление, когда я показал ей свой код, вернее, одну команду, которая может убрать хоть 17, хоть 30 пробелов и слева, и справа:

replace all a.fieldname with alltrim(a.fieldname)

3172

На полуслове

Я студент четвёртого курса, по совместительству .NET-программист. Вечер. Набираю в Ворде аннотацию к завтрашней паре по английскому. Ввожу начало очередного слова и замираю в ожидании IntelliSense.

Жаль, что Ворд им ещё не оснастили — полезная была бы фича!

3167

Наполовину пустой, наполовину полный

Код оптимиста:

if (<условие1> && <условие2> && <условие3>) return true

return false

Код пессимиста:

if (!<условие1> || !<условие2> || !<условие3>) return false

return true

Код реалиста:

return (<условие1> && <условие2> && <условие3>)

3166

Конь и кот

Сдавали в институте на первом курсе лабораторку на Паскале. Лабораторка была посвящена обработке текстов — мелочей не помню, но сперва нужно было объединить два текстовых файла. Для этого мы использовали оператор сложения, благо Паскаль это позволял.

Преподаватель всматривается в код, а потом спрашивает, почему мы сложили строки, а не использовали специальную функцию. Мы объясняем, что и так можно, на что препод отвечает, что если мы потом где-нибудь встретим функцию, то ни за что не догадаемся, что она делает. «Наверняка, — говорю, — название у функции будет „говорящим“, поэтому мы догадаемся». Преподаватель, торжествующе: «Ага, а функция называется CONCAT()! И что же она вам говорит?»

3160

Не грози грозе, попивая кофе у себя в офисе

Все началось с того, что в нашем офисе очень редко открываются окна. Цитирую переписку работников офиса.

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

Стоит задуматься...

— Проверяется на раз. Если верно — то достаточно закрыть окно, и гроза прекратится.

— Э-э-э, только при условии обратимости реакции.

— Тогда каждое новое открытие окна должно усиливать грозу. Проверяется тоже на раз.

— Откуда такие выводы? Была посылка «открытие окна — начало грозы».

— Открой десять раз — десять гроз поставишь в очередь.

— Возникает вопрос о возможности переполнения буфера гроз и досрочном DoS-апокалипсисе.

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

— При условии, что окна тождественны. К тому же разные начальные условия, так что пока нерепрезентативно.

3152

Через года слышу разума голос

Классе в восьмом от нечего делать решил на Бейсике запрограммировать шарик, бесконечно долго летающий от одного конца экрана до другого. Написал код, запустил — шарик долетает до конца экрана, и программа падает. Пересмотрел код, отредактировал, запускаю — та же ерунда. Бился я над проблемой долго, но так и не решил.

Школа кончилась, кончился и институт. И вот однажды ночью я, 26-летний сотрудник банка, проснулся от того, что понял, где была ошибка! Конечно: в функции for i... в случае отскока шарика от границы экрана (то есть при движении от большего значения к меньшему) шаг должен быть со знаком «минус». Но момент, как говорится, уже упущен...

3151

Абстрактная выделка овчинок

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

Я ждал чуть не полгода, и наконец под гром фанфар получил DLL с тремя десятками методов с непонятными названиями и параметрами, возвращающую не ожидаемый BMP, а потоки, хендлы и ещё черт знает что. При попытке объединить это творение и мой интерфейс ничего не получилось. Я просто замучился разбираться, а тот парень вообще не понял, что я написал (хотя я дал открытый код с комментами). В результате я переписал всё в Студии, и прога заработала. «Абстракционист» три часа доказывал, что его эффект работает значительно быстрее. И правда: 380 миллисекунд против моих 423 на картинке размером 1800×1600...

3118

Возвращение к истокам

Есть у нас здоровенный программный комплекс, обслуживающий научное оборудование. Оборудование весьма занимательное (на то и научное), поэтому и комплекс должен быть гибким: служит он такой куче исследований, что и сам не знаешь, на что именно натравишь этого монстра завтра.

Писался этот комплекс в три попытки. Первая представляла собой просто одиночную программу, которая перебиралась и перекомпилировалась, обрастая форками, ключами запуска и дефайнами до полной нередактибельности. Весь отдел ПО, вооружившись последними достижениями от MS, полгода ваял на Visual C++ замену. Итог: весь рабочий код уже обкатан на старой версии, язык C++, среда визуальная типа «интерфейс за один клик». Замена получилась модульная, и хотя перестыковка модулей осуществлялась с определённым сексом, приняли её на «ура».

Грянул кризис, утекли мозги, да и модульная софтина обросла костылями из-за трудностей с перестыковкой модулей. Свершилась третья попытка: руководство дало новым мозгам задание переписать всё заново, а для сокращения времени задействовали наимоднейшую концепцию «программирование без программирования» (UML и иже с ним: даёшь машине формулу, она в ответ — готовую программу). В этот раз в полгода уложиться явно не получилось: достижение стадии «самое начало комплекса уже иногда почти работает» вызвало всеобщий экстаз. Это, конечно, хорошо, но работать-то как?

Комплекс с сохранением модульности (только теперь модули перегруппировываются за секунду без всяких хитрых тайных знаний) я переписал в одно рыло (даже скорее в полрыла) вечерами за три месяца. Пользовался Open Watcom — дикой древней средой, в которой мышкой рисуются только диалоги. Си, «плюсы» в следовых количествах. Код полон if ((wParam&0xFFFF)==RUN_SERVO) SendCommand (MOTOR, 1); — кто знает WinAPI, тот поймёт, что такое ручная обработка оконных событий и какая это куча писанины. В теле сплошная работа непосредственно с указателями, проскакивают следы ассемблерных вставок. И почему же эта писанина совершенно не помешала мне работать в разы быстрее, чем все предшественники? Я вижу только две причины:

1) Работа программиста отнюдь не в наборе текста. Программист всё-таки не машинистка, скорость его работы не от количества знаков в минуту зависит.

2) Современные среды служат не для ускорения работы, а для снижения порога вхождения. Абстракция, оборачивающаяся во всё более и более толстую луковицу, нужна больше для сбора ста индусов в один хайвмайнд без их рассинхронизации (и вообще для того, чтобы индусы могли хоть как-то принять участие), а квалифицированному программисту, один раз изучившему системные «кирпичики», на которых держатся все разновидности таких сред, она производительность труда только снижает.

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