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

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

5365

Это исключено

Недавно друг попросил посмотреть кое-какую программу на Паскале по теме «геометрия на плоскости». Сел ковырялся и обнаружил ужасное выражение:

if (A and B) or (not (A) and not(B))

then writeln('...');

Когда я сказал, что условие можно выразить через XOR, друг изрёк гениальную фразу:

— А нам в школе сказали, что мы XOR не знаем.

5360

Инверсионный след быдлокодера

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

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

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

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

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

Наконец, вопрос «как писать код?» лишён смысла: программер, как правило, имеет дело с уже написанным кодом. Солдат в бою живёт три минуты, а на марше — несколько часов, поэтому в уставе армии США маршам уделено в несколько раз больше места. Прагматично.

Вот и выходит, что (по крайней мере для меня) единственный способ не писать фигню — не писать вообще. А если писать — то по минимуму, тупо до дебилизма и исключая «творческую и эстетическую составляющую». То есть писать как автомат, ремесленник, чернорабочий. Быдлокодер.

5349

MD5.1

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

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

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

5335

Гладко было на бумаге

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

Я не программист, я математик. И 25-летнего стажа у меня нет — мне всего 27. Тем не менее, на моём счету нахождение ошибки в вычислительной программе по телефону (неправильное соотношение шагов в сеточном методе для уравнения теплопроводности — в итоге деталь охлаждалась до −3000 градусов) и ещё пара подвигов в этом духе, но рассказ не об этом.

Недавно меня попросили реализовать один алгоритм (если кому интересно, Savitzky-Golay smoothing). Ерунда вопрос. Два дня, чтобы прочитать, что же это за зверь, два дня, чтобы вспомнить синтаксис C, два дня, чтобы не торопясь написать и протестировать консольную программу (напоминаю, я не программист). И вот в процессе тестирования вылезает глюк: в результате сглаживания у положительной функции появляются отрицательные участки. Понятно, что на такой функции и с такими параметрами метод не работает, но как понять, где его можно применять, а где нет? И вот я погружаюсь в глубины интернета в поисках оценок погрешности метода, но их нигде нет. Самому оценки вывести не получается — метод сформулирован в таких терминах, что непонятно, с какой стороны к нему подходить. Алгоритм опубликован в 1964 году, но за сорок лет никто не удосужился его протестировать и обосновать?! Невероятно, но факт. В принципе, после этого можно было бы сдать работу и сказать, что оно сорок лет у всех работало и у нас поработает, но совесть не позволила. На реализацию ушла неделя, на поиск альтернативных решений или обоснований — два месяца. Вот такое вот «чтобы работало». Решайте сами, как бы вы поступили в такой ситуации.

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

5331

О сложности простоты

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

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

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

Оверинжиниринг — вот мировое зло, вот дьявол всеохватный. Надо же обязательно показать всему миру длину своей пиписьки, свою «современность» и владение всякими супер-пупер-технологиями. Как? Ты до сих пор ищешь четыре максимальных элемента в массиве при помощи цикла? Так ведь в последней версии надстройки для последнего Visual C++, которая продаётся всего за $1600, давно реализован готовый класс для этого! Или можно взять готовую функцию qsort, которая всего-то отсортирует зря остальные 4 миллиона элементов, зато ты потом просто сможешь взять e[0], e[1], e[2], e[3] — и всё!

Головоломщик пишет красиво, компактно, оптимально. Задача легко охватывается одним взглядом, блоки отделены один от другого логично и изящно, пусть и с нестандартным форматированием. Отличается от хорошего программиста тем, что не комментирует свой код и даёт всему сущему идиотские названия. Иногда доходит то такой изощрённой пытки, как некомментированная ассемблерная оптимизация, идеальная с точки зрения кода, но с читаемостью на уровне клинописи:

for (b=a=0, a

Возможно, после пары тумаков он станет нормальным программистом и начнёт писать так:

for (MaxVal=i=0, i
if (MaxVal
// Ищем максимальный элемент и его номер. Массив полностью нулевым не бывает (проверено выше), поэтому MaxIndex всегда определён.


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

5320

«Тру» не по нутру

Разрешите представиться: быдлокодер. Да-да, та самая мифическая и несуществующая личность. Кого ни спроси — он тру-программер, а быдлокодер ходит где-то рядом. Позвольте полюбопытствовать, господа тру-программеры, а за неделю до сдачи проекта вы таки пишете нетленный идеальный код? Написание быдлокода — это как дефлорация. Не написал быдлокода — не программист. Но вопрос не в этом. За 25 лет (да-да) быдлокодинга я составил для себя классификацию «тру программеров». Вот она.

* * *

«Гении». Берутся за всё, делают на треть. Потом говорят: «Остальное тривиально», и за них доделывают другие. Любой совет со стороны воспринимают как повод унизить собеседника: «Чё ты ваще понимаешь?»

«Архитекторы». Эти лучше только тем, что берутся не за всё сразу. Зато любят изобретать свои архитектурные решения. Казалось бы, для типовой задачи за полвека придуман не один десяток типовых решений — нет, надо изобрести очередной велосипед с квадратными колёсами. Чуть не забыл: в архитектуре, по их мнению, я тоже ничего не понимаю.

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

«Алгоритмщики». Эти снизойдут до стандартных библиотек, но запутают данные и код так, что сам чёрт не разберет. Тут явно видно, что человек произошёл от обезьяны, поскольку рекурсивное лазание по дереву пришито к месту и не к месту.

«Оптимизаторы». Могут веками переписывать что-то на ассемблере (внося баги, конечно), считать такты процессора в Java-приложении и хранить биты в SQL-сервере.

* * *

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

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

Ладно, ребята, гордитесь, только не при мне. Я видел ваш код. С точки зрения унитаза люди различаются довольно слабо.

5314

Самописец чудодейственный

Я настолько привык, что в Qt Creator очень хорошо работает автодополнение, что поймал себя за попыткой дополнить название нового метода, который сам же и собираюсь написать в новом классе.

5313

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

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

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

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

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

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

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

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

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

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

5306

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

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

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

5286

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

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

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

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

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