bash.im ithappens.me zadolba.li

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

12587

Принцип Паули в программировании

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


Пишем вдвоём программу. Логика сложнейшая, там и тут самопроверки.

— Иди сюда, программа пишет: «Mismatch on 0»! — кричит тестер.

— Значит, сработала самопроверка, — отвечает программист. — Давай проект, буду разбираться.

Через десять минут программист возвращается.

— Ты не поверишь: ошибка в самопроверке!

12582

Если к жопе приспособить сопроцессор фирмы «Крей»

Любители конструирования бритв сподвигли высказать свои пять копеек. Собственно, чем отличается ПО от материального мира? Отсутствием износа, лёгкостью копирования и большой сложностью создания. Разработать что-то сложно, тиражировать не стоит практически ничего. Как бы в таких условиях происходила разработка автомобиля?


У нас задание: сделать автомобиль. Так, когда-то мы делали лодку, возьмём за основу.

Говорят, у автомобиля должна быть крыша. Так… Ага — вот есть опенсорсный профнастил. Плевать, что для сарая. Если его заточить, сойдёт за крышу авто.

Мотор? У Петровича есть старый авиамодельный движок. Копии ничего не стоят. Берём 150 копий и ставим вокруг дифференциала. Дифференциал и задний мост придётся купить, убив на него половину бюджета. Мы же можем только водопроводные трубы гнуть и стеклопластик клеить.

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

Колёса? У нас есть ролик от коньков. Если сделать обруч из водопроводной трубы и прикрутить к нему ролики — думаю, покатит. С крепежом проблема: есть болты М8 и гайки М20. Искать другое долго и дорого. Надо сделать пробку в гайку М20 и нарезать внутри этой пробки М8. Кажется, это называется «враппер».

Поворотники для сигнализации светом? О, для сигнализации светом есть списанный автомат отстрела тепловых ракет от СУ-27. Если положить в порох добавки для цвета, будем сигнализировать так, что мало не покажется.

Теперь найдём опенсорсные тормоза…

12559

Честный просвещённый индус

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

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

И потом, как честный просвещённый индус, вставил себе этот неведомый кусок чужого кода.

12485

Христос Постгресе!

В телефонном разговоре нечаянно поздравил другого программиста с праздником Ильи Пролога. Докатился. Не скажу, что с декларативными языками пора завязывать, но что им надо уделять поменьше внимания — определённо…

12476

Пора готовить лыжи

Устроился в одну контору программистом с испытательным сроком. Как известно, для хорошего программиста язык — это инструмент, как для слесаря пассатижи.

Сразу предупредили, что язык сложный (Caché ObjectScript), и до меня было много претендентов, но никто не справился. Наставником определили бывшего препода по информатике, 50+.

Первое задание: морской бой. Консольный вариант: 80×25, мыши нет, псевдографика. Написал, показываю. Наставник негодует:

— А почему у тебя координаты надо вводить? Давай позиционирование по полю противника сделаем курсором и расстановку кораблей тоже.

Переделал, показываю.

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

Уделал этот морской бой до неузнаваемости: фон псевдографикой, меню настроек фона, цвета окон, способы стрельбы, подсказки и т. д. Было бы в 90-е — продал бы его. Показываю.

— Ну, я тебе троечку с минусом за эту работу поставлю, только за то, что что-то делал.

— Тут оценки ставят?

— Нет, это чтоб ты ощущал.

Потом открывает код, и начинается самое интересное:

— Нет, так не пойдёт, стиль я такой не приемлю, он нечитаемый. Эти твои скобочки только в глазах рябят.

И начинает учить ходить заново:

1. Каждый оператор с новой строки!

То есть запись на C++ вида int a, b, c, d; должна быть:

int a;
int b;
int c; …

2. Если количество операторов внутри цикла или условия больше трёх — нужно выносить код в отдельную процедуру.

Запись вида:

if (k == 1) {
    f = "Фамилия";
    n = "Имя"; 
    o = "Отчество";
    t = "123-45-67";
} 

должна выглядеть так:

if (k == 1) { pr () }

void pr (void) {
    f = "Фамилия";
    n = "Имя"; 
    o = "Отчество";
    t = "123-45-67";
} 

3. Имена процедур называем большим буквами, и не более восьми символов. В то же время имя процедуры должно явно отражать её действие. Переменные и функции называем маленькими буквами, названия тоже должны быть недлинными, но информативными.

И тут мой наставник сразил меня наповал:

— Ты же знаешь, чем отличаются функции от процедур?

— Да. Функция возвращает значение, процедура — нет.

— Не только! — торжественно произносит он и вопрошает, тыкая курсором в код. — Это что?

— Процедура.

— Нет! Это функция, ты ж ей параметры передаёшь!

Я не нашёлся, что ответить.

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

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

12473

Это предложение ложно

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

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

Я к тому, что есть весьма любопытное сочетание всего этого сразу. Самопротиворечие называется. Это, например, древний парадокс фразы «Это предложение ложно».

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

Впрочем, честность нынче не в цене. После Вольтера и Эвелин Холл («Я не согласен ни с одним словом, которое вы говорите, но готов умереть за ваше право это говорить») про свободу слова и поговорить не с кем.

Лучше, право, с компами. if ((2*2) == 4) всегда true, независимо от программистов…

…но не от тех, которые писали компилятор.

12420

В начало константу ставить хочешь ты

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

Был там чекбокс «Монтаж». Если стоит галочка, то в таблицу вносится «Да»; если нет, то «Нет». Когда я запустил программу, то заметил, что даже если не ставить галочку, в таблицу всё равно вносится «Да».

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

Самое смешное, что за месяц до этого я читал про «условия Йоды» и подумал: «Ха-ха, тупые! Кому это надо?» Оказалось, надо. Конечно, проблема была в том, что я написал = вместо ==.

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

12392

Воспитанные в скромности

Термостат настраивал. Вспомнил уроки информатики в четвёртом классе. БК-0010 с Бейсиком, 16-битный процессор, 32 килобайта ПЗУ, 16 ОЗУ, 16 видеопамяти, разрешение 512×256, несколько десятков клавиш. Достаточно ресурсов, чтобы сделать имена переменных многосимвольными. Но они односимвольные.

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

Что имеем в первом случае? Программистов, которые задолго до БК работали на чём-нибудь с намного более ограниченными ресурсами и, получив в распоряжение машину с бóльшими ресурсами, от привычки экономить память не отказались.

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

Потому что ничего само ниоткуда не берётся. Даже привычки.

12389

Дата в базе, ноль в уме

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

Утром меня ждало письмо с заголовком «Ни черта не работает». Удивляюсь: кроме меня, на сопровождении этого софта больше никто не работает, вчера всё проверял при тестировщике. Запускаю программу — реально ничего не работает! Точнее, записи по кругу импортируются, как в бесконечном цикле.

Данные источник поставлял в виде XML-сообщений, а уникальность проверялась по дате создания. Почему-то творец логики решил особо не заморачиватся с парсингом и сравнивал записи о дате создания как строки. В источнике формат dd/MM/yyyy, в приёмнике — d/MM/yyyy. А так как моя работа над всем этим пришлась аккурат под конец месяца, баг только сейчас и всплыл. Закончил бы раньше — так бы и не узнали до продакшна. Как это не выловили за два долгие года работы на продакшне — ума не приложу.

Две вещи, которые я вынес из всего этого:

  • я никогда не смогу учесть всего, и моё творение обязательно упадёт/зависнет в последнюю секунду 29 февраля високосного года;

  • данные нужно приводить к виду, с которым нужно работать.