Робинзонада

Пожалуй, в этот раз меня больше всего подгоняло осознание того факта, что за прошедшие сто тыщ мильёнов лет не довёл я до логического конца (что уж говорить о совершенстве) ни одного стоящего проекта. Хватался за многое, чуть подправлял там, переписывал тут, ничего путного и осязаемого, ничего целикового. Оставалось припомнить только одно не самое удачное собеседование, чтобы навсегда потерять покой и обресть телесный зуд.

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

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

Задача была относительно проста. Сервер (Java) шифрует по стандарту S-63 и хранит электронные карты, выдаёт их, выбирает обновления и шифрует ключи для пользователей. Объем данных небольшой, примерно два-три гигабайта на всё про всё со скоростью прироста в десяток-другой мегабайт в неделю. Поэтому нет никаких специальных хранилищ, все файлы на файловой системе. Клиенты (GUI на плюсах, робот на C#) грузят в сервер карты и достают их оттуда. Объем средней выборки не превышает шесть сотен мегабайт. Всё тряхомудие предусматривалось изначально для внутреннего пользования, но по ходу движения выяснилось, что придётся отдавать на сторону, и даже более того, изображать из себя коммерческий продукт со всеми вытекающими (по этому поводу даже в Индию пришлось прокатиться). За полгода до этого в братской конторе задались похожим вопросом, но ответили совершенно неприемлемым на мой вкус образом, может, расскажу как-нибудь под пиво. Опять же, их там было человек десять, включая аутсорсеров и тестеров. Мне предстояло справляться одному.

Ну да, ну да, было крайне непрофессионально делать так, как я сделал. Команду-то всё равно не дали, присмотр был минимальным, и я поставил, наверное, максимальное за всю предыдущую карьеру количество экспериментов на живом проекте. Начать хотя бы с того, что для RPC используется кодогенератор из апачевского инкубатора. То есть вполне себе такая подвижная бета (на ней, конечно, крутится пара приличных сервисов, но это не оправдание). Сервер — на Java, которую я знаю чуть менее, чем совсем никак. Плюс ко всему СУБД для всякого каталожного труда, на которую, учитывая полную атрофию SQL за неиспользуемостью, был натянут примитивный ORM. И всё это для повышения градуса кроссплатформенно (что, правда, на излёте всё же было отправлено на второй план, ну да это временно). Мужчина без риска как сосиска.

Что мы имеем в сухом остатке? Самым восхитительным, упоительным, вдохновляющим и успешным экспериментом оказался в итоге thrift. Кто один раз такое попробовал, уверует в серебряность пули DSL вовеки. Какой DCOM, какая CORBA??? Ничего личного лишнего, пять сотен строк примитивного псевдокода для описания интерфейса (большинство — развесистые комментарии) плюс легчайшая библиотека поддержки для http-транспорта, — и опля, волшебство заиграло. Клиент на С++, сервер на Java? Пожалуйста. Ещё один клиент на C#? Да на здоровье, добавим опцию в кодогенерацию. Что такое? Изменить интерфейс RPC? О ужас, мне потребуется целых две минуты. В топку XML-RPC, в топку .NET Remoting. Минимум проблем, максимум профита. Я, помнится, давным давно в запале юношеского нигилизма осудил, не читая, всяческую кодогенерацию в языки высокого уровня. Ну в самом деле, если приходится мегабайтами плодить довольно невнятный, неизящный и однообразный код, думал я, значит что-то не так с архитектурой. Вот взять, к примеру, COM микрософтовский. Как минимум без ATL-шаблонов в здравом уме ни один человек не согласится туда с голой жопойыми руками зайти. А что есть ATL-шаблоны, как не тяжеловесный кодогенератор, унавоживающий ажурные программные постройки кубометрами addref/release’ов и прочих queryinterface’ов? То есть если всех этих тошнотных подробностей можно избежать на уровне ATL без потери управляемости, то какого же ху это нельзя сделать прямо сразу, на рабочем уровне? Но теперь я определённо перековался. Что нельзя предотвратить, надо организовать. Если жизнь заставляет общаться с системами, интерфейс которых провоцирует распухание обвязочного кода, надо прятать их за кодогеном. Это дёшево, надёжно и практично.

    Второе открытие (не, ну лучше поздно, чем ещё позже) — Java, хотя тут, конечно, сильно прибавил очков феерический NetBeans, оказавшийся на порядок более логичным и дружелюбным к нубам, нежели распиаренный Eclipse. Если отбросить всякую слюнявую банальнщину про кубики и лего, то многопоточный неблокирующий сервер заработал довольно быстро, спасибо Tomcat’у и Hibernate. Другое дело, что любой Многописал Наджава уссытся со смеху, наверное, глядя на код, но страшных косяков в нём не много, и я почти все знаю. Опять же, производительность могла бы быть и повыше, дык зато и реалтайм не требовался. А вот чтоб мне в трусах по воскресеньям в контору не нестись поднимать упавшую базу, это требовалось. Java ваша, конечно, чуть менее, чем полностью — это библиотеки, коих хренова гора, на каждый чих по пять штук. Чувствуешь себя даже не на плечах, а на стремянке стоящим, причем со всех сторон поддерживают, а внизу мягко падать, ежели что.

Добрым словом можно помянуть SWIG (тоже своего рода DSL, для низкоуровневой связи компонент), волшебный клей, чудо чудное, позволил мне втянуть в Java-код две нативные библиотеки. Правда, уродские правила загрузки JNI-модулей в Tomcat до сих пор мне покоя не дают, но ведь работает, зараза! Также в белом списке монстро-библиотека gdal, благодаря которой удалось избежать использования окаменелого компанейского говна, к которому я три дня пытался заходить с разных сторон, но отчаялся отчудить из монолитных прикладов, в которые оно врыто (к слову, целый специальный человек сейчас расковыривает эти ископаемые и, матерясь и потея, пытается найти жемчуг и портировать его на Linux — второй месяц пошёл уже, если я не путаю). Как это водится в опенсорсе, последние изменения в коде карт S-57 делались хрен знает сколько лет назад, и побагфиксить пришлось (даже подумываю им туда патчик заслать, на тему чтения юникодных строк в файлах ISO-8211, вай-вай, как неаккуратненько), но времени драгоценного было сэкономлено тьма.

В адову топку отправляется WTL, непригодный по факту для написания приличного кода в одиночку. Пусть его авторы сами рыскают по стеку в поисках просранного где-то в недрах иерархии эвента от какого-нибудь edit-box’а, который из-за этого толком не умеет показать, что редактирует. Постоянная нужда в смешивании подходов при отправке событий от каких-нибудь фоновых потоков в оконный и макросовая перекличка окон между собой просто с ума меня сводили. Плакал над .NET-овским Invoke потом полдня слезами счастья. В итоге GUI-клиент к серверу сожрал чуть ли не половину всего проектного времени, был один раз целиком переписан и всё равно меня совершенно не удовлетворяет, ибо многословен, изрядно запутан и багоопасен во многих местах. Сижу теперь как известный осёл, выбираю между Qt и .NET. В первом всё же с++, а второй хоть и тормозит, зато плохо портируем.

Впрочем, запутанность клиента цинично, но недвусмысленно указует ещё и на убогость человека, его программирующего. Декомпозиция по-прежнему моё самое больное место. Сколько я туда ни прикладывал толстых книг и не смазывал бест-практисами, один хрен выходит плохо. Глаза б мои не глядели, начиная с рандомного выделения и именования сущностей и заканчивая общей дуболомностью и примитивизмом архитектурных решений. Можно оправдываться, конечно, жёстким цейтнотом и неожиданно добавляющимися по ходу движения требованиями, но у кого по-другому? Срочно, срочно меня в команду, к звёздам, обучаться методом макания, хехе.

28 комментариев

  1. Многобукв

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

    С гуем же проблема стара. Быстрый (в обоих смыслах) гуй пока не виден. Те же рекомендации: можно на wpf и взглянуть.

    • Re: Многобукв

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

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

      • Re: Многобукв

        Так я и говорю быстрый и в смысле разработки =)

        А у хороших негров можно научиться трудолюбию. Главное алергию не заработать.

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

      Опасность быть замурованным в этом проекте, конечно, есть. В Т это очень распространённая практика, ты ж в курсе: сделал — ну и сам дурак, сиди теперь, сторожи.

      • > сделал — ну и сам дурак, сиди теперь, сторожи.

        Ну, такой зоопарк сто пудов нуждается в охране 🙂

        Как зовется кстати?

        • Кто зовётся? Проект?
          В охране он не особо нуждается, на мой взгляд. Ну так, может, чуточку документации ещё добавить — и можно отпускать.

            • Индусы вот тоже очень интересовались. Есть ли, спрашивали, название у вашего продукта? Он называется «ну тот сервер, что вместо 7Cs-овского теперь карты шифрует». Глубоко внутри меня он называется Vault, но это, я думаю, никому ни о чём не скажет.

    • Юра, ты мне тут свои микрософтовские агитки брось 🙂 Бесплатно, задаром. Ну-ну. Во-первых, всякие веб-приложения сразу в топку. Тем более, которые обещают задаром. Не верю я в это, насмотрелся у соседей. Попытка натянуть функциональность богатого клиента на веб только гуглу более-менее удаётся, да и то, с такими оговорками, что моему проектному бюджету и не снились. Опять же, деплоймент. Нет, и не уговаривайте.

      А про .net я как раз очень думал. Даже очень сильно. WPF, правда, сразу не рассматривал (и, кстати, как показал опыт беты Evernote 3.5, не зря, ой не зря), а WinForms смутил меня тормозами. Хотя в остальном, конечно, всё у дотнета неплохо. В итоге у меня на C# только нагрузочный робот написан.

        • Не, ну чё. Симпатично, да. Но это же yet another js framework. А это значит, что радости закончатся сразу же, как только понадобится, к примеру, засосать и разобрать дерево карт с диска. Или отобразить карту в окне. Я уж не говорю о том, что [почему-то] у thrift’а нет компиляции в js. Всё это допиливание и затачивание немедля развернёт раком все сроки.

          Нене. Web — это интересно, но дьявольски дорого в моём контексте. Пожалуй, учитывая сезонный период возбуждения у индусских заказчиков, обойдусь WinForms’ами.

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

    • wpf на mono, кажись, нет и вряд ли будет (DirectX->OpenGL, гыгы). WinForms явно автора по скорости не устраивают. А веб и SaaS… ну он сам написал =)

        • Ахаха! Кстате, расскажите это отдельным тут товарищам, которые OpenGL в новый картографический движок собираются воткнуть. Видимо, будут сахару на кубе рисовать 🙂

          • Ну, а что означает 3д? Аппаратное ускорение операций на плоскости — то для чего сейчас Direct2D выделили в отдельный интерфейс? Или по-настоящему, по-мужски, трехмерная карта a-la последний Command and Conquer?

            • По идее, для начала ускорение двумерной графики. То, что OpenGL какбе давно умеет, и OpenVG будет уметь ещё сильнее. Оба — внимание — кроссплатформенные стандарты.

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

        • Вопрос тут не в 3d рисовании карт. Вопрос в приличном не тормозном гуе. Карты приложение не рисует (пока?). Мунлайт только к вопросу о вебе.

Добавить комментарий