bash.im ithappens.me zadolba.li

Программизмы

13293

Ночь полубессознательных абстракций

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

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

— А-а-а, вайфай-точка падает!

И падают эти бандуры в воду! Волн почти не было, а агрегаты не утонули, держались на плаву.

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


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

13288

Не годится им в коде водиться

Жил да был себе бородатый программер. Всё его устраивало в этой жизни — заказы есть, что ещё нужно? Кстати, программер тот не курил и не пил — у нас же сказка о хорошем и мудром программере, верно?

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

— Не щёлкай меня резинкой от трусов, о мудрый программер, выполню тебе взамен два желания!

Наш программер подумал-подумал, да и говорит:

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

— А не жирно ли, о мудрый программер?

Наш бородатый программер натягивает резинку от трусов…

— Сделано, о мудрый программер!

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

13260

Работать над деплоем травы

Приехал к клиенту в Кингстон помогать им разбираться с нашим продуктом. Одна из частей продукта — IDE на базе Eclipse. Все собрались в офисе, попили кофе, всё обсудили, сажусь работать. Открываю файл, вношу изменения, записываю, запускаю — а на изменения ноль реакции. Смотрю на файл в vi — а изменений там нет. Смотрю на файл в IDE — а изменения куда-то исчезли совсем. Ну, думаю, старею. Повторяю всю процедуру. С тем же результатом.

Тут уже руки начинают трястись. «Изверги! — ору на весь офис. — Вы сколько травы мне в кофе подсыпали?»

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

Мама, в каникулы мы едем на Джамейку…

13234

Тлензадание

Попался мне как-то очередной психологический тест: не из этих, которых в интернете сейчас полно на любой вкус, а какая-то древняя досовская программа с кучей разнообразных вопросов, выдающая какие-то цифры процентов и вероятностей, а кроме всего прочего — рекомендации по выбору профессии: подходящие — неподходящие.

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

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

А тут — «дайте детальное ТЗ». Заказчик в ступоре: он хочет кнопку «Сделать хорошо!» и не очень понимает, как именно это сделать, поэтому на вопрос «детальное ТЗ» он начинает выдумывать отсебятину в меру своей фантазии. Рисуется увиденный где-то интерфейс, всё это сопровождается комментариями «ну, вот как-то примерно так», а потом программисты честно по ТЗ лепят ему это самое «как-нибудь», не забыв аккуратно оформить исходники и воткнуть пару пасхалок, понятных только им самим. Программисты хорошие, но… ТЗ соответствует? Да. Задачу решает? Ну, какое ТЗ, так и решает.

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

А вот настоящему программисту это непонятно и смешно: дурацкое ТЗ какое-то!

Да, тест прав: я не программист.

13168

Под сенью графа

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

Лет десять назад потребовалось написать приблуду для апдейтов. Поскольку код и данные были кучеряво завязаны в нашем софте, а программистов всего три, я решил проблему просто. Разворачивал старую и новую версию софта в соседних директориях, потом делал бинарный diff. Полученные патчи зиповались вместе с минимальными скриптами, которые на стороне юзера обеспечивали апгрейд продукта. Естественно, такой кумулятивный патч мог апгрейдить только конкретный номер билда, на это и была введена специальная проверка. Всё чинно-благородно, даже работает. Поднять версию продукта весом в несколько гигов можно было патчем в 30 мегабайт…

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

На нескольких листах ватмана изображён граф. Не сиятельство, а нечто сетевое и направленное из одноимённой теории. Узлы графа подписаны именами дистрибутивов, а стрелки между узлами — именами EXE-файлов патчей.

Граф занимал всю стену. Я стоял с открытым ртом. Думай о последствиях…

13162

Гоблин не пройдёт

Заметил историю на Баше, которая мне показалось странной:

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

А в моей вселенной всегда есть гоблин, который запустит скрипт от предыдущей версии в релизе следующей. Причём для другой платформы. И будет биться в истерике, что он всё сделал по инструкции, которую перед прочтением съел.

Как так можно проектировать систему обновления, чтобы была возможность запустить скрипт от предыдущей версии на более новой? И, в общем-то, я понял, почему такая возможность появляется.

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

Ну что же, карты выложены, идею реализовали (хозяин — барин же). И тут — ура! (то есть «ёпт!») — продакшн поломался. Пришлось, конечно же, много времени потратить, чтоб всё восстановить. К счастью, скрипты тогда были обратимыми.

С того момента минуло немало времени, я получил много экспы и уровней, и именно поэтому сейчас ни один гоблин не пройдёт!

13155

Запрос — ответ — отображение

Закончил очередную функцию нашей Главной Проги. Андроид-приложеньице отправляет запрос на сервер конторы, получает ответ, выводит очередной график. Очередное сообщение — очередную линию рисует алерт-подобным цветом. Запрос — ответ — отображение.

Дочь скачала программку для соцсети. Сообщения, группы, картинки. Запрос — ответ — отображение.

Гаджет о погоде. Удобно, градусы всегда видно на рабочем столе. Оно постоянно делает запрос на погодный сервер, получает ответ, выводит.

Взгрустнул.

Запрос — ответ — отображение. Таковы 90% ПО и в маркетах, и которое делаю сам. Фактически — урезанная версия браузера. (Ну ладно, иногда расширенная. У нас, например, теги графиков и алертов не по спецификациям W3C сделаны. Три раза «ха».) Блин, но суть-то одна!

90% программистов пишут браузеры. Если повезёт, появляются 10% настоящего программинга на стороне сервера, который заказчику/клиенту/потребителю не виден, но чаще всё уже готово. (Сам использую спелчекер — ну, если юзер вдруг захочет тут же письмо отправить, кошерно бы его сразу и проверить, всё-таки начальство в основном использует, ему негоже ашипки сажать.)

Коллеги говорят: «За что платят, то и делай». Да я не против. Но грустно как-то немного…

13145

Код вас переживёт

Тут один человек предлагал «выбирать технологии», дабы освободиться от быдлокода. Я тут валяюсь под столом и пытаюсь сквозь смех написать…

Так уж повелось, что программист на порядок чаще читает код, нежели пишет, причём, скорее всего, код этот чужой. Весьма вероятно, его писали где-нибудь в середине мезозоя, и последний тираннозавр, который в нём соображал, погиб от злосчастного астероида. Да и стандарты кодирования тогда были другие, если были вообще. К примеру, писать комменты на перфокартах — зто замедлять загрузку почём зря, это плохо. Логично?

И тут приходит такой из себя хомо сапиенс и говорит, что для данной задачи нужен другой инструмент и/или фреймворк. Да кто бы тебя спрашивал! Даже если и прав, код уже написан. Когда софт писали, не было этих фреймворков. К тому же фреймворк определяется другими факторами. Язык программирования и тип задачи практически однозначно укажут на фреймворк. C# для GUI-приложения автоматически даёт Windows Forms, Delphi даёт VCL — и выбирать не приходится.

Таки да, есть много умных книг, как писать программы, даже как их рефакторить. Есть куча людей, которые посоветуют тебе, какие инструменты выбрать под новую задачу. Но, блин, кто-нибудь, напишите, пожалуйста, книгу, что делать с уже написанным кодом! Код уже есть, писать его не надо, проехали, но объясните, как теперь с ним жить!

Сижу вот. Восемь миллионов строк. Поддерживать нереально: слишком много. Разобраться нереально: решаемые кодом задачи заумные. Рефакторить нереально: надо разбираться в сути вопроса, чтоб рефакторить. Заново переписать восемь лямов тоже нереально: займёт те же лет двадцать. Выкинуть код нереально: доход от продаж с этого продукта выражается семью нулями зелени. Ну и?.. Any ideas, как говорят на том берегу атлантической лужи?

Фух, отпустило. Проржался. C грустным видом вылезаю из-под стола, чтобы тупить в очередной кусок кода…

13106

Хочешь форков новых самых?

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

Вот попадается упёртый товарищ с синдромом утёнка: когда-то он освоил систему ХХХ, работает с ней, только с ней и ни с чем иным.

— Попробуем сделать вот так?

— Нет!

— Ну, может, вот это заменим?

— Нет и нет!

— Почему?!

— Потому что ХХХ — лучшее, что было создано с начала времён!

Другой, наоборот, модный и современный:

— На прошлой неделе анонсировали YYY! Крутая штука, я уже попробовал, офигенно!

— Погоди, там вон то не доделано, баги не пофикшены, а вот это вообще глючит…

— Ты ретроград! Всё передовое человечество!.. А ты!

Третий — раб массовки:

— Надо делать вот так, так все делают!

— Но в нашем случае это же неудобно.

— Ну и что, так все делают! Понимаешь, все!

Четвёртый — раб авторитетов:

— У тебя неправильно: вот эту штуку надо делать вот так.

— Почему?

— Так завещал Великий Гуру, так учит Его статья в самом авторитетном журнале!

— Но ведь твой гуру говорил про свой частный случай, когда…

— Он не мог ошибаться! Ты хочешь сказать, что знаешь лучше?!

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