<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Kirill Valitskii</title><subtitle>SWE, 22 yrs old.</subtitle><author><name>Kirill Valitskii</name></author><id>https://teletype.in/atom/cybeaster</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/cybeaster?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@cybeaster?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cybeaster"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/cybeaster?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-21T01:57:28.435Z</updated><entry><id>cybeaster:ue_roadmap_p1</id><link rel="alternate" type="text/html" href="https://teletype.in/@cybeaster/ue_roadmap_p1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cybeaster"></link><title>Roadmap Unreal Engine / C++ developer</title><published>2024-01-28T07:17:21.234Z</published><updated>2024-01-28T07:19:39.028Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/bd/7d/bd7d504a-e07c-4c5e-a04b-f4cfc3cb87d1.png"></media:thumbnail><category term="game-dev" label="GameDev"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/f2/b7/f2b733f8-e350-478c-a3b1-62c662230fb7.jpeg&quot;&gt;Unreal Engine для начинающих.</summary><content type="html">
  &lt;p id=&quot;jPWR&quot;&gt;&lt;br /&gt;Прежде чем начать перечислять технологии, давайте для начала определим, кто решил подойти к этому моменту:&lt;/p&gt;
  &lt;ul id=&quot;r2KN&quot;&gt;
    &lt;li id=&quot;B1Aq&quot;&gt;Программист из геймдева, Godot, Unity и т.д.&lt;/li&gt;
    &lt;li id=&quot;qn00&quot;&gt;Программист, меняющий стэк из другой области, не геймдев.&lt;/li&gt;
    &lt;li id=&quot;yrbJ&quot;&gt;Начинающий программист без какого либо опыта, в том числе с языками программирования.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cOoC&quot;&gt;Во всех трех случаях подход будет разный, однако, основные моменты будут такими же. &lt;/p&gt;
  &lt;p id=&quot;VSGH&quot;&gt;Важно понимать, что внутри позиции Unreal Engine / C++ Developer скрыто множество под-областей. &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;9odp&quot;&gt;Вы можете:&lt;/p&gt;
    &lt;ul id=&quot;trdN&quot;&gt;
      &lt;li id=&quot;3HfW&quot;&gt;Заниматься UI&amp;#x27;ем, изредка касаясь написанием кода. &lt;/li&gt;
      &lt;li id=&quot;lsgH&quot;&gt;Писать/дописывать инструментарий для других разработчиков.&lt;/li&gt;
      &lt;li id=&quot;4GnI&quot;&gt;Программировать мультиплеерную логику или клиентскую для общения с сервером.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;p id=&quot;nujs&quot;&gt;И это далеко не полный список. Можно включить физику, звуки, и даже рендер. &lt;/p&gt;
  &lt;p id=&quot;uW9D&quot;&gt;В разных командах вы можете встретить разные подходы к делению обязанностей среди программистов.&lt;/p&gt;
  &lt;p id=&quot;Pl4c&quot;&gt;В моей компании часто приходиться заниматься всеми перечисленными пунктами.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;Tu0t&quot;&gt;Ниже я сначала опишу, как каждому типу людей стоит подходить к изучению топика, и далее уже укажу конкретные вещи, которые спрашивают на собеседованиях и полезные ресурсы.&lt;/p&gt;
  &lt;p id=&quot;90tO&quot;&gt;Помимо прочего, я крайней рекомендую всем уделять внимание общедоступным проектам, из которых вы можете подчерпнуть best-practice&amp;#x27;ы. &lt;/p&gt;
  &lt;p id=&quot;KoJv&quot;&gt;Их можно найти или на гитхабе, или на маркетплейсе Epic Games. &lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;3GUf&quot;&gt;Неопытный&lt;/h2&gt;
  &lt;p id=&quot;QzNw&quot;&gt;Вы не знакомы с языками программирования и не знаете, что представляет собой Unreal Engine.&lt;/p&gt;
  &lt;p id=&quot;LN5j&quot;&gt;Вам я исключительно советую прибегнуть к курсам и/или видео на ютубе, где с нуля пишут какой-то микро проект.&lt;/p&gt;
  &lt;p id=&quot;cEhB&quot;&gt;В вашем случае желательно подойти в первую очередь со стороны Blueprints, т.е скриптовым визуальным языком программирования. Он даст вам базовое понимание работы Actor&amp;#x27;ов, Component&amp;#x27;ов, сцены и т.д.&lt;/p&gt;
  &lt;p id=&quot;EV78&quot;&gt;После освоения базы, можно пытаться переносить код на C++, параллельно вникая в устройство этого языка программирования.&lt;/p&gt;
  &lt;p id=&quot;CYl3&quot;&gt;Важно отметить, что в контексте скриптовки игровой логики для движка вам потребуется лишь небольшая часть этого языка. Поэтому так же советую смотреть гайды по нему в контексте Unreal Engine, чтобы не обнаружить себя на  cppreference.com, вникающим в какой нибудь локальный &lt;a href=&quot;https://en.cppreference.com/w/cpp/string/basic_string&quot; target=&quot;_blank&quot;&gt;ужас&lt;/a&gt;, который вас вероятнее всего отпугнет.&lt;/p&gt;
  &lt;p id=&quot;NEUA&quot;&gt;Лично я начинал с &lt;a href=&quot;https://www.udemy.com/course/unrealcourse/&quot; target=&quot;_blank&quot;&gt;курса на Udemy&lt;/a&gt; и &lt;a href=&quot;https://youtu.be/DywBqQtTHMo?si=iZ1irDQGsiIOt9FB&quot; target=&quot;_blank&quot;&gt;небольшого шутера на ютубе&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;f3h2&quot;&gt;В процессе создания пет-проекта стоит вносить некоторые правки в предлагаемый код. Придумывать и изменять логику игры, чтобы лучше разобраться в механике работы движка и его сущностей.&lt;/p&gt;
  &lt;p id=&quot;kEN3&quot;&gt;Также, важно избегать типичных ошибок новичков: &lt;strong&gt;пытаться понять все и сразу&lt;/strong&gt;. Если вам совсем не очевидно как работают Line Trace&amp;#x27;ы или Behaviour Tree, и вы несколько часов копаетесь в исходниках или гайдах, стопаря процесс создания игры, то так не долго и выгореть.&lt;/p&gt;
  &lt;p id=&quot;BCm3&quot;&gt;Крайне советую оборачивать слишком непонятные вещи в абстрактные &lt;em&gt;&lt;strong&gt;Кидает луч&lt;/strong&gt;&lt;/em&gt;, или &lt;em&gt;&lt;strong&gt;Выполняет действия по порядку с условиями&lt;/strong&gt;&lt;/em&gt;, чтобы потом к ним вернуться и уже на базе написанного проекта с ними экспериментировать.&lt;/p&gt;
  &lt;p id=&quot;KueZ&quot;&gt;Как только освоите базовые понятия, указанные, например, в курсе на Udemy и напишете свой проект, можете начинать искать работу для собора фидбека, или устроиться в стартап на бесплатную основу, чтобы получать хоть какой-нибудь опыт.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ol4h&quot;&gt;Бывалый, не геймдев.&lt;/h2&gt;
  &lt;p id=&quot;JYFa&quot;&gt;Для вас главной проблемой станет иерархия типов и структур в движке, и сама механика работы real-time движков. &lt;/p&gt;
  &lt;p id=&quot;5Kng&quot;&gt;Вы можете приступать сразу к языку и его основам. После - писать свой проект на базе того же &lt;a href=&quot;https://www.udemy.com/course/unrealcourse/&quot; target=&quot;_blank&quot;&gt;курса на Udemy.&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;D72n&quot;&gt;Поскольку для вас главной проблемой будут абстракции, которые предоставляет движок, и архитектура, я так же рекомендую почаще читать исходники движка, хотя бы на самом высоком уровне, и &lt;strong&gt;чужие проекты, &lt;/strong&gt;чтобы схватывать паттерны работы и лучшие практики, которые использовали сами создатели движка и другие программисты.&lt;/p&gt;
  &lt;p id=&quot;VZBN&quot;&gt;В остальном все так же как и у начинающего: пишете свой первый проект на C++, и с ним можете идти на собеседования.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;RMdZ&quot;&gt;Бывалый, геймдев.&lt;/h2&gt;
  &lt;p id=&quot;6wsR&quot;&gt;Советы тут будут похожи на предыдущий пункт, за тем исключением, что поскольку вы знакомы с общей абстракцией в виде Actor&amp;#x27;ов, миров, уровней и компонентов, вам стоит в первую очередь ознакомиться с разницей в функциональностях движка, и тем, как с ними работать.&lt;/p&gt;
  &lt;p id=&quot;m9r1&quot;&gt;Советую все так же начать писать свой проект, но уже сильно больше внимания обращать на другие проекты, т.к вы найдете много пересечений с другими движками. Возможно даже вам не понадобится курс. Можете сразу скачать готовый проект и разбираться в нем.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;xDtl&quot;&gt;Цели&lt;/h2&gt;
  &lt;p id=&quot;PDbD&quot;&gt;Ниже приведен список компонентов и ключевых сущностей движка, порядочное изучение которых и составит своеобразную Road map&amp;#x27;у.&lt;/p&gt;
  &lt;p id=&quot;BdZV&quot;&gt;Тип деления на абстракции я выбрал произвольно, так, как посчитал нужным на основании своего опыта.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;7sxV&quot;&gt;Акторы&lt;/h3&gt;
  &lt;p id=&quot;RYnu&quot;&gt;Самый простой компонент движка, который можно поставить на сцену: &lt;code&gt;AActor&lt;/code&gt; и его производные: &lt;code&gt;APawn&lt;/code&gt; и &lt;code&gt;ACharacter&lt;/code&gt;. Нужно понять их схожести и различия. Как они работают с компонентами и репликацией. &lt;/p&gt;
  &lt;p id=&quot;k8cl&quot;&gt;Плюс, уяснить разницу с &lt;code&gt;UObject&lt;/code&gt;, помимо того, что его можно поставить на сцену и напрямую уничтожить.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;dJti&quot;&gt;Компоненты&lt;/h3&gt;
  &lt;p id=&quot;u7Zn&quot;&gt;Компоненты являются строительными блоками для всех актеров. Нужно уяснить как они инициализируются, как уничтожаются и реплицируются. Так же у него есть свои наследники, каждый из которых реализует конкретную функциональность: &lt;code&gt;USceneComponent&lt;/code&gt; и &lt;strong&gt;&lt;code&gt;UPrimitiveComponent&lt;/code&gt;. &lt;/strong&gt;Они являются базовыми классами для большинства компонентов. Их необходимо разобрать.&lt;/p&gt;
  &lt;p id=&quot;UhSq&quot;&gt;Важно во время изучения испробовать разных их наследников, вроде &lt;code&gt;USkeletalMeshComponent&lt;/code&gt; или &lt;code&gt;UWidgetComponent&lt;/code&gt;, чтобы изучить область применения.&lt;/p&gt;
  &lt;h3 id=&quot;390S&quot;&gt;Управляющие сущности&lt;/h3&gt;
  &lt;p id=&quot;P8dv&quot;&gt;&lt;code&gt;APlayerController&lt;/code&gt;, &lt;code&gt;APlayerState&lt;/code&gt;, &lt;code&gt;AGameMode&lt;/code&gt;, &lt;code&gt;AGameState UGameInstance&lt;/code&gt;. Все это базовые игровые сущности, которые необходимо понимать. Их время жизни, работа с репликацией, область применения и смысл существования.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;UBK8&quot;&gt;События&lt;/h3&gt;
  &lt;p id=&quot;jcrI&quot;&gt;Следующим по важности следуют &lt;code&gt;FDelegate&lt;/code&gt; и &lt;code&gt;FEvent&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;Pa0I&quot;&gt;Они, по сути, представляют из себя сущность, на которую вы подписываетесь и ждете когда что-то произойдет (&lt;code&gt;Execute&lt;/code&gt; или &lt;code&gt;Broadcast&lt;/code&gt;). Кроме того есть &lt;code&gt;Multicast Delegate&lt;/code&gt;&amp;#x27;ы, &lt;code&gt;Dynamic Delegate&lt;/code&gt;&amp;#x27;ы и т.д с разными переменными параметрами.&lt;/p&gt;
  &lt;p id=&quot;ZMBH&quot;&gt;Необходимо поэксперементировать с разными их вариациям для фиксации разных событий при входе в Collision Box&amp;#x27;ы, нажатие на мышь/клавиатуру и т.д.&lt;/p&gt;
  &lt;p id=&quot;gblH&quot;&gt;Они создаются через &lt;code&gt;DECLARE_EVENT&lt;/code&gt;и &lt;code&gt;DECLARE_DELEGATE&lt;/code&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;44D5&quot;&gt;Мир&lt;/h3&gt;
  &lt;p id=&quot;4f5t&quot;&gt;Советую вам уделить отдельное внимание таким вещам как &lt;code&gt;ULevel&lt;/code&gt;и &lt;code&gt;UWorld&lt;/code&gt;. Как они вместе составляют игровое поле, как работать с их Blueprint&amp;#x27;ом, классом, и что происходит когда вы переходите с уровня на уровень &lt;code&gt;(UGameplayStatics::OpenLevel).&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;zA4o&quot;&gt;Базовые классы&lt;/h3&gt;
  &lt;p id=&quot;j9NX&quot;&gt;Вам необходимо усвоить, что из себя представляет основной класс для всех сущностей движка &lt;code&gt;UObject&lt;/code&gt; и &lt;code&gt;UObjectBase&lt;/code&gt;. Как при помощи него работает сборщик мусора и, немало важно, как этот класс может работать с репликацией, т.е мультиплеером.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;yAKy&quot;&gt;Коллизии&lt;/h3&gt;
  &lt;p id=&quot;nAEe&quot;&gt;Поскольку вам часто понадобится фиксировать коллизии, то нужно поработать с разными их проявляениям.&lt;/p&gt;
  &lt;ol id=&quot;gGLx&quot;&gt;
    &lt;li id=&quot;Z2vV&quot;&gt;На уровне компонентов и Actor&amp;#x27;ов: каждый &lt;code&gt;UPrimitiveComponent &lt;/code&gt;может работать с коллизиями и детектить их, например &lt;code&gt;OnComponentHit&lt;/code&gt;&lt;strong&gt;, &lt;/strong&gt;&lt;code&gt;OnComponentBeginOverlap &lt;/code&gt;&lt;strong&gt;и &lt;/strong&gt;&lt;code&gt;OnComponentEndOverlap.&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;qBNZ&quot;&gt;На уровне кастов: вы можете создавать разные геометрически объекты (Лучи, Сферы и т.д) для фиксации тех или иных сущностей (геометрии). &lt;code&gt;LineTraceSingleByChannel&lt;/code&gt;, &lt;code&gt;OverlapMultiByChannel &lt;/code&gt;и т.д&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;8uHK&quot;&gt;Они используются постоянно и являются частью физического движка.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;p42D&quot;&gt;Контейнеры&lt;/h3&gt;
  &lt;p id=&quot;VAUJ&quot;&gt;&lt;code&gt;TMap&lt;/code&gt;, &lt;code&gt;TSet&lt;/code&gt;, &lt;code&gt;TArray&lt;/code&gt;, &lt;code&gt;TList&lt;/code&gt; и т.д. Чем отличаются, чем схожи, в том числе с &lt;code&gt;std::unordered_map&lt;/code&gt;, &lt;code&gt;std::map&lt;/code&gt; и прочими. &lt;/p&gt;
  &lt;p id=&quot;1ofW&quot;&gt;На более глубоком уровне советую почитать про &lt;code&gt;TSparseArray.&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;P0fS&quot;&gt;Рефлексия&lt;/h3&gt;
  &lt;p id=&quot;UUo6&quot;&gt;&lt;s&gt;Стоит подумать о жизни и смысле существования.&lt;/s&gt;&lt;/p&gt;
  &lt;p id=&quot;r902&quot;&gt;До этого момента вы вероятнее всего уже сталкивались с &lt;code&gt;UCLASS&lt;/code&gt;, &lt;code&gt;USTRUCT&lt;/code&gt;, &lt;code&gt;UENUM &lt;/code&gt;и т.д.&lt;/p&gt;
  &lt;p id=&quot;cm32&quot;&gt;Часто интервьеру, может быть интересно как вы понимаете рефлексию, т.е инструмент, который позволяет анализировать ваш код и генерировать еще больше инструкция для движка.&lt;/p&gt;
  &lt;p id=&quot;h5If&quot;&gt;Те же свойства, прописываемые в &lt;code&gt;UPROPERTY&lt;/code&gt; и &lt;code&gt;UCLASS&lt;/code&gt;, вроде &lt;code&gt;BlueprintReadOnly&lt;/code&gt; являются теми самыми ключевыми словами, по которым создаются дополнительные инструкции для движка.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;KRxA&quot;&gt;Сборщик мусора и smart pointer&amp;#x27;ы&lt;/h3&gt;
  &lt;p id=&quot;dimN&quot;&gt;Концепция эта не нова, однако часто интервьеру может быть интересно в чем вы видите различия &lt;code&gt;std::weak_ptr&lt;/code&gt; и &lt;code&gt;TWeakPtr&lt;/code&gt; из движка и как они работают со сборщиком мусора. Как последний ведет учет объектов, которые надо уничтожить, можно ли создать &lt;code&gt;TSharedPtr&lt;/code&gt; на &lt;code&gt;UObject&lt;/code&gt; и т.д.&lt;/p&gt;
  &lt;p id=&quot;JvaZ&quot;&gt;Тут придется окунуться в стандарт C++ и часть изучить. &lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;QBRr&quot;&gt;Репликация&lt;/h3&gt;
  &lt;p id=&quot;Wh3A&quot;&gt;Не все проекты включают мультиплеерную часть, но на собеседовании часто спрашивают.&lt;/p&gt;
  &lt;p id=&quot;lnbu&quot;&gt;Концепция сервера и клиента, RPC вызовы (Server, Client, Multicast), условия репликации переменных и т.д. &lt;/p&gt;
  &lt;p id=&quot;F61A&quot;&gt;Все это &lt;strong&gt;важно&lt;/strong&gt; осмыслить хотя бы на поверхностном уровне.&lt;/p&gt;
  &lt;p id=&quot;FWcf&quot;&gt;У меня уже есть &lt;a href=&quot;https://habr.com/ru/articles/647521/&quot; target=&quot;_blank&quot;&gt;статья&lt;/a&gt;, с которой очень советую ознакомиться.&lt;/p&gt;
  &lt;h3 id=&quot;OUMi&quot;&gt;Сессии&lt;/h3&gt;
  &lt;p id=&quot;OMdb&quot;&gt;Этот топик - часть мультиплеера, но все же стоит отдельно из-за своей специфики: создание &lt;a href=&quot;https://habr.com/ru/articles/647521/&quot; target=&quot;_blank&quot;&gt;сессии&lt;/a&gt;. Является скорее приятным дополнением, нежели необходимостью.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;6AIt&quot;&gt;Build Tool и модули&lt;/h3&gt;
  &lt;p id=&quot;dVq4&quot;&gt;Весь движок состоит из модулей, конфигурации которых прописываются в корневых директориях ваших исходников в файлах &lt;code&gt;.build.cs.&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;krPk&quot;&gt;Важно знать, как их прописывать, чем приватный модуль отличается от публичного и так далее. &lt;/p&gt;
  &lt;p id=&quot;4C2k&quot;&gt;Этот топик более узкий и спрашивают его не часто.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;mKMt&quot;&gt;Софт и хард ссылки. &lt;code&gt;TSoftObjectPtr&lt;/code&gt;, &lt;code&gt;TStrongObjectPtr&lt;/code&gt;&lt;/h3&gt;
  &lt;p id=&quot;TW1O&quot;&gt;Уже более специфическая вещь, связанная с загрузкой и сохранением объектов в памяти. &lt;/p&gt;
  &lt;p id=&quot;Z98b&quot;&gt;Нередко интервьюеру интересно, как вы понимаете возможности движка для менеджмента ресурсов, особенно если память устройства сильно ограничена. &lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;mMD4&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;QPEJ&quot;&gt;Список выше далеко не самый полный и весьма абстрактный. Каждый из пунктов можно поделить на несколько частей и добавить деталей, однако тогда и статья вылилась бы в учебник.&lt;/p&gt;
  &lt;p id=&quot;OVQa&quot;&gt;С большинством пунктов вы столкнетесь пока будете писать pet-проект, какие-то из них будете нагонять после, т.к не в каждом проекте задеваются все перечисленные концепции.&lt;/p&gt;
  &lt;p id=&quot;mePR&quot;&gt;Только то, что указано, является необходимой базой (кроме &lt;em&gt;Сессий&lt;/em&gt;), в которой важно глубоко разобраться.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;L3OU&quot;&gt;Полезные ресурсы&lt;/h2&gt;
  &lt;ul id=&quot;xFU3&quot;&gt;
    &lt;li id=&quot;liuh&quot;&gt;&lt;a href=&quot;https://docs.unrealengine.com/5.3/en-US/&quot; target=&quot;_blank&quot;&gt;Официальная документация&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;ydPP&quot;&gt;Документация сообщества:&lt;/li&gt;
    &lt;ul id=&quot;A7B0&quot;&gt;
      &lt;li id=&quot;yBOw&quot;&gt;&lt;a href=&quot;https://benui.ca/unreal/&quot; target=&quot;_blank&quot;&gt;https://benui.ca/unreal/&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;VyPm&quot;&gt;&lt;a href=&quot;https://ikrima.dev/ue4guide/&quot; target=&quot;_blank&quot;&gt;https://ikrima.dev/ue4guide/&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;kS7h&quot;&gt;&lt;a href=&quot;https://vorixo.github.io/devtricks/&quot; target=&quot;_blank&quot;&gt;https://vorixo.github.io/devtricks/&lt;/a&gt;&lt;/li&gt;
      &lt;li id=&quot;jPtc&quot;&gt;&lt;a href=&quot;https://unrealcommunity.wiki/&quot; target=&quot;_blank&quot;&gt;https://unrealcommunity.wiki/&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;1etU&quot;&gt;&lt;a href=&quot;https://habr.com/ru/users/Cybeaster/publications/articles/&quot; target=&quot;_blank&quot;&gt;Мой цикл статей по Unreal Engine.&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;

</content></entry><entry><id>cybeaster:nvidia_pge_fail</id><link rel="alternate" type="text/html" href="https://teletype.in/@cybeaster/nvidia_pge_fail?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cybeaster"></link><title>Интервью в Nvidia.</title><published>2024-01-12T17:47:31.427Z</published><updated>2024-01-12T17:51:34.498Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/91/08/91089b30-fd32-4a56-8345-ab71955115d2.png"></media:thumbnail><category term="interview" label="interview"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/f6/75/f675f77d-0035-4eb4-9ec2-f08e79b1ee60.png&quot;&gt;Как зеленый гигант делал мне больно.</summary><content type="html">
  &lt;h2 id=&quot;PSye&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;cG0I&quot;&gt;Собеседование в Nvidia я проходил на позицию Platform Graphics Engineer в ноябре прошлого года.&lt;/p&gt;
  &lt;p id=&quot;h6TK&quot;&gt;Судя из описания вакансии менеджером, мне предстояло бы заниматься оптимизацией стриминга &lt;strong&gt;GeforceNOW&lt;/strong&gt;, внося правки в игровые движки, которые предоставляют вендоры.&lt;/p&gt;
  &lt;p id=&quot;XdIu&quot;&gt;Подавался я на сайте &lt;strong&gt;Nvidia Careers&lt;/strong&gt; без рефералки, ответ пришел в течение пары недель, что весьма быстро.&lt;/p&gt;
  &lt;p id=&quot;54rU&quot;&gt;На позицию требовались знания графических &lt;strong&gt;API&lt;/strong&gt;, устройства &lt;strong&gt;CPU/GPU&lt;/strong&gt;. Кроме того желателен опыт с игровыми движками, в особенности &lt;strong&gt;Unreal Engine&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;Fp35&quot;&gt;Я на тот момент не был силен в графике, но менеджер успокоил, сказав, что будет возможность наверстать.&lt;/p&gt;
  &lt;p id=&quot;1bQQ&quot;&gt;Стоит отметить, что по моим наблюдениям в крупных компаниях первый же созвон состоится с техническим менеджером, который расскажет про вакансию и проведет скрининг. Поэтому ваши заготовленные вопросы HR&amp;#x27;ам почему вы заинтересовались компанией &lt;em&gt;&amp;lt;&amp;lt;Рога и Копыта&amp;gt;&amp;gt;&lt;/em&gt; вам не понадобятся. &lt;/p&gt;
  &lt;p id=&quot;kZWI&quot;&gt;В моем случае, спрашивали азы об устройстве GPU, попросили набросать кода на С++, который профайлит обычный цикл for.&lt;/p&gt;
  &lt;p id=&quot;uPNH&quot;&gt;Далее мне было назначено аж 4 часовых интервью в разные дни по схеме ниже, поэтому особой нагрузки я не почувстовал. Вместе с письмом были приложены ссылки на hackerrank, посему стало понятно - &lt;strong&gt;будет литкод&lt;/strong&gt;.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;rlM7&quot; data-align=&quot;center&quot;&gt;1 - четверг &lt;br /&gt;2 - пятница, утро и вечер.&lt;br /&gt;1 -  в понедельник.&lt;/p&gt;
  &lt;/section&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;0xfa&quot;&gt;Собеседования&lt;/h2&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;MfMk&quot; data-align=&quot;center&quot;&gt;Четверг.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;bWiP&quot;&gt;После небольшого интродакшена мне сразу дали рандомную задачку из пула на сайте. Там оказалась задача на интервалы медиум уровня, которую я решал раз 100. Проблем абсолютно не возникло, а даже если я где-то что-то забывал, интервьюер любезно, почти сразу, мне на это указывал.&lt;br /&gt;Оставшюуся часть интервью мне показывали графики производительности и просили проанализировать узкие горлышки в программе, где и почему, как я думаю, игра тормозит. Там я тоже нашел что рассказать так как был знаком с подобными процессами после курса по CUDA.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;zaiJ&quot; data-align=&quot;center&quot;&gt;Пятница, утро.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;LleO&quot;&gt;Так же интро, и простые вопросы по графике, пайплайны, и что, например, делает шейдер тесcеляции. После последовали вопросы easy и medium уровня - связные списки и деревья. На второй задаче я споткнулся, т.к. перенервничал и долбился в одно и тоже не правильное решение. &lt;/p&gt;
  &lt;p id=&quot;c3mG&quot;&gt;В принципе, ничего сложного не было. Вторую задачу я уже решал, поэтому смог выложить хотя бы часть решения интервьюеру.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;maBL&quot; data-align=&quot;center&quot;&gt;Пятница, вечер.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;TIRM&quot;&gt;Интро, и сразу hackerrank. Там, на удивление, не было литкода, вместо него попросили распарсить CSV-файл и посчитать частоту кадров с разными условиями ссылаясь на данные. Я набросал простой парсер на питоне, и интервьюера это вполне устроило, если конечно не считать того, что я минут 10-15 распрашивал про условие задачи, и что конкретно дано в CSV-файле.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Bh0f&quot; data-align=&quot;center&quot;&gt;Понедельник, вечер.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;wJhq&quot;&gt;Достаточно продолжительное интро, где интервьюер копал в те задачи на оптимизацию, которыми я занимался, и далее один литкод вопрос на графы medium уровня.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;zixf&quot;&gt;Результат&lt;/h2&gt;
  &lt;p id=&quot;1Ykn&quot;&gt;После всех интервью я был уверен процентов на 70 что я их прошел. Вопросы были не сложные, касались они оптимизации, с которой я уже работал. Литкода я к тому моменту нарешал в районе 230 задач, поэтому размышления были как нельзя правильными (если не считать небольшой фейл на 2-ом интервью), плюс я каждый раз в конце интервью интересовался, доволен ли интервьюер моими размышлениями, и ни разу не получал отрицательного ответа.&lt;/p&gt;
  &lt;p id=&quot;cy35&quot;&gt;&lt;em&gt;Хотя, быть может, меня обманули...&lt;/em&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;rr4y&quot;&gt;Ответ я ждал мучительные 4 дня. Каждый день все больше и больше сомневаясь в том, что на любимую вакансию я прохожу.&lt;/p&gt;
  &lt;p id=&quot;icfw&quot;&gt;Ответ пришел - &lt;strong&gt;отказ&lt;/strong&gt;. &lt;/p&gt;
  &lt;p id=&quot;rJqS&quot;&gt;Почему, чего не хватает, и где я накосячил, мне не объяснили, а следующее письмо с проcьбой об оном - проигнорировали, обойдясь: &lt;/p&gt;
  &lt;blockquote id=&quot;uaUT&quot;&gt;We have found someone who better fits the position. &lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;0XQw&quot;&gt;Выводы&lt;/h2&gt;
  &lt;p id=&quot;Vchl&quot;&gt;&lt;strong&gt;Никогда не бойтесь ходить на интервью в крупные компании&lt;/strong&gt;. Они бывают разного уровня сложности, но чаще всего это easy-medium задачи и детали из вашей конкретной области, которые вы встретите повсюду.&lt;/p&gt;
  &lt;p id=&quot;ckpB&quot;&gt;&lt;strong&gt;Никогда не питайте ложных надежд&lt;/strong&gt;, даже когда лично вам кажется, что все прошло идеально. &lt;/p&gt;
  &lt;p id=&quot;7lp3&quot;&gt;Я был сильно разочарован из-за недостатка опыта в прохождении собеседований в такие компании. Чаще всего если легко себя чувствовал, то оффер не заставлял долго ждать.&lt;/p&gt;
  &lt;p id=&quot;J9yc&quot;&gt;Вероятнее всего, мне отказали не потому, что я плохо показал себя, а потому, что пришел человек, который знает DX12 или Vulkan. И даже если он хуже меня решил литкод, он все еще остается более подходящим кандидатом.&lt;/p&gt;
  &lt;p id=&quot;aPBg&quot;&gt;Удачи!&lt;br /&gt;&lt;/p&gt;

</content></entry><entry><id>cybeaster:algo_guide</id><link rel="alternate" type="text/html" href="https://teletype.in/@cybeaster/algo_guide?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cybeaster"></link><title>Алгоритмы и структуры данных</title><published>2023-12-28T17:11:12.474Z</published><updated>2023-12-28T17:23:29.511Z</updated><category term="algorithms" label="Algorithms"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/e5/41/e541ed56-53ac-49d6-b9b5-b41be0de0962.png&quot;&gt;К текущему моменту я решил 250+ задач на алгоритмы и прошел несколько собеседований.</summary><content type="html">
  &lt;p id=&quot;ix1U&quot;&gt;К текущему моменту я решил 250+ задач на алгоритмы и прошел несколько собеседований.&lt;/p&gt;
  &lt;p id=&quot;FV01&quot;&gt;В этой статье я хочу раскрыть тему алгоритмов как являения и разобрать процесс решения на составляющие, плюс показать почему именно &lt;strong&gt;ТЫ &lt;/strong&gt;сможешь в них преуспеть, и медленно перейти к оным на собеседованиях.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;7lUP&quot;&gt;Зачем решать задачи на алгоритмы?&lt;/h2&gt;
  &lt;p id=&quot;TAne&quot;&gt;Споры о нужде алгоритмов не утихают до сих пор. &lt;/p&gt;
  &lt;p id=&quot;KtVR&quot;&gt;Одни с пеной у рта доказывают, что на работе в них нет никакого смысла, другие топят за улучшение &lt;strong&gt;алгоритмического мышления&lt;/strong&gt; в решении вымышленных задач.&lt;/p&gt;
  &lt;p id=&quot;OP0N&quot;&gt; В действительности, решая алгоритмы, мы делаем следующее:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;ol id=&quot;fOoj&quot;&gt;
      &lt;li id=&quot;HjZw&quot;&gt;Декомпозируем / Упрощаем проблему.&lt;/li&gt;
      &lt;li id=&quot;fdVv&quot;&gt;Анализируем, подбираем паттерны для чернового решения.&lt;/li&gt;
      &lt;li id=&quot;sDzW&quot;&gt;Создаем решение на тестовых данных.&lt;/li&gt;
      &lt;li id=&quot;Ytaf&quot;&gt;Пишем код.&lt;/li&gt;
      &lt;li id=&quot;RMWI&quot;&gt;Фиксим баги.&lt;/li&gt;
      &lt;li id=&quot;8u7w&quot;&gt;Оптимизируем наше решение.&lt;/li&gt;
      &lt;li id=&quot;lisc&quot;&gt;Повторяем шаг 4-6 пока не уложимся в требования задачи.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/section&gt;
  &lt;p id=&quot;LLzs&quot;&gt;И часто ли вам на работе приходилось выполнять больше двух-трех пунктов из этого списка? Часто ли вы встречались с проблемами, для которых необходим долгий, вдумчивый анализ для составления сложного алгоритмически эффективного решения?&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;cvlt&quot;&gt;&lt;strong&gt;Итог. &lt;/strong&gt;Если вам не нужно готовиться к алгоритмическим интервью и на работе не приходится писать ПО с нетривиальными алгоритмическими задачами, то нарешивать задачки вам явно не нужно.&lt;/p&gt;
  &lt;/section&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;pQZn&quot;&gt;Пример из жизни&lt;/h2&gt;
  &lt;p id=&quot;VCs8&quot;&gt;Однако, это не значит, что знание основ вам никогда не понадобится. Пример из моей работы:&lt;/p&gt;
  &lt;p id=&quot;Qfee&quot;&gt;Язык: C++.&lt;/p&gt;
  &lt;p id=&quot;PcpA&quot;&gt;Дан массив каких то структур. Необходимо вызывать определенную функцию у каждого элемента этой структуры, после чего массив почистить. Код будет выглядеть примерно так:&lt;/p&gt;
  &lt;pre id=&quot;lFRb&quot; data-lang=&quot;cpp&quot;&gt;container&amp;lt;Type&amp;gt; elems;
...
for (auto&amp;amp; elem : elems)
{
	elem-&amp;gt;Finalize();
}
elems.clear();&lt;/pre&gt;
  &lt;p id=&quot;jliQ&quot;&gt;&lt;em&gt;Проблема заключается в том, что метод &lt;code&gt;Finalize()&lt;/code&gt; может удалить элемент из &lt;code&gt;elems&lt;/code&gt; при определенных условиях&lt;/em&gt;, и мы получим краш на изменении размера массива в &lt;code&gt;range-based&amp;#x60;&lt;/code&gt; цикле.&lt;/p&gt;
  &lt;pre id=&quot;nMf3&quot; data-lang=&quot;cpp&quot;&gt;container&amp;lt;Types&amp;gt; elems;
...
void Type::Finalize()
{
	...
	if(...)
	{
		elems.remove(this);
	}
}&lt;/pre&gt;
  &lt;p id=&quot;Z8wu&quot;&gt;Простой подход для решения проблемы - &lt;strong&gt;скопировать исходный массив в другой&lt;/strong&gt;, и пройтись по элементам копии.&lt;/p&gt;
  &lt;p id=&quot;vijC&quot;&gt;На мой взгляд это неэффективно и некрасиво. Без опыта решения задач я бы так и поступил.&lt;br /&gt;В итоге, лаконичное решение пришло через некоторое время:&lt;/p&gt;
  &lt;pre id=&quot;gyVR&quot; data-lang=&quot;cpp&quot;&gt;container&amp;lt;Type&amp;gt; elems;
...
while (!elems.is_empty())
{
	auto elem = elems.pop();
	elem-&amp;gt;Finalize()
}&lt;/pre&gt;
  &lt;p id=&quot;DXBP&quot;&gt;Вам может показаться этот пример &lt;strong&gt;глупым &lt;/strong&gt;и &lt;strong&gt;очень простым&lt;/strong&gt;. По сути так и есть, однако...&lt;/p&gt;
  &lt;p id=&quot;csRa&quot;&gt;Матерые, опытные синьеры на моем проекте &lt;strong&gt;копировали массив.&lt;/strong&gt;&lt;br /&gt;Значит ли это, что &lt;em&gt;решение не так очевидно&lt;/em&gt;...?&lt;/p&gt;
  &lt;p id=&quot;Pt2B&quot;&gt;И это с учетом того, что алгоритмически сложные задачи у нас бывают очень редко.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;mHOB&quot;&gt;Почему именно ты сможешь подготовиться к интервью&lt;/h2&gt;
  &lt;p id=&quot;YQay&quot;&gt;Когда я несколько месяцев назад впервые начал решать задачи, то обомлел от разнообразия и  сложности этих задач. Казалось, что для подготовки нарешивать их нужно &lt;strong&gt;бесконечно&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;N74P&quot;&gt;Кроме того, единственное, что я читал это &lt;em&gt;Грокаем Алгоритмы от Бхаргава А&lt;/em&gt;. Поэтому никакой академической подготовки у меня нет.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;5vnT&quot;&gt;Правда заключается в том, что это разнообразие и сложность конечны, и чем &lt;strong&gt;больше вы нарешаете задач&lt;/strong&gt;, тем больше &lt;strong&gt;паттернов вы будете знать&lt;/strong&gt;, тем больше возможных &lt;strong&gt;комбинаций из паттернов&lt;/strong&gt; сможете собрать и тем меньше очередная новая задача будет вас удивлять.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;NYSb&quot;&gt;У меня, спустя 250 задач, при открытии очередной medium - hard задачи сразу всплывают знакомые паттерны, на которых строится та или иная задача.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;rt9H&quot;&gt;Паттерны&lt;/h2&gt;
  &lt;p id=&quot;kEEs&quot;&gt;Давайте на конкретных примерах.&lt;/p&gt;
  &lt;p id=&quot;8NBt&quot;&gt;Возьмем две на первый взгляд никак не связанные задачи: &lt;a href=&quot;https://leetcode.com/problems/lru-cache/description/&quot; target=&quot;_blank&quot;&gt;LRU Cache &lt;/a&gt;и &lt;a href=&quot;https://leetcode.com/problems/two-sum/description/&quot; target=&quot;_blank&quot;&gt;Two Sum&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;CHvU&quot;&gt;Поначалу, у новичка образуется каша в голове и он не знает как к задаче подступиться. Вместо размышлений, составления каких либо тестов сразу бросается писать какой-то код, стремясь избавиться от тотального непонимания и нагнетаемого страха.&lt;/p&gt;
  &lt;p id=&quot;HH9a&quot;&gt;В процессе он пробует разные варианты и еле-еле приходит к решению, которое вряд ли даже ложиться в базовые требования задачи. &lt;/p&gt;
  &lt;p id=&quot;rCkb&quot;&gt;Опытный алгоритмист на основании требований задачи сразу видит в ней какие-то &lt;strong&gt;паттерны&lt;/strong&gt;. &lt;/p&gt;
  &lt;p id=&quot;lmH6&quot;&gt;Самый первый из них, исходя из требований в этих задачах - &lt;strong&gt;скорость поиска&lt;/strong&gt;. Она должна быть константна, а значит тут подойдет только hash map в разных вариацих.&lt;/p&gt;
  &lt;p id=&quot;QfWO&quot;&gt;Второе - способ хранения данных.&lt;/p&gt;
  &lt;p id=&quot;hB5f&quot;&gt;В первой задаче нужна упорядоченность, которой нет в hash map. &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Li8K&quot; data-align=&quot;center&quot;&gt;&lt;em&gt;Хорошо. Мы ее туда добавим, если будет хранить ноды связного списка, где каждая нода указывает на последующую внутри контейнера.&lt;/em&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;QbuN&quot;&gt;Во второй требуется такой способ хранения, который предполагал бы, что взяв какое либо число из массива, мы за константное время сможем понять, составляет ли оно с другим числом такую пару, сумма которых равна искомому. &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;pkBU&quot; data-align=&quot;center&quot;&gt;&lt;em&gt;Хорошо, будем хранить &lt;strong&gt;разность &lt;/strong&gt;текущего и искомого. Если следующее число равно этой разнице, это эти числа образуют пару.&lt;/em&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;5jTo&quot;&gt;Таким образом, суммарно в этих задачах есть &lt;strong&gt;4 &lt;/strong&gt;паттерна - оба разделяют использование &lt;strong&gt;hash map&lt;/strong&gt; для скорости поиска, только в первой требуется еще и связный список для контроля последовательности, а во второй специфический способ хранения для &lt;em&gt;удобства поиска&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;kbXH&quot;&gt;Имеются и другие способы решения, базирующиеся на других шаблонах.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;2FLb&quot;&gt;Важно понимать, что взяв определенных шаблон, hash map в нашем случае, вы начинаете его &lt;strong&gt;развивать&lt;/strong&gt;, собирая &lt;strong&gt;мозайку &lt;/strong&gt;для решения. Проблемы возникают тогда, когда вы берете за основу &lt;strong&gt;изначально неверный паттерн&lt;/strong&gt;, который в лучшем случае будет не самым оптимальным, в худшем - просто не даст пройти все тест кейсы.&lt;/p&gt;
  &lt;p id=&quot;qGKG&quot;&gt;Вам нужно научиться эти паттерны &lt;strong&gt;отсеивать &lt;/strong&gt;на самом раннем этапе из возможных, но об этом ниже.&lt;/p&gt;
  &lt;p id=&quot;saXI&quot;&gt;&lt;em&gt;Тогда возникает закономерный вопрос:&lt;/em&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;5Hyn&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;А как тогда написать конечное решение, если оно состоит из множества шаблонов? Неуж-то перебирать их все?&lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;7Pvp&quot;&gt;&lt;em&gt;И появляется не менее закономерный ответ&lt;/em&gt;: &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;jQKm&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;И да, и нет.&lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;ul id=&quot;xOxw&quot;&gt;
      &lt;li id=&quot;3wmz&quot;&gt;&lt;strong&gt;Тезис 1.&lt;/strong&gt; В задачах &lt;strong&gt;Easy-Medium&lt;/strong&gt; уровня не высокая глубина. 2-3 паттерна будет достаточно. И их придется подбирать.&lt;/li&gt;
      &lt;li id=&quot;Wl15&quot;&gt;&lt;strong&gt;Тезис 2&lt;/strong&gt;. &lt;strong&gt;Формирование идеи нужно устраивать не из всех паттернов&lt;/strong&gt;. Если задача про тот же LRU Cache, вам может прийти в голову использовать stack или queue для формирования очередей, и это &lt;strong&gt;нормально&lt;/strong&gt;, или начать с hash map и как то комбинировать с очередями. Вторая идея со временем &lt;strong&gt;отсеится &lt;/strong&gt;и вы пойдете дальше.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;
  &lt;p id=&quot;a6WC&quot;&gt;Опытный алгоритмист эту идею &lt;strong&gt;быстро отсеит &lt;/strong&gt;и не будет тратить слишком много времени. После чего возьмет следующую и после нее. Спустя некоторое время сортировки он начнет &lt;strong&gt;развивать &lt;/strong&gt;ту, с hash map, в &lt;strong&gt;правильном направлении&lt;/strong&gt;, прямо как ожидает интервьюер, накидывая на нее мяса в виде дополнительных возможных функциональностей и способов хранения данных.&lt;/p&gt;
  &lt;p id=&quot;8LLB&quot;&gt;Из этого следует простой вывод: &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;1vhE&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Чтобы эти шаблоны научиться применять, их нужно сначала несколько раз использовать и запомнить.&lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;gsZm&quot;&gt;Тут возникает следующая ошибка: новички сидят за решением &lt;strong&gt;Easy-Medium&lt;/strong&gt; задач несколько часов, &lt;strong&gt;пытаясь подобрать паттерн, о котором даже не знают&lt;/strong&gt;. &lt;/p&gt;
  &lt;p id=&quot;Imry&quot;&gt;Чтобы эту ошибку не допускать, я рекомендую отводить на задачу любого уровня максимум &lt;strong&gt;45 минут.&lt;/strong&gt; Этого с лихвой хватает для составляения решения и написания кода. Если вы не укладываетесь, &lt;strong&gt;значит вы ничего не придумаете и за 2 часа&lt;/strong&gt;. &lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;BYDZ&quot;&gt;Собеседование&lt;/h2&gt;
  &lt;p id=&quot;Pje2&quot;&gt;Важно понимать: &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;ydDb&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;В первую очередь, на собеседовании задачу нужно не решать, а обсуждать.&lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;UnwB&quot;&gt;Там редко спрашивают что то сложнее &lt;strong&gt;Medium&lt;/strong&gt;, однако, случаи такие бывают.&lt;/p&gt;
  &lt;p id=&quot;sCxj&quot;&gt;Чаще всего, если задача easy-medium, то предполагается, что вы&lt;strong&gt; должны решить ее практически без подсказок и по сути самостоятельно&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;MAxU&quot;&gt;Если вам выпадет &lt;strong&gt;Hard&lt;/strong&gt;, то вероятнее всего интервьюер жаждет с вами побольше &lt;strong&gt;поговорить&lt;/strong&gt;, увидеть как можно больше ваших попыток подобрать решение, &lt;strong&gt;и что не менее важно - это решение с интервьюером обсудить&lt;/strong&gt;.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;RqxH&quot;&gt;&lt;strong&gt;Резюмирую&lt;/strong&gt;: вне зависимости от сложности задачи ваш план действий &lt;strong&gt;никак не меняется&lt;/strong&gt;. Различия будут в количестве попыток для подбора шаблонов и суммарной длительности вашего с интервьюером диалога.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;BGoP&quot;&gt;Для полноты понимания о чем я говорю&lt;strong&gt; очень рекомендую&lt;/strong&gt; посмотреть лайв кодинг интервью в разные компании. &lt;/p&gt;
  &lt;p id=&quot;tRUZ&quot;&gt;В грамотных сценариях на каждом ходу своего решения программист постоянно &lt;strong&gt;рассуждает вслух&lt;/strong&gt; и &lt;strong&gt;спрашивает интервьюера&lt;/strong&gt;, имеет ли его текущий подобранный паттерн смысл, или нет.&lt;/p&gt;
  &lt;p id=&quot;FnsJ&quot;&gt;Очень часто, если интервьюер видит, что вы неплохо справляетесь, может самостоятельно помочь, указав на какую-то деталь, которую вы не заметили, или намекнуть, если застряли. И это нормально. &lt;/p&gt;
  &lt;p id=&quot;RbRc&quot;&gt;Как я уже сказал, самое главное на интервью это &lt;strong&gt;общаться&lt;/strong&gt;, максимально открыто показывая, что происходит в вашей голове.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;LgTo&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;4Y7Q&quot;&gt;Теперь давайте заключим, что нужно делать программисту, который решил сесть за подготовку к собеседованию.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;ol id=&quot;KxO7&quot;&gt;
      &lt;li id=&quot;GY42&quot;&gt;Минимальная инструментальная единица в задаче, с которой все начинается - это &lt;strong&gt;структуры данных&lt;/strong&gt;. Знакомимся с их принципами работы по туториалам.&lt;/li&gt;
      &lt;li id=&quot;v3NH&quot;&gt;Нам нужно запомнить определенные &lt;strong&gt;шаблоны&lt;/strong&gt;, которые составляются из структур данных. Чтобы наша ассоциативная машина грамотно работала и &lt;strong&gt;связывала эти паттерны с конкретными задачами&lt;/strong&gt;, грамотно их упаковывая в нашей памяти, мы будем решать задачи &lt;strong&gt;группами из определенных категорий&lt;/strong&gt;. Сначала массивы и хэш-контейнеры, потом стэк, два указателя, бинарный/быстрый поиск и так далее. Тут можно ознакомиться с &lt;em&gt;Road Map от NeetCode&lt;/em&gt;, или взять курс на &lt;em&gt;AlgoExpert&lt;/em&gt;. Я использовал оба ресурса.&lt;/li&gt;
      &lt;li id=&quot;RIvh&quot;&gt;Взяв очередную задачу из категории, сразу ставим таймер - ~45 минут. Если за &lt;strong&gt;5-10 минут&lt;/strong&gt; не выходит ничего придумать, достаем первые подсказки, чтобы хоть как-то продвинуть решение. В этом плане мне очень понравился &lt;em&gt;AlgoExpert&lt;/em&gt;, который эмитирует процесс интервью, предоставляя 2-4 скрытые шпоры на случай застрявшего решения&lt;strong&gt;.&lt;/strong&gt;&lt;/li&gt;
      &lt;li id=&quot;ioLw&quot;&gt;Прорешав 100-150 задач нам потребуется опыт реальных собеседований. С этой целью ищем интервьера, принимая во внимание описанные мною ключевые моменты.&lt;/li&gt;
      &lt;li id=&quot;PvyD&quot;&gt;Как только вы можете взять любую &lt;strong&gt;Medium &lt;/strong&gt;задачу и с &lt;strong&gt;80%-90%&lt;/strong&gt; вероятностью ее решить, значит вы готовы для прохождения алгоритмических интевью. Поздравляю. Теперь можно подаваться на желанные вами вакансии.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/section&gt;
  &lt;p id=&quot;N0pv&quot;&gt;Лично я на момент написания статьи решил 126 задач на Leetcode, и ровно столько же на AlgoExpert. Некоторые задачи были похожи, единицы были точной копией и большинство представляли из себя по сути уникальные кейсы.&lt;/p&gt;
  &lt;p id=&quot;FeQm&quot;&gt;В процессе подготовки я перед работой я нарешивал в среднем 2-3 &lt;strong&gt;Medium &lt;/strong&gt;задачи или 3-6 &lt;strong&gt;Easy &lt;/strong&gt;или 1 &lt;strong&gt;Hard&lt;/strong&gt;. И так на протяжении трех с небольшим месяцев каждый день по 1.5 - 2 часа.&lt;/p&gt;
  &lt;p id=&quot;YVU4&quot;&gt;Надеюсь, вы что-то вынесли из этой статьи, и так же надеюсь, что вам потребуется потратить сильно меньше времени и сил для устройства на позицию мечты.&lt;/p&gt;
  &lt;p id=&quot;ZzNe&quot;&gt;Спасибо за внимание!&lt;/p&gt;

</content></entry><entry><id>cybeaster:V7hg2gYQut6</id><link rel="alternate" type="text/html" href="https://teletype.in/@cybeaster/V7hg2gYQut6?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=cybeaster"></link><title>Как НЕ нужно писать резюме</title><published>2023-12-09T15:06:09.890Z</published><updated>2023-12-09T15:07:08.004Z</updated><summary type="html">Прежде чем прийти к текущему состоянию своего CV, я пообщался с тонной людей, обошел множество ресурсов, в том числе resume.io, поговорил с ментором ex-amazon'а, обсудив с ним резюме. Суммарно я переписывал его раз 13-14, пока не довел до идеала.</summary><content type="html">
  &lt;p id=&quot;xFqS&quot;&gt;Прежде чем прийти к текущему состоянию своего CV, я пообщался с тонной людей, обошел множество ресурсов, в том числе resume.io, поговорил с ментором ex-amazon&amp;#x27;а, обсудив с ним резюме. Суммарно я переписывал его раз 13-14, пока не довел до идеала.&lt;/p&gt;
  &lt;p id=&quot;PvJe&quot;&gt;Я распишу что указывать нужно, что нельзя, и на что в первую очередь обращает внимание HR.&lt;/p&gt;
  &lt;p id=&quot;dD00&quot;&gt;Начнем с того, что рекрутер может проверять в день десятки и сотни резюме, посему, считайте, что на вашей анкете он &lt;strong&gt;будет задерживаться секунд на 15-30&lt;/strong&gt;. Если в нем он ничего не увидит за отведенное время, то проще будет &lt;strong&gt;скипнуть &lt;/strong&gt;и приступить к следующему, чем сидеть и разбираться. Из этого следует два вывода:&lt;/p&gt;
  &lt;p id=&quot;dbc6&quot;&gt;1. &lt;strong&gt;Каждое&lt;/strong&gt; слово, написанное в вашем резюме, должно иметь смысл.&lt;/p&gt;
  &lt;p id=&quot;ats6&quot;&gt;2. Этих &lt;strong&gt;слов&lt;/strong&gt; должно быть как можно меньше, а смысла в них должно быть как можно больше.&lt;/p&gt;
  &lt;p id=&quot;QhAa&quot;&gt;Как правило, если у вас &lt;strong&gt;менее 10 лет&lt;/strong&gt; опыта и &lt;strong&gt;меньше пяти&lt;/strong&gt; компаний, то резюме &lt;strong&gt;должно помещаться на одну страницу A4&lt;/strong&gt;, если этого не происходит, тогда оптимизируйте пространство и умещайте как можете.&lt;/p&gt;
  &lt;p id=&quot;U0r2&quot;&gt;Описанное выше - одна из причин, почему я &lt;strong&gt;отказался от всех резюме билдеров:&lt;/strong&gt; они абсолютно неэффективно расходуют пространство.&lt;/p&gt;
  &lt;p id=&quot;JSJF&quot;&gt;Ниже - это &lt;strong&gt;лучшее &lt;/strong&gt;к чему я смог прийти на том же resume.io:&lt;/p&gt;
  &lt;figure id=&quot;MStL&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/1a25fcb4296aaf511db6d.png&quot; width=&quot;495&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7Xfi&quot;&gt;И то, что получилось в итоге:&lt;/p&gt;
  &lt;figure id=&quot;HK5o&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/9122f22a6d9bc9fef8ed3.png&quot; width=&quot;828&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cO1P&quot;&gt;Чтобы собрать пазл о сотруднике &lt;strong&gt;уже&lt;/strong&gt; небходимо идти на следующую страницу. Если было бы больше компаний или пет проектов, то могло бы выйти и на 3 страницы.&lt;/p&gt;
  &lt;h4 id=&quot;Что-не-нужно-писать:&quot;&gt;Что не нужно писать:&lt;/h4&gt;
  &lt;ul id=&quot;h3AC&quot;&gt;
    &lt;li id=&quot;2DOE&quot;&gt;&lt;strong&gt;Дата рождения&lt;/strong&gt; - Эйджизм никто не отменял. Никогда не светите возрастом пока никто не явно не спросит.&lt;/li&gt;
    &lt;li id=&quot;t1Ap&quot;&gt;&lt;strong&gt;Город/страна&lt;/strong&gt; - Бессмысленная информация. Если вы подаетесь в Москву, значит вы или готовы к релокации, или живете в Москве. Если вы подаетесь в US - on site, но не собираетесь переезжать, то просто потратите и свое, и время HR&amp;#x27;а в пустую.&lt;/li&gt;
    &lt;li id=&quot;QvUg&quot;&gt;&lt;strong&gt;Отдельная графа для скиллов&lt;/strong&gt;: абсолютно бесполезна. Каждый скилл там ничем не подкреплен. Если хотите аргументировать почему вы это умеете, пишите в секции с местами работы, пет проектами или сертификатами. (У меня на первых итерациях резюме - колонка слева).&lt;/li&gt;
    &lt;li id=&quot;iV9J&quot;&gt;&lt;strong&gt;О себе&lt;/strong&gt; - мне рекомендовали вообще вырезать, я оставил чтобы хоть как то обрисовывать опыт. Допустимо до 200 символов, я бы рекомендовал максимум пару строк.&lt;/li&gt;
    &lt;li id=&quot;I82V&quot;&gt;&lt;strong&gt;Локация места работы&lt;/strong&gt; - бесполезная информация, советую не указывать.&lt;/li&gt;
    &lt;li id=&quot;VihD&quot;&gt;&lt;strong&gt;Фотография - &lt;/strong&gt;бесполезная информация - вырезаем&lt;strong&gt;.&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;eZVg&quot;&gt;&lt;strong&gt;Язык &lt;/strong&gt;- можно указать, если считаете, что это даст вам преимущество на вакансиях и/или есть свободное место.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;Что-нужно-писать:&quot;&gt;Что нужно писать:&lt;/h4&gt;
  &lt;ul id=&quot;tBiS&quot;&gt;
    &lt;li id=&quot;33Ws&quot;&gt;&lt;strong&gt;Чем занимались&lt;/strong&gt; на каждой работе по паттерну: &lt;strong&gt;ЧТО СДЕЛАЛ/ЧЕМ ЗАНИМАЛСЯ - ЧТО ПОЛУЧИЛ&lt;/strong&gt;. Это так зываемые &lt;em&gt;bullet point&amp;#x27;ы&lt;/em&gt;. Их, обычно, указывают от 3 до 5 штук. Я урезал, чтобы поместились все проеты&lt;/li&gt;
    &lt;li id=&quot;X5yI&quot;&gt;&lt;strong&gt;Образование &lt;/strong&gt;- указывать желательно, если есть. Я писал без лет, только бакалавриат. Так же, все ваши сертификаты, имеющие отношения к работе, курсы английского и т.д т.п есть смысл указывать, если только это не олимпиада Кенгуренок за 2 класс.&lt;/li&gt;
    &lt;li id=&quot;4RnB&quot;&gt;&lt;strong&gt;Стэк, задействованный в работе&lt;/strong&gt; - нужно дать понять HR&amp;#x27;у чем вы пользовались, однако мне советовали вставлять технологии в &lt;em&gt;bullet point&amp;#x27;ы&lt;/em&gt;. Это оказалось весьма проблематично и я вынес в отдельный список ниже позиции.&lt;/li&gt;
    &lt;li id=&quot;Jx3V&quot;&gt;&lt;strong&gt;Опционально&lt;/strong&gt; - в конце можно добавить ваши хобби, увлечения и пр., но сомневаюсь что хоть кто-то на это посмотрит. Исключением могут выступать ваши блоги/юпуп каналы и прочее, но даже так, я бы оставил ссылку вверху и в первом блоке постарался бы это выделить.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h4 id=&quot;Теперь-конкретно-по-моему-резюме:&quot;&gt;Теперь конкретно по моему резюме:&lt;/h4&gt;
  &lt;ol id=&quot;DrBE&quot;&gt;
    &lt;li id=&quot;7zfS&quot;&gt;&lt;strong&gt;О Себе&lt;/strong&gt; - заголовок отнимает место и бесполезен - убираем, оставляем только нужный текст. Интуинтивно и так понятно что там и о чем.&lt;/li&gt;
    &lt;li id=&quot;0brS&quot;&gt;&lt;strong&gt;Профессиональный опыт&lt;/strong&gt;. В теории там тоже можно было бы убрать заголовок, но место было, и я решил оставить. На первых двух местах работы по 2-3 &lt;em&gt;bullet points&lt;/em&gt; с конкретными цифрами и стэком. Так же вставил небольшое описание что за продукт делал и прилинковал сайты.&lt;/li&gt;
    &lt;li id=&quot;48gn&quot;&gt;&lt;strong&gt;Пэт проекты&lt;/strong&gt;. Там в любом случае надо писать заголовок, иначе не будет ясно о чем блок. Там по точно такой же схеме - описание проекта в одну строку и &lt;em&gt;3 bullet points&lt;/em&gt; в каждой.&lt;/li&gt;
    &lt;li id=&quot;erFL&quot;&gt;&lt;strong&gt;Образование &lt;/strong&gt;- т.к места не хватало, я объединил в один блок и бакалавриат, и сертификаты. Для вуза так же указал стэк, но можно этого и не делать. Почти всем все равно чем ты в вузе занимался.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;jKEr&quot;&gt;Так же важно понимать, что ваши резюме прогоняются через &lt;em&gt;Applicant Tracking systems (ATS)&lt;/em&gt; разбивая на &lt;strong&gt;ключевые слова&lt;/strong&gt;. Если в вашем резюме &lt;em&gt;ATS &lt;/em&gt;не найдет кейвордов на нужную позицию, то его просто &lt;strong&gt;выкинут&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;LHf2&quot;&gt;Результат по кейвордам, который выдала ATS после сканирования самой первой версии резюме:&lt;/p&gt;
  &lt;figure id=&quot;vuGs&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://telegra.ph/file/03bd4abdae068bf6fe06e.png&quot; width=&quot;765&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;H2hz&quot;&gt;Советую так же ознакомиться с другим &lt;a href=&quot;https://www.careercup.com/resume&quot; target=&quot;_blank&quot;&gt;ресурсом&lt;/a&gt;, где очень подробно описаны правила составления резюме.&lt;/p&gt;
  &lt;p id=&quot;rrEI&quot;&gt;Так же предлагаю брать мой &lt;a href=&quot;https://docs.google.com/document/d/1uPx5wfb1mRArK7HA8n0tNq3qMNMtDSL-bpVg_BUmjXU/edit?usp=sharing&quot; target=&quot;_blank&quot;&gt;вариант&lt;/a&gt;, и переписывать под себя.&lt;/p&gt;

</content></entry></feed>