Открытый вебинар «CSS препроцессоры» 09.07.2018 в 20:00 | OTUS

Курсы

Программирование
Node.js Developer React.js Developer Java Developer. Professional Android Developer. Basic Microservice Architecture Специализация Android-разработчик C++ Developer. Basic Специализация Fullstack developer JavaScript Developer. Professional Unity Game Developer. Basic Scala-разработчик Team Lead PHP Developer. Basic PHP Developer. Professional Flutter Mobile Developer C# Developer iOS Developer. Professional Python Developer. Basic Специализация iOS Буткемп Java Архитектура и шаблоны проектирования MS SQL Server Developer Software Architect Rust Developer Базы данных Разработчик на Spring Framework Highload Architect Agile Project Manager Symfony Framework Программист С PostgreSQL Cloud Solutions VR/AR - разработчик
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02
Проходил 9 июля 2018 года в 20:00

Открытый вебинар Разработчик JavaScript
CSS препроцессоры

Открытый вебинар онлайн

На открытом вебинаре расскажем как настроить и использовать LESS и SASS/SCSS для ускорения профессиональной вёрстки, а также разберемся в возможностях и особенностях препроцессоров, что позволит эффективно использовать Mobile-first вёрстку, БЭМ и UI фреймворки.
Преподаватель
Юрий Дворжецкий

Запись

О курсе

JavaScript Developer. Professional
93 600 ₽
6 месяцев
Начало 30 июня

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

 

Для кого этот курс?

  • Для разработчиков, хорошо знакомых с основами JavaScript, которые хотят углубиться в возможности языка и стать …
Программа курса
Модуль 1
JavaScript
Модуль 2
Node.js
Модуль 3
Современный Стэк JavaScript
Модуль 4
React
Модуль 5
Angular
Модуль 6
Vue
Модуль 7
Проектная работа
JavaScript
Мы рассмотрим основные возможности современного и традиционного JavaScript, стандарт EcmaScript 6+, Templates, асинхронные паттерны Promise, Async Await, переменные, замыкания, функции, наследование и классы. Разберем особенности браузерного API и спецификаций Web Components на примере библиотеки Lit-HTML. Обсудим главные принципы и возможности Node.js, а также NPM для управления зависимостями и автоматизации задач. Мы научимся использовать Test-Driven Development при решении практических задач.
Введение в курс Modern JavaScript Frameworks
познакомиться с преподавателем и с программой курса, понимать как она построена и какие полезные навыки получите;
объяснить основные возможности языка JavaScript;
применять техники языка, которые помогут при изучении фреймворков.
Домашние задания: 1
ДЗ
Задача про список рекомендаций maxItemAssociation. *Это задание является достаточно сложным, однако может быть интересно тем, кто хочет попробовать свои силы с реальными примерами из реальных собеседований*.
Если вы хотите попробовать решить менее сложную задачу, внизу можно найти задание 2. Решение любого из заданий достаточно для зачета этого ДЗ.

Задание 1.

Написать функцию maxItemAssociation(), получающую исторические данные покупок пользователей и возвращающую максимальный список рекомендаций.

Входные данные - массив исторических покупок пользователей [["a", "b"], ["a", "c"], ["d", "e"]]. То есть пользователь 1 купил "a" и "b". Пользователь 2 купил продукты "a", "c". Пользователь 3 купил продукты "d", "e".
Надо найти максимальную группу рекомендаций. Группа рекомендаций - это продукты, которые был куплены другими пользователями при условии, если они пересекаются с исходным списком.
Если количество рекомендаций в группах одинаковое - вернуть первую группу, из отсортированных в лексикографическом порядке.

Решение:
Группа рекомендаций 1 - ["a", "b", "c"]. Покупка "a" содержится в списке 2, поэтому весь список 2 может быть добавлен в рекомендации.
Группа рекомендаций 2 - ["d", "e"].

Ответ: ["a", "b", "c"].

Пример 2:

Входные данные: [
["q", "w", 'a'],
["a", "b"],
["a", "c"],
["q", "e"],
["q", "r"],
]

Ответ ["a", "b", "c", "e", "q", "r", "w"] - это максимальная по пересечениям группа. Можно видеть, что первый массив пересекается со всеми остальными, и потому результат является всем множеством значений.


Ресурсы:
- https://akshanshweb.files.wordpress.com/2018/04/screenshot-from-2018-04-21-10-06-12.png?w=720
- https://dzone.com/articles/machinex-understanding-fp-tree-construction
- https://www.softwaretestinghelp.com/fp-growth-algorithm-data-mining/
- https://www.mygreatlearning.com/blog/understanding-fp-growth-algorithm/
- https://zims-en.kiwix.campusafrica.gos.orange.com/wikibooks_en_all_maxi/A/Data_Mining_Algorithms_[…]/Frequent_Pattern_Mining/The_FP-Growth_Algorithm

---

Задание 2.

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

sum(1)(2)(3)....(n)() === 1 + 2 + 3 + ... + n
Возможности современного JavaScript
решать специфичные для браузерной разработки задачи на языке JavaScript;
освоить и вспомнить теорию, которая будет базисом для последующих уроков;
попрактиковаться с технологиями AJAX, WebSocket, Promise.
7 июля, 20:00 — 21:30
Лектор: Илья Овчинников
JavaScript - Работа с браузером
решать специфичные для браузерной разработки задачи на языке JavaScript;
работать с Chrome Dev Tools.
11 июля, 20:00 — 21:30
Лектор: Юрий Дворжецкий
Домашние задания: 1
ДЗ
promiseReduce - работа с асинхронными функциями. Пример использования

```javascript
var fn1 = () => {
console.log('fn1')
return Promise.resolve(1)
}

var fn2 = () => new Promise(resolve => {
console.log('fn2')
setTimeout(() => resolve(2), 1000)
})

function promiseReduce(asyncFunctions, reduce, initialValue) {
/*
* Реализация
*/
}

promiseReduce(
[fn1, fn2],
function (memo, value) {
console.log('reduce')
return memo * value
},
1
)
.then(console.log)
```

Вывод в консоль

```
fn1
reduce
fn2
reduce
2
```
Введение в Node - Пакетный менеджер NPM и возможности package.json
запускать приложения на платформе Node;
писать и запускать тесты для серверного JavaScript;
работать с пакетным менеджером NPM;
управлять зависимостями и автоматизировать задачи с помощью package.json.
14 июля, 20:00 — 21:30
Лектор: Руслан Байгунусов
Test Driven Development
разбирать примеры.
18 июля, 20:00 — 21:30
Лектор: Руслан Байгунусов
Домашние задания: 1
ДЗ
getPath - поиск уникального селектора. Написать алгоритм и функцию `getPath()`, находяющую уникальный css-селектор для элемента в документе.
Уникальный селектор может быть использован `document.querySelector()` и возвращать исходный элемент.

Так чтобы `document.querySelectorAll()`, вызванный с этим селектором, не должен находить никаких элементов, кроме исходного.

```javascript
$0 // HTMLElement
getPath($0) // => "body div.someclass ul li:first-child"
```

Использовать TDD, добавить юнит тесты для функции
Node.js
Этот модуль о серверной среде JavaScript. Мы разберем ключевые особенности Node.js - EventLoop, модули и потоки. Мы научимся строить API, используя фреймворк Express, подходы REST и GraphQL. Поговорим о WebAssembly и общих практиках при работе с процессами и ошибками. В конце мы подведем резюме стэка технологий Node.js
Стандартная библиотека Node - EventLoop - Timers
ориентироваться в понятии EventLoop и особенностях работы Timers;
использовать классы, объекты и функции модуля Streams;
работать c HTTP запросами в Node.
21 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
tree - вывод списка файлов и папок файловой системы. Напишите `NodeJS` скрипт `tree` для вывода списка файлов и папок файловой системы.
Результатом работы должен быть объект с массивами `{ files, folders }`.
Вызовы файловой системы должны быть асинхронными.
Скрипт принимает входной параметр - путь до папки.
Добавить возможность выполнять этот скрипт через команду `npm run tree -- path`

Пример

```
foo/
├── bar/
│├── bar1.txt
│├── bar2.txt
│└── baz/
├── f1.txt
└── f2.txt
```

При вызове с путем `foo/` скрипт должен вернуть структуру:

```json
{
"files": [
"foo/f1.txt",
"foo/f2.txt",
"foo/bar/bar1.txt",
"foo/bar/bar2.txt"
],
"dirs": [
"foo",
"foo/bar",
"foo/bar/baz"
]
}
```
Node Best Practices - Streams - Processes
работать с дочерними процессами в Node;
различать корректные и ошибочные техники при написании; серверного JavaScript кода.
25 июля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Работа с потоками в NodeJS*. * - задача со звездочкой. Сдается при желании.

Необходимо отсортировать большой файл со случайными целыми числами, размером 100 МБ, в условиях ограниченной оперативной памяти - 50 МБ. Решение должно быть построено с использованием потоков.

Для решения задачи можно использовать алгоритм “Сортировка слиянием”.
Процесс можно разделить на 3 этапа.

Этап 0
Любым удобным вам способом создаем исходный файл с числами размером 100 МБ.

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

Этап 2
Необходимо создать механизм чтения чисел сразу из нескольких файлов (потоков).
Читать данные из потоков следует по принципу pause/resume.

Этап 3
Необходимо создать цикл, который будет работать с данными сразу из всех потоков.
Такой цикл будет прерван только тогда, когда будут полностью прочитаны все файлы.
В цикле следует искать наименьшее значение и записывать его в итоговый файл.
1 итерация = 1 число

Для проверки решения, скрипт необходимо запустить командой
$ node --max-old-space-size=50 script.js

---

https://strongloop.com/strongblog/practical-examples-of-the-new-node-js-streams-api/
Основные концепции Node - Modules
использовать require, exports и ES6 Imports для экспорта и импорта зависимостей.
28 июля, 20:00 — 21:30
Web-сервер с Express
использовать стандартную библиотеку Node.js для веб сервера;
разбираться и понимать структуру и концепции Express - middlewares, templates, routing;
создавать приложения с использованием Express;
обрабатывать ошибки в Node.js приложениях.
1 августа, 20:00 — 21:30
Возможности MongoDB
подключать и использовать различные дистрибутивы mongodb в node.js приложении;
создавать и понимать концепции коллекций, документов и полей;
писать CRUD-операции запросы к данным;
понимать общие возможности фильтраций в mongodb (limit, skip, поддокументы).
4 августа, 20:00 — 21:30
Расширенные функции MongoDB - Aggregation Framework
понимать и использовать Aggregation Framework - map/reduce;
настраивать и администрировать MongoDB.
8 августа, 20:00 — 21:30
Построение Rest API с Express, Mongoose
добавлять общие стандарты создания API;
объяснить REST, принципы построения API;
использовать ORM - Mongoose;
реализовывать CRUD операции с Mongoose, Express и MongoDB;
проанализировать технологии аутентификации в веб приложениях.
11 августа, 20:00 — 21:30
Основы GraphQL
понимать и работать с GraphQL и основными концепциями.
15 августа, 20:00 — 21:30
Домашние задания: 1
ДЗ
Домашняя работа для `Занятие "GraphQL Server"`. На выбор одна из следующих задач:

---

Часть 1.
Написать схему GraphQL для примера веб-приложения e-commerce shop:
до 3 балла - какие сущности (минимум 3, можно больше), какие у них поля, какие обязательные какие нет
до 4 баллов - какие запросы/мутации понадобятся (минимум 4, можно больше)

Часть 2.
до 5 баллов - развернуть локально graphQL + nodejs или воспользоваться одним из веб демо (graphqlbin), перенести полностью или частично написанную в Части 1 схему.
Результатом работы будет ссылка на онлайн демо или репозиторий.

---

// ИЛИ

Написать `NodeJS Rest API` приложение для сохранения `RSS` рассылок.
В приложении должно быть следующие точки доступа
- Создание рассылки по `URL`. При успешном добавлении приложение будет запрашивать `RSS` рассылку, парсить `XML` и сохранять документы в базу данных.
- Показ списка всех добавленных `URL` рассылок.
- Показ всех сохраненных из `RSS` документов.

Приложение должно содержать тесты для всех точек доступа.
Сборка проекта, CI
понимать и использовать общие концепции CI/CD;
18 августа, 20:00 — 21:30
Деплой проекта, CD
использовать Node.js приложение в Docker контейнере;
подключать БД;
настраивать деплоймент приложений в облако.
работать с логами.
определять требования к серверу;
22 августа, 20:00 — 21:30
Современный Стэк JavaScript
В этом блоке мы рассматриваем свежие, но уже зарекомендовавшие себя темы из мира JavaScript. Познакомимся со спецификацией Web Components, и научимся использовать библиотеку Lit-Element, построенную вокруг этой технологии.
SvelteJS - новая большая вещь в мире фронтенда, и мы обязательно должны ее попробовать. TypeScript - стандарт отрасли, поэтому мы начинаем его изучать и практиковать как можно раньше в курсе в FullStack JavaScript разработчик.
Web Components
ориентироваться в веб спецификациях Custom Elements и Shadow DOM;
создавать custom elements, используя встроенные браузерные возможности;
использовать HTML Template для шаблонизации компонент.
использовать особенности Lit-HTML для создания приложений;
объяснить принципы Polymer;
25 августа, 20:00 — 21:30
Webpack
настраивать Webpack;
различать Parcel и Rollup;
понимать, что такое и как использовать babel;
использовать eslint
29 августа, 20:00 — 21:30
Лектор: Михаил Кузнецов
Домашние задания: 1
ДЗ
Custom Elements Tree. С помощью Custom Elements создать приложение для показа дерева с помощью компонентов my-tree и my-leaf. Компоненты должны получать данные о структуре поддерева от родительского элемента. Используйте Shadow DOM при отрисовке компонент. Можно также использовать для реализации Lit-Element, Lit-HTML или Polymer.

Пример структуры

{
"id": 1,
"items": [{
"id": 2,
"items": [{ "id": 3 }]
}]
}
PWA
понимать и использовать подход PWA.
1 сентября, 20:00 — 21:30
Service Workers
понимать и использовать Service Workers API
5 сентября, 20:00 — 21:30
Инструменты и технологии JS тестирования, BDD (Behavior-Driven Development )
применять BDD;
понимать метрики и возможности тестирования;
использовать инструменты браузерного интеграционного и юнит тестирования .
8 сентября, 20:00 — 21:30
Введение в TypeScript
различать TypeScript и JavaScript, использовать преимущества статической типизации;
писать и понимать код на языке TypeScript, разрабатывать приложения в полноценном объектно-ориентированном стиле.
12 сентября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Перевести проект на TypeScript. Можно использовать свой репозиторий или любой опенсерсовый проект, например
- https://github.com/korzio/djv/tree/ts
Особенности TypeScript
проанализировать специальные особенности TypeScript;
разбираться в Namespaces, Generics, Decorators, Type Definitions, Metadata;
применять типы и декораторы.
15 сентября, 20:00 — 21:30
React
Мы подробно изучим стэк технологий React. Рассмотрим особенности синтаксической шаблонизации JSX, особенности передачи данных и хранения состояния с помощью state и props. Разберем свойства компонентного подхода для декомпозиции React приложений, жизненный цикл и типы компонент, например, High-Order Components. Изучим шаблон проектирования Flux и его реализацию на примере библиотеки Redux. Будем настраивать и оптимизировать приложения с Server-Side Rendering.
Основы React и JSX
настроить себе окружение для работы с React и использовать его;
применять синтаксис JSX;
создавать простые приложения на React.
26 сентября, 20:00 — 21:30
Компоненты React - Lifecycle, State & Props
разрабатывать полноценные React-компоненты в различных стилях;
понимать жизненный цикл компонент;
использовать Lifecycle API для управления компонентами приложения;
моделировать состояние через state / props.;
корректно управлять данными React приложения.
29 сентября, 20:00 — 21:30
Паттерны проектирования React (Higher-Order Components)
свободно декомпозировать компоненты;
делать переиспользуемые контейнеры children;
переиспользовать state-логику и лайфсайкл- хуки через HOC;
написать умные компоненты с конфигурируемым отображением через render pro.
3 октября, 20:00 — 21:30
Обзор современных возможностей React
разбираться в техниках и использовать различные hooks.
6 октября, 20:00 — 21:30
Состояние приложения - Flux и Redux
отличать основные понятия однонаправленной архитектуры Flux;
ориентироваться и использовать возможности redux - создавать actions, reducers, а также применять redux в связке в React.
использовать Redux в React приложениях.
10 октября, 20:00 — 21:30
Routing в React - Оптимизация приложения
создавать систему routing для React приложений, использовать библиотеку react-router;
использовать специальные возможности библиотеки для оптимизации отрисовки.
13 октября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Routing для приложения погоды. Реализовать компонент фильтра и поиска городов.
Данные по городам сохранять в браузерном хранилище.
Добавить страницу погоды по конкретному городу.
При переходе на нее должен меняться url, показываться информация на несколько дней вперед.
Подготовка React Приложения к Production, Best Practices
эффективно разрабатывать приложения на React, учитывая последние тенденции в разработке front-end;
использовать Advanced React;
применять на практике Best-Practices разработки на React.
17 октября, 20:00 — 21:30
Микросервисная архитектура и аспекты SSR
понимать, что такое микросервисная архитектура во FrontEnd;
различать подходы проектирования приложений;
понимать различия в реализации архитектур веб приложений.
20 октября, 20:00 — 21:30
Angular
Подробно изучим язык TypeScript и преимущества его использования. Разберем паттерн проектирования Observable на базе библиотеки RxJS. Научимся работать с фреймворком Angular - создавать компоненты и формы, управлять Routing, использовать Dependency Injection для сервисов, а также тестировать и собирать приложения с помощью Webpack.
Введение в Angular
настроить себе окружение IDE, а также скачать зависимости и библиотеки, коммандные утилиты для TypeScript и создания проектов для работы с Angular;
различать TypeScript и JavaScript;
писать и понимать код на языке TypeScript.
31 октября, 20:00 — 21:30
Компоненты и директивы
декомпозировать макет страницы на компоненты;
различать директивы и компоненты во фреймворке Angular;
создавать простые директивы и компоненты.
3 ноября, 20:00 — 21:30
Observables - RxJS
отличать основные понятия паттерна;
применять шаблон проектирования Observables, используя библиотеку RxJS.
7 ноября, 20:00 — 21:30
Сервисы и состояние приложения
создавать сервисы для получения, отправки и хранения данных для приложений Angular;
разбираться в особенностях шаблона проектирования Dependency Injection и его имплементации в Angular.
10 ноября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Структура приложения для запоминания иностранных слов. Приложение для запоминания иностранных слов.
В этом приложении пользователь сможет добавлять слова для изучения, проходить тесты для запоминания слов.
Это Single Page Application состоит из 3 страниц:
- Последние добавленные слова (Recently Added)
- Упражнениями (Go)
- Настройки (Settings)
На главном экране, на странице Recently Added пользователь видит список последних добавленных слов, может добавить новое слово в словарь.

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

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

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

---

Декомпозировать приложение для запоминания иностранных слов.
Создать структуру и компоненты контейнеры приложения.

Создать сервисы для работы с текстом
- Сервис перевода слова - должен запрашивать перевод через API (например, https://tech.yandex.com/translate/, https://mymemory.translated.net/)
- Сервис хранения словаря - небольшая обертка для управления словарем с помощью `localStorage`
- Сервис добавления слов - должен разбивать текст на отдельные слова, запрашивать их перевод и сохранять в словарь для приложения.

Сервисы должны общаться с помощью библиотеки `RxJS`.
Создание и управление формами в Angular
создавать формы, используя техники Dynamic Forms, Reactive Forms;
описывать валидацию и другие функции для элементов форм.
14 ноября, 20:00 — 21:30
Routing, тестирование и сборка в Angular
создавать Routing систему для приложений, используя внутренние подходы Angular - такие как Router, router-outlet и другие;
применять хэндлеры навигации Guards.
писать и запускать тесты для приложений Angular;
настраивать сборку приложений Angular;
использовать возможность сборки Server-side Rendering.
17 ноября, 20:00 — 21:30
Домашние задания: 1
ДЗ
Routing для приложения запоминания иностранных слов. Реализовать `UI` приложения
- Создать компоненты для добавления текста/слов в словарь
- Разработать компоненты и формы для тренировки запоминания слов
- Добавить экран настройку приложения, сохранять состояние

Добавить routing, ссылки на страницы и переходы между компонентами приложения.
Добавить и актуализировать тесты для компонент приложения, настроить universal рендеринг приложения.

Vue
В этом модуле мы сосредоточимся на Vue - современном и популярном FrontEnd фреймворке. Мы рассмотрим особенности шаблонизации и создания динамических приложений на Vue. Разберем возможности и жизненный цикл компонент, хранения состояния. Изучим инструменты Vuex и Vue CLI. Будем настраивать и оптимизировать сборку приложений с Server-Side Rendering.
Альтернатива большим фреймворкам - Обзор SvelteJS
понимать основные преимущества и цели фреймворка;
запускать проект и понимать синтаксис SvelteJS;
настраивать сборку с Rollup.
21 ноября, 20:00 — 21:30
Лектор: Михаил Кузнецов
Основы Vue
настроить себе окружение IDE, зависимости и библиотеки для создания проектов и работы с Vue;
создавать простейшие приложения используя Vue.
24 ноября, 20:00 — 21:30
Компоненты, шаблонизатор и формы
объяснить синтаксис шаблонизаторы;
создавать компоненты, описывать атрибуты элементов.
28 ноября, 20:00 — 21:30
Routing и Vue3
описывать routing для Vue приложений;
основы Vue3.
1 декабря, 20:00 — 21:30
Домашние задания: 1
ДЗ
Структура & Routing для приложения "Устный счет". Подготовить общую структуру приложения - компоненты контейнеры для страниц приложения.
Сделать первую страницу приложения - форму настроек.
Реализовать второй экран - игру "калькулятор".
Настроить переходы по страницам приложения.
Advanced Vue - Vuex
применять анимацию в компонентах;
создавать плагины;
разбираться в тонкостях Change Detection.
5 декабря, 20:00 — 21:30
Проектная работа
Заключительный месяц курса посвящен проектной работе. Это то, чем интересно заниматься студенту на базе знаний, полученных на курсе.
При этом не обязательно закончить его за месяц. В процессе написания по проекту можно получить консультации преподавателей.

Проект должен стать примером кода, который можно показывать потенциальным работодателям.
Вводное занятие по проектной работе. Обзор пройденных фреймворков и технологий
выбрать и обсудить тему проектной работы;
спланировать работу над проектом;
ознакомиться с регламентом работы над проектом;
выделять характеристики проектов и окружения;
решать задачи выбора и сравнения фреймворков, понимать их преимущества и недостатки.
8 декабря, 20:00 — 21:30
Лектор: Александр Коржиков
Домашние задания: 1
ДЗ
Проектная работа. Заключительный месяц курса посвящен проектной работе. Это то, чем интересно заниматься студенту на базе знаний, полученных на курсе.
При этом не обязательно закончить его за месяц. В процессе написания по проекту можно получить консультации преподавателей.

Проект должен стать примером кода, который можно показывать потенциальным работодателям.
Защита проектных работ
защитить проект и получить рекомендации экспертов.
12 декабря, 20:00 — 21:30
Лектор: Александр Коржиков

Преподаватель

Юрий Дворжецкий
Ведущий full-stack разработчик, кандидат физико-математических наук.
Программирует с начальных классов, преподаёт со студенчества.

Разрабатывает на разных платформах: большие и маленькие проекты, высоконагруженные и очень красивые, многим известные и совсем специфические.

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