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

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

9374

Цена «вопроса»

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

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

Секция данных вместо того, чтобы записываться в PE-екзешник, где ей положено быть, наглухо затирала досовскую заглушку. Проблема была гадкая, появлялась по совершенно непонятным причинам: буквально лишний байт добавишь в данные — пропадает. Я уже старался не дышать на код. В конце концов сборщик вообще отказался кушать мои модули, мотивируя это так: «Fatal: General error in module ». А что за ошибка? Ни ответа, ни привета.

Очень скоро мне это надоело, и я перешёл на более современный и даже ещё живой сборщик от не менее известного производителя, продукты которого использовались для написания почти что всех программ незадолго до эпохи расцвета Win32. Он съедал объектные модули моей проги просто на ура. Но мысль о причине проблемы всё продолжала и продолжала меня беспокоить. Ведь это достаточно серьёзный баг, и если бы дело было именно в сборщике, наверное, кто-то давным-давно бы это заметил и написал в инете. Гуглю ошибку. И ничего — никто с подобным не сталкивался. А может, у меня версия сборщика какая-то корявая или битая? Да нет, перепробовал все возможные сборки пакета — везде версия одна и та же.

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

Ну ладно. Опять юзаю тот же метод, что и в прошлый раз: иду от обратного. Вот рядом в папке Examples лежит прога, которая прекрасно компилируется. Скармливаю главный объектный модуль моей программы и .obj этой проги TDump’у и снова начинаю играть в игру «найди 10 отличий». Поначалу разницы никакой не видно, но потом…

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

Я никогда не придавал этой фишке никакого значения. Напишу ли я «hInstance dd 0» или «dd ?» — какая разница? В конечном результате сборщик всё равно всё проинициализирует и поставит ноль. Или нет? В большинстве случаев всё именно так и было. Но я столкнулся с мелким, неприятным и противным багом в широко известном и протестированном сотнями людей продукте. Сборщик банально выпадал в осадок, если секция данных начиналась с неинициализированной переменной! Вот так просто: просто поменяй местами переменные или проинициализируй — и всё, нет бага.

Вот мне и вам урок: старайтесь писать ваши программы так, чтобы они были совместимы хотя бы между собой — чего уж говорить о совместимости с другими…

9347

Ва-банка

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

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

9346

Впадина Ихтиандра

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

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

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

Ноутбук. Первый, от двухбуквенной фирмы, начинавшей с газонокосилок, был излишне дырявым. Не выдержал брызг, разъело мать. Нынешний макбук — металлический, без дырок в днище и сверху, с тонкой накладкой на клаве — неуязвим.

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

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

Мелкие особенности:

— Из-за воды, которая подтачивает силы быстрее, часто хочется жрать. Это нужно предусмотреть.

— В конце всё же рекомендуется помыться мылом или гелем, потому что в тёплой воде потеешь и потом чешешься. В самой воде этого не чувствуется.

— Эффект эха в помещении из-за плитки на стенах чувствуется при разговоре по телефону, а плеск воды на заднем фоне озадачивает собеседников.

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

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

— Ноутбук должен быть расположен не ниже, чем на 10–15 см от воды (иначе волны захлёстывают), но не выше комфортного уровня для рук (или на широкой плоскости). Это дзен, которого нужно достигать технически. Иногда габариты ванны помогают этому, иногда мешают.

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

— Быстрее растут ногти и рукти. Скорость зависит от жёсткости воды.

9340

Против часовой стрелки и здравого смысла

Есть ощущение такое, что в коде студентов мне каждый год открываются таинства вселенной.

Вчера дописывали простой графический редактор. Даю задание облегчить интерфейс — ну, кто-то, естественно, начинает писать горячие клавиши. Стало интересно, на что у кого фантазии хватит. Попросил скинуть списки клавиш на локалку. Читаю — у всех один набор: Сtrl+S, Ctrl+Z, Ctrl+C, пару раз Ctrl+X. И вот оно, очередное откровение: Ctrl+(2x)C! Провтыкав полминуты, отрываюсь от стула и иду делиться вселенской мудростью с падаваном.

На ехидный вопрос, зачем ему, мол, два раза копировать, получил снисходительное объяснение, что никакое это не копирование, а поворот изображения. В связи с растущей высотой моих бровей было даровано и второе пояснение: С — clockwise, два раза С — counterclockwise!

Я настолько растерялся, что даже не понял, с какой стороны докопаться до этой логики, и пошёл пить чай.

9328

Поступь прогресса

О, прогресс-бары! Те самые полосочки из винды 3.1, которые в 95-й «мастдайке» стали жутко гламурными квадратиками.

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

С тех пор и далее решалось это именно так. Винда — вроде как многопоточная среда. Дык, пусть полезный вычислительный процесс работает с максимальным использованием ресурсов, а рядышком такой, как все настоящие программеры, жутко ленивый, но лицом к юзверю, будет изредка у главного процесса спрашивать: «Ну как ты там?»

Чуть позже додумался делать таймаут — иногда полезный процесс заканчивался значительно быстрее, чем прогресс-бар впервые отрисовывался, и чтобы не дожидаться последнего процесса, его просто запускал с некоторой задержкой. Именно тогда, можно сказать, на практике я ощутил рост вычислительной мощи железа: что раньше показывало прогресс-бар, то на более свежих машинках сразу же рапортовало: «Нажмите ОК».

Впервые этот способ я изобрел в восьмидесятых еще на ЕС-17хх, будучи школьником и только начиная программировать. Хоть и был метод затратен в плане объема кода (важный тогда параметр — оперативки на борту монстра, занимающего помещение в две моих нынешних квартиры, было 16 килобайт), зато мэтрам программирования того времени была продемонстрирована мощь поступи молодого советского поколения, красота на экране, как голливудских фильмах, и изумительная скорость.

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

9324

Окно для демонстрации синих занавесок

Сидим на работе. Коллега ковыряется с недавно поступившей тушкой, на которую, судя по отрывкам монолога, раскатывает из образа творение мелкомягких. Имитирует разработчиков:

— Чуваки, я тут программу написал, она на синем фоне белые буквы выводит.

И уже со злостью сам себе отвечает:

— А давайте, @#$, для этой программы операционку напишем…

Берегите нервы.

9323

Два объекта класса «Член»

Мне однажды снилось, будто я активно рефакторю… себя. Ход мысли был таким.

У меня есть части тела, доступ к которым происходит посредством свойств. У этих объектов есть методы… Так, стоп. У меня есть левая и правая нога. Они почти одинаковые. Так почему до сих пор разные реализации?! Надо срочно унифицировать!

9297

Технолог по биологическим отверстиям

Надоело, что все путают программистов и системных администраторов. Не всегда эти умения совмещаются в одном человеке. Из программиста в 90% никакой администратор и наоборот — области знаний разные и имеют огромное количество уникальной специфики.

С недавних пор объясняю так: «Разница между программистом и системным администратором — как между гинекологом и проктологом: оба лазают в дырки, но смысл в этом разный».

9289

Впереди паровоза

Писал как-то девочке контрольную на Паскале. В чём суть задачи, уже не помню, но там были преобразования строк в числа и обратно. Для удобства из-за нескольких обращений написал в коде программы две функции, работающие через стандартные Val и Str. И чёрт меня дёрнул обозвать их, как одноимённые в Delphi: IntToStr и StrToInt.

Девочка получила за работу четвёрку, хотя прога работала. Мотивация преподавательницы: «В Паскале функций IntToStr и StrToInt нету».

9281

Глобальнее некуда

Девушка пишет программу. Работать та определённо не хочет. Просит меня посмотреть, в чём дело. Вижу, что в функции, которая не работает, глобальная переменная описана ещё и локально.

— А зачем она у тебя тут еще раз описана?

— Ну… Для большей глобальности!