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

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

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 февраля високосного года;

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

12372

Наступая на свежие грабли

К сожалению, часто тот, кто не желает учить ряды Фурье, абсолютно прав. Если вы программист, посмотрите на свою работу со стороны: многим ли из вас понадобилось всё это?

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

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

Мне могут возразить про новые решения взамен устаревших — возможно, так, но помните: «устаревшие» писали, возможно, ещё для процессора 80286, 25 МГц, 512 КБ RAM, экономя каждый такт и байт, а вы щедро разбрасываетесь гигабайтами и гигагерцами. Итог предсказуем: огромный неповоротливый монстр из кривых и сырых библиотек классов, худо-бедно ворочающийся на суперновой девелоперской тачке, но виснущий у пользователей.

Слово RFC вообще многие видят впервые. Некоторые, правда, что-то слышали про ITIL: так вот, те RFC — это другие RFC. Правильно, зачем нам читать унылый формальный документ на английском, когда можно на форуме поискать тему «как работает сервер ХХХХХ?» Ну, несколько ключевых команд не реализовали, ну, некоторые стандартные «расширили», ну, потом пользователи плюются — так это потому, что пусть нашу программу используют, а не какую-то там!

Общего представления об интернет-протоколах они могут вообще не иметь: считают, что HTTP отличается от SSH только номером порта, например. Не знают, что доменное имя www.site.ru совсем не обязательно означает веб-сайт на сервере site.ru и совсем не обязательно на российском.

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

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

Вот если бы это ещё наша система образования поняла…

12366

Фурье (не путать с фурри)

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

— Да я вообще не понимаю, зачем мне вся эта ерунда! (Учится парень на прикладной математике и физике, там же, где и я, только курсом помладше.) Я вот прогать хочу, я с пятого класса этим занимаюсь, а у нас там проги мало, а куча дерьма какого-то: теорфизика, матан да вычмат!

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

— Да ну вот, на вычмате мы матрицы раскладываем… (Минута жалоб.) И на кой оно мне?..

Я отмахнулся от попыток убедить его. Через неделю сам поймёт, когда сломает пальцы об задачу, решаемую с помощью алгоритма Фурье.