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. Бывает, коммичу в транк нерабочий код. У всех бывают факапы.
Но, блеать, некоторые их замечают и фиксят.

Комментариев нет:

Отправить комментарий