<?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>Владимир Большаков</title><subtitle>Занимаюсь разработкой фрондендов и мобильных приложений. Тим лидствую в немецкой компании. Стараюсь путешествовать как можно чаще.</subtitle><author><name>Владимир Большаков</name></author><id>https://teletype.in/atom/bolshakov</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/bolshakov?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/bolshakov?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-29T23:57:20.187Z</updated><entry><id>bolshakov:023-front-end-interview-preparation-2</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/023-front-end-interview-preparation-2?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Задачи по JavaScript для подготовки к собеседованию. Часть 2</title><published>2022-02-16T14:31:03.083Z</published><updated>2022-02-16T17:04:20.609Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/1a/d4/1ad47ffb-9d57-4388-9cb0-76f6fcf27137.png"></media:thumbnail><category term="programming" label="Programming"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/92/05/9205e856-1c85-462f-a9c2-b1182433755a.png&quot;&gt;Всем привет!</summary><content type="html">
  &lt;p id=&quot;Xe42&quot;&gt;Всем привет!&lt;/p&gt;
  &lt;p id=&quot;Bu38&quot;&gt;В этой статье я рассмотрю 5 задач, проверяющих знание JavaScript. Каждая их них снабжена объяснением и алгоритмом решения. В конце я даю ссылки на документацию. Это вторая часть серии статей, и она посвящена самостоятельной реализации встроенных методов JavaScript-массивов &lt;strong&gt;forEach, map, filter, some, even&lt;/strong&gt; и &lt;strong&gt;reduce&lt;/strong&gt;. Первую часть вы можете прочитать по &lt;a href=&quot;https://bolshakov.vladimir.ru/021-front-end-interview-preparation-1&quot; target=&quot;_blank&quot;&gt;ссылке&lt;/a&gt;.&lt;/p&gt;
  &lt;figure id=&quot;UeYV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/92/05/9205e856-1c85-462f-a9c2-b1182433755a.png&quot; width=&quot;1200&quot; /&gt;
    &lt;figcaption&gt;Задачи по JavaScript для подготовки к собеседованию. Часть 2&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;1aMM&quot;&gt;Перед тем как начать, хочу отметить, что все 5 задач однотипны. Успешность их решения отражает понимание того, как на самом деле устроены рассматриваемые нативные методы.&lt;/p&gt;
  &lt;h2 id=&quot;%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-foreach&quot;&gt;Метод forEach&lt;/h2&gt;
  &lt;p id=&quot;aYXO&quot;&gt;Этот метод применяется для простого перебора массива и совершения действий с его элементами. Существует мнение, что его вообще не стоит касаться и что лучше просто обойтись вариациями цикла for. Как бы то ни было, этот метод используется повсеместно. На собеседовании могут спросить, как он устроен, и попросить написать собственную реализацию.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;p id=&quot;PXhw&quot;&gt;Прежде чем начать, стоит разобраться, что должна принимать в качестве параметров наша функция:&lt;/p&gt;
  &lt;ul id=&quot;i7qq&quot;&gt;
    &lt;li id=&quot;cyKU&quot;&gt;arr – массив, который нужно перебрать;&lt;/li&gt;
    &lt;li id=&quot;pz0g&quot;&gt;callbackFn – функция обратного вызова, обрабатывающая каждый элемент перебираемого массива:&lt;/li&gt;
    &lt;ul id=&quot;WwNS&quot;&gt;
      &lt;li id=&quot;KEAc&quot;&gt;element – элемент массива, возвращаемый в callback-функцию;&lt;/li&gt;
      &lt;li id=&quot;Y6fv&quot;&gt;index – индекс этого элемента;&lt;/li&gt;
      &lt;li id=&quot;Z1Zq&quot;&gt;array – исходный массив, который мы перебираем.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;4ap7&quot;&gt;thisArg – передаваемый в функцию контекст.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/224adae63f24f32c2a0bfef7f7ad756a.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Общий вид функции forEach&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;NZtP&quot;&gt;Весь смысл реализации заключается в том, чтобы просто перебрать элементы массива один за другим. При этом не стоит забывать, что должна быть возможность передать в функцию контекст this. Он может понадобиться внутри функции обратного вызова, которая, в свою очередь, возвращает элемент массива, его индекс и его самого.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;p id=&quot;6hBo&quot;&gt;1. Создаем функцию forEach, указав в качестве параметров:&lt;/p&gt;
  &lt;ul id=&quot;x9RR&quot;&gt;
    &lt;li id=&quot;qbG0&quot;&gt;arr – массив;&lt;/li&gt;
    &lt;li id=&quot;Ojpm&quot;&gt;callback – функцию обратного вызова;&lt;/li&gt;
    &lt;li id=&quot;0Zt5&quot;&gt;thisArg – контекст this, это необязательный параметр.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;oB2Y&quot;&gt;2. Внутри тела функции перебираем массив arr при помощи цикла for;&lt;/p&gt;
  &lt;p id=&quot;lHBc&quot;&gt;3. Внутри цикла вызываем callback-функцию при помощи метода .call(). Это необходимо для передачи в неё контекста thisArg. Итак, передаем в него следующие параметры:&lt;/p&gt;
  &lt;ul id=&quot;iRRO&quot;&gt;
    &lt;li id=&quot;mXam&quot;&gt;thisArg – переданный извне контекст this;&lt;/li&gt;
    &lt;li id=&quot;Ufdw&quot;&gt;arr[index] – текущий элемент массива;&lt;/li&gt;
    &lt;li id=&quot;bghm&quot;&gt;index – индекс элемента массива;&lt;/li&gt;
    &lt;li id=&quot;e8Sr&quot;&gt;arr – исходный массив.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/a784ea2f3ce4313286dccc6941a08103.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Решение с подробным объяснением и примером вызова для функции  forEach&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-map&quot;&gt;Метод map&lt;/h2&gt;
  &lt;p id=&quot;lwiW&quot;&gt;Метод массива map используется, чтобы перебрать элементы и провести их модификацию. Например, массив состоит из объектов и к каждому из них нужно добавить новое свойство или удалить у него какие-нибудь данные.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;p id=&quot;4nOa&quot;&gt;Функция должна принимать в себя следующие параметры:&lt;/p&gt;
  &lt;ul id=&quot;zu07&quot;&gt;
    &lt;li id=&quot;mtaE&quot;&gt;arr – массив, который нужно перебрать для модификации его элементов;&lt;/li&gt;
    &lt;li id=&quot;22V8&quot;&gt;callbackFn – функция, обрабатывающая каждый элемент перебираемого массива, она должна возвращать измененные или новые данные на место этого элемента:&lt;/li&gt;
    &lt;ul id=&quot;WIcO&quot;&gt;
      &lt;li id=&quot;i99F&quot;&gt;element – элемент массива возвращаемый в callback-функцию;&lt;/li&gt;
      &lt;li id=&quot;W70i&quot;&gt;index – индекс этого элемента.;&lt;/li&gt;
      &lt;li id=&quot;xWZq&quot;&gt;array – исходный массив.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;eFxe&quot;&gt;thisArg – передаваемый в функцию контекст this, это необязательный параметр. &lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/44489539137f807f80c393b96d2dad34.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Общий вид функции map&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;tnks&quot;&gt;Как и в реализации метода forEach, мы можем перебирать элементы массива, но при этом еще и возвращать модифицированные данные. Здесь также важно не забыть реализовать возможность передачи контекста this. Основное назначение этой функции в том, чтобы модифицировать коллекции данных. Например, мы можем получить массив данных пользователей с сервера, но по какой-то причине у них будут отсутствовать уникальные идентификаторы. Но они могут понадобиться для вывода данных в таблице в браузере – или для сортировки, сокрытия каких-то элементов и т.д. При помощи метода map мы можем это исправить, перебрав массив и добавив в каждый элемент по уникальному идентификатору.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;ol id=&quot;idOf&quot;&gt;
    &lt;li id=&quot;oyVe&quot;&gt;Создаем функцию map, указав в качестве параметров:&lt;/li&gt;
    &lt;ul id=&quot;TsAN&quot;&gt;
      &lt;li id=&quot;qJu1&quot;&gt;arr – массив;&lt;/li&gt;
      &lt;li id=&quot;omMA&quot;&gt;callback – функция обратного вызова;&lt;/li&gt;
      &lt;li id=&quot;CX3x&quot;&gt;thisArg – контекст this, это необязательный параметр.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;MD2R&quot;&gt;Внутри функции создаем контейнер, в который будем помещать модифицированные данные из массива;&lt;/li&gt;
    &lt;li id=&quot;WkKC&quot;&gt;При помощи цикла for перебираем массив, где вызываем callback-функцию при помощи метода .call(), это нужно для того, чтобы передать в неё контекст this;&lt;/li&gt;
    &lt;li id=&quot;xP4A&quot;&gt;В функцию обратного вызова передаем в параметры:&lt;/li&gt;
    &lt;ul id=&quot;UbA0&quot;&gt;
      &lt;li id=&quot;TQUD&quot;&gt;thisArg – переданный извне контекст this;&lt;/li&gt;
      &lt;li id=&quot;h1wK&quot;&gt;arr[index] – текущий элемент массива;&lt;/li&gt;
      &lt;li id=&quot;M9kW&quot;&gt;index – индекс элемента массива;&lt;/li&gt;
      &lt;li id=&quot;aTEe&quot;&gt;arr – исходный массив;&lt;/li&gt;
      &lt;li id=&quot;wVL5&quot;&gt;не забываем добавлять результат выполнения функции в контейнер.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;bcYI&quot;&gt;После завершения цикла возвращаем из функции map контейнер с модифицированными данными.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/a62e2b61a790e1fe8baa352cca1f9b04.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Решение с подробным объяснением и примером вызова для функции map&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-filter&quot;&gt;Метод filter&lt;/h2&gt;
  &lt;p id=&quot;rMiA&quot;&gt;Суть этого метода заключается в его названии. Это один из самых простых способов отфильтровать массив в JavaScript. В остальном он также очень похож на все предыдущие.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;p id=&quot;cnLy&quot;&gt;Обязательные условия&lt;/p&gt;
  &lt;ul id=&quot;pazT&quot;&gt;
    &lt;li id=&quot;1PQS&quot;&gt;arr – массив, который надо отфильтровать;&lt;/li&gt;
    &lt;li id=&quot;t8LN&quot;&gt;callbackFn – функция, которая содержит в себе проверку элемента массива условиям фильтрации:&lt;/li&gt;
    &lt;ul id=&quot;f46P&quot;&gt;
      &lt;li id=&quot;CHz7&quot;&gt;element – элемент массива возвращаемый в callback функцию;&lt;/li&gt;
      &lt;li id=&quot;Byww&quot;&gt;index – индекс этого элемента;&lt;/li&gt;
      &lt;li id=&quot;QH64&quot;&gt;array – исходный массив.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;dN1d&quot;&gt;thisArg – передаваемый в функцию контекст, это необязательный параметр. &lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/f1575739461bdbd89b25b8741d4d4ed3.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Общий вид функции filter&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;PUDq&quot;&gt;Этот метод предназначен, чтобы фильтровать данные в массиве. Я привел в качестве примера случай, когда исходная коллекция содержит данные разных типов, но нам нужно извлечь только числа. Или же более живой пример: у нас есть массив с объектами, каждый из которых содержит информацию о каком-то пользователе. В каждом объекте указан год рождения. Наша задача – найти всех, кто родился до 2000 года. В этом случае мы просто передаем в метод filter функцию обратного вызова, в которой проверяем это условие, и, если оно выполняется, возвращаем true.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;ol id=&quot;0D8V&quot;&gt;
    &lt;li id=&quot;gL2t&quot;&gt;Создаем функцию filter, указав в качестве параметров:&lt;/li&gt;
    &lt;ul id=&quot;kahk&quot;&gt;
      &lt;li id=&quot;CQcn&quot;&gt;arr – массив;&lt;/li&gt;
      &lt;li id=&quot;Dce9&quot;&gt;callback – функция обратного вызова;&lt;/li&gt;
      &lt;li id=&quot;U4vB&quot;&gt;thisArg – контекст this, это необязательный параметр.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;VkJ3&quot;&gt;Внутри функции создаем контейнер, в который будем помещать отфильтрованные данные из массива;&lt;/li&gt;
    &lt;li id=&quot;bgvK&quot;&gt;При помощи цикла for перебираем массив, где вызываем callback-функцию при помощи метода .call(), это нужно, чтобы передать в неё контекст this;&lt;/li&gt;
    &lt;li id=&quot;nGkz&quot;&gt;В функцию обратного вызова передаем в параметры:&lt;/li&gt;
    &lt;ul id=&quot;MMpW&quot;&gt;
      &lt;li id=&quot;inWu&quot;&gt;thisArg – переданный извне контекст this;&lt;/li&gt;
      &lt;li id=&quot;9zvj&quot;&gt;arr[index] – текущий элемент массива;&lt;/li&gt;
      &lt;li id=&quot;VB8s&quot;&gt;index – индекс элемента массива;&lt;/li&gt;
      &lt;li id=&quot;HIun&quot;&gt;arr – исходный массив;&lt;/li&gt;
      &lt;li id=&quot;2ywp&quot;&gt;если callback-функция возвращает true, то добавляем этот элемент массива в контейнер.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;XvOP&quot;&gt;После завершения цикла возвращаем из функции map контейнер с данными, удовлетворяющими условиям фильтрации.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/36519c048a500abe1c84cd5466cd9de9.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Решение с подробным объяснением и примером вызова для функции filter&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-every-and-some&quot;&gt;Методы every and some&lt;/h2&gt;
  &lt;p id=&quot;MDwB&quot;&gt;Эти два метода полезны для оценки массива на соответствие каким-либо условиям. Every проверяет, подходят ли этим условиям все элементы, а some – хотя бы один. Их реализации очень похожи, поэтому я решил объединить их в один подраздел.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;ul id=&quot;Q1zd&quot;&gt;
    &lt;li id=&quot;Wwa9&quot;&gt;callbackFn – функция, обрабатывающая каждый элемент перебираемого массива. В случае every, если хотя бы один из элементов не соответствует условию, то возвращается false. При пустом массиве true. some работает по такому же принципу, но возвращает true, если хотя бы один элемент удовлетворяет проверке и false по умолчанию – то есть при пустом массиве и при несоответствии условиям:&lt;/li&gt;
    &lt;ul id=&quot;pcAp&quot;&gt;
      &lt;li id=&quot;Ks3o&quot;&gt;element – элемент массива, возвращаемый в callback-функцию;&lt;/li&gt;
      &lt;li id=&quot;KL7U&quot;&gt;index – индекс этого элемента;&lt;/li&gt;
      &lt;li id=&quot;Fwog&quot;&gt;array – исходный массив, который мы перебираем.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;Q3VE&quot;&gt;thisArg – передаваемый в функцию контекст, это необязательный параметр.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/d4da8aa907b1eb5635c401c85de6e371.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Общий вид функций some и every&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;Apdv&quot;&gt;Как исходит из описания выше, эти методы хорошо использовать при проверке массивов на выполнение каких-либо условий. Например, валидации. При помощи every мы можем проверить, все ли элементы подходят условиям, и в случае провала не отправлять данные на сервер. Для some можно представить такой пример: у нас есть несколько массивов с группами людей. Мы точно знаем, что кто-то из них болен и что в случае принадлежности больного к какому-то массиву всех их отправят на карантин. Мы можем просто перебрать каждый массив и проверить, если ли там хотя бы кто-то, кому нездоровится.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;ol id=&quot;saqe&quot;&gt;
    &lt;li id=&quot;khgL&quot;&gt;Создаем функцию every, указав в качестве параметров:&lt;/li&gt;
    &lt;ul id=&quot;KPR2&quot;&gt;
      &lt;li id=&quot;HuEi&quot;&gt;arr – массив;&lt;/li&gt;
      &lt;li id=&quot;e876&quot;&gt;callback – функция обратного вызова;&lt;/li&gt;
      &lt;li id=&quot;PpYs&quot;&gt;thisArg – контекст this, это необязательный параметр.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;EA8l&quot;&gt;При помощи цикла for перебираем массив, где вызываем callback-функцию при помощи метода .call(), это нужно, чтобы передать в неё контекст this;&lt;/li&gt;
    &lt;li id=&quot;XsAR&quot;&gt;В функцию обратного вызова передаем в параметры:&lt;/li&gt;
    &lt;ul id=&quot;KTyp&quot;&gt;
      &lt;li id=&quot;kXGw&quot;&gt;thisArg – переданный извне контекст this;&lt;/li&gt;
      &lt;li id=&quot;wcNT&quot;&gt;arr[index] – текущий элемент массива;&lt;/li&gt;
      &lt;li id=&quot;4dsC&quot;&gt;index – индекс элемента массива;&lt;/li&gt;
      &lt;li id=&quot;viy1&quot;&gt;arr – исходный массив;&lt;/li&gt;
      &lt;li id=&quot;HBaq&quot;&gt;для every – если хотя бы один из вызовов функции обратного вызова вернул false, то и мы возвращаем false. Для some – если хотя бы один из вызовов функции обратного вызова вернул true, то и мы возвращаем true.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;JZoh&quot;&gt;Для every – по умолчанию мы всегда возвращаем из функции true. Для some – по умолчанию мы всегда возвращаем из функции false.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/d606b31e5a33ed3e09e787b060711c48.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Решение с подробным объяснением и примером вызова для функций some и every&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-reduce&quot;&gt;Метод reduce&lt;/h2&gt;
  &lt;p id=&quot;UGOj&quot;&gt;Метод reduce() выполняет функцию обратного вызова, предоставленную пользователем, на каждом элементе массива по порядку, а также передает возвращаемое значение из вычисления на предыдущем элементе. Конечный результат работы метода над всеми элементами массива – одно значение.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;ul id=&quot;cwsO&quot;&gt;
    &lt;li id=&quot;yiPk&quot;&gt;arr – массив, с которым мы будем работать;&lt;/li&gt;
    &lt;li id=&quot;5YAl&quot;&gt;callbackFn – функция, обрабатывающая каждый элемент перебираемого массива:&lt;/li&gt;
    &lt;ul id=&quot;rpdH&quot;&gt;
      &lt;li id=&quot;vs6x&quot;&gt;previousValue – элемент, возвращаемый предыдущим вызовом функции;&lt;/li&gt;
      &lt;li id=&quot;DVel&quot;&gt;currentValue – значение текущего элемента;&lt;/li&gt;
      &lt;li id=&quot;x6R8&quot;&gt;index– индекс этого элемента.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;YxSW&quot;&gt;initialValue – изначальный элемент, который будет возвращен как previousValue при первом вызове callback. Если его не указать, то в качестве аккумулятора будет использован первый элемент перебираемого массива.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/e103eabdbf6c648862b31f86ac33d119.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Общий вид функции reduce&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;e7GO&quot;&gt;Смысл – обработать массив таким образом, чтобы на выходе получить одно значение. Классический пример – задача сложить все элементы массива и получить один ответ. Другим примером может быть объединение значений коллекции в одну строку – при том условии, что не все его элементы являются строками.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;ol id=&quot;8cFH&quot;&gt;
    &lt;li id=&quot;AWFt&quot;&gt;Создаем функцию reduce, указав в качестве параметров:&lt;/li&gt;
    &lt;ul id=&quot;6rub&quot;&gt;
      &lt;li id=&quot;o8iU&quot;&gt;arr – массив;&lt;/li&gt;
      &lt;li id=&quot;45m0&quot;&gt;callback – функция обратного вызова;&lt;/li&gt;
      &lt;li id=&quot;yqkf&quot;&gt;initialValue – переменная, используемая в качестве изначального значения аккумулятора при первом вызове функции.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;qOR0&quot;&gt;Объявляем переменную result, которую будем передавать на следующий этап;&lt;/li&gt;
    &lt;li id=&quot;PLli&quot;&gt;Если первый аргумент не был передан, то используем его в качестве первого элемента массива и не забываем удалить его из массива;&lt;/li&gt;
    &lt;li id=&quot;WqZW&quot;&gt;Если первоначальное значение было передано, то делаем его значением результата;&lt;/li&gt;
    &lt;li id=&quot;PxKQ&quot;&gt;При помощи цикла for перебираем массив, где вызываем callback-функцию;&lt;/li&gt;
    &lt;li id=&quot;X8Lh&quot;&gt;В функцию обратного вызова передаем в параметры:&lt;/li&gt;
    &lt;ul id=&quot;QBwI&quot;&gt;
      &lt;li id=&quot;wEnh&quot;&gt;null – нам не нужно передавать контекст this, поэтому вместо него передаем пустое значение;&lt;/li&gt;
      &lt;li id=&quot;50Cm&quot;&gt;result – результат, который мы передаем в callback для совершения каких-либо манипуляций над ним;&lt;/li&gt;
      &lt;li id=&quot;HlgR&quot;&gt;arr[index] – текущий элемент массива;&lt;/li&gt;
      &lt;li id=&quot;HAKw&quot;&gt;arr – исходный массив;&lt;/li&gt;
      &lt;li id=&quot;Fywl&quot;&gt;после выполнения функции обратного вызова присваиваем результат в переменную result.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;gmp8&quot;&gt;Возвращаем результат после полного прохода цикла.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/601d4d84d175a849e839856efdd716f9.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Решение с подробным объяснением и примером вызова для функции reduce&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D0%BB%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D1%8B&quot;&gt;Список литературы&lt;/h2&gt;
  &lt;p id=&quot;R3BF&quot;&gt;В этой заметке я рассмотрел, как реализовать рабочие варианты уже существующих методов перебора массивов. В реальной работе вы в 100% случаев будете пользоваться их встроенными в язык аналогами, но способность их писать самостоятельно помогает лучше понять, как они работают и когда их выгодно использовать. Именно это и могут проверить на собеседовании. Я не стал добавлять в реализацию обработку ошибок и тесты. Чтобы узнать об этом больше, стоит обратиться к официальной документации. Ниже – список литературы к заметке.&lt;/p&gt;
  &lt;ol id=&quot;8L9R&quot;&gt;
    &lt;li id=&quot;BCjt&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/for&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - For&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;ptb7&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/this&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - this&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;Jg6u&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/call&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - Function.prototype.call()&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;oP2B&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Glossary/Callback_function&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - Callback function&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;81q4&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - Array&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;g6wg&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - Array.prototype.forEach()&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;EwX8&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - Array.prototype.map()&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;BBi5&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/filter&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - Array.prototype.filter()&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;ZjFX&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/every&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - Array.prototype.every()&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;P6Ek&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/some&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - Array.prototype.some()&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;KAeS&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce&quot; target=&quot;_blank&quot;&gt;MDM Web Docs - Array.prototype.reduce()&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;%D0%BD%D0%B0%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%BA&quot;&gt;Напоследок&lt;/h2&gt;
  &lt;p id=&quot;x3FK&quot;&gt;Если вам понравилась статья и вы хотите больше подобного контента, то ставьте лайки и подписывайтесь на мой блог и социальные сети. Буду рад подискутировать в комментариях! Всем спасибо!&lt;/p&gt;
  &lt;p id=&quot;9RC1&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;oKSK&quot;&gt;&lt;a href=&quot;https://www.instagram.com/andersdeath/&quot; target=&quot;_blank&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;auP4&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bolshakov:026-about-politics-1</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/026-about-politics-1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Мысли о будущем России и стран ближнего зарубежья</title><published>2022-02-08T17:23:44.672Z</published><updated>2022-02-08T17:23:44.672Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/03/2a/032a32d3-51da-467e-aa49-83d3f870e32a.png"></media:thumbnail><category term="politika" label="политика"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/86/55/865599c5-f13c-43fa-ae52-25f60c2d8697.png&quot;&gt;Всем привет!</summary><content type="html">
  &lt;p id=&quot;%D0%BC%D1%8B%D1%81%D0%BB%D0%B8-%D0%BE-%D0%B1%D1%83%D0%B4%D1%83%D1%89%D0%B5%D0%BC-%D1%80%D0%BE%D1%81%D1%81%D0%B8%D0%B8-%D0%B8-%D1%81%D1%82%D1%80%D0%B0%D0%BD-%D0%B1%D0%BB%D0%B8%D0%B6%D0%BD%D0%B5%D0%B3%D0%BE-%D0%B7%D0%B0%D1%80%D1%83%D0%B1%D0%B5%D0%B6%D1%8C%D1%8F&quot;&gt;Всем привет!&lt;/p&gt;
  &lt;p id=&quot;oGfE&quot;&gt;Вообще, сегодня должна была выйти вторая часть «Задач по JavaScript для подготовки к собеседованию», но я решил отложить её до следующей недели и порассуждать о происходящем в России и в ближайших странах, так как это напрямую влияет на мои (и не только) планы, желания, возможности и т.д. Что происходит, что делать дальше, что ждать от будущего – своим мнением насчет этих трех вопросов я и поделюсь с вами в этом тексте.&lt;/p&gt;
  &lt;figure id=&quot;sN5i&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/86/55/865599c5-f13c-43fa-ae52-25f60c2d8697.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D1%87%D1%82%D0%BE-%D0%BF%D1%80%D0%BE%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%B8%D1%82&quot;&gt;Что происходит&lt;/h2&gt;
  &lt;p id=&quot;gWsS&quot;&gt;Оговорюсь, я смотрю на происходящее сидя в Санкт-Петербурге, иногда выезжая за его пределы. Мое мнение очень субъективно. Итак, примерно с 2013 года происходит процесс деградации экономики России: реальные доходы граждан падают, качество жизни снижается, неравенство растет. При этом правящий класс увеличивает финансирование силовых структур, дает им больше полномочий и, как следствие, они влияют все больше на принятие важных государственных решений. Законы, связанные с контролем интернета и цензурой, запретом массовых собраний и публичной критики властей, все больше поляризуют общество.&lt;/p&gt;
  &lt;p id=&quot;jwbi&quot;&gt;Ближайшая к нам страна Беларусь уже перешла в состояние перманентного террора. Протестные выступления 2020 года привели в невероятному всплеску насилия со стороны государства. Как следствие, немало активных граждан эмигрировали. События января 2022 года в Казахстане показали, что даже во внешне стабильном и мирном обществе могут произойти кровавые столкновения с десятками убитых и сотнями раненых. В Украине же происходит полнейшая неразбериха на правительственном уровне, улучшения общественно-экономической ситуации нет и там. Я уже не говорю о боестолкновениях между Арменией и Азербайджаном, Кыргызстаном и Таджикистаном. Они, к огромному сожалению, происходят регулярно.&lt;/p&gt;
  &lt;p id=&quot;GztW&quot;&gt;Все это очень негативно влияет на жизнь. Ближайшие государства либо стагнируют, либо деградируют. На фоне постоянного роста цен и общего падения уровня экономики будущее кажется туманным. Плюс, как это часто бывает, внешние непредвиденные факторы (например, пандемия COVID-19), ускоряют все эти процессы, усугубляют ситуацию.&lt;/p&gt;
  &lt;h2 id=&quot;%D1%87%D1%82%D0%BE-%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%B4%D0%B0%D0%BB%D1%8C%D1%88%D0%B5&quot;&gt;Что делать дальше&lt;/h2&gt;
  &lt;p id=&quot;duql&quot;&gt;То, что сейчас творится в России, рано или поздно закончится. Многочисленные примеры из истории показывают, что страны переживают как периоды расцвета, так и периоды упадка. Иногда они просто исчезают с карты. Можно изучить историю Китая, Германии, Франции, Испании, Османской империи, Золотой Орды и других государств, чтобы убедиться в этом. Но это все происходит в исторической перспективе, в рамках которой жизнь отдельного человека – всего лишь мгновение. У рядовых россиян, на мой взгляд, сегодня есть только пять вариантов того, как жить дальше:&lt;/p&gt;
  &lt;ol id=&quot;wmdb&quot;&gt;
    &lt;li id=&quot;9rz5&quot;&gt;Жить и трудиться на благо общества.&lt;/li&gt;
    &lt;li id=&quot;7hzV&quot;&gt;Открыто бороться с системой и надеяться на победу.&lt;/li&gt;
    &lt;li id=&quot;SgEb&quot;&gt;Не обращать внимания на происходящее и просто существовать.&lt;/li&gt;
    &lt;li id=&quot;X9Va&quot;&gt;Уехать в другую страну, рассчитывая вернуться в случае позитивных изменений.&lt;/li&gt;
    &lt;li id=&quot;oINV&quot;&gt;Эмигрировать насовсем и начать новую жизнь в новом месте.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;EspM&quot;&gt;Самое комфортное – ничего не делать, но так вы просто впустую проживете свою жизнь. Хотя каждый должен выбрать для себя сам. Я свой выбор сделал и двигаюсь в сторону эмиграции. Существует очень немного объективных предпосылок к тому, что ситуация в России изменится к лучшему в ближайшее время. Об этом говорит опыт последних лет. Мое детство пришлось на 90-е годы, и я очень хорошо помню, как было тяжело. Российское государство идет семимильными шагами в том, обратном направлении. Нам же остается лишь взять полную ответственность за себя и перестать, даже в мечтах, надеяться на то, что за время нашей жизни здесь произойдут какие-то улучшения.&lt;/p&gt;
  &lt;h2 id=&quot;%D1%87%D1%82%D0%BE-%D0%B6%D0%B4%D0%B0%D1%82%D1%8C-%D0%BE%D1%82-%D0%B1%D1%83%D0%B4%D1%83%D1%89%D0%B5%D0%B3%D0%BE&quot;&gt;Что ждать от будущего&lt;/h2&gt;
  &lt;p id=&quot;urDu&quot;&gt;В моем окружении почти каждый разработчик размышляет об отъезде, ищет работу за рубежом или уже собирает документы для эмиграции. Стоит обратить внимание, что это высокообразованные люди, которые могли бы принести много пользы нашему обществу. Молодые инженеры в это время стремятся попасть в крупные российские компании, набраться опыта и отправиться искать лучшей доли в IT-центрах за пределами страны.&lt;/p&gt;
  &lt;p id=&quot;g171&quot;&gt;На основе всего, что происходит сейчас, можно построить такой сценарий развития событий:&lt;/p&gt;
  &lt;ul id=&quot;zldy&quot;&gt;
    &lt;li id=&quot;bTTJ&quot;&gt;Из-за падения уровня образования будет деградировать научный потенциал страны. Неизбежно снизится и уровень IT. Онлайн не спасет, так как не будет хватать базы – школьного образования. Уже сейчас к нему есть множество вопросов. Крупные гиганты станут обучать персонал самостоятельно, но этого окажется недостаточно для появления новых проектов и общего развития отрасли.&lt;/li&gt;
    &lt;li id=&quot;hdDv&quot;&gt;Конечно, будет деградировать и общество. Отсутствие возможности высказаться и сделать политический выбор, хотя бы на уровне своего поселения или города, приводит к пассивности. Люди начнут все меньше интересоваться тем, кто ими правит, и станут терпеть и копить недовольство. У нас уже был аналогичный опыт – во времена СССР. Так что для нашей верхушки это просто дело техники. Но с другой стороны, теперь мнение можно выражать «подпольно» в интернете. В условиях тотальной несвободы настроения неизбежно радикализуются, а негативная энергия с большой силой выплеснется наружу, что не предвещает ничего хорошего. Я бы не хотел находиться здесь во время таких социальных потрясений.&lt;/li&gt;
    &lt;li id=&quot;23Ow&quot;&gt;В будущем в стране примут все больше запретов, ограничивающих свободу высказываний. Правящий класс осознаёт важность интернета, они уже сейчас стараются контролировать его, запрещая все, что может представлять угрозу. Уже сейчас можно получить штраф или сесть в тюрьму за неосторожно сказанные слова. Спокойно работает, закон Яровой, который поначалу казался невыполнимым. Так что далее, я думаю, ситуация будет только ухудшаться.&lt;/li&gt;
    &lt;li id=&quot;xjPz&quot;&gt;Если российские силовые структуры продолжат повышать свое влияние, то ничем хорошим это не кончится. Уже сейчас посадки в тюрьмы применяются как метод политической борьбы, но теоретически это может распространиться и на более широкие слои населения. Опыт других стран, таких как Камбоджа, Аргентина, Чили, Сирия, показывает, что захват власти силовиками приводит к ужасным последствиям. И это не может не вызывать страха.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;%D0%B2-%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;В завершение&lt;/h2&gt;
  &lt;p id=&quot;B5nl&quot;&gt;Подводя итог своему пессимистичному тексту, могу отметить, что любые потрясения не в состоянии изменить главное – личность. Что бы ни происходило в этой стране, люди выживут и будут неплохо жить. Жаль только, что последнее не относится к ныне живущим поколениям и осуществится только в исторической перспективе. Поэтому я вижу эмиграцию как самый правильный выбор для спокойной жизни сегодня. Но! Возможно, я не прав и просто нахожусь не в том информационном пузыре – под впечатлением от негатива из СМИ.&lt;/p&gt;
  &lt;p id=&quot;1XYN&quot;&gt;А что вы думаете о будущем России и ближайших к нам стран? Давайте обсудим эту тему в комментариях. Если вам понравился текст, подписывайтесь на меня здесь и в социальных сетях, чтобы не пропустить будущие статьи!&lt;/p&gt;
  &lt;p id=&quot;xpak&quot;&gt;Всем спасибо!&lt;/p&gt;
  &lt;p id=&quot;9RC1&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;oKSK&quot;&gt;&lt;a href=&quot;https://www.instagram.com/andersdeath/&quot; target=&quot;_blank&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;auP4&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bolshakov:024-about-myself-1</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/024-about-myself-1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Я мыслю, следовательно, я существую: диктофон и блог как инструменты познания</title><published>2022-01-25T17:12:22.806Z</published><updated>2022-01-25T17:16:10.278Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/4d/26/4d264f0e-5a8a-4658-93a4-21be51b2586e.png"></media:thumbnail><category term="o-sebe" label="О себе"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/ab/ad/abadd4d6-9895-4076-a012-be8abf512a7a.jpeg&quot;&gt;Всем привет!</summary><content type="html">
  &lt;p id=&quot;dYdj&quot;&gt;Всем привет!&lt;/p&gt;
  &lt;p id=&quot;cQ5k&quot;&gt;В одной из прошлых заметок я упомянул о терапии, которую придумал себе сам. А сегодня расскажу вам, каким образом она помогает мне больше узнать о себе и как это вообще связано с моим личностным и профессиональным развитием.&lt;/p&gt;
  &lt;figure id=&quot;mHUV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ab/ad/abadd4d6-9895-4076-a012-be8abf512a7a.jpeg&quot; width=&quot;3024&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D0%B0%D1%83%D0%B4%D0%B8%D0%BE%D0%BB%D0%B5%D1%82%D0%BE%D0%BF%D0%B8%D1%81%D1%8C&quot;&gt;Аудиолетопись&lt;/h2&gt;
  &lt;p id=&quot;et0n&quot;&gt;Уже примерно два года я веду аудиодневник. Почти каждую неделю выезжаю на автомобиле на час или два и фиксирую на диктофон все, что меня волнует и что нового случилось с момента прошлой записи. Это помогает мне лучше понять, в какой точке я сейчас нахожусь. Все записи загружаю в облако, развлекая себя мыслью, что какой-нибудь исследователь будущего их найдет и сможет изучить по ним нашу жизнь.&lt;/p&gt;
  &lt;p id=&quot;kHgh&quot;&gt;Недавно я решил прослушать записи и оценить, насколько я изменился за эти два года. Какие-то стороны моей личности, действительно, претерпели изменения. Я стал смелее, спокойнее, увереннее. Теперь я больший мизантроп, чем раньше. Также я стал иначе относиться к своему здоровью. По крайней мере, начал лечить застарелые болячки. Еще я проделал большой путь от инженера в одной из российских компаний до лида в немецкой. Заговорил по-английски и погрузился глубже в некоторые программистские темы, стал лучше разбираться в менеджменте. Удивительно, но даже манера говорить изменилась.&lt;/p&gt;
  &lt;h2 id=&quot;%D0%BC%D1%8B%D1%81%D0%BB%D0%B8-%D0%BD%D0%B5-%D0%B2-%D0%BF%D1%83%D1%81%D1%82%D0%BE%D1%82%D1%83&quot;&gt;Мысли не в пустоту&lt;/h2&gt;
  &lt;p id=&quot;Ogs9&quot;&gt;Одна из наиболее важных целей, которые я себе ставил два года назад, – начать на постоянной основе писать статьи или записывать подкасты. Последнее не получилось: это намного сложнее в производстве. Но я все таки начал писать заметки и делиться своими мыслями с окружающими. Тогда мне казалось, что это все будет похоже просто на крики в пустоту и не будет иметь никакого отклика. Изначально так и было, но сейчас я иногда получаю отзывы от других людей, что вызывает невероятную радость. Я рад даже негативу, так как это уже реакция, которая, при наличии конструктива, может подкорректировать мой вектор мышления.&lt;/p&gt;
  &lt;p id=&quot;m5GO&quot;&gt;Написание заметок, а точнее размышление над ними, является самым важным. На мой взгляд, самые страшные вещи в жизни – это перестать получать удовольствие от новых знаний и рефлексировать насчет своей личности и окружающей действительности. Когда я пишу про программирование, путешествия, менеджмент и др., то, как написал Рене Декарт в книге «Рассуждение о методе»: Cogito ergo sum («Я мыслю, следовательно, я существую»).&lt;/p&gt;
  &lt;h2 id=&quot;%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D1%8C&quot;&gt;Объективность, логичность, полезность&lt;/h2&gt;
  &lt;p id=&quot;6rYC&quot;&gt;Каждый текст пропущен через мои наблюдения о себе. Я стараюсь приблизиться к объективности, так как заметки, по большей части, касаются весьма неоднозначных вопросов. Например, когда я пишу о программировании, я основываюсь на своих представлениях о важности тех или иных вопросов. Когда пишу о путешествиях – это также отражения личных наблюдений. При этом я всегда стараюсь делать заметки максимально логичными. Один из моих идеалов – стремление к объективной истине, а добиться её можно в немалой степени путем последовательных и непротиворечивых умозаключений. Конечно, в результате они смешиваются с эмпирическими данными, но этого избежать невозможно – с подобным явлением и не стоит бороться.&lt;/p&gt;
  &lt;p id=&quot;JCqI&quot;&gt;Важнейшее свойство, которое я стремлюсь придать своим текстам, – полезность. Очень долго я не испытывал необходимости делиться полученными знаниями с окружающими, но года три назад что-то стало меняться. Я понял, что мне есть что рассказать. Мои советы, скорее всего, помогут сэкономить немало времени начинающему инженеру. Я даже подумывал открыть свою школу программирования, но пока коммерческая разработка кажется более привлекательной. Когда я начинал свой путь в профессии, я испытывал невероятный информационный голод, а сейчас вокруг нее невероятное количество информации. Можно сказать, что с каждой новой статьей я лишь добавляю маленькую ложку воды в этот океан, но мне хочется верить, что это не так. Также я верю в идею, что много информации не бывает, нужно лишь научиться её фильтровать.&lt;/p&gt;
  &lt;h2 id=&quot;%D0%BF%D0%BE%D0%BC%D0%BE%D1%87%D1%8C-%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D0%BC-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%B0%D0%BC&quot;&gt;Помочь начинающим программистам&lt;/h2&gt;
  &lt;p id=&quot;4LAD&quot;&gt;Одна из моих целей на ближайшие годы – написать книгу. Мой редактор может тут улыбнуться, вспомнив, как я плохо пишу, но каюсь, грамотное письмо – это моя слабая сторона. Я хочу отразить весь свой опыт работы программистом в одном труде. Планирую коснуться тем обучения, поиска работы, непосредственно работы в коллективе, поддержания профессионального уровня и т.д. Особенно мне интересно раскрыть вопросы проектирования и создания продуктов с точки зрения инженера. Но если кратко, хочется создать некий handbook для начинающих программистов. Тем более что написание книги мне кажется невероятно увлекательным делом.&lt;/p&gt;
  &lt;p id=&quot;eLji&quot;&gt;Я не имею ни малейшего понятия, сколько времени мне понадобится для создания произведения. Но уже сейчас я понемногу начал писать первые главы. И знаете что? Правы были те писатели и ученые, которые говорят, что нет лучшего способа разобраться в теме, чем начать о ней писать. Так и есть, я смог структурировать многие свои знания о программировании. Некоторых тем я уже коснулся в предыдущих материалах. Например, статья «&lt;a href=&quot;https://bolshakov.vladimir.ru/021-front-end-interview-preparation-1&quot; target=&quot;_blank&quot;&gt;Задачи по JavaScript для подготовки к собеседованию. Часть 1&lt;/a&gt;» родилась именно таким образом. Как, кстати, и «&lt;a href=&quot;https://bolshakov.vladimir.ru/022-about-business-1&quot; target=&quot;_blank&quot;&gt;Почему программистам нужно понимать бизнес-процессы&lt;/a&gt;».&lt;/p&gt;
  &lt;p id=&quot;O3ns&quot;&gt;В завершение я хотел бы выразить огромную благодарность всем, кто меня поддерживает. Это и близкие люди, и те, с кем я работаю, и те, кто помогает мне с написанием текстов, нещадно критикуя черновики. Отдельно я хочу сказать спасибо тем, кто заходит в мой блог. Вас пока немного, и надеюсь, скоро будет больше. Я рад каждому новому читателю. Для меня ведение блога – один из способов постижения действительности, донесения своих мыслей и идей до окружающих.&lt;/p&gt;
  &lt;p id=&quot;tH6E&quot;&gt;Если вам нравится то, что я пишу, подписывайтесь на меня здесь или в других социальных сетях. Всем большое спасибо!&lt;/p&gt;
  &lt;p id=&quot;9RC1&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;oKSK&quot;&gt;&lt;a href=&quot;https://www.instagram.com/andersdeath/&quot; target=&quot;_blank&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;auP4&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bolshakov:022-about-business-1</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/022-about-business-1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Почему программистам нужно понимать бизнес-процессы</title><published>2022-01-21T18:00:20.789Z</published><updated>2022-01-21T18:00:20.789Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/45/e4/45e421c3-9644-4b64-92ff-253e7422d68d.png"></media:thumbnail><category term="programming" label="Programming"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/e9/c6/e9c616d3-ec42-465a-b619-39718ea85b70.png&quot;&gt;В этой заметке я расскажу, как программист может стать более востребованным на рынке труда благодаря знанию бизнес-процессов. Я неоднократно встречал специалистов, у которых был весьма невысокий уровень производительности и при этом высокий уровень стресса из-за непонимания запросов руководства. Это приводило к конфликтам, выгоранию и другим проблемам.</summary><content type="html">
  &lt;p id=&quot;y6VI&quot;&gt;В этой заметке я расскажу, как программист может стать более востребованным на рынке труда благодаря знанию бизнес-процессов. Я неоднократно встречал специалистов, у которых был весьма невысокий уровень производительности и при этом высокий уровень стресса из-за непонимания запросов руководства. Это приводило к конфликтам, выгоранию и другим проблемам.&lt;/p&gt;
  &lt;figure id=&quot;8dWR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e9/c6/e9c616d3-ec42-465a-b619-39718ea85b70.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6pwZ&quot;&gt;Прежде чем начать, я хотел бы сделать акцент на том, что донесение идей до подчиненных всегда находится в зоне ответственности руководства: если программист что-то не понял, это в первую очередь ошибка менеджера.&lt;/p&gt;
  &lt;h2 id=&quot;%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%BD%D0%B0%D0%BD%D0%B8%D0%B9&quot;&gt;Получение знаний&lt;/h2&gt;
  &lt;p id=&quot;JlOs&quot;&gt;Когда я только начинал свой путь программиста, у меня неоднократно возникало непонимание того, зачем я выполняю ту или иную задачу. Среди менеджеров бытовало мнение, что линейному специалисту это совершенно не нужно знать: пусть болит голова о коде, а не о бизнесе. Мне же было критично важно, какую пользу я приношу своей работой. К сожалению, я видел только куски кода, которые не выливались в какую-то общую картину. Я не видел клиентов и не мог узнать ничего о том, что они думают о продукте. Из раза в раз я выгорал и менял работу. Конечно, на собеседованиях мне обещали, что меня будут вовлекать в обсуждение бизнес-проблем, проектирование и т.д., но это всегда оказывалось набором дежурных фраз.&lt;/p&gt;
  &lt;p id=&quot;CjJO&quot;&gt;Вместе с тем я стремился получить больше знаний о бизнесе. Для этого я, конечно же, начал изучать литературу. Это могли быть биографии разных предпринимателей, материалы о том, как устроен с точки зрения менеджмента процесс создания программного обеспечения, или просто учебники по бизнесу. Параллельно я читал множество статей с примерами того, как устроены другие, нецифровые виды предпринимательства. На мой взгляд, самые впечатляющие книги о бизнесе – это:&lt;/p&gt;
  &lt;ol id=&quot;teqA&quot;&gt;
    &lt;li id=&quot;k36u&quot;&gt;&lt;a href=&quot;https://www.ozon.ru/product/karera-menedzhera-34337511/?asb=Rsujjc5xreznirCQ%252B%252FUNZBchX1Pu%252F09QjEOHMTeTfmQ%253D&amp;asb2=7SRz97ceaVijuC6VJD8lujs6mBpJe_s8aQTG3XMySZPH7ZPafGNKqIz-kFNOFnVc&amp;keywords=%D0%BA%D0%B0%D1%80%D1%8C%D0%B5%D1%80%D0%B0+%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80%D0%B0+%D0%BB%D0%B8+%D1%8F%D0%BA%D0%BE%D0%BA%D0%BA%D0%B0&amp;sh=U3koBAAAAA&quot; target=&quot;_blank&quot;&gt;«Карьера менеджера», Ли Якокка (rus).&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;slIu&quot;&gt;&lt;a href=&quot;https://www.ozon.ru/product/deadline-roman-ob-upravlenii-proektami-28315802/?asb=MTVFgT6r58c2NoNQO%252Fx%252B2E4FBlUqtkUwV3vLzZ%252Bbk6w%253D&amp;asb2=IAXw-cPrOSoshNuZtUiE07yG0KGDOGUMCwqfIpjKycV5lZ-FKflMBis62c0W55oN&amp;keywords=%C2%ABDeadline.+%D0%A0%D0%BE%D0%BC%D0%B0%D0%BD+%D0%BE%D0%B1+%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B8+%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0%D0%BC%D0%B8%C2%BB%2C+%D0%A2%D0%BE%D0%BC+%D0%94%D0%B5%D0%9C%D0%B0%D1%80%D0%BA%D0%BE&amp;sh=U3koBAAAAA&quot; target=&quot;_blank&quot;&gt;«Deadline. Роман об управлении проектами», Том ДеМарко (rus).&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;ifmI&quot;&gt;&lt;a href=&quot;https://www.ozon.ru/product/berezhlivoe-proizvodstvo-kak-izbavitsya-ot-poter-i-dobitsya-protsvetaniya-vashey-kompanii-vumek-466357399/?asb=ruGnkyAFIB1VzhQpx3nM6L%252BU6gGJpwyuQJEwSU3ATW0%253D&amp;asb2=2JD72EY-TioEkIsdqrpIYFz8fc0FWbrddfpkj2-fRpiA5j3cr7xWek3URTT3RE7N&amp;keywords=%C2%AB%D0%91%D0%B5%D1%80%D0%B5%D0%B6%D0%BB%D0%B8%D0%B2%D0%BE%D0%B5+%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%3A+%D0%9A%D0%B0%D0%BA+%D0%B8%D0%B7%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%D1%81%D1%8F+%D0%BE%D1%82+%D0%BF%D0%BE%D1%82%D0%B5%D1%80%D1%8C+%D0%B8+%D0%B4%D0%BE%D0%B1%D0%B8%D1%82%D1%8C%D1%81%D1%8F+%D0%BF%D1%80%D0%BE%D1%86%D0%B2%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F+%D0%B2%D0%B0%D1%88%D0%B5%D0%B9+%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8%C2%BB%2C&amp;sh=U3koBAAAAA&quot; target=&quot;_blank&quot;&gt;«Бережливое производство: Как избавиться от потерь и добиться процветания вашей компании», Джеймс Вумек, Дэниел Джонс (rus).&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;BYuO&quot;&gt;&lt;a href=&quot;https://www.ozon.ru/product/startap-nastolnaya-kniga-osnovatelya-dorf-bob-blank-stiv-226982082/?asb=Q47DlyDhwc3cLmA7eVeg%252Bmy9vwdDyrVF803xW%252BZaLbM%253D&amp;asb2=geatgTca_fSl2WAhmYiF-2ARZclHpiObjfyyC1KYp5v84b_uZhFah1u18rdegjTxFldclIz1jlVMxiYRgSK02A&amp;keywords=%C2%AB%D0%A1%D1%82%D0%B0%D1%80%D1%82%D0%B0%D0%BF.+%D0%9D%D0%B0%D1%81%D1%82%D0%BE%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F+%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0+%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%C2%BB%2C+%D0%94%D0%BE%D1%80%D1%84+%D0%91%D0%BE%D0%B1%2C+%D0%91%D0%BB%D0%B0%D0%BD%D0%BA+%D0%A1%D1%82%D0%B8%D0%B2&amp;sh=U3koBAAAAA&quot; target=&quot;_blank&quot;&gt;«Стартап. Настольная книга основателя», Дорф Боб, Бланк Стив (rus).&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;zPGv&quot;&gt;&lt;a href=&quot;https://www.amazon.com/Escaping-Build-Trap-Effective-Management/dp/149197379X/ref=sr_1_1?crid=W228NLF7Y0YY&amp;keywords=%C2%ABEscaping+the+Build+Trap%3A+How+Effective+Product+Management+Creates+Real+Value%C2%BB%2C+Melissa+Perri&amp;qid=1642787823&amp;sprefix=escaping+the+build+trap+how+effective+product+management+creates+real+value+%2C+melissa+perri+%2Caps%2C159&amp;sr=8-1&quot; target=&quot;_blank&quot;&gt;«Escaping the Build Trap: How Effective Product Management Creates Real Value», Melissa Perri (eng).&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;vbZh&quot;&gt;Это те книги, которые можно понять без специального образования, что особенно важно для инженера, у которого, скорее всего, развиты другие зоны мозга и сформирован другой набор стереотипов, чем у человека с дипломом менеджера. Помимо всего этого, конечно, стоит обратить внимание на то, как может быть организован процесс создания программного обеспечения. Я имею в виду методологию Agile, Kanban как его часть, а также модели Waterfall, Microsoft Solutions Framework, Rational Unified Process и т.п. Совершенно не факт, что вы будете использовать их в своей работе, но любые знания меняют ваше мышление, а умение предположить, как еще «может быть», бесспорно, повышает ваш профессионализм.&lt;/p&gt;
  &lt;p id=&quot;crmf&quot;&gt;Также стоит добавить, что понимание, как код вписывается в бизнес, и принятие того, что программирование по большей части все же является прикладной специальностью, а не вещью самой в себе (как математика, например), может существенно снизить уровень стресса. А если вы еще знаете, как работает бизнес, удовольствие от работы увеличится. К тому же, если работодатель увидит, что вы интересуетесь не только кодом, вас начнут вовлекать в обсуждение бизнес-процессов. Это на самом деле может быть увлекательно.&lt;/p&gt;
  &lt;h2 id=&quot;%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B7%D0%BD%D0%B0%D0%BD%D0%B8%D0%B9&quot;&gt;Применение знаний&lt;/h2&gt;
  &lt;p id=&quot;9k8V&quot;&gt;Пытливый читатель спросит: «Ну знаю я все это, и что дальше?». Действительно, понимание того, как работает бизнес, может не поменять ровным счетом ничего в ваших задачах и в отношении к вам работодателя. Если вы активно демонстрируете ваши новые знания, но не получаете никакого положительного отклика, то стоит сменить работу. Поверьте, опытный и адекватный менеджер будет только рад тому, что подчиненные начали интересоваться его работой.&lt;/p&gt;
  &lt;p id=&quot;1Uom&quot;&gt;На собеседовании помимо демонстрации навыков стоит рассказать, что вам важно быть вовлеченным не только в технические, но и бизнес-вопросы. Я именно так и делал, что помогло мне найти несколько отличных компаний. В одной из них я работаю и сейчас, только из простого линейного программиста перешел на позицию Team Lead, где мне потребовалось применять свои менеджерские знания на практике. Вам же вовсе не обязательно переходить на руководящие позиции, вы просто можете продолжить развиваться как инженер. Но теперь вы уже полностью будете осознавать, как ваш код влияет на других людей внутри компании и за ее пределами.&lt;/p&gt;
  &lt;h2 id=&quot;%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4&quot;&gt;Вывод&lt;/h2&gt;
  &lt;p id=&quot;nicb&quot;&gt;Я считаю, что любому программисту нужно иметь представление о том, как устроен бизнес, какими принципами руководствуются менеджеры и какой подход используется для организации программного обеспечения. Понимание этих процессов поможет снизить уровень стресса и повысить производительность. Вместе с тем изучение того, что происходит за пределами технических задач, повысит вашу ценность как специалиста и откроет перед вами новые карьерные возможности.&lt;/p&gt;
  &lt;p id=&quot;ZLvM&quot;&gt;Всем большое спасибо, если вам понравился этот материал, то подписывайтесь на меня здесь и на мои социальные сети.&lt;/p&gt;
  &lt;p id=&quot;9RC1&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;oKSK&quot;&gt;&lt;a href=&quot;https://www.instagram.com/andersdeath/&quot; target=&quot;_blank&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;auP4&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bolshakov:021-front-end-interview-preparation-1</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/021-front-end-interview-preparation-1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Задачи по JavaScript для подготовки к собеседованию. Часть 1.</title><published>2022-01-18T14:36:16.090Z</published><updated>2022-01-18T14:36:16.090Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/4b/da/4bdace2e-a21a-497a-b9b0-64f97e3d9ffd.png"></media:thumbnail><category term="programming" label="Programming"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/13/5b/135b661f-6019-4780-bcd5-c59182376a9d.png&quot;&gt;В этой статье я рассматриваю пять задач, проверяющих знание JavaScript. Каждая их них снабжена объяснением и алгоритмом решения. В конце даны ссылки на документацию.</summary><content type="html">
  &lt;p id=&quot;%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8-%D0%BF%D0%BE-javascript-%D0%B4%D0%BB%D1%8F-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B8-%D0%BA-%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E-%D1%87%D0%B0%D1%81%D1%82%D1%8C-1&quot;&gt;В этой статье я рассматриваю пять задач, проверяющих знание JavaScript. Каждая их них снабжена объяснением и алгоритмом решения. В конце даны ссылки на документацию.&lt;/p&gt;
  &lt;figure id=&quot;iVko&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/13/5b/135b661f-6019-4780-bcd5-c59182376a9d.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2Oah&quot;&gt;Для начала немного о том, почему я решил написать этот материал. Пару лет назад я готовился к очередному интервью по JavaScript и собирал в отдельный репозиторий задания, проверяющие его знание. После получения оффера я благополучно про них забыл, но недавно наткнулся на эту коллекцию, привел примеры в порядок и решил поделиться ими с вами. Так как материала получилось достаточно много, то я решил сделать серию статей. Надеюсь, у меня хватит сил выпустить еще несколько частей, в каждой из которых будет по пять примеров. Буду очень рад, если этот материал поможет кому-то получить работу.&lt;/p&gt;
  &lt;h2 id=&quot;1-%D0%B4%D0%B2%D0%B5-%D1%81%D1%82%D0%B0%D1%80%D0%B5%D0%B9%D1%88%D0%B8%D0%BD%D1%8B&quot;&gt;1. Две старейшины&lt;/h2&gt;
  &lt;p id=&quot;wbOr&quot;&gt;Буду честен, я сам придумал название для этой задачи, суть которой заключается в том, чтобы найти два самых больших по значению числа в массиве.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;ul id=&quot;DZ5l&quot;&gt;
    &lt;li id=&quot;P7dz&quot;&gt;Входящий массив должен состоять только из чисел.&lt;/li&gt;
    &lt;li id=&quot;sokB&quot;&gt;Функция должна вернуть массив с двумя наибольшими по значению числами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/340c8c80905551b6ed79ca826823f5fb.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Пример вызова функции&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;79sB&quot;&gt;Нужно написать функцию, которая принимает массив с числами, сортирует его по возрастанию и возвращает последние два его значения.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;ol id=&quot;C2gy&quot;&gt;
    &lt;li id=&quot;ihd4&quot;&gt;Сортируем массив по возрастанию методом .sort(), указывая в качестве аргумента функцию сравнения.&lt;/li&gt;
    &lt;li id=&quot;uhwx&quot;&gt;Методом .slice() удаляем все значения массива, кроме двух последних.&lt;/li&gt;
    &lt;li id=&quot;twpy&quot;&gt;Возвращаем получившийся массив.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/4315b013a532cb5dc1bccebc28b4487c.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Подробное решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/7cebd15a7312c97b76dfa7a9593a08ea.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Более красивое решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gIAq&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;2-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D1%83%D0%B1%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2-%D1%81%D0%BB%D0%BE%D0%B2&quot;&gt;2. Удаление дубликатов слов&lt;/h2&gt;
  &lt;p id=&quot;BiwR&quot;&gt;Для интервью это типичная задача. Она базируется на поиске уникальных слов в строке и удалении их дубликатов. Ее можно решить несколькими способами, я приведу только один из них.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;ul id=&quot;KhCE&quot;&gt;
    &lt;li id=&quot;0ZQP&quot;&gt;Входящие данные должны быть строкой.&lt;/li&gt;
    &lt;li id=&quot;X66t&quot;&gt;Функция должна вернуть строку, очищенную от дубликатов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/aff8a88843c4e263a10662eae7838d5a.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Пример вызова функции&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;an1g&quot;&gt;Нужно написать функцию, которая обработает входящую строку, определит, какие слова в ней находятся, и вернет очищенную от повторов новую строку.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;ol id=&quot;fJV4&quot;&gt;
    &lt;li id=&quot;Yhln&quot;&gt;Создаем set. Set – коллекция для хранения множества значений, причем каждое значение может встречаться лишь один раз.&lt;/li&gt;
    &lt;li id=&quot;VAU9&quot;&gt;Методом .split(&amp;#x27; &amp;#x27;) с указанным в качестве разделителя пробелом преобразуем строку в массив слов.&lt;/li&gt;
    &lt;li id=&quot;6Lzt&quot;&gt;Методом .forEach проходим по всем элементам массива, добавляя каждый их них в set. Так как коллекция множеств может содержать только уникальные значения, в случае повтора слова оно не будет добавлено.&lt;/li&gt;
    &lt;li id=&quot;HQUG&quot;&gt;При помощи spread-оператора преобразуем set в массив.&lt;/li&gt;
    &lt;li id=&quot;PGos&quot;&gt;Методом .join(&amp;#x27; &amp;#x27;) с указанным в качестве разделителя пробелом преобразуем массив обратно в строку.&lt;/li&gt;
    &lt;li id=&quot;ODtJ&quot;&gt;Возвращаем получившееся значение. &lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/e0ef75c852abadda8f9b254ecb5d64ff.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Подробное решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/4f0b326e002753748346fa1e75c86cf6.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Более красивое решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;3-%D0%B2%D1%8B%D1%87%D0%B8%D1%82%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0-%D0%B8%D0%B7-%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B3%D0%BE&quot;&gt;3. Вычитание одного массива из другого&lt;/h2&gt;
  &lt;p id=&quot;queO&quot;&gt;Эта задача также часто встречается на интервью на роль Junior или Trainee JavaScript-разработчика. Она проверяет, как кандидат понимает фильтрацию данных и умеет работать с ней.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;ul id=&quot;MmBw&quot;&gt;
    &lt;li id=&quot;3frb&quot;&gt;Функция должна принимать два аргумента, каждый из которых представляет собой массив с числами.&lt;/li&gt;
    &lt;li id=&quot;RAno&quot;&gt;Функция должна сравнить элементы массивов, а затем сформировать новый, с уникальными значениями, и вернуть его.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/dc3c2fd8b81da215481c819b1e25571b.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Пример вызова функции&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;GWYT&quot;&gt;Суть алгоритма, заключенного в этой функции, состоит в том, что мы должны перебрать один из двух входящих массивов и проверить, есть ли его значения в другом массиве. Если у него нет совпадений, то записываем число в новый массив, который надо вернуть после прохождения цикла.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;ol id=&quot;5PV8&quot;&gt;
    &lt;li id=&quot;tSB0&quot;&gt;Перебрать элементы первого массива методом .filter(), передав в качестве аргумента функцию, определяющую правила фильтрации.&lt;/li&gt;
    &lt;li id=&quot;K51V&quot;&gt;В функции фильтрации проверить, есть ли копия элемента массива во втором массиве при помощи метода .includes().&lt;/li&gt;
    &lt;li id=&quot;UY1S&quot;&gt;Если совпадения нет, то функция фильтрации должна возвращать true.&lt;/li&gt;
    &lt;li id=&quot;eHvY&quot;&gt;Метод .filter() создает новый массив с элементами, удовлетворяющими условиям. Соответственно, у нас образуется массив с уникальными элементами, его мы и вернем как результат &lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/f8c847e3aed85dc31df67416b2dc52a3.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Подробное решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/4592ec2aaf14523e661c785213bd909c.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Более красивое решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;4-%D0%BF%D0%BE%D0%B4%D1%81%D1%87%D0%B5%D1%82-%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0-%D0%B3%D0%BB%D0%B0%D1%81%D0%BD%D1%8B%D1%85-%D0%B2-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5&quot;&gt;4. Подсчет количества гласных в строке&lt;/h2&gt;
  &lt;p id=&quot;yp0g&quot;&gt;Эта задача также проверяет способность работать с фильтрацией и строками, уровень сложности также примерно на уровне Junior или Trainee JavaScript-разработчика.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;ul id=&quot;hTsj&quot;&gt;
    &lt;li id=&quot;zP2F&quot;&gt;Функция должна принимать в качестве аргумента строку, состоящую из символов латиницы.&lt;/li&gt;
    &lt;li id=&quot;IBa8&quot;&gt;Учитываться должны все гласные вне зависимости от регистра.&lt;/li&gt;
    &lt;li id=&quot;xma8&quot;&gt;На выходе функции должно получаться число.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/5e915da70ad7dc2457291c7cef06e1c2.js&quot;&gt;&lt;/script&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;AQgi&quot;&gt;Суть алгоритма – в том, чтобы привести исходную строку в нижний регистр, преобразовать ее в массив символов, отфильтровать все гласные и вернуть их количество.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;ol id=&quot;npeJ&quot;&gt;
    &lt;li id=&quot;ri6r&quot;&gt;Создать массив test, содержащий все гласные латинского алфавита, он нам понадобится для фильтрации.&lt;/li&gt;
    &lt;li id=&quot;v9wB&quot;&gt;При помощи метода .toLowerCase() преобразовать исходную строку в нижний регистр.&lt;/li&gt;
    &lt;li id=&quot;jZ69&quot;&gt;Методом .split(&amp;#x27;&amp;#x27;) преобразовать исходную строку в массив.&lt;/li&gt;
    &lt;li id=&quot;B1K9&quot;&gt;Методом .filter() отфильтровать гласные буквы, для этого передать ему в качестве аргумента функцию фильтрации.&lt;/li&gt;
    &lt;li id=&quot;bcTP&quot;&gt;В функции фильтрации методом .includes() проверить, совпадает ли символ преобразованной в массив строки с каким-либо значением из массива test.&lt;/li&gt;
    &lt;li id=&quot;usqm&quot;&gt;Если есть совпадение, значит, символ является гласной буквой и нужно вернуть true.&lt;/li&gt;
    &lt;li id=&quot;fwc7&quot;&gt;После фильтрации массива нужно посчитать, какое количество символов осталось. Это можно сделать, вызвав свойство массива .length.&lt;/li&gt;
    &lt;li id=&quot;g07w&quot;&gt;То число, которое получилось, мы и возвращаем в качестве результата. &lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/e9d3d5710da54d408c84328041be2e7d.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Подробное решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/86e7ca53394d148d3c33111a3e6d0bb0.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Более красивое решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;5-%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC&quot;&gt;5. Палиндром&lt;/h2&gt;
  &lt;p id=&quot;frsT&quot;&gt;Палиндром – это слово, предложение или последовательность символов, абсолютно одинаково читающееся в обоих направлениях – слева направо и справа налево. Примером может послужить слово «radar».&lt;/p&gt;
  &lt;p id=&quot;PqEe&quot;&gt;Задача состоит в том, чтобы написать функцию, проверяющую, является ли строка палиндромом или нет. Это классическое для собеседований испытание, особенно на роль Junior или Trainee программиста.&lt;/p&gt;
  &lt;h3 id=&quot;%D0%BE%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F&quot;&gt;Обязательные условия&lt;/h3&gt;
  &lt;ul id=&quot;hUpa&quot;&gt;
    &lt;li id=&quot;kWDr&quot;&gt;Если строка – палиндром, функция возвращает true.&lt;/li&gt;
    &lt;li id=&quot;aZa9&quot;&gt;Если строка палиндромом не является, функция возвращает false.&lt;/li&gt;
    &lt;li id=&quot;6Mx6&quot;&gt;Нужно учитывать пробелы и знаки препинания.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/181fa21cc0c22e8fc5772691a01aeab8.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Пример вызова&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B8%D0%B4%D0%B5%D1%8F&quot;&gt;Основная идея&lt;/h3&gt;
  &lt;p id=&quot;8NFB&quot;&gt;Нужно написать функцию, которая перевернет строку в обратном направлении и проверит ее на идентичность с исходной строкой.&lt;/p&gt;
  &lt;h3 id=&quot;%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;Решение&lt;/h3&gt;
  &lt;ol id=&quot;13x2&quot;&gt;
    &lt;li id=&quot;8nyp&quot;&gt;Преобразовываем символы исходной строки в нижний регистр. Это даст нам гарантию, что сравниваться будет именно значение символа. Как известно, в программировании регистр имеет значение. Символ в верхнем регистре не равен себе же в нижнем.&lt;/li&gt;
    &lt;li id=&quot;TZMa&quot;&gt;Делаем реверс строки, он проходит в несколько шагов:&lt;/li&gt;
    &lt;ol id=&quot;SjXb&quot;&gt;
      &lt;li id=&quot;LrPh&quot;&gt;У строк в JS нет метода .reverse(), но он есть у массивов, поэтому мы преобразовываем исходную строку в массив методом .split().&lt;/li&gt;
      &lt;li id=&quot;s4k0&quot;&gt;Применяем к получившемуся массиву метод .reverse().&lt;/li&gt;
      &lt;li id=&quot;lwrg&quot;&gt;«Собираем» массив обратно в строку методом .join().&lt;/li&gt;
    &lt;/ol&gt;
    &lt;li id=&quot;B2BC&quot;&gt;Сравниваем получившуюся строку с исходной, после чего возвращаем true или false.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/dc13a4228a63ce7aa1485320bf15bca2.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Подробное решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure&gt;
    &lt;script src=&quot;https://gist.github.com/AndersDeath/a5dbcf70f1c4a8f0b2fc3dc2cda15ae9.js&quot;&gt;&lt;/script&gt;
    &lt;figcaption&gt;Более красивое решение&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA-%D0%BB%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D1%8B&quot;&gt;Список литературы&lt;/h2&gt;
  &lt;p id=&quot;B3Bk&quot;&gt;Возможно, вы обратили внимание, что задачи достаточно однотипны, и это действительно так. В этой заметке я представил испытания, проверяющие в основном навыки работы с массивами и строками. По сути, вне зависимости от условий задачи мы пользовались примерно одним и тем же набором методов, что закрепляет их понимание. Тем ни менее я крайне рекомендую ознакомиться с документацией. Больше информации вы можете найти по этим ссылкам:&lt;/p&gt;
  &lt;ol id=&quot;gFoD&quot;&gt;
    &lt;li id=&quot;ep4E&quot;&gt;&lt;a href=&quot;https://learn.javascript.ru/array-methods&quot; target=&quot;_blank&quot;&gt;Методы для работы с массивами в JavaScript&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;aVIS&quot;&gt;&lt;a href=&quot;https://learn.javascript.ru/string&quot; target=&quot;_blank&quot;&gt;Методы для работы со строками в JavaScript&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;dUB8&quot;&gt;&lt;a href=&quot;https://learn.javascript.ru/map-set&quot; target=&quot;_blank&quot;&gt;Структуры данных Map и Set в JavaScript&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;g7ke&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot; target=&quot;_blank&quot;&gt;Spread оператор в JavaScript&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;%D0%BD%D0%B0%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%BA&quot;&gt;Напоследок&lt;/h2&gt;
  &lt;p id=&quot;fJPx&quot;&gt;Если вам понравилась статья и вы хотите больше подобного контента, то ставьте лайки и подписывайтесь на мой блог и социальные сети. Буду рад подискутировать в комментариях! Всем спасибо!&lt;/p&gt;
  &lt;p id=&quot;9RC1&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;oKSK&quot;&gt;&lt;a href=&quot;https://www.instagram.com/andersdeath/&quot; target=&quot;_blank&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;auP4&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bolshakov:019-shell-for-study-1</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/019-shell-for-study-1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Shell for Study - оболочка для образовательного контента</title><published>2022-01-12T16:27:50.447Z</published><updated>2022-01-12T16:27:50.447Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/e3/83/e383a33c-0ba4-45c4-a467-090c27cb3f19.png"></media:thumbnail><category term="programming" label="Programming"></category><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/9a/bd/9abdf3cd-913b-4819-b86e-d2e0fc56e0c1.png&quot;&gt;Недавно я начал разрабатывать очередной pet-проект под названием Shell for Study. Изначальной целью было создать статическое Angular-приложение со списками слов для заучивания, вспомнить некоторые библиотеки, с которыми я сейчас не работаю, да и просто пописать код для удовольствия. Но в какой-то момент я увлекся и вышел за рамки простого словаря, начав разрабатывать полноценную базу знаний. В этой заметке я расскажу, что я хотел сделать, что у меня уже получилось и как я планирую развивать проект дальше.</summary><content type="html">
  &lt;p id=&quot;shell-for-study---%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B0-%D0%B4%D0%BB%D1%8F-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82%D0%B0&quot;&gt;Недавно я начал разрабатывать очередной pet-проект под названием &lt;strong&gt;&lt;a href=&quot;https://andersdeath.github.io/shell-for-study/&quot; target=&quot;_blank&quot;&gt;Shell for Study&lt;/a&gt;&lt;/strong&gt;. Изначальной целью было создать статическое Angular-приложение со списками слов для заучивания, вспомнить некоторые библиотеки, с которыми я сейчас не работаю, да и просто пописать код для удовольствия. Но в какой-то момент я увлекся и вышел за рамки простого словаря, начав разрабатывать полноценную базу знаний. В этой заметке я расскажу, что я хотел сделать, что у меня уже получилось и как я планирую развивать проект дальше.&lt;/p&gt;
  &lt;figure id=&quot;LVkw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9a/bd/9abdf3cd-913b-4819-b86e-d2e0fc56e0c1.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D0%B8%D0%B7%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D1%86%D0%B5%D0%BB%D1%8C&quot;&gt;Изначальная цель&lt;/h2&gt;
  &lt;p id=&quot;nxvO&quot;&gt;С самого начала я планировал сделать Angular-приложение, которое бы просто показывало список английских слов в виде таблицы и карточек. Для создания UI я решил использовать библиотеку Angular Material, так как она содержит все необходимые компоненты и в ней легко настраивать палитру цветов. Важным требованием также была возможность запускать приложение без доступа к интернету. Разработчики фреймворка Angular уже обо всем позаботились, поэтому я просто добавил поддержку ServiceWorker. Как следствие, появилась возможность «установить» приложение на смартфон. Иконки для программы я нарисовал в Figma, это заняло минут 15, не больше.&lt;/p&gt;
  &lt;p id=&quot;VzTI&quot;&gt;Для стандартизации данных я создал иерархическую структуру словаря, включающую разделы, подразделы и списки. Каждое слово или запись имеет заголовок, а также перевод на русский и определение на английском. Эта структура данных дает возможность добавлять не только слова, но и более сложные конструкции: крылатые фразы, устойчивые выражения и т.д.&lt;/p&gt;
  &lt;figure id=&quot;naQA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3f/d3/3fd39354-1993-4c20-98f7-b51681b0942e.png&quot; width=&quot;2880&quot; /&gt;
    &lt;figcaption&gt;Сначала был только словарь&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D1%80%D0%B0%D0%B7%D0%B2%D0%B8%D1%82%D0%B8%D0%B5-%D0%B8%D0%B4%D0%B5%D0%B8&quot;&gt;Развитие идеи&lt;/h2&gt;
  &lt;p id=&quot;W75K&quot;&gt;Дальше я начал двигаться в сторону информации, не касающейся изучения иностранных языков, и, помимо словаря «слово–значение», добавил еще один – «глоссарий». В качестве примера я записал в него различные определения из мира IT, например «ООП» и «функциональное программирование». В этот момент мне понадобилась поддержка html-разметки: заголовков, списков, ссылок в словарных записях, т.д. Сначала я подумал, что стоит добавить поддержку тегов, но это небезопасно – нужно прогонять записи через модуль Sanitizer. Другой минус – html-разметка в строках сделает записи достаточно громоздкими. Немного подумав, я решил использовать привычный markdown-синтаксис и парсить строки библиотекой ngx-markdown. Получилось достаточно элегантное и легко модифицируемое решение, не нагруженное лишней логикой&lt;/p&gt;
  &lt;p id=&quot;rGou&quot;&gt;Параллельно с этим я думал о том, как можно представить данные на экране, и пришел к пяти вариантам:&lt;/p&gt;
  &lt;ol id=&quot;X6rw&quot;&gt;
    &lt;li id=&quot;ewXA&quot;&gt;Таблица.&lt;/li&gt;
    &lt;li id=&quot;2awI&quot;&gt;Список карточек.&lt;/li&gt;
    &lt;li id=&quot;ymxW&quot;&gt;Одна карточка на экране, которая по свайпу или нажатию кнопки переключается на следующую.&lt;/li&gt;
    &lt;li id=&quot;FcWw&quot;&gt;Флеш карточка - показывается только слово, но по нажатию кнопки можно увидеть значение.&lt;/li&gt;
    &lt;li id=&quot;XV30&quot;&gt;В виде статей - для глоссария, чтобы было удобно читать большие объемы текста.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;c9Wt&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1e/55/1e559c9f-44b5-42e8-a299-ad5fe4df5e03.png&quot; width=&quot;2880&quot; /&gt;
    &lt;figcaption&gt;Словари создаются динамически из подготовленных данных&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F-free-dictionary-api-%D0%B8-%D1%83%D0%BF%D1%80%D0%B0%D0%B6%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-spell-checking&quot;&gt;Интерграция Free Dictionary API и упражнение Spell Сhecking&lt;/h2&gt;
  &lt;p id=&quot;uwdQ&quot;&gt;Моя преподавательница английского языка посоветовала мне обратить внимание на упражнение Spell Checking. Суть его заключается в том, что ученик должен прослушать слово, напечатать его в поле и проверить правильность. Я поискал в интернете существующие реализации, но ни одна из них меня не устроила, поэтому я решил сделать свою.&lt;/p&gt;
  &lt;figure id=&quot;CgnK&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/56/af/56af7734-d517-4757-8800-41951eddf68b.png&quot; width=&quot;2880&quot; /&gt;
    &lt;figcaption&gt;Упражнение Spell Checking&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;NKGr&quot;&gt;Для этого мне нужно было найти какой-то бесплатный словарь с api, чтобы без проблем интегрироваться с ним. При этом нужно было, чтобы он содержал аудио с произношением слов. Мой выбор пал на Free Dictionary Api, который вполне соответствует моим нуждам. В нем содержится не такая большая база слов, как, например, в Oxford Learner&amp;#x27;s Dictionaries или Merriam-Webster, но это компенсируется легкостью интеграции. Перед реализацией логики для упражнения Spell Checking я написал UI для Free Dictionary. Там можно набрать в поисковую строку слово и получить его значения, синонимы, антонимы, примеры употребления и произношения. На основе получившейся интеграции я и реализовал упражнение.&lt;/p&gt;
  &lt;figure id=&quot;oPto&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b3/af/b3af2294-faa9-402e-8d5d-6ddbe391c402.png&quot; width=&quot;2880&quot; /&gt;
    &lt;figcaption&gt;Инеграция с Free Dictionary API&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D1%87%D1%82%D0%BE-%D0%B2-%D0%B8%D1%82%D0%BE%D0%B3%D0%B5&quot;&gt;Что в итоге&lt;/h2&gt;
  &lt;p id=&quot;3zK6&quot;&gt;Сейчас проект&lt;strong&gt; &lt;a href=&quot;https://andersdeath.github.io/shell-for-study/&quot; target=&quot;_blank&quot;&gt;Shell for Study&lt;/a&gt;&lt;/strong&gt; находится в процессе разработки. Он по-прежнему представляет собой статическое Angular-приложение, но уже понятно, что нужно писать для него сервер. Кодовая база также далека от совершенства, так как я сам не знал, что хочу получить, и действовал стихийно. Про unit-тесты даже не стоит говорить: их нет.&lt;/p&gt;
  &lt;p id=&quot;HhXF&quot;&gt;Несмотря на отсутствие четкого планирования и сумбурность, мне удалось реализовать неплохого помощника в изучении и повторении информации. Сегодня у Shell for Study есть:&lt;/p&gt;
  &lt;ol id=&quot;lICQ&quot;&gt;
    &lt;li id=&quot;j9Dm&quot;&gt;Возможность установки на смартфон или в браузер для работы оффлайн.&lt;/li&gt;
    &lt;li id=&quot;KDv3&quot;&gt;Пять представлений для информации.&lt;/li&gt;
    &lt;li id=&quot;0WyH&quot;&gt;Поддержку стилизации записей.&lt;/li&gt;
    &lt;li id=&quot;DNVV&quot;&gt;Интеграцию с внешним Free Dictionary Api.&lt;/li&gt;
    &lt;li id=&quot;SkP3&quot;&gt;Упражнение Spell checking.&lt;/li&gt;
    &lt;li id=&quot;W5VU&quot;&gt;Поддержку подсветки исходного кода в записях.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;MeAy&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e1/1c/e11c71ef-525b-4121-b277-945f537adc28.png&quot; width=&quot;2880&quot; /&gt;
    &lt;figcaption&gt;Получилось сделать словарь для повторения вопросов по JavaScript&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;%D0%BF%D0%BB%D0%B0%D0%BD%D1%8B-%D0%BF%D0%BE-%D1%80%D0%B0%D0%B7%D0%B2%D0%B8%D1%82%D0%B8%D1%8E&quot;&gt;Планы по развитию&lt;/h2&gt;
  &lt;p id=&quot;jPM8&quot;&gt;Так как проект &lt;strong&gt;&lt;a href=&quot;https://andersdeath.github.io/shell-for-study/&quot; target=&quot;_blank&quot;&gt;Shell for Study&lt;/a&gt;&lt;/strong&gt; побочный и я занимаюсь им в свободное время, планы постоянно меняются. Ключевая проблема – в том, что это всего лишь статическое Angular-приложение. А это значит, что кроме меня им полноценно пользоваться никто не может: нельзя авторизоваться, создать свои словари, поделиться ими и т.д. Поэтому первым делом я хочу реализовать сервер с базой данных и исправить эти недостатки. Тогда проектом сможет пользоваться кто угодно, плюс возможно будет организовать сбор обратной связи.&lt;/p&gt;
  &lt;p id=&quot;srsg&quot;&gt;Вторая проблема – отсутствие явного фокуса проекта как продукта. Это можно исправить только путем сбора данных. На это у меня вряд ли будет время, поэтому, скорее всего, Shell for Study будет развиваться нестабильно и, как следствие, я не смогу доставлять обновления по расписанию.&lt;/p&gt;
  &lt;p id=&quot;nvar&quot;&gt;В конце я бы хотел обратиться ко всем, кто хочет узнать больше о Shell for Study и, возможно, поучаствовать в его развитии. Если у вас есть желание, то заходите в &lt;a href=&quot;https://t.me/shell_for_study_chat&quot; target=&quot;_blank&quot;&gt;этот телеграм-чат&lt;/a&gt;, там можно будет пообщаться. Если вам просто понравилась эта статья и вы хотите следить за обновлениями, то подписывайтесь на мои социальные сети. Всем спасибо!&lt;/p&gt;
  &lt;p id=&quot;hWMC&quot;&gt;&lt;strong&gt;&lt;a href=&quot;https://andersdeath.github.io/shell-for-study/&quot; target=&quot;_blank&quot;&gt;Перейти на Shell for Study&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;9RC1&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;oKSK&quot;&gt;&lt;a href=&quot;https://www.instagram.com/andersdeath/&quot; target=&quot;_blank&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;auP4&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bolshakov:018-georgia-1</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/018-georgia-1?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Первые впечатления о Грузии</title><published>2022-01-07T03:58:22.484Z</published><updated>2022-01-07T03:58:22.484Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/56/68/566842c7-8e76-43a3-9bcf-4af730c37b81.jpeg"></media:thumbnail><category term="puteshestviya-travel" label="Путешествия / Travel"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/76/75/7675bf27-64f5-4910-8dc6-f5f9bc192c42.jpeg&quot;&gt;Всем привет!</summary><content type="html">
  &lt;p id=&quot;%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B5-%D0%B2%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BE-%D0%B3%D1%80%D1%83%D0%B7%D0%B8%D0%B8&quot;&gt;Всем привет!&lt;/p&gt;
  &lt;p id=&quot;G4da&quot;&gt;Этот 2022 год и январские выходные я решил провести в Грузии. В основном я нахожусь в Тбилиси, но также выезжал в Гори и сейчас нахожусь в Степанцминде. В этой заметке я решил поделиться своими первыми впечатлениями об этой стране.&lt;/p&gt;
  &lt;figure id=&quot;KhWE&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/76/75/7675bf27-64f5-4910-8dc6-f5f9bc192c42.jpeg&quot; width=&quot;3024&quot; /&gt;
    &lt;figcaption&gt;Тифлис&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;11TS&quot;&gt;Перед тем как начать, стоит упомянуть, что я никогда не был в Грузии, и все мои знания об этой стране почерпнуты из кинематографа, анекдотов и стереотипов. Кое-что из них подтвердилось, другое оказалось мифом.&lt;/p&gt;
  &lt;p id=&quot;CLIR&quot;&gt;Первая и наиболее бросающаяся в глаза вещь — повсеместно висят флаги Евросоюза. Уже не первый год Грузия стремится стать его частью. И в Тбилиси и в Гори я видел здания Европейской комиссии. Среди местных жителей весьма высок уровень владения русским языком, но в туристической зоне можно спокойно общаться на английском.&lt;/p&gt;
  &lt;p id=&quot;9iWr&quot;&gt;Грузинская кухня именно такая, какой мы её себе представляем: хинкали, харчо, шашлыки, кебабы, хачапури. При этом порции в ресторанах довольно большие, и каждого блюда может хватить на двоих. Цены на еду впечатляют, по моим подсчетам они соизмеримы с московскими.&lt;/p&gt;
  &lt;p id=&quot;Ixiy&quot;&gt;В Тбилиси неплохо развит общественный транспорт: метро, автобусы, канатные дороги стоят очень дешево. Метро стоит 0.50 Лар, канатная дорога 1-2 Лар. Я купил единую для всех видов проездную карточку, закинул денег и пользовался ею на двоих с женой. Здесь нет правила о том, что один проездной на одного человека. Кстати, в городе есть рельсовый фуникулер до одноименного ресторана, проезд стоит 8 Лар, и проездной на него нужно покупать отдельно. Помимо этого в Тбилиси очень дешевое такси. От ж/д вокзала до центра я доехал бизнесом за 8 Лар. Правда машина была &amp;quot;глазастым&amp;quot; мерседесом 20-летней давности.&lt;/p&gt;
  &lt;p id=&quot;SeDC&quot;&gt;Так как мне было неизвестно о доступности общественного транспорта, я арендовал машину на все время пребывания в Грузии. Существует стереотип о том, что на Кавказе автомобилисты ведут себя отвратительно на дороге. Так вот, это правда. Граждане не смотрят по сторонам, перестраиваются вслепую, подрезают, не пользуются поворотниками, не соблюдают разметку. Благо что видят светофоры. Кстати, парковка в Тбилиси платная. Нужно иметь это в виду. В стоимость машины входила оплата парковки всех зон, кроме помеченной буквой &amp;quot;A&amp;quot;. На ней 1 час = 1 Лар. Платить можно с терминала на улице или через мобильное приложение.&lt;/p&gt;
  &lt;p id=&quot;HcCs&quot;&gt;Грузины оказались дружелюбными и отзывчивыми людьми. У меня были некоторые опасения по поводу отношения к жителям России из-за напряжённых отношений между правительствами наших стран, но по прибытию они развеялись. Чуть позже я напишу более подробный разбор этой поездки. В нем я расскажу более детально про цены, как снимать жилье, арендовать авто, пересекать границу и т.д. Не могу сказать, когда он выйдет, так как завтра я еду в Армению, нужно закончить кое-какие дела.&lt;/p&gt;
  &lt;p id=&quot;FP3y&quot;&gt;Всем спасибо за внимание, подписывайтесь за мои социальные сети, буду раз каждому подписчику!&lt;/p&gt;
  &lt;p id=&quot;9RC1&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;oKSK&quot;&gt;&lt;a href=&quot;https://www.instagram.com/andersdeath/&quot; target=&quot;_blank&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;auP4&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bolshakov:016-why-i-selected-angular</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/016-why-i-selected-angular?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Почему я выбрал Angular и не собираюсь от него отказываться</title><published>2022-01-04T07:16:57.837Z</published><updated>2022-01-04T07:16:57.837Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c9/d5/c9d50466-7402-4489-88a6-8cc7c30b9885.png"></media:thumbnail><category term="programming" label="Programming"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/8a/f9/8af9c5f7-f745-4141-a0be-46c941d533c2.png&quot;&gt;Всем привет!</summary><content type="html">
  &lt;p id=&quot;Hfw9&quot;&gt;Всем привет!&lt;/p&gt;
  &lt;p id=&quot;PIrW&quot;&gt;Выдалось несколько свободных дней, и я решил немного порассуждать на очень субъективную тему. А конкретно – почему я выбрал фреймворк Angular, а не, например, React или Vuejs. На самом деле, изначально не было планов работать именно с ним. Но так получилось, что меня занесло на проект, в котором активно используется его предшественник Angular.js. Я искренне возненавидел эту поделку.&lt;/p&gt;
  &lt;figure id=&quot;3LMB&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8a/f9/8af9c5f7-f745-4141-a0be-46c941d533c2.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4Vpf&quot;&gt;Я понимаю, что этот фреймворк, по сути, первый успешный продукт такого типа и в нем было допущено большое количество ошибок. Ведь многие практики еще не существовали и не было известно, что хорошо работает, а что нет. Также он был написан на старом стандарте JavaScript ES5. Это превращало исходный код в нечитаемый бред. Другим минусом было неочевидное поведение, помноженное на трудности отладки кода. Библиотека React от Facebook в то время только появилась и была достаточно сырой и трудной в использовании. Vuejs тогда даже не был в проекте.&lt;/p&gt;
  &lt;p id=&quot;BTJj&quot;&gt;Интересный факт: развитие Angular.js однажды зашло в тупик и его создатели приступили к разработке фреймворка нового поколения, который назвали просто Angular (без js). И действительно, JavaScript там не было, так как в качестве языка разработки выступал его диалект – TypeScript. В фирме, где я работал, мы начали постепенно мигрировать на beta-версию нового фреймворка. И даже написали некий прототип, судьба которого мне неизвестна, потому что я покинул эту фирму. То было темное время: так сильно я не выгорал никогда. Но статья не об этом. Используя полученные знания, я устроился в &amp;quot;кровавый энтерпрайз&amp;quot; – компанию &amp;quot;ТехноНИКОЛЬ&amp;quot;, где участвовал в разработке логистической системы.&lt;/p&gt;
  &lt;p id=&quot;baI8&quot;&gt;Там я получил отличный опыт разработки и ощутил мощь Angular. Методика написания приложения четко обозначена. В нем есть все необходимые модули типа HttpClientModule, а также большая база плагинов, написанных сообществом. Также можно делить логику на компоненты и сервисы. В связи со всем этим разработка представляет собой сборку приложения из готовых блоков, но с написанием чрезвычайно важной, нетривиальной логики. Например, мне запомнилось внедрение API Yandex.Карт – сервиса, помогающего отслеживать грузы на карте. Еще важный момент: в основе интерфейса лежит библиотека UI-компонентов Angular Material – при помощи нее можно реализовать Material Design от Google. Благодаря этим факторам я был сконцентрирован на реализации бизнес-логики и работал при этом над несколькими интересными задачами. Всю рутину уже выполнили создатели Angular.&lt;/p&gt;
  &lt;p id=&quot;fR2x&quot;&gt;Отдельный заслуживающий внимания момент – TypeScript. Этот диалект JavaScript может использовать типизацию. То есть заранее определять структуры данных, которых ожидает функция, метод, класс и т.д. Конечно, можно обойтись и без неё, тем более что она &amp;quot;ненастоящая&amp;quot;: типы работают условно, и после компиляции мы получаем обычный JS. Но тогда разработка действительно больших приложений превратится в ад. Благодаря предопределенным структурам ты всегда знаешь, что ожидать от своего кода, и это прекрасно. Помимо этого, типизация делает программу более безопасной, что критично для enterprise-разработки. Ну и некоторые &amp;quot;фишки&amp;quot;, которые есть в TypeScript, например декораторы и дженерики, сделали возможным появление Angular. На них завязаны все ключевые возможности фреймворка: компоненты, модули, сервисы, пайпы и т. д.&lt;/p&gt;
  &lt;p id=&quot;jybe&quot;&gt;Кроме того, в логистическом проекте &amp;quot;ТехноНИКОЛЬ&amp;quot; я впервые использовал GraphQL – технологию от Facebook, созданную для удобного обмена данными между сервером и клиентом. Этот подход мне показался весьма интересным. Не знаю, как он реализовывался на back-end, но на front-end все было просто. По своей сути, эта технология представляет собой псевдоязык, на котором разработчики могут описывать в запросах, какие конкретно данные нужно получить с сервера. Он поддерживает вложенность и достаточно гибок. После разработки логистической системы я никогда его не использовал. Но впечатления остались весьма приятные, хотелось бы поработать с GraphQL снова.&lt;/p&gt;
  &lt;p id=&quot;So2x&quot;&gt;Вернусь к Angular и сравню его с современными версиями React. Как я уже упомянул, разрабатывать проекты с первой из них стало значительно проще. Через пару лет использования Angular я начал осваивать современные версии React (которые с хуками). И хотя сейчас более популярна библиотека от Facebook, могу точно сказать, что создавать большие проекты на ней сложнее. Да, порог входа в React ниже, но при этом простые приложения, которые делают новички, можно реализовывать и без него. Сложные же проекты требуют особого внимания к архитектуре, проектированию, планированию и т.д. Не существует какого-то общего подхода к созданию front-end приложений на React, чего нельзя сказать об Angular.&lt;/p&gt;
  &lt;p id=&quot;4lJg&quot;&gt;Опытные программисты скажут: &amp;quot;Владимир, ты просто ленивый и не хочешь писать много кода&amp;quot;. И я отвечу: &amp;quot;Да, так и есть&amp;quot;. Я разделяю программирование на создание красивого кода и на реализацию бизнес-целей. В последние годы мне интереснее второе, что не мешает иногда программировать на чистом JavaScript или TypeScript и получать море удовольствия от алгоритмов, абстракций, какого-то изобретательства. Ну а если мне просто хочется пошевелить шестеренками в голове, я расчехляю пыльный проект на Haskell и продолжаю постигать этот невероятно интересный язык программирования.&lt;/p&gt;
  &lt;p id=&quot;fXDn&quot;&gt;Давайте подытожим, почему Angular – это самый крутой инструмент для написания front-end приложений. Его плюсы – это:&lt;/p&gt;
  &lt;ol id=&quot;aDeV&quot;&gt;
    &lt;li id=&quot;4ewY&quot;&gt;Большое комьюнити и, как следствие, большая база плагинов.&lt;/li&gt;
    &lt;li id=&quot;bdxV&quot;&gt;Множество UI-библиотек для сборки интерфейсов.&lt;/li&gt;
    &lt;li id=&quot;FAPZ&quot;&gt;Огромное количество статей с лучшими практиками (best practices).&lt;/li&gt;
    &lt;li id=&quot;C1VB&quot;&gt;Постоянное обновление и добавление нового функционала.&lt;/li&gt;
    &lt;li id=&quot;4cEH&quot;&gt;Поддержка со стороны Google.&lt;/li&gt;
    &lt;li id=&quot;MzDx&quot;&gt;Возможность сконцентрироваться на бизнес-логике благодаря базовому функционалу &amp;quot;из коробки&amp;quot;.&lt;/li&gt;
    &lt;li id=&quot;TudZ&quot;&gt;Он написан на TypeScript – значит, есть типизация.&lt;/li&gt;
    &lt;li id=&quot;ft0o&quot;&gt;Легко поддается тестированию и отладке.&lt;/li&gt;
    &lt;li id=&quot;fveK&quot;&gt;Его любят большие компании, и поэтому он фигурирует во многих вакансиях.&lt;/li&gt;
    &lt;li id=&quot;pqgI&quot;&gt;Менее популярен, чем React – следовательно, меньше специалистов на рынке и выше зарплаты.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;A1gD&quot;&gt;Если вы считаете иначе, то давайте обсудим это в комментариях. Также подписывайтесь на мои социальные сети! Всем спасибо и пока!&lt;/p&gt;
  &lt;p id=&quot;9RC1&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;oKSK&quot;&gt;&lt;a href=&quot;https://www.instagram.com/andersdeath/&quot; target=&quot;_blank&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;auP4&quot;&gt;&lt;a href=&quot;https://t.me/vnbolshakov&quot; target=&quot;_blank&quot;&gt;Telegram&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>bolshakov:017-results-2021</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/017-results-2021?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Итоги года 2021</title><published>2021-12-30T15:03:24.817Z</published><updated>2021-12-30T15:03:24.817Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/48/4b/484b96d5-b866-4183-8c8e-b85a2c67ef86.jpeg"></media:thumbnail><category term="o-sebe" label="О себе"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/e6/30/e630fa7b-0197-4d7d-8dab-8db9fa00e0cb.jpeg&quot;&gt;В конце каждого года я подвожу его итоги, и этот, 2021, не исключение. Для меня он вышел достаточно удачным, несмотря на продолжающуюся пандемию и невозможность из-за нее осуществить некоторые идеи. Например, поехать в Европу или США. Но я не теряю надежд и делаю определенные шаги для устранения барьеров, хоть это и стоит дополнительных денег. Но об этом подробнее чуть позже. </summary><content type="html">
  &lt;p id=&quot;Ak7B&quot;&gt;В конце каждого года я подвожу его итоги, и этот, 2021, не исключение. Для меня он вышел достаточно удачным, несмотря на продолжающуюся пандемию и невозможность из-за нее осуществить некоторые идеи. Например, поехать в Европу или США. Но я не теряю надежд и делаю определенные шаги для устранения барьеров, хоть это и стоит дополнительных денег. Но об этом подробнее чуть позже. &lt;/p&gt;
  &lt;figure id=&quot;GYbR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e6/30/e630fa7b-0197-4d7d-8dab-8db9fa00e0cb.jpeg&quot; width=&quot;3024&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ak0T&quot;&gt;Итак, итоги года Владимира Большакова.&lt;/p&gt;
  &lt;ol id=&quot;hRRR&quot;&gt;
    &lt;li id=&quot;4BJG&quot;&gt;&lt;strong&gt;Перешел с должности линейного программиста на позицию team leader.&lt;/strong&gt; Еще в 2020 году я устроился работать в берлинский стартап DrSmile и спустя некоторое время получил возможность заняться менеджментом. Скажу честно, мне нравится. Продолжаю развиваться в этом направлении. Управление людьми, выстраивание процессов, проектирование — все это очень увлекательно. Я стал сильно лучше понимать людей. Это очень круто!&lt;/li&gt;
    &lt;li id=&quot;pKdG&quot;&gt;&lt;strong&gt;У меня было 12 перелетов&lt;/strong&gt;. 2021 я встретил в Стамбуле, 2022 встречаю в Тбилиси. &lt;em&gt;Итого я посетил Турцию (дважды), ОАЭ, Армению, Грузию и Сейшельские острова в этом году&lt;/em&gt;. При этом я не считаю поездок по России. Почему я считаю путешествия достижением? Во-первых, это стало сложнее и дороже делать в условиях пандемии, а во-вторых (и что более важно) — я всегда стремился к этому, для меня перемещение между странами, наблюдение за другими культурами является топливом, которое дает силы заниматься всем остальным. К тому же, это всегда встряска для мозга, немного меняющая мышление. Это всегда полезно.&lt;/li&gt;
    &lt;li id=&quot;eL28&quot;&gt;&lt;strong&gt;Заговорил на английском языке&lt;/strong&gt; и начал готовиться к IELTS. Все в моем окружении знают, как сложно он мне дается. Только благодаря поддержке близких, упорству и работе в берлинском стартапе я заговорил. Я даже не могу передать словами те бездны полезной информации, которую я почерпнул из иностранных источников. Всем нужно срочно учить языки. Они являются невероятными инструментами для улучшения себя.&lt;/li&gt;
    &lt;li id=&quot;eIpA&quot;&gt;&lt;strong&gt;Впервые в жизни я начал более-менее постоянно публиковать статьи и заметки.&lt;/strong&gt; Пока это все происходит в &amp;quot;демо&amp;quot; режиме. Я пробую, анализирую результат того, что получается. Со следующего года я начну заниматься этим более серьезно. Тем более у меня есть отличные люди в окружении, которые мне помогут.&lt;/li&gt;
    &lt;li id=&quot;QYEs&quot;&gt;&lt;strong&gt;Поучаствовал в открытии невероятного издания Валим!медиа.&lt;/strong&gt; Оно посвящено эмиграции в целом и взгляде на то, почему люди уезжают, как живут за рубежом и так далее. Пока я участвую там как IT-консультант, дальше посмотрим. Уже сейчас видны отличные перспективы для этого проекта. Тем более что его делает часть команды лучшего в России издания об искусстве МОСТ, который я также консультирую.&lt;/li&gt;
    &lt;li id=&quot;BQuI&quot;&gt;&lt;strong&gt;Привился Спутником и сделал первый укол AstraZeneka. &lt;/strong&gt;Ради второй вакцины пришлось ехать в Армению. Зато уже в январе я получу полноценный международный сертификат вакцинации и смогу поехать в Европу на отдых или по работе. Нет времени ждать, пока пандемия закончится. Вполне вероятно, что мы с ней будем жить еще много лет.&lt;/li&gt;
    &lt;li id=&quot;18V0&quot;&gt;&lt;strong&gt;В августе я женился,&lt;/strong&gt; при этом в январе будет 7 лет, как мы вместе. Все же перемещаться по миру и вообще планировать какие-то дела проще, когда есть официально оформленные отношения. Кстати, любимый человек, который тебя поддерживает, один из ключевых факторов для достижения любых других целей. Без неё я бы давным давно сошел с ума от всей той нагрузки, дел и прочей рутины.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Yr3b&quot;&gt;Я не стал высасывать из пальца такие вещи, как покупки, какие-то оздоровительные процедуры, фитнес и так далее. Но хочу сказать о том, что не получилось. Не вышло поступить в вуз, не хватило времени на подготовку, так как пришлось сменить приоритет в деятельности. Также я отказался от обучения на капитанские права. В условиях пандемии возможность поехать на Средиземное море и сдать экзамены казалась очень туманной. Не стал копить на машину. Если поначалу эта идея казалась мне привлекательной, то уже к середине года я понял, что это просто добавит мне проблем, типа обслуживания, ремонта, потом продажи. Я просто перенаправил средства на другие дела.&lt;/p&gt;
  &lt;p id=&quot;pPgh&quot;&gt;Вышло не так много, как хотелось бы, но я очень доволен 2021 годом. Надеюсь, 2022 будет еще лучше. Вам, дорогие друзья, я также желаю всего наилучшего в Новом году, здоровья, сил и чтобы все, о чем вы мечтаете, сбылось!&lt;/p&gt;
  &lt;p id=&quot;8dcm&quot;&gt;С новым годом!&lt;/p&gt;

</content></entry><entry><id>bolshakov:013-frontend-chapter-2</id><link rel="alternate" type="text/html" href="https://teletype.in/@bolshakov/013-frontend-chapter-2?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=bolshakov"></link><title>Как бесплатно стать front-end-разработчиком при помощи freecodecamp.org (Часть 2)</title><published>2021-12-28T13:22:49.092Z</published><updated>2021-12-28T13:22:49.092Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/e1/d5/e1d57afa-61e4-49a5-bb42-c86ce31596fa.png"></media:thumbnail><category term="programming" label="Programming"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/69/10/69108417-4e95-4ebb-9f94-bf80ba17a6aa.png&quot;&gt;Всем привет!</summary><content type="html">
  &lt;p id=&quot;85li&quot;&gt;Всем привет!&lt;/p&gt;
  &lt;p id=&quot;aygU&quot;&gt;В этом материале я продолжу рассказ о том, как освоить профессию front-end-разработчика, используя бесплатную обучающую платформу freecodecamp.org. Это вторая часть статьи на эту тему. Первую вы можете прочитать &lt;a href=&quot;https://bolshakov.vladimir.ru/013-frontend-chapter-1&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;/p&gt;
  &lt;figure id=&quot;WZRI&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/69/10/69108417-4e95-4ebb-9f94-bf80ba17a6aa.png&quot; width=&quot;1200&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Im6z&quot;&gt;Напомню, что freecodecamp.org – это некоммерческая организация, которая предоставляет интерактивные курсы по программированию. Они рассортированы по разделам. В данной серии статей идет речь о четырех курсах, посвященных теме front-end-программирования:&lt;/p&gt;
  &lt;ol id=&quot;qiol&quot;&gt;
    &lt;li id=&quot;iVDN&quot;&gt;&lt;strong&gt;Адаптивный веб-дизайн, по-простому - верстка (&lt;a href=&quot;https://www.freecodecamp.org/learn/responsive-web-design/&quot; target=&quot;_blank&quot;&gt;Responsive Web Design Certification&lt;/a&gt;)&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;eeIM&quot;&gt;&lt;strong&gt;JavaScript алгоритмы и структуры данных (&lt;a href=&quot;https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/&quot; target=&quot;_blank&quot;&gt;JavaScript Algorithms and Data Structures Certification&lt;/a&gt;)&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;EXih&quot;&gt;&lt;strong&gt;Библиотеки для front-end разработки (&lt;a href=&quot;https://www.freecodecamp.org/learn/front-end-development-libraries/&quot; target=&quot;_blank&quot;&gt;Front End Development Libraries Certification&lt;/a&gt;)&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;z22W&quot;&gt;&lt;strong&gt;Визуализация данных (&lt;a href=&quot;https://www.freecodecamp.org/learn/data-visualization/&quot; target=&quot;_blank&quot;&gt;Data Visualization Certification&lt;/a&gt;)&lt;/strong&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;8eNK&quot;&gt;Первые два раздела я рассмотрел в первой части. Теперь приступаю к оставшимся.&lt;/p&gt;
  &lt;h2 id=&quot;%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8-%D0%B4%D0%BB%D1%8F-front-end-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8&quot;&gt;Библиотеки для front-end разработки&lt;/h2&gt;
  &lt;p id=&quot;vZtb&quot;&gt;К этому разделу стоит перейти, уже когда вы уверенно себя чувствуете при работе с HTML, CSS и JavaScript. Его курсы учат пользоваться инструментами и библиотеками, помогающими реализовывать полноценные одностраничные front-end-приложения. А еще – организовывать сложную адаптивную верстку с множественной вложенностью стилей.&lt;/p&gt;
  &lt;p id=&quot;Kppz&quot;&gt;Первый курс в этом разделе посвящен библиотеке &lt;strong&gt;Bootstrap&lt;/strong&gt;, которая упрощает верстку. Она содержит таблицы цветов, утилиты для работы с адаптивностью и прочие полезные вещи. Это одна из самых популярных библиотек для верстки. Очень рекомендую ее.&lt;/p&gt;
  &lt;p id=&quot;WCYe&quot;&gt;Для JavaScript написано множество библиотек, расширяющих возможности создания нового функционала или упрощающих этот процесс. Большую часть из них уже никто не использует, чего нельзя сказать о &lt;strong&gt;jQuery&lt;/strong&gt;. Эта библиотека выходит из моды, но существует огромное количество написанных с ее помощью сайтов. Тоже рекомендую ее: вы будете не раз сталкиваться с ней на практике.&lt;/p&gt;
  &lt;p id=&quot;rIUX&quot;&gt;&lt;strong&gt;SASS&lt;/strong&gt; – препроцессор стилей. По сути, это диалект CSS, который расширяет его возможности и может быть скомпилирован в чистый CSS. SASS также стоит изучить. Конечно, можно обойтись и без него, но на первом же сложном проекте вы столкнетесь с этим препроцессором или его аналогами.&lt;/p&gt;
  &lt;p id=&quot;slhD&quot;&gt;Последние пять-десять лет front-end-приложения стали настолько сложными, что понадобилось придумать что-то облегчающее разработку и поддержку кода. Freecodecamp.org предлагает интерактивный &lt;strong&gt;курс по React&lt;/strong&gt; – самой популярной библиотеке для создания сложных фронтендов. Освоив ее, вы станете существенно востребованнее на рынке труда. Знание React – обязательно, хоть и требует времени и усердия.&lt;/p&gt;
  &lt;p id=&quot;qhv0&quot;&gt;Почти любое сложное front-end-приложение состоит из нескольких компонентов. Они передают друг другу данные. В сложных проектах есть проблема с хранением данных и поддержанием их актуальности – иначе это можно назвать единым состоянием приложения. Его можно обеспечить при помощи &lt;strong&gt;библиотеки Redux&lt;/strong&gt;, но я не буду вдаваться в подробности. Этот курс небольшой и очень важный: без него вы не сможете закончить следующий.&lt;/p&gt;
  &lt;p id=&quot;JE2V&quot;&gt;Уроки по&lt;strong&gt; React и Redux &lt;/strong&gt;посвящены тому, как интегрировать между собой эти две библиотеки. Если вы прошли предыдущие два курса, то этот обязателен для вас.&lt;/p&gt;
  &lt;p id=&quot;YgN9&quot;&gt;Последние два раздела содержат проекты, которые необходимо выполнить для получения сертификата и заявку на него.&lt;/p&gt;
  &lt;h2 id=&quot;%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&quot;&gt;Визуализация данных&lt;/h2&gt;
  &lt;p id=&quot;WYjU&quot;&gt;Этот раздел я считаю необязательным. Вы сможете изучить его позже, когда понадобится визуализировать какие-то данные. Под визуализацией здесь понимается построение графиков различных типов при помощи&lt;strong&gt; библиотеки D3&lt;/strong&gt;. Собственно, первый курс раздела посвящен именно этому. Вы узнаете, как строить линейные графики, круговые диаграммы, добавлять динамические шкалы и многое другое.&lt;/p&gt;
  &lt;p id=&quot;t7B4&quot;&gt;Мне не очень понятно, почему&lt;strong&gt; курс JSON APIs и AJAX &lt;/strong&gt;помещен именно в этот раздел, но это не особо важно. Здесь вы научитесь получать данные по сети при помощи JavaScript и внедрять их в свою верстку. Крайне полезный курс. В любом случае вам придется это освоить: иначе не сможете работать front-end-программистом..&lt;/p&gt;
  &lt;h2 id=&quot;%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4&quot;&gt;Вывод&lt;/h2&gt;
  &lt;p id=&quot;oWTd&quot;&gt;Эти курсы увеличат ваши шансы найти и выполнить фриланс-контракты. Также вы cможете претендовать на роль Junior front-end-девелопера и пойти в коммерческую разработку.&lt;/p&gt;
  &lt;p id=&quot;pfqX&quot;&gt;Кстати, на freecodecamp.org есть&lt;strong&gt; &lt;a href=&quot;https://www.freecodecamp.org/learn/coding-interview-prep/&quot; target=&quot;_blank&quot;&gt;целый раздел&lt;/a&gt;&lt;/strong&gt;, посвященный подготовке к интервью. Он содержит очень неплохую коллекцию задач по алгоритмам. Выполнив их, вы гораздо легче пройдете собеседование. Сейчас, когда много людей хочет приобщиться к IT-индустрии, роль front-end-разработчика представляется одной из самых простых для освоения. Только программирование на Python может конкурировать с ней в этом вопросе. Тем более что с помощью упомянутых выше курсов вы освоите фундаментальные темы, которые относятся вообще к любой специализации и языку программирования.&lt;/p&gt;
  &lt;p id=&quot;QE1z&quot;&gt;&lt;em&gt;&lt;strong&gt;Если вам понравилась моя статья, подписывайтесь и оставляйте комментарии, буду рад любой обратной связи! Всем спасибо!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

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