Разглядываю методичку по английскому языку — в частности, список слов, которые требуется выучить. Составители возле каждого слова заботливо указали в скобочках первую букву части речи. В какой-то момент я поймал себя на мысли: «Что это еще за функция kit(n) и где я её объявил?» Так вот ты какая, профдеформация!
Истории с тегом: программизмы
Всего историй: 900
Наша сила — в нашем штате
Работал я одно время на заводе, который был заложен в пятидесятых и имел славную долгую историю, в том числе и бюрократическую. Мы, юные прогеры, лабали софт для производства на Дельфях, а на нас, как на молодую поросль, смотрели старички, которые писали ещё на Фортране и Алголе, а некоторые вообще Ленина видели. Иногда хвалили.
Часто работа сводилась к тому, что нужно было или доработать чей-то исходный код, или написать что-то своё, что использовало чужую базу или выгрузку. Становилось лучше? Да. Быстрее и проще? Да. Порой мы прикручивали одну кнопку, а если то, что планировалось в виде простой кнопки, вырастало в новую программу? Каждую серьёзную вещь нужно было документировать: как минимум — руководством пользователя, как максимум — программой испытаний, актом и приказом о вводе в эксплуатацию. Работающая программа сдавалась высокому начальству, качественный код — непосредственному.
Так вот, написал я программу, протестил, поставил пользователям и отдал все бумаги на подпись. В обосновании написал о том, что при помощи новой программы работать стало быстрее и проще: раньше было много суеты, а теперь всё делается в один клик. Начальство (дядечка лет пятидесяти) взяло и вызвало.
— Заходи, садись. Почитал я твои бумаги… Ну, кое-что ты подправишь, а так всё понятно и даже правильно. Но вот скажи, а зачем ты это пишешь? — и протягивает мне листик, в котором как раз и написано про «одну кнопку».
— Ну-у… — я задумываюсь и рассказываю заготовленную речь о том, что теперь всё стало быстро, просто и удобно.
— Ну, это я и сам понял, — отвечает начальник и усмехается, — не дурак поди. Но вот ты скажи. Ты тут пишешь, что при помощи твоей разработки стало проще работать, так? Что операцию, которую раньше делали три человека весь день, теперь может сделать один за пятнадцать минут, так? Одному стало хорошо. А теперь скажи, что же мне делать с остальными двумя? Уволить? Ведь ты сказал, что они уже не нужны?
А вот тут я задумался.
— В общем, иди переписывай. И чтоб такого больше не было! Работу они сокращают! Ишь, программисты…
Акселератор программиста (II)
Параллельно с работой админа подрабатываю сборкой на дому всякой электроники: GSM-трекеры, шлюзы, управляемые розетки и прочая лабуда.
Как-то поступил заказ на сборку очередной партии. К заказу шёл комментарий: штатная прошивка глючит, переписать не можем, программист в отпуске. Проблема в том, что имеющаяся прошивка не всегда понимается бутом. За скорое решение вопроса сулили приличные деньги. «Отчего бы и нет», — подумал я и позвал на помощь С-программиста, знакомого ещё со школы. Договорились так: я напаиваю компоненты, проверяю голый запуск, а он переписывает код, оптимизирует его, заливает прошивку и тестит, как только можно.
Работали у меня дома. Я на лоджии паяю, он в моей комнате кодит и шьёт девайсы. Проработали две ночи. Утром третьего дня, проснувшись, я застал своего друга за компом, очень быстро набирающего код. Рядом валялся десяток пустых упаковок от активированного угля. Увидел меня, минуты три друг ругался, потом затих и сказал: «Не отвлекай, хочу быстрее закончить. Мне недолго осталось, а умирать с недописанным кодом — дурной тон».
Уже вечером, когда он понял, что всё будет хорошо, рассказал, как дело было. Проснулся он в шесть утра и решил выпить кофе. Пошёл на кухню, на автопилоте насыпал, залил, начал пить. Только потом глянул на банку, из которой он насыпал сахар. На ней красовалась наклейка: «Нитрат ртути (II)». Сначала выпала чашка из рук, потом его почему-то вырвало. Моментально проснувшись, друг побежал за помощью в интернеты. Гугл сказал, что от трёх чайных ложек этой заразы умирают, но можно попробовать спасти себя активированным углём. В банке был, конечно, сахар, все остались живы и здоровы, а наклейку я давно приклеил забавы ради. Как сказал друг, этот шок оказался эффективней всех стимуляторов, которые он когда-либо пробовал.
Это исключено
Недавно друг попросил посмотреть кое-какую программу на Паскале по теме «геометрия на плоскости». Сел ковырялся и обнаружил ужасное выражение:
if (A and B) or (not (A) and not(B))
then writeln('...');
Когда я сказал, что условие можно выразить через XOR, друг изрёк гениальную фразу:
— А нам в школе сказали, что мы XOR не знаем.
Инверсионный след быдлокодера
Привет! Я тот самый быдлокодер. Судя по всему, я разбудил нехилый флейм со стороны обиженных тру-программеров, и все бросились поучать, как надо писать код. Смешно. Во-первых, это одна из основных отличительных черт тру-программеров: с пафосом учить других. Заметьте, я не учил, а констатировал факты. Ну, а во-вторых… Поехали по пунктам.
Человек — девайс аналоговый. При обработке информации оным девайсом часть информации замещается белым шумом. То есть косяки и баги будут всегда, пока нам не вставят чипы вместо мозгов, и никуда от этого не денешься. Поэтому рассказы о том, что 25-летний программер нашёл 40-летнюю багу, ничего удивительного не содержат. За каждым программистом остаётся след, как за сбитым самолётом, только из багов.
Специальная математическая подготовка не спасает. Скажите, какого хрена учить рекурсии на примере факториала? Это красиво только математически. После такого обучения любая тривиальная задача решается рекурсивно с переполнением стека и прочими прелестями.
Если быдлокод — это непонятный, слабо логичный, замусоренный лишним и ненадёжный код, то любая программа рано или поздно переходит в эту категорию. Меняются требования, задачи, программисты, дописываются костыли и так далее. Нет кода, кроме быдлокода, а быдлокодер — отец его.
Через полгода любая оптимизация вызывает вопрос «на хрена?», а «красивое решение» превращается в «какой идиот это писал?». В красивых и оригинальных решениях живут красивые и оригинальные грабли, которые сразу хрен найдёшь. Тут как у ассенизаторов: возле выгребной ямы оказывается тот, кто может дольше всех терпеть вонь, то бишь сидеть в отладчике. Довольно часто это я.
Наконец, вопрос «как писать код?» лишён смысла: программер, как правило, имеет дело с уже написанным кодом. Солдат в бою живёт три минуты, а на марше — несколько часов, поэтому в уставе армии США маршам уделено в несколько раз больше места. Прагматично.
Вот и выходит, что (по крайней мере для меня) единственный способ не писать фигню — не писать вообще. А если писать — то по минимуму, тупо до дебилизма и исключая «творческую и эстетическую составляющую». То есть писать как автомат, ремесленник, чернорабочий. Быдлокодер.
MD5.1
Давным-давно, ещё во времена, когда второй «пентиум» был топовой моделью, разрабатывали мы софт для банка. Ввжно то, что там была база пользователей, пароли в которой хранились в виде MD5-хешей (простейшая версия, даже без «соли»). В те времена интернетом мы не были избалованы, и алгоритм вычисления MD5 переписывали из бумажной книги.
Шло время. Программа пережила семь реинкарнаций, и от нашего творчества остались только самые низкоуровневые библиотеки. База пользователей растолстела и перекочевала из обычного файлика в оракловскую базу данных.
Однажды кто-то из админов заметил, что с одного айпишника идут запросы от имени разных клиентов нашего интернет-банка, и все с нулевым успехом: пароли не подходят. «Непорядок», — подумал админ и вызвал службу безопасности. Служба безопасности обратилась куда надо, и в тот же день доблестные сотрудники правоохранительных органов накрыли троих киберковбоев, одним из которых был относительно недавно уволенный из нашего банка программист. Допрос показал, что обиженный на руководство «несправедливо уволенный» умудрился утащить ту самую базу клиентов, где словариком, а где и брутфорсом подобрал пароли и уже потирал руки в предвкушении наживы. К его (а также его двоих подельников) немалому удивлению, пароли не подходили. Откуда было знать бедняге, что тогда, во времена царствования вторых «пней», я и мой напарник, переписывая алгоритм из книжки, допустили опечатку, а потом, когда ошибку обнаружили, испугались признаваться начальству?
Гладко было на бумаге
Все говорят, что писать надо быстро, качественно и так, чтобы работало. С этим все согласны, но когда начинаешь выяснять, что такое «чтобы работало», обнаруживаются такие нюансы, что только диву даёшься.
Я не программист, я математик. И 25-летнего стажа у меня нет — мне всего 27. Тем не менее, на моём счету нахождение ошибки в вычислительной программе по телефону (неправильное соотношение шагов в сеточном методе для уравнения теплопроводности — в итоге деталь охлаждалась до −3000 градусов) и ещё пара подвигов в этом духе, но рассказ не об этом.
Недавно меня попросили реализовать один алгоритм (если кому интересно, Savitzky-Golay smoothing). Ерунда вопрос. Два дня, чтобы прочитать, что же это за зверь, два дня, чтобы вспомнить синтаксис C, два дня, чтобы не торопясь написать и протестировать консольную программу (напоминаю, я не программист). И вот в процессе тестирования вылезает глюк: в результате сглаживания у положительной функции появляются отрицательные участки. Понятно, что на такой функции и с такими параметрами метод не работает, но как понять, где его можно применять, а где нет? И вот я погружаюсь в глубины интернета в поисках оценок погрешности метода, но их нигде нет. Самому оценки вывести не получается — метод сформулирован в таких терминах, что непонятно, с какой стороны к нему подходить. Алгоритм опубликован в 1964 году, но за сорок лет никто не удосужился его протестировать и обосновать?! Невероятно, но факт. В принципе, после этого можно было бы сдать работу и сказать, что оно сорок лет у всех работало и у нас поработает, но совесть не позволила. На реализацию ушла неделя, на поиск альтернативных решений или обоснований — два месяца. Вот такое вот «чтобы работало». Решайте сами, как бы вы поступили в такой ситуации.
Кстати, у этой истории счастливый конец. Когда я перерыл все книжки, решил плюнуть на всё и придумать свой алгоритм с шахматами и поэтессами. Сказано — сделано: придумал и сильно удивился тому, что вычислительная часть посимвольно совпала с тем алгоритмом, с которого я начинал, но у меня были оценки погрешности. Оставался, правда, ещё вопрос, как заставить их работать, но это совсем другая история.
О сложности простоты
Отважусь провести краткий ликбез на тему «ху из ху», чтобы нормальные программисты не считали самих себя быдлокодерами.
Быдлокодер не способен к осознанию и грамотной декомпозиции задачи, не владеет математическим аппаратом, не может построить граф состояний и набросать блок-схему, в результате чего постоянно путается и о работоспособности может судить только путём долбёжной отладки методом проб и ошибок. Обычно программа быдлокодера работает только для того сферического коня в вакууме, на котором писалась и отлаживалась.
Индус в первую очередь просто не владеет средствами языка в достаточной мере и пользуется теми, про которые успел прочитать, комбинируя их в жутких сочетаниях. Например, не знает про циклы с постусловием.
Оверинжиниринг — вот мировое зло, вот дьявол всеохватный. Надо же обязательно показать всему миру длину своей пиписьки, свою «современность» и владение всякими супер-пупер-технологиями. Как? Ты до сих пор ищешь четыре максимальных элемента в массиве при помощи цикла? Так ведь в последней версии надстройки для последнего Visual C++, которая продаётся всего за $1600, давно реализован готовый класс для этого! Или можно взять готовую функцию qsort, которая всего-то отсортирует зря остальные 4 миллиона элементов, зато ты потом просто сможешь взять e[0], e[1], e[2], e[3] — и всё!
Головоломщик пишет красиво, компактно, оптимально. Задача легко охватывается одним взглядом, блоки отделены один от другого логично и изящно, пусть и с нестандартным форматированием. Отличается от хорошего программиста тем, что не комментирует свой код и даёт всему сущему идиотские названия. Иногда доходит то такой изощрённой пытки, как некомментированная ассемблерная оптимизация, идеальная с точки зрения кода, но с читаемостью на уровне клинописи:
for (b=a=0, a
Возможно, после пары тумаков он станет нормальным программистом и начнёт писать так:for (MaxVal=i=0, iif (MaxVal // Ищем максимальный элемент и его номер. Массив полностью нулевым не бывает (проверено выше), поэтому MaxIndex всегда определён.
Только не переборщите с тумаками, а то он начнёт писать всё это в десять строк со скобками, что затрудит чтение громоздкостью — это вечный бич опенсорса.
«Тру» не по нутру
Разрешите представиться: быдлокодер. Да-да, та самая мифическая и несуществующая личность. Кого ни спроси — он тру-программер, а быдлокодер ходит где-то рядом. Позвольте полюбопытствовать, господа тру-программеры, а за неделю до сдачи проекта вы таки пишете нетленный идеальный код? Написание быдлокода — это как дефлорация. Не написал быдлокода — не программист. Но вопрос не в этом. За 25 лет (да-да) быдлокодинга я составил для себя классификацию «тру программеров». Вот она.
* * *
«Гении». Берутся за всё, делают на треть. Потом говорят: «Остальное тривиально», и за них доделывают другие. Любой совет со стороны воспринимают как повод унизить собеседника: «Чё ты ваще понимаешь?»
«Архитекторы». Эти лучше только тем, что берутся не за всё сразу. Зато любят изобретать свои архитектурные решения. Казалось бы, для типовой задачи за полвека придуман не один десяток типовых решений — нет, надо изобрести очередной велосипед с квадратными колёсами. Чуть не забыл: в архитектуре, по их мнению, я тоже ничего не понимаю.
«Библиотекари». Эти могут наступить на себя и согласиться с архитектурой, но стандартные библиотеки — дерьмо, их надо переписать. Хотя если исходить из предположения, что писались они неглупыми людьми, в самопальном коде косяков будет только больше. Нет, они свято верят, что могут всё написать вообще без багов.
«Алгоритмщики». Эти снизойдут до стандартных библиотек, но запутают данные и код так, что сам чёрт не разберет. Тут явно видно, что человек произошёл от обезьяны, поскольку рекурсивное лазание по дереву пришито к месту и не к месту.
«Оптимизаторы». Могут веками переписывать что-то на ассемблере (внося баги, конечно), считать такты процессора в Java-приложении и хранить биты в SQL-сервере.
* * *
А что же быдлокодеры, к коим принадлежу и я? Принцип «сделай быстро, сделай тупо, не пиши лишнего кода» — он не от хорошей жизни.
За несколько недель до сдачи проекта творчество тру-программеров вываливается на меня. Времени нет. Я начинаю править баги, замазывать быдлокодом дырки в архитектуре, распирать подсистемы костылями, вырывать с корнем деревья и втыкать массивы, чтоб работало в шесть раз быстрее. Потом, когда проект сдан, тру-программеры становятся ещё более трушными: их просто разрывает изнутри от величины собственной самооценки и от презрения к быдлокодерам.
Ладно, ребята, гордитесь, только не при мне. Я видел ваш код. С точки зрения унитаза люди различаются довольно слабо.
Самописец чудодейственный
Я настолько привык, что в Qt Creator очень хорошо работает автодополнение, что поймал себя за попыткой дополнить название нового метода, который сам же и собираюсь написать в новом классе.