2013-02-25

программистской мизантропии псто

Почти 5 лет (c 2006 по 2011) я, в основном, занимался одним проектом. Можно сказать, "варился в собственном коде". Да, там есть "странные" вещи, вроде самопального rtti с регистрацией в фабрике, но в целом, смею надеяться, код пристойного качества.
С начала 2011 года поучаствовал в полудюжине проектов, как доставшихся "в наследство", так и новых, как целиком проприетарных, так и использующих opensource библиотеки. И что-то с каждым таким проектом мне все грустнее...

Пытаюсь понять, что движет:
  • людьми, разрабатывающими пакетный менеджер под embedded-систему, который не проверяет, достаточно ли свободного места для установки пакета.  И который, когда место заканчивается, оставляет систему в невалидном состоянии:
    • Raspbian: попытка освободить место через `apt-get remove что-нибудь` требует `dpkg --configure -i`, который пытается уставить те самые пакеты, которым не хватило места.  Хорошо, что пишка грузится с карточки, которую проще залить заново с образа, чем разбираться с глюками.
    • Angstrom: opkg ведет себя еще веселее, игнорируя ошибки установки пакетов, а потом, поскольку один из пакетов был "системным", перезагружая устройство. Которое у меня больше не завелось.
  • человеком, пишущим библиотеку, в которой все контейнеры хранят void*,  вместо enum везде используется int, но поля to, from, cc, bcc в заголовке e-mail имеют разный тип:
    struct env_to { list * to_list; };
    struct env_from { list * from_list; };
    struct env_cc { list * cc_list; };
    typesafety, чо.
    Ну, и предлагающим использовать функции вроде
    imap_search_key_new(IMAP_SEARCH_KEY_UNSEEN, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
  • людьми, радикально меняющими апи в минорном апдейте.
  • мейнтейнерами/авторами библиотеки, последняя версия которой в дистрибутивах Linux (и в Mac OS X) содержит ошибку, не позволяющую работать с буфером больше 64 кБ. Ошибке уже больше года, и не смотря на то, что она давно исправлена в master, в недавно вышедший апдейт ее фикс не вошел.
  • давно уже  не джуниором, который пишет на языке, где все функции виртуальны, код:
    void Shape::draw() {
      switch (this.kind) {
      case KindRect: ((RectShape)this).draw(); break;
      case KindCircle: ((CircleShape)this).draw(); break;
    ...
  • людьми, которые поучаствовали в десятке проектов, были lead developer-ами на двух-трех из них, но при этом стабильно плодящими копи-пасту в своем коде. 
  • людьми, которые думают, что пишут на С++, потому что используют слово class вместо struct и new/delete вместо malloc/free.
  • человеком, который после, ЕМНИП, 2-х лет работы подошел ко мне, и спросил: "как пользоваться svn"
  • людьми, заводящими массив констант на 3,5 KLOC. Который нужно обновлять вручную пару раз в месяц.
  • людьми, чьи классы так плотно завязаны друг на друга и платформенно-зависимый код, что попытка собрать часть проекта на другой, пусть и родственной платформе обречена на провал.
Нет, я, конечно, тоже не д'Артаньян. Бывает, допускаю memleak или double free в С или Objective-C. Бывает, коммичу в транк нерабочий код. У всех бывают факапы.
Но, блеать, некоторые их замечают и фиксят.

2013-02-14

Маконенависти очередной псто

Читая RSS, наткнулся пост "что вам нравится в МакОС" на ДОУ. Первым пунктом было:
 Типографика. Алгоритм сглаживания шрифтов в Mac OS настолько хорош, что я искал и ставил специальную программу для Windows, «чтобы было похоже».
На что моей первой реакцией было "лолчто?!" Сглаживание шрифтов в МакОС (а особенно в XCode) меня дико раздражает.  Кстати, интересно, как AppCode удается быть менее ШГ,  используя тот же шрифт, что и XCode?.
Ах да, наверное, если бы у меня был не обычный монитор, а Apple Cinema или MacBook c уриной ретиной, я бы считал по-другому.

 "Гуй застрял в 90х! -- Вы хотите странного и это не нужно".
Развернуть окно на пол-экрана (фича, которая из маргинальных тайловых менеджеров давно перекочевала в гламурный гуй вроде Unity или Win7) -- "А это нужно? Можете описать юзкейс?" Хотя и привели в комментах парочку программ (одну платную, и одну бесплатную), которыми это можно сделать. При этом на сайте бесплатной про клавиатурные хоткеи написано 2 предложения, все остальное -- touchpad gestures).
Развернуть окно, свернутое в док -- "Используй силу мышку, Люк". Ctrl+F2, W, вниз до конца, выбрать из списка, Enter -- весьма эргономично, да. Да и в целом -- мышкой возить приходится на порядок больше, чем в Windows/Linux, что раздражает.
Наверное, будь у меня не трекбол, а Magic Mouse или Magic Trackpad, я бы считал по-другому.

Маковские хоткеи.. О... Особенно в альтернативно одаренных программах вроде XCode. Вообще, разработчиков XCode после смерти в аду будут ждать какие-нибудь дешевые раздолбанные Chicony (нормальных old-school Mitsumi они не заслужили), на которых они должны будут перенабрать код XCode в XCode. И никаких мышей, не говоря уже про тачпады. Попробуйте переключиться на другой файл с клавиатуры. "Используй мышку, Люк".
Поведение Home/End/PgUp/PgDown -- не такое, как в Win/Linux. Think different.
Command, которая основная мета-клавиша, обычно забиндена на Windows key. После месяца-двух работы под OSX начинает болеть левая рука.
Ах да, будь у меня не эргономичная микрософтовская клава, а Apple Keyboard, я бы считал по-другому.

Неспешность. Как оказалось, я не один такой, у которого более-менее современный мак (i5, 4 GB DDR3 1600) тормозит при одновременно запущенных XCode и AppCode. Которые съедают ~500 Mb  и 1 Gb памяти соответственно. При этом free memory ~ 100-200 Mb, inactive memory ~ 500 Mb, но своп в 2-3 Gb присутсвует. Ах да, будь у меня больше памяти и SSD винт, я бы считал по-другому.

iTunes. Помню время, когда он был пусть и перегруженным комбайном, но еще вполне юзабельным. Я даже им пользовался под Windows. А сейчас... Можно поставить другой плейер, но чтобы iTunes не запускался по нажатии кнопки play на клавиатуре, нужно патчить или переименовывать бинарник одного из системных сервисов.

Objective-C. Попытка скрестить скорость C и ООП-идеологию SmallTalk. Язык, который был неплох на момент своего изобретения, но сейчас... Да, язык развивается, ручное управление памятью ушло в прошлое, уступив ARC, появились блоки ака замыкания. Только вот GC и блоки были в исходном Smalltalk-80.
Отдельно доставляет многословность языка. Когда пишешь (утрирую):
NSMutableArray * mutableArray = [NSMutableArray mutableArrayWithCapacity:...];
так и хочется откомментить: "DRY? Не, не слышал."
Ну, и имхо,
fs::path prefix = "/usr";
fs::path bin_prefix = prefix / "bin";
читабельнее, чем
NSString * prefix = @"usr";
NSString * bin_prefix = [prefix stringByAppendingPathComponent: @"bin"];

Когда в rss-ленте читаешь про хаскель, алгебру типов, зависимые типы, Agda/Coq/Идрис, монады там всякие и прочий матан, а потом пишешь код на слабо-типизированном языке, который местами даже "stringly-typed" --  где аналог LINQ выглядит примерно как ...
NSArray * expired = [tasks filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"expirationDate < %@", [NSDate date]]];
Когда пишешь на динамическом языке без REPLа...
Когда в динамическом языке при некоторой доле невнимательности все же можно добиться SIGSEGV, таки разыменовав нулевой указатель...
Когда читаешь про transactional memory и минимизацию сайд-эффектов для распрараллеливания, а потом работаешь с обьектами, для которых не то что модифицировать, но даже читать(Привет, CoreData!) свойства в других потоках нельзя...
Это грустно.



Ах да, если бы меня покусал Стив Джобс, я бы считал по другому. :)

Справедливости ради, к плюсам OSX можно отнести
- наличие Unix окружения,
- предустановленные perl/python/ruby
- ненужность антивирусов