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

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

5313

Работает — и ладно

Стыдно станет, говорите? Даже не мечтайте!

Учусь я сейчас на программиста, третий курс. Поскольку компьютерные аудитории, как правило, маленькие (около 10–15 машин), а группы большие (25–30 человек), то по большинству предметов мы работаем в бригадах. Защищаются работы индивидуально каждым студентом, но программа на бригаду пишется одна.

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

Все операторы он написал в один столбик даже без попыток табуляции (Delphi её автоматически не вставляет, к сожалению). А уж как изощрился с хеш-функциями… Оговорюсь, что массив ключей для записи и для поиска объявлялся глобально. В каждую из хеш-функций, написанных в виде процедур, вместо одного-единственного ключа передавался индекс элемента в массиве, имя переменной, куда предлагалось вернуть значение, и ещё пара-тройка параметров типа длины числа и количества элементов в массиве (объявленные в начале программы константы). И самое весёлое: поскольку нужно было анализировать два разных массива, каждая хеш-теперь-уже-процедура была продублирована.

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

— Я ж не знал, что её надо делать. Да он и так примет! Мне же надо только работу сдать — и всё.

— А как же правила программирования? Как же то, чему нас учили?

— Я не считаю себя вообще программистом! Мне лень ставить эти пробелы, лень думать. Нам же надо сдать! Работает программа — значит, работает, какая преподу разница, как я её пишу? Главное, чтобы принял.

Вот так, товарищи. Главное — чтобы препод принял. И впрямь, зачем мучиться, думать, делать по уму? Работает — и ладно. А потом и на работе так же: делают не чтобы работало, а чтобы начальник принял. Чему ж тут удивляться? Им не стыдно. Ни капельки.

5306

Аккуратный подстрочник

Тружусь программистом в известной местной конторе. Есть тут грандиозная информационная система, которая потихоньку переписывается с FoxWeb (орудие пыток мозга, развитое из FoxPro с поддержкой сети) на PHP с Ораклом. Казалось бы, всё круто, привет, ООП и остальные прелести жизни! Но не тут-то было и не там-то тоже.

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

5286

Если (бы да кабы)

Вы всё ещё удивляетесь, откуда берутся быдлокодеры, генерирующие индийский код?

Учусь в школе. В 10 классе начали изучать программирование на Паскале. Очередное задание — вроде бы несложное, но написать код надо без циклов, используя лишь оператор ветвления if. Побившись несколько часов головой об стол, я всё-таки родил программу, но она включала в себя 23 вложенных ветвления.

Я долго смотрел на своё детище, а потом всё же решил воспользоваться гуглом для поиска нормальной программы — может, я просто идиот? Гугл в ответ на просьбы выдавал лишь варианты с использованием запрещённых циклов. Тогда я обратился за помощью к другу, программисту со стажем.

— Без использования циклов, говоришь? 23 ветвления у тебя вышло, говоришь? Ясно. Пшёл в пень, некрофилией не увлекаюсь.

5285

Аргумент с потолка

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

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

for i:=0 to n do

if i<>0 do ...

Да, начать с единицы цикл, видимо, религия не позволила.

function f1(x: real) /* Первая производная функции */

function f2() /* Вторая производная функции */

Гениально! Второй производной аргумент, оказывается, не нужен. Оказалось, он берётся из глобальной производной, объявленной где-то наверху. Хорошо, не из массива с элементами [1, 2, 3, ...] — хотя это я тоже когда-то встречал.

while(iterations < 1000)

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

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

5264

Скайнет шлёт привет

Работаю программистом в НИИ. Разрабатываем сложную распределённую систему для спецнужд. Проект лежит на SVN-сервере, всё по уму. Коллега апдейтит транк, чекает обратно, начинает собирать проект. Через какое-то время:

— Ребята, мне кажется, мы написали что-то стоящее!

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

На самом деле у коллеги просто дата на компе откатилась на день назад, но стойкое ощущение скорого появления Терминатора я не забуду, наверное, никогда.

5232

Чтоб админ не заскучал

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

Каждый банк лепит свой клиент в меру собственного недоразумения. Одному нужен локальный мейл-сервер. Второй требует, чтобы в Internet Explorer в качестве прокси стоял локальный порт, на котором банк-клиент слушает. Третьему — открытый локально 110-й порт. Четвёртый написан на древней версии .NET и с другими работать отказывается. Об уровне техподдержки этих систем и говорить стыдно.

Знайте: вас, криворуких (как программистов, так и горе-админов, которые не в состоянии поправить неграмотность программеров), тихо и громко ненавидят и юзеры, и админы, вынужденные обслуживать ваши поделки. Будьте проще. Поверьте, хитрость вашей мысли никто не оценит.

5230

Полегче с травкой

Пишем программу. Естественный отбор. Ползают хищники, травоядные, травка вырастает периодически. Хищники для размножения должны съесть немного травоядных, травоядные — немного травки. Размножиться — отложить яйцо, которое породит трёх существ твоего вида. Травка — от бога. Всё живет, развивается, естественный баланс между количеством травоядных и хищников поддерживается, количество травы влияет на размер популяции, преподаватель доволен, студенты горды.

Сдача проекта. Результаты живут и развиваются на большом экране за спиной докладчика. Размер поля и количество травы выбраны так, чтобы было и интересно, и без тормозов. Писалось на «жабе», так что тормозить начинало быстро, особенно на выданном ноуте с Вистой. Короче, поле получилось небольшое, и естественные флуктуации размера популяции стали сравнимы с самим размером. Хищники побеждают; после лакомства последним представителем травоядных они, конечно же, вскоре благополучно дохнут с голода.

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

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

5187

Пусть будет при мне

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

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

— А зачем мне этот лишний геморрой? Я лучше в документации напишу, что региональному администратору клиента при инсталляции ПО нужно перенаправить поток с локалхоста на требуемый сервер.

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

5147

Сгодился бы и Бейсик

Встречая Новый год в одиночестве, решил сварить глинтвейн. В наличии была бутылка вина, но не нашлось штопора. К объекту «бутылка вина» в качестве метода открытия были применены последовательно моток скотча, толстый мануал и молоток. Горлышко я перемотал скотчем, положил на мануал и стукнул молотком выше внутреннего конца пробки, после чего налипшие на скотч куски горлышка убрал, а пробку со вбитыми в неё мелкими осколками выдернул. Глинтвейн был сварен, и первой фразой, услышанной в новом году, был голос Императора: «...увидишь мощь этой полностью оснащённой боевой станции».

А мануал был по Яве. Не пойму, за что её так ненавидят программисты?

5142

Кьюти-пути

Профессиональная деформация личности? Элементарно, Ватсон!

Заметил, что IT happens и «Башорг» я читаю с каменным выражением лица, лишь изредка улыбаясь, зато над документацией по библиотеке Qt смеюсь не переставая. Что самое печальное — я не знаю, что в ней такого смешного!