bash.im ithappens.me zadolba.li

Индийский код

5459

Динамично донельзя

Когда же придут те времена, когда для замены одного-единственного номера телефона на сайте не надо будет писать нечто типа:

$ find ./ -type f -exec sed -i 's/, (925)5xx-xx-x3//g' {} \;

Почему разработчик не может просто описать один шаблон и подключить его везде, где нужно? Сайт работает на MODx, однако его странички — обычные PHP-файлы, разбросанные по подкаталогам. Зачем нужна CMS вообще в таком случае? Неясно. При этом в базе данных 40 таблиц.

Прекраснее же всего раздел «Портфолио». В скрипте raboti.php около сотни строк следующего вида:

<A href="raboti.php?pics=fotos/30.jpg" title="Увеличить изображение">
<img src="/fotos/s30.jpg" alt="образец №30">
</A>
<A href="raboti.php?pics=fotos/31.jpg" title="Увеличить изображение">
<img src="/fotos/s31.jpg" alt="образец №31">
</A>
<A href="raboti.php?pics=fotos/32.jpg" title="Увеличить изображение">
<img src="/fotos/s32.jpg" alt="образец №32">
</A>

5428

Весь багаж цивилизации

Отыграв партию в Civilization V, я ушёл на работу, не выключая компьютер и не завершая игру. Вернувшись, я обнаружил полуживое окно «Цивилки» и кончившееся место на диске C:, что меня несколько смутило: под него выделено 50 ГБ, видео и игрушки живут в другом месте. Попытки освободить место не увенчались успехом: выкроенные 7 ГБ исчезли буквально за семь секунд.

Гугл, режим отображения скрытых и системных файлов и скрупулёзное исследование папок нашли виновника. Последний автосейв «Цивилки» весил 27 ГБ. Первая мысль: «На видео записать игру — и то меньше бы весила!»

5418

Одним глазком посмотреть

Принесли мне как-то «посмотреть» скрипт из соседнего подразделения — сказали, вроде как работал местами. После детального «просмотра» выяснилось:

— во всех условных операторах пропущены фигурные скобки;
— соединения не обнулялись, а повисали после запроса к базе;
— функцией для извлечения колонок извлекались строки.

После «просмотра одним глазком» скрипт заработал как положено и в четыре раза быстрее.

5331

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

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

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

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

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

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

for (b=a=0, a<c, a++) if (b<d[a]) b=d[e=a];

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

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

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

5320

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

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

* * *

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

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

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

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

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

* * *

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

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

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

5313

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

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

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

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

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

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

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

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

5285

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

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

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

for i:=0 to n do
if i<>0 do ...

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

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

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

while(iterations < 1000)

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

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

5219

Индийский код: основы основ

Копаясь в папке с литературой, посвящённой компьютерным сетям, языкам и технологиям программирования, наткнулся на файл Йога для пальцев.pdf. Вот сижу и думаю: перенести в другую папку или оставить?

5200

Сунем блок поперёк

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

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

Я долго бился головой обо всё твёрдое, что попадалось на пути. 50 ошибок и 300 предупреждений в HTML только на главной странице я ещё мог понять. Но как, как можно было сделать 70 ошибок в CSS и при этом заставить дизайн отображаться правильно? В какой стране это писали? Индия явно ни при чём.