Все началось с того, что в нашем офисе очень редко открываются окна. Цитирую переписку работников офиса.
— Видимо, окно около серверной и погода как-то связаны. Впервые за долгое время его открыли, и началась гроза. Стоит задуматься...
— Проверяется на раз. Если верно — то достаточно закрыть окно, и гроза прекратится.
— Э-э-э, только при условии обратимости реакции.
— Тогда каждое новое открытие окна должно усиливать грозу. Проверяется тоже на раз.
— Откуда такие выводы? Была посылка «открытие окна — начало грозы».
— Открой десять раз — десять гроз поставишь в очередь.
— Возникает вопрос о возможности переполнения буфера гроз и досрочном DoS-апокалипсисе.
— Правильно. Открытие окна — начало. Про обратимость есть сомнения. Но открыв окно во время грозы ещё раз, ты должен получить ещё одну грозу в то же время в том же пространстве, что равнозначно усилению.
— При условии, что окна тождественны. К тому же разные начальные условия, так что пока нерепрезентативно.
Классе в восьмом от нечего делать решил на Бейсике запрограммировать шарик, бесконечно долго летающий от одного конца экрана до другого. Написал код, запустил — шарик долетает до конца экрана, и программа падает. Пересмотрел код, отредактировал, запускаю — та же ерунда. Бился я над проблемой долго, но так и не решил.
Школа кончилась, кончился и институт. И вот однажды ночью я, 26-летний сотрудник банка, проснулся от того, что понял, где была ошибка! Конечно: в функции for i... в случае отскока шарика от границы экрана (то есть при движении от большего значения к меньшему) шаг должен быть со знаком «минус». Но момент, как говорится, уже упущен...
Два-три года тому назад работал я над программой для работы с неким оборудованием. Надо было обработать рисунок и вывести его на специфический принтер. Заказчик навязал мне одного любителя чистых абстракций: он должен был написать эффект, а я интерфейс.
Я ждал чуть не полгода, и наконец под гром фанфар получил DLL с тремя десятками методов с непонятными названиями и параметрами, возвращающую не ожидаемый BMP, а потоки, хендлы и ещё черт знает что. При попытке объединить это творение и мой интерфейс ничего не получилось. Я просто замучился разбираться, а тот парень вообще не понял, что я написал (хотя я дал открытый код с комментами). В результате я переписал всё в Студии, и прога заработала. «Абстракционист» три часа доказывал, что его эффект работает значительно быстрее. И правда: 380 миллисекунд против моих 423 на картинке размером 1800×1600...
Есть у нас здоровенный программный комплекс, обслуживающий научное оборудование. Оборудование весьма занимательное (на то и научное), поэтому и комплекс должен быть гибким: служит он такой куче исследований, что и сам не знаешь, на что именно натравишь этого монстра завтра.
Писался этот комплекс в три попытки. Первая представляла собой просто одиночную программу, которая перебиралась и перекомпилировалась, обрастая форками, ключами запуска и дефайнами до полной нередактибельности. Весь отдел ПО, вооружившись последними достижениями от MS, полгода ваял на Visual C++ замену. Итог: весь рабочий код уже обкатан на старой версии, язык C++, среда визуальная типа «интерфейс за один клик». Замена получилась модульная, и хотя перестыковка модулей осуществлялась с определённым сексом, приняли её на «ура».
Грянул кризис, утекли мозги, да и модульная софтина обросла костылями из-за трудностей с перестыковкой модулей. Свершилась третья попытка: руководство дало новым мозгам задание переписать всё заново, а для сокращения времени задействовали наимоднейшую концепцию «программирование без программирования» (UML и иже с ним: даёшь машине формулу, она в ответ — готовую программу). В этот раз в полгода уложиться явно не получилось: достижение стадии «самое начало комплекса уже иногда почти работает» вызвало всеобщий экстаз. Это, конечно, хорошо, но работать-то как?
Комплекс с сохранением модульности (только теперь модули перегруппировываются за секунду без всяких хитрых тайных знаний) я переписал в одно рыло (даже скорее в полрыла) вечерами за три месяца. Пользовался Open Watcom — дикой древней средой, в которой мышкой рисуются только диалоги. Си, «плюсы» в следовых количествах. Код полон if ((wParam&0xFFFF)==RUN_SERVO) SendCommand (MOTOR, 1); — кто знает WinAPI, тот поймёт, что такое ручная обработка оконных событий и какая это куча писанины. В теле сплошная работа непосредственно с указателями, проскакивают следы ассемблерных вставок. И почему же эта писанина совершенно не помешала мне работать в разы быстрее, чем все предшественники? Я вижу только две причины:
1) Работа программиста отнюдь не в наборе текста. Программист всё-таки не машинистка, скорость его работы не от количества знаков в минуту зависит.
2) Современные среды служат не для ускорения работы, а для снижения порога вхождения. Абстракция, оборачивающаяся во всё более и более толстую луковицу, нужна больше для сбора ста индусов в один хайвмайнд без их рассинхронизации (и вообще для того, чтобы индусы могли хоть как-то принять участие), а квалифицированному программисту, один раз изучившему системные «кирпичики», на которых держатся все разновидности таких сред, она производительность труда только снижает.
Завтра моя внеплановая четвёртая попытка, вызвавшая лёгкий шок, сдаётся в эксплуатацию. Бета выловила от силы полтора глюка — не в пример предшественникам (и это при том, что часть кода писалась вслепую без оборудования, с которым должна взаимодействовать). Вопрос напоследок: которая из четырёх версий обладает наибольшим быстродействием?
Если начали вспоминать холивары «какой язык программирования круче», добавлю-ка я и свои пять копеек. В 1998 году случилась эталонная ситуация для подобной проверки.
Лос-Анджелес. Монтируется аппаратура на корабле. Задача — принять телеметрию и отобразить в нужном виде на экран. На корабле три изолированных по национальному или производственному признаку сегмента, куда «чужих» не пускают. Отображением в одном сегменте занимался я, в другом — американцы из фирмы «A. S.», в третьем — программеры из рабоче-крестьянской корпорации. Задачи были весьма схожи: принять, обработать, отобразить. Отображение требовалось разное, но это уже неважно.
Американцы не задержались на корабле больше недели. Приехали, поставили софт, запрограммировали, получили бабки, уехали. Тихо-мирно, молча. Никаких претензий, никаких проблем. Язык программирования — Visual Basic.
Я приехал на неделю раньше американцев и уехал дней на десять позже — уж очень хотелось встретить Новый год дома. Реально я потратил недели две времени на отображение, а потом со скуки прикручивал к программе скриптовый язык для изменения сценариев. Язык программирования — Delphi.
Программеры рабоче-крестьянской корпорации приехали вместе со мной, но встречали Новый год вдали от дома. И Старый Новый год — тоже. Потом я просто перестал за этим следить. Язык программирования — Visual С++.
Для себя из этой истории я вынес критерий оценки собственной работы: количество усилий, потраченных для решения задачи, разделённое на количество заработанных килобаксов. Если сидишь на окладе, сложных проблем не возникает и нет особой нужды решать проблему быстро, то С++ вне конкуренции — программу любой сложности можно писать и отлаживать практически вечно, регулярно получая оклад. Если присутствует элемент сдельщины, то к С++ надо прибегать в последнюю очередь. Ведь крутизна программера — не в синтаксисе исходников, а в толщине его кошелька.
Машины в нашем институте отличались скверным характером и нетерпимостью к любым ошибкам в коде. Год был восемьдесят второй, писали мы на Фортране, запускали на агрегатах ещё, наверное, сталинской закалки, которые на малейшие неудачи в коде имели привычку накрепко виснуть. Но это ещё не самое интересное.
Кто писал для «Минска», должен помнить, что в процессе компиляции кода (а компилилось оно долго, особенно расчёты несущих) на экран выводилась огромная такая табличка на незнакомом несоветском языке: «DURATION». И вот сидишь ты в аудитории рядом с ещё двадцатью такими же «специалистами», пишешь, споришь, рассказываешь всем вокруг про «новый подход», компилишь... Виснет. Подходит препод, смотрит код на бумаге, задумчиво изрекает: «И ведь верно, дурейшен писал. Причём такой дурейшен, что ещё поискать надо...» — и, не перезагрузив машину, удаляется. Вскоре вся аудитория медленно, но верно покрывается такими же табличками.
Работаю в иностранной компании — делаем софт для программистов на Java.
Незадолго до выхода новой версии произошла беда: юридический отдел обнаружил вопиющее нарушение всех общечеловеческих прав, норм морали и копирайта. В проекте был обнаружен файл, содержащий чужую интеллектуальную собственность вражеской компании. Собственно, для меня всё началось с того, что пришёл срочный кейс о том, что такой-то файл нужно удалить и переписать заново.
Файл содержит список констант для обозначения разных версий Java (типа «Java_4», «Java_5», «Java_6» и т. д.), а также (о, ужас!) список зарезервированных идентификаторов (class, const, for, else, enum и прочие). Плюс напоминание о том, что данный файл — это вам не хухры-мухры, а «Sun proprietary/confidential».
Поскольку файл чужой, секретный и конфиденциальный, его нужно удалить и взамен написать свою реализацию, которая не совпадает с исходной. Более того, все разработчики, имевшие отношение к этому файлу (как оказалось, двое: тот, кто коммитнул исходную версию, и тот, кто потом менял отступы и форматирование) не имеют права этим заниматься. Далее уточняется, что нужен именно человек, который не видел, что внутри файла (чтобы ненароком или по злому умыслу не спереть секретный список ключевых слов Java), и сделает всё то же самое, но только совсем другое.
Вот теперь сидим думаем, как сделать тот же самый список другим и кто будет это делать. Я-то по незнанию уже увидел этот список констант, а надо, чтобы писал человек, который его совсем-совсем не знает...
Вспомнилось небольшое пари, заключённое полтора десятка лет назад между тремя программистами (C, Pascal, FoxPro) после очередного холивара на тему «какой язык программирования круче». Суть пари заключалась в том, что «самым крутейшим языком программирования на эту пятницу» будет признан тот, на котором получится самый короткий исходный код постраничного вывода текстового файла в консоль.
В качестве рефери был выбран гуру отдела, который, оценив изящество и краткость всех трёх вариантов, грустно вздохнул и спросил: «Что же, more %filename% уже не работает?» В общем, с тех пор у меня начисто пропало желание изобретать велосипеды и что-то ваять, если в операционке есть штатное средство для решения задачи.
Я это к чему? Да к тому, что автору истории про сиськи-письки вместо плоского «западлостроительства» не помешало бы матчасть хоть немного изучить. Обои вполне можно поменять двумя командами в пакетном файле, не прибегая к помощи такого монстра, как Дельфи. А то, что системный диск у него не NTFS — это уже совсем не фэншуйно. Так-то!
Писал в Cтудии недавно одну прогу, где элементы должны были менять размер при выборе контекстного меню. При отладке появлялась ошибка: «Operation completed successfully». Microsoft, вестимо, недовольна, что на её продуктах делают рабочий софт!