Мотивация по Иванову Вторник, Окт 9 2007 

Собирался написать о программировании, но не успел и ослаб. Поэтому просто поделюсь ссылками.

Вот тут, тут, тут, и потом ещё тут Андрей Иванов, крупный менеджер нашего местечкового масштаба, пишет о деньгах. Пишет много, проникновенно — невозможно не представить себя на месте описываемого гипотетического программиста и не прослезиться. Рекомендую к прочтению всем, особенно — тем кто работал или работает в LG, или даже руководит там 🙂

Реклама

R/W Lock in Python Четверг, Окт 4 2007 

Кто-то в комментах намекал, чтоб я написал что-нибудь о Питоне. Ну вот, дождались.

Понадобился мне read-write lock. Что это такое? Расскажу. Поскольку не все тут программисты, начну от печки.

Программы бывают многопоточные (multi-threaded), то есть несколько действий могут выполняться как-бы-одновременно. Данные программы доступны из всех потоков; при этом программист, вообще говоря, не знает, когда происходит переключение между выполняемыми действиями. Представьте, например, такую функцию:

def increase():
    global x
    y = x
    ... # сделать много чего
    x = y + 1

Эта функция берёт глобальную переменную х, запоминает её значение, долго что-то делает, потом записывает в х значение, на единицу большее. Представьте, что в двух потоках стартует эта функция, назовём их копия1 и копия2.

  1. копия1 стартует и читает значение х — допустим, оно равно 5. Начинает делать много чего
  2. переключение потока
  3. копия2 стартует и читает значение х = 5. Начинает делать много чего
  4. переключение потока
  5. копия1 доделывает много чего, записывает в х значение 6
  6. переключение потока
  7. копия2 доделывает много чего, записывает в х значение 6

В результате после двух вызовов increase() значение х увеличилось только на единицу. Вряд ли программист будет доволен.

Это и есть Великая Проблема Многопоточного Программирования.

Есть такие сущности, которые позволяют решать эту проблему. Простейшая штука — mutex, он же lock (эй, спецы, есть какая-то тонкая семантическая разница?..). Lock можно взять (acquire) и отпустить (release). Если в одном потоке я его захватил, то другой поток не сможет его взять, пока я не отпущу его в первом, и будет вынужден ждать. Так что если создать какой-то lock и в начале нашей функции increase() его захватывать, а в конце отпускать, то переменная х будет увеличиваться, как надо. (Фактически, два экземпляра increase() не будут выполняться параллельно.)

Да, а read-write lock — это такой lock, который позволяет большому (неограниченному) количеству потоков захватывать себя «на чтение» (реальный смысл зависит от программиста),и только одному — «на запись» (разумеется, нельзя начинать писать, пока кто-то читает, и нельзя читать, пока кто-то пишет). Проблема в том, что простой lock, так же как семафор и кое-что ещё, входит в стандартную библиотеку Питона, а вот R/W Lock, к сожалению, нет.

Ваня поделился со мной одной из реализаций, которая используется в Django, и она уже довольно сильно взорвала мой мозг (чего стоит одна идея инициализировать семафор залоченным состоянием!), но когда мне показалось, что я начинаю понимать, как она работает, чёрт дёрнул меня поискать её в Сети (Ваня прислал мне её файлом). Выяснилось, что RWLock не писал только ленивый, и каждый следующий вариант страшнее предыдущего.

Говорят, чтобы научиться хорошо программировать, надо читать много чужого кода.

Ещё говорят, не сломалось — не чини. Поэтому я пока обойдусь первым вариантом, джанговским. Было бы любопытно сравнить различные варианты, но это может полдня занять, увы. А он уже кончился.

Неприятно, что при постулируемом «batteries included» такой востребованной штуки нет в стандартной библиотеке. Может, добавят?

Хорошо, когда есть, к кому пойти за советом. Знания передаются из рук в руки.

Многопоточное программирование требует аккуратности.

Вот и всё, что я могу сказать о программировании на сегодня. Рассуждать о судьбах блогосферы как-то проще.

Не пиши ты, дурак, процедурами и идентификаторами… Среда, Окт 3 2007 

Иногда нужно бежать изо всех сил, чтобы просто удержаться на месте.

Что я ненавижу в программировании, что можно написать гору кода, и никто этого не оценит. Ну, что там — второй раз за три месяца смайлики выкатили? А сколько сил, сколько умища потрачено на невидимую работу, вы знаете? Удивительно, что вообще что-то работает!

Ещё хуже — с написанием игр. Я несколько раз в своей полной страданий жизни начинал писать игру, обычно — одну и ту же: римейк Warlords. Существующий их клон Freelords уродлив и страдает ползучим фичуритом, распространённым в open-source среде заболеванием; да и вообще — клон нужен не чтобы играть, а чтобы писать. Так или иначе, в последнюю свою попытку я, скрипя зубами, решился делать графическую версию (!) (в отличие от предыдущих ASCII-шных попыток), и даже успел запрограммировать поиск пути (!!) (А* с переменной стоимостью, если кому интересно), но как только начал кодировать зачаточную интерфейсную систему, тут же и сдох. Было это, что ли, с год назад — значит, после Нового Года пора будет начинать снова.

И это при том ещё, что в нашей индустрии считается сравнительно легко воплощать замыслы в жизнь. А если б я был архитектором? Авиаконструктором? Генетиком-евгеником, в конце концов? И то прогресс, что ныне Кони…

Этим меня привлекает веб-дев, что в нём надо меньше писать при большем видимом результате, чем в классическом программировании. К тому же всё написанное мгновенно становится доступно, и — по идее — огромному количеству людей. За большинством успешных проектов стоит более или менее оригинальная идея, и довольно мало кода. По крайней мере, кодирования функциональности как таковой. При этом в сто раз больше усилий может тратиться на поддержание работостопособности инфраструктуры. Мониторинг, тестирование, архивирование, кеширование, оптимизация и т.д. — всё это не видно пользователю, и всё это требует гораздо больше сил и, главное, умений, чем собственно приложение.

Возьмём для примера то же Я.Ру. Функциональность вся достаточно понятная, проверенная годами. Человеку, немного знакомому с SQL и PHP, дай в руки долото — он к послезавтрашнему утру настрогает если не столько же, то уж половину наверняка. Причём он, если обучен, даже сделает всё красиво, по уму: с нормализацией, с иерархией классов, с, не дай бог, паттернами. Но когда дойдёт дело до запуска в массы — даже на таких умеренных нагрузках, как Я.Ру, — тут-то и выяснится, что все его классы и нормализация идут лесом, а надо полпроекта переписать на ассемблере и plain-text файлах вместо базы, половину динамических страниц генерировать в статику уродливым скриптом на перле, а поверх всего поселится мозговой слизень нейронная сеть, самостоятельно определяющая, куда именно пойти очередному пользователю.

И оказывается, что на курсе «Стань вебмастером за 24 часа» учили не так и не тому. И что рисовать в Фотошопе и устанавливать Апач на Винду почему-то не надо, а как опимизировать расход памяти или распараллеливать приложение между серверами, никто не говорил.

Работа ведётся. Трубы Сроки горят, но почти не срываются. Люди стирают руки по локоть (об клавиатуру). Система работает. И когда некоторые, не буду тыкать пальцем, жалуются, что, мол, новых фич мало, или какие-то баги не фикшены, то вспоминаются слова Пронина-дедушки из мультика: «Если б не я, внучок, тебя б вообще на свете не было». А фичи — они придут…

Мур против оптимизации Среда, Сен 19 2007 

Ну и раз у нас сегодня пошла такая пьянка, напишу-ка я и насчёт программирования немного.

Сегодня утром обнаружил свежую осмысленную статью Джоэла Спольски (Спольского? Та же хрень, что и с Чонтофальски; anyway…), посвящённую перспективам развития веб-приложений. Так, для справки: Джоэл — программист (руководил разработкой MS Excel), предприниматель, израильский десантник и кибуцник, а главное — отличный эссеист на околокомпьютерную тематику. У него вышла пара книжек, и блог его читают, наверно, миллионы. Правда, последнее время он пишет мало (кроме как о своём гешефте), но вот, наконец, разродился.

(тут я, стесняясь, ставлю кат. Кто читает по RSS, не судите строго — уж больно много букв получилось!..)
(далее…)

О HR и о комментах Понедельник, Сен 10 2007 

Хотел написать комментарий Яше, но так как он подлым образом не позволяет комментировать анонимно или по OpenID, напишу тут. Что, кстати, хорошо согласуется с популярной среди A-List блоггеров концепцией, что комментировать нужно в собственных дневниках, а комменты как таковые отключать (аргументы: если человек имеет сказать что-то стоящее, то он тем самым создаёт некую ценность, и вполне разумно, если эта ценность будет прибавлять веса его собственному дневнику; если же он хочет только отметиться lol-ом или плюс-один-ом, то зачем вообще такие комменты; целостность же дискуссии должна обеспечиваться пингами/трекбэками — предполагается, что приличные блоггинг-платформы их поддерживают). Итак, пара мыслей про HR.

HR, по моим представлениям, грустить не должен. Собственно, он только-только должен появляться, настоящий менеджер по кадрам. Если несколько лет назад люди ходили толпами и просили дать им пару сотен на пропитание, то настоящий толковый HR-менеджер не был нужен. Закидывай себе невод да вытаскивай золотых рыбок. Поэтому поиском сотрудников и занимались люди, к делу непригодные. Мои дорогие лыжники, конечно, вспоминают славного нашего Андрея Львовича, которого, кажется, кроме корпоративных попоек да ухлёстывания за бухгалтерией, ничего не интересовало. И тем не менее сотрудники были, приходили новые, жизнь бурлила. Теперь же, если действительно есть кризис, наконец пришло время засучить рукава и поработать.

Что может делать настоящий Менеджер Человеческих Ресурсов? Работать комиссаром — общаться с коллективом, стараться их чаянья по возможности проталкивать в жизнь, а если нет возможности — объяснять, почему. Раскидывать сети — заниматься хэдхантерством в хорошем смысле слова. Выяснять сравнительные преимущества конкурентов (и избавляться от отставания, по возможности). Потому что говорить, как нам говорили: «составьте список требований, обсудим» — это смешно. Если доходит до того, что я вынужден своему начальству выдвигать требования, чуть ли не забастовки проводить, — значит, кто-то другой не сделал это за меня.

Разумеется, это совершенно другая работа, чем кадровик при советской власти. Это вам не бумажки перекладывать. Но это интересная ип сложная задача, в которой, может быть, и я бы хотел себя в какой-то момент попробовать. А говорить, что HR грустит — это как сказать, что грустят PHP-кодеры, которых вдруг заставили на С моделировать атомную бомбу. Найдите новых людей, и всё будет.

Впрочем, исходная-то проблема в уровне программистов. Мало толковых людей (везде), что поделать. Но это в консерватории надо что-то подправить, где-то с яслей начиная. Тут, конечно, одним HR-ом не обойдёшься.

О сложных системах Пятница, Авг 24 2007 

Легко видеть, что создание сложных инструментов для решения простых проблем порождает другие, более сложные проблемы. Которые в общем случае решаются дальнейшим усложнением тех же инструментов, и т.д.
(далее…)

Хакерствуем помаленьку Среда, Авг 15 2007 

orw.py понемногу продвигается. С прошлого раза немного, только разобрались с Кабанчиком, почему не работал jabber-информер через GTalk (попутно вырос список зависимостей), зато, наконец, выложил на Subversion. На сервак, рекомендованный Крокодилом (адрес http://theigel-svn.cvsdude.com/orw/ ) — правда, там не получается настроить read-only аккаунт, поэтому логин-пароль просите лично. Наверно, потом перееду в более разумное место.

ORW.py объявляется открытым! Пятница, Авг 3 2007 

Ура! Продукт двухвечернего засиживания на работе объявляется открытым! (Открытым для публики и открытым в смысле open-source, разумеется 😉 )

Тупая-кривая, но всё-таки уже немного работающая программа orw.py для вылавливания раскупленных железнодорожных билетов перед вами! Название происходит от сайта express.orw.ru, с которым и ведётся работа (с rzd.ru работать было бы гораздо тяжелее, у них там всё совсем через одно место). Написано, грешным делом, под линуксом, на питоне, да ещё с библиотеками всякими — несчастным виндузятникам будет, наверно, непросто её запустить…

В любом случае — ура, товарищи! Благодаря этой программе я еду завтра (ахтунг, уже сегодня!) в Питер на плацкарте, и на плацкарте же, благодаря ей же, в понедельник возвращаюсь! А ещё через несколько вечеров я стану вообще королём билетных касс.

Засим прощаюсь, пора спать.

Кайф в деталях Среда, Авг 1 2007 

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

с миру по ссылке Вторник, Июл 25 2006 

То ли я такой ограниченный, то ли действительно нет в мире совершенства. Я уже лет шесть интересуюсь происходящим в Сети, но удивительным образом круг моего чтения прискорбно ограничен. Буквально полдюжины человек в моих закладках, и многие из них пишут редко. Конечно, мне хочется, чтобы и тема была интересная (не про то, как драйверы загружать или диски форматировать), и написано было живо. Но ведь разве ж я многого прошу? Или все хорошие компьютерщики работают с утра до ночи, и с изящным слогом не в ладах, и только балбесы вроде меня любят писать (да не знают, о чём)?

Так или иначе, а сегодня за чтением Джоэля Ивановича Спольского обнаружил еще одного человека в ближайшем своём окружении, который знаком с этим автором. Нигде — ни на гугле, ни в эм-эс-дэ-эне, ни на яху! — не написано: «всем читать Джоэля», а все почему-то читают. Все читают Нильсена. Зельдмана. Хикси. Мейера. И еще, наверно, полдюжины человек, которых я не знаю или по каким-то причинам не читаю. «Все» в данном случае — это кто? Ммм. Какие-то блоггеры, на которых я натыкаюсь (одна тусовка!). Российские скучающие веб-мастера, которым нечем заняться, кроме как переводить чужие статьи на спорный русский. Отчасти — мои коллеги, профессиональные программисты (с образованием — не то, что некоторые…). Разные люди.

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

  • Jeffrey Zeldman — хозяин веб-студии, автор Designing With Web Standards, редактор A List Apart.
  • Eric Meyer, специалист по CSS, автор нескольких книг.
  • Ian Hickson, тоже CSS-эксперт, сотрудник Google, а прежде — Opera.
  • Joel Spolsky, автор книг и статей о программистском бизнесе, в прошлом — сотрудник Microsoft, ныне self-employed.
  • Jakob Nielsen, признанный главный эксперт по web usability.
  • Mark Pilgrim, (блин, кто же он?) автор Dive Into Python и Dive Into Accessibility, видный деятель Сети (гы-гы, я правда не знаю, почему он крут, но это факт).
  • Tantek Celik, выдающийся тыры-пыры бывший руководитель разработчиков MSIE5.x для Mac (тогда этот браузер, говорят, отличался прекрасной поддержкой стандартов и всё такое — не то, что виндовская версия), ныне ключевая фигура в Technorati — системе, во многом создающей нынешнюю мировую блогосферу.
  • Peter-Paul Koch, мировой эксперт по CSS и Javascript, и по их поддержке браузерами.

Эти люди сформировали мои представления о Сети и программировании в целом (слава богу, я не программист), и их я, в основном, почитываю. А больше, как будто, и некого… Вот разве что недавно натолкнулся на Robert Cringely, но это всё же фельетонистика (хотя пишет, чертяка, захватывающе — когда тема хорошая).

И ещё одна — последняя на сегодня — ссылка. Просто так, порадовала меня эта статистика: какой браузер быстрее всех? Конечно, Опера.