<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Планы обучения</title>
    <description>Подробные планы обучения по разным языкам программирования и технологиям.</description>
    <link>https://tproger.ru/curriculum</link>
    <atom:link href="https://tproger.ru/curriculum/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 24 Oct 2026 12:26:29 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Планы обучения</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Как стать экспертом в Data Science: пошаговый план обучения</title>
      <link>https://tproger.ru/curriculum/data-science-expert-plan</link>
      <comments>https://tproger.ru/curriculum/data-science-expert-plan?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Туренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/data-science-expert-plan</guid>
      <description><![CDATA[<p>Смотрим на последние тренды в Data Science и раскладываем по полочкам этапы обучения: от выбора языка и библиотек до машинного обучения и нейронных сетей.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/data-science-expert-plan">Как стать экспертом в Data Science: пошаговый план обучения</a>»</p>]]></description>
      <category><![CDATA[Партнёрский материал]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 27 Jun 2019 10:34:40 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мало кто может предсказывать события до ста процентов верно. Но дата-сайнтисты научились. А мы нашли последние тренды Data Science и составили план для тех, кто хочет глубоко изучить эту область.</p><h2>Выбор языка</h2><p>Сейчас в науке о данных используются два основных языка: Python и R. Язык R применяется для сложных финансовых анализов и научных исследований, потому его глубокое изучение можно отложить на потом.</p><p>На начальном этапе можно остановиться на изучении основ:</p><ul><li>нюансы работы RStudio;</li><li>библиотеки Rcmdr, rattle и Deducer;</li><li>типы данных контейнеров, векторы и первичные типы данных;</li><li>factors, структуры и матрицы.</li></ul><p>Быстро разобраться в теории языка R поможет сайт <a href="https://www.statmethods.net/">Quick-R</a>.</p><p>Python популярен больше: на нём проще научиться писать код и для него написано множество пакетов визуализации данных, машинного обучения, обработки естественного языка и сложного анализа данных.</p><p>Что важно освоить в Python:</p><ul><li>функции, классы, объекты;</li><li>структуры данных;</li><li>базовые алгоритмы и библиотеки;</li><li>качественную отладку и тестирование кода;</li><li>Jupyter Notebook;</li><li>Git.</li></ul><p>Чтобы освоить базовые понятия Python, у вас уйдёт примерно 4-6 недель при условии, что вы будете тратить на изучение 2-3 часа в день.</p><h2>Библиотеки для Python</h2><h3>NumPy</h3><p>NumPy — библиотека научных вычислений. От неё зависит почти каждый пакет Python для Data Science или Machine Learning: SciPy (Scientific Python), Matplotlib, Scikit-learn.</p><p>NumPy помогает выполнять математические и логические операции: например, в ней содержатся полезные функции для n-массивов и матриц. А ещё библиотека поддерживает многомерные массивы и высокоуровневые математические функции для работы с ними.</p><p>Зачем нужно знать математику? Почему компьютер не может сам всё посчитать?</p><p>Часто методы машинного обучения используют матрицы для хранения и обработки входных данных. Матрицы, векторные пространства и линейные уравнения — всё это линейная алгебра.</p><p>Чтобы понимать, как работают методы машинного обучения, нужно хорошо знать математику. Поэтому будет лучше пройти весь курс алгебры целиком: самостоятельно или с наставниками.</p><p>Кроме того, математика и математический анализ важны для оптимизации процессов. Зная их, проще улучшать быстроту и точность работы моделей машинного обучения.</p><p>Что важно освоить:</p><ul><li>основу линейной алгебры: линейные комбинации, зависимость и независимость, векторные точки и векторное произведение, матричные преобразования, матричное умножение,</li><li>обратные функции;</li><li>массивы;</li><li>обработку математических выражений и статических данных;<br />визуализации через Matplotlib, Seaborn или Plotly.</li></ul><p>Где можно подтянуть знания по NumPy: <a href="https://www.numpy.org/devdocs/user/quickstart.html">официальная документация</a>.</p><p>Где можно подтянуть знания по алгебре: <a href="https://ocw.mit.edu/ans7870/resources/Strang/Edited/Calculus/Calculus.pdf">Calculus (глава 11)</a>.</p><h3>Pandas</h3><p>Pandas — библиотека с открытым исходным кодом, построенная на NumPy. Она позволяет выполнять быстрый анализ, очистку и подготовку данных. Такой своеобразный Excel для Python.<br />Библиотека хорошо умеет работать с данными из разных источников: листов Excel, файлов CSV, SQL, веб-страниц.</p><p>Что важно освоить:</p><ul><li>чтение и запись множества различных форматов данных;</li><li>выбор подмножеств данных;</li><li>поиск и заполнение недостающих данных;</li><li>применение операций к независимым группам в данных;</li><li>преобразование данных в разные формы;</li><li>объединение нескольких наборов данных вместе;</li><li>расширенную функциональность временных рядов.</li></ul><p>Где можно подтянуть знания по Pandas: <a href="https://pandas.pydata.org/pandas-docs/stable/getting_started/tutorials.html">Pydata</a>.</p><h2>Базы данных и сбор информации</h2><p>Если вы уже знакомы с Python, Pandas и NumPy, можете приступать к изучению работы с базами данных и парсингу информации.</p><h3>SQL</h3><p>Несмотря на то, что <a href="https://ru.wikipedia.org/wiki/NoSQL">NoSQL</a> и <a href="https://ru.wikipedia.org/wiki/Hadoop">Hadoop</a> уже пустили корни в науку о данных, важно уметь писать и выполнять сложные запросы на SQL.</p><p>Часто необработанные данные — от электронных медицинских карт до истории транзакций клиентов — находятся в организованных коллекциях таблиц, которые называются реляционными базами данных. Чтобы быть хорошим специалистом по данным, нужно знать, как обрабатывать и извлекать данные из этих баз данных.</p><p>Нужно научиться:</p><ul><li>добавлять, удалять и извлекать данные из баз данных;</li><li>выполнять аналитические функции и преобразовывать структуры баз данных;</li><li>PostgreSQL;</li><li>MySQL;</li><li>SQL Server.</li></ul><h3>Парсинг информации</h3><p>Важно:</p><ul><li>уметь использовать методы find и find_all в парсинге страниц с помощью <a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc/">Beautiful Soup</a>;</li><li>понять, как работает перебор элементов и сохранение переменных в Python;</li><li>работать с get-запросами и взаимодействовать с API.</li></ul><h2>Алгоритмы</h2><p>Быть программистом без знания алгоритмов страшно, а Data Scientist’ом — опасно. Так что если вы уже освоили Python, Pandas, NumPy, SQL и API, пора учиться применять эти технологии для исследований.</p><p>Скорость работы хорошего специалиста часто зависит от трёх факторов: от поставленного вопроса, объёма данных и выбранного алгоритма.</p><p>Потому на этом этапе важно понять алгоритмы и структуры данных Беллмана-Форда, Дейкстры, двоичного поиска (и двоичные деревья как инструмент), поиска в глубину и ширину.</p><p>Подтянуть знания поможет Tproger (<a href="https://tproger.ru/tag/algorithms/">алгоритмы</a>, <a href="https://tproger.ru/tag/algos-and-data-structs/">структуры данных</a>).</p><h2>Машинное обучение и нейронные сети</h2><p>Пора применять полученные навыки к решению реальных задач. До этого этапа важно знать математику: поиск, очистку и подготовку данных, построение моделей с точки зрения математики и статистики, их оптимизацию средствами матанализа — вот это всё.</p><p>Реальные задачи чаще всего решаются с помощью серьёзных библиотек вроде <a href="https://www.tensorflow.org/">TensorFlow</a> и <a href="https://keras.io/">Keras</a>.</p><p>Нужно освоить:</p><ul><li>предобработку данных,</li><li>линейную и логистическую регрессию,</li><li>кластеризацию и обучение без учителей,</li><li>анализ временных рядов,</li><li>деревья принятия решений,</li><li>рекомендательные системы.</li></ul><h2>Заключение</h2><p>Стать экспертом в Data Science непросто: приходится изучать множество инструментов и быть гибким, чтобы вовремя узнавать о трендах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Data Engineer: учебное пособие для прохождения собеседования</title>
      <link>https://tproger.ru/curriculum/data-engineer-interview-guide</link>
      <comments>https://tproger.ru/curriculum/data-engineer-interview-guide?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Туренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/data-engineer-interview-guide</guid>
      <description><![CDATA[<p>Детальный план обучения профессии инженера данных: задачи разного уровня сложности, видеоуроки, курсы и чек-лист для отслеживания прогресса подготовки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/data-engineer-interview-guide">Data Engineer: учебное пособие для прохождения собеседования</a>»</p>]]></description>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 07 Jun 2019 09:43:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собеседование на любую техническую должность, как правило, требует подготовки и занимает немало времени. И не всегда понятно, что нужно конкретно изучать инженеру данных. Некоторые позиции требуют Hadoop, другие — SQL, а третьи — понимания статистики.</p><p>В материале собрано много ресурсов для подготовки, благодаря которым можно пройти собеседования в крупных технологических компаниях.</p><p>Вы также можете использовать <a href="https://docs.google.com/spreadsheets/d/1GOO4s1NcxCR8a44F0XnsErz5rYDxNbHAHznu4pJMRkw/edit#gid=0">чек-лист</a>, который поможет отслеживать прогресс и ничего не забыть.</p><h2>SQL</h2><p>Почти неизбежно, что вам, как инженеру данных, зададут вопросы по SQL.</p><p>Типичные вопросы:</p><ul><li>объединение с фильтрацией;</li><li>последовательные объединения;</li><li>формирование подзапросов.</li></ul><h3>Базовые задачи на знание SQL</h3><p>Эти первые несколько проблем помогут вам на разных концепциях понять, какой у вас уровень.</p><h4>Комплексные запросы</h4><p><a href="https://leetcode.com/problems/human-traffic-of-stadium/">Задача</a>: В городе X построен новый стадион. Каждый день его посещает много людей, и статистика сохраняется в виде следующих столбцов: id, дата посещения, количество людей.</p><p>Напишите запрос, чтобы отобразить записи, которые имеют 3 или более последовательных строк и количество человек более 100 (включительно).</p><p><a href="https://leetcode.com/problems/department-top-three-salaries/">Задача</a>: В таблице находится список сотрудников.</p><figure><img src="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-1.jpg" alt="" /></figure><p>У каждого сотрудника есть идентификатор, а также столбец для идентификатора отдела. Напишите SQL-запрос, чтобы найти сотрудников, которые получают три самые высокие зарплаты в каждом отделе.</p><p>Дополнительно: Таблица содержит все отделы компании:</p><figure><img src="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-2.jpg" alt="" /></figure><p>Для приведённых выше таблиц ваш запрос SQL должен возвращать следующие строки (порядок строк не имеет значения).</p><figure><img src="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-3.jpg" alt="" /></figure><p><a href="https://leetcode.com/problems/rising-temperature/">Задача</a>: Для заданной таблицы напишите SQL-запрос, чтобы найти идентификаторы всех дат с более высокой температурой по сравнению с предыдущими датами.</p><figure><img src="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-4.jpg" alt="" /></figure><p>Например, верните следующие идентификаторы для приведённой выше таблицы:</p><figure><img src="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-5.jpg" alt="" /></figure><h4>Aggregation</h4><p><a href="https://leetcode.com/problems/trips-and-users/">Задача</a>: таблица Trips содержит все поездки такси. Каждая поездка имеет уникальный идентификатор, в то время как Client_Id и Driver_Id являются внешними ключами для Users Id в таблицеUsers. Статус является типом ENUM («завершено», «отменено водителем», «отменено клиентом»).</p><p>Напишите SQL запрос, чтобы найти число отменённых заявок среди незаблокированных пользователей с 1 по 3 октября 2013 года.</p><h4>Расширенные объединения (Advanced Join)</h4><p><a href="https://leetcode.com/problems/exchange-seats/">Задача</a>: Мэри — учитель в средней школе, и у неё есть таблица seat, в которой записаны имена учеников с их соответствующими местами.</p><p>Столбец ID является неизменным. Мэри хочет поменять местами соседствующих студентов.</p><p>Можете ли вы написать запрос SQL для вывода результата Мэри?</p><h4>Простые объединения (Simple Joins)</h4><p><a href="https://www.hackerrank.com/challenges/the-report/problem">Задача</a>: Кетти даёт Еве задание создать отчёт, содержащий три столбца: Имя, Оценка и Отметка. Кетти не нужны имена тех учеников, которые получили оценку ниже 8. Отчёт должен быть составлен в порядке убывания по классам — более высокие оценки вводятся первыми. Если у двух и более учеников одинаковые оценки (8–10), упорядочите их по алфавиту. Наконец, если оценка ниже 8, используйте «NULL» в качестве имени и перечислите их по оценкам в порядке убывания. Если у двух и более учеников одинаковые оценки (1–7), упорядочите учеников по их оценкам в порядке возрастания.</p><p>Напишите запрос, чтобы помочь Еве.</p><h4>Ранжирование количества строк и аналитические функции</h4><p><a href="https://leetcode.com/problems/nth-highest-salary/">Задача</a>: написать запрос SQL, чтобы получить n-ую самую высокую зарплату из таблицы Employee:</p><figure><img src="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-6.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-7.jpg" alt="" /></figure><h4>Сложные запросы Self Join</h4><p><a href="https://www.hackerrank.com/challenges/symmetric-pairs/problem">Задача</a>: Приведена таблица, содержащая два столбца: X и Y.</p><p>Две пары (X 1 , Y 1) и (X 2 , Y 2) называются симметричными парами, если X 1 = Y 2 и X 2 = Y 1.</p><p>Напишите запрос для вывода всех таких симметричных пар в порядке возрастания величины X.</p><h3>Дополнительно</h3><p>Если вам нужно больше задач SQL:</p><ul><li><a href="https://www.hackerrank.com/challenges/occupations/problem">Задача о профессиях</a>;</li><li><a href="https://www.hackerrank.com/challenges/harry-potter-and-wands/problem">Задача об инвентаре Олливандера</a>;</li><li><a href="https://www.hackerrank.com/challenges/placements/problem">Задача о местах размещения</a>.</li></ul><p>Вы также можете посмотреть обучающие видео (на английском языке):</p><ul><li><a href="https://www.youtube.com/watch?time_continue=3&amp;v=uAWWhEA57bE">6 частых вопросов по SQL запросам на собеседовании</a>;</li><li><a href="https://www.youtube.com/watch?v=QFj-hZi8MKk">Изучение ROW_NUMBER и аналитических функций</a>;</li><li><a href="https://www.youtube.com/watch?v=G3kYPzLWtpo&amp;t=4s">Усовершенствованная реализация аналитических функций по расчёту промежуточного итога</a>;</li><li><a href="https://www.youtube.com/watch?v=XecU6Ieyu-4&amp;t=54s">Расширенная реализация аналитических функций Median</a>;</li><li><a href="https://www.youtube.com/watch?v=2-1XQHAgDsM&amp;list=PL6EDEB03D20332309">Написание основных запросов. SQL Server</a>.</li></ul><h3>Решение SQL задач после просмотра обучающих видео</h3><p>Как только вы закончите смотреть видео по SQL, посмотрите задачи ниже. Если остались пробелы, запишите темы, в которых вы ещё слабы, и больше работайте над ними.</p><ul><li><a href="https://www.hackerrank.com/challenges/binary-search-tree-1/problem">Структуры данных: бинарные деревья</a>;</li><li><a href="https://leetcode.com/problems/big-countries/">Большие страны</a>;</li><li><a href="https://leetcode.com/problems/exchange-seats/">Обмен мест</a>;</li><li><a href="https://www.hackerrank.com/challenges/weather-observation-station-18/problem">Станция наблюдения за погодой 18</a>;</li><li><a href="https://www.hackerrank.com/challenges/challenges/problem">Задача по кодированию</a>;</li><li><a href="https://www.hackerrank.com/challenges/print-prime-numbers/problem">Вывод простых чисел</a>;</li><li><a href="https://data36.com/sql-interview-questions-tech-screening-data-analysts/">Вопросы по SQL при собеседовании: 3 упражнения для технического интервью</a>.</li></ul><h3>Базы данных, ETL и хранилища данных</h3><figure><img src="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-8.jpg" alt="" /></figure><p>Чтобы разобраться с вопросами по проектированию баз данных, ETL и хранилищ данных, посмотрите несколько видеороликов. А также рассмотрите несколько концепций баз данных, которые вы могли бы попробовать разработать самостоятельно.</p><p>Видео:</p><ul><li><a href="https://www.youtube.com/watch?v=I_rxqSJAj6U">Проектирование традиционной реляционной базы данных</a>;</li><li><a href="https://www.youtube.com/watch?v=--OJpdPeH80">Проектирование хранилища данных</a>;</li><li><a href="https://www.youtube.com/watch?v=sLhInuwdwcc">Рекомендации по SQL – Разработка ETL</a>.</li></ul><h3>Самостоятельная практика и возникающие проблемы</h3><p>Перечислим несколько бизнес-систем, которые вы можете попытаться разработать. Сначала рекомендуется создать реляционную базу данных, а затем подумать о том, как бы вы разработали ETL и DW, которые полагаются на неё:</p><ul><li>Приложение для знакомств;</li><li>Прокат велосипедов;</li><li>Приложения Music Streaming;</li><li>Сайта поиска работы;</li><li>Веб-сайта Udemy.</li></ul><p>Эти несколько вариантов помогут вам получить более чёткое представление о том, что вы можете практиковать в моделировании и проектировании. Прежде чем начинать, подумайте о том, как пользователи взаимодействуют с этими приложениями.</p><h2>Задачи по программированию</h2><p>Инженеры данных обычно используют несколько языков, и Python среди них наиболее распространённый. Если требуется много работать с Hadoop, то хорошо подойдёт Java, а если вы работаете в Windows, то также Powershell.</p><p>Обычно вопросы бывают двух типов: прикладные и по алгоритмам и структурам данных.</p><h3>Алгоритмы и структуры данных</h3><p>Задачи перед подготовкой:</p><ul><li><a href="https://leetcode.com/problems/sum-of-even-numbers-after-queries/">Сумма чётных чисел после выполнения запросов</a>;</li><li><a href="https://leetcode.com/problems/robot-return-to-origin/">Возвращение робота в исходную точку</a>;</li><li><a href="https://leetcode.com/problems/n-repeated-element-in-size-2n-array/">N-повторный элемент в массиве размера 2N</a>;</li><li><a href="https://leetcode.com/problems/balanced-binary-tree/">Сбалансированное бинарное дерево</a>;</li><li><a href="https://leetcode.com/problems/longest-substring-without-repeating-characters/">Самая длинная подстрока без повторяющихся символов</a>;</li><li><a href="https://leetcode.com/problems/remove-nth-node-from-end-of-list/">Удалить N-й узел из конца списка</a>;</li><li><a href="https://leetcode.com/problems/merge-k-sorted-lists/">Объединение k отсортированных списков</a>;</li><li><a href="https://leetcode.com/problems/next-permutation/">Следующая перестановка (next_permutation)</a>.</li></ul><p>Теперь, когда вы решили эти задачи, давайте начнём рассмотрение других концепций по следующим видео.</p><h4>Структуры данных</h4><ul><li><a href="https://www.youtube.com/watch?v=bum_19loj9A">Структуры данных и алгоритмы – Что такое структуры данных?</a></li><li><a href="https://www.youtube.com/watch?v=njTh_OwMljA&amp;feature=youtu.be">Структуры данных: связные списки</a>.</li><li><a href="https://www.youtube.com/watch?v=oSWTXtMglKE&amp;feature=youtu.be">Структуры данных: деревья</a>.</li><li><a href="https://www.youtube.com/watch?v=t0Cq6tVNRBA&amp;feature=youtu.be">Структуры данных: кучи</a>.</li><li><a href="https://www.youtube.com/watch?v=shs0KM3wKv8&amp;feature=youtu.be">Структуры данных: хеш-таблицы</a>.</li><li><a href="https://www.youtube.com/watch?v=wjI1WNcIntg&amp;feature=youtu.be">Структуры данных: стеки и очереди</a>.</li><li><a href="https://www.youtube.com/watch?v=DuDz6B4cqVc&amp;feature=youtu.be">Структуры данных: ускоренный курс по информатике</a>.</li><li><a href="https://www.youtube.com/watch?v=zIjfhVPRZCg">Структуры данных: Trie</a>.</li></ul><h4>Big O</h4><p><a href="https://www.youtube.com/watch?v=D6xkbGLQesk">Введение в анализ сложности алгоритмов</a></p><p>Ещё варианты прохождения интервью:</p><ul><li><a href="https://www.youtube.com/watch?v=5o-kdjv7FD0">Вопрос на собеседовании Amazon Coding – проблема рекурсивной лестницы</a>;</li><li><a href="https://www.youtube.com/watch?v=7HgsS8bRvjo">Google Coding Interview — проблема универсального дерева значений</a>;</li><li><a href="https://www.youtube.com/watch?v=GJdiM-muYqc">Google Coding Interview: первый повторяющийся символ</a>.</li></ul><h4>Задачи после изучения</h4><p>Как только вы закончили с видео, попробуйте свои силы в решении задач. Следите за тем, насколько уверенно вы себя чувствовали, работая над ними.</p><ul><li><a href="https://www.hackerrank.com/challenges/bigger-is-greater/problem">Bigger Is Greater (largeIsGreater)</a>;</li><li><a href="https://leetcode.com/problems/zigzag-conversion/">Преобразование зигзага. (ZigZag Conversion)</a>;</li><li><a href="https://leetcode.com/problems/reverse-integer/">Реверсирование цифр целого числа</a>;</li><li><a href="https://leetcode.com/problems/combination-sum-ii/">Combination Sum II</a>;</li><li><a href="https://leetcode.com/problems/multiply-strings/">Умножение строк</a>;</li><li><a href="https://www.hackerrank.com/challenges/larrys-array/problem">Массив Ларри</a>;</li><li><a href="https://www.hackerrank.com/challenges/short-palindrome/problem">Короткий палиндром</a>;</li><li><a href="https://leetcode.com/problems/valid-number/">Валидное число</a>.</li></ul><p>Если вы всё ещё чувствуете, что нуждаетесь в помощи, подумайте о прохождении курса по алгоритмам и структурам данных.</p><h3>Задачи оперативного программирования</h3><p>Будет полезно знать, как использовать массивы и словари. Вот некоторые задачи, которые отлично подходят для подготовки.</p><ul><li><a href="https://www.hackerrank.com/challenges/kangaroo/problem">Задача с кенгуру</a>;<br /><a href="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-10.jpg"></a></li><li><a href="https://www.hackerrank.com/challenges/breaking-best-and-worst-records/problem">Побить рекорды</a>;</li><li><a href="https://www.hackerrank.com/challenges/find-a-string/problem">Найти строку</a>;</li><li><a href="https://www.hackerrank.com/challenges/itertools-permutations/problem">itertools.permutations ()</a>;</li><li><a href="https://www.hackerrank.com/challenges/no-idea/problem">Без понятия!</a></li><li><a href="https://www.hackerrank.com/challenges/day-of-the-programmer/problem">День программиста</a>;</li><li><a href="https://www.hackerrank.com/challenges/climbing-the-leaderboard/problem">Таблица лидеров</a>;</li><li><a href="https://www.hackerrank.com/challenges/word-order/problem">Порядок слов</a>;</li><li><a href="https://www.hackerrank.com/challenges/sherlock-and-squares/problem">Шерлок Холмс и Квадраты чисел</a>;</li><li><a href="https://www.hackerrank.com/challenges/equality-in-a-array/problem">Выровнять массив</a> (функция equalize Array);</li><li><a href="https://www.hackerrank.com/challenges/apple-and-orange/problem">Яблоки и апельсины</a>;</li><li><a href="https://tproger.ru/tag/python/">Python. Больше практики.</a></li></ul><figure><img src="https://media.tproger.ru/uploads/2019/06/DS-dev-pic-11.jpg" alt="" /></figure><h2>Проектирование систем</h2><p>Вопросы по проектированию систем встречаются не так часто. Тем не менее, лучше быть к ним готовым.</p><p>Потратив некоторое время на просмотр видео, вы будете готовы ко всему, что интервьюер может попросить вас сделать:</p><ul><li><a href="https://www.youtube.com/watch?v=fMZMm_0ZhK4">Крошечный URL</a>;</li><li><a href="https://www.youtube.com/watch?v=DSGsa0pu8-k&amp;feature=youtu.be">Проектирование автостоянки</a>;</li><li><a href="https://www.youtube.com/watch?v=vvhC64hQZMk">Whats App</a>;</li><li><a href="https://www.youtube.com/watch?v=umWABit-wbk&amp;feature=youtu.be">Uber design</a>;</li><li><a href="https://www.youtube.com/watch?v=QmX2NPkJTKg">Instagram</a>;</li><li><a href="https://www.youtube.com/watch?v=xQnIN9bW0og">Tinder</a>.</li></ul><h2>Курсы</h2><p>Если вы разобрали все задачи и посмотрели видеоролики, но по-прежнему не чувствуете уверенности, подумайте о прохождении курсов. Они, скорее всего, будут охватывать те же понятия, что и видео, однако полезно услышать одну и ту же информацию из нескольких источников.</p><p>Англоязычные курсы на Udemy:</p><ul><li>Bootcamp «Интервью программиста»: алгоритмы + структуры данных.</li><li>Концепции хранилища данных: от базовых до расширенных.</li><li>Структуры данных и алгоритмы Bootcamp.</li></ul><h2>Заключение</h2><p>Надеемся, что этот обзор поможет вам подготовиться к собеседованию на должность Data Engineer. Если вам нужен контрольный список, вы можете найти его <a href="https://docs.google.com/spreadsheets/d/1GOO4s1NcxCR8a44F0XnsErz5rYDxNbHAHznu4pJMRkw/edit#gid=0">здесь</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Arduino: выбор платы, подключение и первая программа</title>
      <link>https://tproger.ru/curriculum/arduino-quick-start</link>
      <comments>https://tproger.ru/curriculum/arduino-quick-start?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Туренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/arduino-quick-start</guid>
      <description><![CDATA[<p>Электронная платформа с открытым исходным кодом на микроконтроллерах семейства AVR: из чего состоят платы, как их выбирать и как начать с ними работать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/arduino-quick-start">Arduino: выбор платы, подключение и первая программа</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Arduino]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 20 Mar 2019 10:35:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>Arduino — это электронная платформа с открытым исходным кодом, которая позволяет взаимодействовать с окружающим миром. Благодаря ей можно создать всё, что придёт в голову — от простых электронных игрушек и автоматизации быта до электронной начинки боевого робота для состязаний, управляемого силой мысли (без шуток).</p><h2>Из чего состоит Arduino?</h2><p>На аппаратном уровне это серия смонтированных плат, мозгом которых являются <a href="https://arduinoplus.ru/avr/">микроконтроллеры семейства AVR</a>. Подробнее о том, <a href="https://tproger.ru/explain/difference-between-mc-and-mpu/">чем микроконтроллер отличается от микропроцессора</a>.</p><p>Платы имеют на борту всё необходимое для комфортной работы, но их функциональности часто бывает недостаточно. Чтобы сделать свой проект более интерактивным, можно использовать различные модули и платы расширений, совместимые с платформой Arduino. Сюда входят датчики (температуры, освещения, влаги, газа/дыма, атмосферного давления), устройства ввода (клавиатуры, джойстики, сенсорные панели) и вывода (сегментные индикаторы, LCD/TFT дисплеи, светодиодные матрицы).</p><p>На программном уровне платформа Arduino представляет собой бесплатную среду разработки Arduino IDE. Микроконтроллеры надо программировать на языке C++, с некоторыми отличиями и облегчениями, созданными для быстрой адаптации начинающих. Компиляцию программного кода и прошивку микроконтроллера среда разработки берёт на себя.</p><p>Существует также <a href="http://s4a.cat/">s4a.cat</a> — сервис, базирующийся на <a href="https://scratch.mit.edu/">Scratch</a>, позволяющий более наглядно вести разработку на Arduino. Он подойдёт для обучения детей, а также если вы разово хотите создать простое устройство без изучения языка программирования Arduino и различных документаций. Для остальных же случаев лучше придерживаться традиционного процесса разработки.</p><h2>Нужно ли уметь паять?</h2><p>Знания в области электромонтажа приветствуются, но совсем не обязательны. Простые устройства на базе Arduino часто выполняются в виде макета. Для этого используется беспаечная макетная плата (англ. breadboard), на которой происходит коммутация модулей с платой Arduino с помощью перемычек.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/1e8ac772-fb47-4029-afa9-0de4c4466dc3.jpg" alt="" /><figcaption>Макетная плата на 400 отверстий (имеются шины питания по бокам). Источник: https://www.instructables.com/id/Acrylic-Arduino-Prototyping-Stand/</figcaption></figure><p>Также существуют наборы, в которые входят сразу плата Arduino (оригинальная или от стороннего производителя), макетная плата, перемычки и различные радиоэлементы, датчики, модули. Например, такой:</p><figure><img src="https://media.tproger.ru/uploads/2023/08/678561c8-8fde-4919-8a25-d74b4fa726b9.jpg" alt="" /><figcaption>Набор для изучения Arduino. Источник</figcaption></figure><h2>Какие бывают платы</h2><h3>По производителю</h3><p>Существуют как <a href="https://store.arduino.cc/">официальные версии плат Arduino</a>, так и платы от сторонних производителей. Оригинальные платы отличаются высоким качеством продукта, но и цена тоже выше. Они производятся только в Италии и США, о чём свидетельствует надпись на самой плате.</p><p>На примере самой популярной платы Arduino UNO:</p><ul><li>Оригинальная плата. Поставляется только в фирменной коробке, имеет логотип компании, на портах платы — маркировка. Цена от производителя 20 €.</li></ul><figure><img src="https://media.tproger.ru/uploads/2023/08/a26b5a2e-2627-46a6-b2a5-5456d0756b58.jpg" alt="" /><figcaption>Оригинальная плата Arduino UNO. Источник: https://store.arduino.cc/arduino-uno-rev3</figcaption></figure><ul><li>Плата от стороннего производителя. Качество хуже, однако цена начинается от 150 рублей. Качество платы может отразиться на её работоспособности в дальнейшем. Хоть это и редкость, но плата и вовсе может не работать «из коробки» — всё зависит от добросовестности изготовителя и продавца. Для работы с подобными платами требуется драйвер CH340, который находится в свободном доступе. Во всём остальном процесс разработки идентичен процессу разработки на оригинальных платах.</li></ul><figure><img src="https://media.tproger.ru/uploads/2023/08/25c3d0e9-cfb8-4080-8bd3-21b50809eb51.jpg" alt="" /><figcaption>Плата Arudino UNO от стороннего производителя. Источник: https://ht.azurewebsites.net/p/956/arduino-uno-smd-clone-board</figcaption></figure><h3>По назначению</h3><p>У платы UNO достаточно портов для реализации большинства проектов. Однако иногда возможностей UNO может быть недостаточно, а иногда — избыточно. По этой причине как оригинальный, так и сторонние производители выпускают большое количество плат, различающихся характеристиками микроконтроллера, количеством портов и функциональным назначением.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/1eb8d40d-d9f3-441d-97b3-1d7afe148760.jpg" alt="" /><figcaption>Различные платы Arduino. Источник: https://arduinoplus.ru/populyarnie-kontrollery-arduino/</figcaption></figure><p>Самые популярные из них:</p><ul><li>Arduino Nano — различие с UNO только в конструктивном исполнении. Nano меньше.</li><li>Arduino Mega — плата на базе мощного микроконтроллера. Имеет большое количество портов.</li><li>Arduino Micro — имеет встроенную поддержку USB-соединения, а потому может использоваться как HID-устройство (клавиатура, мышь, MIDI-устройство).</li><li>Arduino Ethernet — имеет возможность подключения к сети через Ethernet-провод. На плате также расположен слот для microSD карточки.</li><li>Arduino Mini — по характеристикам немного уступает UNO. Преимуществом платы является её миниатюрное исполнение.</li><li>Arduino Due — плата на базе 32-разрядного ARM микроконтроллера. Имеет преимущество в производительности по сравнению с остальными.</li><li>Arduino LilyPad — форм-фактор позволяет использовать плату в предметах одежды и текстиля.</li><li>Arduino Yún — «нужно было ставить линукс…». Имеет поддержку дистрибутива Linux, встроенную поддержку Ethernet и Wi-Fi, слот для microSD. Как и Micro, имеет встроенную поддержку USB-соединения.</li></ul><h2>Установка ПО</h2><p>После выбора необходимой платы нужно установить бесплатную среду разработки Arduino IDE, которую можно найти на официальном сайте, а также, по необходимости, драйвер CH340.</p><p>Недавно открылась облачная платформа Arduino Create, которая покрывает большинство этапов разработки (от идеи до сборки). Вам не нужно ничего устанавливать на свой компьютер, всё необходимое платформа берёт на себя. В первую очередь — онлайн редактор кода.</p><p>В Arduino Create имеется доступ к обучающим материалам, проектам. Вы сможете общаться с профессионалами и помогать новичкам.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/38a83b00-1814-4474-a323-a304b31dba39.png" alt="" /><figcaption>Среда разработки Arduino IDE</figcaption></figure><h2>Особенности программирования на платформе Arduino</h2><h3>Термины</h3><p>Программный код для Arduino принято называть скетчами (англ. sketches). У скетчей есть два основных метода: setup() и loop(). Первый метод автоматически вызывается после включения/сброса микроконтроллера. В нём происходит инициализация портов и различных модулей, систем. Метод loop() вызывается в бесконечном цикле на протяжении всей работы микроконтроллера.</p><p>Порты — неотъемлемая часть любого микроконтроллера. Через них происходит взаимодействие микроконтроллера с внешними устройствами. С программной стороны порты называются пинами. Любой пин может работать в режиме входа (для дальнейшего считывания напряжения с него) или в режиме выхода (для дальнейшей установки напряжения на нём).</p><p>Любой пин работает с двумя логическими состояниями: LOW и HIGH, что эквивалентно логическому нулю и единице соответственно. У некоторых портов есть встроенный <a href="https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE-%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C">АЦП</a>, что позволяет считывать аналоговый сигнал со входа (например, значение переменного резистора). Также некоторые пины могут работать в режиме <a href="https://ru.wikipedia.org/wiki/%D0%A8%D0%B8%D1%80%D0%BE%D1%82%D0%BD%D0%BE-%D0%B8%D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F">ШИМ</a> (англ. PWM), что позволяет устанавливать аналоговое напряжение на выходе. Обычно функциональные возможности пина указываются на маркировке самой платы.</p><h3>Основные функции</h3><p>Для базовой работы с платой в библиотеке Arduino есть следующие функции:</p><ul><li>pinMode(PIN, type) — указывает назначение конкретного пина PIN (значение type INPUT — вход, OUTPUT — выход);</li><li>digitalWrite(PIN, state) — устанавливает логическое состояние на выходе PIN (state LOW — 0, HIGH — 1);</li><li>digitalRead(PIN) — возвращает логическое состояние со входа PIN (LOW — 0, HIGH — 1);</li><li>analogWrite(PIN, state) — устанавливает аналоговое напряжение на выходе PIN (state в пределах от 0 до 255);</li><li>analogRead(PIN) — возвращает значение аналогового уровня сигнала со входа PIN (пределы зависят от разрядности встроенного АЦП. Обычно разрядность составляет 10 бит, следовательно, возвращаемое значение лежит в пределах от 0 до 1023);</li><li>delay(ms) — приостанавливает исполнение скетча на заданное количество миллисекунд;</li><li>millis() — возвращает количество миллисекунд после момента запуска микроконтроллера.</li></ul><p>В остальном процесс программирования на Arduino такой же, как на стандартном C++.</p><h2>Пишем первую программу</h2><p>Вместо всем привычных Hello World’ов в Arduino принято запускать скетч Blink, который можно найти в Файл→Примеры→01.Basics→Blink. Там же можно найти множество других учебных скетчей на разные темы.</p><p>Почти на всех платах размещён светодиод, номер пина которого содержится в переменной LED_BUILTIN. Его можно использовать в отладочных целях. В следующем скетче будет рассмотрен пример управления таким светодиодом.</p><p>Рассмотрим скетч Blink:</p><h3>Прошивка</h3><p>После написания необходимо «залить» скетч на микроконтроллер. Как уже говорилось, платформа Arduino берёт весь процесс прошивки микроконтроллера на себя — вам лишь необходимо подключить плату к компьютеру.</p><p>Перед прошивкой микроконтроллера нужно выбрать вашу плату из списка в IDE. Делается это во вкладке Инструменты→Плата. Большинство существующих плат уже там есть, но при необходимости можно добавлять другие через Менеджер Плат.</p><p>После этого нужно подключить плату Arduino к любому USB-порту вашего компьютера и выбрать соответствующий порт во вкладке Инструменты→Порт.</p><p>Теперь можно приступать к прошивке микроконтроллера. Для этого достаточно нажать кнопку Загрузка, либо зайти на вкладку Скетч→Загрузка. После нажатия начнётся компиляция кода, и в случае отсутствия ошибок компиляции начнётся прошивка микроконтроллера. Если все этапы выполнены правильно, на плате замигает светодиод с периодом и интервалом в 1 сек.</p><h2>Обмен данными с компьютером</h2><p>У всех плат Arduino есть возможность обмена информацией с компьютером. Обмен происходит по USB-кабелю — никаких дополнительных «плюшек» не требуется. Нам нужен класс Serial, который содержит все необходимые функции. Перед работой с классом необходимо инициализировать последовательный порт, указав при этом скорость передачи данных (по умолчанию она равна 9600). Для отправки текстовых данных в классе Serial существуют небезызвестные методы print() и println(). Рассмотрим следующий скетч:</p><p>В Arduino IDE есть Монитор порта. Запустить его можно через Инструменты→Монитор порта. После его открытия убедитесь, что Монитор работает на той же скорости, которую вы указали при инициализации последовательного порта в скетче. Это можно сделать в нижней панели Монитора. Если всё правильно настроено, то ежесекундно в Мониторе должна появляться новая строка «T for Tproger». Обмен данными с компьютером можно использовать для отладки вашего устройства.</p><figure><img src="https://media.tproger.ru/uploads/2023/08/5b91847e-2dcc-46bf-a00e-e0eb040f6737.jpg" alt="" /></figure><p>Информацию на стороне компьютера можно не только получать, но и отправлять. Для этого рассмотрим следующий скетч:</p><p>Прошиваем микроконтроллер и возвращаемся в Монитор порта. Вводим в верхнее поле 1 и нажимаем Отправить. После этого на плате должен загореться светодиод. Выключаем светодиод, отправив с Монитора 0. Если же отправить символ T, в ответ мы должны получить строку «proger».</p><p>Таким способом можно пересылать информацию с компьютера на Arduino и обратно. Подобным образом можно реализовать <a href="http://geekmatic.in.ua/arduino_software_uart">связь между двумя Arduino</a>.</p><h2>А как подключать модули?</h2><p>Для работы с датчиками и модулями их изготовители создают специальные библиотеки. Они служат для простой интеграции модулей в вашу систему. Подключение библиотеки возможно с zip файла или с помощью Менеджера Библиотек.</p><p>Однако большое количество датчиков являются бинарными, т. е. считывать информацию с них можно простой функцией digitalRead().</p><h2>Что изучить дальше?</h2><ul><li><a href="http://arduino.ru/Reference">Синтаксис библиотеки Arduino</a>.</li><li><a href="http://robotday.ru/2015/04/12/%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B-%D0%B8-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B-%D0%B2-arduino/">Для более сложных архитектур может пригодиться ООП</a>.</li><li><a href="https://create.arduino.cc/projecthub">Примеры проектов</a>.</li><li><a href="https://svaring.com/soldering/platy/maketnaja-plata-bez-pajki">Работа на макетной плате</a>.</li><li><a href="http://electrik.info/microcontroller/1447-samye-populyarnye-datchiki-dlya-arduino.html">Основные модули и датчики</a>.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Хочу научиться программировать на PHP. С чего начать?</title>
      <link>https://tproger.ru/curriculum/php-beginner</link>
      <comments>https://tproger.ru/curriculum/php-beginner?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Наташа Маркова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/php-beginner</guid>
      <description><![CDATA[<p>Подборка курсов, книг и ключевых тем языка для изучения PHP с нуля, а также путь до успешного прохождения первого собеседования.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/php-beginner">Хочу научиться программировать на PHP. С чего начать?</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 23 Feb 2019 10:19:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказываем, что делать, если вы хотите изучить PHP с нуля: <a href="https://tproger.ru/articles/kak-stat-programmistom/">с чего начать путь программиста</a>, как продолжить и успешно пройти первое собеседование.</p><h2>Зачем учить PHP?</h2><p>Среди главных преимуществ языка:</p><ul><li>простота и низкий порог вхождения;</li><li>эффективность для решения задач веб-разработки;</li><li>множество удобных фреймворков;</li><li>востребованность навыков: на рынке есть много вакансий как для Junior PHP-разработчиков, так и для опытных Senior’ов;</li><li>возможность использования в изолированной среде;</li><li>большое количество материалов для изучения языка, активное сообщество.</li></ul><p>С другой стороны, язык часто критикуют за несогласованный синтаксис функций, отсутствие обратной совместимости между версиями, многопоточности и поддержки многобайтовых кодировок в ядре.</p><h2>Что учить?</h2><ul><li><a href="http://php720.com/">основы языка: синтаксис, типы данных, переменные, функции, константы, массивы, объекты, выражения</a>;</li><li><a href="https://ru.hexlet.io/courses/html">основы HTML, CSS и веб-дизайна</a>;</li><li>реляционные <a href="https://tproger.ru/tag/db/">БД</a>;</li><li><a href="https://tproger.ru/tag/linux/">Linux</a>, <a href="https://habr.com/ru/post/215117/">HTTP</a>, <a href="https://nginx.org/ru/docs/beginners_guide.html">Nginx</a>, Apache;</li><li><a href="https://wiki.rookee.ru/ftp/">FTP</a>, <a href="https://tproger.ru/curriculum/git-guide/">Git</a> и другие инструменты;</li><li><a href="https://tproger.ru/translations/design-patterns-for-beginners/">шаблоны проектирования</a>;</li><li><a href="https://ru.wikipedia.org/wiki/Список_ORM-библиотек#PHP">Object-relational mapping (ORM)</a>;</li><li><a href="https://www.internet-technologies.ru/articles/shablon-proektirovaniya-mvc-i-php-chast-1.html">Model-View-Controller (MVC)</a>;</li><li><a href="https://tproger.ru/translations/web-frameworks-how-to-get-started/">фреймворки и микрофреймворки</a>;</li><li><a href="https://tproger.ru/tag/testing/">тестирование</a>;</li><li>средства виртуализации: <a href="https://iamdroid.net/ru/blog/vagrant">Vagrant</a>, <a href="https://tproger.ru/translations/docker-concepts/">Docker</a>.</li></ul><h2>Где писать код?</h2><h3>IDE</h3><p>Попробуйте каждую среду разработки и поймёте, с какой платформой вам комфортнее всего работать:</p><ul><li><a href="https://www.jetbrains.com/phpstorm/">PHPStorm</a>;</li><li><a href="https://netbeans.org/">Netbeans</a>;</li><li><a href="http://www.aptana.com/">Aptana Studio</a>;</li><li><a href="https://www.eclipse.org/">Eclipse</a>.</li></ul><h3>Редакторы кода для PHP-проектов</h3><ul><li><a href="https://www.sublimetext.com/">Sublime Text</a>;</li><li><a href="https://code.visualstudio.com/">Visual Studio Code</a>;</li><li><a href="https://atom.io/">Atom</a>;</li><li><a href="https://panic.com/coda/">Coda</a>;</li><li><a href="http://www.jedit.org/">jEdit</a>;</li><li><a href="http://www.pnotepad.org/">Programmer’s Notepad</a>;</li><li><a href="https://www.activestate.com/products/komodo-ide/downloads/edit/">Komodo Edit</a>.</li></ul><h2>Где учить?</h2><h3>Учебники</h3><p>Ещё книги по PHP — в <a href="https://tproger.ru/books/php-books/">нашей подборке</a>.</p><h3>Онлайн-курсы</h3><ul><li><a href="https://ru.hexlet.io/professions/php">Хекслет</a>;</li><li><a href="https://geekbrains.ru/geek_university/web">Geekbrains и Mail.ru</a>;</li><li>FructCode;</li><li>PHP UP.</li></ul><h2>Всё выучил, что дальше?</h2><ul><li>Проходите <a href="https://tproger.ru/quiz/php-test/">тесты на знание PHP</a>.</li><li>Попробуйте найти заказчика на небольшой простой сайт. Если не найдёте — сделайте «для себя». Экспериментируйте с кодом, добавляйте эффекты, спрашивайте советы на профильных форумах. Купите домен и арендуйте хостинг, опубликуйте сайт. Расскажите о нём на тех же форумах и попросите оценить.</li><li>Следите за вакансиями PHP-программистов на Хантиме, hh.ru, <a href="https://tproger.ru/jobs/?category=1498">у нас на Tproger</a> и других ресурсах. Решайте тестовые задачи, <a href="https://tproger.ru/tag/job-interview/">ходите на собеседования</a>.</li><li>Найдите наставника. Идеально, если вы будете учиться под руководством опытного программиста с хорошими коммуникативными навыками. Им может быть ваш первый работодатель, знакомый с форума, преподаватель курса PHP. Взамен предлагайте небольшую скидку на свои услуги. Так вы быстрее освоитесь в профессии и заведёте полезные связи. А ещё со временем такое сотрудничество может вылиться в какой-то большой проект.</li><li>Посещайте конференции, хакатоны, курсы, вебинары, конкурсы. Найти подходящее событие для программистов можно <a href="https://tproger.ru/events/">у нас</a>.</li></ul><h2>А ещё?</h2><p>Не заставляйте себя всё время сидеть за изучением скучной теории, не пытайтесь писать код, если он «не идёт». Лучше учитесь, развлекаясь. Например, читайте наши материалы:</p><ul><li><a href="https://tproger.ru/translations/20-tips-for-php-prof/">20 вещей, которые отличают PHP-программиста от обезьянки</a></li><li><a href="https://tproger.ru/problems/">Задачи для программистов, ответы на задания различной сложности</a></li></ul><p>И играйте в <a href="https://tproger.ru/digest/learn-to-code-while-playing-games/">игры для программистов</a>. Для изучения PHP обратите внимание на <a href="https://www.codingame.com/">CodinGame</a> и <a href="https://www.codewars.com/">CodeWars</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Кто такой DevOps и как им стать: план обучения</title>
      <link>https://tproger.ru/curriculum/devops</link>
      <comments>https://tproger.ru/curriculum/devops?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/devops</guid>
      <description><![CDATA[<p>Узнайте, кто такой DevOps-инженер и что он должен знать. Пошаговый план из 17 шагов для перехода в DevOps с нуля — от Linux до Kubernetes и Docker.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/devops">Кто такой DevOps и как им стать: план обучения</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Системное администрирование]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 01 Feb 2019 14:00:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>• DevOps — это культура и методология, объединяющая команды разработки и эксплуатации для ускорения доставки кода в продакшн
• Для входа в профессию нужна база: системное администрирование (Linux), сети (TCP/IP, HTTP), основы программирования и работа с БД
• Практический план из 17 шагов — от написания простого API до настройки CI/CD с Docker и Kubernetes
• Главное качество DevOps-инженера — широкий кругозор и постоянное изучение новых технологий</p><p>Кто такой DevOps-инженер, чем занимается и как им стать — рассказывает Василий Озёров, руководитель международной команды Fevlake и SVP of Infrastructure в Airpush Inc.</p><p>Если нужен более свежий и детальный маршрут обучения, посмотрите <a href="https://tproger.ru/articles/roadmap-devops-inzhenera-v-2026-godu--chto-uchit-i-v-kakom-poryadke">Roadmap DevOps-инженера в 2026 году: что учить и в каком порядке</a>. Там путь разобран слоями: от Linux, Git и Docker до Kubernetes, наблюдаемости, безопасности и GitOps.</p><ol><li><a href="https://tproger.ru/#part1">Что такое DevOps?</a></li><li><a href="https://tproger.ru/#part2">Что должен знать DevOps-инженер?</a></li><li><a href="https://tproger.ru/#part3">Как стать специалистом в DevOps?</a></li><li><a href="https://tproger.ru/#part4">Заключение</a></li><li><a href="https://tproger.ru/#faq">Часто задаваемые вопросы</a></li></ol><p>В этой статье я постараюсь рассказать о том, что требуется ИТ-специалисту, чтобы стать DevOps-инженером. Но сначала несколько слов о себе, чтобы познакомиться поближе. Меня зовут Василий, работаю SVP of Infrastructure в одной из рекламных компаний, владею собственным бизнесом и на досуге пишу в свой канал <a href="https://t.me/drunkdevops">Хмельной DevOps</a>.</p><p>С Unix системами я познакомился в далеком 2005 году, ещё будучи учеником лицея. О да, те незабываемые ночи, проведенные за установкой FreeBSD и компиляцией KDE из исходников. К слову, именно благодаря этому я и нашел свою первую работу, где разрабатывал небольшие проекты на QT/C++, занимался настройкой Cisco, а также поднимал почтовые сервера.</p><p>И вот, наконец, я попал в геймдев компанию, где и начал свою карьеру DevOps-специалиста. Активное взаимодействие разработчиков и команды эксплуатации погрузили меня в доселе невиданный мир. До этого момента путь кода от разработчика на продакшн виделся мне огромной черной бездной, в которой было невозможно ничего разглядеть.</p><p>Но, окунувшись в неё с головой, я понял, что все не так уж и страшно. Я увидел, как приложения собираются, как тестируются, как уходят в продакшн, где их видит весь интернет. Давайте приподнимем завесу тайны и посмотрим, как же стать успешным DevOps-инженером.</p><h2>Что такое DevOps?</h2><p>DevOps — это сокращение от Development Operations, и, на самом деле, это не название профессии. Это культура, методика, если угодно. DevOps-движение возникло в 2008 году и было призвано решить накопившиеся проблемы. Очень много компаний видели проблему во взаимодействиях команд разработки и эксплуатации.</p><p>Разработчики считали, что если код запустился у них локально, то нет проблем — можно запускать в продакшен. Если всё же проблемы возникали, то со стороны команды эксплуатации звучало: «Да это проблемы с кодом, пусть разработчики разбираются». Из-за такого подхода релизы продуктов постоянно затягивались и зачастую страдало качество конечного продукта. Сильно накладывало отпечаток ещё и то, что за один релиз выкатывалось очень много изменений и было очень трудно разобраться, что же породило проблемы на продакшене.</p><p>DevOps был призван решить эти проблемы. Он должен был стать связующим звеном между командой разработки и командой эксплуатации. Условно, в DevOps культуре можно выделить несколько ролей, которые очень хорошо соотносятся с профессиями:</p><ul><li>Build Engineer — человек, отвечающий за сборку кода. Подтягивание зависимостей, разбор конфликтов в коде — это все про него.</li><li>Release Engineer — отвечает за доставку кода от разработки в продакшн. Какая ветка пойдет в тестирование, какой билд попадет на продакшн, релиз-инженер занимается именно этим.</li><li>Automation Engineer — инженер по автоматизации. Автоматизирует все, что движется. А что не движется, двигает и тоже автоматизирует. Автоматическая сборка при пуше в гит, прогон тестов, деплой на staging, деплой в продакшн — это все его задачи. Ключевая роль в DevOps подходе.</li></ul><p>В целом можно выделить ещё несколько ролей. Например, Security Engineer, который будет отвечать за прогон security-тестов и изучение уязвимостей в используемых компонентах.</p><p>В реальном мире все (или почти все) эти роли по отдельности обычно совмещает какой-нибудь другой человек. К примеру, роль билд-инженера можно отдать в руки разработчика. Да и автоматизация настройки серверов обычно отдается системным администраторам. А DevOps-специалисту остаётся проработать и автоматизировать процесс сборки и доставки кода от разработчика в продакшн.</p><h2>Что должен знать DevOps-инженер?</h2><p>Строго говоря, никаких специальных требований к DevOps-студенту не предъявляется, но вход в профессию будет намного легче, если вы с порога обладаете некоторыми навыками.</p><h3>Senior System Administrator</h3><p>Или хотя бы Middle. Идея в том, что вы должны на хорошем уровне разбираться в среде, в которой будут работать ваши приложения. Как они стартуют (<a href="https://en.wikipedia.org/wiki/Init">init</a>, <a href="https://www.freedesktop.org/wiki/Software/systemd/">systemd</a>), что делать, если вы видите ошибку <a href="https://stackoverflow.com/a/3107592">too many open files</a>, использовать или не использовать <a href="https://www.linux.com/news/all-about-linux-swap-space">swap</a>. Все это очень сильно пригодится, когда вы будете запускать реальные проекты.</p><p>С чего начать:</p><ol><li>Пройдите базовый <a href="https://www.edx.org/course/introduction-linux-linuxfoundationx-lfs101x-1">курс</a> по Linux.</li><li>Я учился по сайту <a href="https://www.lissyara.su/">lissyara.su</a>, речь тут идет больше о FreeBSD, но, изучив все статьи, получится хорошо расширить свой кругозор по часто используемом софту.</li><li>Самое главное во время обучения devops — с головой окунуться в происходящее. Этому очень способствуют тематические <a href="http://sysadmins.ru">форумы</a> и телеграмм-каналы.</li></ol><h3>Networking — CCNA</h3><p>Очень важная <a href="https://www.cisco.com/c/en/us/training-events/training-certifications/certifications/associate/ccna-routing-switching.html">вещь</a>, хотя про это забывают многие разработчики. Я считаю, что нельзя писать онлайн-сервисы, не понимая, как работает сеть. Никто не говорит, что надо заучивать семь уровней модели <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%82%D0%B5%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_OSI">OSI</a>, но точно потребуется знать, как работает <a href="https://en.wikipedia.org/wiki/Internet_Protocol">IP</a>, <a href="https://en.wikipedia.org/wiki/Transmission_Control_Protocol">TCP</a>/<a href="https://en.wikipedia.org/wiki/User_Datagram_Protocol">UDP</a> и, конечно, протокол уровня приложения — например, <a href="https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a>, <a href="https://en.wikipedia.org/wiki/HTTP/2">HTTP/2</a>. Это сохранит вам кучу нервов выискивая причины ошибки Connection Refused.</p><p>С чего начать:</p><ol><li>Запишитесь на курс CCNA.</li><li>Установите себе <a href="https://www.gns3.com">GNS 3</a> и прокачивайтесь в настройке сетевого оборудования.</li></ol><h3>Junior Developer</h3><p>Да-да. Вы должны представлять, как пишется код, что такое <a href="https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">ООП</a>, что такое <a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%82%D0%BE%D0%BA_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F">потоки</a> и ещё кучу разных вещей. В общем, чем больше у вас знаний в этом пункте, тем легче вам будет собрать и выкатить приложение.</p><p>Многие могут не согласиться со мной, аргументируя это тем, что код должен писать разработчик. Но, простите, если вы не понимаете, как создаётся программный продукт, то как вы будете автоматизировать его сборку, тестирование и депплой? Сможете ли вы заметить узкое место в архитектурном решении до того, как оно попадет на продакшн?</p><p>Чтобы ответить на эти вопросы, devops должен немного углубиться в основные понятия. С чего начать:</p><ol><li>Изучить основные типы используемых данных.</li><li>Посмотреть на основные применяемые <a href="https://tproger.ru/tag/algorithms/">алгоритмы</a>.</li><li>Почитать про <a href="https://tproger.ru/tag/design-patterns/">паттерны программирования</a>.</li><li>Пройти простой курс по любому языку программирования, например, у golang есть неплохой интерактивный <a href="https://tour.golang.org/welcome/1">онлайн-туториал</a>.</li></ol><h3>Junior DBA</h3><p>На самом деле это входит в предыдущий пункт, но я все же решил его вынести отдельно. Поскольку все текущие проекты в любом случае используют базы данных, было бы неплохо уметь писать SQL запросы, использовать <a href="https://www.postgresql.org/docs/current/static/sql-explain.html">explain</a> и понимать, как работают и зачем нужны <a href="https://www.essentialsql.com/what-is-a-database-index/">index</a>’ы. Ну и до кучи посмотреть на популярные <a href="http://nosql-database.org">NoSQL</a> решения.</p><p>С чего начать:</p><ol><li>Самое простое — это пройти какой-нибудь курс, например от <a href="https://www.enterprisedb.com/free-postgres-training">Enterprise DB</a>.</li><li>Если курс не хочется,то открываем документацию по <a href="https://www.postgresql.org/docs/10/static/index.html">PostgreSQL</a>, устанавливаем базу, создаем таблички и изучаем основные команды, такие как select, insert, join. Смотрим на execution plan запроса, создаем индексы, а также бэкапим, восстанавливаем и настраиваем репликацию.</li></ol><p>Судя по моей личной статистике, чаще всего в DevOps приходят люди из эксплуатации, поскольку у разработчиков обычно не прокачан первый скилл из списка. Но я знаю два случая из жизни, когда senior developers становились DevOps, потому что им надоело, как работает эксплуатация. И, к слову, помимо технических навыков вам точно потребуются некоторые софт скилы. Как минимум вы будете очень много общаться со всеми заинтересованными сторонами. Также вы будете продвигать новые идеи и технологии, что потребует от вас умения ясно и четко доносить свои мысли и умение спорить. Про стрессоустойчивость писать не буду, но терпение вам точно понадобится, поскольку внедрить новую крутую технологию зачастую невозможно в течение одного дня.</p><h2>Как стать DevOps-инженером?</h2><p>Вообще DevOps-инженер — это больше про опыт, нежели про знание конкретного софта. Девопс-ребята постоянно учатся, изучают и тестируют новые проекты и технологии. Они должны постоянно задавать себе вопрос: улучшит ли эта технология наш проект? Что лучше выбрать в качестве языка: Ruby, Python, Go или написать на чистых плюсах? А как мы будем доставлять изменения в продакшен, чтобы не поломать работающие системы?</p><p>Главное, что надо понимать, — DevOps-специалист обладает действительно хорошим кругозором. Чтобы его расширить необходимо постоянно заниматься самообучением. Ниже я привел примерные шаги, которые помогут вам вырасти из, например, системного администратора в DevOps-инженера. Запомните: список всего лишь указывает направление, оттачивать навыки придётся вам самим.</p><ol><li>Сразу напишем небольшое приложение. Язык выбираем абсолютно любой. Приложение будет отдавать информацию о пользователях через HTTP. По сути, простенькое API.</li><li>Теперь давайте добавим работу с базой: пусть наши пользователи хранятся в базе. Идеально структуру базы хранить рядом с кодом и научиться прогонять миграции при новых изменениях. Таким образом ваше приложение само синхронизирует базу до нужной структуры.</li><li>Регистрируемся на GitHub/Bitbucket и закидываем весь исходный код нашего приложения туда.</li><li>На своей машине поднимаем <a href="https://jenkins.io">Jenkins</a>/<a href="https://www.jetbrains.com/teamcity/specials/teamcity/teamcity.html">TeamCity</a> и настраиваем автоматическую сборку приложения из нашего репозитория по кнопке.</li><li>Усложняем задачу. Настроим <a href="https://developer.github.com/webhooks/">webhooks</a> на GitHub/Bitbucket, которые будут автоматически запускать сборку на Jenkins/TeamCity.</li><li>Добавим тестов в Jenkins: как минимум можно прогонять линтер по нашему коду или набросать unit-тесты.</li><li>Переключимся на настройку dev окружения. Берём в руки <a href="https://www.ansible.com">Ansible</a>, <a href="https://www.chef.io/chef/">Chef</a>, <a href="https://puppet.com">Puppet</a> или <a href="https://www.saltstack.com/">SaltStack</a> и настраиваем виртуалку с нуля: создаем пользователей, устанавливаем необходимые библиотеки и зависимости.</li><li>Подводим все это дело под <a href="https://www.vagrantup.com/">Vagrant</a>: виртуалка должна автоматически подниматься и настраиваться. Это важный этап в девопс.</li><li>Подключаем vagrant к Jenkins с помощью соответствующего <a href="https://wiki.jenkins.io/display/JENKINS/Vagrant-plugin">плагина</a>: при пуше в <a href="http://git-scm.com">Git</a> наше приложение собирается, и поднимается виртуальное окружение с помощью Vagrant + Configuration System Management.</li><li>Ищем best practices по деплою приложений на языке, который вы выбрали. Можно заворачивать всё в <a href="https://wiki.debian.org/HowToPackageForDebian">deb</a>-пакеты, можно деплоить Ruby с помощью <a href="http://capistranorb.com">Capistrano</a>. Главное — выбрать решение.</li><li>Выбор сделан, реализуем его и конфигурируем Jenkins, чтобы после пуша в репозиторий, Jenkins, помимо сборки приложения и развертывания окружения, выкладывал и запускал наш код.</li><li>Добавляем <a href="http://softwaretestingfundamentals.com/smoke-testing/">смоук-тесты</a>: после запуска Jenkins должен запросить список пользователей у нашего API и убедиться, что получает ответ.</li><li>Добавляем мониторинг нашего проекта: изучаем <a href="https://www.influxdata.com/time-series-database/">time series базы</a>, настраиваем <a href="https://prometheus.io">prometheus</a>, <a href="https://grafana.com">grafana</a>, автоматически подключаем новый инстанс нашего приложения к мониторингу.</li><li>Улучшаем мониторинг: интегрируемся со <a href="https://slack.com/">Slack</a> и <a href="https://www.pagerduty.com">PagerDuty</a>, чтобы получать нотификации.</li><li>Читаем про Docker, пишем <a href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/">Dockerfile</a> и оборачиваем наше приложение.</li><li>Изучаем увлекательные статьи про настройку систем оркестрации <a href="https://docs.docker.com/engine/swarm/">Swarm</a>, <a href="https://kubernetes.io">Kubernetes</a>, <a href="https://github.com/rancher/cattle">Rancher Cattle</a>. Следуем рекомендациям и поднимаем кластер.</li><li>Меняем Jenkins: собираем Docker-образ, прогоняем тесты, запускаем собранный докер на кластере Kubernetes, проводим smoke-тесты, вводим наше приложение в балансировку.</li></ol><p>Разобрались, как стать DevOps-инженером? Смотрите также, какие инструменты используются в DevOps.</p><p>Главной целью всех этих шагов является получение опыта работы с различными технологиями. Я уже говорил, что самое главное для DevOps-специалиста — это кругозор, так что берем эти же 17 пунктов и в каждом из них меняем технологию на новую. Писали приложение на Go? Теперь пишем на Ruby. Использовали Jenkins? Берём TeamCity. Поднимали Kubernetes? Настраиваем swarm. Таким нехитрым образом через несколько месяцев вы заранее сможете понять, что лучше использовать в конкретной ситуации, а это — самое главное качество грамотного и успешного DevOps.</p><h2>Часто задаваемые вопросы</h2><h3>Можно ли стать DevOps-инженером без опыта в разработке?</h3><p>Да, большинство DevOps-специалистов приходят из системного администрирования, а не из разработки. Однако базовое понимание кода, алгоритмов и паттернов программирования значительно упростит работу. Достаточно пройти вводный курс по любому языку (Python, Go, Ruby) и разобраться с основами ООП и работой с API.</p><h3>Сколько времени нужно, чтобы стать DevOps-инженером с нуля?</h3><p>При системном подходе и ежедневной практике — от 6 до 12 месяцев до уровня Junior DevOps. За это время можно освоить Linux, сети, CI/CD-инструменты (Jenkins, GitLab CI), контейнеризацию (Docker) и основы оркестрации (Kubernetes). Полноценным Middle-специалистом обычно становятся через 2–3 года реальной работы.</p><h3>Какие инструменты DevOps самые востребованные?</h3><p>В число наиболее востребованных инструментов входят: Git (контроль версий), Jenkins или GitLab CI (CI/CD), Docker и Kubernetes (контейнеризация и оркестрация), Ansible или Terraform (инфраструктура как код), Prometheus и Grafana (мониторинг). Конкретный стек зависит от компании, но эти инструменты покрывают большинство вакансий.</p><h3>Чем DevOps-инженер отличается от системного администратора?</h3><p>Системный администратор фокусируется на поддержке инфраструктуры и серверов, тогда как DevOps-инженер отвечает за весь цикл доставки кода — от сборки до деплоя в продакшн. DevOps-специалист автоматизирует процессы, выстраивает CI/CD-пайплайны и является связующим звеном между командами разработки и эксплуатации.</p><h2>Заключение</h2><p>Да, стать DevOps-инженером с нуля не так-то просто, серебряной пули не существует. Не существует её и в любой другой области. Всегда придётся изучать, читать, пробовать. Но после 10-ой итерации вы войдёте во вкус. Вы не будете пропускать ни одной интересной софтинки, станете изучать и пробовать всё новое и неизведанное. А новое и неизведанное — это всегда круто. Кто бы там что ни говорил, дерзайте!</p>]]></content:encoded>
    </item>
    <item>
      <title>Как выучить Git с нуля</title>
      <link>https://tproger.ru/curriculum/git-guide</link>
      <comments>https://tproger.ru/curriculum/git-guide?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Наташа Маркова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/git-guide</guid>
      <description><![CDATA[<p>Если вы хотите выучить систему git, но не знаете, с чего начать, эта статья будет хорошим стартом. В ней подобраны лучшие источники для изучения git.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/git-guide">Как выучить Git с нуля</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 02 Oct 2018 15:43:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказываем, зачем осваивать распределенную систему управления версиями Git  и как это сделать с нуля. Также полезно понять <a href="https://tproger.ru/translations/difference-between-git-and-github">разницу между Git и GitHub</a>.</p><h2>Чем Git отличается от других систем контроля версий?</h2><h3>Хранение информации</h3><p>CVS, Subversion, Perforce и другие централизованные платформы хранят информацию как список изменений для файлов. В отличие от них, Git считает данные набором слепков небольшой файловой системы. Углублённый разбор -- в нашем <a href="https://tproger.ru/articles/git-polnyj-putevoditel-ot-pervogo-kommita-do-prodvinutyh-wor">полном путеводителе по Git</a>.</p><figure><img src="https://media.tproger.ru/user-uploads/34561/2023-12-25/e3c134d6-8e86-4927-9e7e-d8f73c1848b3.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/34561/2023-12-25/abd6e454-e648-4135-bcb4-d1b2864b5dcd.png" alt="" /></figure><p>Среди других особенностей:</p><ul><li>в отличие от централизованных систем, для большинства операций Git использует только локальные файлы и ресурсы, что дает возможность работать без доступа к Сети;</li><li>перед сохранением файла Git вычисляет контрольную сумму с помощью SHA-1 хеша, и она становится его индексом.</li></ul><h2>Как пользоваться?</h2><p>Сначала нужно <a href="https://git-scm.com/downloads">установить</a> Git, затем настроить её. Укажите:</p><ul><li>имя пользователя:<br />$ git config --global user.name "tproger";</li><li>адрес электронной почты:<br />$ git config --global user.email tproger@example.com;</li><li>текстовый редактор для работы. Например, если стандартный редактор вас не устраивает и вы выбрали Emacs:<br />$ git config --global core.editor emacs;</li><li>встроенную утилиту сравнения. Например, если вы хотите использовать vimdiff $ git config --global merge.tool vimdiff.</li></ul><p>Затем проверьте настройки: git config --list.</p><h2>Как работать с кодом?</h2><p>Используйте сервисы для хостинга проектов и совместной разработки. Обычно в них есть контроль доступа, багтрекинг, управление задачами, вики для каждого проекта и развитое сообщество, в котором можно спросить совет. Начать можно с нашей <a href="https://tproger.ru/translations/beginner-git-cheatsheet">шпаргалки по Git для начинающих</a>.</p><p>Среди самых популярных платформ:</p><ul><li><a href="https://github.com/">GitHub</a>;</li><li><a href="https://about.gitlab.com/">Gitlab</a>;</li><li><a href="https://bitbucket.org/">Bitbucket</a>;</li><li><a href="https://gogs.io/">Gogs</a>;</li><li><a href="https://sourceforge.net/">SourceForge</a>.</li></ul><h2>Что учить дальше?</h2><ul><li>Работа с репозиториями: <a href="https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-Git-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F">создание</a>, <a href="https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9">запись изменений</a>, <a href="https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%9F%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%BE%D0%B2">просмотр истории коммитов</a>, <a href="https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%9E%D1%82%D0%BC%D0%B5%D0%BD%D0%B0-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9">отмена изменений</a>, <a href="https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%83%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F%D0%BC%D0%B8">работа с удалёнными репозиториями</a> и <a href="https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%BC%D0%B5%D1%82%D0%BA%D0%B0%D0%BC%D0%B8">метками</a>.</li><li><a href="https://git-scm.com/book/ru/v2/%D0%92%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-Git-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B2%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D1%8F">Ветвление и слияние</a>.</li><li>Git на сервере: <a href="https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5">настройка</a>, <a href="https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%9F%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%8B">работа с протоколами</a>, <a href="https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%BE%D0%B3%D0%BE-SSH-%D0%BA%D0%BB%D1%8E%D1%87%D0%B0">генерирование открытого SSH-ключа</a>, <a href="https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-GitWeb">GitWeb</a>, <a href="https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-Gitosis">Gitosis</a>, <a href="https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-Gitolite">Gitolite</a>, <a href="https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-Git-%D0%B4%D0%B5%D0%BC%D0%BE%D0%BD">Git-демон</a>, <a href="https://git-scm.com/book/ru/v2/Git-%D0%BD%D0%B0-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-Git-%D1%85%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3">Git-хостинг</a>.</li><li><a href="https://git-scm.com/book/ru/v2/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git">Инструменты Git</a>.</li></ul><h2>Где учить?</h2><ul><li><a href="https://git-scm.com/book/ru/v2/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git">Документация Git</a>;</li><li><a href="https://githowto.com/">Git How To</a>;</li><li><a href="https://geekbrains.ru/courses/66">Geekbrains</a>;</li><li><a href="https://ru.hexlet.io/courses/intro_to_git">Hexlet</a>;</li><li><a href="https://www.youtube.com/watch?list=PLY4rE9dstrJyTdVJpv7FibSaXB4BHPInb&amp;v=PEKN8NtBDQ0">LoftBlog</a>;</li><li><a href="https://learngitbranching.js.org/">интерактивное онлайн-руководство</a>;</li><li><a href="https://tproger.ru/video/git-for-beginners-3/">Devcolibri;</a></li><li><a href="https://tproger.ru/tag/git/">Tproger</a>.</li></ul><p>Немного интерактива:</p><ul><li><a href="https://explainshell.com/">сайт</a> с поиском любых shell команд, включая команды Git;</li><li><a href="https://learngitbranching.js.org">Learn Git Branching</a> — онлайн-руководство, которое учит использовать git в игровом стиле;</li><li><a href="https://try.github.io/levels/1/challenges/1">Try Git</a> для экспериментов с виртуальным репозиторием.</li></ul><h2>Все выучил, что дальше?</h2><p>Когда вы освоили основные операции:</p><ul><li>проходите тесты;</li><li>изучайте <a href="http://www.vikingcodeschool.com/web-development-basics/git-calisthenics">сайт с упражнениями по Git</a>;</li><li>осваивайте <a href="https://git.wiki.kernel.org/index.php/Main_Page">энциклопедию по Git</a>: здесь есть руководства, шпаргалки и сообщество, в котором можно задавать вопросы.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Хочу научиться программировать на Python: инструкция для продолжающих</title>
      <link>https://tproger.ru/curriculum/python-how-to-learn-2</link>
      <comments>https://tproger.ru/curriculum/python-how-to-learn-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Наташа Маркова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/python-how-to-learn-2</guid>
      <description><![CDATA[<p>Что изучать после основ языка Python, где получать практику и как находить идеи для собственного проекта — ориентиры для продолжающих.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/python-how-to-learn-2">Хочу научиться программировать на Python: инструкция для продолжающих</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 25 Aug 2018 14:56:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>В прошлой <a href="https://tproger.ru/articles/python-how-to-learn/">статье</a> мы рассказали, как изучать Питон с нуля. В этом материале рассказываем, что делать, когда вы изучили азы и решаете простые задачи.</p><h2>Что учить?</h2><p>В первую очередь:</p><ul><li><a href="https://www.udacity.com/course/data-structures-and-algorithms-in-python--ud513">алгоритмы и структуры данных</a>;</li><li><a href="https://www.insight-it.ru/">архитектуры информационных систем</a>;</li><li><a href="https://devpractice.ru/python-lesson-15-iterators-and-generators/">генераторы и итераторы</a>;</li><li>дескрипторы;</li><li><a href="https://pythonworld.ru/osnovy/rabota-s-modulyami-sozdanie-podklyuchenie-instrukciyami-import-i-from.html">работа с модулями</a>;</li><li><a href="https://tproger.ru/translations/oop-principles-cheatsheet/">основные принципы</a> объектно-ориентированного программирования (<a href="https://tproger.ru/translations/imperative-declarative-programming-concepts/">императивный и декларативный стили</a>, <a href="https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)">замыкания</a> и <a href="https://tproger.ru/translations/programming-concepts-introspection-reflection/">интроспекция</a>, <a href="https://tproger.ru/translations/asynchronous-programming-in-python/">асинхронная концепция программирования</a>);</li><li><a href="https://habr.com/post/158895/">кодировки</a>;</li><li><a href="https://tproger.ru/video/operating-systems/">операционные системы</a> (потоки, процессы, сокеты, стек протоколов TCP/IP);</li><li>основы работы в <a href="https://tproger.ru/video/linux-for-beginners/">Linux</a> (работа в sh, типы виртуализации, настройка виртуальных машин через <a href="https://eax.me/vagrant/">vagrant</a> или подобные инструменты, работа с GIT);</li><li>сетевой протокол прикладного уровня <a href="http://xgu.ru/wiki/SSH">SSH</a>;</li><li>протокол прикладного уровня передачи данных <a href="https://habr.com/post/215117/">HTTP</a>;</li><li>форматы данных <a href="https://www.ibm.com/developerworks/ru/library/x-newxml/index.html">XML</a>, <a href="https://ru.wikipedia.org/wiki/HTML">HTML</a>, <a href="https://www.json.org/json-ru.html">JSON</a>;</li><li>стандарт <a href="https://lectureswww.readthedocs.io/5.web.server/wsgi.html">WSGI</a>;</li><li>SQL, базы данных (например, <a href="https://postgrespro.ru/docs/postgresql/9.6/">PostgreSQL</a>, MySQL, а также INSERT, UPDATE, SELECT, JOIN, CRUD, GROUP BY для <a href="https://ruseller.com/lessons.php?id=1664">реляционных баз</a>);</li><li>принципы работы с <a href="https://habr.com/post/152477/">NoSQL</a> (например, <a href="https://metanit.com/nosql/mongodb/">MongoDB</a>);</li><li>веб-сервер и почтовый прокси-сервер <a href="http://nginx.org/ru/docs/beginners_guide.html">nginx</a>;</li><li>способ синхронизации потоков GIL;</li><li>менеджеры пакетов (например, <a href="https://ru.wikipedia.org/wiki/Pip_(%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2)">pip</a>);</li><li>понимание традиционных методологий разработки, например, <a href="http://www.pmoffice.by/blog/agile/agile-approach.html">Agile (Scrum)</a>.</li></ul><p>Фреймворки:</p><ul><li>асинхронные (<a href="https://www.komtet.ru/lib/plangs/python/tornado-veb-freimvork-realnogo-vremeni">Tornado</a>, <a href="http://www.gevent.org/">gevent</a>, <a href="https://habr.com/post/242541/">aiohttp</a>, <a href="https://habr.com/post/269347/">Celery</a>);</li><li>синхронные (<a href="https://lectureswww.readthedocs.io/6.www.sync/3.framework/pyramid/">Pyramid</a>, <a href="https://habr.com/post/320360/">Flask</a>, <a href="https://tutorial.djangogirls.org/ru/django/">Django</a>);</li><li>тестирование (<a href="http://python-lab.ru/documentation/27/stdlib/doctest.html">doctest</a>, <a href="https://eax.me/pytest/">py.test</a>, <a href="https://ru.wikipedia.org/wiki/Selenium">Selenium</a>, <a href="https://wiki.python.org/moin/PyUnit">unittest/pyUnit</a>).</li></ul><h2>А также</h2><p>Учитесь читать чужой код</p><p>Иногда быстрее и проще написать собственный код, чем переписывать чужой, но такой навык имеет преимущества. Вы сможете перенять интересные идеи и подходы для своих проектов, учитесь находить ошибки. Сюда же — code review. Главное — изучайте хороший код. Такие есть на <a href="https://github.com/">GitHub</a>: создайте профиль, изучайте проекты, присоединяйтесь к ним.</p><p>Учитесь делать рефакторинг</p><p>Рефакторинг поможет найти ошибки в коде, упростить его и сделать понятным для других.</p><p>Подтяните английский язык до уровня понимания технической литературы</p><p>Он нужен как минимум для чтения документации, книг, задач и общения с другими разработчиками.</p><p>Изучайте инструменты для оптимизации кода</p><p>Первая пятерка — в <a href="https://tproger.ru/digest/five-ways-to-boost-python/">нашем материале</a>. Также полезно читать о <a href="https://tproger.ru/translations/nifty-python-tricks/">хитрых приемах на Python</a> и применять их на практике.</p><p>Ищите библиотеки</p><p>Изучить все пакеты вряд ли получится, но некоторые знать полезно. Некоторые из них мы собрали в <a href="https://tproger.ru/translations/10-python-libraries-you-might-not-know/">статье</a>.</p><h2>Где учить?</h2><p>Продвинутый уровень требует поиска материалов из разных источников. Онлайн-курсы по большей части полезны для начинающих, хотя есть пара вариантов для продолжающих: курс от <a href="https://geekbrains.ru/courses/115">Geekbrains</a> на русском языке и <a href="https://tproger.ru/video/advanced-python/">Python3 Advanced Tutorial</a> на английском. Еще несколько хороших книг — в <a href="https://tproger.ru/books/free-python-books/">подборке Tproger</a>.</p><h2>Все выучил, что делать дальше?</h2><p>Например, решать задачи. <a href="https://tproger.ru/translations/mosaic-from-random-images/">Создайте мозаику из случайных изображений</a>, <a href="https://tproger.ru/problems/python-challenge-level-one/">расшифруйте строку</a>, <a href="https://tproger.ru/translations/python-command-line-tools-with-click/">создайте инструменты командной строки</a>. Еще задания — в нашей <a href="https://tproger.ru/digest/competitive-programming-practice/">подборке</a> и на сайтах <a href="https://checkio.org/">checkio.org</a>, <a href="https://www.codingame.com/">codingame.com</a> и <a href="https://www.codewars.com/">codewars.com</a>.</p><p>Попробуйте создать собственный проект — здесь вы найдете<a href="http://www.dreamincode.net/forums/topic/78802-martyr2s-mega-project-ideas-list/"> список из более чем 100 идей</a>. А здесь — <a href="http://inventwithpython.com/blog/2012/02/20/i-need-practice-programming-49-ideas-for-game-clones-to-code/"> список из 49 клонов игр</a>, которые напишете самостоятельно. Дальше можно <a href="https://tproger.ru/translations/python-developer-interview-guide/">готовиться</a> к собеседованию на позицию Python-разработчика.</p>]]></content:encoded>
    </item>
    <item>
      <title>План обучения для специалиста по Data Science</title>
      <link>https://tproger.ru/curriculum/data-scientist-curriculum</link>
      <comments>https://tproger.ru/curriculum/data-scientist-curriculum?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Туренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/data-scientist-curriculum</guid>
      <description><![CDATA[<p>Детальный маршрут для тех, кто хочет войти в Data Science, но не понимает, с чего начать: порядок тем и шагов освоения специальности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/data-scientist-curriculum">План обучения для специалиста по Data Science</a>»</p>]]></description>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Aug 2018 16:31:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>Благодаря Data Science мы можем контролировать взлёты и посадки в самых больших аэропортах, можем анализировать и прогнозировать появление эпидемий без врачей. Благодаря не только современной технике, но и тем обученным программам, которые в ней установлены, доктора могут практически безошибочно ставить сложные диагнозы в некоторых отраслях медицины. Более того, у нас даже есть беспилотный транспорт и с каждым годом он лучше и умнее! Предлагаем вам не оставаться в стороне от такой интересной и перспективной науки и стать на сторону её развития.</p><p>Примечание У нас есть планы обучения и по <a href="https://tproger.ru/curriculum/">другим специальностям</a>.</p><p>Базовый (связующий модуль)</p><ol><li>CS50 — курс Гарварда по программированию. Рассматривается построение алгоритмов, поиск наиболее эффективных методов решения проблемы. Также присутствует практика на языках C, Python и JavaScript;</li><li><a href="https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/">Математика и информатика</a>;Зачем программисту нужна информатика?</li><li>Освоение программирования по программе <a href="https://www.udacity.com/course/intro-to-programming-nanodegree--nd000">«Nanodegree — Learn to Code»</a> от Udacity.</li></ol><p>Зачем нужен этот модуль?</p><p>Если вы пришли в программирование из другой специальности или же были верстальщиком или веб-дизайнером, то этот модуль поможет расширить границы ваших познаний в программировании.</p><h3>Ядро науки о данных</h3><p>Программа дополнительного образования от Udacity <a href="https://www.udacity.com/course/data-analyst-nanodegree--nd002">«DataAnalyst»</a> (платно и на английском).</p><p>Если у вас есть желание подстроить программу образования под себя, то это будет бесплатно. Предлагаем следующую последовательность бесплатных курсов, входящих в программу выше:</p><ol><li><a href="https://www.udacity.com/course/intro-to-inferential-statistics--ud201">Введение в инференциальную статистику</a>;</li><li><a href="https://www.udacity.com/course/intro-to-descriptive-statistics--ud827">Введение в описательную статистику</a>;</li><li><a href="https://www.udacity.com/course/intro-to-data-analysis--ud170">Введение в аналитическую обработку данных</a> (с применением NumPy и Pandas);</li><li><a href="https://www.udacity.com/course/data-wrangling-with-mongodb--ud032">Введение в первичную обработку данных</a>;</li><li><a href="https://www.udacity.com/course/sql-for-data-analysis--ud198">SQL для аналитической обработки данных</a>;</li><li><a href="https://www.udacity.com/course/data-wrangling-with-mongodb--ud032">MongoDB для аналитической обработки данных</a> (при возможности и желании можно изучить <a href="https://www.udacity.com/course/data-analysis-with-r--ud651">аналитическую обработку данных с помощью языка R.</a>);</li><li><a href="https://www.udacity.com/course/intro-to-machine-learning--ud120">Введение в Машинное обучение</a>;</li><li><a href="https://www.udacity.com/course/data-visualization-and-d3js--ud507">Визуализация данных и работа с D3.js</a>;</li><li><a href="https://www.udacity.com/course/ab-testing--ud257">A/B тестирование</a>.</li></ol><p>Дополнительные курсы на русском языке</p><ul><li><a href="https://stepik.org/course/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-%D0%B1%D0%B0%D0%B7%D1%8B-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-551/">Введение в базы данных</a> (при возможности и желании можно изучить анализ данных в R [<a href="https://stepik.org/course/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-R-129/">первая</a> и <a href="https://stepik.org/course/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-R-%D0%A7%D0%B0%D1%81%D1%82%D1%8C-2-724">вторая</a> части]);</li><li><a href="https://stepik.org/course/%D0%9F%D0%BE%D0%B3%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-%D0%A1%D0%A3%D0%91%D0%94-157/">СУБД</a>;</li><li><a href="https://tproger.ru/tag/algos-and-data-structs/">Алгоритмы и структуры данных</a>;</li><li>Методы обработки больших данных.</li></ul><h3>Машинное обучение</h3><ol><li><a href="https://www.class-central.com/mooc/835/coursera-machine-learning">Введение в машинное обучение</a>;</li><li><a href="https://www.class-central.com/mooc/6679/kadenze-creative-applications-of-deep-learning-with-tensorflow">Обучение работе с TensorFlow с применением в реальных приложениях</a>;</li><li><a href="https://www.class-central.com/mooc/2965/edx-cs190-1x-scalable-machine-learning">Машинное обучение и масштабирование</a>;</li><li><a href="https://www.class-central.com/course/coursera-neural-networks-for-machine-learning-398">Нейронные сети и машинное обучение</a>.</li></ol><h3>Разработка программного обеспечения</h3><p>Python</p><ol><li><a href="https://www.udacity.com/course/software-testing--cs258">Тестирование</a> и <a href="https://www.udacity.com/course/software-debugging--cs259">отладка</a>;</li><li><a href="https://www.udacity.com/course/software-debugging--cs259">Использование Git и GitHub для контроля версий</a>;</li><li><a href="https://tproger.ru/translations/reactive-web-apps-with-python/">Создание реактивных аналитических веб-приложений на Python</a> (статья).</li></ol><p>R</p><p><a href="https://www.coursera.org/specializations/r">Разработка программного обеспечения на R</a> (ниже перечислены отдельные курсы, входящие в состав программы по обучению разработке программного обеспечения на языке R).</p><ol><li><a href="https://www.coursera.org/learn/r-programming-environment">Программное окружение и R</a>;</li><li><a href="https://www.coursera.org/learn/advanced-r">Продвинутый уровень написания программ на R</a>;</li><li><a href="https://www.coursera.org/learn/r-packages">Сборка пакетов на R</a>;</li><li><a href="https://www.coursera.org/learn/r-data-visualization">Сборка инструментов визуализации данных</a>.</li></ol><h3>Дополнительные материалы</h3><ol><li><a href="https://www.udacity.com/course/intro-to-hadoop-and-mapreduce--ud617">Введенние в Hadoop и MapReduce</a>;</li><li><a href="https://www.class-central.com/mooc/4343/coursera-using-python-to-access-web-data">Python как инструмент доступа к веб-данным</a>.</li></ol><p>Не обязательно пытаться освоить всё и сразу. Есть мнение, что для Data Scientist’a достаточно знать только Python, а без R можно обойтись. Другие считают наоборот. В любом случае, пробуйте, выбирайте то, что вам ближе и у вас несомненно всё получится.</p><p>Чтение по теме: <a href="https://tproger.ru/translations/how-to-build-a-data-science-portfolio/">Как создать Data Science портфолио</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Хочу научиться программировать на Python. С чего начать?</title>
      <link>https://tproger.ru/curriculum/python-how-to-learn</link>
      <comments>https://tproger.ru/curriculum/python-how-to-learn?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/python-how-to-learn</guid>
      <description><![CDATA[<p>Пошаговый гайд для новичков: как выучить Python с нуля, какой синтаксис изучать, какую IDE выбрать. Лучшие курсы, книги и задачи для практики — начните сегодня!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/python-how-to-learn">Хочу научиться программировать на Python. С чего начать?</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 27 Jul 2018 20:16:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>• Python — один из самых популярных языков для старта в программировании благодаря простому синтаксису
• Начните с основ: переменные, циклы, функции, затем переходите к модулям и ООП
• Для практики используйте IDE (PyCharm, VS Code) и систему контроля версий Git
• Закрепляйте знания на задачах: Project Euler, CheckiO, тесты на Tproger</p><p>Рассказываем, как действовать, если вы решили освоить Python 3 с нуля: что учить в первую очередь, где брать знания и что делать дальше?</p><h2>Зачем учить Python?</h2><p>Python имеет ряд преимуществ:</p><ul><li>высокая популярность языка и использование в большом количестве проектов;</li><li>сравнительно простой, но в то же время строгий синтаксис;</li><li>множество доступных сред разработки, сервисов и фреймворков;</li><li>средства для работы с электронной почтой, протоколами Интернета, базами данных и другие инструменты в стандартной библиотеке языка;</li><li>востребованность Python-разработчиков на рынке труда.</li></ul><p>Среди главных особенностей — динамическая типизация, проблемы с совместимостью версий, а также низкая скорость выполнения кода по сравнению с другими языками программирования. Если вы учите Python не первым языком, синтаксис может показаться вам непривычным.</p><p>Python для создания продуктов используют такие корпорации, как Google, Dropbox, Mozilla, Yandex, Red Hat, Microsoft, Intel и другие.</p><h2>Что учить?</h2><h3>Синтаксис</h3><p>В первую очередь:</p><ul><li>операции с целыми и вещественными числами;</li><li><a href="https://tproger.ru/translations/python-data-types/">типы данных</a>;</li><li>переменные, ветвления, стандартный ввод/вывод;</li><li>логические операции, операции сравнения;</li><li>условия: if, else, elif;</li><li>блоки, отступы;</li><li>строки и символы;</li><li>циклы while, for;</li><li>операторы break, continue;</li><li>установка и подключение модулей;</li><li>списки;</li><li>функции;</li><li><a href="https://tproger.ru/explain/python-dictionaries/">словари</a>;</li><li>интерпретатор: установка, запуск скрипта;</li><li>файловый ввод/вывод.</li></ul><h3>Дополнительно</h3><ul><li>Python в одной картинке;</li><li><a href="https://github.com/kamranahmedse/developer-roadmap">Карта развития разработчика;</a></li><li><a href="https://awesome-python.com/">Подборка Awesome Python.</a></li><li><a href="https://tproger.ru/articles/10-paketov-python-kotorye-dolzhen-znat-kazhdyj-razrabotchik">10 пакетов Python, которые должен знать каждый разработчик</a>.</li><li><a href="https://tproger.ru/articles/30-bibliotek-python-kotorye-stoit-znat-v-2024-godu">30 библиотек Python, которые стоит знать</a>.</li><li><a href="https://tproger.ru/translations/top-10-python-bibliotek-dlja-data-science/">Подборка Python-библиотек для Data science</a>.</li></ul><h3>IDE и редакторы кода</h3><p>Писать в IDLE или Python Shell удобно только простой код, но для проектов лучше найти интегрированную среду разработки (IDE) или редактор кода. IDE включает в себя редактор с подсветкой синтаксиса и автодополнением, инструменты сборки, выполнения и отладки и другие функции. В большинстве редакторов есть подсветка синтаксиса и форматирование, выполнение и отладка кода. Как правило, этот инструмент работает быстрее IDE, но имеет меньше функций. Среди самых популярных платформ — <a href="https://www.jetbrains.com/pycharm/">PyCharm</a>, <a href="https://wingware.com/">Wing IDE</a>, <a href="https://www.activestate.com/komodo-ide">Komodo</a> и другие. Больше вариантов — в нашем <a href="https://tproger.ru/translations/python-ide/">обзоре</a>.</p><h3>Git</h3><p>С распределенной системой управления версиями (<a href="https://git-scm.com/">Git</a>) нужно познакомиться в начале обучения. Среди основных навыков — создание и перемещение файлов в каталогах, инициализация Git-репозитория и создание коммитов, а также настройка репозиториев в <a href="https://github.com/">GitHub</a>.</p><h2>Где учить?</h2><p>Попробуйте каждый из инструментов. После пары первых уроков будет ясно, подходит он вам или нет.</p><h3>Учебники</h3><p>Другие хорошие книги по Python — в нашей <a href="https://tproger.ru/books/free-python-books/">подборке</a>.</p><h3>Онлайн-курсы на русском языке</h3><ul><li><a href="https://stepik.org/course/67/">Stepik</a>;</li><li><a href="https://geekbrains.ru/courses/105">Geekbrains</a>;</li><li><a href="http://pythontutor.ru">Питонтьютор</a>;</li><li>Курс от Mail.Ru Group и МФТИ;</li></ul><h3>Онлайн-курсы на английском языке</h3><ul><li><a href="https://www.codecademy.com/ru/tracks/python">Codecademy</a>;</li><li><a href="https://www.jetbrains.com/pycharm-edu/">PyCharm Edu от JetBrains</a>;</li></ul><p>О том, как еще учить Python — в нашей <a href="https://tproger.ru/digest/python-materials/">статье</a>.</p><h2>Все выучил, что дальше?</h2><p>Когда вы научились составлять простые программы, надо постараться понять, в какую сторону вы хотите двигаться. Для этого начните решать задания:</p><ul><li><a href="https://tproger.ru/quiz/python-style-quiz/">тест</a> на читабельность кода и <a href="https://tproger.ru/quiz/python-beginner/">тест</a> на знание языка;</li><li>проект Эйлера на <a href="https://projecteuler.net/">английском</a> и <a href="http://euler.jakumo.org/">русском</a> учит составлять правильные алгоритмы;</li><li><a href="http://www.checkio.org/">игра</a> с заданиями по уровням со встроенной средой программирования;</li><li><a href="http://www.pythonchallenge.com/">квест</a>, в котором нужно составить алгоритм, чтобы понять, как перейти к следующему шагу;</li><li>напишите <a href="https://tproger.ru/articles/kak-napisat-prostoj-kalkulyator-na-python--poshagovoe-rukovodstvo">простой калькулятор на Python</a> — отличный первый проект для закрепления основ;</li><li>попробуйте <a href="https://tproger.ru/articles/15-prostyh-igr-na-python-dlya-detej-i-nachinayuschih">15 простых игр на Python</a> — от «Угадай число» до «Крестики-нолики».</li></ul><p>Когда освоите основы, открываются новые направления: <a href="https://tproger.ru/articles/nejroset-na-python-za-10-minut--prostoj-gajd-dlya-nachinayuschih">создание нейросетей на Python</a>, работа с API — например, <a href="https://tproger.ru/articles/chto-takoe-rest-api-prostymi-slovami--principy--metody-i-primery">что такое REST API</a>, — и деплой приложений через <a href="https://tproger.ru/articles/chto-takoe-docker-prostymi-slovami--kontejnery--obrazy-i-docker-c">Docker</a>.</p><h2>Часто задаваемые вопросы</h2><h3>Сколько времени нужно, чтобы выучить Python с нуля?</h3><p>При регулярных занятиях по 1–2 часа в день основы Python можно освоить за 2–3 месяца. Для уверенного владения языком и готовности к первым проектам потребуется от 6 месяцев до года. Скорость зависит от наличия опыта в программировании и интенсивности практики.</p><h3>Можно ли выучить Python без знания математики?</h3><p>Да. Для веб-разработки, автоматизации и написания скриптов глубокие знания математики не требуются. Математика понадобится, если вы планируете заниматься Data Science, машинным обучением или алгоритмическим программированием.</p><h3>Какую версию Python выбрать для изучения?</h3><p>Учите Python 3 — это актуальная версия языка. Python 2 официально не поддерживается с 2020 года. Все современные библиотеки, фреймворки и курсы ориентированы на Python 3.</p>]]></content:encoded>
    </item>
    <item>
      <title>Хочу стать frontend разработчиком: базовые знания и план обучения</title>
      <link>https://tproger.ru/curriculum/intro-to-frontend-development</link>
      <comments>https://tproger.ru/curriculum/intro-to-frontend-development?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Роман Латкин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/intro-to-frontend-development</guid>
      <description><![CDATA[<p>Полный гайд по изучению фронтенд-разработки: от HTML, CSS и JavaScript до React, Vue.js и SSR. Пошаговый план обучения, инструменты, фреймворки и лучшие практики для начинающих.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/intro-to-frontend-development">Хочу стать frontend разработчиком: базовые знания и план обучения</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 20 Apr 2018 12:30:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>Итак, друзья, вы решили встать на путь программирования? Жму руку, это решение изменит вашу жизнь. Это всегда интересная и востребованная работа на стыке интеллекта и творчества, работа о том, как принести пользу людям, сделать мир чуточку лучше. Возможности реализации в ней бесконечны.</p><p><b>Кратко о главном:</b> фронтенд строится на трёх технологиях — HTML, CSS и JavaScript. Начните с основ вёрстки, затем освойте CSS-фреймворки (Bootstrap), далее изучите JavaScript и один из современных фреймворков (React или Vue.js). Ключевые инструменты в арсенале фронтендера — препроцессоры (Stylus, SASS), сборщики (Webpack), менеджеры пакетов (npm, Yarn) и система контроля версий Git. Следуйте пошаговому плану из 10 пунктов в конце статьи.</p><p>В программировании много разных областей: веб-разработка, мобильная, десктопные приложения, разработка ОС, драйверов для железа. Веб-разработка — одна из самых интересных и востребованных областей. К её плюсам можно отнести то, что ваш продукт лежит в Интернете, и чтобы его увидеть, достаточно набрать адрес в браузере любого устройства, не нужно ничего качать и устанавливать. К тому же, с помощью современных инструментов, зная веб, можно разрабатывать сразу и мобильные, и десктопные приложения. Веб состоит из frontend (то, что видит клиент в браузере) и backend (серверная часть, занимается хранением, обработкой и выдачей данных). Я предлагаю начать знакомство с вебом именно с фронтенда.</p><p>Да, кстати, меня зовут Роман Латкин, я почти 10 лет варюсь в веб-разработке. Когда я начинал, всё было одновременно просто и сложно. Просто, потому что для построения приложения много знать было не нужно: вот HTML, немного CSS, чуть-чуть JavaScript — и готово. Сложно, потому что разработка велась через боль. Сейчас множество этой боли вылечено с помощью громадной экосистемы инструментов, но она очень пугает новичков, они не знают, как подступиться к фронтенду, с какой стороны подойти. Мне повезло, я наблюдал развитие фронтенда почти с начала, и у меня в голове всё неплохо уложилось. И я хочу в помощь начинающим разработчикам передать это понимание. Надеюсь, после прочтения этой статьи, вы будете чётко знать, каким путём идти, куда копать и по какому плану развиваться.</p><ol><li><a href="https://tproger.ru/#1">Три составляющих фронтенда</a></li><li><a href="https://tproger.ru/#2">Первые сайты</a></li><li><a href="https://tproger.ru/#3">jQuery</a></li><li><a href="https://tproger.ru/#4">MVC</a></li><li><a href="https://tproger.ru/#5">Процессоры и сборщики</a>CSSJavaScriptHTMLМенеджеры пакетовМенеджеры задач</li><li><a href="https://tproger.ru/#11">Компонентная архитектура</a>ReactУправление состояниемVue.jsИзоморфные приложения, SSR</li><li><a href="https://tproger.ru/#16">CSS-фреймворки, адаптивность</a>КроссбраузерностьМетодологии</li><li><a href="https://tproger.ru/#19">В путь!</a></li></ol><h2>Три составляющих фронтенда</h2><p>Весь фронтенд состоит из трёх составляющих: HTML (содержание и разметка), JavaScript (логика) и CSS (внешний вид, позиционирование). HTML описывает содержание страницы и выглядит примерно так: &lt;table&gt;&lt;/table&gt;. CSS описывает стили и выглядит вот так: table { background: #ccc; }. JavaScript — язык программирования, описывает логику приложения, а также обращается к элементам HTML, изменяя структуру и содержание страницы (пример кода: var count = 5; count = count + 5; console.log(count) // 10).</p><p>Если вам придётся как-нибудь вручную использовать эти средства, чтобы сделать более-менее сложный проект, то вам предстоит испытать много боли. К счастью, мир развивается, сложные вещи упрощаются, люди придумывают всё новые и новые инструменты и технологии, которые делают этот созидательный процесс более приятным и быстрым.</p><p>Любой процесс познания можно представить в виде буквы «Т», где горизонтальная линия — широкое понимание, вертикальная — глубокое. У идеального специалиста буква Т большая и красивая, равномерная. Если она вытянута в одну сторону, она некрасива, уродлива; такой специалист мало полезен в боевых делах. Он может либо глубоко разбираться в чём-то одном, но чуть шаг в сторону, и он непригоден; либо поверхностно разбираться во всём, но при этом ничего не уметь. В первую очередь необходимо максимально развить широкую составляющую, чем мы сейчас и займёмся — постараемся максимально широко охватить все аспекты фронтенда, не углубляясь. А потом вы займётесь углублением, которое останется вам на самостоятельную работу.</p><p>Чтобы хорошо представлять причины текущего положения вещей, нужно хотя бы чуть-чуть знать историю пути развития фронтенда, да и вообще веб-приложений в целом. Инструментов сейчас столько, что не только новичок, сам чёрт ногу сломит. Поэтому, чтобы в этом всём хорошо ориентироваться, начнём именно с истории, с короткой экскурсии, как всё начиналось, а затем плавно перейдём к современным подходам.</p><h2>Первые сайты</h2><p>Вначале люди писали на чистом HTML, рисовали внешний вид на чистом CSS, делали логику на чистом JavaScript. Типичное старомодное приложение — это когда серверная логика генерирует HTML (отвечая на запрос посетителя, сервер берёт данные из базы данных и вставляет их в HTML) и отдаёт его вместе со статическими файлами стилей и клиентской логики на JavaScript, которой в то время (около 10 лет назад) было немного. При совершении перехода на другую страницу весь этот процесс повторялся. То есть раньше как такового разделения на фронтенд и бэкенд не было, было одно цельное приложение, которое одновременно и работало с базой данных, и генерировало HTML.</p><h2>jQuery</h2><p>Писать на чистом JavaScript надоедало и появился хороший инструмент — <a href="https://jquery.com/">jQuery</a>, который с помощью удобного синтаксиса позволял обращаться к элементам страницы и выполнять с ними какие-то действия. Появлялись различные плагины, готовые решения, стало проще и интереснее.</p><p>Чтение по теме: <a href="https://tproger.ru/articles/jquery-cheatsheet/">Краткая шпаргалка по jQuery</a></p><p>Но приложения развивались, объём клиентской логики рос, и постепенно всё это превращалось в большую лапшу. Чтобы её распутать, нужна была какая-то форма, архитектура.</p><h2>MVC</h2><p>Умные Парни попробовали перенести на фронтенд архитектурный шаблон с серверной части — MVC (модель-представление-контроллер). Этот шаблон диктует правило, что есть модель, которая описывает данные. Например, модель пользователя, модель фильма, модель отзыва. Есть контроллер, который обрабатывает запросы, например «показать по такому-то адресу страницу со списком фильмов». И есть представление, которое отвечает за отображение данных в HTML, в которое контроллер передаёт готовые данные, полученные из базы данных/API.</p><p>Здесь началась история single page application, SPA — приложений, которые загружаются один раз, а затем при переходе по страницам обращаются к серверу за данными по API. Этот подход называется <a href="https://ru.wikipedia.org/wiki/AJAX">AJAX</a>. Вместо того, чтобы генерировать HTML на стороне сервера, сервер отдаёт клиентскую логику приложения один раз. Переходя на другую страницу, например с главной страницы на страницу поиска отелей, приложение запрашивает с сервера данные в чистом виде (к примеру, информацию об отелях), без тегов HTML (как правило в формате <a href="https://learn.javascript.ru/json">JSON</a>), и самостоятельно генерирует представление.</p><p>Шаблон MVC на фронтенде был хорош, прекрасно работал, но было излишне сложно. <a href="https://angularjs.org/">Angular</a>, Backbone — представители этой вехи истории. Они, к слову, живут и сейчас, но я в них глубоко не разбирался.</p><h2>Процессоры и сборщики</h2><p>Приложения начали расти в размере, и тут пришло время рассказать о сборщиках, препроцессорах и пакетных менеджерах. Постараюсь вкратце по ним пробежаться, несмотря на то, что они заслуживают отдельной статьи.</p><p>В вебе важна скорость, поэтому нельзя просто так отдавать посетителю большие файлы, они будут идти по сети слишком долго. Поэтому все ресурсы <a href="https://learn.javascript.ru/minification">сжимаются</a> с помощью разных минификаторов. JavaScript чаще всего с помощью <a href="https://www.npmjs.com/package/uglify-js">uglify</a> (он удаляет пробелы, делает названия переменных короче и ещё много чего интересного). В CSS удаляются пробелы и могут ещё объединяться некоторые свойства. И всё это собирается в один или несколько файлов вместо 10-20, один файл скачать гораздо быстрее, и на сервер нагрузка меньше.</p><h3>CSS</h3><p>Что касается CSS, появлялись так называемые <a href="http://fb.ru/article/320296/preprotsessor-css-obzor-vyibor-primenenie">препроцессоры</a>. Они расширяют синтаксис CSS, добавляют туда кучу разных возможностей — вложенные блоки, переменные, циклы. Даже просто отсутствие точек с запятой очень помогает и ускоряет написание кода?.</p><p>Препроцессор — это такая программа, которая запускается и компилирует этот сахарный синтаксис в чистый CSS. Использование препроцессоров позволяет избежать повторного использования кода, выстраивает архитектуру, и по сути превращает язык описания стилей в язык программирования. Изучите какой-либо инструмент, и вы поймете. Я для себя сейчас выбрал <a href="http://stylus-lang.com/">Stylus</a>; есть ещё несколько, например — <a href="http://lesscss.org/">LESS</a>, <a href="https://sass-scss.ru/">SASS</a>.</p><p>Чуть позже придумали <a href="https://habrahabr.ru/post/235929/">постпроцессоры</a>. Они, в отличие от препроцессоров, обрабатывают уже готовый CSS, модифицируя его: например, добавляя дополнительные свойства к уже существующим, или изменяя названия классов, делая их уникальными, чтобы ничего не сломалось. Их чаще всего используют для поддержки кроссбраузерности, о которой мы ещё поговорим ниже. <a href="http://postcss.org/">PostCSS</a> — вот этот самый постпроцессор, он ещё обладает большой <a href="https://www.postcss.parts/">библиотекой плагинов</a>, упрощающих жизнь.</p><h3>JavaScript</h3><p>Насчёт JavaScript: исторически так сложилось, что этот язык изначально был слишком простой и сейчас постоянно развивается, обрастая новыми инструментами. Основная его версия, которая работает во всех современных браузерах, называется <a href="http://es5.javascript.ru/">ES5</a>. В 2015-м году появился усовершенствованный стандарт JavaScript <a href="http://learn.javascript.ru/es-modern">ES2015</a>, или ES6, который даёт много новых инструментов упрощённого описания логики. Только он не работает в старых браузерах, поэтому используют препроцессор <a href="http://babeljs.io/">Babel</a> для компиляции его в ES5. То есть код пишется с помощью современного синтаксиса ES6, а для работы в браузере сразу компилируется в ES5.</p><p>Есть ещё разные способы писать нормальный код, которые сводятся к тому же: код пишется на своём «особом» языке (как в случае с ES6), а потом транслируется в JavaScript. Вот некоторые из этих «особых» языков программирования:</p><ul><li><a href="http://www.typescriptlang.org/">TypeScript</a> — он добавляет к JavaScript множество инструментов из серьёзного программирования — классы, интерфейсы, модули и др., а также упорядочивает типы переменных. Он больше для того, чтобы писать массивную логику, пользуясь приёмами строгой типизации, и подходит скорее для отдельных крупных логических модулей;</li><li><a href="http://coffeescript.org/">CoffeeScript</a> — делает код намного более удобным, понятным, человечным;</li><li>и ещё много разных — <a href="https://www.dartlang.org/">Dart</a>, <a href="http://elm-lang.org/">Elm</a>, я их глубоко не изучал.</li></ul><h3>HTML</h3><p>Для упрощения написания HTML, чтобы не ломать пальцы о теги, стали использовать препроцессоры HTML. Они позволяют, например, вместо громоздкой конструкции &lt;a href="#"&gt;Ссылка&lt;/a&gt; с кучей угловых скобочек писать просто a(href="#") Ссылка, а потом компилировать это всё в HTML. Очень рекомендую сразу же освоить <a href="https://pugjs.org/api/getting-started.html">Pug</a>, сокращающий объем написанного практически вдвое.</p><p>Чтобы удобно вставлять динамические данные в HTML, отделяя данные от разметки, придумали <a href="https://habrahabr.ru/post/219873/">шаблонизаторы</a>. Например, в разметке пишется &lt;h1&gt;{{ title }}&lt;/h1&gt;, запускается шаблонизатор со значением переменной title, и это значение подставляется вместо фигурных скобочек. Теги отдельно, контент отдельно. Можно удобно вставлять динамический контент с помощью циклов и условий — например, передавать массивы объектов и выводить их в таблице.</p><h3>Менеджеры пакетов</h3><p>Чтобы не изобретать велосипеды, разработчики давно научились делиться между собой готовыми участками кода, модулями. Во фронтенде для этого активно используется менеджер зависимостей npm. На <a href="http://npmjs.com/">npmjs.com</a> можно найти огромное количество модулей, плагинов, библиотек на все случаи жизни. Прежде чем писать что-то своё, поищите там.</p><p>Позже появился усовершенствованный менеджер зависимостей <a href="https://yarnpkg.com/lang/en/">Yarn</a>, он делает всё быстрее и стабильнее, не буду сейчас углубляться, почему.</p><h3>Менеджеры задач</h3><p>Для того, чтобы централизованно управлять всем этим зоопарком, появлялись менеджеры задач. Они позволяют в одном месте описать все процессы и этапы сборки приложения. Это <a href="https://gruntjs.com/">Grunt</a>, <a href="https://gulpjs.com/">Gulp</a>, <a href="https://webpack.js.org/">Webpack</a>. Последний — наиболее подходящий для сборки веб-приложения. Он может взять на себя много забот, легко и просто компилировать все ресурсы, будь то скрипты, стили, разметка, картинки — в любом формате (Stylus, Less, Sass, ES6, TypeScript, jpg, png) из любых исходников — в единые бандлы, сборки файлов js, CSS, HTML, которые будут работать в браузере.</p><p>Чтение по теме: <a href="https://tproger.ru/translations/webpack-basics/">Webpack — основы настройки проекта на JavaScript и Sass</a></p><h2>Компонентная архитектура</h2><p>Итак, можно продолжить: сложное начали упрощать, и в ходе упрощения, большого упрощения, Умные Парни решили — всё есть компонент. Кнопка — это компонент, шапка — компонент, выбор города — компонент. Страница — тоже компонент. Компонент может содержать в себе другие компоненты. Получилось крайне просто: такая концепция, как оказалось, пришлась как родная к построению клиентских приложений.</p><p>Что такое компонент? Это самостоятельный и независимый участок разметки со своей логикой и стилями. У компонента есть свое текущее состояние. Открыто ли меню, активна ли вкладка, и т.п. Состояние всего приложения можно представить как дерево состояний различных компонентов.</p><p>Разметка HTML зависит от текущего состояния, изменилось состояние — изменилась разметка. Это реализуется с помощью технологии <a href="https://habrahabr.ru/post/256965/">Virtual Dom</a> — когда DOM (дерево HTML-элементов страницы) рассчитывается сначала виртуально и в конце расчёта отображается в реальном DOM, в разметке. За счёт этой идеи достигли более высокой производительности приложений, ведь одна из самых тяжёлых частей работы браузера — операции с DOM (работа с деревом объектов HTML).</p><p>Здесь важно ввести ещё одно понятие — реактивные приложения. Это, упрощённо говоря, когда вместо прямого изменения DOM/Virtual Dom при изменении данных, вводится объект состояния, модель данных, и на её изменения подписывается обработчик, который уже меняет DOM. То есть чтобы что-то поменять в представлении, HTML (например, таблица со списком пользователей), нам достаточно изменить свойство модели (добавить в массив нового пользователя), всё остальное произойдет само (пользователь появится в html-таблице). Вы, наверное, замечали, что некоторые сайты медленно работают, а другие молниеносны. Скорее всего, первый на jQuery и работает с реальным DOM, второй — на одном из реактивных инструментов, с которыми мы познакомимся далее.</p><h3>React</h3><p>Итак, эти концепции (Virtual Dom, компоненты, реактивность) улеглись в новом инструменте создания клиентских приложений от Facebook — <a href="https://reactjs.org/">React</a>. На текущий момент он является одним из лидеров индустрии, наиболее часто используемым во фронтенде. Он обладает развитой экосистемой — можно найти огромное количество готовых компонентов и дополнений.</p><h3>Управление состоянием</h3><p>Но между компонентами нужно было наладить связь, им нужно общаться между собой. Нажали на кнопку — изменился цвет. Можно строить эту взаимосвязь напрямую, но это быстро может превратиться в кашу. Тут придумали шаблон централизованного управления состоянием, когда есть одно место, где хранится состояние всего приложения в текущий момент времени. Это, сильно упрощая, такой <a href="https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Working_with_Objects">JavaScript-объект со свойствами</a>. Это состояние изменяется с помощью вызова действий и мутаций, но не будем сейчас так углубляться. Паттерн называется <a href="https://habrahabr.ru/post/246959/">Flux</a>. Самая популярная имплементация управления состоянием для React — <a href="https://redux.js.org/">Redux</a>.</p><p><a href="https://reactjs.org/">React</a>, хоть он и обрёл большую популярность и развитую экосистему, на практике оказался слишком голый, сложный, многословный. Для того, чтобы сделать простую форму, нужно много-много лишнего кода написать и кучу дополнений поставить. Для того, чтобы создать простое приложение, нужно ещё много чего установить, и вариантов для простых вещей очень много, легко можно потеряться — экосистема хоть и огромная, но в ней сложно ориентироваться; внешне одинаковые приложения могут быть совсем по-разному устроены внутри. А концепция <a href="http://websketches.ru/react-docs/introducing-jsx">JSX</a> — переплетение кода и разметки, выглядит не столь удачно, сложно потом понимать, что же такое хотел сказать автор кода, сложно менять разметку.</p><h3>Vue.js</h3><p>Тут появился <a href="https://ru.vuejs.org/">Vue.js</a> — гибкий, эффективный и простой в освоении веб-фреймворк, который несёт в себе всё те же концепции, но они в нём выглядят гораздо удачнее. Он объединил в себе всё лучшее из Angular и React, более чётко ответил на вопрос «что есть что». Из коробки Vue содержит уже большое количество инструментов и возможностей, которые в несколько строк позволяют писать объёмную логику. Разработка значительно упростилась.</p><p>Vue принёс ещё несколько интересных концепций, как, например, однофайловые компоненты — файлы, которые содержат в себе сразу логику, разметку и стили, и они там не переплетаются, как в случае с React и JSX. Vue из коробки позволяет использовать любые препроцессоры, которые очень органично вписываются в однофайловые компоненты. И имеет множество готовых встроенных решений, даже свою имплементацию Flux. Vue обладает <a href="https://ru.vuejs.org/v2/guide/">отличной документацией</a> на русском языке, которая научит вас лучшей практике во фронтенде, от сборки приложения до автотестов.</p><h3>Изоморфные приложения, SSR</h3><p>В разговоре об одностраничных приложениях мы упустили одну важную деталь: когда поисковый робот обращается к одностраничному приложению, он ничего не видит — только пустую страницу с тегами body без контента. В старомодных приложениях сервер обратился бы к базе данных, сгенерировал представление и отдал бы готовый HTML с текстом страницы. В случае с одностраничным приложением сервер отдаёт пустую страницу, которая лишь после инициализации подтягивает данные и показывает представление, чего конечно же поисковый робот не сделает. Таким образом, использовать одностраничные приложения для сайтов, ориентированных на контент, SEO, недопустимо.</p><p>Это недопущение обходилось множеством хаков и костылей, пока не появилась концепция SSR — <a href="https://ssr.vuejs.org/ru/">Server-Side Rendering</a>. Умные Парни научили весь JavaScript, который работал в браузере, выполняться на сервере с помощью <a href="https://nodejs.org/en/">NodeJS</a> (технология создания серверных приложений с помощью браузерного языка JavaScript). Это, конечно, ввело свои ограничения, но жить стало легче. Теперь можно было написать логику один раз на одном языке, и она сразу же работала и на сервере (при первом обращении посетителя/робота генерировался HTML с контентом страницы) и в браузере (последующие переходы посетителя). Это и называется изоморфное, универсальное приложение.</p><p>Схема простая: при первом заходе посетитель отправляет запрос на сервер NodeJS, который обращается к API-серверу, берёт данные в виде <a href="https://learn.javascript.ru/json">JSON</a> и отрисовывает их в HTML, возвращая посетителю. Дальше уже приложение живёт в браузере, при последующих переходах по страницам оно напрямую обращается к API-серверу за данными и уже непосредственно в браузере отрисовывает представление.</p><p>В React имплементация этой схемы делается разными и сложными путями. В качестве готовых решений есть для этого, например, фреймворк <a href="https://learnnextjs.com/">Next.js</a>. В документации Vue есть <a href="https://ru.vuejs.org/v2/guide/ssr.html">целый раздел</a>, посвященный SSR. Там указан фреймворк <a href="https://ru.nuxtjs.org/">Nuxt</a> — Vue + SSR. С его помощью можно довольно легко писать такие универсальные приложения.</p><h2>CSS-фреймворки, адаптивность</h2><p>Теперь мы сменим тему на попроще и поговорим о вёрстке.</p><p>Исторически, чтобы создать сетку страницы, её каркас, в первые времена верстальщики использовали <a href="http://htmlbook.ru/content/tablichnaya-verstka">таблицы</a>. Потом начали использовать блоки, или контейнеры, появилась <a href="http://fb.ru/article/146135/blochnaya-verstka-tegov-div-html">контейнерная вёрстка</a>. Положение блоков устанавливалось с помощью свойства позиционирования float: right/left.</p><p>В настоящее время всё упрощается, уже почти все браузеры поддерживают <a href="http://html5.by/blog/flexbox/">Flexbox</a> и <a href="https://habrahabr.ru/post/325760/">CSS Grid</a> — современные удобные способы верстать сетку страницы. Их умелое сочетание позволяет в несколько свойств добиваться таких положений контейнеров, над которыми пришлось бы старыми методами изрядно попотеть, позволяя с лёгкостью выполнить практически любые дизайнерские изыски.</p><p>Чтение по теме: <a href="https://tproger.ru/translations/css-flexbox-grid/">Flexbox и Grid — знакомство с CSS-вёрсткой</a></p><p><a href="https://tproger.ru/translations/responsive-web-design-tips/">Адаптивность</a> — это способность страницы выглядеть одинаково хорошо на всех устройствах, будь то ноутбук, планшет или мобильный телефон. Адаптивность достигается с помощью <a href="https://html5book.ru/css3-mediazaprosy/">медиа-запросов</a> — блоков условий в CSS, при каких разрешениях экрана какие CSS-свойства должны работать. Её можно также добиться с помощью умелого применения flexbox-контейнеров.</p><p>Все веб-приложения в основном типичны, состоят из строк, колонок, таблиц, кнопок и других UI-элементов. Чтобы не писать их каждый раз, в помощь сайтостроителям создавались CSS-фреймворки, где вся разметка уже продумана — достаточно применить нужный класс. Они содержат в себе множество готовых UI-элементов. Самый популярный — конечно же <a href="http://getbootstrap.com/">Bootstrap</a>, сейчас уже 4-я версия. Есть ещё <a href="https://bulma.io/">Bulma</a>, тоже довольно хороший. И ещё множество менее популярных. Обычно в CSS-фреймворках адаптивность идёт из коробки, важно лишь правильно пользоваться предлагаемыми инструментами. CSS-фреймворки станут отличной основой практически в любом вашем веб-приложении и хорошим началом освоения навыков правильной вёрстки. Их стоит использовать, когда нужны типичные элементы пользовательского интерфейса, адаптивность, а это 99% кейсов в вебе.</p><h3>Кроссбраузерность</h3><p>Это слово означает способность сайта отображаться одинаково в разных браузерах. Как правило, CSS-фреймворки берут эту заботу на себя, но я вкратце расскажу, как это достигается. Для начала нужно обнулить все свойства стандартных элементов (разные браузеры отображают стандартные элементы — списки, таблицы и др. по-разному). В CSS-фреймворках для этого часто можно увидеть специальный файлик — <a href="https://meyerweb.com/eric/tools/css/reset/">reset.css</a>. Следующее — исторически так сложилось, что браузеры развивались по-разному, и теперь некоторые CSS-свойства нужно прописывать специально для каждого браузера, используя <a href="https://itchief.ru/lessons/html-and-css/css-browser-prefixes">префиксы</a> — -webkit, -moz. Эту работу можно делать автоматически с помощью вышеупомянутого <a href="http://postcss.org/">PostCSS</a> и его <a href="https://github.com/postcss/autoprefixer">autoprefixer</a>.</p><h3>Методологии</h3><p>Чтобы вёрстка не превратилась в суп, ничего внезапно не ехало, всё было чётко и красиво — существуют специальные подходы, сборники правил о том, как называть тот или иной класс. Они очень вписываются в компонентную архитектуру, надо сказать, с них она и началась. Правило то же — всё есть компонент, или по-другому «блок». У блока есть свои элементы, мини-блоки, из которых и состоит блок. Изменяют отображение блока модификаторы, применяя к нему то или иное свойство. Изучите <a href="https://ru.bem.info/methodology/quick-start/">БЭМ</a> от Яндекса или <a href="http://suitcss.github.io/">SUIT CSS</a>, прежде чем начинать заниматься верстанием.</p><h2>В путь!</h2><p>Надеюсь, к концу статьи у вас уже сложилось более-менее полное и широкое понимание всех аспектов фронтенда. Теперь вам остаётся лишь его углублять, следуя шаг за шагом. Предложу вам план этих шагов, как стать профессиональным фронтендером:</p><ol><li>Изучите основы вёрстки — HTML, CSS. Хватит только основ — остальное наработается в процессе решения задач. Сразу для работы поставьте себе редактор <a href="https://code.visualstudio.com">VS Code</a>. Отдельное внимание уделите навыкам работы с <a href="http://html5.by/blog/flexbox/">Flexbox</a> и <a href="https://habrahabr.ru/post/325760/">CSS grid</a>.</li><li>Изучите <a href="http://getbootstrap.com">Bootstrap</a> или <a href="http://bulma.io">bulma.io</a>. Попробуйте создать каркас простого сайта с их помощью; изучите их исходники, они дадут вам хорошее понимание правильной архитектуры проекта. Примерно уже здесь, а лучше как можно раньше, пробуйте собирать какие-нибудь проектики, решать какие-нибудь задачки, нарабатывайте практику.</li><li>Изучите <a href="https://learn.javascript.ru/first-steps">JavaScript</a>. Да, тут тоже хватит только основ. Пробегитесь по синтаксису ES6, чтобы примерно его понимать. Попробуйте разобрать, как реализованы те или иные UI-компоненты в вышеупомянутых CSS-фреймворках.</li><li>Изучите основы <a href="https://git-scm.com/book/ru/v2">Git</a>. Это система контроля версий, и она уже на данном этапе хорошо вам послужит, позволит фиксировать поэтапно изменения в коде и хранить их.</li><li>Изучите <a href="https://ru.bem.info/methodology/quick-start/">BEM</a>/<a href="http://suitcss.github.io">SuitCSS</a>, что больше понравится.</li><li>Поймите синтаксис <a href="http://stylus-lang.com">Stylus</a> и <a href="https://pugjs.org/api/getting-started.html">Pug</a>.</li><li>Начните изучать документацию к <a href="http://ru.vuejs.org">Vue.js</a>. Она предельно понятна и на русском языке. В процессе изучения вы узнаете множество смежных вещей — компонентная архитектура, сборка с помощью webpack, работа с API, SSR, flux, автотестирование.</li><li>Пробегитесь по библиотеке <a href="http://lodash.com">lodash</a> — она вам очень поможет при написании кода на JavaScript, для более лаконичного кода без велосипедов.</li><li>Изучите автотестирование фронтенда. Это важный пункт, если вы сразу его освоите, облегчите себе дальнейшую жизнь. Не откладывайте его на потом. Рекомендую такие инструменты, как <a href="https://facebook.github.io/jest/">Jest</a> и <a href="https://devexpress.github.io/testcafe/">TestCafe</a>. В Vue.js есть <a href="http://vue-test-utils.vuejs.org/ru/guides/getting-started.html">хороший инструментарий</a> для автотестов из коробки.</li><li>Создайте собственное приложение, используя полученные знания. Придумайте идею или возьмите ту, что у вас давно сидит в голове; не просто так вы ведь решили стать программистом! В дополнение изучите транслируемые в JavaScript языки — <a href="http://www.typescriptlang.org">TypeScript</a>, <a href="http://coffeescript.org/">CoffeeScript</a>.</li></ol><p>Готово! Дальше только практика, вернее, она должна была начаться с первого пункта, а сейчас достигнуть своего апогея. Теперь вы мастер фронтенда! Хотя кто знает, может, к тому времени опять выйдет в свет какой-нибудь инструмент, который всё перевернёт во фронтенде, и придётся полностью менять свои понимания?</p><p>Глубоко в каждой теме не закапывайтесь, не старайтесь всё сразу запомнить. Главное — помнить, где и что посмотреть. Никогда не будет лишним повторить основы. Полезно общаться в комьюнити и желательно иметь живого, пусть даже удалённого, наставника, который поможет направить в случае застоя. Помните, что лучшее понимание приходит в процессе решения задач.</p><h2>Часто задаваемые вопросы</h2><h3>С какого языка лучше начать изучение фронтенда?</h3><p>Начинать стоит с HTML и CSS — это основа любой веб-страницы. HTML отвечает за структуру и содержание, CSS — за визуальное оформление. Когда освоите базовую вёрстку, переходите к JavaScript — он отвечает за логику и интерактивность. Эти три технологии составляют фундамент фронтенд-разработки.</p><h3>React или Vue.js — что выбрать новичку?</h3><p>Для начинающих Vue.js часто проще в освоении: он имеет отличную документацию на русском языке, содержит больше инструментов из коробки и чётко разделяет логику, разметку и стили. React обладает более обширной экосистемой и чаще встречается в вакансиях, но требует установки множества дополнительных библиотек. Оба фреймворка востребованы на рынке.</p><h3>Нужно ли изучать jQuery в 2026 году?</h3><p>jQuery сыграла важную роль в истории фронтенда, но в современной разработке её заменили нативные возможности JavaScript (ES6+) и компонентные фреймворки (React, Vue.js). Изучать jQuery с нуля не стоит, но полезно знать о её существовании — вы можете встретить её в поддержке старых проектов.</p><h3>Сколько времени нужно, чтобы стать frontend-разработчиком?</h3><p>При системном подходе и ежедневной практике базовый уровень (HTML, CSS, JavaScript, один фреймворк) можно освоить за 6-12 месяцев. Однако фронтенд постоянно развивается, и профессиональный рост продолжается всю карьеру. Главное — не пытаться выучить всё сразу, а двигаться по плану, закрепляя знания на практических проектах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как разобраться в Computer Science самостоятельно</title>
      <link>https://tproger.ru/curriculum/computer-science-step-by-step</link>
      <comments>https://tproger.ru/curriculum/computer-science-step-by-step?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/computer-science-step-by-step</guid>
      <description><![CDATA[<p>Как изучить Computer Science самостоятельно: 9 дисциплин — программирование, алгоритмы, ОС, сети, базы данных. Лучшие книги и бесплатные курсы MIT и Беркли.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/computer-science-step-by-step">Как разобраться в Computer Science самостоятельно</a>»</p>]]></description>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 08 Mar 2018 13:44:12 GMT</pubDate>
      <content:encoded><![CDATA[<p>Для большинства программистов Computer Science — факультет в зарубежных вузах, целиком и полностью посвящённый программированию, математике и всему, что связано с разработкой программного обеспечения. К счастью, в современном мире необязательно инвестировать тысячи долларов и 4 года своей жизни в образование, ведь существует бесчисленное множество онлайн-курсов, книг и других ресурсов для изучения компьютерных наук.</p><p>Приводить сотни всевозможных материалов для программистов-самоучек мы не будем, а лишь попытаемся ответить на два главных вопроса:</p><ul><li>Какие дисциплины следует изучать и почему?</li><li>Какие из доступных ресурсов, книг, серий лекций для конкретной дисциплины имеет смысл посмотреть?</li></ul><p>В качестве ответа приведём список материалов, опубликованный Озаном Онай (Ozan Onay) и Майлзом Бёрном (Myles Byrne) — инструкторами в школе компьютерных наук Брэдфилда в Сан-Франциско. Данная подборка литературы и курсов основана на личном опыте обучения сотен программистов-самоучек.</p><p><b>Ключевые выводы:</b><br />— Computer Science — это фундамент, который отличает высокооплачиваемых инженеров от тех, кто просто знает инструменты<br />— Девять ключевых дисциплин: программирование, архитектура ЭВМ, алгоритмы, математика, ОС, сети, базы данных, компиляторы, распределённые системы<br />— Для каждой дисциплины есть одна лучшая книга и одна лучшая серия лекций — не нужно перебирать сотни ресурсов<br />— Практика через проекты (написать компилятор, HTTP-сервер, БД) важнее, чем просто чтение теории<br />— Порядок изучения не строг, но архитектуру ЭВМ лучше освоить до операционных систем и баз данных</p><h2>Зачем изучать компьютерные науки?</h2><p>Существует два типа программистов: те, кто владеют компьютерными науками достаточно хорошо, чтобы совершать инновации, и те, кто вроде как что-то могут благодаря знанию пары-тройки высокоуровневых инструментов.</p><p>И те и другие называют себя программистами или инженерами программного обеспечения и имеют примерно одинаковые доходы в начале своей карьеры. Однако первые в итоге становятся более высокооплачиваемыми специалистами. Причём абсолютно неважно, работают они над известными, дорогими и большими коммерческими проектами или над инновационными open-source проектами различной сложности. Они становятся лидерами в своей области и привносят нечто большее и более качественное на рынок.</p><p>Они углубленно изучают компьютерные науки, читая книги, слушая лекции, практикуясь или же упорно поглощая материал на личном опыте в своей карьере. Вторые же обычно остаются на дне, изучая различные инструменты и технологии для своей работы, а не то, на чём эти технологии основаны. Для них причиной для изучения чего-то нового является появление новых инструментов и, следовательно, устаревание старых.</p><p>На данный момент число людей в индустрии постоянно растёт, а число выпускников с факультета компьютерных наук остаётся неизменным. Перенасыщение рынка инженерами второго типа в итоге приводит оных к безработице или к сравнительно дешевому трудоустройству. Вне зависимости от ваших стремлений: хотите вы стать инженером первого типа или просто ищете способ заработать немного денег, изучение Computer Science — единственный надёжный путь для этого. Подробнее о том, <a href="https://tproger.ru/translations/google-guide-to-programming/">как стать хорошим программистом</a>, рассказывает Google в своём руководстве.</p><h2>Дисциплины</h2><h3>Программирование</h3><p><b>Лучшая книга:</b></p><p><b>Лучшая серия лекций:</b> <a href="https://www.youtube.com/watch?v=4leZ1Ca4f0g&amp;list=PLhMnuBfGeCDNgVzLPxF9o5UNKG1b-LFY9">Brian Harvey's Berkeley CS 61A</a></p><p>Львиная доля студентов Computer Science начинают с «вводных курсов» по программированию. Однако такие курсы будут полезны не только новичкам, но и вполне себе специалистам, которые по какой-либо причине пропустили некоторые базовые для программирования вещи.</p><p>Мы рекомендуем взять во внимание классическую <a href="http://newstar.rinet.ru/~goga/sicp/sicp.pdf">«Структуру и интерпретацию компьютерных программ»</a>. Прочтите как минимум три главы приведенной выше книги, выполняя упражнения для практики. Для тех, кому данная книга кажется слишком сложной, рекомендуется «How to design programs». Тем же, кому она наоборот кажется слишком лёгкой, следует обратить внимание на <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.102.7366&amp;rep=rep1&amp;type=pdf">«Concepts, Techniques, and Models of Computer Programming»</a>.</p><p>Можно также послушать <a href="https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/video-lectures/">лекции</a> университета MIT по данной теме. Как альтернативу мы рекомендуем прослушать <a href="https://archive.org/details/ucberkeley-webcast-PL3E89002AA9B9879E?sort=titleSorter">лекции Брайана Харви</a> из университета Беркли, особенно, если для вас это в новинку.</p><p>Для дополнительной практики возьмите на заметку ресурс <a href="http://exercism.io/">Exercism</a>: на нём можно найти сотни интересных задачек по программированию, которые помогут вам в освоении синтаксиса разных языков программирования и прокачают ваше логическое мышление, которое необходимо программисту, как воздух.</p><h3>Архитектура ЭВМ</h3><p><b>Лучшая книга:</b></p><p><b>Лучшая серия лекций:</b> <a href="https://www.youtube.com/watch?v=2WDdFEMC7a4&amp;list=PLPj7zH6RMqHs-hypGyogmEIgJSSWgFJ1w">Berkeley CS 61C</a></p><p>Архитектура ЭВМ, также иногда называемая «компьютерными системами» или «организацией компьютера» — достаточно важная тема, описывающая работу аппаратного слоя, который лежит на уровень ниже, чем слой программного обеспечения. Пожалуй, самая недооцененная область среди инженеров-самоучек.</p><p><a href="http://f.javier.io/rep/books/The%20Elements%20of%20Computing%20Systems.pdf">The elements of Computing Systems</a> — амбициозная книга, которая даёт понимание того, как работает компьютер. Каждая глава — строение одной маленькой детали большой системы: от написания логики на HGL (языке описания аппаратуры) через центральный процессор к созданию тетриса.</p><p>Мы рекомендуем прочесть как минимум первые 6 глав книги и завершить указанный в ней проект. Это поможет лучше понять отношения между архитектурой компьютера и программным обеспечением, которое на ней работает.</p><p>Не ищите простого объяснения сложных вещей в этой книге — автор заходит издалека. Если конкретнее, то в книге, например, почти полностью отсутствуют два очень важных концепта в современной архитектуре ЭВМ — вычислительный конвейер и иерархия памяти.</p><p>Как только вы почувствуете себя в своей тарелке, читая эту книгу, смело переходите на <a href="http://ac.aua.am/Arm/Public/2017-Spring-Computer-Organization/Textbooks/ComputerOrganizationAndDesign5thEdition2014.pdf">Computer Organization And Design</a>, отличный текст, который стал своего рода классикой. Также обратите внимание на курс <a href="http://inst.eecs.berkeley.edu/~cs61c/sp15/">CS61C</a>, лекции которого доступны онлайн.</p><h3>Алгоритмы и структуры данных</h3><p><b>Лучшая книга:</b></p><p><b>Лучшая серия лекций:</b> <a href="https://www.youtube.com/user/StevenSkiena">Лекции Стивена Скиены</a></p><p>Мы полностью согласны с народной мудростью, которая гласит, что знание алгоритмов и структур данных — один из важнейших аспектов изучения компьютерных наук. К тому же, это отличный способ потренироваться в способности решать разного рода задачи, которые пригодятся в любой области компьютерных наук.</p><p>Есть сотни книг для изучения алгоритмов, но наш фаворит — «Алгоритмы Руководство по разработке» от Стивена Скиены. Наш выбор пал именно на неё, потому что автор определенно любит то, что он делает и хочет донести свои знания до читателя.</p><p>Для тех же, кто предпочитает лекции в формате видео, Скиена предлагает свой <a href="http://www3.cs.stonybrook.edu/~algorith/video-lectures/">онлайн-курс</a>. Также следует обратить внимание на курс Тима Рафгардена, доступного на Lagunita (сервис от университета Стэнфорда) или на <a href="https://www.coursera.org/specializations/algorithms">Coursera</a>. Материал обоих авторов очень полезен и информативен и кому из них уделить внимание — решать вам.</p><p>Мы практикуемся, решая задачи на <a href="https://leetcode.com/">Leetcode</a>, потому что их задачи кажутся нам наиболее интересными. К тому же у каждой задачи есть ветка обсуждения и прикрепленное решение для самопроверки. Стоит отметить, что подобного рода задачи могут являться вопросами на интервью — взгляните на нашу подборку <a href="https://tproger.ru/articles/problems/">123 задачи с IT-собеседований с разбором решений</a>. Для проверки своего знания алгоритмов решите 100 случайных задач на Leetcode.</p><p>В завершение, мы настоятельно рекомендуем <a href="https://notendur.hi.is/hei2/teaching/Polya_HowToSolveIt.pdf">How to solve it</a> — великолепный материал для практики решения задач. Подходит как тем, кто изучает компьютерные науки, так и математикам.</p><h3>Математика для компьютерных наук</h3><p><b>Лучшая книга: </b></p><p><b>Лучшая серия лекций: </b><a href="https://www.youtube.com/watch?v=L3LMbpZIKhQ">Tom Leighton's MIT 6.042J </a></p><p>В каком-то смысле компьютерные науки — это лишь область прикладной математики. Пока некоторые программисты пытаются и возможно преуспевают в попытках оставаться вдали от математики, мы рекомендуем не уподобляться им и изучать её. Ведь знание математики даст вам значительную фору по сравнению с другими программистами, которые математику игнорируют.</p><p>В основе большая часть математики для компьютерных наук — дискретная математика, где слово «дискретная» — прямая противоположность слову «непрерывная» и, грубо говоря, является сборником интересных тем в прикладной математике, за пределами математического анализа. Немного расплывчато, согласны. Впрочем, это не так важно: можно поставить себе цель изучить базовую логику, комбинаторику, теорию вероятности, теорию графов, основы криптографии. Линейная алгебра не менее прочего заслуживает вашего внимания, особенно для изучения компьютерной графики или машинного обучения.</p><p>Хорошим началом изучения дискретной математики является <a href="http://www.cs.elte.hu/~lovasz/dmbook.ps">сборник лекций от László Lovász</a>. Профессор проделал хорошую работу, чтобы сделать математику понятной и интуитивной, так что его работы куда больше подойдут новичкам, чем формальные математические тексты.</p><p>Для большего погружения советуем <a href="https://courses.csail.mit.edu/6.042/spring17/mcs.pdf">Mathematics for Computer Science</a> — записи с лекций по одноименному курсу MIT, которые по объёму тянут на полноценную книгу. Видео данных лекций, кстати, тоже в <a href="https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/video-lectures/">свободном доступе</a>.</p><p>Для линейной алгебры мы предлагаем начать с плейлиста Основы линейной алгебры.</p><h3>Операционные системы</h3><p><b>Лучшая книга: </b></p><p><b>Лучшая серия лекций: </b><a href="https://www.youtube.com/watch?v=feAOZuID1HM&amp;list=PLggtecHMfYHA7j2rF7nZFgnepu_uPuYws">Berkeley CS 162</a></p><p>Operating System Concepts и <a href="http://www.ece.sunysb.edu/~yang/333slides/MOS-3e-04.pdf">Modern Operating Systems</a> — классика в вопросе операционных систем. Обе довольно часто подвергались критике в основном за то, что не являются 1000-страничными быстроустаревающими энциклопедиями, новое издание которых приходится покупать каждые пару лет.</p><p>Существует ещё одна книга по операционным системам, которую мы также очень рекомендуем к ознакомлению. <a href="http://pages.cs.wisc.edu/~remzi/OSTEP/">Three Easy Pieces</a>: структура повествования книги делает её легкой к восприятию, а задания помогут закрепить полученные знания.</p><p>После прочтения указанных выше книг имеет смысл пройтись по конкретным операционным системам и прочесть следующее: <a href="http://www.lemis.com/grog/Documentation/Lions/book.pdf">A commentary on the unix operating system</a>, The design and implementation of the freeBSD operating systems и Mac OS internals.</p><p>Идеальный способ закрепить полученные знания — это прочесть код небольшого ядра и внести в него свои изменения. Как вариант можно взять XV6 — современную реализацию 6 версии Unix для архитектуры x86, написанную на ANSI C. В приведённой выше Three Easy Pieces есть раздел с заданиями с XV6, полный интересных идей для потенциальных проектов.</p><h3>Компьютерные сети</h3><p><b>Лучшая книга: </b></p><p><b>Лучшая серия лекции: </b><a href="https://www.youtube.com/watch?v=nh970YyKRDA&amp;list=PLvFG2xYBrYAQCyz4Wx3NPoYJOFjvU7g2Z">Stanford CS 144</a></p><p>Учитывая то, что львиная доля работы у программистов целиком и полностью опирается на веб-сервера, компьютерные сети — одна из самых важных областей компьютерных наук. Программисты-самоучки, которые методично изучают компьютерные сети, хвастают тем, что гораздо лучше многих понимают термины, концепты, протоколы, которыми постоянно окружены в своей карьере.</p><p>Наш фаворит в этом вопросе — <a href="https://files.ttuwiki.org/Computer_Networking_second_edition_rus.pdf">Computer Networking: A Top-Down Approach</a>. Небольшие проекты и задания для практики на протяжении всего материала весьма интересны и стоят вашего внимания. Также следует обратить внимание на <a href="http://www-net.cs.umass.edu/wireshark-labs/">Wireshark labs</a>, любезно предоставленные автором книги.</p><p>Для тех же, кто предпочитает просмотр лекций чтению книг, мы рекомендуем серию лекций от университета Стэнфорд <a href="https://www.youtube.com/watch?v=nh970YyKRDA&amp;list=PLvFG2xYBrYAQCyz4Wx3NPoYJOFjvU7g2Z">Stanford CS 144</a>.</p><p>Небольшие проекты, как ни странно, более полезны для освоения компьютерных сетей, нежели задачки. Некоторые из них — HTTP сервер, чат-приложение на UDP, <a href="https://jvns.ca/blog/2014/08/12/what-happens-if-you-write-a-tcp-stack-in-python/">мини TCP stack</a> или же распределённая таблица хэшей и т.д.</p><h3>Базы данных</h3><p><b>Лучшая книга: </b></p><p><b>Лучшая серия лекций: </b><a href="https://www.youtube.com/watch?v=IZmWm9YP_kg&amp;list=PLItyOfErSadfnXtWkFX5yA7PQ8j8ZpORE">Joe Hellerstein's Berkeley CS 186</a></p><p>Изучение баз данных требует куда большего упорства, чем нужно для других тем, так как базы данных —относительно новая область компьютерных наук (с 1970-ых). Её основы скрыты от нас по вполне себе понятным коммерческим причинам. К тому же многие потенциальные авторы книг по базам данных предпочли сами стать разработчиками и основали свои компании.</p><p>Учитывая приведенные выше обстоятельства, мы настоятельно рекомендуем новичкам избегать книжек и начинать прямиком с записей <a href="https://archive.org/details/UCBerkeley_Course_Computer_Science_186">CS186 весны 2015</a> от Джо Геллерштейна из университета Беркли. После данного курса уже можно переходить к книжкам.</p><p>Одна из них — это <a href="http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf">Architecture of a Database System</a> от того же профессора из того же университета. Книга даст читателю углубленный взгляд на реляционные базы данных и послужит отличным скелетом для будущих знаний в этой области.</p><p><a href="http://www.redbook.io/">Readings in Database Systems</a>, также известная как красная книга по базам данных (никто не вымирает), представляет собой сборник публикаций по данной теме. Для тех, кто осилил CS186, эта книга может стать следующей остановкой.</p><p>Если вы настаиваете на том, чтобы начинать изучение баз данных по книжкам, то советуем обратить внимание на <a href="http://pages.cs.wisc.edu/~dbbook/openAccess/thirdEdition/solutions/ans3ed-oddonly.pdf">Database management systems</a>.</p><p>Сложно закрепить знания в этой области без практики. Студенты CS186 работают над дополнениями для Spark, однако лучшей практикой для начинающих будет всё же написание своей реляционной базы данных с нуля. Скорее всего, она поначалу не будет богата уникальными особенностями, но значительно укрепит ваше понимание темы.</p><p>Под конец, моделирование данных — один из самых пренебрегаемых аспектов в изучении баз данных. Здесь нашим фаворитом является <a href="https://www.amazon.com/Data-Reality-Perspective-Perceiving-Information/dp/1935504215">Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World</a>.</p><h3>Языки и компиляторы</h3><p><b>Лучшая книга: </b></p><p><b>Лучшая серия лекций: </b><a href="https://www.youtube.com/watch?v=sm0QQO-WZlM&amp;list=PLFB9EC7B8FE963EB8">Alex Aiken's course on Lagunita</a></p><p>Большинство программистов изучают языки программирования, в то время как специалисты компьютерных наук пытаются понять, как эти языки работают. Эти знания позволяют им опережать своих коллег по карьерной лестнице и быстрее схватывать новый материал. Не случайно в <a href="https://tproger.ru/articles/junior-middle-senior-developers-differences/">отличиях junior, middle и senior разработчиков</a> знание основ CS называется одним из ключевых факторов роста.</p><p>Классикой в данном вопросе является <a href="http://www.informatik.uni-bremen.de/agbkb/lehre/ccfl/Material/ALSUdragonbook.pdf">Compilers: Principles, Techniques and Tools</a>. К сожалению, этот материал больше подходит учителям, нежели самоучкам. Однако книга отлично подойдёт для непоследовательного чтения, для выхватывания отдельных кусков из материала и изучения по ним. К тому же, если у вас будет учитель, это лишь ускорит ваше обучение.</p><p>Если же вы решите учиться по данной книге без учителя, то настоятельно рекомендуем обратить внимание на <a href="https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/about">серию лекций от Алекса Айкена</a> из Стэнфордского университета.</p><p>Потенциальной альтернативой этой книге может стать Language Implementation Patterns. Она написана с упором на инженеров, которые собираются практиковаться на языках вроде DSL.</p><p>В качестве проекта для закрепления материала можно написать свой компилятор для простенького языка вроде <a href="https://en.wikipedia.org/wiki/Cool_(programming_language)">COOL</a>. Те, кому данный проект кажется невыполнимым, могут начать с чего-то вроде <a href="https://github.com/kanaka/mal">Make a Lisp</a>.</p><h3>Распределённые системы</h3><p><b>Лучшая книга: </b></p><p>Число компьютеров и их разнообразие увеличилось за последние несколько десятков лет. Если раньше крупные компании закупали огромные сервера для обеспечения работы каких-либо программ, то сегодня нам кажется очевидным тот факт, что даже самые незначительные программы работают на нескольких компьютерах одновременно. Распределённые системы — наука о том, как это обеспечить.</p><p>Книга, которую мы хотим посоветовать, — Distributed Systems, третье издание которой служит прекрасным дополнением всем предыдущим. Учитывая то, что распределенные системы — область, которая достаточно часто меняется, нет уникальной книги, которая проведёт вас по этому тернистому пути. Приведённая же выше книга, по нашему мнению, наиболее близка к этому идеалу.</p><p>Можно также обратить внимание на серию лекций <a href="https://www.youtube.com/watch?v=hBWfjkGKRas&amp;list=PLkcQbKbegkMqiWf7nF8apfMRL4P4sw8UL">MIT 6.824</a>, но, к сожалению, качество записи звука оставляет желать лучшего.</p><p>Не имеет значения, какую книгу или сторонний ресурс вы выбрали для изучения распределённых систем, погружение в эту область компьютерных наук требует от студента чтения большого количества литературы. <a href="http://dsrg.pdos.csail.mit.edu/papers/">Здесь</a> вы можете найти список полезных книг.</p><h2>Часто задаваемые вопросы</h2><h3>Что насчет искусственного интеллекта и графики?</h3><p>Мы постарались ограничить наш материал списком дисциплин, которым, как нам кажется, любой практикующий инженер должен владеть вне зависимости от специальности и индустрии. С таким фундаментом знаний вы сможете гораздо быстрее схватывать новый материал из книг или сторонних ресурсов. Что касается ИИ и графики, вот наш список рекомендуемых материалов:</p><ul><li>ИИ: пройдите <a href="http://ai.berkeley.edu/home.html">введение в ИИ от университета Беркли</a> и выполните проект Pacman. Прочтите великолепную книгу от Рассела и Новрига Artificial Intelligence: A Modern Approach;</li><li>Машинное обучение: пройдите <a href="https://ru.coursera.org/learn/machine-learning">этот</a> курс на Coursera и убедитесь, что действительно понимаете смысл повествования и основы машинного обучения, прежде чем переходить на Deep Learning;</li><li>Графика: ознакомьтесь с серией лекций из университета Беркли <a href="https://cs184.eecs.berkeley.edu">CS184</a> и прочтите книгу Computer Graphics: Principles and Practice.</li></ul><h3>Насколько важно строго следовать порядку, приведённому в статье?</h3><p>На самом деле, все 9 дисциплин достаточно часто пересекаются. К примеру, возьмите дискретную математику и алгоритмы: изучение математики поможет вам в освоении алгоритмов. Знание алгоритмов, в свою очередь, даст стимул погрузиться в дискретную математику. В идеальном сценарии программист достаточно часто повторяет данный материал в своей карьере.</p><p>По существу наша последовательность сконструирована таким образом, чтобы помочь вам начать. Если у вас есть непреодолимое желание следовать другой последовательности, мы не настаиваем. Однако мы считаем, что освоить архитектуру ЭВМ нужно перед освоением операционных систем и баз данных, а компьютерные сети и операционные системы перед распределёнными системами.</p><h3>Что общего у данного списка с Open Source Society или FreeCodeCamp?</h3><p>Первый содержит слишком много дисциплин для изучения, предлагает не самые лучшие материалы для большинства из них и не даёт понять, какие аспекты конкретной дисциплины наиболее ценны. Мы же попытались ограничить наш материал списком дисциплин, которые должен знать каждый инженер, вне зависимости от специальности.</p><p>Касательно FreeCodeCamp, данный ресурс сконцентрирован на программировании, а не на компьютерных науках.</p><h3>А где же язык X?</h3><p>Изучение конкретного языка программирования — совершенно другая плоскость, нежели изучение компьютерных наук. Изучение языка программирования — задача наиболее простая и менее ценная. Если вы уже знаете пару-тройку языков, то советуем просто следовать нашему списку дисциплин, оставляя языки на потом. Если вы знаете программирование в целом достаточно хорошо и знаете, как работают компиляторы, вам потребуется не больше недели, чтобы выучить новый язык программирования.</p><h3>Почему вы до сих пор рекомендуете книжку с драконами (Compilers: Principles, Techniques and Tools)?</h3><p>Потому что книжка с драконами до сих пор является полным и актуальным источником информации по компиляторам. Проблема в том, что никто и предположить не мог, что в итоге книга окажется инструкцией для преподавателей по составлению учебной программы. Вы же можете воспользоваться этим для составления своей собственной программы или следуя программе какого-либо преподавателя.</p><h3>Сколько времени нужно, чтобы освоить Computer Science самостоятельно?</h3><p>При занятиях по 10-20 часов в неделю полное прохождение всех девяти дисциплин займёт от 1 до 2 лет. Однако важно понимать, что Computer Science — это не спринт, а марафон. Многие инженеры продолжают углублять свои знания на протяжении всей карьеры. Начните с программирования и алгоритмов — это даст наиболее быструю отдачу.</p><h3>Можно ли изучить Computer Science без знания английского языка?</h3><p>Часть рекомендованных книг переведена на русский, но большинство качественных лекций и курсов доступны только на английском. Знание английского на уровне чтения технической литературы — практически обязательное условие для серьёзного изучения компьютерных наук. Если ваш английский пока слабый, начните с переведённых книг и параллельно подтягивайте язык.</p><h3>Нужно ли высшее образование, если я изучу всё из этого списка?</h3><p>Формальный диплом по-прежнему важен для некоторых компаний и позиций, особенно в крупных корпорациях и при иммиграции. Однако знания из этого списка полностью покрывают программу бакалавриата по Computer Science в ведущих университетах. Если вы можете подтвердить свои знания на практике — через проекты, вклад в open-source или успешные собеседования — многие работодатели примут это наравне с дипломом. Посмотрите, <a href="https://tproger.ru/articles/junior-developer-should-know/">что должен знать Junior-разработчик</a>, чтобы понять, с чего стоит начать путь в профессию.</p>]]></content:encoded>
    </item>
    <item>
      <title>Хочу стать веб-разработчиком: подробный план по изучению JavaScript</title>
      <link>https://tproger.ru/curriculum/javascript-curriculum</link>
      <comments>https://tproger.ru/curriculum/javascript-curriculum?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/curriculum/javascript-curriculum</guid>
      <description><![CDATA[<p>Учебный план охватывает основы JavaScript, Git, алгоритмы и структуры данных, а также Node.js, Electron, NativeScript и React Native.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/curriculum/javascript-curriculum">Хочу стать веб-разработчиком: подробный план по изучению JavaScript</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Партнёрский материал]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <category><![CDATA[Планы обучения]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 19 Jun 2017 09:20:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Веб-разработка — одно из самых простых и оттого популярных направлений среди начинающих программистов. Для работы достаточно любого текстового редактора и браузера, не нужно изучать алгоритмы на продвинутом уровне, результат каждого этапа написания программы нагляден — в общем, преимуществ много. Ключевым навыком в контексте веб-разработки считается знание JavaScript.</p><p>Сейчас JavaScript очень быстро развивается, а потому при изучении языка легко запутаться. Мы предлагаем вашему вниманию учебный план с удобной структурой, который охватывает все необходимые аспекты JavaScript и смежных технологий.</p><h2>Почему JavaScript?</h2><p>Стоит отметить открытость языка — компании, обычно соперничающие друг с другом, сотрудничают с целью развития JavaScript. Язык очень гибок и подойдёт сторонникам как объектно-ориентированного, так и функционального подхода. Огромное количество библиотек и фреймворков позволяет с лёгкостью решать любые типы задач, а серверная платформа Node.js даёт возможность использовать язык не только в браузере, но и в консоли. Вы даже можете писать настольные и мобильные приложения: первые — при помощи фреймворка Electron, а вторые — на NativeScript или React Native.</p><h2>Основы</h2><p>Сперва необходимо изучить основные понятия JavaScript, веб-разработки и программирования в целом:</p><ul><li>объектно-ориентированный JS — конструкторы и фабрики, наследование;</li><li>функциональный JS — функции высшего порядка, замыкания, рекурсия;</li><li>спецификации тестов Jasmine;</li><li>основы HTML, CSS и jQuery.</li></ul><h3>Git</h3><p>Git — необходимый разработчикам инструмент, поэтому <a href="https://geekbrains.ru/courses/66?utm_medium=adv_post&amp;utm_source=tproger.ru&amp;utm_campaign=19.06.17&amp;utm_term=izuchenie_javascript&amp;utm_content=courses_66">познакомиться</a> с ним нужно как можно раньше. Вот основные навыки, которыми вы должны обладать:</p><ul><li>создание и перемещение файлов в каталогах;</li><li>инициализация и коммиты в Git;</li><li>настройка репозиториев в GitHub.</li></ul><h3>Алгоритмы и структуры данных</h3><p>Затем стоит изучить алгоритмы (в частности, понятие сложности алгоритмов), а также базовые структуры данных: связные списки, очереди, стеки, двоичные деревья поиска и хэш-таблицы. В этом вам поможет <a href="https://tproger.ru/tag/algos-and-data-structs/">наша серия статей</a>.</p><h2>Бэкенд</h2><h3>Node.js</h3><p>10 лет назад JavaScript можно было использовать только для фронтенд-разработки. Теперь благодаря Node.js одним «фронтом» дело не ограничивается. Node — это просто среда для выполнения JS-кода на стороне сервера, поэтому вам не придётся изучать новый синтаксис, но понадобится импортировать и экспортировать файлы, разбивать код на модули и использовать менеджер пакетов npm.</p><h3>Серверы, HTTP, Express.js</h3><p>После изучения Node стоит продолжить знакомство с бэкенд-разработкой и разобраться в серверах и маршрутизации. Можно начать с портов и протоколов с акцентом на HTTP, а потом заняться Express — Node-библиотекой для обработки запросов.</p><h3>Асинхронный JavaScript</h3><p><a href="https://tproger.ru/translations/asynchronous-javascript/">Асинхронность</a> является одной из отличительных фич JavaScript, хотя и создаёт некий раскол среди разработчиков: некоторые её любят, а некоторые — ненавидят. Вам стоит понимать плюсы и минусы этой технологии. Начните со стека вызовов, цикла событий и коллбеков, а затем перейдите к изучению <a href="https://tproger.ru/translations/meet-the-promises/">промисов</a>.</p><h3>Базы данных, схемы, модели и ORM</h3><p>Базы данных — один из важнейших элементов веб-разработки. Если вашему приложению нужно загружать или хранить какие-либо данные, не теряющиеся при обновлении страницы, придётся использовать БД. Нужно научиться различать реляционные и нереляционные базы данных и разобраться в типах связей. Затем <a href="https://tproger.ru/video/sql-introduction/">изучить SQL</a> и познакомиться с разными <a href="https://tproger.ru/translations/sqlite-mysql-postgresql-comparison/">системами управления баз данных</a>. Умение работать с ORM тоже не будет лишним.</p><h2>Фронтенд</h2><h3>HTML и CSS</h3><p>HTML и CSS — это основа основ для любого веб-разработчика. Вам не обязательно знать их в совершенстве, но разбираться в них вы должны. Также можно изучить какую-нибудь популярную библиотеку (например, Bootstrap) и CSS-препроцессор вроде Sass — он поможет сделать CSS похожим на обычный код. Для упрощения работы с HTML можно выбрать один из популярных шаблонизаторов, например, pug.</p><h3>jQuery и манипуляция DOM</h3><p>Создав внешний облик страницы при помощи HTML и CSS, вы будете использовать <a href="https://tproger.ru/translations/event-emitter-javascript/">трансляторы событий</a> и библиотеку jQuery для управления DOM. Многие считают, что jQuery бесполезна и её скоро заменят Angular и React, но она безумно популярна, и поэтому её стоит знать. Кроме того, однажды вы попадёте в ситуацию, когда забивать гвозди React-микроскопом вам будет неудобно, и тогда на помощь вам придёт лёгкая jQuery.</p><h3>Инструменты разработчика Chrome</h3><p>Было бы непростительно обделить вниманием <a href="https://learn.javascript.ru/devtools">инструменты Chrome</a>, которые дают огромное количество возможностей. С ними вы сможете изучать элементы DOM, производить отладку через консоль, отслеживать маршруты и многое другое. В <a href="https://tproger.ru/translations/chrome-command-line-api-cheatsheet/">нашей статье</a> описаны несколько удобных возможностей консоли Chrome, которые упростят выполнение рутинных задач.</p><h3>AJAX</h3><p>Если вы хотите, чтобы приложение не перезагружало страницы после каждой операции с базой данных, вам точно понадобится AJAX — он отправляет фоновые асинхронные HTTP-запросы, ответы на которые обновляют лишь часть отображения. Работать с AJAX можно через jQuery при помощи метода .ajax.</p><h2>Продвинутые темы</h2><h3>Разработка через тестирование</h3><p><a href="https://tproger.ru/articles/why-test-driven-development/">Test-Driven Development</a>, или TDD — это такая техника разработки, при которой создание ПО разбивается на множество небольших циклов: сначала пишутся тесты, которые покрывают желаемое изменение, затем пишется код, который эти тесты проходит. После этого производится рефакторинг кода, при необходимости пишутся новые тесты. Если какие-то тесты участок кода не проходит, это исправляется.</p><p>В случае с JavaScript советуем обратить внимание на фреймворки Jasmine, Chai и Mocha. Кстати, на нашем сайте есть <a href="https://tproger.ru/translations/frontend-testing-1/">цикл статей</a>, посвящённый тестированию фронтенда — может пригодиться.</p><h3>Веб-сокеты</h3><p>Этой теме стоит уделить особое внимание, поскольку <a href="https://tproger.ru/translations/what-are-web-sockets/">веб-сокеты</a> очень полезны. Протокол WebSocket, в отличие от HTTP, позволяет работать с двунаправленным потоком данных, что делает эту технологию уникальной. Самой распространённой реализацией является библиотека socket.io — разобраться с ней и применить полученные навыки на практике поможет <a href="https://tproger.ru/translations/multiplayer-browser-game-1/">наше руководство</a> по созданию многопользовательской браузерной игры.</p><h3>ES6, Babel, Webpack</h3><p>Сейчас основным стандартом является ES6 (ES2015), но уже принят ES2016, а ES2017 находится в разработке, поэтому нужно всегда быть в курсе обновлений и использовать их. Проблемы совместимости решаются всего парой инструментов:</p><ul><li>Babel — компилирует ES6-код (скоро появится поддержка ES2016) в ES5, который поддерживается всеми браузерами. Он даже умеет компилировать JSX/React-компоненты, что делает его незаменимым для любого веб-разработчика;</li><li>Webpack — собирает все ваши исходные файлы (картинки, шрифты, таблицы стилей, JS-файлы и т.д.) в единый граф зависимостей. Он не пригодится при создании маленьких приложений, но при работе с React его помощь неоценима.</li></ul><h3>React и Redux</h3><p>React — библиотека для создания пользовательских интерфейсов. Она была создана компанией Facebook в 2013 году и достаточно быстро стала популярной среди разработчиков. Вам стоит прочитать <a href="https://tproger.ru/translations/9-useful-tips-react/">эти 9 советов</a>, а затем разобрать <a href="https://tproger.ru/translations/react-basic-weather-app/">написание простого приложения</a>, чтобы понять, как работает React и для чего он нужен. React пригодится не только для фронтенд-разработки: Facebook выпустила варианты фреймворка для мобильной (React Native) и VR-разработки (React VR).</p><p>Redux — контейнер предсказуемых состояний, обычно используемый в связке с React. Его можно использовать для сокращения кода благодаря модульности. Особенно полезен в многопользовательских приложениях, работающих в режиме реального времени, например, в играх.</p><h3>Аутентификация, сессии, cookies</h3><p>Вам также стоит разобраться, как приложения взаимодействуют с пользователями, обрабатывают вход в учётную запись и выход из неё, выдают привилегии. Для отслеживания личности пользователя в течение сессии используются cookies — небольшие текстовые файлы, передаваемые сервером браузеру в ответе на HTTP-запрос. А для обеспечения связи базы данных и страничек авторизации можно использовать библиотеку express-session.</p><h3>Веб-безопасность</h3><p>И, наконец, стоит обратить внимание на безопасность. Важно <a href="https://habrahabr.ru/company/pentestit/blog/279787/">изучить</a> как методы атак, так и способы защиты от них.</p>]]></content:encoded>
    </item>
  </channel>
</rss>