среда, 8 августа 2018 г.

О мотивации

Я не могу делать вещи, которые мне не интересны. От слова совсем.

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

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

Как и для многих других, меня в общем случае мотивируют три вещи: автономность (autonomy), мастерство (mastery) и цель (purpose). Но они для меня играют разное значение.

Цель для программиста – это не красивый код и не расширябельная архитектура. Это решение некоторой проблемы пользователей. Наличие цели для меня важно, но не сверх критично. Я занимался довольно активно проектами, цели которых были мне не совсем ясны, поскольку я был оторван от конечных пользователей довольно сильно. Аутсорс, видите ли.

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

Но самым главным для меня всегда было мастерство. Причем мастерство не абстрактное, а практическое. Важно не просто знать определение принципа замещения Лисков и что в общем случае квадрат не стоит наследовать от прямоугольника, но и уметь применять это у себя на проекте.

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

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

Возьмем, к примеру, саморазвитие.

Изучение чего-то нового само по себе может быть не сверх интересным занятием и приводить к малому выбросу допамина. Но ведь можно изучить что-то, сваять пост в интернетах, выстуть с докладом на митапе/конференции, обсудить проблему с коллегами и, в конце концов, применить знания у себя на проекте. В этом случае потраченное время хорошо окупается и дает эффект с самых разных сторон, приводит к неоднократному «вознаграждению» и, главное, оттачивает твое мастерство.

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

понедельник, 30 июля 2018 г.

Эффект плато

Время от времени с головой и карьерой начинают твориться довольно страшные вещи: все начинает если не напрягать, то точно приносить меньше удовольствия. Работа не прет. Проекты не прут. Ничего новое не радует и не интересует. Вопрос: почему?

У меня есть некоторые мысли по этому поводу.

Есть такая штука – допамин. Он вырабатывается, когда вы ожидаете доставки нового ай-фона, «встречи» с любимой/любимым вечером или в момент укуса вкусного мороженого жарким летним днем. Допамин – это сильнейшее штыриво, которое вырабатывается от ожидания чего-то приятного или прямо в момент его наступления.

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

Тоже самое происходит и с первыми проектами: ощущение «творения» возникает постоянно. Исправил маленькую багу – молодец. Применил новый паттерн – красава. Починил билд – отлично. Задизайнил и довел до ума новую фичу – да вообще тебе цены нет.

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

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

И потом мир начинает немного меняться.

Ну, с миром-то все нормально. Но твое восприятие становится несколько иным.

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

Это же происходит с карьерой и ощущением от завершенных задач. Выше «синьера» прыгать сложно, да и не ясно, куда именно. А с задачами вообще беда получается: все одно и тоже, формошлепство, дата-сайенс, веб, базы данных. Декораторы, синглтоны и фабрики. И дурацкие обсуждение того, чем монады хороши, и почему ООП уже не торт.

Так что же происходит?

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

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

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

Есть несколько способов смягчения этой проблемы.

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

Во-вторых, можно сменить обстановку таким образом, чтобы внешние стимулы продолжали толкать тебя вперед. Например, карьерная лестница в крупной продуктовой компании может быть существенно длиннее и «путешествие» по ней может быть одним из таких стимулов. Радость познания и общения можно усилить за счет менторства, блогания или за счет выступления на митапах/конференциях.

В-третьих, можно прислушаться к себе и понять, что же может толкать тебя изнутри. Если нравится больше кодить, то может стоит забить на свои глупые тим-лидские амбиции и заняться архитектурой или стать «просто разработчиком»? А может тебе просто нравиться изучать что-то новое, так может стоит продолжать это делать, даже если это никак не поможет твоей карьере?

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

Все это я к чему? Если плато не угрожает карьере, то вполне нормально переключаться и искать себя в чем-то другом. Искусственное толкание себя вперед может привести к выгоранию, а вот временное переключение на что-то другое вполне может освежить мозги и вернуть радость от работы и жизни.

среда, 4 июля 2018 г.

Сдвиг массива влево на N элементов

Есть ряд способов сдвинуть массив влево на N элементов. Можно взять и сделать N сдвигов по одному элементу, получив квадратичную сложность. Можно создать целевой массив по размеру исходного и вычислить положение каждого элемента после сдвига. Хорошо, но скорость линейна, затраты по памяти - тоже.
Если чутка подумать, то можно придумать реализацию, которая мутирует массив и дает линейную скорость и константные затраты по памяти. Но есть один очень элегантный способ – из 3-х строк на основе чудо Span of T из System.Memory:
public static void RotateLeft(int[] input, int direction)
{
    input.AsSpan(0, direction).Reverse();
    input.AsSpan(direction).Reverse();
    input.AsSpan().Reverse();
}
Идея такая: чтобы сдвинуть массив из K элементов на N элементов влево, нужно перевернуть первые N элементов в массиве, затем последние K - N -1 элементов, а затем перевернуть весь массив:
// direction == 2, input.Length == 7
input.AsSpan(0, direction).Reverse();
// [2][1][3][4][5][6][7]
input.AsSpan(direction).Reverse();
// [2][1][7][6][5][4][3]
input.AsSpan().Reverse();// [3][4][5][6][7][1][2]

Получается два прохода по массиву, но зато с читабельностью решения все очень ОК.

вторник, 3 июля 2018 г.

Welcome, так сказать, back:)

Мне вот тут подумалось, что блоггинга мне не хватает. Причем не очень хочется писать чего-то длинное и сильно умное. Для этого, у меня теперь на английском блог есть. Хочется чего-то простого и легковесного, типа журнала живого. Вроде бы есть всякие Г+ и фейсбуки, но их формат мне все равно не нравится. Если захочешь чего-нить своего потом найти там, заморишься.

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

Вот и сейчас просто хочется поделиться загадкой, которую вчера решал:

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