Ещё больше строковых оптимизаций

В продолжение своей предыдущей статьи о строках (напоминаю, это была текстовая версия доклада на конференции JPoint-2020) решил дописать ещё одну заметку со строковыми оптимизациями, обнаруженными уже после вёрстки презентации (первые две есть на видео в самом конце, показывал их прямо из «Идеи»).

Снова StringBuilder.append(char)

На сцене снова «Спринг», а именно o.s.u.StringUtils.deleteAny(String, String):

// org.springframework.util.StringUtils  public static String deleteAny(String inString, String charsToDelete) {   if (!hasLength(inString) || !hasLength(charsToDelete)) {     return inString;   }    StringBuilder sb = new StringBuilder(inString.length());   for (int i = 0; i < inString.length(); i++) {     char c = inString.charAt(i);     if (charsToDelete.indexOf(c) == -1) {       sb.append(c);     }   }   return sb.toString(); }

В разделе «Склейка: если всё-таки нужно» рассматривая StringBuilder.append(char) я отметил невозможность оптимизации компилятором проверок внутри этого метода даже в счётном цикле с заранее известным количеством проходов. Выходом станет использование массива.

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

public static String deleteAny(String inString, String charsToDelete) {   if (!hasLength(inString) || !hasLength(charsToDelete)) {     return inString;   }      int lastCharIndex = 0;   char[] result = new char[inString.length()];   for (int i = 0; i < inString.length(); i++) {     char c = inString.charAt(i);     if (charsToDelete.indexOf(c) == -1) {       result[lastCharIndex++] = c;     }   }   return new String(result, 0, lastCharIndex); }

Переменная lastCharIndex устраняет возможные «пустоты» в массиве при пропуске одного и более знаков.

Используя бенчмарк легко обнаруживаем существенный прирост производительности даже для небольших объёмов данных:

Benchmark                       Mode     Score     Error   Units  original                        avgt    90.203 ±   4.317   ns/op patched                         avgt    25.391 ±   1.118   ns/op  original:·gc.alloc.rate.norm    avgt   104.000 ±   0.001    B/op patched:·gc.alloc.rate.norm     avgt   104.000 ±   0.001    B/op

Но и это ещё не всё.

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

public static String deleteAny(String inString, String charsToDelete) {   if (!hasLength(inString) || !hasLength(charsToDelete)) {     return inString;   }      int lastCharIndex = 0;   char[] result = new char[inString.length()];   for (int i = 0; i < inString.length(); i++) {     char c = inString.charAt(i);     if (charsToDelete.indexOf(c) == -1) {       result[lastCharIndex++] = c;     }   }   if (lastCharIndex == inString.length()) {   // С - сообразительность     return inString;   }   return new String(result, 0, lastCharIndex); }

Похожий подход использован тут.

Коварный StringBuilder.append(Object)

Следующий пример намного менее очевиден:

// org.springframework.http.ContentDisposition  private static String escapeQuotationsInFilename(String filename) {   if (filename.indexOf('"') == -1 && filename.indexOf('\\') == -1) {     return filename;   }   boolean escaped = false;   StringBuilder sb = new StringBuilder();   for (char c : filename.toCharArray()) {     sb.append((c == '"' && !escaped) ? "\\\"" : c);    // <----     escaped = (!escaped && c == '\\');   }   // Remove backslash at the end..   if (escaped) {     sb.deleteCharAt(sb.length() - 1);   }   return sb.toString(); }

Больное место находится в строке 10, а заключение звучит так: поскольку тернарный оператор возвращает либо String, либо char, то аргументом метода StringBuilder.append() фактически является Object. И всё бы ничего, да преобразование знака в объект происходит с помощью String.valueOf() и мы на ровном месте получаем множество мелкого мусора по схеме:

Character.valueOf(c)    -> StringBuilder.append(Object)      -> String.valueOf()       -> Character.toString()

Отдельно доставляет реализация Character.toString:

Осторожно, не ушибите лицо ладонью
public final class Character {    private final char value;    public String toString() {     char buf[] = {value};     return String.valueOf(buf);   } }

Зачем было оборачивать знак в массив? Тайна сия велика… Как бы то ни было, это уже исправлено.

Таким образом, достаточно избавиться от тернарного оператора:

for (int i = 0; i < filename.length() ; i++) {   char c = filename.charAt(i);   if (!escaped && c == '"') {     sb.append("\\\"");    // append(String)   }   else {     sb.append(c);         // append(char)   }   escaped = (!escaped && c == '\\'); }

И вновь очень простое изменение приносит впечатляющий прирост (бенчмарк по ссылке):

JDK 8  Benchmark                             latin   len   Score          Units  appendCovariant                        true    10   180.2 ± 10.3   ns/op appendExact                            true    10    68.5 ±  1.4   ns/op  appendCovariant                       false    10   177.7 ±  4.4   ns/op appendExact                           false    10    67.7 ±  1.3   ns/op  appendCovariant:·gc.alloc.rate.norm    true    10   688.0 ±  0.0    B/op appendExact:·gc.alloc.rate.norm        true    10   112.0 ±  0.0    B/op  appendCovariant:·gc.alloc.rate.norm   false    10   816.0 ±  0.0    B/op appendExact:·gc.alloc.rate.norm       false    10   112.0 ±  0.0    B/op  JDK 14  Benchmark                             latin   len    Score         Units  appendCovariant                        true    10    228.8 ± 18.6  ns/op appendExact                            true    10     57.9 ±  2.6  ns/op  appendCovariant                       false    10    292.8 ± 12.4  ns/op appendExact                           false    10     90.2 ±  2.2  ns/op  appendCovariant:·gc.alloc.rate.norm    true    10    688.0 ±  0.0   B/op appendExact:·gc.alloc.rate.norm        true    10    112.0 ±  0.0   B/op  appendCovariant:·gc.alloc.rate.norm   false    10   1096.0 ±  0.0   B/op appendExact:·gc.alloc.rate.norm       false    10    200.0 ±  0.0   B/op 

Обратите внимание, что исполнение не смогло выбросить мусорные объекты, хотя их область видимости крайне ограничена. Закономерно возникает вопрос: могёт ли Грааль?

Ответ

Не знаю, не проверял 🙂
Оставляю этот вопрос энтузиастам в качестве домашнего задания 🙂

Коварный String.substring

Давно известно, что метод String.substring почти всегда возвращает новую строку, и тем не менее в задачах на «выкусывание» он всё ещё пользуется незаслуженной популярностью:

// org.springframework.web.util.UrlPathHelper  /**  * Sanitize the given path replacing "//" with "/"  */ private String getSanitizedPath(String path) {   String sanitized = path;   while (true) {     int idx = sanitized.indexOf("//");     if (idx < 0) {       break;     }     else {       sanitized = sanitized.substring(0, idx) + sanitized.substring(idx + 1);     }   }   return sanitized; }

Здесь даже если исполнение каким-то чудом сможет распознать шаблон склеивания строк и подставить StringBuilder этот метод всё равно останется чертовски неэффективным.

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

private static String getSanitizedPath(String path) {   int index = path.indexOf("//");   if (index >= 0) {     StringBuilder sanitized = new StringBuilder(path);     while (index != -1) {       sanitized.deleteCharAt(index);       index = sanitized.indexOf("//", index); //не начинай сначала ;)     }     return sanitized.toString();   }   return path; }

В некоторых случаях использование StringBuilder.deleteCharAt(int) позволяет существенно облегчить понимание кода:

// org.springframework.web.util.UrlPathHelper  private String removeSemicolonContentInternal(String requestUri) {   int semicolonIndex = requestUri.indexOf(';');   while (semicolonIndex != -1) {     int slashIndex = requestUri.indexOf('/', semicolonIndex);     String start = requestUri.substring(0, semicolonIndex);     requestUri = (slashIndex != -1) ? start + requestUri.substring(slashIndex) : start;     semicolonIndex = requestUri.indexOf(';', semicolonIndex);   }   return requestUri; }

Логика здесь довольно запутанная, но на высоком уровне метод удаляет содержимое, выделенное ; внутри ссылки, превращая строку вроде /foo;f=F;o=O;o=O/bar;b=B;a=A;r=R в /foo/bar;b=B;a=A;r=R.

Можно избавиться от взятия подстроки и склейки переписав метод вот так:

private static String removeSemicolonContentInternal(String requestUri) {   int semicolonIndex = requestUri.indexOf(';');   if (semicolonIndex == -1) {     return requestUri;   }   StringBuilder sb = new StringBuilder(requestUri);   while (semicolonIndex != -1) {     int slashIdx = sb.indexOf("/", semicolonIndex + 1);     if (slashIdx == -1) {       return sb.substring(0, semicolonIndex);     }     sb.delete(semicolonIndex, slashIdx);     semicolonIndex = sb.indexOf(";", semicolonIndex);   }   return sb.toString(); }

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

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

Мопед не мой

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

// org.springframework.util.StringUtils  public static String trimLeadingWhitespace(String str) {   if (!hasLength(str)) {     return str;   }   StringBuilder sb = new StringBuilder(str);   while (sb.length() > 0 && Character.isWhitespace(sb.charAt(0))) {     sb.deleteCharAt(0);   }   return sb.toString(); }

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

public static String trimLeadingWhitespace(String str) {   if (!hasLength(str)) {     return str;   }   int idx = 0;   while (idx < str.length() && Character.isWhitespace(str.charAt(idx))) {     idx++;   }   return str.substring(idx); }

Этот код значительно быстрее первоначальной версии, а также потребляет меньше памяти, ведь в худшем случае создаётся только один объект (в лучшем при idx = 0 метод str.substring()вернёт строку, на которой он был вызван).

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

Мелочь

Если в коде есть что-то вроде

char[] chars; //... return new String(chars, 0, chars.length);

то это всегда можно переписать в виде

char[] chars; //... return new String(chars);

Производительность это сильно не улучшит, однако, перефразируя рекламу моющего средства из 90-х, «если не видно разницы, то зачем писать больше?» 🙂

Заключение

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

ссылка на оригинал статьи https://habr.com/ru/post/529962/

Программа SmartData 2020

Мы уже рассказывали Хабру, что новая SmartData — это конференция про data engineering. Но что именно это значит на практике, какие доклады подходят под такое определение? На момент анонса мы могли объяснить только общими словами, а вот теперь программа конференции готова — так что показываем всю конкретику. Под катом — описания всех докладов.

А в преддверии конференции будет ещё и маленькое бесплатное онлайн-мероприятие о жизни дата-инженеров: 1 декабря на YouTube пройдёт разговорное шоу, где участники программного комитета конференции (Паша asm0dey Финкельштейн, Олег olegchir Чирухин, Дарья Буланова, Сергей Бойцов) обсудят свои проблемы и провалы — грубо говоря, как они тратили слишком много времени на решение простой задачи. Увидимся в YouTube-трансляции.

Оглавление

Streaming

Flink — мощный инструмент для потоковой обработки данных, при этом требует много от разработчика. Несмотря на то, что Flink поддерживает SQL, написать и запустить джоб во Flink не так просто. К счастью, Apache Zeppelin упрощает эту ситуацию. Кроме того, на Zeppelin можно выполнять интерактивную потоковую аналитику данных при помощи Flink и создать реалтайм-дашборд, при этом писать HTML/JS-код не нужно.
Джефф в своем докладе расскажет, как использовать Flink на Zeppelin, чтобы построить собственную платформу для потоковой аналитики данных.

Чем хорош спикер: Главный коммитер в Zeppelin
Чем хороша тема: Zeppelin — это индустриальный стандарт Exploratory Data Analysis (EDA). Джефф будет рассказывать про новую версию, которой еще нет ни у кого в продакшне.
Кому будет полезно: Всем, кто использует Zeppelin или Flink в продакшне.


«По пути из Kafka в NiFi: Как не сломать и не потерять», Роман Коробейников

В докладе рассказывается о построении отказоустойчивой схемы работы кластера Apache NiFi при использовании Apache Kafka в качестве источника входных данных.

Чем хорош спикер: VirtualHealth помогает американской системе здравоохранения решать их задачи. А где, как не там, будет большой поток данных?
Кому будет полезно: Доклад для тех, кто хочет справиться с большими нагрузками на NiFi и интеграцией с Kafka.
Почему здесь и сейчас: В VirtualHealth работают с очень большим потоком данных и знают, как с этим справиться.


«Advanced usage patterns of Scala UDF in PySpark», Андрей Титов

При использовании PySpark часто забывают о возможности использования UDF, написанных на Scala/Java. А ведь это отличный способ увеличить производительность приложения.
К сожалению, в официальной документации приводится самый базовый вариант их применения, который имеет ряд ограничений и не раскрывает всех возможностей применения Scala/Java UDF в PySpark.

В этом докладе Андрей расскажет, как:

  • заставить PySpark автоматически выводить тип данных, возвращаемых в UDF;
  • создать pyspark.sql.Column на базе UDF вместо использования spark.sql(…);
  • использовать Singleton Pattern для сохранения данных между вызовами функций и работы с внешними источниками из UDF;
  • избежать повторного вызова UDF на одних и тех же данных;
  • настроить логирование с помощью встроенного log4j.

Чем хорош спикер: Последнее время по долгу службы занимается стримингом на Spark и сталкивается с проблемами перфоманса.
Кому будет полезно: Тем, кто работает со Spark, дата-инженерам и разработчикам, которые напрямую взаимодействуют со Spark (Spark-инженеры).
Почему здесь и сейчас: предлагаются их нестандартные решения, о таком пути мало кто знает, очень глубокий взгляд на проблему.


«Stateful streaming: Кейсы, паттерны, реализации», Дмитрий Бугайченко

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


Storage

«Kusto (Azure Data Explorer): Интерактивная платформа Big Data Майкрософта», Александр Слуцкий

Kusto — это новая и стремительно набирающая обороты платформа для работы с Big Data. Несколько лет назад она завоевала весь Майкрософт, и сейчас Kusto используют буквально все сервисы Azure для анализа данных. Над Kusto также построены все линейки security и log analytics-продукты Майкрософта: Azure Monitor, Azure Sentinel, Microsoft Defender Advanced Threat Protection и многие другие. Вне Майкрософта Kusto существует под именем Azure Data Explorer, и с успехом используется в сферах e-commerce, gaming, manufacturing, automotive и других отраслях.

В докладе Александр расскажет, что отличает Kusto (Azure Data Explorer) от других решений, покажет, как сложная обработка лайв-стримов телеметрии размером в миллиарды строк (терабайты данных) может занимать секунды, и приоткроет занавес архитектуры, на которой построен Kusto.

Чем хорош спикер: Создатель этой базы — может отвечать на все вопросы про детали реализации и на любые вопросы по проекту.
Чем хороша тема: Интересный кейс создания с нуля нового распределенного движка базы. Это востребовано в Майкрософте и активно используется в компании.
Кому будет полезно: Тем, кто хочет написать или модифицировать свое хранилище.
Для тех, кто уже в облаке Майкрософта и хочет разобраться в нюансах использования.


«Kusto (Azure Data Explorer): Architecture and internals», Евгений Рыжик

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

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


«NeoFS: Хранение объектных данных по своим правилам», Станислав Богатырев

NeoFS — опенсорсная система, которая помогает решить проблему хранения фиксированных данных в ненадежной среде в соответствии с заданными пользователем правилами. Теперь можно разместить недорогие компьютеры и организовать на них хранение больших данных в нескольких офисах или даже дома у членов распределенной команды. NeoFS поддерживает протокол AWS S3, так что можно не переписывать любимый софт. А с помощью политики размещения можно хранить данные рядом с обработчиками и экономить время на передаче данных по сети.

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

Чем хорош спикер: Разработчик этой системы с нуля.
Чем хороша тема: Интересный подход к построению собственных хранилищ и экосистем.
Кому будет полезно: Тем, кого интересуют внутренности хранилищ или тем, кто хочет собственное хранилище.


«Безопасные интерактивные большие данные в банке: Business intelligence на Clickhouse», Павел Якунин

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

Существование Data Silo мешает использовать данные для поиска новых возможностей бизнеса. В Дойче нашли эффективный путь преодоления этой проблемы и построили безопасный и любимый аналитиками DWH на основе Clickhouse, Kafka и Spark.

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

Чем хорош спикер: Прошел всю дорогу создания DWH в компании DE, знает, какие решения там принимались и почему.
Чем хороша тема: ClickHouse — актуальная технология, BA на ней строят немногие, тем интереснее об этом послушать.
Кому будет полезно: Тем, кому интересны альтернативные подходы к построению хранилища BI.


«The latest and greatest of Delta Lake», Jacek Laskowski

Чем хорош спикер: Знаменитый эксперт в области Spark, автор серии книг «Взгляд изнутри» об Apache Spark, Delta Lake, Apache Kafka и Kafka Streams.
Чем хороша тема: Тема про то, что рано или поздно все превращается в SQL. DeltaLake — это понятная масштабируемая опенсорсная альтернатива для тех, кто использовал реляционные базы данных.
Кому будет полезно: дата-инженерам, которые хотят внедрить DeltaLake.


«Обзор технологий хранения больших данных. Плюсы, минусы, кому подойдет», Максим Стаценко

Доклад Максима будет про плюсы и минусы различных решений для хранения данных: облака или bare metal, Hadoop&CO, Vertica, ClickHouse, ExaSol, GreenPlum (ArenaDataDB), RDBMS, Teradata и другие.

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

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

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


«SQL-миграции в Postgres под нагрузкой», Николай Аверин

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

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

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


Tooling

«Пишем гибкие пайплайны для дата-платформ с Dagster», Андрей Кузнецов

На сегодняшний день не так часто говорят про унификацию построения дата-пайплайнов — особенно в ситуации, когда приходится вырываться из Java/Scala-мира и строить цепочки из компонентов со смешанными языками и технологиями.

Как подружить Spark + Scala-джобы и Python-приложения? Dagster дает удобные компоненты для написания и отладки таких пайплайнов, при этом имеет большое число интеграций с де-факто стандартами систем оркестрации, вычисления и так далее.

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

Чем хорош спикер: 7 лет преподавал, занимается ML и DE в Одноклассниках, продвигает эту идею в своей компании.
Чем хороша тема: Раскрывает альтернативный взгляд на проблему оркестрации дата-платформы.
Кому будет полезно: Всем, кто что-то оркестрирует.


«Версионирование структуры баз данных на примере хранилища», Владислав Шишков

Владислав расскажет про версионирование структуры баз данных на примере хранилища в Lamoda:

  • как ушли от SVN + Python + Jira + cron к Git + Liquibase + Bamboo;
  • как решали вопросы удобства разработки структур баз данных и какие есть подводные камни;
  • как поменяли процесс тестирования и деплоя.

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


«CI/CD для Ml-моделей и датасетов», Михаил Марюфич

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

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

Чем хорош спикер: Внедряет культуру MLOps в Одноклассниках.
Кому будет полезно: Дата-инженерам, перед которыми стоит задача продуктизации ML.


«Scio — data processing at Spotify», Neville Li

Scio — опенсорсный Scala API для Apache Beam и Google Cloud Dataflow, созданный Spotify для обработки петабайтов данных, как в режиме батчей, так и в потоковом режиме. Сейчас Scio используют десятки компаний.

Поговорим об эволюции big data в Spotify: от Python, Hadoop, Hive, Storm, Scalding до современного мира облаков и бессерверных вычислений. Рассмотрим, как выглядят классические кейсы использования «за кадром», например, Discover Weekly, Wrapped, a также трудности, с которыми пришлось столкнуться команде.

Поговорим и о некоторых фичах, которые выделяют Scio у Spotify из ряда других big data- фреймворков для Scala, включая Algebird, macros, shapeless и magnolia. Эти фичи делают обработку больших объемов данных легче, безопаснее и быстрее.


Industry use-cases

«Оцифровка рабочего в режиме реального времени», Алексей Коняев

«Цифровой рабочий» — это система, позволяющая определять местоположение людей и техники как на улице, так и внутри помещений с высокой точностью, а также получать телеметрию с различных датчиков.

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

Кому будет полезно: Тем, кому нужно делать комплексную архитектуру или stateful-обработку данных.


«Enterprise data platform: Инфраструктура данных как полигон для проверки бизнес-гипотез», Андрей Жуков

Доклад об опыте S7 в построении платформы данных. Андрей расскажет, как соединить между собой прогрессивные технологии, красивые книжки о data governance и суровую реальность авиакомпании с легаси. А еще покажет, как уложить данные, следить за ними, делать их открытыми и нужными для каждого сотрудника компании.

Что S7 используют: Openshift, Minio, Apache Spark, Apache Airflow, Apache Kafka, Python, Scala, Java, Dremio, Alation.

Кому будет полезно: Тем, кому предстоит построить хранилище, чтобы узнать еще какие-то подходы. Всем, кто хочет построить свою платформу данных, но боится все сделать неправильно.


«Predictive Maintenance в S7: Как данные помогают сделать ваш полет безопаснее», Валентин Азанов

И еще один доклад от S7. Валентин расскажет об опыте S7 в анализе телеметрии с различных бортов, о способах работы с такими данными, созданных инструментах и крутых инсайтах.

Что S7 использует: Apache Spark, Apache Airflow, Python, R.

Чем хороша тема: Команда S7 решает сложную оптимизационную задачу, связанную с предсказаниями.
Кому будет полезно: Тем, у кого есть задачи с предсказаниями и оптимизациями, DE. Всем, кто хочет знать, как устроена телеметрия с самолетов.


«Сегментация: Единое окно для знаний о пользователе, Ольга Макарова, Мария Носарева

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

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

Технологии в текущей версии: Kafka, Redis, ClickHouse, Quartz, Spring, Flink, ZooKeeper.

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

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


Architecture

«Retable DSL: Строим technology-agnostic data pipelines для современных стеков данных», Евгений Легкий

Retable DataFrame DSL — это новый open-source data pipelines DSL. C одной стороны, он сочетает в себе лучшие практики таких распространенных data-фреймворков, как Spark DataFrames и Python Pandas, с другой — является backend-agnostic, то есть не зависит от технологий бэкенда и позволяет исполнять data pipelines как поверх data warehouses в режиме ELT, так и в режиме ETL поверх data lakes, таких как Spark.

Евгений расскажет о современных тенденциях Modern Data Stack, о преимуществах и недостатках старого (ETL) и нового (ELT) подходов и причинах, которые привели к созданию своего независимого DSL. Также он поделится опытом, как удалось сочетать типизированный интерфейс для построения декларативных data pipelines, CI/CD-практики, скалируемость и возможность работать поверх любого стека — будь то Spark, Snowflake или генерация Pandas Code.


«Highly Normalized Hybrid Model, Или как мы внедрили свою модель хранения данных», Евгений Ермаков, Николай Гребенщиков

Общепринятым и проверенным временем подходом к построению DWH является схема «Звезда» или «Снежинка». Такой подход каноничен, фундаментален и совсем не отвечает той гибкости, к которой призывает Agile.

Для того, чтобы сделать структуру DWH гибкой, существуют современные подходы к проектированию: Data Vault и Anchor modeling — похожие и разные одновременно. Задавшись вопросом, какую из двух методологий выбрать, Евгений пришел к неожиданному ответу: выбирать надо не между подходами, выбирать надо лучшее из двух подходов.

В своем докладе спикер расскажет:

  • DV и AM: в чем разница и где точки соприкосновения;
  • «гибридный» подход к построению хранилища;
  • «фишки» этого подхода, его сильные и слабые стороны;
  • примеры кода, как это работает;
  • дальнейший вектор развития модели.

Чем хороша тема: Рассказывают новый интересный подход к построению архитектуры DWH.
Кому будет полезно: Архитекторам хранилищ данных и дата-инженерам, причастным к построению архитектуры DWH.


«Подходы к построению современной платформы данных. Проблематика и концепция реализации», Александр Ермаков

Александр расскажет об основных характеристиках современной платформы данных, о различиях в архитектуре DWH, об используемых компонентах и опенсорсном дистрибутиве Hadoop.

Чем хороша тема: Верхнеуровневый обзор возможной архитектуры с исторической частью
Кому будет полезно: Дата-инженерам, которые хотят погрузиться глубже в технические детали Hadoop, разработчикам, которые хотят перейти в data engineering.


«Обработка миллиардов событий в день с эволюционирующей схемой», Сергей Иванычев

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

Что будет в докладе:

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

Применяемые технологии: Apache Kafka, Apache Flink, AWS, S3, EKS, Compression, Spark, Parquet, JSON.

Чем хороша тема: Актуальна и применима: непредсказуемо меняющиеся схемы — это больная точка многих пайплайнов обработки данных и в Joom придумали, как это решить.
Кому будет полезно: DE, которые сталкиваются с этой проблемой.
Почему здесь и сейчас: Доклад от компании с огромными объемами данных.


«Наше хранилище для веб-аналитики», Артур Хачуян

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

Чем хороша тема: Расскажет про масштабирование от первых кастомеров до больших данных.

Если нашли в обзоре интересные для себя доклады, то ознакомиться с информацией подробнее и купить билет можно на сайте. А мы напоследок напомним, что конференция — это не только доклады. И в этот раз мы даже сделали «виртуальную площадку», где общение с другими участниками и посещение виртуальных стендов партнёров похоже на двухмерную игру. Ждём вас на SmartData онлайн с 9 по 12 декабря!

ссылка на оригинал статьи https://habr.com/ru/company/jugru/blog/530584/

На сайте-музее Winamp выложили 65000 скинов плеера

Разработчик из Facebook Джордан Элдридж (Jordan Eldredge) создал виртуальный музей Winamp в память о любимом плеере. На площадке можно бесконечно скроллить темы и ностальгировать по ушедшей MP3-эпохе. Мы провели здесь несколько часов, потратив это время далеко не впустую.

О Winamp на Хабре знают, наверное, все. Этот медиаплеер называют предшественником эры Spotify и iTunes. Когда-то любимые музыкальные композиции мы скачивали в формате MP3 (или брали у друзей жесткие диски с гигабайтами музыки) и загружали в проигрыватель. Легендарный плеер стал одним из самых популярных, его использовали десятки миллионов меломанов по всему миру.

Winamp — проигрыватель компании Nullsoft, проданной AOL в 1999 году и ликвидированной в 2013. Главная особенность плеера — возможность стилизовать его под предпочтения пользователя. По сети «гуляли» тысячи вариантов оформления.

И эти времена вернулись! Американский программист Джордан Элдрейдж вместе с некоммерческой организацией «Архив интернета» решили оставить онлайн-след о ключевой для многих эпохе становления и развития цифровой музыкальной индустрии. Они создали виртуальный Музей скинов Winamp. Страница музея выглядит как бесконечная лента из скинов плеера. Всего в коллекции 65 тыс. тем (!).

Скриншот витрины музея

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

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

История без точки


Придумали плеер Winamp в 1997 году восемнадцатилетний хакер Джастин Франкель и студент Дмитрий Болдырев. Первая версия приложения 0.20а работала только с одним файлом и не имела списков воспроизведения.

Популярность плеера выросла после выхода версии 1.00 через несколько месяцев после запуска. Эта версия имела спектрограмму, что было нетрадиционно для конца 90-х. За первые 18 месяцев существования медиаплеер скачали 15 млн человек. Версия плеера 2.90 сделала возможным просмотр видеофайлов.

Страница памяти о плеере

Официальная поддержка последней версии Winamp 5.666 (сборка 3516) заканчивалась 20 декабря 2013 года. Тогда Яндекс.Музыка предприняла попытку увековечить память о судьбоносной для электронной музыки эпохе. Была запущена страница под названием «Вспоминая Winamp». Полностью кликабельная страница выполнена в виде интерфейса рабочего стола Windows. Справа — открыто окно плеера. Слева, в ветви «Проводника», можно было выбрать папки с музыкой. Сейчас страница недоступна.

Но на этом история не остановилась. Во-первых, поддержка плеера не закончилась. Во-вторых, в 2014 году бельгийская компания Radionomy Group выкупила плеер. Цена не разглашалась, но предположительно составляла от $5 до 10 млн. СМИ называют компанию Radionomy Group агрегатором интернет-радиостанций. Она собиралась использовать плеер для знакомства аудитории плеера с их собственным сервисом и обеспечения новым контентом.

В 2018 году на сайте Winamp висело такое объявление

Плеер не обновлялся с 2013 года до осени 2018 года. Тогда вышла полностью бесплатная версия 5.8 с небольшими изменениями — из нее были убраны все платные функции, появившиеся в 2002 году.

Тогда же Radionomy Group сообщила в СМИ об обещании выпустить через год новую версию популярного плеера. Версию Winamp 6 намеревались сделать мобильной и десктопной, удобной для прослушивания подкастов, плейлистов из облака и стриминговых радиостанций. Разработчики обещали «сохранить былое наследие», но обогатить пользовательский опыт прослушивания. По оценке Radionomy Group, ежемесячная аудитория плеера в тот момент уже составляла 100 млн пользователей.

Однако релиз не случился. Для любителей осталась доступна браузерная версия медиаплеера.

Пока мы готовим новые материалы, пишите в комментариях, какие темы Winamp были у вас любимыми?

ссылка на оригинал статьи https://habr.com/ru/company/selectel/blog/530648/

ESP32 в окружении VSCode

В нескольких следующих статьях я хотел бы детально рассмотреть настройку окружения VSCode для работы с фреймворком ESP-IDF. Не совсем популярная комбинация ПО обладает как преимуществами, так и недостатками, которые при детальном рассмотрении мы попытаемся исправить, обойти или превратить в достоинства.

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

Поскольку предполагается многопользовательская удаленная разработка, то мы решили вначале отработать выбор и настройку самой среды разработки. После нескольких экспериментов с Eclipse, Visual Studio и QT Creator выбор пал на кроссплатформенный VSCode и плагин от разработчика Espressif IDF для работы с фреймворком ESP-IDF.

В качестве «сердца» контроллера рассмотрим двухъядерный микроконтроллер ESP32, который обладает рядом преимуществ, которые планируется использовать и раскрыть в проекте, а именно:

  1. ESP32 это не MCU, а SoC*, имеющий на борту:

    1. Wi-Fi: 802.11 b/g/n/e/i (802.11n @ 2.4 GHz up to 150 Mbit/s)

    2. Bluetooth: v4.2 BR/EDR and Bluetooth Low Energy (BLE)

      * Все эти интерфейсы мы планируем использовать для коммуникации с изделием. А вот аналоговый радиоканал и FPV использовать по возможности не планируем.

  2. 2 Cores 240 MHz up to 600 DMIPS

  3. ULP co-processor

В качестве ядра ESP32 использует Tensilica Xtensa 32-bit LX6, у которого есть свои недостатки, главным из который, на мой взгляд, пока является слабая производительность с операциями с плавающей точкой в реальных приложениях. Возможно, это связано с текущей версией ядра LX6 или с компилятором GCC 8 toolchain, пока нет точного понимания. Пока это создает некоторые теоретические проблемы со скоростью работы фильтра Калмана и похожих алгоритмов (реализация Madgwick и Mahony).

Есть информация, что новое ядро LX7 уже имеет большую производительность, но оно пока используется только в одноядерной версии ESP32-S2.

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

Более детальное сравнение ядер Xtensa vs ARM можно посмотреть здесь.

Начиная с версии фреймворка ESP-IDF v4.0 Espressif существенно улучшила техническую поддержку и дальнейшую разработку фреймворка. Качественно улучшилась техническая документация и поддержка разработчиков на форуме компании и GitHub. Кардинально улучшилась оперативность обработки сообщений об ошибках в фреймворке и их устранение. Ускорился выпуск новых версий базового фреймворка ESP-IDF, и дополнительных на нем основанных, например Arduino-ESP32.

Настройка окружения

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

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

В состав окружения будут входить, в порядке очередности установки:

  1. Git

  2. Python

  3. CMake

  4. VSCode ESP-IDF (далее фреймворк)

  5. ESP-IDF Tools (далее Toolchain)

Я рекомендую все утилиты ставить в отдельную папку в корень диска, например в C:\dev , за исключением VSCode.

А проекты сохранять в папку C:\dev\esp32 .

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

Git

Сначала поставим Git

Download URL: https://git-scm.com/

Installation path: C:\dev\Git

Python

Затем поставим Python

Download URL: https://www.python.org/downloads/

Installation path: C:\dev\Python39

Перед установкой убедитесь, что в папке C:\Users\UserName\AppData\Roaming\Python\Python39 не осталось скриптов от предыдущих установок. Почему скрипты для Python из Toolchain попадают в C:\Users\UserName\AppData\Roaming\Python\Python39 (внутри есть еще две папки \Scripts и \site-packages) для меня загадка. Правда скрипты попадают в эту папку только если производить установку ESP-IDF Toolchain из дистрибутива esp-idf-tools-setup-2.3.exe или более ранних версий. Буду признателен, если кто-то подскажет ответ.

(Q1) Вопрос 1: Почему скрипты для Python из дистрибутива ESP-IDF Tools попадают в папку C:\Users\UserName\AppData\Roaming\Python\Python39 (\Scripts и \site-packages), а не в папку с Python? Можно ли изменить этот путь на пользовательский?

Вообще буду признателен за комментарии и ответы на заданные по ходу статьи вопросы. В случае ответа на вопросы прошу начинать их в комментариях с префикса (Q1), где цифра после «Q» – номер вопроса, так их будет легче обрабатывать по тексту.

CMake

Теперь поставим CMake

Download URL: https://cmake.org/download/

Installation path: C:\dev\CMake

На текущий момент Toolchain ESP-IDF использует для сборки проекта только свою версию CMake v3.13.4, которая идет в комплекте, и категорически не хочет использовать другие, в отличии от Python. Это выглядит странно, поскольку на сколько мне известно, у версий 3.13-19 нет явных проблем с обратной совместимостью.

(Q2) Вопрос 2: Какие проблемы с обратной совместимостью есть у CMake версий 3.13-19? Почему Toolchain ESP-IDF не позволяет использовать альтернативные версии CMake?

VSCode

Теперь можно установить VSCode

Download URL: https://code.visualstudio.com/

Installation path: в папку по умолчанию

VSCode plugins

Далее необходимо поставить в VSCode два плагина:

  • Espressif IDF (espressif.esp-idf-extension)

  • C/C++ IntelliSense (ms-vscode.cpptools)

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

Default Terminal Shell

Перед тем как продолжить, я настоятельно рекомендую установить CMD как оболочку терминала VSCode по умолчанию. Дело в том, что по умолчанию после установки в VSCode в качестве терминала используется MS PowerShell, но не все скрипты, которые используются в плагине Espressif IDF для работы с фреймворком корректно выполняются в powershell. А в новой версии оболочки PowerShell, которую предлагается скачать и установить, эти скрипты выполняются еще хуже. К тому же далее мы будем использовать в настройках ESP-IDF некоторый лайфхак, который в PowerShell вообще не выполняется.

Для установки оболочки терминала по умолчанию запустите терминал Terminal ==> New Terminal и выберете окне терминала в выпадающем списке опцию Select Default Shell. Далее выберите в списке Command Prompt … cmd.exe

Окно терминала теперь можно закрыть.

Установка ESP-IDF

Если вы еще не убирали опцию Show Onboarding on Visual Studio Code start в настройках Espressif IDF, то после перезагрузки VSCode и выбора в правой части экрана иконки с логотипом Espressif – автоматически запустится мастер настройки ESP-IDF (далее просто Мастер).

ESSPRESSIF

Данный Мастер можно также вызвать командой ESP-IDF: Configure ESP-IDF extension (onboarding.start)

Теперь можно приступить непосредственно к установке и базовой конфигурации фреймворка и Toolchain.

Для начала выберем, где хранить настройки фреймворка.

Для первого раза я рекомендую сохранить настройки непосредственно в пустой папке нового проекта, которую мы предварительно создадим, например здесь: C:\dev\esp32\device01 , и откроем в VSCode. Это немного облегчит понимание, какие настройки, когда и для чего создает данный Мастер, и какие настройки понадобятся еще.

Для сохранения настроек в нашу папку выберем опцию Workspace folder settings и укажем путь C:\dev\esp32\device01.

Нажимаем START

_ User & Workplace

Небольшое отступление.

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

Локальные настройки применяются после Глобальных и имеют над ними приоритет, т.е. при дублировании настроек применяются Локальные.

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

Таким образом, те настройки, которые мы получим в результате работы Мастера и сохраним в папке проекта – будут для нас Локальными (Workspace), а в дальнейшем мы перенесем их и в Глобальные (User).

Select Python version to use

На данном экране необходимо указать путь к вашей версии Python. Его можно выбрать из выпадающего списка. Иногда скрипты Мастера дают сбой, и после выбора версии Python из списка предлагается снова ввести путь к исполняемому файлу python.exe вручную. Тут ничего нельзя поделать, придется повторить путь вручную.

Также на экране показана определившаяся в нашей системе версия Git, которую мы поставили ранее.

Проверяем путь к Python и нажимаем Configure ESP-IDF

Configure ESP-IDF

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

Можно также выбрать опцию Find ESP-IDF in your system и указать папку с ранее скаченным фреймворком. Именно этой опцией, скорее всего, вы будете пользоваться в дальнейшей повседневной работе.

Если вы хотите дополнительно использовать в своих разработках класс Arduino, как компоненту проекта, то необходимо выбрать версию ESP-IDF — release/v4.0 (release branch) или v4.0.2 (release version), т.к. фреймворк Arduino-ESP32 доступен сейчас только для версии v3.3, v4.0 и v4.2.

Однако, v3.3 уже морально устарела, а v.4.2, на мой взгляд, пока еще слишком сырая и не имеет окончательного релиза, хотя к моменту окончания нашей установки она может уже и стабилизироваться.

Использование более ранних версий фреймворков ESP-IDF и Arduino-ESP32 чем v.4.0 настоятельно не рекомендуется. Чтобы убедиться в этом можно просто ознакомиться с количеством изменений для базового фреймворка v4.0 по сравнению с версиями v3.x https://github.com/espressif/esp-idf/releases/tag/v4.0 , а фреймворк Arduino-ESP32 основывается как раз на базовой версии фреймворка ESP-IDF. Версии ниже v4.0 также плохо поддерживают, или вообще не поддерживают CMake, а все наши дальнейшие изыскания будут связаны именно с этой популярной системой сборки проектов.

Примечательно, что для Arduino IDE доступен только фреймворк Arduino-ESP32 на версии v.3.3 ESP-IDF, поэтому разработка в нашем окружении VSCode дает несомненное преимущество при работе с классом Arduino, как с компонентой проекта. Правда в этой связке тоже не все так гладко, о чем мы позднее поговорим более подробно.

Если вы хотите на этапе разработки проекта получать поменьше обновлений для вашего фреймворка, то необходимо выбирать версию (release version), а не (release branch).

А мы тем временем, выбираем release/v4.0 (release branch), а в качестве пути к фреймворку ESP-IDF укажем папку C:\dev , к которой автоматически добавится адрес \esp-idf .

Нажимаем Check here to download, после чего начинается процесс загрузки с GitHub.

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

Дело в том, что в плагине Espressif IDF версии 0.5.1 вот уже много месяцев присутствует ошибка для выбора release/v4.0 (release branch) – после загрузки репозитария v4.0 система пытается найти архив для версии 4.0.2

Будем надеяться, что в будущих версиях эту ошибку исправят. Соответствующую проблему я зарегистрировал на GitHub https://github.com/espressif/vscode-esp-idf-extension/issues/223

А нам остается только выбрать v4.0.2 (release version) и повторить загрузку.

После успешной загрузки и распаковки фреймворка Мастер предложит перейти к настройке утилит Toolchain.

Нажимаем Go to ESP-IDF Tools setup

ESP-IDF Tools Configuration

На данном экране выбираем Download ESP-IDF Tools

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

Теперь необходимо указать папку, в которую будет загружен Toolchain ESP-IDF Tools. Укажем C:\dev\.espressif .

Обратите внимание, ниже перечислены версии всех утилит, входящих в комплект Toolchain для ESP-IDF v4.0.2 – именно с ними будет гарантироваться работа (компиляция) как самого фреймворка ESP-IDF, так и компоненты Arduino-ESP32 v4.0.

Tool: xtensa-esp32-elf Version: esp-2020r3-8.4.0

Tool: esp32ulp-elf Version: 2.28.51.20170517

Tool: cmake Version: 3.13.4

Tool: openocd-esp32 Version: v0.10.0-esp32-20200709

Tool: mconf Version: v4.6.0.0-idf-20190628

Tool: ninja Version: 1.9.0

Tool: idf-exe Version: 1.0.1

Tool: ccache Version: 3.7

Нажимаем Download

Ждем несколько минут и в самом конце установки получаем в консоли ошибку:


  ERROR: Failed building wheel for psutil

    ERROR: Command errored out with exit status 1:

    VisualStudio is not installed; get it from http://www.visualstudio.com/en-au/news/vs2015-preview-vs

    error: Microsoft Visual C++ 14.0 is required. Get it with «Build Tools for Visual Studio»: https://visualstudio.microsoft.com/downloads/

WARNING: You are using pip version 20.2.3; however, version 20.2.4 is available.

You should consider upgrading via the ‘C:\dev\.espressif\python_env\idf4.0_py3.9_env\Scripts\python.exe -m pip install —upgrade pip’ command.


Оказывается, для установки одной из компонент wheel for psutil требуется ее предварительно скомпилировать с участием MS С++14 и именно из состава Visual Studio! Ну кто бы мог подумать?!

Я не стал пока искать альтернативных решений, а просто перешел по предложенной ссылке https://visualstudio.microsoft.com/downloads/ , скачал и установил VisualStudio.

После чего вернулся в окно VSCode и снова нажал Download.

Забегая вперед, скажу, что в этот раз установка ESP-IDF Tools закончилась успешно, все компоненты скомпилировались и установились. Однако мне осталось не ясным, нужен ли для успешной установки именно компилятор С++14 и состава Visual Studio, или подойдет любой другой компилятор С++14, установленный в системе?

Если у вас не было данной ошибки, значит в вашей системе стояли необходимые компиляторы. Буду признателен, если вы поделитесь описанием вашей конфигурации. С какими компиляторами установка ESP-IDF Tools завершилась у вас удачно?

(Q3) Вопрос 3: С какими компиляторами С++14, помимо штатного из состава Visual Studio, может успешно завершиться установка ESP-IDF Tools? Нужно ли обязательно при этом иметь в системе установленную программу Visual Studio, или достаточно только компилятора?

_ PIP

Перед тем, как вы тоже повторите действия выше с установкой Visual Studio и нажмете Download обратите внимание на последние строчки сообщения об ошибки. Там сказано, что в системе используется устаревшая версия pip в то время, как доступна более новая.

PIP – это система управления пакетами, которая используется для установки и управления программными пакетами, написанными на Python. На сколько я помню, pip попадает в систему автоматически при установке Python версии > 3.4.

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

Для этого запустим командную стоку CMD из меню Пуск и введем сначала команду C:\dev\.espressif\python_env\idf4.0_py3.9_env\Scripts\python.exe -m pip install --upgrade pip , а затем python -m pip install --upgrade pip

Дело в том, что первая команда обновит pip в локальной копии idf4.0_py3.9_env, а вторая команда обновит pip уже в основной системной версии Python.

_ PIP cache

Еще один нюанс кроется в кэше pip. Если после всех установок и настроек ESP-IDF вы вдруг решите удалить Visual Studio со всеми дистрибутивами C++, а потом решите повторно запустить мастер настройки ESP-IDF, то процесс установки ESP-IDF Tools пройдет успешно, как ни в чем не бывало. Дело в том, что в процессе предыдущей установки pip сохранил в кэш результаты всех успешных компиляций. Кэш находится по адресу C:\Users\UserName\AppData\Local\pip\cache , и далее, при повторных установках, если в кэше находится файл для утилиты подходящей версии, то он берется именно из кэша. Новые файлы будут компилироваться только для новых версий утилит из Toolchain.

Для того чтобы провести полную переустановку Toolchain для ESP-IDF, без использования кэша pip, достаточно просто удалить папку C:\Users\UserName\AppData\Local\pip\cache\wheels , это вернет в консоль сообщение о недостающем дистрибутиве С++14, если таковой отсутствует в вашей системе.

Теперь скачиваем Visual Studio https://visualstudio.microsoft.com/downloads/ , устанавливаем его с одной единственной опцией «Разработка классических приложений на C++», возвращаемся в окно VSCode и…

Примечание: не стоит пока выбирать опцию Разработка на Python, поскольку это установит в систему еще одну копию Python более низкой версии, что может создать трудности для дальнейшей настройки и работы фреймворка ESP-IDF.

Возвращаемся на шаг назад, нажав на стрелку влево над надписью ESP-IDF Tools, нажимаем Download ESP-IDF Tools и снова нажимаем Download.

В случае успешной установки Toolchain станет доступна кнопка Go to next step.

В логе ниже мы увидим снова предупреждение, что используется устаревшая версия pip. Да как так-то?..

Дело в том, что если мы отмотаем лог наверх, то найдем сообщение:

Creating a new Python environment in C:\dev\.espressif\python_env\idf4.0_py3.9_env ...

Да, Мастер создал новую версию локального окружения Python, в которую поместил версию pip, идущую в комплекте с Toolchain, а не ту, которая установлена и обновлена в системном Python. Почему Мастер не взял системную версию pip – неизвестно. Будем надеяться, что в будущих версиях Матера это поправят.

Чтобы снова обновить локальную версию pip снова выполняем в командной строке команду C:\dev\.espressif\python_env\idf4.0_py3.9_env\Scripts\python.exe -m pip install --upgrade pip

Нажимаем Go to next step

Verify ESP-IDF Tools

Теперь мастер предлагает нам проверить все абсолютные пути для утилит из Toolchain.

Обратите внимание, мастер сделал локальную копию нашего Python39 со всеми скриптами и окружением — idf4.0_py3.9_env, и менять этот путь не стоит.

Также учтите, что несмотря на установленный в системе CMake v3.19 ESP-IDF использует свой CMake v3.13.4, и это доставит нам в дальнейшем некоторые сложности. Заменить путь к CMake более новой версии на данном этапе пока не удастся, т. к. на следующем шаге проверки Мастер укажет на несоответствие версий и не даст завершить настройку. Поэтому оставляем все как есть.

Нажимаем Click here to check tools exist

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

Если все соответствует – везде появятся положительные галочки и сообщения … are satisfied.

Нажимаем Go to next step

ESP-IDF Tools have been configured

И вот она, заветная надпись об успешном окончании установки.

Настройки проекта

Однако не спешите пока открывать примеры кода. Давайте посмотрим вначале, что же записал мастер настройки ESP-IDF в нашу папу, которую мы указали в самом начале как C:\dev\esp32\device01

В данной папке появилась папка .vscode с единственным файлом settings.json который содержит всего пять строк:

{

    «idf.espIdfPathWin»: «C:\\dev\\esp-idf»,

    «idf.toolsPathWin»: «C:\\dev\\.espressif»,

    «idf.customExtraPaths»: «C:\\dev\\.espressif\\python_env …»,

    «idf.customExtraVars»: «{\»OPENOCD_SCRIPTS …»,

    «idf.pythonBinPathWin»: «C:\\dev\\.espressif\\python_env …»

}

Это пять основных переменных, которые определяют какой именно фреймворк ESP-IDF и Toolchain будут применяться для компилирования и работы с проектом.

Но это еще не все настройки, которые нам необходимы.

Теперь давайте создадим еще одну папку, например C:\dev\esp32\device02 , откроем ее в VSCode и выполним команду ESP-IDF: Add vscode configuration folder, далее будем для краткости называть ее ESP:Avcf. Для выполнения команды нажмите F1 и начните набирать ESP, далее уже можно выбрать команду из списка.

Теперь в папке .vscode появилось уже 4 файла. Причем в фале settings.json нет переменных, которые мы получили после мастера настройки ESP-IDF. А в фале c_cpp_properties.json как раз есть ссылки на эти переменные с путями к фреймворку и Toolchain.

Более того, если бы мы выполнили команду ESP:Avcf в нашей первой папке device01, то наши настройки были бы перезаписаны новым файлом settings.json .

Все дело в том, что, к сожалению, эти две команды работают не совсем взаимосвязано. Мастер настройки ESP-IDF запоминает в переменных среды idf пути к фреймворку и toolchain и сохраняет их, в нашем случае, Локально. А команда ESP:Avcf создает конфигурационные файлы ВСЕГДА используя Глобальные переменные.

Теперь получается, для того чтобы корректно заработали настройки в c_cpp_properties.json, нам необходимо сохранить наши переменные Глобально? И да, и нет.

Дело в том, что, как мы уже говорили ранее, параметры Workspace (Локальные) применяются после параметров User (Глобальных), и если и там и там есть одни и те же параметры, то Workspace имеет преимущество перед User и перезаписывает их. Таким образом, мы может как внести наши переменные в User, так и добавить их в наш Workspace, после параметров, созданных командой ESP:Avcf, в низ файла settings.json, непосредственно в папку .vscode в нашей папке проекта . И то и другое будет работоспособно.

Однако, если вы ведете совместную разработку проекта, например на GitHub, то вам я рекомендую обязательно внести все настройки в файл settings.json в самом проекте, чтобы гарантировать себе, что проект будет собираться в одном и том же фреймворке и Toolchain у всех участников разработки.

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

Внести настройки переменных idf в User можно как вручную, так и еще раз запустив Мастер, выбрав в самом начале опцию User settings и далее указав папку уже со скаченным фреймворком ESP-IDF.

Но в начале давайте откроем один из примеров кода и попробуем скомпилировать его с Локальными настройками.

ПРИМЕРЫ КОДА и КОМПИЛЯЦИЯ

Чтобы открыть библиотеку примеров кодов ESP-IDF выполним команду ESP-IDF: Show ESP-IDF Examples Projects.

В открывшемся списке выберем проект get-started\blink и нажмем кнопку Crate project using example blink. Разместим проект в папке esp32.

Теперь откроем файл .vscode\settings.json и добавим в конец файла наши настройки из папки device01. Будьте внимательны с синтаксисом JSON, не забудьте про запятые и фигурные скобки.

Теперь перейдем на фаqл с кодом проекта main\blink.c .

Обратите внимание, после открытия проект содержит две проблемы — BLINK_GPIO и portTICK_PERIOD_MS подкрашены красным системой проверки синтаксиса C/C++ IntelliSense. Мы разберем этот момент чуть позже, следующей статье про тонкие настройки окружения VSCode.

А сейчас выполним команду ESP-IDF: Build your project.

Первый процесс компиляции занимает несколько минут, поскольку создается папка build, последующие будут происходить значительно быстрее. В конце компиляции появится сообщение Build Successfully. Это значит, наши Локальные настройки применились успешно.

К сожалению, в случае компиляции проекта командой ESP-IDF: Build your project не происходит отображения лога компиляции в окне терминала. Но можно выполнить эту команду другим способом, из меню Terminal => Run Task… => Build – Build project или Terminal => Run Build Task…

Если окно терминала не было открыто, оно откроется автоматически и в конце компиляции в терминале появится сообщение Project build complete. To flash, run this command:..

Выполнение команд из меню Terminal обеспечивается скриптами в файле .vscode\task.json , но их ход выполнения немного отличается от аналогичных команд через меню F1, например ESP-IDF: Build your project.

На этом мы пока прервемся – мы смогли сделать базовую настройку плагина Espressif IDF для работы с VSCode и успешно скомпилировали один из примеров кода из библиотеки фреймворка.

В следующей статье мы займемся более тонкой настройкой окружения VSCode и самого фреймворка – рассмотрим утилиту menuconfig, новые скрипты для task.json и решим проблему с не всегда корректной подсветкой синтаксиса IntelliSense, также рассмотрим выполнение команд фреймворка из командной строки.

ссылка на оригинал статьи https://habr.com/ru/post/530638/

One way ticket, или как переехать в другую страну по работе: истории разработчиков

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

Из Украины в США — Александр Федоров, разработчик из Кремниевой долины

Я переехал из Украины в США в 2013 году. В сфере программирования работаю с 2007 года, а в течение трёх лет до переезда был ведущим разработчиком с хорошей зарплатой. Высшее образование получил в Киевском политехническом институте по специальности «Прикладная математика» и параллельно закончил бакалавриат в сфере финансов. После университета я устроился в небольшую компанию-разработчика роботов из Нью-Йорка для торговли на фондовом рынке. А затем пять лет проработал в Google на компанию EPAM. 


Первый раз в Сан-Франциско, июнь 2013 года. Уже стало понятно — путь лёгким не будет

Почему решил уехать из своей страны

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

Конечно, работая в американских компаниях, я рассматривал вопрос переезда в США. 

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

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

На моё финальное решение повлияло несколько факторов:

  • компания-работодатель занималась оформлением Green Card через год после начала работы;
  • в моей стране случилась сначала одна революция, потом вторая. Я сам из Крыма, а жена из Донецка; 
  • всё больше знакомых предпринимателей постепенно уезжали в другие страны и переводили туда свой бизнес;
  • EPAM предоставляла возможность переезда сотрудников в свои офисы в других странах. Мне предложили работу в Калифорнии — нужно было только согласиться и удачно пройти собеседование с клиентом EPAM. Компания полностью организовывала мой переезд в США, оказывала поддержку, поэтому этот вариант переезда мне показался самым простым.

Моё решение поддержали родители и близкие люди. Но тогда я не знал, что на новом месте всё будет не так, как в Украине, где у меня не было финансовых проблем. Сейчас я бы поступил совсем по-другому. Но тогда я оказался «на цепи» –– у меня не было возможности сменить компанию, но и зарабатывать больше на этом месте я тоже не мог. По факту компания определила мою судьбу вплоть до того, что могла отправить меня обратно в Украину, если бы не смогла занять меня работой. 

Как устраивался на работу в США

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

Все собеседования я проходил удалённо. Сначала было интервью с HR из местного отделения EPAM, а затем с представителем калифорнийского офиса. 

На первое интервью я опоздал на полчаса — стоял в декабрьских пробках без доступа к компьютеру. 

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

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

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

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

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

Как проходил переезд: подготовка документов и сборы

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

Обычно процесс переезда занимает 6–8 месяцев, но в моём случае он затянулся из-за новогодних праздников, которые в США длятся с середины декабря до середины января. Собираясь в Америку, мы быстро продавали всё имущество, которое не брали с собой. Я улетел первым, а через месяц приехала жена. 

Первое время в новой стране компания обеспечивала полный пакет услуг по размещению и адаптации. Нам оплатили на 1 месяц аренду жилья и автомобиля, а также перелёт туда и обратно — на случай, если я захочу просто улететь домой. Так как я переезжал по временной визе, то оплата расходов на перелёты –– это обязательное условие визы от правительства США. В аэропорту меня встретил человек, который показал мою машину и проводил до рабочего места. Также в пакет входили любые юридические и карьерные консультации. 

Дорого ли жить в Кремниевой долине

Спойлер: да. 

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

Мы накопили к переезду $50 000. Но уже в первый месяц стало ясно, сколько на самом деле нужно денег для жизни в Калифорнии. 

Например, система налогообложения в США совсем другая: в Украине я платил только 5% налогов от дохода (в Украине я работал как ФОП — аналог ИП в России), а здесь долгое время не понимал, какую зарплату получу по итогу месяца. 

Нужно быть готовым к тому, что компания, оговаривая с работником условия переезда, зачастую даёт искаженную информацию о ценах на недвижимость –– минимальные расценки, а не средние. Так, квартира в объявлении может стоить $800 в месяц, а в реальности $1 700 в месяц. То же самое со стоимостью детских садов. 

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

Пару лет я «тонул» в плане финансов. Уже на второй месяц работы в EPAM я понял, что для комфортной жизни мне нужно искать работу в другой компании с более высоким доходом. Теперь я работаю на позиции Software Engineer в компании Indeed –– крупнейшей платформе по поиску работы. Только сейчас я вышел в ноль, чувствую себя уверенно и могу позволить несколько раз в год летать на отдых в Европу или уехать в путешествие по соседним штатам. В среднем такая поездка обходится в 3 500 долларов за 10 дней отдыха.

Многие возвращаются домой — это факт

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

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

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

Тем не менее, наша семья до сих пор в процессе адаптации к окружающей среде. Например, в ближайшее время я пойду на курс по развитию soft skills за $1 500, чтобы научиться проще и быстрее выстраивать знакомства и ускорить свой карьерный рост. Еще я пошел учиться в местный колледж на MBA, где преподают бизнес-эксперты из местных компаний. Учёба нравится ещё и возможностью нетворкинга. 

Как переезд изменил мою жизнь

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

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

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

Я изменился за время проживания в этой стране: фокус сместился с материальных ценностей на духовные. Теперь для меня важнее общение с людьми, положительные эмоции и жизнь в комфорте. А стремления покупать дорогую машину и жить в замке вообще исчезли. Я живу в доме, который старше моих родителей, но находится рядом с двумя озёрами, бассейнами и фонтанами, а недалеко расположен парк-заповедник с вековыми деревьями. Океан в 40 минутах езды. 

Здесь я стал по-другому водить машину. Было тяжело сдать экзамен на водительские права –– у меня получилось только с третьей попытки. Мы постоянно попадали на штрафы за нарушение ПДД — я не привык, что нужно уступать дорогу пешеходу, который ещё находится на другой стороне. 

Выводы, которые я для себя сделал

  • Опыт жизни за границей серьёзно меняет человека: начинаешь по-другому воспринимать окружение, обстоятельства и события. Поэтому если появляется возможность переехать в другую страну — надо пробовать. 
  • Стоит инвестировать как можно больше денег, желания и внимания в soft skills –– то, как общаешься, строишь свой социальный круг. В США эти навыки оказались важнее hard skills: освоить новую технологию не трудно, но не всегда понятно, как искать работу и проходить собеседования, с кем и как общаться, а также проводить совместное время.
  • Можно устроить себе тест: попробовать пожить несколько месяцев в другом городе или стране, найти себе окружение и адаптироваться к новым условиям. Так становится проще понять, насколько комфортно жить в новых условиях, когда рядом нет ни родственников, ни друзей, ни коллег. 
  • Увы, иногда нужно умерить аппетиты. Даже если считаешь себя крутым специалистом на родине, в США всё может оказаться иначе: сюда приезжает много талантливых специалистов со всего мира, и конкуренция катастрофическая. Может получиться так, что уровень, который в родной стране считалось высоким — в США будет соответствовать навыкам и знаниям новичка. 

Из России в неизвестность — Сергей Кундрюков, разработчик в EPAM, о подготовке к отъезду

По образованию я — ветеринарный врач. Но с недавних пор работаю программистом: больше полутора лет проработал в Газпромбанке, а сейчас занимаю должность ведущего разработчика в EPAM Systems, параллельно учусь в магистратуре по направлению IT и в Нетологии — Data Science. Диплом магистра в сфере IT мне нужен, потому что его наличие увеличивает шансы трудоустройства и переезда в другие страны.


Однажды я побывал в гостях у Яндекса. Их внутренняя атмосфера подтолкнула меня к переходу в IT

Почему хочу переехать

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

Помимо этого, я не уверен в эффективности российской системы налогообложения. Кажется, что она хороша: платишь только 13% от дохода и всё. На самом же деле мы платим ещё НДФЛ, НДС, а работодатели платят социальные взносы на пенсию, и в конечном итоге это и получаются 40–60% от твоего реального заработка. Увижу ли я эти деньги? Не уверен — сейчас мне тридцать лет, из них 14 лет я работаю, не всегда официально. Залез в пенсионные накопления, и увидел там сумму своей будущей пенсии — за всё время накопилось всего 3 000 рублей. А у знакомого, который переехал в Техас, за полгода 5 000–6 000 долларов на пенсионном счету. И эти деньги, если он не успел выйти на пенсию, никуда не испаряются, как в России, а достанутся его супруге. Это большая разница. В России, конечно, существуют негосударственные пенсионные фонды, но платить туда нужно из собственного кармана, а работодатель всё равно обязан делать отчисления в ПФР. 

По каким принципам выбираю страну

Мы с женой рассматривали следующие варианты: 

  • Европейские страны — но там можно слишком быстро достичь потолка профессионального роста. Северная Европа отпала, потому что там холодно, а в других европейских странах невысокие зарплаты.
  • Страны Азии — во многих из них низкий уровень жизни. Китай я не рассматривал, потому что не хочу жить при коммунизме. Мне предлагали работу в Таиланде с хорошей зарплатой, но там очень мало достойных школ. В Сингапуре очень дорого, но высокий уровень жизни, и можно достичь хороших карьерных высот. 
  • Канада — туда не сложно переехать и найти работу, в стране хороший уровень жизни, высокие зарплаты, но холодно. Это единственное, что меня отталкивает. 
  • США — переезд туда для меня сейчас невозможен без высшего образования в IT-сфере. Я могу податься только на неиммиграционную визу О1 — эта виза выдаётся иностранцам, которые обладают исключительными способностями и являются выдающимися специалистами в своей сфере, выступают на конференциях и ведут научную деятельность. 
  • Мексика — несмотря на невысокие зарплаты в этой стране, мы всерьёз её рассматривали. Причин несколько: во-первых, если ребёнок рождается в Мексике, он получает местное гражданство, по которому можно въехать во многие страны. Однако родителям-иностранцам гражданство и постоянную визу не дадут. Во-вторых, там неплохое здравоохранение и образование, хорошее качество продуктов. Большой минус Мексики –– низкий потолок роста зарплаты. Поэтому рассматриваю это страну в качестве временного релокейта. 
  • Страны Южной Америки — Чили и Аргентину — мы тоже не выбрали. В них нужно хорошо знать испанский, а мы не говорим на этом языке. 
  • Арабские Эмираты — местное гражданство ты никогда не получишь, а переезд в Дубаи и Абу-Даби сложно организовать.

В результате разных небольших исследований я составил список стран, куда точно хотел бы поехать. Среди них Мексика, Великобритания, Испания, Канада, Сингапур и США.

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

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

При подготовке легко потерять мотивацию — поэтому постоянно держу в голове цель и двигаюсь понятными шагами

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

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

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

Для себя я понял, что проще разбить каждую большую задачу на маленькие кусочки — и постоянно напоминать себе о том, что мотивирует. 

Вот как я двигался

  • В первую очередь определился с тем, что меня мотивирует и задал себе вопрос: а нужна ли действительно релокация или достаточно просто сменить город? Какое-то время я посвятил тому, что размышлял над разными вариантами и в итоге точно понял, что я хочу переехать. Я принял решение, глядя на друзей жены, которые недавно переехали в Майами и родили там первого ребёнка. Я хочу жить в подобном месте и готов как следует поработать для этого.
  • Дальше составил список стран, куда было бы интересно переехать, и собрал общую информацию о будущем месте проживания, возможностях трудоустройства, быте и ценах. Я изучал в интернете местные сайты и форумы, комментарии людей. Во время поиска стало понятно, что существуют сотни нюансов и подводных камней, о которых невозможно узнать без тщательной подготовки. Так, например, в Эмиратах не смогут найти работу одинокие иностранные женщины. 
  • Затем принялся искать людей, которые живут и работают там, куда мне было бы интересно переехать — я смотрел, что они пишут в соцсетях, общался. Таких ребят много во ВКонтакте и LinkedIn, часто они очень общительны, готовы делиться своей историей.

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

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

    Иногда на таких собеседованиях я позволял себе немного провокаций. Например, когда меня звали работать в Германию, то предложили зарплату в 4 000 евро в месяц на первое время с последующим повышением до 5 000 евро — а я сказал, что буду работать только за 10 000 евро в месяц. В итоге HR рассказала мне кучу информации о Германии, зарплатах и жизни в стране, стоимости аренды жилья и прочее. Если сбить человека с толку, он начнёт выдавать разные интересные факты на эмоциях, говорить не продажными терминами. Это помогает составить более приближенное к реальности впечатление о стране, а не жить нарисованной в голове картинкой. 

Сейчас я стою на пороге своей первой долговременной релокации, мне осталось подтянуть свой английский с B1 до B2. Помимо этого, сейчас я переключился на изучение Node.js и развитию soft skills в качестве тимлида на проекте. Это ценится в целевых местах и я решил сконцентрироваться на этом. Надеюсь, скоро дополню свою историю уже с той стороны часовых поясов.

От редакции

Курс «Карьера в IT за границей: от резюме до переезда» — помогаем IT-специалистам подготовиться к релокации и сформировать индивидуальный план переезда.

ссылка на оригинал статьи https://habr.com/ru/company/netologyru/blog/530650/