Programming, AI, Machine Learning, and Life

Архив постов на русском

На чем программируют суровый ML в Гугле

В 2015 году Гугл выпустил TensorFlow - супер-современный фреймворк для машинного обучения, созданный с участием самого Jeff Dean.

Но если почитать статьи за последние несколько лет из Google/DeepMind, то можно заметить что эксперименты реализованы с использованием совсем другого малоизвестного фреймворка JAX и лишь в самом конце портированы на TensorFlow/PyTorch. Именно с помощью JAX тренируют гигантские нейронные сети: текстовые, computer vision, мультимодальные.

Python - самый популярный язык программирования

В далеком 2009 году я решил вернуться в роль инженера из роли менеджера. Начал смотреть по сторонам - на чем пишут самые крутые компании и люди. Помню как выписывал в текстовый файл заметки - Гуглу нужен Javascript, Python, Java, C++. Из всего этого списка я только не работал тогда с Python. Мой приятель Алексей Кинёв был в то время фанатом Django (Python web framework) и рассказывал невероятные истории про свой опыт использования языка и фреймворка.

Я скачал какую-то книгу, прочитал до середины, начал писать разные упражнения, а потом прошел tutorial Django. Так несколько дней спустя у меня уже работало веб-приложение, в котором не было страшного количество конфигурационных файлов как в Java, минимум слоев абстракции. Читать и модифицировать исходный код было легко и приятно. Сообщество и доступные библиотеки тоже очень радовали. После нечитаемой документации корпоративных инструментов сложно было поверить, что бывает иначе. В любую свободную минуту я открывал документацию на python.org и читал-читал-читал.

Хорошие книги за последние 3 года

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

Вдохновленный совсем свежим перечитыванием второго издания Death March, я сортирую книги на must read, should read, could read.

Must read

Death Match by Edward Yourdon

Как не сгореть в проектах с нереальными требованиями и сроками. А еще лучше - как в такое счастье не вступать вовсе.

Помню как читал эту книгу лет 17 тому назад и было уже тогда круто. Сейчас перечитал сугубо из практичных соображений (жизнь такая) и очень рад что это сделал.

Последние 20 процентов можно пропустить.

Four thousand weeks by Oliver Brukeman

Только глядя на название и зная что книга вроде бы про time/project management (которые я как настоящий программист ненавижу всеми фибрами моей тонкой души), у меня родилось ужасное предчувствие унылости: пишите списки, просыпайтесь раньше, не делайте пауз, чаще встречайтесь чтобы обсудить прогресс и майлстоны.

Но нет! Философская честная книга про конечность жизни и бесконечность списков дел.

Интересные свежие книги

Обзор интересных книг, которые я прочитал в последнее время. Большинство из них довольно свежие, опубликованы в последние год-два. Парочка имеет потенциал стать классическими.

DevOps и новые правила игры технологических компаний.

Accelerate

Accelerate: The Science of Lean Software and Devops: Building and Scaling High Performing Technology Organizations. Nicole Forsgren Phd, Jez Humble, Gene Kim.

Авторы подтвердили причинно-следственную связь между различными популярными практиками из мира Agile/DevOps и производительностью организаций. Часть книги - описание их сурового метода. Вроде бы умники еще не опровергли их метод, поэтому читать стоит.

Новые тренды и классика

Я был свидетелем многих революционных технологий. Объектно-ориентированное программирование, новые языки программирования, Веб, распределенные приложения, server-side и client-side frameworks, мобильные приложения, геолокация, машинное обучение. Было и немало нишевых технологий, например от Microsoft, которые создавались как будто только для того, чтобы разработчики тратили все свое время на обновление прошлогодних программ.

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

Рабочая этика

Я не такой уж новый человек в Швейцарии. Я приехал сюда пять лет назад и за эти годы изменилось многое. Стали менее чужими местные языки, появились новые друзья. Я часто встречаю знакомых на улице и в горах: соседей, родителей и учителей из школы, коллег, соратников по спорту. Мои представления о жизни в родном Казахстане уже устарели - мне кажется что там живут примерно так, как живут рускоязычные сотрудники цюрихского офиса Google.

Мне повезло пожить в разных местах: в алтайских горах; в северном Казахстане с суровыми зимами и жарким летом; в райском Алматы с горами-велосипедом и офисом, до которого 5 минут пешком; в стране чудесов без тормозов Москве; в более расслабленном Киеве.

Баланс работы и личной жизни

Как-то беседуя с приятелем Сашей о карьере в Гугле, я выдал, что не планирую повышения по карьерной лестнице, потому что много других забот - немецкий, интеграция, дети. Саша сразу же среагировал, что я говорю про совсем другое - про “work-life balance”. Я покивал, подумал, и забыл. Никакого полезного отклика тогда эта фраза во мне не произвела.

Постепенное снижение производительности (снова про системы)

Продолжая читать Thinking in Systems, я добрался до главы “System traps… and opportunities”. Там описываются интересные системные эффекты, когда системы идут вразнос и казалось бы очевидные попытки починить делают все еще хуже.

Policy resistance - в коммунистической Румынии запрещают аборты в попытках повыстить рождаемость, а вместо этого рождаемость падает из-за резко увеличившейся смертности женщин после абортов в подпольных условиях. И примеры других стран (Швеция), когда вместо этого разбираются в ситуации падения рождаемости и постепенно создают условия для рождения и полноценного воспитания дополнительных детей.

The tragedy of the commons (это выражение я часто встречал в разных статьях, но не знал точного значения) - общий ресурс, который ничего не стоит, осваивается быстро и жадно, без заботы о его жизнеспособности. В результате ресурс умирает безвозвратно, либо его восстановление стоит безумно дорого и занимает долгие годы. Примеры - безконтрольный вылов рыбы приводит к снижению численности особей до критического уровня, начиная с которого вид начинает вымирать; выпас скота на общем пастбище, когда жадные фермеры доводят пастбище до состояния вытаптанного полигона.

Escalation. Я ее слегко покритиковал, она резко ответила, я припомнил ей вчерашнее, она назвала меня неудачником, …, пять минут спустя мы швыряем друг в друга тарелками. Тот же эффект гнал гонку вооружений в период холодной войны.

Почему системы так хорошо работают

Thinking in Systems, book cover

Читаю книгу Thinking in Systems, A Primer, на которую наткнулся в гугловых рекомендациях для инженеров. Книга - бомба! Короткая, по делу, открывает глаза на структуры и процессы в больших компаниях, сложных инженерных проектах. Полезна и для дизайна распределенных систем, и для навигации внутри больших компаний.

Глава 3 вообще оказалась про то, о чем я давно размышлял. В последнее время я замечаю много дискуссий на эти темы как внутри Гугла, так и среди друзей в других компаниях и некоммерческих организациях. Эти дискуссии - в основном о (вреде) иерархий и важной роли самоогранизации.

И тут я читаю, что иерархию придумала природа как замечательный и необходимый инструмент борьбы со сложностью. И я ведь из проектирования программных систем это знаю на практике, в том числе про то, что связность внутри компонентов может быть большой, а зависимость между компонентам небольшой и четко определенной. И про то, что сверточные нейронные сети (convolutional neural networks) работают так хорошо именно потому, что они оперируют иерархиями фильтров, распознавая таким образом иерархическую природу изображений (зрачок-радужка-белок-веки собираются в глаз, глаза-нос-рот-волосы собираются в голову, голова-тело-руки-ноги в человека, много человек в группу и т.п.).

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

Как запрыгнуть в поезд глубокого машинного обучения

В 2011 году MOOC классы ml-class.org и ai-class.org в 2011 году взорвали мне мозг (см блог пост того времени).

  1. С компьтерами можно делать еще более интересные и сложные вещи, чем я думал
  2. Всему этому можно научиться сейчас, не переживать что в университете изучал что-то совсем другое (у меня диплом инженера-электрика)

Я решил что нужно изучать это все удивительное и интересное, что называется Computer Science и искать работу, где бы я занимался этим целыми днями. Так год спустя я проснулся в цюрихском отеле, уставший после 3 дней автотрипа Киев-Цюрих, позавтракал и пошел на свой первый рабочий день в Google.

В Гугле я со временем дорвался до возможности реализовывать и улучшать сложные алгоритмы в системах работающих под огромной нагрузкой. Следующее мое большое желание - залезть в глубокое машинное обучение (Deep Machine Learning). Я имею в виду именно convolutional neural nets, RNNs, куча слоев, residual nets, нелинейные активационные функции. Работа с картинками-видео-звуком, неструктурированным текстом.

В нашем офисе проектов с Deep ML очень много, но меня останавливала разница в моих навыков и навыками ребят, которые в них работают. Как правило это PhD, читающие статьи с кучей математики за кофе, попутно делая в уме wavelet transforms. Поэтому я не бросился с головой в один из таких проектов, хотя может быть просто была куча других забот (интеграция, изучение языков).

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

Problem solving на примере шахматных этюдов

Перед праздниками не особо хотелось изучать серьезные вещи по вечерам и я стал искать игры для любителей поломать мозг. Одним из открытий для меня стал шахматный сайт lichess.org.

Lichess screenshot

Там есть очень аддиктивный режим тренировок. В этом режиме сайт подбирает для тебя интересные шахматные проблемы, в которых одна из сторон допустила ошибку и нужно найти последовательность ходов, чтобы этой ошибкой воспользоваться. Сложность проблем подбирается такой, чтобы ты смог их решить, лишь основательно поломав голову.

Просидев несколько вечеров в режиме “вот решу эту задачку и тогда уже точно пойду спать, (решив и получив заряд радости) - ну вот эта точно последняя”, я начал замечать некоторые параллели с рабочими задачами.

Управление временем vs. управление энергией

Time AND Energy

Вот уже много лет у меня столько дел, что их никак все не переделать. А с рождением детей обязательных занятий стало еще больше, времени на баловство не осталось совсем. Спортзал? Некогда, и так кое-как с работы прихожу, а тут еще с детьми возиться, заниматься работой по домой, а потом уже никаких сил не остается. Образование? Только забирая время у сна и работы.

Но как-то раз я удачно попал на внутренний гугловый класс, где как раз работали с подобными проблемами. Помню слайд про Time Management. Что со временем ничего не сделать, его 24 часа в сутках и все. Но зато есть Energy Management - управление своей энергией. Если сил много, то многое можно сделать быстрее, веселее, лучше. Что толку, что я выкрою час вечером, если “я и без того на работе устаю, у меня еле-еле сил хватает телевизор смотреть” (c).

Смена адреса vorushin.ru -> vorushin.github.io

Мне стало сложно оплачивать продление аренды доменного имени из дальнего зарубежья - RBK Money и Yandex Money принимают только карты из некоторых стран СНГ. Поскольку vorushin.ru я использую теперь только для этого блога, то после третьей попытки оплаты через знакомых решил больше не заморачиваться. Примерно через месяц постоянным адресом этого блога будет vorushin.github.io. Уже сейчас работает переадресация. Если читаете блог через агрегатор - пожалуйста обновите ссылку. Прошу прощения за неудобства.

Чем особенна работа в Google

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

Технологии

Очень много собственных технологии. Слава богу хоть языки программирования используются общедоступные (хотя немало и внутренних языков). Первое время много времени уходит на их изучение, что воспринимается неоднозначно - “зачем же изобретать так много велосипедов”?! Потом оказывается, что большинство внутренних технологий очень эффективны для проектов планетарного масштаба. Многие гуглеры так привыкают к хорошему, что уйдя в другие компании создают аналогичные технологии.

Некоторые технологии становятся доступными как open source, например система билдов bazel или кластер-менеджер kubernetes. Некоторые можно использовать как сервис через Google Cloud. Было бы здорово строить свой стартап с использованием тех же технологии, что и интернет-гиганты.

Перемены, за и против.

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

В последние несколько лет этих перемен случилось так много, что я стал замечать некоторые закономерности. А совсем недавно я перешел в новую команду, пережив все сложности и радости переходного периода в сжатые сроки.

Интеграция в Швейцарии. Языки.

Наши первые месяцы жизни в Швейцарии были чрезвычайно насыщенными - нужно было учить языки, учиться все бытовым мелочам заново, искать жилье, изучать технологии Google, разбираться с местными языками, городом, горами, регистировать машину, адаптировать детей. Сейчас уже значительно спокойнее, но всё равно очень много времени уходит на интеграцию. Чего всё еще сильно не хватает, это языков. Я изучал немецкий в школе, но как и многие пост-советские школьники, не считал владение иностранным языком чем-то полезным или вообще реальным, а поэтому запомнил только пару десятков фраз, несколько сотен слов и пару грамматических правил. По приезду в Цюрих я мог лишь с большим трудом разбирать простые вывески, а даже перевод небольшого письма требовал долгого сидения со словарем. Спасало то, что Цюрих - интернациональный город, где многие говорят по-английски.

Блог переехал на GitHub Pages

Наконец-то я нашел свободный день и перенес блог из самописного Django приложения на GitHub Pages. Теперь все посты хранятся в системе контроля версий, а при каждом их обновлении весь сайт генерируется и дальше отдается как набор статических страниц.

Прочитать про то, как это сделать, можно найти на сайте GitHub Pages, а посмотреть как у меня сконфигурирован этот сайт можно в git репозитории vorushin.github.io. Вот, например, исходник этого поста.

Мой опыт собеседования в Google

Этим летом я проходил собеседование на роль Software Engineer в Google Zürich. Процесс меня приятно удивил - оказалось, что алгоритмическим задачкам отводится не так уж много времени, а такие важные области как software engineering и software design прорабатываются весьма тщательно.

Я работаю в Google Zürich

Я давно не писал статей в этот блог и причиной тому был переезд. Ровно две недели назад мы выехали на нагруженной под завязку машине из Киева на запад. Четыре страны, три дня и 2200 км спустя мы приехали в Цюрих. Я работаю в Google Zürich, а мои девочки осваивают местные детские площадки, зоопарк и прочие гулятельные места.

Какой совет я мог бы дать себе 20-летнему?

Вчера по дороге из офиса я думал на тему “Какой совет я мог бы дать себе 20-летнему?”. И вот что у меня получилось:

  1. Развивать возможности своего тела, а не только забирать их

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

  3. Активно искать умных деятельных людей и общаться с ними, вдохновляясь на развитие и активность в новых для себя областях

А если бы я советовал себе 10-летнему, то первый пункт стоит заменить на “Ищи хорошего учителя боевых искусств”.

Еще одна отличная книга, "Doug Lea, Concurrent Programming in Java"

Вчера начал читать книгу Doug Lea “Concurrent Programming in Java”. Пусть слово Java вас не смущает - хоть примеры в книге и написаны на Java, принципы, приемы и паттерны применимы и ко многим другим языкам.

Если вкратце, то несмотря на 1999 год выпуска и ничем не примечательное название, книга великолепна. Никакой воды, очень плотный текст. Как будто читаешь связанную серию статей (papers) очень сильного ученого.

А вот отзыв Steve Yegge, из-за которого я когда-то добавил эту книгу в свой reading-list:

The best, most practical book I’ve ever personally read on the subject is Doug Lea’s Concurrent Programming in Java. It got me the most bang per page.

Читаю с ручкой в руках, многое подчеркиваю, многое снова и снова перечитываю. Книга не дает заскучать. Рекомендую!

О статье "Кормление и уход за программистами"

В недавнем дайджесте dou.ua я нашел ссылку на статью The care and feeding of software engineers. Название не особо впечатляло, размер статьи не очень вдохновлял, но я все же начал ее читать. И оказалось, что не напрасно. Многие фрагменты я выделил и хочу поделиться ими с вами.

Встреча с Дмитрием Шаменковым в Киеве

19 апреля в Киеве состоится встреча с Дмитрием Шаменковым, врачом-исследователем, развивающим систему управления здоровьем. Я уже несколько лет слежу за деятельностью Дмитрия. Сначала смотрел видеозаписи его выступлений, потом прочитал книгу, а недавно участвовал в первом вебинаре по его системе.

Upd.Видеозапись встречи - “Дмитрий Шаменков о Системе Управления Здоровьем”

Что у меня нового

После курсов AI/ML я как будто проснулся - обнаружил существование большого количества интересных полезных вещей, которые можно сделать с компьютером. И конечно же захотел их делать. И работать с людьми, которые их делают каждый день. Посмотрел что нужно знать, чтобы попать в какую-нибудь супер-крутую компанию с супер-крутыми перцами.

Get that job at Google. Сколько тут незнакомых вещей!!! Меня никогда не возьмут в Гугл! Надо было учиться не на инженера-электрика в маленьком вузе, а на software engineer в Стэнфорде!

Ну ладно, ладно, вдруг все не так печально.

Grammarly, ищем Natural Language Processing Engineer

С тех пор, как мы переехали в Киев, я работаю в компании Grammarly. Это частная продуктовая компания с офисами в Киеве и Сан-Франциско. Продукты компании нацелены на улучшение англоязычных текстов (spelling-grammar-plagiarism checker, English Q&A community, English Handbook).

Сложности обучения

Учиться тяжело

Хорошее обучение - это выход за границы возможного, делание того, чего не делал раньше. Можно каждый день бегать 3 километра в комфортном режиме и не особо прогрессировать (иногда это нормально, если цель - расслабление после дневной “вахты” за компьютером), а можно каждый раз стараться пробежать немного быстрее и это непросто - не хватает дыхания, силы ног, техники. Можно писать день за днем одни и те же сайты, что и год-два назад, а можно “влезать” в новые проекты, для которых приходится читать кучу книг, изучать новые подходы, новые разделы науки. Результаты и сроки малопредсказуемы, неопределенность - высокая. Можно читать статьи на Хабре и Hacker News (и считать что ты учишься), а можно - прорабатывать упущенные раньше фундаментальные области (например, разделы математики и computer science), читать код ведущих программистов и решать сложные задачи.

Продуктивно ли считать себя самым умным и как решать действительно сложные задачи

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

Про стэнфордские онлайн-классы

Этой осенью я обычно просыпаюсь в 5-6 часов утра, чтобы учиться в ai-class.com и ml-class.org. Позади 6 из 10-ти учебных недель. Уже десяток раз я восклицал “Ну почему же я не начал так учиться год назад?!”. Эти курсы изменили меня - открыли новые интересные предметные области и помогли вспомнить как сильно я люблю математику. Я изменил отношение к университетскому образованию и расширил набор принципов эффективного самообразования, которые собираю на протяжении семи лет.

Programmers at work (1989)

С большим удовольствием читаю книгу “Programmers at work”, выпущенную в 1989 году. Думаю, что она понравится всем тем, кому понравилась книга “Coders at work” (также известная как “Кодеры за работой”). Ниже - некоторые цитаты, которые я уже подчеркнул (а я еще в самом начале книги).

Django Dash 2011, мои впечатления

Понедельничной ночью 1-го августа, примерно в 03:30 пять человек потихоньку укладывали ноутбуки в свои рюкзаки и выходили из офиса чтобы разъехаться по домам. Кто-то на такси, кто-то на своей машине. Еще трое ушли несколькими часами раньше. Закончились двое суток напряженного труда над созданием проектов в рамках конкурса Django Dash 2011.

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

Напишу несколько важных мыслей, которые я сформулировал на основе полученного в конкурсе опыта.

Лев Валкин про Силиконовую долину

Вчера Лев рассказывал про то, что отличает Силиконовую долину от России-Украины и что нам делать чтобы появилась среда, благоприятная для стартапов.

Горизонтальная коммуникация

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

Вертикальная коммуникация: разработчик - менеджер - сейлз - клиент.

Лев Валкин про ФП и Erlang

Вчера ходили с @vseloved и @matveym на выступление Льва Валкина про функциональное программирование в целом и Erlang в частности. Кратко запишу основные тезисы, которые мне очень актуальны.

Новый набор инженерных принципов, непривычных для императивных языков

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

Стоит ли мне работать руководителем?

Меня давно интересует вопрос “Стоит ли мне работать руководителем?”. В прошлую пятницу я был в Москве и разговаривал там с моим одноклассником Костей Кузнецовым. Много лет назад он был для меня проводником в мир компьютеров. Костя сам является отличным программистом, а сейчас руководит командой из 20 человек и скоро станет руководителем собственной компании. Ему это нравится. Есть хорошие руководители-предприниматели в Grammarly, кто-то с программистским опытом, кто-то без. Им тоже нравится то, что они делают. А вчера я прочитал комментарий Алексея Колупаевахороший программист и хороший менеджер - это совершенно разные люди”, который стал последней каплей в этом вопросе.

Неопределенность и страх

Вчера начал работать над новым большим проектом. В нем понятно что нужно получить на выходе, но совершенно не понятно как это сделать. Очень много нетехнических задач, исследований, экспериментов. И я чувствую страх. Страх, что “вот, блин, непонятно что-именно программировать, нужно самому все придумывать”.

Но у меня есть опыт таких проектов, и я помню, что они становятся очень интересными, когда появляется драйв и личная заинтересованность в том, что ты создаешь. Неинтересно устранять неопределенность в той области, которая тебя не интересует. Потому что в этом случае эта неопределенность становится безразличностью. А неопределенность в любимой области называется свободой!

А еще заинтересованность и горящие глаза обычно помогают находить единомышленников.

Django Dash 9-10 июля

Django Dash - международный конкурс, в котором компактные спецназ-команды за 48 часов создают полноценный проект. Правила простые:

  • бОльшая часть кода должна использовать django
  • никакого кода до соревнования (только идеи и бумажные прототипы)
  • команда не больше 3 человек
  • git или mercurial для хранения исходных кодов
  • ваш проект должен быть open source
  • можно использовать сторонние библиотеки
  • нужно использовать pip + requirements.txt или buildout

Интерактивная консоль для pyuno + django

Недавно я писал про то, как работать с документами LibreOffice из питона. Я сейчас работаю над исследовательским проектом, в котором django application обращается к LibreOffice через pyuno. В этом проекте натолкнулся на неприятную ошибку - ./manage.py shell при выполнении любых связанных с pyuno методов выдает сообщение “SystemError: pyuno runtime is not initialized, (the pyuno.bootstrap needs to be called before using any uno classes)”. При этом если запустить python и сделать в нем import uno, а потом вызывать те же методы, что и в ./manage.py shell, то все работает отлично, за исключением того, что не получается обращаться к своим моделям (потому что не инициализировано окружение django).

Рабочий процесс как поход

Вчера в разговоре с коллегой пришел образ гармоничного движения к большой цели. Утром каждого дня нужно находить/создавать интересный маршрут на сегодня. Такой чтобы:

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

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

Особенно это касается таких тонких целей как “повышение энергии/мотивации (passion)”, “повышение производительности”.

Использование Markdown

В проекте Grammarly Handbook, про который я писал вчера, грамматические карточки из формата MS Word нужно было конвертировать в какой-то внутренний формат, чтобы в этом формате было легко добавлять новые карточки и редактировать существующие. Кроме того, нужно было ограничить функционал редактора карточек, чтобы не было чрезмерного разнообразия форматирования и, как говорит наш дизайнер, “верстка была семантической”.

OpenOffice + Python, pабота с файлами MS Word

Пару недель назад для проекта Grammarly Handbook понадобилось импортировать много форматированного текста из документов MS Word. Текст находился в 40 файлах размером от одной до двадцати страниц. Первые несколько страниц я перенес вручную и несколько утомился - механическая работа меня не очень радует. Начал искать возможность читать вордовские документы из Питона.

У меня был очень позитивный опыт с библиотеками xlrd, xlwt. Первая читает документы Excel, а вторая - записывает. Но подобных библиотек для документов *.doc я не нашел. Зато нашел возможность обращаться из Python к OpenOffice. Эту возможность я успешно использовал, успешно импортировал весь грамматический материал и даже наткнулся на интересную идею для нашего основного продукта - инструмента проверки грамматики Grammarly.

В Python 3.x работает старый способ форматирования строк

А старый добрый способ форматирования строк с помощью % в Python 3000 всё-таки оставили!

~ > workon python3
(python3)~ > ipython    

Python 3.2 (r32:88445, Feb 28 2011, 11:06:14) 

In [1]: 'Good old %s still works in Python 3!' % 'string formatting'
Out[1]: 'Good old string formatting still works in Python 3!'

По наводке www.boredomandlaziness.org

if request.method == 'GET'

Наконец-то я понял, почему пишут так

def item_view(request, id):
    item = get_object_or_404(Item, id=id)
    if request.method == 'POST':
        form = ItemForm(request.POST, instance=answer)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(item.get_absolute_url())
    else:
        form = ItemForm(instance=item)
    return render('item.html', {'item': item, 'form': form})

и не пишут вот так

def item_view(request, id):
    item = get_object_or_404(Item, id=id)
    if request.method == 'GET':
        form = ItemForm(instance=item)
    elif request.method == 'POST':
        form = ItemForm(request.POST, instance=answer)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(item.get_absolute_url())            
    return render('item.html', {'item': item, 'form': form})

Второй вариант хоть и более выразительный, но не учитывает такие http methods как HEAD. А HEAD частенько шлются всякими программами и фейсбуками про постинге ссылки (чтобы проверить, что ссылка действительно рабочая).

Блоги программистов

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

Не выражают свои эмоции, не самовыражаются, не зарабатывают, не продвигают, не продают. А продолжают традицию обмена новыми идеями, полученным опытом. Раньше ученые писали друг другу бумажные письма, а теперь удобно писать одно электронное “письмо” всем, кто подписан на Atom/RSS.

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

Upd. “Обсуждения через блоги” Ивана Сагалаева

2010 - итоги года

Блог

  • Написал 31 статью (эта - юбилейная 32-я) и 96 постов со ссылками
  • Пришли почитать 13700 человек, начитали около 50000 просмотров страниц
  • 258 человек читают /feeds/entries/ через Google Reader
  • Переехал из Amazon EC2 в Linode (с восточного побережья США в Лондон), странички должны открываться заметно быстрее

Выбор инструментов

Короткая мысль:

Базовых принципов построения сложных систем немного. MVC, разделение на шаблоны и логику, разделение на сервера приложений и сервера данных, … А вот инструментов для реализации каждого из принципов очень много. Много редакторов, шаблонных языков, key-value datastores, веб-фреймворков, инструментов тестирования разного уровня, систем контроля версий, языков программирования.

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

В чем польза документоориентированных БД

Первый use-case использования документоориентированных БД, который не дает мне покоя.

Relational Solution

  • Use a relational database, with a normalized or semi-normalized schema.
  • When rendering a response, run a handful of queries and then aggregate the data for the object.
  • Cache the resultant aggregate object either on a TTL or do invalidation.
  • Return the cached copy of the aggregate object.

Document Store Solution

  • Use a document datastore, and embed sub-objects or child lists within their parents.
  • When rendering a response, retrieve the document by key and return it.

Рендеринг шаблонов сейчас может быть очень быстрым, а умная инвалидация кеша все еще остается очень непростой.

Источник - http://codeascraft.etsy.com/2010/05/19/mongodb-at-etsy/

Akismet to Recaptcha

Внес небольшие изменения в код этого блога. Заметил, что Akismet (сервис проверки на спам, которым обрабатывались все входящие комментарии) перестал пропускать однострочные короткие комментарии. Отключил проверку на спам, вместо этого добавил Recaptcha. Если есть какие-то замечания - пишите в комментарии к этому посту или на roman.vorushin@gmail.com.

Upd. Комментарии уже давно переехали на Disqus и полет нормальный.

Шаблоны страниц глазами дизайнера

В новом проекте я много работаю в роли дизайнера-юзабилиста-фронтендщика. Пишу html, css, javascript. Думаю страницами, действиями, приоритетами. Хочу поделиться тем, что я успел увидеть глазами дизайнера в оформлении шаблонов страниц сайта.

Не уходить далеко от html, css

В случае статического сайта каждая страница - это один html файл. Это очень удобно. Хочешь поправить главную страницу - открывай start.html, профиль - profile.html и т.д. Поэтому всё (или почти всё), что относится к текущей странице, должно быть в одном файле шаблона. Даже javascript код лучше не выносить в отдельный файл, если он относится к дизайну-юзабилити страницы (а не к супер-сложной технологии, которую понимают только программисты). Исключения - методы или свойства моделей, возвращающие часто встречающиеся элементы (например, у меня в профайле есть свойство profile_link, которое собирает полное имя из first_name, last_name и оборачивает его в <a></a>), удобные фильтры и повторяющиеся виджеты (в виде отдельных файлов, добавляемых через {% include %} или inclusion tags - последние удобны тем, что их можно параметризовать).

Бывают ли такие дизайнеры?

У меня есть больной вопрос, мои уважаемые читатели.

Я давно читаю блог команды 37signals Signal vs. Noise и я завидую тому, как много внимания они уделяют дизайну. Они рекомендуют использовать команды из 1 дизайнера и 2 программистов. Причем дизайнер сам правит шаблоны.

Я никогда еще не работал с такими дизайнерами. Возможно ли это в xUSSR? Получалось ли у вас работать таким образом? Или дизайнер рисует красивый PSD, его отдают верстальщику, а программисты потом пытаются полученные html/css встроить в приложение? Или все-таки существую дизайнеры, которые так же плотно работают над проектом, как программисты?

Team lead для проекта в Москве

Знакомые ищут team lead для нового проекта в Москве. Python, lean development, agile. Проект околосоциально-политический, использующий краудсорсинг. Нужно набрать небольшую мобильную команду (2-3 человека) и сделать прототип за 1.5 месяца. Зарплата + equity. Обращайтесь к alex.shevchenko@sciworth.com (один из основателей Sciworth Labs, в которой я сейчас работаю).

Книга Акио Морита "Сделано в Японии"

Акио Морито - руководитель и со-основатель компании SONY. Интересная история жизни удивительного человека. Я даже задумался - а не купить ли следующим ноутбуком Sony Vaio (вместо макбука, который служит мне уже третий год).

Вот пара цитат про путешествия. Семейный подход к образованию (притом что большинство детей училось в лучших университетах):

Мой отец следовал примеру своего отца. Он часто говорил, что никакие деньги в мире не могут дать человеку образование, если только он сам не захочет сесть за книги и прилежно учиться. Но деньги позволяют получить один из видов образования — это образование, которое дают путешествия.

И после того как Морита пожил в США, а его дети отучились в разных странах мира:

Мне тоже многое дал опыт учебы моих детей. Прежде всего я пришел к выводу о том, что контакты с другими культурами показывают островитянину-японцу, что он, японец, находится на земле в меньшинстве. Он учится не только ценить свои характерные черты японца, но и понимать, что именно ему следует приспосабливаться к остальному миру, а не мир должен приспосабливаться к нему. Йосико говорит, что одну из важных вещей необходимо понять и усвоить: «иностранцы» не одинаковы, они поддерживают разные идеи, исповедуют разные религии, у них разное прошлое. Таким образом, наша поездка за границу избавила семейство Морита от предрассудков, и мы прекрасно себя чувствуем в любой части мира, хотя наш настоящий дом — Япония.

Спасибо akve за такой подарок на ДР!

Сильнодействующее средство - компактные спецназ-команды

Пожалуй самый известный мне мощный ход в стартап-проектах - “компактные спецназ-команды”. Компактные = не больше 10 человек. Спецназ - где каждый участник десятерых стоит. Примеры: серверная команда youtube из 9 человек (на момент покупки гуглом), reddit (3 человека), github (их было вначале от 2 до 4 человек), stackoverflow (всех победили втроем, после получения инвестиций их стало уже 27), friendfeed (начали вчетвером, а на момент покупки фейсбуком их было 12).

Скорость

“Три мушкетера”, дуэль д’Артаньяна и де Жюссака

Эта борьба в конце концов вывела де Жюссака из терпения. Разъяренный тем, что ему не удается справиться с противником, которого он счел юнцом, он разгорячился и начал делать ошибку за ошибкой. Д’Артаньян, не имевший большого опыта, но зато помнивший теорию, удвоил быстроту движений. Жюссак, решив покончить с ним, сделал резкий выпад, стремясь нанести противнику страшный удар. Но д’Артаньян ловко отпарировал, и, в то время как Жюссак выпрямлялся, гасконец, словно змея, ускользнул из-под его руки и насквозь пронзил его своей шпагой. Жюссак рухнул как подкошенный.

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

Переехали в Киев

Неделю назад приехали в Киев из Крыма, все это время обустраивались, только сегодня я выбрался поработать в гостеприимный офис Comindwork. Киев очень радует - красивые улыбчивые люди, мало пробок и толкучки, всё близко.

Последние две недели я не программировал (неделю жили в палатке, неделю обустраивались), и сегодня наблюдал постепенный набор скорости: сначала вообще ничего не понятно в проекте, потом сделал одно маленькое исправление, второе-третье, о, процесс уже пошел!, еще лучше, ага - сложное место и снова размышлений на полчаса-час, бинго! эврика! тыц-тыц-тыц, еще тыц-тыц-тыц, ага, а сейчас протестируем, тут поправим, работает! И так хорошо от того, что сделал что-то полезное!

Я давно уже заметил, что созидательный труд отвечает на многие мои экзистенциональные вопросы. Косить ручной косой траву на даче, мыть посуду, программировать новый сервис - от всего этого мне становится лучше и в жизни моей появляется больше смысла! Похоже ответ на вопрос “Каков смысл жизни?” - это не набор слов, а незря прожитая жизнь.

А про Киев подробнее я напишу попозже, пока я слишком влюблен в него, чтобы быть хоть немного объективным :) Киевляне, привет!

Умными рождаются?

Пару дней назад увидел в комментариях на хабре фразу “И тогда я понял, что умными рождаются, а не становятся”. Мне эта фраза близка тем, что сейчас, к примеру, я читаю блоги действительно умных талантливых программистов, некоторых знаю лично. И ощущение - между нашими способностями лежит огромная пропасть. Я толком ничего не знаю, а они - “боги, вырезанные из камня” (с) Бойцовский клуб.

А поскольку у меня этим летом много времени для размышлений - в прогулках, поездках - то я начал вспоминать что я успел накопать на тему “Умными-талантливыми становятся или рождаются”. Чтобы не забыть, пишу этот пост. Он может оказаться несколько сумбурным, но уже лучше пусть он будет, потому что уже завтра утром я могу все забыть и начать думать какую-то другую мысль.

Точка входа в юнит-тесты

Если вы давно хотели попробовать писать юнит-тесты для своих проектов, но не могли пересилить лень, стремление к простоте или что-то еще, то у меня есть совет для вас. Попробуйте написать юнит-тесты для API - тех вьюх, которые не открыть в браузере, не протестить глазами и мышкой. Особенно это касается API, которое вызывается из сторонней системы (например из вашего приложения ВКонтакте). Локальные тесты позволят быстро выявить кучу ошибок, снизят время тестирования в сложной внешней системе, а также (о радость для искателей простоты и неизбыточности!) - будут логичными и простыми.

Я первый раз по-настоящему оценил юнит-тесты, когда писать веб-сервис для банка. Сейчас пишу приложение для ВКонтакте, и сначала забыл про тесты, в результате много раз обновлял приложение, много всего выводил в консоль. А как напишешь новый код - опять что-то не работает! И не посмотреть красивое сообщение об ошибке, которое рисует django, когда тестируешь странички веб-сайта! Написал тесты, всего 21 строчку, и процесс пошел в разы быстрее.

Махатма Ганди о веб-сервисах

Цитата из “Автобиографии” Ганди:

“Such service can have no meaning unless one takes pleasure in it. When it is done for show or for fear of public opinion, it stunts the man and crushes his spirit. Service which is rendered without joy helps neither the servant nor the served. But all other pleasures and possessions pale into nothingness before service which is rendered in a spirit of joy.”

Несмотря на то, что написано в доинтернетовскую эпоху, применимо и к веб-сервисам. Радует душу? Спрограммируешь и люди будут рады. Не радует? Шансы невелики.

Слабые места Javascript

Все больше пишу на Javascript - сначала jQuery для всяких формочек, потом Google/Yandex Maps, сейчас большой проект с Canvas. Среди друзей больше всего работал с JS Дима Смолин, на днях обсуждали с ним слабые места Javascript:

  1. объявление переменных через var приводит к страшным ошибкам в коде (если забудешь var)

  2. итераторы по массивам довольно неудобные, но это решается библиотеками

  3. очень странные соглашения по работе оператора ==

  4. местами черезчур агрессивное приведение типов друг в друга, типа превращений строки в число и обратно

  5. конечная запятая в словаре или массиве сводит с ума некоторые браузеры

  6. необязательная “;” в конце строки

А плюсы огромные: компактное мощное ядро языка, V8, Canvas и т.д.

Жизнь и работа на море

В конце весны мы отвезли все пожитки на склад, оставили только то, что влезет в нашу небольшую машину и уехали из Москвы в Крым. Поселились в Новом Свете (это красивый поселок у моря, окруженный горами и заповедником с можжевеловой рощей). Планируем жить тут до середины сентября. А поскольку валяться на море месяцы напролет не интересно, мы продолжаем работать. Янка развивает свой проект Серебро Непала, я программирую - скоро анонсирую один проект на Geodjango, один большой проект начал делать с Толиком Востряковым и есть еще много идей и предложений.

Пока компилится GEOS

Пока компилится GEOS, расскажу мысль, которая мелькает вот уже полчаса или час в моей голове. Я в последнее время начинаю чувствовать спокойную уверенность, что я могу сделать любой или почти любой сложный проект, решить любую или почти любую сложную задачу. И что для моего фриланса уже сейчас заказов достаточно, я могу выбирать - что делать, а что нет - и при этом не голодать.

И это дает свободу - какие проекты выбирать, а какие - нет, с кем работать, а с кем - нет, какие инструменты использовать, а какие - нет. И это прекрасная свобода! Не давят амбиции - “Смогу ли я сделать этот мега-крутой проект???”. Не давит страх потерять единственного работодателя. Не нужно выбирать самую популярную и востребованную технологию на рынке.

И если у кого-то еще проскакивало такое ощущение и такая мысль, то я очень рад!

Первым делом, первым делом самолеты

Я программирую с 13 лет. Когда я познакомился с этой областью, то весь мир разделился для меня на две части: волнующий “настоящий” мир логики, цифр, технологий, объектов, фукнций, кристально четкого мышления, быстрого самообучения и вес остальной “обыденный мир” - штаны заштопать, душ принять. Я немного утрирую, потому что была и любовь, и всякие боевые искусства, и танцы, и много еще всего. Тем не менее было очень четкое такое разделение: это важно, перспективно, интересно, а это - не важно. Поэтому я научился варить какао два года назад, получил права год назад, а чинить водопроводные краны научился только вчера.

django-compressor

Есть 2 задачи, связанные с .css и .js файлами, которые возникают при регулярном деплойменте веб-проектов. Первая - минимизация размера. Есть много утилит, позволяющих убрать комментарии и лишние пробелы, тем самым сократив размер файла, который скачивает браузер клиента. Вторая - версионирование. Если у вас файл со стилями доступен по ссылке /media/css/main.css, то при его обновлении многие клиенты продолжат пользоваться старой версией файла, сохраненной в кеше браузера.

Меня особо заботила именно вторая задача - я менял css в этом блоге, а он не обновлялся у посетителей до тех пор, пока они не нажимали в своих браузерах Ctrl+R (Cmd+R). Я нашел отличное django-приложение django-compressor, которое решает эту задачу следующим образом:

Celery - task queue/job queue based on distributed message passing

Определяем в питоновском коде задачи, которые должны выполняться асинхронно:

from celery.decorators import task

@task
def add(x, y):
    return x + y

Запускаем несколько обработчиков на разных серверах (все они связываются брокером, в качестве которого может выступать RabbitMQ, Stomp, Redis и большинство современных СУБД)

Запускаем задачу на асинхронное выполнение:

result = add.delay(4, 4)

Изначально celery создавался как специфическое django-app, а сейчас хорошо работает с любым питоновским проектом. Есть также поддержка “задач по расписанию” (cron-like).

Документация по celery на GitHub - http://ask.github.com/celery/getting-started/introduction.html

Удаленная работа

Я всегда был за работу в офисе. И коммуникации лучше, и общее поле команды, и разговоры за чаем, позволяющие наткнуться на нужную мысль. Когда мы делали Рисоваську, то сидели все в одном уютном офисе и нечеловечески трудились (нас даже начали называть киборгами, потому что не парились, не переживали, а дружно работали и выдавали гарантированно высокий результат). Все за исключением Стаса - он живет в Нижнем Новгороде (как мы шутили - в нижнем мире) и приезжал пару раз в месяц, а остальное время работал из дома. Я на Стаса немного хмурился - “вот тоже мне, все тут пашут, а он дома сидит”.

Sorting with keys

И снова цитата из Code Like a Pythonista:

Python 2.4 introduced an optional argument to the sort list method, “key”, which specifies a function of one argument that is used to compute a comparison key from each list element. For example:

def my_key(item):
    return (item[1], item[3])

to_sort.sort(key=my_key)

The function my_key will be called once for each item in the to_sort list.

You can make your own key function, or use any existing one-argument function if applicable:

str.lower to sort alphabetically regarless of case.
len to sort on the length of the items (strings or containers).
int or float to sort numerically, as with numeric strings like "2", "123", "35".

Чем это лучше написания собственной функции сравнения? Это быстрее на длинных списках. Потому что функция сравнения будет вызываться и соответственно вычисляться O(n*logn) раз, а key будет вычисляться O(n) раз и вызываться уже вычисленный O(n*logn) раз. Т.е. это как бы собственная функция сравнения с кешированием - сортировка ест чуть больше памяти, но выполняется чуть быстрее.

Нужно больше творить

Когда я начинал работать на компьютере, то из развлечений были только игры и то их нужно было писать самому, потому что профессиональные игры нам загружали только по большим праздникам. Мы писали тогда на MSX-Basic всякую всячину - бесконечные стрелялки, логические игры, головоломки.

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

Pip, virtualenv и virtualenvwrapper

В мейл-конференции Python-Dev всерьез обсуждают включение фукнциональности virtualenv в Python. Это очень удобный инструмент питониста, позволяющий легко работать на одной машине с разными версиями библиотек (например, с django 1.0.4 и django из транка), быстро передавать список зависимостей проекта другим разработчикам (а они смогут поставить все библиотеки одной командой), упрощают деплоймент.

Python quotes

Есть такой замечательный ресурс Python Quotes - 10 страниц отборных цитат из переписки в python-dev, вот некоторые из них:

This is Python! If we didn’t care what code looked like, most of us would probably be hacking in some version of Lisp – which already covered most of Python’s abstract semantics way back when Guido was just a wee snakelet frolicking in the lush Amsterdam jungle.
Tim Peters, 24 Apr 1998

Динамические формы Django

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

class DynamicForm(forms.Form):        
    def __init__(self, some_data, *args, **kwargs):
        super(DynamicForm, self).__init__(*args, **kwargs)
        for i, requisite in enumerate(some_data.requisites_list):
            regex = requisite['regexp']
            label = requisite['name']
            self.fields['requisite_%s' % i] = forms.RegexField(regex=regex, label=label)

Ключевой элемент это словарь self.fields - в нем хранятся все поля, которые были перечислены при объявлении класса формы.

PS. Написал это отдельным постом, потому что не первый раз вижу в Google Analytics, что на мой блог попадают люди по поисковой фразе “динамические формы джанго”.

Декораторы Python

В питоне есть 2 очень мощных инструмента мета-программирования: декораторы и метаклассы. Декораторы применяются к функциям, метаклассы - к классам. Хочу подробно остановиться на декораторах.

Ищу проекты

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

Идея - регулярные встречи разработчиков в Москвe

Ребята, я тут подумал - а что если раз в месяц собираться на чашечку кофе и делиться опытом разработки, рассказывать про новые технологии и языки, про решение актуальных задач? Особенно интересны аспекты разработки с использованием динамических языков - Python, Ruby, Javascript. Мне это интересно тем, что можно познакомиться друг с другом, перенять опыт, узнать про новые вещи, позадавать вопросы.

Для начала можно встретиться в какой-то кафешке или коворкинге. Продолжительность 2-3 часа. Формат - небольшое знакомство, индивидуальные доклады, вопросы-ответы.

Кому-то еще это интересно, актуально?

Рассказ "Отпуск"

Скачал OmmWriter. Это Mac-only программа, которая разворачивается на весь монитор, включает спокойную музыку и дает тебе возможность писать тексты, не отвлекаясь на интернет-раздражители. Попробовал его в действии, получился мини-рассказ “Отпуск”.

###Отпуск

Шли как-то два зеленых человечка и шли. Радостно, без нервов. Шли и улыбались друг другу время от времени. Улыбнется один другому, другой это заметит, чуть улыбнется в ответ и глаза его чуть засияют. И дальше идут.

Блог-итоги 2009

17 ноября запустил свой программистский блог vorushin.ru. Главный результат - я с удовольствием пишу на профессиональные темы и получаю фидбек. Очень интересно писать все более длинные и красивые статьи, а не просто слепки мыслей-состояний того, что есть в голове. Как отмечали многие интервьюируемые в Coders at Work, самый полезный навык для программиста - умение хорошо писать на человеческом языке (русском, английском). С удовольствием заметил, что самыми читаемыми являются записи, которые просто не можешь не написать. Возникает идея, думаешь - надо будет как-нибудь про это написать, понимаешь что нужно писать прямо сейчас, пишешь в блокноте или текстовом редакторе, выкладываешь в блог, добавляешь ссылки и правишь ошибки, а потом видишь в Google Analytics, что на статью приходят уже из твиттера Ивана Сагалаева.

###Цифры за эти неполные полтора месяца

  • 1000 посетителей
  • 1800 посещений
  • 3500 просмотров страниц

Самые читаемые статьи этого года:

За что вы любите программирование?

“За что вы любите программирование?”. Этот вопрос я задавал вчера друзьям-киборгам, а потом снова и снова задавал его себе. Я помню, что с самого детства мне нравились инструменты, которыми можно делать всякие забавные штуки. Как-то мама принесла с работы калькулятор, с такими красными циферками, который работал от сети. Как я к нему рвался! Вычислял суммы, произведения, брал квадратные корни!!! Магия цифр завораживала: если 1111 умножить на 1111, получалось 1234321; дробь 1/3 выглядела забавно с бесконечным числом троек; квадратные корни имели очень забавный вид (нерациональные числа).

Потом для меня начал открываться мир компьютеров - сначала это была цветастая книжка про то, как мальчик залез в компьютер и начал по нему путешествовать. О, как мне хотелось хотя бы потрогать настоящий компьютер, не говоря уже о том, чтобы что-то на нем поделать. Это был класс шестой (1992 год) и компьютеров ни у кого из знакомых не было, начинали только появляться игровые приставки Dendy. В самом начале девятого класса мы с друзьями наконец-то нашли место с двумя компьютерными классами. Сначала за компьютерами сидели по трое, потом кто-то отсеялся и мы уже сидели по двое, а через какое-то время мы перешли в следующий программистский поток и там уже у каждого был свой компьютер.

10 причин любить Python

  1. Не нужно ставить точки с запятыми и фигурные скобки повсюду (радует еще больше, чем при переходе с begin-end Паскаля к фигурным скобкам C).
  2. Очень легко читать чужой код (из-за п.1, стандартизированных отступов, компактности языка, а также благодаря специальному упору на читаемость в дизайне языка). По сравнению с C/C++, код Python читать в 10 раз легче.
  3. Google тоже его любит (GAE, Unladen Swallow, …)
  4. Язык все еще активно развивается (хоть и вышел в 1991 году)
  5. Вокруг языка образовалось очень активное и интересное сообщество
  6. На Python написан прекрасный веб-фреймворк Django
  7. Есть библиотеки на любой вкус (в отличии от, например, Erlang’a)
  8. Метаклассы и декораторы позволяют писать красивый декларативный код
  9. Богатые структурные и функциональные возможности позволяют делать очень многое без помощи ООП
  10. Язык спроектирован для того, чтобы человеку было приятно на нем программировать (а не только для того, чтобы машине было удобно его исполнять). Приятно, когда о тебе заботятся! А о машинах пусть позаботится Intel!

Контроль в широком смысле

Перевод свежего поста из блога Signals vs. Noise Control in its wider sense:

Многие компании стараются контролировать сотрудников. У них есть руководства и предписания. Они мониторят электронную почту. У них есть четкие правила - что разрешено и что запрещено.

Но “контроль” - непростая штука. Чем больше ограничения, тем скорее создается среда недоверия. Появляется противостояние Мы-Они. Люди начинают попытки обыграть систему.

Поэтому менеджерам, которые стремятся к “контролю”, стоит прислушаться к совету Шунрю Судзуки (Shunryu Suzuki), который он приводит в книге Zen Mind, Beginner’s Mind:

AkismetModerator для комментариев в Django

В django есть хорошее встроенное приложение comments с поддержкой модерации. Сегодня написал AkismetModerator - крохотный класс, который фильтрует спам в комментариях с помощью сервиса Akismet:

from akismet import Akismet
from django.contrib.comments.moderation import CommentModerator, moderator
from django.utils.encoding import smart_str

class AkismetModerator(CommentModerator):
    def moderate(self, comment, content_object, request):
        api = Akismet(agent='AkismetModerator@vorushin.ru')
        if not api.key:
            api.setAPIKey(settings.AKISMET_KEY, 'http://vorushin2.wordpress.com')
        if not api.verify_key():
            return True
        return api.comment_check(smart_str(comment.comment), 
            {'user_ip': request.META['REMOTE_ADDR'], 
             'user_agent': request.META['HTTP_USER_AGENT']})

moderator.register(Entry, AkismetModerator)
moderator.register(Link, AkismetModerator)

Entry, Link - модели, комментарии к которым будут прогоняться через AkismetModerator.

Рисоваська и Erlang

Сегодня получил письмо от Михаила:

Если есть такая возможность, напишите про Erlang. Как я понял, в "Рисоваське" он используется. Просто в Интернете катастрофически мало статей об Erlang-е на русском языке. А у Вас, наверняка, есть, чем поделиться. )

Про наш опыт использования Erlang Толик Востряков уже написал две статьи: Erlang в Рисоваське, часть 1 — обзор языка и Erlang в Рисоваське, часть 2 — ответы на вопросы.

От себя добавлю только, что не для всех серверных задач Erlang оказался оптимальным. Сейчас бы мы написали 80% фукнционала на Python, а Erlang использовали бы преимущественно для Comet-части.

Coders at Work

Это замечательную книгу я начал читать по рекомендации Anatoly Vorobey. Автор провел 15 интервью с выдающимися программистами нашего времени: от Бреда Фитцпатрика (создатель ЖЖ и, насколько я знаю, самый молодой из интервьюируемых) до Дональда Кнута.

Типичная беседа строилась следующим образом - первую половину составляли расспросы о том как люди начинали свою программистскую карьеру (Фитцпатрик программировал то ли с трех лет, то ли с четырех :))), а во второй части автор задавал примерно одни и те же вопросы - используете ли unit-тесты, что думаете о C++, читали ли Кнута, стоит ли ждать пятидесятилетнего возраста, чтобы начинать писать действительно крутые проекты.

Книга безусловно выдающаяся - пока я читал, у меня разрушались “незыблемые” убеждения, открывался совершенно новый для меня мир лабораторий (почти половина этих крутых ребят много времени работали во всяких labs - Bell Labs, PARC и пр.), приходило понимание что историю могут изменять люди, которые занимаются тем, что им действительно интересно. Многое узнал про то, как построена работа в Google (многие из этих ребят сейчас работают там).

Больше всего мне запомнились интервью с Jamie Zawinski, Brad Fitzpatrick, Ken Thompson и Donald Knuth. Книга великолепная, рекомендую!

Django Forms

pony powered

В джанге многое сразу покорило мое сердце - прекрасные модели, мощный URLconf, красивые шаблоны. Но вот джанго-формы открылись для меня во всей красе лишь недавно. Я быстро научился верстать и обрабатывать формы руками, поэтому не было надобности вникать в довольно большой посвященный им раздел документации (10 разделов!). В новом большом django-проекте я пишу код уже не один, а с отличными разработчиками - Димой Смолиным и Толиком Востряковым, которые и помогли мне быстрее “вьехать” в суть джанго-форм.

Python XML serializer

Потребовалось мне на днях сделать сериализацию простого Python-dictionary в XML. Элементы словаря - списки и прочие объекты. Готового сниппета я не нашел, написал свой компактный (меньше 30 строчек) сериализатор.

Развертывание Django-проектов c помощью Fabric

В одном из проектов необходимо регулярно выкладывать код из ветки stage на staging сервер. Начали делать это вручную - входишь через ssh, делаешь git push origin stage, если нужно - обновляешь базу и затем перезапускаешь apache. К концу этой недели решили, что хорошо бы все эти действия выполнять одной командой. Я прошерстил блоги - сейчас очень активно пишут про использования для этих целей библиотеки Fabric (это аналог Capistrano из Ruby on Rails).

Python и скорость. Unladen Swallow, PyPy, Cython

Краткий перевод обсуждения Recommendation against Python?:

kng Я слышал, что сотрудникам Google не рекомендуют использовать Python для новых проектов, что мне кажется глупым, учитывая как много питоновского кода и поддержки самого языка Python исходит из Google. Я начал поиски информации, но ничего не нашел. Вы знаете что-то об этом или это просто слухи?

Изменения в блоге - "Интересные ссылки"

Поскольку часть моих постов заключается в том, чтобы “дать ссылку на интересную статью”, то сегодня я создал отдельный раздел блога “Интересные ссылки” (справа на главной странице). Часть постов я сконвертировал в статьи-ссылки и из-за этого вы могли получить в свои RSS-ридеры несколько старых записей. Сорри :))))

Программировать без лишней боли

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

Беседа-интервью "Из сытой корпорации - в рискованный стартап"

9 ноября я беседовал с ребятами из kamblog.ru, рассказывал про свой опыт перехода из сытой тёплой корпорации в свой рискованный стартап, где нужно было все делать самому и пули буквально свистели над головой :)))) Эту беседу-интервью ребята записали на видео. Разговор получился длинным - больше часа. Ниже я запишу основные тезисы беседы.

Решил вести программерский блог

3 года назад я завел себе ЖЖ, основной функцией которого было отвечать на вопрос “Как дела?”, который многочисленные друзья из разных городов задавали мне по аське с завидной регулярностью. Большинство моих постов были на личные темы, а редкие программерские посты не привлекали особого внимания.

В этом году я снова стал много программировать. Очень много интересной информации, которая помогает очень быстро продвигаться на этом пути, приходит ко мне из программистских блогов: Ивана Сагалаева, Саймона Виллисона, Jacob Kaplan-Moss и других.

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

Каких программистов берут в GitHub

Один из создателей GitHub, Chris Wanstrath, выступил на конференции Ruby Hoedown 2008. Особенно порадовали слова о том, каким нужно быть (а точнее что нужно делать), чтобы начать делать интересные проекты с самыми лучшими разрабочиками со всего мира:

In fact, stop worrying so much about other people. Every time I’ve worked on a project I thought other people would really love, it was a massive flop. Every time I’ve worked on a project I loved, it worked. If you’re sitting in this room, your taste is not as far off from those around you as you’d think. Build something you love and others will love it, too. (Not everyone, of course.)

Alternatively, do something hard, the hardest thing you can think of, in your language of choice. Stretch the boundries. Make Ruby cry out in pain. Install ImageMagick. Rewrite all of the standard library. Write an Objective-C bridge. You know, something just devilish. Flex your brain.

Work on your small project for a few Sundays, declare it complete then move on. Learn another language, or write something else in your new language. Pick up a new web framework or work on flashy effect number two. Add concurrent task execution to your Rake. The more acclimated you get to this process, the more creative your ideas will be. It’s the whole 10% inspiration 90% perspiration thing, and it worked for me.

Текст речи - http://gist.github.com/6443 (особенно интересно читать со строчки 206 :)))). Видео - http://rubyhoedown2008.confreaks.com/08-chris-wanstrath-keynote.html