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

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

8308

Большими надеждами и малой кровью

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

Трудятся лучшие умы над правильной базой месяц, второй; начальство всё негодует, что же так долго. И вот настаёт светлый день презентации руководству отдела этого чуда рукотворного. Через проектор на лист А1 (экран у нас, увы, появился чуть позже) выводят красивую схему объектно-ориентированной базы, в которую при желании можно запихать что угодно. Далее — минут на сорок рассказов с горящими глазами, что, для чего и почему, собственно, так долго. Начальство смотрит, слушает и выдаёт замечательную фразу, над которой мы потом несколько дней посмеивались: «А зачем вам эти кучи таблиц и связей? Хватило бы двух таблиц. В первой — ФИО и телефон, а во второй — отдел/бюро/группа. А вы тут накрутили». Посмеялись и забыли.

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

Надоело админу, и создал он две таблички: в первой — ФИО и телефон, а во второй — отдел/бюро/группа. Связал их по кодам, загрузил данные и велел пользоваться. И вот не знаем теперь: то ли начальство было право, что хватит двух табличек (а их с трудом, но хватает), то ли неправо, что такую разработку нескольких бюро так просто из-за своего непонимания и незнания загубило.

8299

Хоп-бот, или Туда = обратно

Писал я как-то для мобилок deathmatch в 2D. Однажды замечаю: у ботов фраги идут в минус. Сила оружия такова, что убиться, в принципе, можно, но крайне трудно. В чём дело? Отключаю технический интеллект, чтобы больше не стреляли, и наблюдаю. Бот перепрыгивает через яму, затем разворачивается и падает в неё с понятным результатом.

Наставил кучу операторов вывода и в конце концов понял. Когда я ввёл новый тип узла — «перепрыгнуть через яму», — в экспортёре спутал лево и право. Бот бежит вправо, нарывается на узел, подпрыгивает, оказывается на противоположной стороне, а там «вправо» — это влево. То есть в яму.

8293

Who watches the watchmen?

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

Решение было однозначным. Я поставил второй таймер, который проверяет, работает ли первый.

8289

Не время для ромбов

Военный институт. Одногруппник сдает зачёт по архитектуре ЭВМ. Задание: написать программу для вывода текущего времени на ассемблере. В распоряжении есть только откомпилированная программа, которая сначала показывает ромб, а дальше уже время. Одногруппник, недолго думая, переименовывает romb.exe в time.exe, запускает — о чудо, ромб больше не показывается, выводится только время!

Друг подзывает преподавателя, показывает ему посторонний исходник, запуская при этом time.exe. Преподаватель смотрит на исходник, снижает балл за наличие в коде чужого имени и принимает программу.

Не знал друг, что в консоли винды есть команда time, которая выводит текущее время. Как, ну вот как он так угадал название? Вот так закаляется военный софт.

8274

Одичалый указатель лицо ладонь

Учу С++. Завис на указателях, полез в Гугл. Наткнулся на один хелп по ним. Выдержки из статьи:

Например. блок [3] будет синонимно с * (array+3), намеревающся * (0x1000 + 3*sizeof (внутренне)), который говорит «dereference значение хранило на 0x100C, in this case 0x0001».

Это объявляет деньг как указатель к интежеру. В виду того что не гарантированы, что будет содержание памяти любого специфически значения в c, необходимо позаботиться для того чтобы обеспечить что адрес то деньг пункты к действительны. This is why предложены, что выступает указатель с иничиативой к NULL.

Напечатанные на машинке указатели и отливка

В много языков, указатели имеют дополнительное ограничение которому предмет, котор они указывают к имеет специфический тип. Например, указатель может быть объявлены, что указал к интежер; язык после этого попытает предотвратить программник от указывать он к предметами не будут интежеры, such as floating-point номера, исключающ некоторые ошибки.

Делающ указатели безопасно

Указатель не имеет NIKAKой адрес заданный к ему вызван a одичалый указатель. Любая попытка использовать такие uninitialized указатели может причинить непредвиденное поведение, то потому что первоначально значением не будет действительный адрес, или потому что использование его может повредить систему продолжитеную по времени и другие unrelated части программы.

Долго ржал. Даже Промт, земля ему пухом, на такое не был способен.

8267

Пишу код за сладости

Счастье привалило: посылают меня на неделю в офис крупнейшей американской компании, производящей шоколад и прочие сладости, дабы помочь им наш продукт установить, небольшой проектик написать и посмотреть, нельзя ли им ещё чего-нибудь продать. Домой пришёл, рассказал. Дочь подошла, в глаза заглянула и вкрадчиво так говорит:

— Папа, а научи меня делать то, что ты на работе делаешь! Я с тобой поеду!

Жалко было ребёнка разочаровывать, но пришлось рассказать суровую правду: не день и не два учиться придётся… А шоколадку я ей и так купить могу.

8266

Невнятный код с умным лицом

Работаю над новым проектом: решил посмотреть, что такое браузерный WPF. Создал проект из двух страниц: логин с настройками и основная. Набросал пару менюшек. Понимаю: переделывать буду раза три, потому что WPF — это нечто. Cоздаю папку kuski nevnyatnogo koda, сохраняю туда проект.

Запускаю. Страница логина отрабатывает, настройки работают, всё окей. Нажимаю «Войти» — и всё рушится с ошибкой: «Не найдена страница». «Как это не найдена?» — спрашиваю я у Студии. На проект посмотри, она там лежит! Перезапускаю — не найдена. Переименовываю — не найдена…

И только когда я создал новый проект в папке razrabotka и копипастом перенёс туда исходники, всё запустилось и заработало сразу и без багов. Любите свой труд.

8262

На полпути выделялка сломалась

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

if (isSelected) {

component.setBackground(Color.BLUE);

} else if (!isSelected) {

component.setBackground(Color.WHITE);

} else {

throw new IllegalStateException(

"Table row should be either selected, or not"

);

}

8259

Код из прошлой жизни

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

Во время очередной итерации разработки перекинул часть кода в другое место. Некоторое время спустя в другой кусок понадобилось добавить несколько строк. Вот этот второй кусок найти оказалось затруднительно. Ни в одной процедуре формы его не оказалось. В файле, который компилируется, этого куска никогда и не было. Смущало отсутствие в методах формы традиционного Create (я работаю с разными оболочками, не всегда помню, где что как называется). В то же время запуск функции в программе успешно выполнял то, что должен. В выпадающих списках предлагались значения, которые и выбирал исчезнувший кусок кода. Кофе и свежий воздух не проясняли картину.

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

Вывод первый: созданные динамические объекты нужно уничтожать. Вывод второй: чудес не бывает.

8228

Эликсир эффективного кода

Во время оно в голове у меня было только две мысли: написать программу, уложившись в ТЗ, и навариться на эпидемии вируса Chernobyl, имея под рукой программатор.

А ТЗ было очень даже заколдобистое. То есть программа должна была работать на XT без винта. С двух дискет. По филиалам у нас такие едва ли не до 98-го работали.

Кто писал объёмные проекты на Clipper, тот знает, чего стоит впихнуть клиппериану в 640К минус драйвер русской клавиатуры минус драйвер сетевой карточки минус драйвер принтера. То есть ~540К. И клипперовский рантайм на 320К.

И был у меня там модуль. Ничего сверхординарного: выборка по заранее не определённому, но конечному количеству параметров. Только Клиппер — это не SQL. Он не только сам запрос должен создать, но ещё и сам его обработать.

Был этот модуль в двух вариантах: либо быстро, но то чего-то пропустит, то вылетит по нехватке памяти, либо медленно даже с винта. А уж с дискетки на XT вообще вешалка. По полчаса. Зато точно.

И тут пациент за восстановление погрызенного «Чернобылем» биоса подгоняет аж три литра настоящего привозного Хольстена. Дедлайн по проекту был не то что виден, а уже конкретно кусал за пятки, то есть оставалась до него пара дней. И решил я превентивно выпить и попрощаться с премией, а то и с работой.

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

Утром, придя на работу, я первым делом схватился за исходники. Бэкап был только от последнего релиза. Плохо. BAK-файлы. Их много. Время у них практически совпадало со временем моей эвакуации охраной. Очень плохо. Значит, на перекурах сохранялся. Где там наш большой авось?

Запускаю сборку. Собирается. Причём даже без привычных ворнингов. О как! Подцепляю тестовые базы. Гоняю в хвост и в гриву. Всё работает! Добавились кое-какие красивости интерфейса. Откуда бы? Запускаю эту, мать её, выборку. Работает. Быстро. Ну, это на 486-й. Засовываю дискетку в стендовую экстишку. Работает. Быстро. Проверяю ковырнадцать раз. И не ошибается. Тихо обалдеваю.

Глазам не верю. Лезу в исходник. До меня доходит, что я не понимаю, как он работает. Любая попытка что-то поменять или поправить приводит к неработоспособности. Да и чёрт с ним! Трачу день на всевозможные тесты и точно в срок сдаю новую версию АРМ. Ну, премия, хорошие слова, почти слава.

Спустя несколько лет мне позвонил мой преемник с вопросом: «Что-то я никак не пойму, как у вас работает модуль N». Пришлось рассказать ему эту самую историю.