• Про удаленную работу

    ivan-and-sam

    В прошлый вторник прошел слаконар на канале Хекслета об удаленной работе. Я рассказал кое-что, ответил на вопросы. Публикую ниже отредактированную версию чата – с исправленными формулировками, удобной структурой. Сюда же добавил некоторые вопросы, которые задавали в чате чаще других.

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

    Содержание

    Введение

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

    Собеседование стандартное. Кто такой, какие проекты, что умеешь. Просили спроектировать игру “Монополия”. Задавали вопросы на тему сети, пингов.

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

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

    Для начала разберемся с терминологией. Не стоит путать удаленку с фрилансом. Разница большая. Удаленный сотрудник – это полноценный член команды. Он разделяет ценности компании, заинтересован в ее росте. Сотрудник может работать удаленно в течение долгого времени, получать повышения. Напритив, фриланс – это большей частью мелкие задачи. Сотрудника волнуют проблемы фирмы, ее рост и вектор развития, фрилансера – нет.

    При фриланс-биржи вроде ODesk и Upwork я не особо в теме, поэтому не буду о них говорить. В моем видении удаленная работа носит более высокий приоритет, чем фриланс.

    Общий порядок работы

    Я работаю 5 дней по 8 часов, 40 часов в неделю, 2 выходных, как в РФ. Переработок еще не было. Труд оплачивается по часам. Есть понятие рейта — N долларов в час. Проходит месяц, вы умножаете рейт на 8 и на число дней. Выставляете счет на полученную сумму.

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

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

    Контракт, отпуск, увольнение

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

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

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

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

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

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

    О слежке

    В чате было много вопросов о том, следит ли за мной заказчик. И как контроллируется процесс. Конкретно в моем случае мне НЕ нужно устанавливать особое ПО, которое следит за десктопом и шлет скриншоты начальству. У нас Джира, в задачах выставлен примерный эстимейт, который предварительно обсуждаем всей командой. Взявшись за задачу, ты должен в него уложиться, либо объяснить, на что уйдет дополнительное время.

    От людей, работающих через Crossover, я знаю, что им ставят программу, которая трекает пребывание в определенных программах. Например, столько времени провел в редакторе, столько – в браузере, столько – в почтовом клиенте. Какие программы или вкладки в браузере считать полезными – это оговаривается с заказчиком заранее.

    Отработать 8 часов полностью нереально. Есть определенный КПД. По моим подсчетам, в плодотворный день удается поработать 6 часов. Чтобы сделать 8 полных часов, надо сидеть за компом 11 часов. Ноу лайф, словом. Максимум на день-два.

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

    Виды удаленки

    Я разделяю два вида удаленки – внутреннюю (в рамках текущей страны, для меня – России) и внешнюю – Европу, США, Сингапур и тд. Кратко опишу первый пункт, чтобы затем на него не отвлекаться.

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

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

    Гораздо интересней говорить на тему внешней удаленки. Здесь сразу куча всего.

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

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

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

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

    Свобода в выборе. Удаленной работы сейчас много, и хороший сотрудник может выбирать, с кем работать. Например, вы отработали 5 лет на PHP, понимаете, что не растете, пора двигаться дальше, в но в городе вакансии только на Пых и 1с. Остается только переезд. Но если у вас семья, дети? Вы же не потащите из через всю страну только потому, что захотелось писать на Хаскеле?

    О поиске удаленной работы

    Где искать удаленку? Есть хороший сайт Remote OK – агрегатор удаленных вакансий.

    Они же попадаются на Stack Overflow с тегом remote.

    Вакансии неплохо ищутся на сайтах конкретных языков или технологий, например, для Питона это раздел Jobs на официальном сайте.

    На всех указанных выше ресурсах есть RSS-ленты, что облегчает трекинг.

    Есть рекрутинговые агенства, специализирующиеся на особых технологиях, например, Functional Works – подбор программистов на функциональных языках. Чтобы увидеть расширенную информацию на борде, надо зарегистрироваться. Сейчас там висят 3-4 удаленки. Из прямого общения с рекрутером можно вытянуть больше.

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

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

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

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

    В удаленке востребованы все те же промышленные языки и технологии, что и в индустрии в целом. Плюсы, Джава, Пых, Питон, Руби, Шарп, Джаваскрипт. Встречается Гоу и функциональные вещи вроде Кложи, Скалы, Хаскела. Везде без исключения надо знать БД, алгоритмы и основы веба.

    Общение

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

    Как правило, удаленщик находится в другой часовй зоне, поэтому оговаривают, в какие часы сотрудник должен быть на связи. Наиболее благоприятный случай – когда зоны различаются на 2-3 часа, как Москва и Лондон, например. Люди, которые работают с США, испытывают трудности из-за слишком большой разницы во времени. У вас 18-00, а у них только утренний кофе. Постепенно ваш распорядок съезжает на ночное время, что плохо для здоровья и социальной составляющей.

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

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

    Английский

    В общении все упирается в английский. Чтобы преуспеть в удаленке, нужно понимать тонкости языка. Бывает, потребуется защищать свою точку зрения. Вы предложили использовать новый фреймворк, отвечают – подготовь презентацию и расскажи, какая польза бизнесу. И будь фреймворк трижды крут, вам не дадут добро, если не сможете донести мысль.

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

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

    Первое – улучшить чтение. Приходится много читать. Документация, переписка, скайп, чаты в слаке. Бывает, сообщения сыпятся, а ты уже минуту одупляешь одну и ту же фразу. Помогла электронная читалка Kindle. Я читаю тех. литературу на английском на темы, которые хорошо знаю – Емакс, Лисп. Когда знаешь контекст, вопринимать легче. К тому же, в Киндле есть встроенные словари – увидел незнакомое слово, нажал, сразу вышло его транскрипция и толкование. Причем это не голимый гугл-транслейт, а оксфордский словарь с примерами.

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

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

    Каждое видео длится три минуты. Смотреть нужно по следующей схеме:

    • смотрим и читаем бегущую стоку. Важно, чтобы все слова были понятны.
    • Слушаем снова, но не читаем.
    • Слушаем на скорости 1.25. Если что-то не понятно, повторяем или идем на предыдущий шаг.
    • Аналогично, только на скорости 1.5.
    • Аналогично, только на скорости 2. Это максимальная скорость. На ней лучше прослушать несколько раз.

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

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

    Деньги

    Закончим про английский, вернемся к удаленке. Поговорим подробней о деньгах.

    Зарплата из-за рубежа выше. Грубо говоря, зарплата мидла в Европе равна зарплате синьора в России. Или даже больше. Эта разница вызвана следующими факторами:

    • Жизнь в Европе дороже, там очень высокие налоги. Треть или даже 40% дохода европейца уходит на налоги.

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

    • Денежные переводы, которые фирма отправляет сотруднику, не облагаются налогами. Для фирмы это как купить мешок картошки. Из пункта о величине налогов следует экономия бюджета в 40%.

    Из-за разницы в ценах между странами заказчик покупает синьора по стоимости мидла-джуна. Это устраивает обе стороны.

    Кто-то может сказать, что ты не стоишь этих денег, потому что просто играешь на разнице цен. Но подобно тому, как вода движется от высокого давления к низкому, экономика работает на разнице цен. На моем ноуте написано “Designed in California, assembled in Malaysia”. Одну работу выгодней делать в одной части земного шара, другую – в другой.

    Работа на Европу или США – это законный долларовый доход. Сегодня в России абсолютно все зависит от цены доллара – от продуктов до техники.

    До введения санкций я покупал Макбук за 65тр, теперь он стоит 120тр. Шоколадный батончик стоил 20 рублей, стал 41. Наша семья побтребляет много молока – раньше брал за 35 рублей, однако с введением продуктового эмбаго качество молока, сыра, масла резко ухудшилось. Приходится покупать молоко за 65 рублей. Словом, в современной России рублевый доход – очень шаткая штука.

    Для получения валюты нужен статус ИП с валютным счетом. Сейчас есть МФЦ, где все делается быстро, буквально неделя. Подготовить бумаги помогу сервисы вроде “Мое дело” и “Контур Эльба”. Они же составят график выплат взносов, налогов и многое другое.

    Я работаю в Эльбе. Первый год бесплатен, потом 4 тр в год.

    Есть разные системы налогооблажения, самая простая УСН – 6 % с доходов. Каждый квартал платите 6 процентов с того, что заработали. Своевременно вносите в Эльбу заработанные суммы, система сама расчитает налог. Суммы в долларах автоматом переводятся в рубли по тому курсу ЦБ, который действовал на момент ее получения. Ставить неверную дату, чтобы снизить курс с целью уменьшить налог нельзя – это противозаконно.

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

    Когда вам присылают валюту, она падает на транзитный счет. Вы не можете снять ее. Нужно предоставить пакет документов, которые подтверждают законность перевода. Состав документов зависит от банка. В моем случае – это 7 документов, которые я должен предоставлять каждый месяц.

    Есть такое понятие как паспорт сделки, когда показываете документы один раз. Их фиксируют в некую юридическую сущность, а вы ссылаетесь на нее многократно.

    Существует система Payoneer, которая создает вам счет в американском банке и присылает карточку для снятия денег. Я ни разу с ней не работал, но вижу минусы в следующем:

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

    • На каждую операцию – поступление на счет, конвертация, снятие – комиссии про пронципу (N + %) USD. У ИП, если операции протекают внутри банка, комиссии гораздо ниже.

    Я пользуюсь услугами известного банка. Хотя и был с ними досадный инцидент, услугами я доволен. Любая операция доступна в личном кабинете. Сайт работает только в Файерфоксе, интерфейс очень кривой, нужна Джава, но это мелочи.

    Налоги

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

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

    Еще есть патент. Вы оформляете патент на вид деятельности, и сумма налога станвится фиксированной. Эльба умеет работать с патентом. Получать его просто — качаете заявление, заполняете и несете в налоговую по месту прописки.

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

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

    Как жить с удаленной работой

    Главное в удаленке – не остаться в изоляции. Есть риск деградировать. Нельзя замыкаться, ищите единомышленников.

    degradation

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

    Должно быть место, куда вы добираетесь, чтобы работать. Это место проводит грань – вот я на рабаоте, вот я дома. Иначе становится трудно отделить работу от семьи. Ты встал из-за стола, а коллеги все пишут и пишут в скайп. Ты отвечаешь, хотя вроде решил, что на сегодня хватит…

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

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

    О прокрастинации

    В чате были вопросы о том, как бороться с прокрастинацией. Например, как быстро набирать контекст, приступать к делу без раскачки.

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

    Сократить число отвлекающих факторов. Отключить нотификации в месенджерах, всяких скайпах-слаках. Оставить только самые важные, например, от конкретных людей. Чаты со смешными картинками поставить на мьют.

    Слушать музыку без слов, а лучше всего шумы природы, океана. Под них очень классно работать.

    Не пользоваться соцсетями, читать только RSS в Feedly или другом клиенте. Не шариться просто так по сайтам. Использовать текстовые редакторы вместо ИДЕ, плоский текст вместо бинарных файлов или конфигов. Вместо облачных хранилищ подойдет приватный репозиторий на Гитхабе.

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

    Другое

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

    Туманные рассуждения о преимуществах Лиспа и Гоу – там же.

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

  • Сегодня рассказываю про удаленную работу

    UPD Ссылка на дамп чата. Через несколько дней размещу в блоге структурированный текст.

    Сегодня во вторник в 18:00 по Москве состоиться слаконар на тему удаленной работы. Слаконар – это конференция в Слаке в текстовом режиме. Общаться будем на канале #general образовательного проекта Хекслет.

    Я расскажу о тонкостях удаленной работы примерно по такому плану:

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

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

    Заходите, будет интересно.

  • Послушайте, что пишет психотерапевт

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

    О детях:

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

    Подпишусь кровью. Учителей, которые заворачивают домашнюю работу за то, что “решено не так”, надо вешать на столбах, чтоб неповадно было.

    О праздниках:

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

    Например, празднование Нового года. Оно обходится человеку в 100 тыс. долларов как минимум. Только я считаю не из того, сколько он сейчас зарабатывает, а сколько хотел бы и мог. Например, нормальный заработок психотерапевта в час – это 100 долларов. Но его можно достигнуть не сразу, в 18 лет, а в 25. Но если люди две недели до Нового года черте чем занимаются, две недели после, то и не дорастают до самих себя, конечно.

    Праздников в Российском календаре слишком много. Это особенно заметно, когда начинаешь работать с Европой или США. Я не могу передать, как бесит перестановка рабочего времени из-за праздника. Например, работаем в субботу, чтобы отдыхать в понедельник. Очевидно же, что никто в субботу работать не будет. Биоритмы! Ну, а праздники с датами в названиях, вроде 8 Марта, 23 Февраля, 1, 9 Мая – это такой совок, что стыд. В этому году жена говорит – не поздравляй меня с 8 Марта, лучше в любой другой день, потому что это так уныло. А я и сам хотел об этом сказать. Так что теперь мы их не празднуем.

    Про труд и любовь:

    Элементарно просто. Интересный труд и любовь. Причем любовь на втором месте. У нас от любви ждут больше, чем она может дать. Вот я дом построил. Электричество есть, водопровод, отопление, канализация. Все, можно жить. Но нет обоев. А люди думают, что обои – это самое главное. Образно выражаясь, дерьма в голове много, и это дерьмо управляет поведением.

    Интересный труд – это то, что реализует человека. Не случайно же Маслоу задвинул реализацию на самый верх. Человек, одержимый любимым делом, любит всех и любим всеми, даже если он по натуре засранец, как Стив Джобс.

    О личностном и карьерном росте:

    Нужно стать профессионалом экстра-класса. Тогда автоматически станешь полезным другим. Это еще Адам Смит говорил. Я вот книжки пишу. Рассказываю, как лучше жить, удобнее. Результаты есть – многие мои ученики круто вверх поднялись. Можно, оказывается, и в наших условиях успехов добиться. А когда перестал Дни рождения и новый год праздновать, хоть бы кто от общения со мной отказался.

    Проще говоря, нужно не только накапливать знания, но и делиться ими.

    О деньгах:

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

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

    О состоятельных женихах:

    Идиотки. Вот пример приведу. У нас один ростовский олигарх женился на парикмахерше, снял ее с работы. А потом его застрелили. Ей 25 лет и пятилетний ребенок. Так я наблюдал, как она через несколько лет по миру пошла. Была бы обучена – удержала бы состоянием. А он говорил, зачем, я сам заработаю.

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

    О проституции и морали:

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

    О сумашествии:

    Это еще Ницше сказал, что сумасшествие единиц – исключение, сумасшествие масс – правило. Есть психотические расстройства – бред, галлюцинации, нелепое поведение. Таких сумасшедших немного, где-то шесть на тысячу.

    Без комментариев, просто посмотрите выпуск новостей на ОРТ.

    О тех, у кого все виноваты:

    Этого я не знаю. Я не президент. Но к молодому и здоровому человеку, если у него что-то не получается, у меня никакого сострадания нет. Пойди на оптовый рынок, купи и потом продавай. Или на машине таксуй.

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

  • Книга Atomic Scala и наивные впечатления от языка

    cover

    Прочитал книжку о Скале, заодно немного поковырял язык. Это первая книжка, прочитанная мной на Киндле.

    Понравилась структура. Примерно 30 глав – атомов – по разным аспектам языка. Автор – плюсовик со стажем, по ходу действия дает полезные советы, объясняет ООП-паттерны, затрагивает ФП.

    Ближе к концу серия глав о монадах. Описаны Either, Maybe (Option), Try. Понравилось, что автор ни разу не употребил термин “монада”. Это камень в огород Хаскела, где монады начинаются с аппликативных функторов.

    К книжке прилагается набор примеров с тестами, доками. Все добротно и на совесть, лежит на Гитхабе. Автор очень ответственно подошел к делу. По сути, у него не просто книга, а сообщество вокруг нее. Покупка книги – своего рода членский билет.

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

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

    • Некоторые элементы дизайна очень странны. Например, составные объекты, когда объявлены класс и объект с одинаковыми именами. Я долго ломал голову, пока наконец понял, что таким образом формируется метакласс. Можно было сделать удобнее.

    • Избыточные модификаторы вроде sealed, implict. Мне кажется, их впихнули задним числом, получилось не очень. Скала вроде стремится в минимализму, а получается опять Джава.

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

    • Скала все-таки ООП-язык, хоть и с функциональным уклоном. Насколько я понял, в экосистеме Скалы не поощрается процедурно-модульное программирование. Получается yet another oop language.

    picture

    
    Hieronymus Bosch “A visual guide to the Scala language” oil on oak
    panels, 1490-1510.
    
    The left panel shows the functional features, the main one describes
    the type system, and the right the object oriented parts.
    
    

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

    Выборочные цитаты из книги с моим вольным переводом.

    О ручной итерации:

    Notice that map and reduce take care of the iteration code that you normally write by hand. Although managing the iteration yourself might not seem like much effort, it’s one more error-prone detail, one more place to make a mistake (and since they’re so “obvious,” such mistakes are particularly hard to find).

    Обратите внимание, map и reduce сами заботятся об итерации. В императивном подходе итерация ложится на ваши плечи. Это кажется пустяком, но увеличивает код и вероятность ошибки. Баг в ручной итерации замечаешь в последнюю очередь.

    О комментариях:

    Comments should add new information that isn’t obvious from reading the code. If the comments just repeat what the code says, it becomes annoying (and people start ignoring your comments). When the code changes, programmers often forget to update comments, so it’s a good practice to use comments judiciously, mainly for highlighting tricky aspects of your code.

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

    О паттерн-матчинге:

    Notice that pattern matching can overlap with the functionality of if statements. Because pattern matching is more flexible and powerful, we prefer it over if statements when there’s a choice.

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

    В целом, книжка зачет, не жалею потраченного времени.

  • Картофельный мап

    По следам прошлого поста о функции Map.

    Вам дали задачу – смоделировать процесс приготовлении картошки. Имеем набор картофелин. Каждая должна пройти стадию чистки, мойки, резки и варки.

    Не вопрос, отвечет программист:

    class Potato:
    
        def clean(self):
            pass
    
        def wash(self):
            pass
    
        def cut(self):
            pass
    
        def cook(self):
            pass
    
    potatos = [Potato(), Potato(), ...]
    
    for p in potatos:
        p.clean()
        p.wash()
        p.cut()
        p.cook()
    

    Вроде ОК? Нет, все развалится.

    Сперва попросят добавить временные задержки. Чистка – 10 секунд, мойка и резка – 5 секунд, варка – 15 минут (900 секунд). Впишем time.sleep(N) в нужные методы.

        ...
        def clean(self):
            time.sleep(10)
        ...
    

    Запустим код и убедимся, что 10 картошек варятся 150 минут! Конечно, ведь каждая картошка обрабатывается отдельно. Мы варим картошку поштучно. Так никто не делает.

    Выходит, варить картошку в цикле нельзя. Должен быть особый код, который сварит картошки вне цикла. Класс картофелины не должен знать о технике варки. Значет, будет некий менеджер CookManager.cook(potatos).

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

    def process(potatos):
        for p in potatos:
            ...
    
    potatos = [Potato(), Potato(), ...]
    
    process(potatos[:n])
    process(potatos[n:])
    
    CookManager.cook(potatos)
    

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

    Есть проблема серьезней: процесс мойки делить между людьми нельзя. Потому что мойка одна. Это значит, нужно выдергивать из цикла операцию p.wash(), и как-то все перетасовать. И не забыть про варку в конце.

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

    class Potato:
        ...
    
    potatos = [...]
    
    map(Potato.clean, potatos)
    map(Potato.wash, potatos)
    map(Potato.cut, potatos)
    map(Potato.cook, potatos)
    

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

    def map_threaded(func, seq):
        from multiprocessing.dummy import Pool
        pool = Pool(processes=len(seq))
        return pool.map(func, *seq)
    
    ...
    
    map_threaded(Potato.cook, potatos)
    

    Здесь мы определяем мап в тредах. Число тредов равно числу картошек. Это значит, все они будут готовиться параллельно, как в реальности в одной кастрюле. Питонячьи треды переключаются при time.sleep(). Засыпание равносильно IO-ожиданию. Поэтому все картошки приготовятся за 15 минут.

    Теперь чистка. Это будет мап на очередях. Воркеры – люди. Конфигурация очереди никак не влияет на код, поэтому можем подключить два, три и более воркеров со своими приоритетами и весами. Захотим, отключим воркер в процессе работы. Мап будет примерно такой:

    def map_queued(func, seq):
        task = celery.task(func)(<task options...>)
        res_id_list = map(task.apply_async, seq)
        return map(task.get_result, res_id_list)
    
    map_queued(Potato.clean, potatos)
    

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

    class Potato:
        ...
    
    potatos = [...]
    
    map_queued(Potato.clean, potatos)
    map(Potato.wash, potatos)
    map_queued(Potato.cut, potatos)
    map_threaded(Potato.cook, potatos)
    

    Смысловая часть кода осталась неизменной. Мы просто поменяли один мап на другой. Всегда можем вернуть старый мап, если что-то пойдет не так. Функции map, filter, reduce, eval, apply – фундамент абстракций. Абстракции делают код открытым к изменеиям.

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

  • Впечатления от электронной читалки Kindle

    UPD продолжение: впечатления два года спустя.

    Месяц-два назад заказал читалку Kindle Paperwhite. Очень доволен покупкой. Прочел пару книг, делюсь впечатлениями.

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

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

    Заказывал в магазине www.elektrokniga.net. Контора напоминает шарашку. Например, вы не оплачиваете товар, а переводите деньги физлицу на карту. Но обошлось, доставили оперативно. Слали по два письма в день о том, что с моим заказом и где он едет.

    Какие преимущества читалки перед настольной книгой вообще? Я выделяю следующие:

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

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

    • С ценой на зарубежные книги еще можно смириться. Но доставка в два месяца, равная цене книги… нет, я не миллионер, платить 100 долларов за книгу в мягкой обложке.

    • Кое-что достать в бумажном виде уже не реально.

    Теперь преимущества конкретно Киндла:

    • Очень высокое качество сборки. Ничто не скрипит, пластик пригнан, щелей нет. Обложка, хоть и не оригинал, тоже на уровне. Магнитик на обложке погружает книгу в сон, если закрыть.

    • Девайс действительно создан для комфортного чтения. Очень четкий экран, ощущение, что читаешь с бумаги. Глубокий контраст, равномерная подсветка. Специально подобранные шрифты.

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

    • В поставке идут словари. Читаешь книжку на английском, например, нажал на слово – всплывают две плашки. В одной – выдержка из Оксфордского словаря, в другой – поиск в Википедии. В словаре не просто перевод, а описание термина в разных контекстах.

    • Амазон дает емейл username@kindle.com. Шлешь на него книгу – и через минуту она скачалась в читалку. Не надо заморачиваться с проводами.

    • Книжки хранятся в облаке. При утрате двайса все легко восстановится. Удалил случайно книжку – всегда можно закачать обратно из облака.

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

    Конечно, есть и минусы.

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

    • Читалка не поддерживает популярные форматы ebup и fb2. Не такой уж минус, полно утилит для конвертации. Но немного раздражает.

    • Я прекрасно понимаю, что устройство полностью контролируется Амазоном. Информация о моих книгах используется, чтобы показывать мне рекламу. Пользоваться Киндлом я смогу ровно столько, сколько позволит Амазон. Столлман прав.

    Следует победить юношеские комплексы и брать читалку не по размеру, а качеству экрана. Сейчас самый крутой – 6’ 300 dpi Carta. Он стоит в последних Киндлах и некоторых Ониксах, например, в модели Дарвин. Однако, в Дарвине щели такие, что ноготь пролазит, а по цене почти одинаково.

  • Map как замена циклу

    Я нашел, что отказ от циклов в пользу map улучшает код сразу по нескольким критериям, а заодно вправляет мозги. Код с мапами короче, меньше подвержен ошибкам, его легче поддерживать.

    Функция map родом из мира функционального программирования (далее ФП). Почти любой язык имеет ее аналог в стандартной поставке. Map может быть как функцией, так и методом коллекции.

    Map принимает функцию и коллекцию. Функция обрабатывает один элемент. Результат map – коллекция результатов функции на множестве входных данных.

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

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

    Меньше кода

    Пусть определена функция do_stuff(item), ее тело не важно. Это штучный обработчик объекта. Сравним два фрагмента кода:

    results = map(do_stuff, my_data_list)
    

    и

    results = []
    for x in my_data_list:
        res = do_stuff(x)
        results.append(res)
    

    Очевидно, первый вариант короче и не засоряет пространство лишними переменными. Строку с промежуточным результатом res можно опустить, но тогда следующая строка results.append(do_stuff(x)) станет сложнее. Две операции на одну строку – не желательно.

    Сдвиг кода и логические прыжки

    Цикл – это дополнительный сдвиг кода. ООП уже дает сдвиги для классов и методов, а тут еще циклы. При этом нужно бегать глазами к переменным-спискам, объявленным до цикла. Map не делает сдвига и создает переменные по требованию.

    Декларативный код безопасней

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

    Дополнительный уровень абстракции

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

    Если у нас неизменяемые коллекции и транзакционная память, интерпретатор раскидает задачу по ядрам. Имея 1000 элементов и 4 ядра, получим по 250 итераций на одно ядро. Описать это циклом – нетривиальная задача. Насколько я знаю, Clojure и некоторые реализации Haskell параллелят map при заданных флагах компиляции.

    Map очень круто параллелит запросы в сеть. Например, нужно дернуть 100 урлов, при этом сервера находятся в разных полушариях, и время отклика ожидаемо велико. Отклик в 10 секунд на запрос из Европы в Сингапур – нормальное дело. Важно понять, что хоть у вас супер-кластер, он будет висеть 10 секунд в цикле, ожидая блокирующий запрос. По меркам машинного времени это целая вечность.

    Map легко перестоит одну схему исполнения в другую. Вот обычный подход, аналогичный циклу:

    url_list = ["http://foo1.com", "http://foo2.com", ...]
    
    def get_data(url):
        return requests.get(url, timeout=5).json()
    
    data_list = map(get_data, url_list)
    

    Теперь напишем свой map с использованием тредов:

    from multiprocessing.dummy import Pool
    
    def map_threaded(func, *seq):
        pool = Pool(processes=16)
        return pool.map(func, *seq)
    
    data_list = map_threaded(get_data, url_list)
    

    Всего лишь поменяли map на map_threaded, но какая большая разница в реализации! Был цикл, а стали треды, но сигнатуры одинаковые. Теперь на всю операцию понадобится время, равное самому долгому запросу.

    (Да, это пул тредов не смотря на название модуля.)

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

    Мощь Гугла – это комбинация функций Map и Reduce. Инженеры Гугла дробят задачи на подзадачи и эффективно исполняют их на тысячах серверов. Технология работает в масштабах планеты. Под капотом может быть скучный ООП-код на Java, но Map и Reduce – абстракция высочайшего порядка. Благодаря им Гугл стал тем, что есть сейчас.

    Контроль за разрастанием цикла

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

    Добавили if, затем еще один, затем continue по условию, а потом вообще залепили вложенный цикл. В этой ветке пишем в результирующий список, а в этой нет. Логику накопления результатов отследить трудно.

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

      for item in items:
    +     if not item.check_foo():
    +         continue
      ...
    

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

    Это плохо.

    Ближайшая аналогия – растение морской желудь. Он разрастается по дну судна. Если планово не счищать, скорость судна и потребление горючего падают и возрастают соответственно на 40%.

    Отрефакторить цикл, в котором полно if, continue, try/catch очень трудно. Все завязано на глобальные списки, объявленные до входа в цикл. Оператор continue я считаю дурным тоном. Мы должны отделять котлеты от мух до входа в итерацию.

    Map исключает условия и пропуск элементов. Целевая функция не может сказать “этот обработать не могу, дай-ка лучше следующий”. Список следует предварительно очистить функцией filter.

    Неверное прохождение слоев бизнес-логики

    Мы часто работаем со списками объектов. Типичная задача – извлечь данные из базы и выполнить для каждого ряд действий. Например, действие1, действие2 и действие3.

    Итерируясь вручную, программист выполняет все три для первого объекта, затем для второго, и так далее. И забывает, что противоположный обход – сначала для всех выполнить действие1, затем для всех действие2 и т.д. – выгодней по следующим причинам:

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

    Повышенные требования к коду

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

    Не каждый готов дать эту гарантию. Часто мы видим такое:

    result = []
    for item in items:
        try:
            data = process_item(item)
            res = process_data(data)
            result.append(res)
        except Exception as e:
            logger.except(e)
            continue
    

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

    А ведь достаточно завернуть целевую функцию в декоратор или другую функцию, которая отдаст пару (err, result) и прогнать через map. После прогона отделить хорошие результаты от плохих. Ошибки залогировать отдельным шагом. Хорошие результаты отправить в следующий слой бизнес-логики.

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

    Вместо заключения

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

  • Записи докладов с четвертой встречи любителей рефакторить

    Провели четвертую встречу!

    Роман Гребенников выступил с докладом о распределенных системах:

    Евгений Рыжков рассказал о тонкостях манипуляций:

    Слайды

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

  • Идиотизм вокруг NPM

    Как и другие разработчики, я с интересом наблюдаю за скандалом вокруг экосистемы Node.js и пакетного менеджера NPM.

    Если вы не в курсе дела, смотрите ссылки в конце поста. А я напомню, что у Node-разработчиков прошлая неделя прошла в боли и страданиях. Программист Азер Кочулу удалил из NPM свои 100500 пакетов, том числе один аж на 11 строк. Без него не смогли собраться React, Babel и куча всего.

    Азер удалил код потому, что администрация NPM в одностороннем порядке передала права на пакет Kik от Азера к представителям одноименной компании. Якобы юристы Kik запугали патентами и торговой маркой.

    Развязка: Азер перенес все пакеты в Гитхаб, администрация NPM запретила удалять пакеты по истечении 24 часов в момента публикации. Азер на коне, он весь такой Д’Артаньян в белых перчатках, в Твиттере пафосные картинки.

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

    Имеем три стороны – Азер, администрация NPM и юристы компании Kik. Кто неправ в этой истории?

    Первые два. Объясню с конца.

    Юристы Kik действуют в своих интересах. Они стараются расширить экспансию вверенного им продукта. Совершенно естественно, что их цель – захватить имя Kik разных его проявлениях.

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

    Азер обозвал их мудаками и послал на хуй (как было, так и перевел). А в начале написал “Ха-ха”. Кто-то сомневается в неадекватности пациента? Взрослый же человек, просто откажи, зачем оскорблять людей?

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

    Кто-то думает, что NPM зассали перед патентом на торговую марку “Kik”, а на самом деле все просто – одни из основателей NPM работал в Kik раньше. Это банальный блат, работает не только в России.

    Поэтому администрация NPM – тоже мудаки.

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

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

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

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

    Давайте окинем быстрым взглядом 250 пакетов Азера. Двести пятьдесят, Карл, как пишут в интернете.

    • run-paralelly – 11 комитов, 46 строк.
    • left-pad, из-за которого сломался интернет. 11 комитов, 11 значимых строк. 660 звезд.
    • flat-glob – 6 комитов, 49 строк. Прогресс.
    • get-object-path – 9 комитов, 21 строка.
    • rnd – 1 комит, 8 строк.
    • random-color – 7 комитов, 8 строк.
    • route-map – 6 комитов, 55 строк.

    Ну ты понел.

    В интернете точно пошутили, что чуваку нужен не Гитхаб, а Твиттер. Каждый твит – новый пакет. Большая часть уместится в 140 символов, если переменные укоротить. А “тяжелые” проекты на 50 строк и больше декомпозировать и подключить зависимостями.

    Блин, у него декларация package.json занимает больше места, чем код.

    Что мешает этому Азеру создать пакет azer-tools и наполнять его утилитами? Принцип “один пакет – одна функция” это не глупость, a рак мозга. Я не видел такого ни в одном другом языке.

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

    А ведь я помню поток статей в духе “Node.js спасет мир” пять лет назад. 2016 на дворе, а в сообществе сканалы на уровне Дома-2.

    На закуску – статья Теда Дзюбы “Node.Js Is Cancer”. На Хабре был перевод.

    Ссылки:

  • Что значит код как данные

    Про Лисп говорят, что код это данные, а данные – код. Пока не поработаешь с Лиспом, понять смысл кода как данных трудно. Ниже – моя попытка объяснить простыми словами.

    Предположим, кто-то осваивает Лисп и делает задачки вроде факториала и рекурсии. Частенько приходится записывать числовые выражения вроде (x + y) * (a / b). В Лиспе пишут польской нотацией, то есть выражение выглядит так:

    (* (+ x y)
       (/ a b))
    

    Не очень привычно. Было бы здорово, думает студент, написать функцию, которая принимает выражение как удобно мне, а возвращала то, что нужно Лиспу. Начинает писать функцию expr, что-то вроде (expr (x + y) * (a / b)).

    Ничто не предвещает беды. Но вот облом: Лисп, как и другие ЯП, вычисляет аргументы функции до входа в нее. А выражение (x + y)... ошибочно с точки зрения и семантики, и синтаксиса, поэтому даже до вызова функции expr дело не дойдет. Что же делать?

    Помогут макросы.

    Макрос похож на функцию, но с важным отличием. Выражение, переданное в макрос, НЕ вычисляется. Вместо этого макрос получает список лексем. Задача макроса – перестоить список в правильную Лисп-форму и вернуть ее, НЕ вычисляя. Интерпретатор сам вычислит ее, получив из макроса.

    Короткими словами, макросу можно скормить полную дичь: крестики-нолики, математическое выражение, кусок кода на любом языке, asii-арт. Внутри макроса это станет списком. Задача макроса – перестроить дичь в правильный список, который вычислит Лисп.

    Именно в этот момент срабатывает срабатывает принцип код-как-данные. Когда мы пишем (expr (x + y) * (a / b)), для нас это код. Но внутри макроса это список! Нулевой элемент списка – открывающая скобочка, первый – символ x, затем символ плюсика, и так до последней закрывающей скобочки.

    Рассмотрим макрос для вычисления выражений из двух операндов. Он вычислит простейшие вещи вроде 3 + 2, 2 * 10, -3 / 2:

    (defmacro expr [v1 op v2]
      `(~op ~v1 ~v2))
    
    (expr 2 + 2)
    >>> 4
    (expr 2 / 2)
    >>> 1
    

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

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

    PS: Кроме Лиспа, я знаю только один язык со схожим поведенем. Это Tcl (Тикль) – в котором, грубо говоря, все является строкой. Тикль до сих пор популярен на производстве: заводах, CAD-системах. Нефтяные платформы Shell работают под управлением системы, написанной на Тикле.

Страница 56 из 75