Четырехчасовой рабочий день

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

По 15 часов в день работают либо профнепригодные, неспособные выполнить задачу вовремя, либо одержимые. И то и другое говорит о низком уровне организации личного времени.

8 часов это фантастика

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

Охрана труда рекомендуется делать перерывы в работе за ПК продолжительностью 10 минут, через каждые 50 минут работы. Для программирования 50 минут это очень много, поэтому наиболее оптимально делать перерывы через каждые 25 минут длительностью 5 минут, как в классическом Pomodoro. Каждые 4 отрезка по 25 минут перерыв 30 минут.

В итоге 8 часовой рабочий день будет состоять из 12 отрезков x 25 минут = 5 часам. Это идеальный теоретический случай при грамотном подходе, однако на самом деле это переоцененная цифра. Но сначала о подходах к работе.

Стратегии

1) Ни в чём себе не отказывай. Утро начинается с кофе, дальше новости, почта, твиттер, обед. Потом попытки декомпозиции задачи, от которой тебя отвлекают через месседжеры, часок кодирования, твиттер, новости, конец рабочего дня.

2) Борьба с прокрастинацией. Отключение нотификаций, почты, жёсткая фиксация участков работы с помощью техник подобных Pomodoro. Радикалы отключают интернет, разделяют рабочие машины, с компьютером выделенным для развлечения.

3) Cостоит из смеси первого и второго, немного помидорок, чтобы "прогреть мотор", когда работа идёт нормально, то можно и новости почитать.

Выглядит всё просто, различие только в распоряжении временем перерывов. Однако проблема "стены" не решается этими стратегиями.

5 часов это фантастика

Смело, не правда ли? Но от реальности не уйдёшь, идеальные рабочие дни у нас бывают не часто, а скорее как исключения из правил. На самом деле разработчики работают меньше пяти часов в день.

Стена — это тот случай, когда задача не решается в один день и требует сделать паузу. Когда выгоднее привести мысли в порядок и подойти со свежей головой позже. Декомпозировать и анализировать в полной концентрации, которой нет — та ещё задача.

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

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

Согласно опросу на Hacker News, наиболее продуктивны в день у программиста всего от 2 до 4 часов. В этом году, когда долго болел, я попробовал 4 часовой рабочий день и рабочий день длинною в 6 часов, мне понравилось!

4 или 6 часов?

6 часов для R&D и творческой работы это много. Во первых такая уйма времени расхолаживает, а во вторых это тоже тяжело, почти как и 8 часов. Конечно приятно закончить на пару часов раньше, но продуктивность такой работы уже сомнительна.

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

При должном подходе, то что я делал за 8 часов, практически удавалось решить за 4. Так зачем растягивать?

4 — правда, 8 — самообман.

P.S.

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


Локализация директорий в Finder

Исходники у меня постоянно перемещаются из одной директории в другую, хотя логично было давно положить всё в ~/src и забыть, однако глаз перфекциониста цеплялся в Finder среди локализованных названий, да ещё не с заглавной буквой.

Захотелось, чтобы физически было так:

Tmux в Terminal.app

А в Finder так:

Finder

Идём в /System/Library/CoreServices/SystemFolderLocalizations/, там находим нужный проект локали (у меня это ru.lproj).

Конвертируем бинарник SystemFolderLocalizations.strings в xml:

sudo plutil -convert xml1 SystemFolderLocalizations.strings

Открываем любым текстовым редактором и добавляем в конец файла строку:

<key>src</key>
<string>Исходный код</string>

Конвертируем назад в бинарный формат:

sudo plutil -convert binary1 SystemFolderLocalizations.strings

Заставляем переводить директорию:

touch ~/src/.localized

Вуаля!


Пустые RSS подписки в Safari

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

Решается просто, добавлением к каждой записи entry > link, атрибута rel, со значением alternate.

<entry>  
    <link rel="alternate" href="http://fluder.co/blog/2015/02/21/github-organizations/"/>  
    ...
</entry>  

Очень странное решение от Apple, не принимать записи без rel, точнее это не решение, а ошибка в имплементации RFC4287, в котором чётко указано:

atom:link elements MAY have a "rel" attribute that indicates the link relation type. If the "rel" attribute is not present, the link element MUST be interpreted as if the link relation type is "alternate".

Т.е. без этого атрибута должен быть применён rel="alternate", по умолчанию. Отправил баг-репорт, может когда нибудь починят.


GitHub для организаций

Эта заметка для сомневающихся разработчиков и менеджеров проектов, которые хотят переехать на рельсы GitHub.

Пол года назад наша небольшая команда бросила redmine и погрузилась в поиски нового дома для наших проектов.

Миграция

Ключевым требованием было наличие полноценного решения для Code Review, простое ведение Issues, ну и конечно полноценная интеграция с git.

Я попробовал Jira (Stash), BitBucket и GitHub. Больше всего мне понравился последний, на который было решено и переносить проекты.

Миграция пошла достаточно просто. В сети я нашел питонячий скрипт, который пришлось немного переписать под нас, он помог быстро перенести все задачи. В GitHub установлен лимит на 5000 запросов к API в сутки, полный переезд занял два дня.

Адаптация к тикет трекеру прошла не очень легко. Непривычно и ново было всё, начиная от локализации и заканчивая выедавшими глаза метками. Для кого-то пара моментов, о которых я напишу ниже, могут быть очень важны, я был неприятно удивлен:

Важно!

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

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

Проблема меток

Миграция из redmine потянула за собой и кучу меток, приоритетов, статусов. Issues были засорены одними статусами, а каждая новая итерация открытия или закрытия задачи мусорила ещё больше. Среди всей этой бесполезной информации было довольно неудобно выделять обсуждение.

Мы решили эту проблему тотальной чисткой, оставив на проект три лейбла: ошибка, критическая ошибка (должна быть выполнена вне очереди и milestone), статус аппрува задачи от менеджера (позволяет делать фильтрацию в отличии от lock).

Приоритеты были заменены на milestones. Вместо высокого приоритета теперь номер версии продукта, у которого установлены определённые сроки релиза.

Задачи у которых нет статуса автоматически считаются фичами, отдельный лейбл тут не нужен, как и для улучшений.

Из хорошего

Пулл риквесты, удобная система комментирования кода (code review), автоматическое закрытие задач (коммитами и пулл риквестами), отличные сторонние клиенты к задачам, двухфакторная авторизация, фид общего потока всех действий команды. Есть возможность настроить автоматическое развёртывание для каждого нового коммита, комментирование тикетов прямо из email, markdown разметка. Нравится широкий и быстрый поиск по задачам и коду.

Если бы не странная политика с правами доступа, которые решаются через API, написанием своего простенького клиента, то я бы был доволен на 100%.


Безопасность SSH и VNC с помощью Little Snitch и VPN

Мне часто нужен удалённый доступ к маку из разных, странных и не очень, iOS программ (Prompt, VNC Viewer), которые не вызывают должного доверия. Каждый раз, когда я ввожу свой пароль от SSH или VNC, моё воображение рисует POST запрос стороннему сервису, который аккуратно сохраняет мои данные, получая безграничный контроль над моей машиной.

Решение проблемы требует небольших усилий:

1) Единая точка входа на компьютер. В Little Snitch доступ к службе launchd (sshd) ограничен только с одного IP адреса.

Little Snitch

2) Этот IP адрес принадлежит моему VPN, настроить который проще простого с помощью скрипта (одна команда).

Если у вас уже есть инстанс в DigitalOcean или Atlantic то и платить ничего не нужно. А если вы пользуетесь сторонним VPN, то можно и сэкономить обойдя стороной посредников, вроде Cloak.

iOS и OS X работает с PPTP из коробки:

iOS PPTP VPN

Даже если ваш логин и пароль уплывёт, то ничего с этим сделать будет нельзя. Работать SSH и VNC будет только с вашего VPN, к которому доступ есть только у вас.


О хранении музыки

Достаточно часто я пишу здесь о музыке, эта тема мне интересна, в особенности коллекционирование и хранение. Начиная с muz.ru, и до появления iTunes Music Store полностью легализовал коллекцию, попробовал уйму стриминговых сервисов и магазинов, о которых ниже.

Прошлое

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

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

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

Собранные треки легли в iTunes мёртвым грузом, коллекция не пополнялась, новые плейлисты начали собираться в стриминговых сервисах.

Стриминг

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

Более или менее начал пользоваться бесплатным сервисом от Яндекс.Музыка, каталог был бедный, но выбора особо небыло.

Позже появился iTunes Radio, который создал кучу проблем с переключением между аккаунтами, в итоге которым я не попользовался и недели.

Учитывая прошлый опыт с iTunes Music Store, когда из облака начали пропадать LP обложки (ошибка при загрузке), я благополучно забил на iTunes Match, чтобы не потерять свою музыку навсегда. Как оказалось сделал правильно, как раз сегодня Денис Евсюков подтвердил мои опасения.

В 2014 году появился Google Music, с большим каталогом, но без нормального клиента, попользовавшись месяц ужасными клиентами и веб интерфейсом, подписку я не продлил.

Позже я узнал о Deezer, легально работающий, с хорошим каталогом, но не прижилось.

Настоящее

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

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

Spotify или Deezer хороши для обнаружения интересной тебе музыки на основании определённых предпочтений, но для меня нет особой разницы, запустил я умный "Flow" из стримингового сервиса или старое бесплатное тематическое радио в iTunes. В список Shazam1 ко мне попало столько же музыки из обычного сёрфа по простому эфирному радио, как и из того же Deezer.

Сейчас я не использую ни один музыкальный "premium" сервис и не привязан ни к одному оффлайн плейлисту. Мне нужен контроль происходящего. Основной источник — Google Music, цены в котором в гривнах приемлимы, второстепенный — iTunes, который тоже иногда использую.

Будущее

Не планирую отказываться от mp3 и m4a, доверять сервисам, с закрытыми интерфейсам, которых с каждым днём будет всё больше. Сегодня облако или магазин есть, а завтра нет (привет Google). По большому счёту нет и проблем с хранением (синхронизацией), которая в крайнем случае решается большим внешним диском (более быстрой точкой доступа).

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

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

Стриминг сервисы это отличное "discovery" дополнение к созданию локальной коллекции, но не более того. Локальный каталог в iTunes — отличный интерфейс для всего зоопарка, который нас окружает, открытый и универсальный, реализацию к которому вы пишете сами.


  1. Shazam — кроссплатформенная программа, для распознавания музыки. 


Фильмы из IMDb top 250

Посмотрел все фильмы из Top 250 IMDb, ниже список тех, которым после просмотра я поставил 9 и 10 баллов, снизу вверх. Цифра слева — это позиция в IMDb на 23 января 2015 года.

9 из 10

236. The Truman Show (1998)
234. Per un pugno di dollari (1964)
230. Barry Lyndon (1975)
220. Harry Potter and the Deathly Hallows: Part 2 (2011)
215. Notorious (1946)
208. Stalker (1979)
197. The Best Years of Our Lives (1946)
193. The Grapes of Wrath (1940)
192. Million Dollar Baby (2004)
187. Sin City (2005)
186. Stand by Me (1986)
173. Platoon (1986)
156. Judgment at Nuremberg (1961)
148. Rebecca (1940)
144. Gran Torino (2008)
142. El secreto de sus ojos (2009)
141. Lock, Stock and Two Smoking Barrels (1998)
131. Tonari no Totoro (1988)
127. The Bridge on the River Kwai (1957)
126. Heat (1995)
121. Boyhood (2014)
98. The Apartment (1960)
95. Per qualche dollaro in più (1965)
86. Full Metal Jacket (1987)
80. Braveheart (1995)
73. Mononoke-hime (1997)
71. Toy Story 3 (2010)
66. Vertigo (1958)
64. Aliens (1986)
63. North by Northwest (1959)
56. Django Unchained (2012)
51. Alien (1979)
48. Gladiator (2000)
37. Rear Window (1954)
36. Sen to Chihiro no Kamikakushi (2001)
32. American History X (1998)
29. La vita è bella (1997)
20. Star Wars (1977)
18. Goodfellas (1990)
15. One Flew Over the Cuckoo's Nest (1975)
12. Star Wars: Episode V - The Empire Strikes Back (1980)
8. Schindler's List (1993)
6. Il buono, il brutto, il cattivo. (1966)

10 из 10

243. Papillon (1973)
223. Rocky (1976)
216. The Terminator (1984)
172. Kill Bill: Vol. 1 (2003)
166. Hotel Rwanda (2004)
163. Dial M for Murder (1954)
161. A Beautiful Mind (2001)
160. Into the Wild (2007)
151. The Deer Hunter (1978)
119. Der Untergang (2004)
43. The Green Mile (1999)
13. Forrest Gump (1994)
9. The Lord of the Rings: The Return of the King (2003)
3. The Godfather: Part II (1974)
2. The Godfather (1972)
1. The Shawshank Redemption (1994)

Статистика

  • Проект длился три года.

  • 91 фильм из 250 я не планирую пересматривать никогда. Остальные получили оценки в 8, 9 и 10 баллов.

  • В блеклист попало бездарное, проплаченное, индийское кино, фильмы Ингмара Бергмана и частично Стенли Кубрика.

  • Лучший режиссёр top 250 — Альфред Хичкок и Хаяо Миядзаки.

  • Самые отвратительные фильмы Ran (1985), Who's Afraid of Virginia Woolf? (1966) и Persona (1966).

  • Общий хронометраж примерно ~1 месяц непрерывного просмотра.

Готов ли я рекомендовать любой из этих фильмов? Конечно нет, даже отговорю вас — не смотрите!

EOM


→ Разблокировка компьютера с помощью MacID

Не знаю как вы, но я задолбался по нескольку раз в день вводить пароль из 16 символов. Попробовал несколько решений для разблокировки MacBook с помощью телефона. Сначала расхваленный Knock, который на первый взгляд показался удачным, но на практике имеет ряд недостатков. Разблокировка постучав по телефону два раза это интересно, но постоянно колотить в телефон оказалось не лучшей идеей, плюс ко всему:

  • приложение на телефоне постоянно держит включенными геолокацию
  • периодически не выходит из спящего режима (требует перезапуска)
  • mac приложение коннектится зачем-то в интернет
  • после входа с помощью Knock ssh-agent остается мёртвым, в итоге ssh постоянно просит ввести passphrase

Пришлось запросить refund в AppStore и сделать вторую попытку с MacID, который сегодня выпустил первую версию своего решения.

Как ни странно второй лишён перечисленных недостатков. Правда немного больше действий приходится совершать, но авторизация происходит по отпечатку, а не стуком. Т.е. без вашего пальца мак не разблокировать. Работает разблокировка через Bluetooth LE, при открытии крышки отправляя уведомление на телефон. Есть автоблокировка, если телефон удаляется от компьютера.

Может со временем что-то плохое обнаружится, но теперь есть с чем сравнить, MacID однозначно лучше, чем Knock.

EOM


Pomodoro.app и Retina Dark Mode

Для хронометража рабочего времени и соблюдения перерывов, долгое время использовал Pomodoro.app от Ugo Landini. Когда переехал на rMBP эта программа выпала из обихода, во первых из-за иконок, которые не подходили для Retina дисплея, а во вторых из-за отсутствия поддержки Dark Mode в Yosemite.

Необходимость делать перерывы каждые 25 минут никуда не пропала. В AppStore ничего приличного на эту тему и в помине нет, поэтому было решено допилить старый Pomodoro.app.

Репозиторий в GitHub у этого проекта два года не видел новых коммитов, но порывшись в форках я нашёл более или менее приближённую к работе версию, добавил новые Retina иконки для Dark Mode, а так же правку для того, чтобы проект собирался. Код лежит тут, а кто не хочет заморачиваться и собирать руками, может скачать рабочую копию здесь.

EOM


Control Plane и энергосбережение в OS X

До нас в Харькове докатилась волна отключений света, и на прошлой неделе в облэнерго составили графики (которые они собственно успешно профукали, и свет так и не начали отключать)

Я не сильно переживал по этому поводу, батареи у MacBook при грамотном использовании хватает на 7 часов со включенной музыкой и wifi, но я всё же провел ревизию процессов, которые особо активно выжирают батарею.

Наиболее активными оказались:

  • Transmission
  • Arq
  • micropress
  • Keyboard Maestro
  • Better Touch Tool
  • Hazel (как ни странно ведёт себя адекватно, для него правил создавать не пришлось).

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

Для автоматизации этого процесса отлично подходит Control Plane1. Для него создается два контекста: battery и adapter, для которых выбирается необходимый набор правил:

Правила в Control Plane

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

Никаких лишних действий, полная автоматизация.

EOM


  1. Есть соответствующий cask brew cask install controlplane