Результати пошуку за запитом: принцип открытости*
RxJS: розбір Subject`ів
Автор: Nicholas Jamieson
Я был свидетелем многих вопросов, связанных с Subject`ами на Stack Overflow. Недавно я увидел одного разработчика, который интересовался, как, собственно говоря, работает AsyncSubject. Вопрос заставил меня написать эту статью, чтобы показать, почему необходимо использовать различные типы Subject`ов и как их использовать.
Когда мы используем Subject`ы?
В своей статье Бен Леш утверждал, что:
… [мультикастинг] является основной причиной использования Subject`ов в RxJS.
Что касательно мультикастинга, мы рассмотрим его более подробно немного позже. Сейчас же нам достаточно знать, что он позволяет принимать оповещения от одной «наблюдаемости» и отправлять их другим «наблюдателям».
Подобная связь «наблюдаемости» с «наблюдаемыми» и есть сутью Subject`ов. Причина этого заключается в том, что де-факто Subject`ы являются одновременно «наблюдаемостью» и «наблюдателями».
Как они могут быть использованы?
В качестве примера давайте рассмотрим компонент Angular awesome-component. Наш компонент выполняет определенную работу и содержит в себе внутреннюю «наблюдаемость», что производит определенное значение при работе с ней пользователя.
Чтобы позволить родительским компонентам получить доступ к «наблюдаемости», awesome-component принимает «наблюдателя», что вводит свойство и что подписывается, в свою очередь, на «наблюдаемость». Это значит, что отныне родитель может соединиться с «наблюдаемостью» при помощи спецификации «наблюдателя» - что-то наподобие этого:
Так как теперь «наблюдатель» «обвязан», родитель соединен и получает значения от awesome-component. Впрочем по сути это то же самое, как если бы awesome-component производил значения через подписанные события. Так почему же мы здесь не используем события?
Дело в том, что «наблюдаемостями» проще управлять. К примеру, чтобы добавить фильтры, нам необходимо использовать лишь несколько операторов. Но немаловажный нюанс: родительский компонент имеет «наблюдателя» – не «наблюдаемость», так как в таком случае мы можем применять операторы?
Subject`ы - это одновременно и «наблюдаемости», и «наблюдатели», поэтому, когда мы создаем Subject, он может быть использован по отношению к awesome-component в качестве «наблюдателя» или работать с компонентом как с «наблюдаемостью». Что-то наподобие этого:
Subject соединяет «наблюдателя» по принципу «делай-все-что-хочешь-со-значением» с «наблюдаемостью» в виде awesome-component. Но здесь применяется набор операторов родителей компонента.
Композиция различных «наблюдаемостей»
При помощи Subject`а для композиции «наблюдаемости» awesome-component может быть использован в разных целях разными компонентами. К примеру, другой компонент может быть заинтересован только в последнем сгенерированном значении. Для этого нужно использовать last-оператор:
Что интересно, это не единственный способ получения последнего значения: мы просто можем использовать другой Subject. К примеру, при помощи AsyncSubject код будет выглядеть следующим образом, так как он производит только последнее полученное значение:
Но, если использование AsyncSubject равнозначно композиции «наблюдаемости» при помощи использования Subject и last-оператора, зачем усложнять RxJS лишним классом?
Ну, в основном потому что Subject`ты предназначены для мультикастинга.
В данном случае два способа эквивалентны, потому что здесь есть только один подписчик. В ситуации с применением мультикастинга здесь было бы несколько подписчиков и применять оператор last здесь было бы нецелесообразно.
Теперь же давайте рассмотрим мультикастинг более детально.
Как Subject`ы используются непосредственно в RxJS?
Ядро инфраструктуры мультикастинга RxJS исполняется при помощи оператора multicast. Multicast вообще применяется к ключевым «наблюдаемостям», принимает Subject и возвращает полученную из Subject`а «наблюдаемость».
Оператор multicast чем-то похож на awesome-component. Мы можем принимать «наблюдаемость», чье поведение зависит от принимаемого Subject`а.
Ситуации, когда базовый Subject передается multicast:
Подписчики мультикаст-«наблюдаемости» принимают оповещения типа next, error, complete.
«Поздние» подписчики , другими словами, те, которые подписались после оповещений error, complete, – так же в свою очередь принимают эти оповещения.
Важно отметить, что пока мультикастинг не передал factory, «поздние» подписчики не работают с другими подписками на источник.
Чтоы произвести композицию по отношению к мультикаст-«наблюдаемости», что передает последнее оповещение next ко всем подписчикам, недостаточно просто применить last-оператор к «наблюдаемости», созданной при помощи Subject. «Поздние» подписчики подобной «наблюдаемости» не получат последнее next-оповещение. Они получат только complete.
Специально для этого оповещения должны храниться в состоянии Subject`а. Именно это делает класс AsyncSubject и именно для этого мы используем AsyncSubject в подобной ситуации.
Что касательно других классов Subject`ов?
Существует двое других вариантов Subject`ов: BehaviorSubject и ReplaySubject.
Чтобы понимать BehaviorSubject лучше, давайте рассмотрим пример:
Здесь родительский компонент соединяется с awesome-component при помощи Subject и применяет оператор startWith. Этот оператор обеспечивает надежный прием значения “awesome” вместе со значениями, сгенерированными awesome-component – в случае, конечно, если они таки были сгенерированы.
Подобно тому, как AsyncSubject используется вместо обычного Subject`а и оператора last, BehaviorSubject может заменить собой оператора startWith и Subject`а – так как его конструктор принимает значение, которое было бы в противном случае направлено к startWith.
В случае с использованием BehaviorSubject все подписчики получат начальное значение. Это возможно потому, что BehaviorSubject хранит значение переменной в своем состоянии.
По той причине, что концепция «переигрывания» уже полученных оповещений внедрена в мульти-подписку, аналогии с единым подписчиком для ReplaySubject просто не существует. Так же, как и BehaviorSubject, переменные хранятся в состоянии Subject`а.
Итак, как мы используем эти Subject`ы?
Мы увидели, какие бывают Subject`ы и для чего они используются. Но как они должны быть использованы? Что ж, как бы это ни было парадоксально, но класс Subject – это тот класс, который вам, вероятно, никогда не придётся использовать.
Subject работает прекрасно при связывании «наблюдателя» с «наблюдаемостью». Но для ситуаций с мультикастингом существуют альтернативы.
RxJS содержит операторы мультикастинга, которые используют различные Subject – классы, причем точно так же, как я могу использовать генераторы «наблюдаемостей» RxJS (fromEvent) над вызовами Observable.create. Но для ситуаций с мультикастингом я все же предпочитаю использовать следующие операторы:
Publish или share могут быть использованы вместо Subject;
publishBehavior может быть использован вместо BehaviorSubject;
publishLast может быть использован вместо AsyncSubject;
publicReplay или shareReplay могут быть использованы вместо ReplaySubject.
Автор перевода: Евгений Лукашук
Источник
SVG animation
Автор: Дмитро Івченко
Обзор
SVG графика может быть анимирована с использованием анимационных тегов. Они были описаны в спецификации Animation SMIL.
Рассмотрим эти теги:
позволяет анимировать свойства в течение времени.
это удобное сокращение, которое полезно для присвоения значений анимационных нечисловых атрибутов и свойств, таких как свойства opacity.
который двигает вдоль траектории движения path.
которая модифицирует значение цвета отдельных атрибутов или свойств с течением времени.
В дополнение к элементам, определенных в SMIL, SVG включает расширения, совместимые с SMIL анимацией спецификации.
Эти расширения включают в себя атрибуты, которые расширяют функционал элемента.
Расширения SVG включают в себя:
- дает возможность анимировать один из SVG атрибутов в течение промежутка времени, например, в качестве атрибута преобразования нового центра фигуры или преобразование фигуры и использование поворота вокруг одной из осей (Х, Y, Z).
path(attr) - позволяет анимировать вдоль определенного пути.
- используется в сочетании с animateMotion элемента для ссылки на траекторию движения, которая должна быть использована в качестве пути для движения. Элемент mpath входит внутрь animateMotion элемента перед закрывающим тегом.
keypoints (attr) - задается в качестве атрибута для animateMotion, обеспечивая точный контроль скорости траектории движения анимации.
rotate(attr) - используется в качестве атрибута для animateMotion для того, чтобы контролировать поворот относительно оси поворота.
SVG анимации могут быть похожи на CSS анимации. Ключевые кадры создаются, объекты движутся. Но они могут сделать нечто, что CSS анимации не делает.
Применение SVG Анимации
SVG элементы можно стилизовать и анимировать и с помощью CSS. В принципе, любое преобразование или анимации перехода, которые могут быть применены к HTML элементу, также могут быть применены к SVG. Но существуют некоторые SVG свойства, которые не могут быть сделаны через CSS. Векторная версия путь, например, поставляется с набором данных path, который определяет траекторию этому пути. Эти данные могут быть изменены и анимированных через SMIL, но не CSS. Это потому, что SVG элементы описаны набором атрибутов, известных как SVG атрибуты представления.
Если вы предпочитаете использовать JavaScript, я рекомендую использовать snap.svg, который описан как "в JQuery в SVG".
Вот коллекция примеров.
http://snapsvg.io/demos/
Если вы предпочитаете декларативный подход анимации, вы можете применять элементы SVG анимации, о которых я расскажу.
Еще одно преимущество SMIL над JS анимацией в том, что JS анимации не работают, когда SVG встроен в качестве IMG или используется в качестве фона изображения в CSS. SMIL анимации работают в обоих случаях. Это большое преимущество, на мой взгляд.
Поддержка браузеров
Поддержка браузеров для SMIL анимации довольно приличная. Они воспроизводятся во всех браузерах, кроме IE. Подробный обзор поддержки браузеров вы можете посмотреть в таблице совместимости на caniuseit.
Если вам нужно обеспечить альтернативный вариант для SMIL анимации, вы можете проверить поддержки браузера на лету, используя Modernizr. Если SMIL не поддерживается, вы можете предоставить какой-то запасной вариант (анимации JavaScript, например).
Анимация атрибутов элемента из одного значения к другому в течение произвольного времени с указанием конечного состояния: from, by, to, dur и fill.
Давайте рассмотрим с перемещением круга из одного положения в новое. Это можно сделать, изменив значение его атрибута сх (который определяет х - положение его центра).
Мы собираемся использовать элемент, чтобы сделать это. Атрибуты, которым устанавливают числовые значения и цвета, как правило, анимированные с помощью . Для получения списка атрибутов, которые могут быть анимированными, обратитесь к этой таблице:
http://www.w3.org/TR/SVG2/animate.html#AnimationAttributesAndProperties
Чтобы изменить значение на другое в течение времени используются from, by, to, dur и fill. В дополнение к этому, вы также хотите указать, когда анимация должна начинаться с атрибутом начала.
В приведенном примере, я определил круг, а затем вызываю анимацию на этом круге. Центр окружности перемещается из исходного положения - 500 единиц, до 1750 единиц вдоль оси х.
Начальное значение установлено на кнопку мыши. Это означает, что круг будет двигаться, когда она нажата. Вы можете установить это значение к значению времени, а также. Например, начинают = "0s" начнет анимацию, как только страница загружена. Вы можете задержать анимацию, установив положительное значение времени. Например, начать = "6s" запустит анимацию через шесть секунды после нагрузки.
Атрибут Dur похож на анимации-импульса в CSS.
from - to атрибуты похожи на from to ключевых кадров в keyframe блока анимации в CSS:
Повторяющиеся анимации с Repeat-Count
Когда вы хотите воспроизвести анимацию несколько раз, вы можете сделать это с использованием атрибута RepeatCount. Можно указать, сколько раз вы хотите повторить или использовать ключевое слово, чтобы он без конца повторять. Так что, если мы должны были повторить анимацию вида круга в течение двух раз, код будет выглядеть так:
Управление значениями ключевых кадров анимации: keyTimes и values. В CSS, мы можем задать значения, которые мы хотим, чтобы взять в определенные рамки во время анимации.
0%, 40 % , 80 % и 100% являются кадрами анимации.
Анимация вдоль определенных путей:
Хорошие примеры таких анимаций можно посмотреть здесь
http://codepen.io/mileselam/pen/kprKm
http://codepen.io/rossfenrick/pen/gpzJzz
http://codepen.io/tmrDevelops/pen/yyveKv
Так же более подробный пример есть на хабре
http://habrahabr.ru/post/207908/
Функция прохода анимации
Еще один важный элемент — это функция по которой будет проходить анимация. Среди всем известных функций анимации мы знаем ease, ease-in, ease-out, linear. Но если Вы хотите создать свою функцию прохождения анимации, то вам сюда
http://cubic-bezier.com/
И напоследок лучший пример, от которого просто невозможно оторвать глаз
http://codepen.io/thiennhat/pen/BNByzJ?editors=001
Пробуйте и у вас все получится!
Як управляти часом?
Автор: Федір Шишков
Введение
Человек, который осмеливается потратить впустую час времени, еще не осознал цену жизни.
Ч. Дарвин
Средняя продолжительность жизни человека – 79.5 лет. Из них более 10 лет человек проводит на работе. Данная статья будет полезна тем, кто ценит свое время: желает работать продуктивнее, получить больше свободного времени или просто упорядочить жизнь!
Что же такое время? Существует множество определений. Чаще всего мы говорим о часовом и реальном времени. Часовое время равномерно: в нем час это 60 минут или 3600 секунд, а в году 365 дней. С ним работают большинство хитроумных систем и приспособлений для учёта времени. Реальное время относительно – за интересной работой (проверка комментариев) время пролетает незаметно, а за скучной и однообразной (проверка документов или платежей) оно тянется, как кисель.
Люди живут по реальному времени. Оно субъективно – именно вы его создаете, и, поэтому, можете им управлять.
Планирование
Очень разумно составлять планы на полгода, на год вперёд, но грош им цена, если у тебя нет планов на завтрашний день.
Хилари Мантел. Волчий зал
Планирование – основа деловой активности. Без плана невозможно построить качественный дом. Плохой план или его отсутствие – основная причина неудач.
Задайте себе вопрос в понедельник: «Какие три вещи я хочу закончить до пятницы?». В начале каждого дня или в конце предыдущего спросите себя: «Что я хочу сделать за сегодня?».
Ваш план может выглядеть не только как список задач в Excel. Представьте для себя удачное завершение Вашей задачи – и мозг активно будет искать решение! Так работают многие техники «визуализации».
Делите сложную задачу на задачи поменьше, планируйте от длительных задач до ежедневных. Не забывайте ставить фиксированные сроки!
Помните, успешное планирование сэкономит до половины времени при решение задачи!
Список дел
Огромную роль в ежедневном планировании занимает список дел. Не пытайтесь распланировать все!
Согласно принципу Парето, который можно сформулировать так: «только 20% усилий приносят 80% результата, остальные 80% - лишь 20% результата», основная часть усилий тратится впустую! Очень важно определить ключевые задачи и выделить под них определенное время выполнения, когда Вы сфокусируетесь на их выполнении!
Решите, как разделить задания по важности – например, цифрами или буквами алфавита. Существуют дела срочные – их нужно закончить прямо сегодня, существуют дела несрочные – те, которые можно отложить на завтра или послезавтра. Ваша задача – выполнить дела срочные и важные, на них стоит потратить основную часть Вашего времени. Далее стоит выполнить задачи важные, но не столь срочные – важные задачи приносят основной доход! Остальные дела – по возможности передайте их подчиненным или скажите слово «нет», они не имеют огромного влияния на Вашу работу.
Можете даже записывать важные задачи в журнале для встреч, как встречи самих с собой! Скажем: «С 11 утра до 11:30 я буду заниматься подготовкой новости для моего вебсайта».
Попытки выполнить все задачи сразу приносят лишь разочарования! Отложите часть задач на следующий рабочий день.
Начинайте рабочий день с самой неприятной, но важной задачи – время «на раскачку» (чтение новостей, заваривание кофе, разговоры с коллегами) может затянутся, а к обеду наша активность чаще всего снижается.
Чтобы определить важные задачи, попробуйте записать мысли, активности и разговоры в блокнот, скажем, за неделю. Так Вы узнаете, куда утекает время. Сплетни и сторонние разговоры, чтение новостей и просмотр телевизора в рабочее время – явно лишние активности, убирайте «пожиратели времени».
Стремление к идеалу
Лучшее – враг хорошего
М. Джиованни (1574)
С детства я жуткий перфекционист – стараюсь все сделать идеально, до последней строчки. Мои попытки, к сожалению, не приводили к успеху – я просто не успевал! В современном мире не ждут идеальных решений. Делай работу как все, но делай её хорошо! Если Ваш подчиненный может справится с задачей, то ею не стоит заниматься лично. Вам достаточно просто проконтролировать выполнение или поставить задачу проектному менеджеру.
Многозадачность
Чем больше у вас ответственности, чем больше шляп вы носите, тем больше вероятность, что вы станете неэффективной. Это закон переключения между задачами
Дэйв Креншоу
С прискорбием вынужден сообщить Вам , человек - существо однозадачное. Многозадачность – всего лишь иллюзия. Даже выполняя несколько дел одновременно, мозгу приходится переключатся между ними. Конечно, можно натренироваться для выполнения хотя бы двух задач одновременно, но даже с двумя задачами нельзя ручаться за результат.
Выполняйте задачи последовательно, одну за другой, так вы не будете переключатся и, как следствие, выполните задачи быстрее.
Сосредоточенность
Пока вы заняты важной задачей , максимально отрешитесь от всевозможных отвлекающих факторов, таких как телефон, Skype, Вконтакте, коллеги, сообщения на почте, комментарии на сайте и прочее. Любое дело требует тщательно продуманного плана выполнения и внимания. Задачу можно закончить гораздо быстрее, а затем даже взять небольшой перерыв.
Предупреждайте своих коллег, что будете заняты выполнением важной задачи, можно даже повесить знак «не беспокоить». Не отвечайте на сообщения или звонки моментально, если это, конечно, не часть вашей работы.
В некоторых зарубежных ВУЗах доски висят даже в туалете – кто знает, когда вас осенит идея или появится срочное задание? Не отвлекайтесь от текущих дел – запишите идею, оставьте напоминание для задания и возвращайтесь к текущей задаче! Подобное записывание помогает освободить мозг от лишних мыслей во время работы.
Ключевые идеи
Планируйте ваши действия, представляйте себе успешные результаты.
Выделяйте ключевые дела и назначайте для них фиксированное время.
Если задачу может выполнить кто-то другой – не цепляйтесь за неё когтями и зубами, передайте её.
Не вспоминайте о прошлом – важны лишь сегодня и будущее.
Не оставляйте ключевые задачи на потом – делайте их первыми.
Не пробуйте делать много задач одновременно и не отвлекайтесь на раздражители.
Не забывайте между важными задачами заниматься более простыми – они помогут немного отдохнуть и разгрузить мысли.
Помните, рабочий день крайне ограничен – зачастую, Вы не успеете сделать ВСЕ! Ставьте реальные сроки к задачам, будьте довольны своей эффективностью!
Застосування мультикласів у CSS
Автор: Олександр Марченко
Введение в мультиклассы.
В данной статье мы познакомимся с так называемыми сложными селекторами, особенностями их применения. Для более простого восприятия материала рекомендуем просмотреть пятый видео урок из курса HTML & CSS.
Для начала вспомним, что таблицы стилей собираются из наборов правил, которые содержат один или несколько селекторов и конечно же содержат блок определений. Блок определений ограничен фигурными скобками и содержит в себе перечень свойств и выбранных для них значений.
Селектором может быть любой элемент или HTML-тег, для которого возможно задание неких правил форматирования. Принцип определения селекторов довольно простой и имеет следующий синтаксис: Name {Style_rules}.
Здесь Name – это имя любого элемента на вашей странице, а Style_rules – описание правил стиля, которые вы собираетесь применить к элементу.
Отдельно обратим ваше внимание на универсальный селектор, который используют, когда требуется установить стиль абсолютно для всех элементов, присутствующих в веб-документе. Он имеет следующий синтаксис:
<head>
<title>CSS title>
<style>
/*Используем универсальный селектор, который обозначается "*" */
* {
color:forestgreen;
}
style>
head>
<body>
Text1
<p>Text2p>
<div>Text3div>
<br />
<span>Text4span>
body>
В случае, когда необходимо одновременно задать один стиль для двух и более элементов, их перечисляют через запятую:
<head>
<title>CSStitle>
<style>
/*Используем перечисление селекторов p, div */
p, div {
color:forestgreen;
}
style>
head>
<body>
Text1
<p>Text2p>
<div>Text3div>
<br />
<span>Text4span>
body>
В случае, когда необходимо задать уникальное имя для элемента и по нему изменить его стили или обратиться через JavaScript, целесообразно использовать идентификатор, изредка называемый «ID селектором».
Поскольку при создании html-документа невозможно отказаться от определенной иерархии вложенности, важно задуматься о том, чтобы стили для вложенных элементов применялись корректно. Целесообразно воспользоваться конструкцией из вложенных селекторов. В самом простом случае получим следующую конструкцию: name1 name2 {Style_rules}, где name1 – родительский элемент, name2 – дочерний (вложенный) тег. При этом подразумевается следующая разметка <name1><name2>...name2>name1>.
<head>
<title>CSStitle>
<style>
div p {
background-color: darkgrey;
color: red;
font-size: 20px;
}
style>
head>
<body>
<p>Параграф 1 p>
<div>
<p>Параграф 2 p>
div>
body>
Стоит помнить, что стили, предопределенные для тега div, также возымели бы свое действие на содержимое тега p, также допускается произвольный уровень вложенности тегов.
Данная конструкция имеет следующий синтаксис: #Name { Style rules }. Стоит помнить, что имена идентификаторов должны быть уникальными, дабы не вызывать коллизий при обращениях, начинаться с латинских символов, в них разрешено включать символы дефиса и нижнего подчеркивания «-», «_». Когда необходимо применить стили из идентификатора определенному тегу, используется атрибут id, которому передается значение – имя идентификатора без решетки.
<head>
<title>CSStitle>
<style>
#id1 {
background-color: #ffd800;
color: #ff0000;
font-size: 40px;
}
style>
head>
<body>
<p id="id1">Параграф 2 p>
body>
Порой при определении идентификатора используется конструкция name#id_name {Style rules}, где name может обозначать любой тег. Подобная конструкция ограничивает возможность применения стилей, определенных в идентификаторе только к тегам, одноименным указанному в определении.
Что касается применения классов, они актуальны тогда, когда необходимо задать правила форматирования для определенного селектора или же для нескольких элементов. Существуют следующие варианты использования классов:
.class_name {Style rules}
Класс, определенный таким образом, можно связать с любым тегом, достаточно воспользоваться атрибутом class и передать в его значении имя нашего класса.
Name.class_name {Style rules}
Таким образом накладываются ограничения на применение правил из класса лишь в одноименных тегах Name.
<head>
<title>CSStitle>
<style>
.myFirstClass {
background-color: darkcyan;
color: darkgreen;
font-size: 40px;
}
div.mySecondClass {
background-color: darkcyan;
color: darkgreen;
font-size: 20px;
}
style>
head>
<body>
<p class="myFirstClass">Параграф 1 p>
<p class="mySecondClass">Параграф 1p>
<div class="mySecondClass">Параграф 1 div>
body>
Работая с классами, стоит помнить о том, что любому элементу можно добавить сразу несколько классов, просто перечисляя их в атрибуте class без каких-либо знаков пунктуации, через пробел. При этом к текущему элементу будут применятся стили, описанные в каждом из классов в блоке правил.
<head>
<title>CSStitle>
<style>
.myFirstClass {
background-color: darkcyan;
}
.mySecondClass {
color: darkgreen;
font-size: 20px;
}
style>
head>
<body>
<p class="myFirstClass mySecondClass">Параграф 1 p>
body>
Прибегая к мультиклассам, стоит помнить об особенности их работы с повторяющимися правилами, т.е. одноименными свойствами, которые описаны в разных классах и имеют различные значения.
Укажем несколько одинаковых свойств с разными значениями и посмотрим, какие из них будут применены к элементу:
<style>
.myFirstClass {
background-color: darkcyan;
color: darkgreen;
font-size: 40px;
}
.mySecondClass {
background-color: darkgrey;
color: red;
font-size: 20px;
}
style>
Как видим, значения спорных свойств были взяты из того класса, который был описан в коде ниже. Если сменим их очередность, получим следующий результат:
<style>
.mySecondClass {
background-color: darkgrey;
color: red;
font-size: 20px;
}
.myFirstClass {
background-color: darkcyan;
color: darkgreen;
font-size: 40px;
}
--style>
Что касается порядка обьявления используемых классов в атрибуте class непосредвенно в самом теге, он не имеет значения:
<p class="myFirstClass mySecondClass">Параграф 1p>
<p class="mySecondClass myFirstClass">Параграф 1p>
Эти две строки возымеют одинаковое воздействие на форматирование параграфа.
Тиждень знижок на С# та .NET
Автор: Редакція ITVDN
Друзі, з 15 по 22 вересня на ITVDN великі знижки на пакети відео курсів за напрямком C#/.NET – до мінус 50%! Це чудова можливість як для новачків, так і для тих, хто хоче систематизувати та поглибити свої знання.
.NET (“дот нет”) – це сучасна платформа для створення ПЗ від гіганта ІТ-індустрії – компанії Microsoft. У якості основної мови програмування вона застосовує C# (“сі шарп”), яка вирізняється своєю універсальністю, відносною простотою та потужністю.
C# / .NET успішно використовуються у створенні цілого спектру програмних продуктів: серверна сторона веб-додатків, настільні та мобільні ігри і додатки, хмарні сервіси, Big Data, тестування тощо. C# протягом багатьох років стабільно входить в п’ятірку лідерів і ми рекомендуємо цей напрямок як дуже перспективний.
C# чудово підходить новачкам у ІТ, оскільки має відносно простий та зрозумілий синтаксис. Також вона не потребує особливих знань з математики – шкільної бази цілком достатньо.
Акційні ціни – лише з 15 по 22 вересня:
.NET Developer – 60 USD (замість 119.99)
ASP.NET Core Developer – 52 USD (замість 74.99)
ASP.NET MVC Developer – 63 USD (замість 89.99)
Який пакет підписки обрати?
.NET Developer – якщо ви новачок в ІТ і бажаєте почати вивчення спеціальності з нуля, або ж вже знайомі з C#, але хочете поглибити і вдосконалити свої знання.
Ключові технології пакету .NET Developer:
Мова програмування C# з нуля до поглибленого рівня.
Алгоритми та структури даних і шаблони проектування – сукупність правил з написання гарно оптимізованого, легко масштабованого та зручного для читання коду.
Основи SQL – мова структурованих запитів для роботи з базами даних
Основи Transact SQL – мова для взаємодії із системами управління реляційними базами даних MS SQL Server
Основи Entity Framework Core – об'єктно-орієнтована технологія роботи з даними, орієнтована на .NET Core платформу
Основи роботи з Git – система керування версіями проектів
Також на вас чекатимуть інші додаткові відео курси з таких технологій, як WCF, WPF, UWP, елементи математичної логіки тощо.
Крім доступу до обов'язкових та необов'язкових відео курсів у пакеті підписки – домашні завдання, курсові проекти, тести та сертифікати з вивчених технологій, інтерактивний практикум навичок, онлайн консультація з тренером, диплом зі спеціальності.
Акційна вартість – 60 USD (замість 119.99), доступ до 55 відео курсів на 8 місяців.
ASP.NET Core Developer – цей напрямок підійде для тих, хто впевнено володіє мовою C# і хоче опанувати сучасний фреймворк ASP.NET Core для створення хмарних додатків, котрий відрізняється мультиплатформністю, високою продуктивністю та відкритим вихідним кодом.
Ключові технології пакету ASP.NET Core Developer:
Entity Framework Core – об'єктно-орієнтована технологія роботи з даними, орієнтована на .NET Core платформу.
ASP.NET Core – фреймворк, який використовує середовище виконання .NET Core. Він призначений для розробки якісних сучасних вебдодатків та є продовженням розвитку платформи ASP.NET. Головна особливість – мультиплатформність, висока продуктивність, відкритий вихідний код.
ASP.NET Core Web API – відгалуження ASP.NET Core для зручного створення HTTP-сервісів, що працюють за принципами REST.
ASP.NET Core SignalR – бібліотека з відкритим вихідним кодом, що дозволяє створювати клієнт-серверні програми, які працюють у режимі реального часу.
Крім доступу до обов'язкових та необов'язкових відео курсів у пакеті підписки – домашні завдання, курсові проекти, тести та сертифікати з вивчених технологій, інтерактивний практикум навичок, онлайн консультація з тренером, диплом зі спеціальності.
Акційна вартість – 63 USD (замість 89.99) – доступ до 22 відео курсів на 6 місяців.
ASP.NET MVC Developer – цей напрямок підійде для тих, хто впевнено володіє мовою C# і хоче рухатися далі – опановувати потужний фреймворк для веброзроблення під платформу Windows – ASP.NET MVC, а також допоміжними технологіями.
Ключові технології пакету ASP.NET MVC Developer:
Entity Framework 6 – об'єктно-орієнтована технологія роботи з даними (версія 6).
ASP.NET MVC – фреймворк від компанії Microsoft для створення вебдодатків, динамічних вебсайтів та інтерактивних сторінок, який орієнтований на застосування Model-View-Controller архітектури.
ASP.NET Web API 2 – технологія для створення власних Web API.
Крім доступу до обов'язкових та необов'язкових відео курсів у пакеті підписки – домашні завдання, курсові проекти, тести та сертифікати з вивчених технологій, інтерактивний практикум навичок, онлайн консультація з тренером, диплом зі спеціальності.
Акційна вартість – 52 USD (замість 74.99) – доступ до 24 відео курсів на 5 місяців.
Подарункові сертифікати також беруть участь в акції!
Хочете порадувати друга чи близьку людину, яка бажає стати програмістом? Пропонуємо придбати Подарунковий сертифікат за спеціальністю за акційною ціною. Власник сертифікату може активувати його протягом одного року з моменту придбання.
Терміни акції: з 15 по 22 вересня 2022 року.
Увага! З 24 лютого 2022 року ми не надаємо послуги громадянам росії та білорусі.
Як стати Java розробником у 2021
Автор: Максим Федосов
<p>В вебинаре мы будем говорить о том, как начать свой путь в качестве Java разработчика - от новичка без опыта в программировании до уровня специалиста, востребованного на рынке.</p>
<p>В вебинаре будут рассмотрены две стороны:</p>
<ul>
<li><strong>Что учить</strong> – автор поделится своим виденьем того, что нужно учить в первую очередь как базу, что нужно осваивать на этапе поиска первой работы, и что нужно доучивать, когда специалист уже работает ( на примере Java Enterprise стэка).</li>
<li><strong>Как искать работу</strong> - со стороны построения карьеры речь пойдет о том, какие пути можно выбрать для построения карьеры, о рынке с точки зрения работодателя, курсов, соискателей. Какой проект лучше выбрать, как часто менять работу, как развивать свою карьеру.</li>
</ul>
<p>Весь вебинар будет разделен на 2 части - до первой работы и во время работы. В результате у начинающих специалистов появится конкретный план действий для того, чтобы начать карьеру, а у работающих специалистов появится понимание того, как расти дальше.</p>
<p><strong>План вебинара:</strong></p>
<p>1) Знакомство, немного о себе и своем пути в IT сфере.</p>
<p><strong>2) Что нужно учить начинающему Java</strong><strong> разработчику</strong></p>
<ul>
<li>Подготовка к смене или обретению профессии. Настройка рабочего окружения, английский язык, выбор стратегии, университет, курсы, самостоятельное обучение, ментор, книги, практика.</li>
<li>От общего к частному. Стандартная схема работы приложений в энтерпрайз.</li>
<li>Hello World application. Один из ключевых шагов для изучения новых технологий.</li>
<li>Базовый синтаксис. Примитивные переменные, операторы, циклы, условия и все с чем мы работаем примерно с 1950 года.</li>
<li>Объектно-ориентированное программирование (ООП). Основные принципы ООП (наследование, полиморфизм, инкапсуляция, абстракция) их проявления в коде, класс Object и его методы, понятия “класс”, “конструктор”, “метод”, “объект”, сигнатура метода. </li>
<li>Объекты, хранящие значение. Класс String. Его методы, неизменяемость, String pool. Другие обертки над примитивами.</li>
<li>Множества в Java. Arrays (Массивы) Collections (Коллекции) и Maps (Карты). Иерархия Collection, иерархия Map. Множества, которые используются постоянно и о которых спрашивают на собеседованиях и те, о существовании которых просто достаточно знать . Отличия ArrayList от LinkedList. HashMap от HashSet. Array от ArrayList. Алгоритмы, Дженерики, деревья.</li>
<li>Обработка исключений. Иерархия исключений, проверяемые и непроверяемые исключения. Error и Exception.</li>
<li>Продвинутые темы, знакомство. Функциональное программирование, лямбда выражения, функциональные интерфейсы, стримы, IO (Input Output(ввод и вывод данных)), Serialization, Multithreading, Concurrency.</li>
<li>Базы данных. Реляционные и NoSQL базы данных, язык запросов SQL, Joinы и их типы, Postgres и другие базы данных, связи между таблицами.</li>
<li>Repository уровень. Взаимодействие Объектно-ориентированной модели с реляционной. JDBC, JPA + Hiberante, JPQL/HQL, Spring Data.</li>
<li>Spring framework. Inversion of Control и Dependency injection. Reflection. Аннотации: Bean, Controller, Service, Component, Repository, Configuration и другие. Spring Security.</li>
</ul>
<p><strong>3) Наработка практики программирования. Портфолио</strong></p>
<ul>
<li>Pet project с примером. Spring, JPA + HIbernate, Controller + Thymeleaf/RestController, Postgres. MVC архитектура.</li>
<li>Портфолио. Spring Boot, Spring Data, Jira, Git branches и команда, code review, обсуждения архитектуры, отдельная идея.</li>
</ul>
<p><strong>4) Подготовка к поиску работы и дальнейшая карьера</strong></p>
<ul>
<li>CV, LinkedIn аккаунт, djinny.</li>
<li>Подготовка к интервью с HR. Английский, вопросы, ответы, тестовые задания, софт скиллы.</li>
<li>Подготовка к техническому интервью. Mock собеседования, материалы. SOLID, KISS, DRY и прочие важные для собеседования вопросы.</li>
<li>Поиск работы и прохождение собеседований. Активность в LinkedIn, Djinny, Dou и через знакомых в компаниях.</li>
<li>Первые 3 месяца на проекте. Чего обычно ждут от Trainee или Junior. Как продолжать расти.</li>
<li>Первый год. Книги, которые нужно прочитать, продвинутые темы, в которые нужно вникнуть, GOF паттерны, сертификации.</li>
<li>Второй год. Микро-сервисы, Облачные технологии, другие технологии.</li>
</ul>
<p><strong>Целевая аудитория:</strong></p>
<p>Данный вебинар будет интересен людям, думающим о том, чтобы стать Java разработчиком, начинающим специалистам, которые уже сделали свой выбор и двигаются к поиску первой работы, а также trainee и junior разработчикам, которые уже работают на своих первых проектах и думают о том, куда двигаться дальше.</p>
Що має знати C# .NET розробник у 2023 році
Автор: Влад Сверчков
Мова програмування C#
ООП
Алгоритми та структури даних
Шаблони проєктування
Бази даних
SQL
Entity Framework Core
LINQ
ASP.NET
ASP.NET Core
Git
Основи FrontEnd
Англійська мова
Підсумки
На сьогоднішній день .NET програміст може застосовувати свої навички у різних сферах розроблення програмних продуктів:
створення веб-застосунків та веб-сервісів;
створення настільних додатків;
створення хмарних сервісів;
створення ігор;
створення мобільних застосунків.
Коли говорять про .NET розробників, мають на увазі програмістів, які пишуть мовою C#. Ця мова програмування, як і вся платформа .NET, була створена, розвивається та підтримується компанією Microsoft, котра стабільно вже кілька десятиліть входить до ТОП-10 компаній – світових лідерів ринку інформаційних технологій. Усі продукти компанії Microsoft створено на платформі .NET. Які ж технології необхідно вивчити, щоб стати .NET програмістом?
Оскільки левова частка .NET-вакансій припадає саме на веб-сегмент, дана стаття буде охоплювати як фундамент, яким зобов’язані володіти усі розробники цієї платформи, так і основні технології серверної сторони веб-девелопменту.
Мова програмування C# (“сі шарп”)
Будь-який .NET розробник не може називатися і бути таким, якщо він не вміє гарно програмувати мовою C#.
Це універсальна об'єктно-орієнтована мова, яка є потужним інструментом створення програмного забезпечення з широкою сферою застосування. При такій високій функціональності вона досить нескладна у вивченні і відмінно підійде тим, хто збирається зробити перший крок назустріч програмуванню.
Завдяки широкому спектру застосування С# є дуже затребуваною мовою. Різні ресурси з пошуку роботи пропонують велику кількість вакансій, причому як на великі проєкти з чітко визначеним консервативним стеком технологій, так і в компанії, які створюють новий програмний продукт із застосуванням найсучасніших інструментів.
Компанія Microsoft активно розвиває своє дітище – .NET напрямок, тому C# завжди актуальна, йде розширення функціоналу, додаються нові можливості. Тенденція останніх років - кросплатформність, що реалізується в .NET Core. Безліч навчальних матеріалів, якісна офіційна документація, відео курси та освітні вебінари, дружнє ком’юніті – все це створює максимально комфортні умови для грамотного поетапного вивчення даної мови.
ООП
Об'єктно-орієнтоване програмування - це методологія розробки програмного забезпечення, в основі якої лежать чотири головні принципи: абстракція, інкапсуляція, наслідування та поліморфізм. Оскільки C# є об'єктно-орієнтованою мовою, необхідність вивчення та повного розуміння ООП парадигм є обов'язковою. Однак, є і приємна новина: всі принципи швидко та легко засвоюються під час вивчення C#.
Алгоритми та структури даних
Розуміння алгоритмів та структур даних – також обов'язкові знання для будь-якого програміста.
Вивчивши структури даних, ви зможете управляти складністю своїх програм, роблячи їх більш доступними для розуміння, а також розробляти високопродуктивні програми, які ефективно працюватимуть з пам'яттю.
Знання алгоритмів дозволить вам створювати складні конструкції для ефективного розв'язання широкого спектру завдань.
Шаблони проєктування
Патерни (вони ж шаблони) являють собою архітектурні конструкції, які описують типові способи вирішення поширених завдань, що виникають у ході проєктування програмного забезпечення. Усього існує понад два десятки шаблонів, проте знати їх усі - це обов'язок архітектора, а не .NET розробника. Зазвичай в одному проєкті використовується невелика кількість патернів, тому вам достатньо пам’ятати лише найпопулярніші з них.
Бази даних
Кожний додаток оперує даними – від інтернет-магазинів та банківських систем до корпоративних застосунків і соціальних мереж. Реєстрація, авторизація та автентифікація користувача, прийом, зміна та відправлення даних на сервер або навіть просте збереження конфігурації застосунку – все це є даними, які потребують окремого місця для їх збереження.
Цим сховищем слугують бази даних (БД), що являють собою організовану структуру для прийому, зберігання та оброблення даних різного формату – від ПІБ та номерів телефону до зображень і відео контенту.
Саме тому знання БД є дуже важливими в тому числі і для .NET розробників. Необхідно володіти базовою теорією з БД: основні терміни, реляційні та нереляційні бази даних (ви працюватимете саме з реляційними – такими, які мають реляційну структуру), нормалізація, відношення one-to-one, one-to-many та many-to-many, пошук і впорядкування інформації, робота з таблицями тощо.
SQL
Structured Query Language – декларативна мова структурованих запитів, яка створена для взаємодії з базами даних. Особливість SQL полягає в тому, що вона лише описує необхідні компоненти та бажані результати, не вказуючи, як саме ці результати мають бути отримані.
Вивчення мови запитів дуже тісно пов’язане з вивченням теорії баз даних, тому заглиблюючись в БД ви неодмінно почнете практикуватися та набивати руку і з SQL.
Entity Framework Core
Entity Framework – спеціальна об'єктно-орієнтована технологія на базі фреймворку .NET, яка дозволяє розробникам отримувати доступ до даних, використовуючи концептуальну об'єктну модель, а не безпосередньо реляційну базу даних. Це дає можливість абстрагуватися від самої БД і працювати з даними на більш високому рівні абстракції, який є зрозумілішим та зручнішим для людини. Завдяки такому підходу зменшується кількість коду, необхідного для отримання доступу до бази, зростає продуктивність та зменшується час на підтримку об'єктів у застосунках, що працюють з даними.
У двох словах, ця технологія дозволяє програмісту абстрагуватися від самої бази даних та працювати з даними незалежно від типу сховища.
LINQ
Language Integrated Query (мова інтегрованих запитів) – це проста та зручна .NET-технологія доступу до даних. Особливість даної мови запитів: можливість застосування до всіх джерел даних (XML-документи, XML-потоки, набори даних ADO.NET, бази даних SQL, масиви та колекції .NET тощо) одного й того ж самого підходу вибірки даних.
ASP.NET
Active Server Pages для .NET - платформа, що використовує середовище виконання .NET Framework та надає необхідні служби для створення серверних веб-застосунків та веб-сервісів. Є розвитком більш ранньої технології Microsoft ASP.
ASP.NET базується на середовищі виконання Common Language Runtime (CLR), яке є основою всіх застосунків Microsoft .NET. Також дана платформа має перевагу у швидкості порівняно зі скриптовими технологіями.
ASP.NET MVC є розширенням ASP.NET і представляє собою платформу для створення веб-сервісів за допомогою патерну MVC. Даний шаблон передбачає поділ застосунку на три компоненти: Модель, Представлення, Контролер, завдяки чому реалізується концепція поділу і закріплення відповідальності за кожним компонентом, що спрощує розробку проєктів.
ASP.NET Core
Фреймворк від компанії Microsoft, який використовує середовище виконання .NET Core, призначений для розроблення якісних сучасних веб-застосунків і є продовженням розвитку платформи ASP.NET. Однак це не просто оновлена технологія. Вихід ASP.NET Core фактично позначив якісну зміну усієї платформи. Остання версія 7.0 була випущена нещодавно – навесні 2022 року. Головні особливості ASP.NET Core:
наявність відкритого вихідного коду на GitHub;
кросплатформність;
модульність;
розширюваність;
можливість застосування хмарних технологій.
Докладнішу інформацію про всі нововведення можна знайти на офіційному сайті Microsoft.
Таким чином, платформа .NET Core істотно розширила сфери застосування технології ASP.NET і надала розробникам велику кількість можливостей щодо створення програмного продукту.
Git
Найбільш популярна система контролю версій, яка дозволяє вести історію розроблення проєкту з можливістю доступу до кожної збереженої версії.
Дані системи дозволяють команді програмістів працювати над одним проєктом одночасно, зберігаючи внесені зміни, а також відслідковувати виконання завдань кожним членом групи.
Не у всіх вакансіях можна зустріти серед вимог володіння системою контролю версій, проте знання Git або її аналогів дасть вам додаткову перевагу перед рештою кандидатів.
Основи FrontEnd
У великій кількості вакансій роботодавці очікують, що .NET розробник серверної частини також має бути знайомий і з фронтенд-технологіями, які використовуються на клієнтській стороні під час створення веб-застосунків:
HTML & CSS – мови верстання веб-сайтів та веб-сервісів. HTML служить каркасом, який визначає основну архітектуру зовнішнього вигляду, а CSS – каскадні таблиці стилів, котрі допомагають збагатити зовнішній вигляд застосунку. Дуже легкі мови верстання, які вивчаються швидко та без проблем.
Основи JavaScript (JS) – це мова програмування, якою створюється програмна логіка клієнтської сторони веб-застосунків, а також різні анімації. JavaScript є однією з найлегших мов програмування, тому якщо ви гарно знатимете C#, розібратися в JS для вас буде дуже швидкою справою.
Основи Angular або React. React – фронтенд-бібліотека, яка має відносно невисокий поріг входження і користується великою популярністю завдяки своїй універсальності, в той час як Angular – потужний фреймворк, який є більш складним, але при цьому краще себе проявляє у масивних масштабованих проєктах.
Знання FrontEnd-стеку не в усіх вакансіях є обов’язковим, але в багатьох вони відзначені. Відповідно, володіння основами цих інструментів дає великий бонус під час розгляду резюме або на співбесіді.
Англійська мова
Традиційна вимога для кожного розробника в ІТ. Знання мови на рівні читання технічної документації та коментування коду цілком достатньо. Але чим вищий рівень англійської у вас буде, тим більше шансів отримати job-офер, оскільки англійська може використовуватися як для комунікації з іншими членами команди, так і для взаємодії із замовником.
Підведемо підсумки
У статті були перераховані основні технології, які повинен знати кожен .NET-програміст. Оскільки веб-розроблення нині є дуже популярним та затребуваним, ми також додали до списку .NET засоби, які використовуються під час створення відповідних серверних веб-рішень. Однак серед усіх пунктів найбільш важливим є знання мови С# - кожен "дотнетчик" зобов'язаний нею володіти на високому рівні.
У свою чергу, перелік можна доповнити такими технологіями, як TDD (розробка через тестування), WCF, Unit тестування, рефакторинг додатків. Їхнє знання не є обов'язковим для джуніорів, проте вигідно виділяє вас серед інших кандидатів і показує, що ви приділяєте особливу увагу чистоті, охайності та читабельності коду.
Також ви можете ознайомитись зі списком усіх необхідних для вивчення технологій на сторінці спеціальності .NET Developer. Комплексна програма навчання складається із 55 відео курсів загальною тривалістю понад 410 годин. Перейшовши на сторінку, ви знайдете багато корисної інформації як для новачка, так і для розробника, який бажає поглибити та доповнити свої знання.
Якщо вас більше цікавить живе онлайн навчання в групі з ментором та іншими студентами, рекомендуємо звернути увагу на формат Live Online навчання. Регулярні заняття в Zoom, виконання і перевірка д/з, розроблення курсових проєктів, спілкування та підтримка в телеграм-групі з ментором та одногрупниками – це та багато іншого сприяє максимально якісному та швидкому опануванню спеціальності .NET Developer на ITVDN.
Корисні ресурси для вивчення C# та .NET ви знайдете у нашому вебінарі «Огляд корисних ресурсів для вивчення C# та .NET з нуля».
ITVDN бажає вам досягнення ваших цілей та готовий бути надійним помічником у питаннях вивчення програмування.
Залишайтеся з ITVDN!
ТОП-10 найкращих відео з Java від ITVDN
Автор: Влад Сверчков
Вітаємо, друзі!
Сьогодні на вас чекає підбірка класних, наповнених корисним контентом відео від ITVDN за напрямком Java. Топ насичений як теоретичними відеоматеріалами, які допомагають побудувати ефективне навчання, так і практичними вебінарами, орієнтованими на прокачування навичок програмування за допомогою джави та супутніх технологій (фреймворк Spring, Elasticsearch). Отже, які відео увійшли до цього рейтингу?
Карта спеціальності Java розробник
Автор – Андрій Бондаренко, Android Developer & Trainer, Samsung R&D Institute, Ukraine
Java – це популярна об'єктно-орієнтована мова програмування, якою написані програми для більш ніж 3-х мільярдів пристроїв по всій планеті. Сфера її застосування практично безмежна, а ті, хто добре володіють Java, мають великі можливості та завжди будуть забезпечені цікавими завданнями та високооплачуваною роботою.
На вебінарі ви отримаєте відповіді на всі питання, пов'язані з навчанням, набуттям досвіду, розстановкою пріоритетів у виборі технологій та навчальних матеріалів, а також кар'єрою програміста Java-напрямку.
Програма зустрічі:
Хто такий Java розробник?
Актуальність спеціальності та затребуваність на IT-ринку.
Як стати Java розробником:
попередні вимоги;
картка спеціальності;
огляд обов'язкових та факультативних технологій.
Де та як вивчити мову програмування Java.
Як отримати перший практичний досвід
Стажування та перша робота - можливості і перспективи.
Питання та відповіді.
Створення базового Spring Boot веб-сервісу на Java
Автор – В'ячеслав Аксьонов, Java/Kotlin Software Engineer
Spring Boot – це найпопулярніший фреймворк для розроблення веб-додатків на Java. У вебінарі буде розглянуто, як влаштовані додатки, котрі створені з використанням Spring Boot, на прикладі найпростішого stateless веб-сервісу. Також автор розгляне http взаємодії з використанням REST, побудову масштабованої архітектури бізнес-логіки, взаємодію з базами даних через найбільш популярні та прості прийоми.
План вебінару:
Що таке Spring/Spring Boot та Dependency Injection.
Контекст та як його створювати.
@Service/@Component/@Repository/@Controller – що все це таке і навіщо потрібно.
Створюємо шаблон проєкту Spring Boot.
Пишемо веб-сервіс із нуля.
Розглядаємо найбільш простий та зручний спосіб роботи з базою даних.
Перевіряємо працездатність та відповідаємо на запитання.
3. Як стати Java розробником у 2021?
Автор – Максим Федосов, Java Developer
З цього вебінару ви дізнаєтеся, як почати свій шлях у якості Java розробника – від новачка без досвіду в програмуванні до рівня фахівця, затребуваного на ринку.
У вебінарі будуть розглянуті дві сторони:
Що вчити: автор поділиться своїм баченням того, що потрібно вивчати насамперед як базу, що потрібно опановувати на етапі пошуку першої роботи, і що потрібно підтягнути, коли спеціаліст вже працює (на прикладі Java стеку).
Як шукати роботу: з боку побудови кар'єри йтиметься про те, які шляхи можна обрати для побудови кар'єри, про ринок з точки зору роботодавця, курсів, шукачів. Який проєкт краще обрати, як часто змінювати роботу, як розвивати свою кар'єру.
Весь вебінар буде розділено на 2 частини – до першої роботи та під час роботи. В результаті у фахівців-початківців з'явиться конкретний план дій для того, щоб розпочати кар'єру, а у працюючих фахівців — розуміння того, як рости далі.
План вебінару:
Знайомство, трохи про себе та свій шлях у IT-сфері.
Що потрібно вчити розробнику-початківцю Java.
Напрацювання практики програмування. Портфоліо.
Підготовка до пошуку роботи та подальша кар'єра.
4. Elasticsearch - пишемо свій пошуковик на Java
Автор – Федір Яременко, Senior Java Developer
На вебінарі буде розглянуто, як на Java реалізувати повнотекстовий пошук на об'ємному масиві документів з мінімальними затримками за допомогою Elasticsearch.
План вебінару:
Про повнотекстовий пошук та індексацію
Огляд Elasticsearch
Налаштування проєкту
Додавання індексів
Пошук за індексом
Пошук за кількома полями
Пошук у знайденому
Агрегація результатів пошуку
Пошук запитів з помилками
Інші корисні опції пошуку
Ранжування результатів
Налаштування форматування результатів
Пагінація
Налаштування індексів для російської та української мов
Асинхронні виклики
Масштабування за допомогою кластера
Візуалізація даних за допомогою Kibana
Висновок
5. Створення 2D гри Танчики з Денді на Java з нуля
Автор – Андрій Бондаренко, Android Developer & Trainer, Samsung R&D Institute, Ukraine
Дане відео є захоплюючим онлайн тренінгом із написання графічної гри "Танки", який допоможе легко і швидко познайомитися з практичною стороною розроблення на Java. Нуль теорії – лише практика.
Кому це буде корисно:
Новачкам. Відсутність досвіду у програмуванні не повинна вас зупиняти. Ми даємо вам шанс зробити свою першу програму на Java та отримати досвід практичного застосування цієї мови програмування у створенні справжньої комп'ютерної гри.
Розробникам-початківцям Java без досвіду. Ви зможете поглибити і застосувати на практиці знання мови Java під керівництвом тренера.
Чого ви навчитеся:
Писати прості програми та підпрограми з використанням мови Java
Працювати з масивами даних
Використовувати типи даних та класи Java
Застосовувати всі базові навички (змінні, умовні конструкції, цикли, методи) на практиці
Програма тренінгу:
Створення карти поля бою.
Робота над пересуванням танка
Реалізація стрільби.
Навчання танка рухатися у вказаний квадрант.
Додавання танка-ворога.
Підсумок: танк проходить все поле бою та чистить його.
Відповіді на питання. Куди розвиватись далі?
6. Spring для початківців. Огляд можливостей та переваг. Початок роботи зі Spring
Автор – Дзюба Роман, Java Developer
Spring – це один з найбільш популярних та універсальних фреймворків для створення веб-додатків для бізнесу. Він дає Java-розробникам більшу свободу в проєктуванні програм, надаючи засоби вирішення проблем корпоративного масштабу. Spring має велику документацію і досить простий у використанні.
Дане відео є першим відеоуроком з відео курсу “Spring”, який знайомить з однойменним фреймворком.
На самому курсі розглядаються різні способи використання модулів Spring, написання REST додатків, використання MVC моделей та інші теми.
Проходження курсу за даним фреймворком буде корисним як тим, хто тільки познайомився з мовою Java і шукає, що вчити далі, так і тим, хто вже має певні знання і хоче освіжити в пам'яті навички використання SpringCore, SpringWeb, SpringSecurity.
Головні теми цього відео:
Ознайомлення із базовими принципами фреймворку.
Переваги Spring, знайомство з основними принципами ООП та поняттям POJO.
Області видимості Java Bean.
7. Створення гри Морський Бій на Java з нуля. (Частина 1, Частина 2)
Автор – Антон Кашніков, Java Developer, тренер-консультант CyberBionic Systematics
Відео у форматі онлайн тренінгу з написання консольної гри "Морський бій". З його допомогою ви швидко познайомитеся з Java, відразу ж розпочавши розроблення. Як результат – ви випробуєте джаву у справі, відчуєте її потужність, а також отримаєте на виході власноруч зроблену гру, яка після доопрацювання може стати чудовим проєктом у вашому майбутньому резюме Java розробника.
Програма тренінгу:
Частина 1
Знайомство із засобом розроблення IntelliJ IDEA та мовою програмування Java.
Розбивання проєкту на підзавдання.
Робота з масивами під час створення поля бою.
Створення перших об'єктів.
Використання об'єктів з масивами.
Частина 2
Тонкості роботи з консоллю при відображенні ігрових об'єктів.
Продумування логіки гри.
Створення геймплею.
Оброблення винятків.
Розбір помилок.
Підбиття підсумків.
Що потрібно знати Java розробнику? ➤ Як вивчити Java?
Автор – Дмитро Саєвський, Java Developer
На цьому вебінарі ви дізнаєтеся, чим займається джавіст, які типи розроблення Java найбільш затребувані. Також автор розгляне весь шлях Java розробника з моменту вибору цієї спеціальності до рівня Senior.
План вебінару:
Типи розроблення Java.
Якими вміннями повинен володіти Java розробник.
Особливості Java. Історія версій Java.
З чого розпочати навчання та скільки потрібно вчитися?
Складання плану навчання.
Кар'єрний шлях розробника.
Рекомендовані посилання.
Рекомендована література.
9. Підготовка до співбесіди з позицією Junior Java Developer
Авторка – Вікторія Силенко, Java розробниця desktop та web додатків.
Незважаючи на дату випуску даного вебінару, він досі залишається актуальним для тих, хто вирішив пов'язати свою кар'єру з розробленням Java і при цьому прагне з успіхом пройти співбесіду на позицію Junior Java Developer.
На цьому вебінарі ви дізнаєтесь, як правильно складати резюме, які популярні питання на співбесіді (+ відповіді), теми під час перевірки рівня англійської мови, як добре зарекомендувати себе у перші місяці роботи.
10. Створення багатопотокового клієнт-серверного додатку на Java
Автор – Євген Волосатов, професійний програміст, викладач мови Java у коледжі, автор відео курсів з мов C#, Java, PHP; має більше 20 років досвіду у якості провідного програміста в різних фірмах, має значний викладацький досвід; 6 років досвіду у проведенні вебінарів та створенні відео курсів
Євген Волосатов – справжній метр в області алгоритмів і структур даних на C#, Java, PHP — в даному вебінарі демонструє, як необхідно створювати багатопоточний клієнт-серверний додаток мовою Java.
На цьому вебінарі на вас чекає практика, котра зачіпає сокети та потоки. За допомогою Java буде написано невелику клієнт-серверну програму на сокетах. Для цього автор створить дві різні програми, які запускаються на різних комп'ютерах, але при цьому працюють спільно, надсилаючи одна одній дані.
Для зв'язку програм одна з одною буде створено універсальний клас Phone – він використовуватиметься як на сервері, так і на клієнті в JAR файлі. Наприкінці вебінару автор додасть багатопоточність до серверної частини, щоб сервер міг обробляти кілька клієнтів одночасно.
План вебінару:
Найпростіший сервер – Автовідповідач.
Найпростіший клієнт – Вміти читати.
Клієнт-серверний діалог.
Універсальний сокет – Телефон.
Серверна багатопоточність.
Для успішного засвоєння матеріалу необхідні базові навички роботи з Java у середовищі IntelliJ IDEA.
Вивчайте Java розроблення на ITVDN!
Як правильно працювати з REST API
Автор: Zell Liew
Коротко про мене
Мене звати Зел, я розробник-фрілансер із Сінгапуру. У вільний від роботи час я люблю розбиратися в коді і принагідно публікувати у своєму блозі ті цікавості, які я виявив чи вивчив.
Вступ
Швидше за все вам уже доводилося чути про такий термін, як REST API, особливо якщо ви стикалися з необхідністю отримання даних з іншого джерела (такого як Twitter або GitHub). Але що ж все-таки це таке? Що ми можемо робити з цим і як ми можемо це використовувати?
У цій статті ви дізнаєтеся все про REST API для того, щоб працювати з ними та читати пов'язану з ними документацію.
Що ж таке REST API?
Давайте уявимо, що ви намагаєтеся знайти фільми про Бетмена на YouTube. Ви відкриваєте сайт, вбиваєте у форму пошуку слово «Бетмен», тиснете «Окей» і бачите список фільмів про супергероя. Так само працює і WEB API. Ви шукаєте щось і отримуєте список результатів від ресурсу, до якого здійснюєте запит.
Дослівно API розшифровується як Application Programming Interface. Це набір правил, що дозволяє програмам спілкуватися одна з одною. Розробник створює API на сервері та дозволяє клієнтам звертатися до нього.
REST – це архітектурний підхід, що визначає, як API мають виглядати. Читається як "Representational State Transfer". Цьому набору правил і слідує розробник під час створення свого застосунку. Одне з цих правил каже, що при зверненні до певної адреси ви повинні отримувати певний набір даних (ресурс).
Кожна адреса - маршрут, пакет даних - запит, у той час як результуючий ресурс – відповідь.
Анатомія запиту
Важливо розуміти структуру запиту:
Маршрут відправки.
Тип методу.
Заголовки.
Тіло (або дані).
Маршрут – це адреса, за якою надсилається ваш запит. Його структура приблизно така:
Root-endpoint - це точка прийому запиту на стороні сервера (API). Наприклад, кінцева точка GitHub - https://api.github.com.
Шлях визначає ресурс, до якого здійснюється запит. Це щось на кшталт автовідповідача, який просить вас натиснути 1 для одного сервісу, 2 для іншого і так далі.
Для розуміння того, які саме шляхи вам доступні, вам слід переглянути документацію. Наприклад, припустимо, ви хочете отримати список репозиторіїв для конкретного користувача на Git. Згідно з документацією, ви можете використати наступний шлях для цього:
Вам слід підставити під пропуск ім'я користувача. Наприклад, щоб знайти список моїх репозиторіїв, ви можете використати маршрут:
Остання частина маршруту – це параметри запиту. Технічно запити не є частиною REST-архітектури, але на практиці зараз все ґрунтується на них. Тож давайте поговоримо про них детальніше. Параметри запиту дозволяють використовувати у запиті набори пар «ключ-значення». Вони завжди починаються знаком питання. Кожна пара параметрів після чого розділяється амперсандом (щось подібне до цього):
Як тільки ви намагаєтеся отримати список репозиторіїв для користувача, ви додаєте ці три опціональні параметри і після чого отримуєте наступний результат:
Якщо ж ви бажаєте отримати список моїх недавно запушених репозиторіїв, вам слід ввести наступне:
Отже, як же зрозуміти, що маршрути робочі? Що ж, настав час перевірити їх на практиці!
Тестування за допомогою Curl
Ви можете надіслати запит за допомогою будь-якої мови програмування. JavaScript може використовувати методи на кшталт Fetch API або JQuery`s Ajax Method. Рубі використовує інше. І так далі.
У цій статті я використовуватиму таку утилітку, як Curl. Справа в тому, що вона вказана в офіційній документації для веб-сервісів. Якщо ви зрозумієте, як використовувати цю утиліту, ви зрозумієте, як працювати з API. Після чого ви можете робити запити будь-якою зручною для вас мовою.
Перед тим, як продовжити, слід переконатися, що Curl встановлений на вашій машині.
Якщо ж він не встановлений, саме час встановити. У такому разі ви отримаєте помилку "command not found".
Для того щоб використовувати утиліту, необхідно ввести наступне (за прикладом):
І як тільки ви підтверджуєте введення, ви отримуєте відповідь (на зразок цього):
Щоб отримати список користувацьких репозиторіїв, вам слід змінити запит за тим же принципом, який був обговорений раніше. Наприклад, щоб отримати список моїх репозиторіїв, вам слід ввести наступне:
Якщо ж ви бажаєте включити параметри запитів, переконайтеся, що ви їх екрануєте. Справа в тому, що без екранування знаки питання і рівності розцінюються системою як спецсимволи і виконання команди відбудеться з помилкою.
Також спробуйте інші команди та зробіть запити! В результаті ви отримуєте схожі відповіді.
JSON
JSON – JavaScript Object Notation – загальний формат для надсилання та прийому даних за допомогою REST API. Відповідь, що відправляється Github, також міститься у форматі JSON.
Зміст об'єкту цього формату приблизно наступний:
Повертаємось до анатомії запиту.
Ви вивчили, що запит складається із чотирьох частин:
Маршрут відправки.
Тип методу.
Заголовки.
Тіло (або дані).
Тепер давайте спробуємо розібратися з рештою.
Тип методу
Метод позначає тип запиту, який здійснюється; де-факто він є специфікацією операції, яку повинен здійснити сервер. Усього існує п'ять типів запитів:
GET
POST
PUT
PATCH
DELETE
GET – використовується для отримання з боку серверу певного ресурсу. Якщо ви здійснюєте цей запит, сервер шукає інформацію та відправляє її вам назад. По суті, він здійснює операцію читання на сервері. Дефолтний тип запитів.
POST – необхідний для створення певного ресурсу на сервері. Сервер створює в базі даних нову сутність та сповіщує вас, чи був процес створення успішним. По суті, це операція створення.
PUT та PATCH – використовуються для оновлення певної інформації на сервері. У такому разі сервер просто змінює інформацію існуючих сутностей у базі даних та повідомляє про успіх виконання операції.
DELETE – як і випливає з назви, видаляє вказану сутність із бази чи сигналізує про помилку, якщо такої сутності в базі не було.
Сам же API дозволяє вказати, який метод має бути використаний у певних контекстних ситуаціях.
GET запит у цьому випадку необхідний, щоб одержати список всіх репозиторіїв зазначеного користувача. Також можна використовувати curl:
Спробуйте надіслати цей запит. Як відповідь ви отримаєте вимогу про аутентифікацію.
Заголовки
Заголовки використовуються для надання інформації як клієнту, так і серверу. Взагалі, їх можна використовувати для багато чого; наприклад, та сама автентифікація та авторизація. На офіційній сторінці MDN можна знайти список доступних заголовків.
Заголовки являють собою пари ключів-значень. Приклад:
Також приклад із використанням curl:
(Примітка: заголовок Content-Type у випадку Github для роботи не є обов'язковим. Це всього лише приклад використання заголовка в запиті, нічого більше).
Для перегляду надісланих заголовком даних можна використовувати наступне:
Тут зірочка відноситься до додаткової інформації, наданої за допомогою curl. > відноситься до заголовків запиту, а <, відповідно, - до заголовків відповіді.
Щоб надіслати інформацію з curl, використовуйте наступне:
Для відправки множинних полів ми можемо використати декілька подібних конструкцій:
Також, якщо необхідно, ви можете розбити ваш запит на декілька ліній для забезпечення більшої читабельності:
Якщо ви знаєте, як розгорнути сервер, ви можете створити власний API та протестувати свої запити. Якщо ж ні, обов'язково спробуйте. Існує безліч інформації, присвяченої цьому.
Якщо ж бажання розгортати свій сервер немає, спробуйте безкоштовну опцію Request bin.
Після чого ви отримаєте адресу, яку спокійно зможете тестувати.
Переконайтеся, що ви створюєте власний request bin, якщо ви хочете протестувати саме ваш запит. Зважайте на те, що дефолтний час існування request bin – 48 годин. Тому ті приклади адрес, які я тут наводжу, на момент прочитання статті давно застаріли.
Тепер спробуйте надіслати деяку інформацію, після чого оновіть свою сторінку.
Якщо все пройде успішно, ви побачите наступне:
За замовчуванням curl відправляє дані так, ніби вони були відправлені за допомогою полів форм. Якщо ви бажаєте надіслати дані через JSON, ваш Content-Type повинен дорівнювати application\json, внаслідок чого вам необхідно відформатувати дані у вигляді JSON-об'єкту.
По суті, це все, що вам необхідно знати про структуру запиту.
Тепер давайте згадаємо про аутентифікацію. Що ж це таке і навіщо вона потрібна?
Аутентифікація
Ви б не дозволили нікому чужому отримати доступ до вашого банківського рахунку без спеціального дозволу, чи не так? За таким же принципом розробники не дозволяють неавторизованим користувачам робити на сервері все, що їм заманеться.
Оскільки POST, PUT, PATCH, DELETE запити змінюють базу даних, розробники повинні завжди бути на варті неавторизованого доступу до них. Проте іноді GET запити також вимагають аутентифікації (наприклад, коли ви хочете переглянути стан вашого банківського рахунку).
У випадку з вебом існує два способи представитися системі:
Через нік і пароль (базова автентифікація)
Через секретний токен
Секретний токен дозволяє представити вас системі через соцмережі на кшталт Github, Google, Twitter і так далі.
Тут же я розгляну лише базову автентифікацію.
Для виконання базової аутентифікації ви можете використовувати наступне:
Спробуйте залогінитися під свій профіль за запитом, вказаним вище. Як тільки ви успішно увійдете у свій профіль, ви побачите відповідь "problems parsing JSON".
Чому? Все просто: системі ви представилися, але - от біда - нічого корисного їй не надали. Усі типи запитів потребують певної інформації.
Тепер же давайте поговоримо про статус-коди та можливі помилки.
Статус-коди та можливі помилки
Деякі з повідомлень, наведених вище, якраз і належать до кодів помилок. Логічно, що вони з'являються лише тоді, коли щось іде не зовсім так, як було заплановано. Що ж до статусу кодів, вони дозволяють вам пізнати успіх (або невдачу) під час виконання певного запиту. Бувають статус-коди від 100 до 500+. Загалом їх можна поділити на такі групи:
200+: запит успішний
300+: запит перенаправлений на інший маршрут
400+: помилка на стороні клієнта
500+: помилка на стороні сервера
Ви можете відлагодити статус відповіді за допомогою –v або –verbose. Наприклад, я спробував отримати доступ до певного ресурсу без авторизації. Відповідно, я спіймав помилку:
У випадку ж, коли запит невірний через помилку в самій інформації, що передається, ви отримуєте статус-код 400:
Версії API
Час від часу розробники оновлюють свої API. Іноді оновлення можуть бути такими сильними, що розробник бажає здійснити реліз нової версії. У такому випадку, якщо ваш застосунок ламається, це відбувається через те, що ви писали код з урахуванням старого компонента, тоді як новий дещо відрізняється в плані реалізації.
Запросити поточну версію API можна двома шляхами.
Через маршурт
Через заголовок
Наприклад Твіттер використовує перший спосіб. На момент написання версія Twitter API була 1.1.
Водночас GitHub використовує інший спосіб:
На закінчення
У цій статті ми розглянули, що таке REST API і як його можна використовувати спільно з curl. Крім того, ви також вивчили, як залогінитись за допомогою запиту і що таке статус-код.
Я щиро сподіваюся, що ця стаття дозволила вам підвищити свій рівень загальних і не дуже знань щодо такого важливого аспекту веб-розробки. Буду радий будь-яким вашим коментарям тут.
Автор перекладу: Євген Лукашук
Джерело
Ще більше матеріалів на цю тему:
ASP.NET Core Web API. Практичний курс
ASP.NET WEB API 2
REST API в Node.js
JAX-RS Client API. Asynchronous REST
Створення API на PHP та JavaScirpt
500+ питань на співбесіді щодо Ruby
Автор: Влад Сверчков
Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 14 июня 2021 года. Оригинальная версия на украинском языке доступна по ссылке.
Junior Ruby Developer
Middle Ruby Developer
Senior Ruby Developer
Что нужно знать, когда проходишь техническое собеседование по Ruby? Конечно, ко всем вопросам готовым не будешь, но мы попросили интервьюеров-практиков прислать свои списки вопросов, а затем обобщили их в одном материале.
Junior
Общие вопросы
1. Какие принципы программирования вы знаете и какие из них вы пытаетесь соблюдать чаще всего?
2. Что такое парадигма ООП? Какие основные составляющие парадигмы?
3. Зачем нужна инкапсуляция? Что может произойти и не произойти, если все методы будут иметь модификатор доступа public?
4. Что такое наследование? Назовите пример(ы) плохого наследования (такое наследование, которое не стоило бы реализовывать).
5. Что такое полиморфизм? Приведите пример использования полиморфизма.
6. Что такое паттерн/шаблон проектирования? Какие шаблоны знаете?
7. Что такое клиент и сервер? Какая механика их взаимодействия?
8. Опишите путь, который проходит запрос после того, как в браузер ввести URL любого ресурса.
9. Что такое протокол HTTP? Какая разница между HTTP и HTTPS?
10. Что такое API? Может ли веб-приложение использовать более одного API?
11. Что такое REST API? Какие действия чаще всего выполняются над ресурсами?
12. Что такое сессия? Что такое cookies? Какая разница между ними?
13. Какие веб-уязвимости знаете? Как от них защититься? Какие есть инструменты, чтобы автоматически контролировать защиту от веб-уязвимостей?
14. Какими критериям пользуетесь для выбора библиотеки?
15. Что такое рефакторинг? Какие должны быть условия для выполнения рефакторинга?
16. Знаете ли вы семейство UNIX-подобных операционных систем (Linux, MacOS)? Назовите команды, которые чаще всего используете в терминале.
17. Что такое аутентификация?
18. Что такое авторизация?
19. Из каких частей состоит HTTP Request и HTTP Response?
20. Какие HTTP-статусы (HTTP-коды) знаете? На какие группы вы могли бы их разделить?
21. Какие HTTP-методы знаете? Зачем используется каждый из них?
Git
22. Знакомы ли вы с системой Git?
23. Для чего нужны ветки в Git? Как сделать ветку?
24. Как скопировать с Git-хостинга (GitHub / GitLab / Bitbucket / другие) проект?
25. Что такое флаг -f? Для чего он и какие минусы использования?
26. Что такое Pull Request? Зачем ветви соединяют через Pull Request?
27. Какие еще команды чаще всего применяете, когда пользуетесь Git?
Ruby
28. Как вы контролируете версии Ruby на своей локальной машине?
29. Что такое метапрограммирование? Какие плюсы и минусы при использовании метапрограммирования?
30. Какой менеджер библиотек для Ruby знаете? Как добавлять библиотеки? Как контролировать версии библиотек?
Style guide
31. Что такое style guide и зачем его используют?
32. Какой популярный линтер контролирует выполнение большей части пунктов с Ruby Style Guide?
Основы Ruby
33. Какие типы переменных есть в Ruby?
34. Что вернётся в результате сложения 10.5 и 10?
35. Чем отличаются переменные, начинающиеся с @, @@ и $?
36. Что такое attr_reader, attr_writer, attr_accessor и зачем они?
37. Что такое метод?
38. Что значит "?" в конце названия методов? Что означает "!" в конце названия методов?
39. Чем отличается энумератор map от each?
40. Что такое модуль? Какие есть варианты подключения модулей в класс?
41. Что такое класс и зачем он нужен?
42. Что такое модуль и зачем его используют? Чем модуль отличается от класса?
43. Что такое константа?
44. Что такое блок? Что такое yield? Можно ли передавать блоки в методы? Каким образом?
45. Что такое proc?
46. Что такое lambda?
47. В чем разница между proc и lambda?
48. Что такое eigenclass?
49. Какие виды условных операторов есть в Ruby? (if, unless, ternary, case)
50. Есть ли разница между операторами && и and?
51. Какие виды циклов есть в Ruby? (loop, while, until, for, each(), times(), upto())
Типы данных
52. Какие типы данных есть в Ruby?
53. Что такое интерполяция?
54. Что такое конкатенация?
55. Что такое массив в Ruby?
56. Что такое Hash в Ruby? Чем Hash отличается от массива?
57. Что такое символ и зачем он нужен?
58. Что такое Range и зачем его используют?
59. Что такое Time и Date?
60. Что такое Struct?
61. Что такое File?
Структура классов и объектов
62. Что такое BasicObject?
63. Что такое Numeric?
64. Что такое Enumerable?
65. Что такое Struct?
66. Что такое OpenStruct?
67. Что такое Set?
68. Что такое Queue?
69. Что такое Object?
70. Что такое Kernel?
ООП на Ruby
71. Есть ли интерфейсы в Ruby?
72. Что такое getter и setter в Ruby? Как их создавать?
73. Что такое инстансная переменная?
74. Что такое константа класса?
75. Какая разница между методом класса и методом объекта?
76. Какие есть области видимости?
77. Какие есть модификаторы доступа? Как private отличается от protected?
78. Поддерживает ли Ruby множественное наследование?
79. Как наследуются методы? Можно ли переопределить метод?
80. Зачем метод super?
81. Что такое Singleton-метод?
82. Что такое миксины? Зачем они и чем отличаются от декоратора?
83. Что такое include и extend и в чем разница между ними?
84. Какой путь поиска метода в иерархии классов?
85. Какая разница между последовательными и именуемыми аргументами метода?
86. Что такое exception? Когда они применяются? Как вызвать exception? Как отловить exception?
Метапрограммирование
87. Что означает open class?
88. Что такое monkey patching?
89. Возможно ли создать класс динамически? Если да, то как именно?
90. Какие есть способы динамического управления методами, переменными и классами (define_method(), class_eval(), module_eval())?
91. Как происходит поиск метода в иерархии? Как можно обработать отсутствие метода (method_missing())?
92. Что такое алиас метода? Для чего нужны алиасы?
93. Как получить значение инстансной переменной? Как задать значение? Как проверить существование инстансной переменной (instance_variable_get(), instance_variable_set(), instance_variable_defined())?
94. Какие методы интроспекции есть в Ruby (class(), ancestors(), methods(), private_methods(), instance_variables(), singleton_methods(), local_variables())?
95. Что такое хуки и зачем их используют (inherited(), included(), method_added(), singleton_method_added(), method_missing())?
RubyGems
96. Что такое gem? Что такое RubyGems?
97. С какой целью используют RVM? Что такое gemset?
98. Что такое Bundler и зачем он?
99. Что такое Gemfile и для чего его используют?
100. За что отвечает каждый из gem`ов? Если знаете нюансы в работе какого-либо из них — обязательно озвучьте.
active_admin
active_model_serializers
bundle audit
bcrypt
devise
jwt
cancancan / pundit
draper
kaminari
sidekiq
rspec
shoulda-matchers
faker
factory_bot
simplecov
rubocop (with extensions)
pry
Ruby on Rails
101. Что такое MVC? Является ли Rails MVC-фреймворком?
102. Что такое миграция? Для чего она нужна? Какие правила создания миграций?
103. Что такое роуты? Что такое resource и resources в роутах?
104. Чем отличается has_many through от has_and_belongs_to_many?
105. Зачем используют concerns?
106. Как работать с sensitive-данными в Rails-приложениях (токены, ключи и т. д.)? Как работает механизм credentials в Rails?
107. С какой целью используют локалы (locals)?
Style guide
108. Знакомы ли вы с RoR style guide?
Структура файлов в Rails
109. Из чего состоит Rails-приложение? Какая архитектура директорий? Зачем нужна каждая из них?
110. Чем отличается lib от vendor?
111. Как создать background job в Rails?
112. Какие способы загрузки ассоциаций в Rails?
Модели и ActiveRecord
113. Зачем нужны модели? Что представляет собою модель?
114. Что такое ORM? Что такое ActiveRecord?
115. Какие есть правила наименования моделей и таблиц в базе данных?
116. Что такое миграции и зачем нужен этот механизм? Как создавать миграции?
117. Какие виды валидаций есть в AR?
118. Как можно вызвать валидацию? Когда валидация вызывается автоматически? Как можно отключить валидацию при сохранении?
119. Что такое callback в Rails?
120. Какие есть виды колбеков в AR?
121. Какие виды ассоциаций есть в AR?
122. Что такое has_one и belongs_to?
123. Что такое has_many?
124. Что такое has_many: through?
125. Что такое has_one: through?
126. Что такое has_and_belongs_to_many?
127. Что такое полиморфная ассоциация?
128. Что такое STI?
129. Каким образом можно получить данные из базы данных? Как получить один объект и коллекцию? Как задать условия выборки?
130. Что такое скоупы? Какова их функция?
131. Як выполнить произвольный SQL-запрос?
132. Как посмотреть информацию о том, как выполнялся запрос, какие использовались ключи и т. п.?
Контроллеры
133. Что такое контроллер? Какую задачу выполняет?
134. Что такое action? Что такое CRUD action?
135. Что такое permit params?
136. Что такое ActiveRecord? Как он реализован в Rails-фреймворке?
137. Что такое параметры? Как они попадают в контроллер? Что такое дефолтные параметры (в роутах)? Что такое стронг-параметры?
138. Что такое cookies и зачем они? Где хранятся cookies? Как получить доступ к cookies?
139. Что такое сессии и в чем их задача? Где хранятся сессии? Как получить доступ к сессии?
140. Какие виды фильтров есть в Rails? (Before / after / around actions)
141. Зачем нужен объект Request? Какую информацию он содержит?
142. Для чего нужен объект Response? Какую информацию он содержит?
143. Что такое стриминг? Каким образом можно отдать файл на загрузку (Send_data, send_file)?
144. Что такое Rescue в контроллерах и для чего применяется?
145. Как принудительно включить использование HTTPS-протокола?
Маршрутизация
146. Что такое роуты и в чем их функция?
147. Что означает аббревиатура CRUD?
148. Если нужно сделать новый CRUD для определенного ресурса, какие классы вы создадите и какие файлы измените?
149. Что такое ресурсы?
150. Что такое Singular ресурсы и что отличает их от обычных ресурсов?
151. Что делают неймспейсы в роутах?
152. Что такое вложенные ресурсы?
153. Что такое shallow nesting?
154. Что означает RESTful роуты?
155. Что такое нересурсные роуты?
156. Что такое actions в роутах?
View
157. Что такое view и для чего он нужен?
158. Что такое layout? Чем отличается от view?
159. Что такое шаблонизатор и с какими шаблонизаторами приходилось работать?
160. Зачем нужен метод render? Что рендерить с его помощью?
161. Как передаются переменные во view?
162. Что такое partial? Когда стоит его применять?
163. Что такое хелпер и зачем его используют?
164. Какие есть хелперы для генерации роутов?
165. Какие есть хелперы для генерации форм?
166. Как создавать собственные хелперы?
Интернационализация Rails
167. Что такое i18n? Зачем нужна i18n? Как она устроена в RoR? В каком виде можно хранить переводы?
ActionMailer
168. Что такое ActionMailer и какие задачи он решает?
AssetsPipeline
169. Что такое AssetsPipeline и какие задачи он выполняет?
Инструменты консоли и rake-таски
170. Какие есть консольные команды для работы с RoR? Что такое rake-таски?
Безопасность
171. Знаете ли вы какие-то уязвимые места, защиту от которых Rails предоставляет out of the box?
172. Какие атаки могут быть при неправильном использовании сессий? Почему нельзя хранить важные данные в сессиях?
173. Что такое CSRF? Как правильно защититься от CSRF?
174. В чем уязвимость Open Redirect? Как защититься от возможных атак, связанных с Open Redirect?
175. Какие уязвимости связаны с загрузкой файлов? Почему важно фильтровать имена и расширения файлов? Как защититься от опасности?
176. Почему нельзя загружать файлы в каталог, доступный снаружи? Что будет, если злоумышленник загрузит файл с кодом?
177. Какие уязвимости связаны с управлением пользователями (ссылка активации, пароли в чистом виде)? Как защититься?
178. Что такое инъекции и как происходит такая атака? Как их избежать?
179. Как организовать безопасную генерацию приглашений? Что такое deep_munge?
Конфигурация
180. Где располагается основная конфигурация программы?
181. Что такое initializers? Зачем они?
182. Что такое окружение? Каково его назначение?
183. Как и где настраивается взаимодействие с базой данных?
184. Как и где настраивается Assets, генераторы, мидлвары, i18n?
185. Можно ли указывать произвольные настройки? Если да, то где и каким образом?
Кэширование
186. Что такое кэш и зачем нужен этот механизм?
187. Какие виды кэширования есть в Rails?
188. Где может храниться кэш?
189. Зачем использовать кэширование страниц?
190. Зачем использовать кэширование экшенов?
191. Зачем использовать кэширование фрагментов?
192. Что такое Memcached?
193. Зачем и как реализуется низкоуровневое кэширование?
194. Как и когда кэшируется SQL?
195. Как тестировать кэширования в режиме разработки?
Реляционные базы данных
Теория реляционных баз данных
196. Что такое СУБД?
197. Что такое реляционная база данных?
198. Что такое нормализация базы данных?
199. Что такое нормальная форма?
200. Сколько есть нормальных форм баз данных?
201. Опишите первые три нормальные формы баз данных.
202. Что такое денормализация баз данных?
203. В чем разница между Primary Key, Foreign Key? Зачем они?
204. Какая разница между LEFT JOIN, INNER JOIN, RIGHT JOIN?
205. Как добавить запись в таблицу без ORM?
206. Как обновить запись в таблице без ORM?
207. Как удалить запись из таблицы без ORM?
208. Как прочитать записи в таблице без ORM?
209. Какие правила группировки данных в таблице вы знаете?
SQL
210. Что такое DML (Data Manipulation Language)?
211. Что такое DDL (Data Definition Language)?
212. Что такое DCL (Data Control Language)?
213. Что такое TCL (Transaction Control Language)?
214. Как выбрать данные из нескольких таблиц? Какие виды JOIN вы знаете?
215. Какие агрегированные показатели можно использовать во время выборки из таблицы?
216. Что такое таблица в базе данных?
217. Как создать таблицу?
218. Как выбрать записи из таблицы?
219. Как вставить запись в таблицу?
220. Как изменить запись в таблице?
221. Как удалить запись из таблицы?
222. Как объединить выборку из разных таблиц?
223. Что такое группировка или агрегирование?
224. Каким образом можно задавать условия агрегирования?
Индексы баз данных
225. Что такое индексы в базе данных?
226. Для чего нужны индексы?
227. Какие виды индексов существуют?
228. Что такое первичный ключ?
229. Что такое внешний ключ?
230. Что такое составной ключ?
Полнотекстовый индекс в базах данных
231. Что такое полнотекстовый поиск и в чем его задача?
232. Что такое полнотекстовый индекс?
233. Что такое ts_vector?
234. Что такое ts_query?
PostgreSQL
235. Что такое select distinct и какова его функция?
236. Каким образом можно сортировать результаты выборки?
237. Как ограничить количество результатов выборки?
238. Как проводить поиск по подстрокам?
239. Какие виды объединений (JOIN) есть в PostgreSQL?
240. Что такое подзапросы и в чем их задача?
241. Какие типы данных есть в PostgreSQL?
242. Какие есть виды символьных типов данных?
243. Какие есть виды типов данных для работы с датой и временем?
244. Что такое тип enum? Когда он используется?
245. Как можно создавать таблицы в базе данных?
246. Как изменять структуру таблицы?
247. Как удалять таблицы?
248. Как очистить таблицу?
249. Возможно ли задавать значения по умолчанию для полей? Если да, то как именно?
250. Возможно ли контролировать уникальность значений при вставке? Если да, то каким образом?
251. Что такое функции в PostgreSQL?
252. Какие операторы есть в PostgreSQL?
Базы данных NoSQL
Redis
253. Что такое Redis и зачем используют этот инструмент?
Elasticsearch
254. Что такое Elasticsearch и зачем его используют?
Статический анализ кода
255. Что такое Overcommit и зачем нужен?
256. Что такое Danger и для чего используется?
257. Что такое статические анализаторы кода? Зачем их используют?
258. Какие анализаторы для Ruby / Ruby on Rails знаете?
259. Какие статические анализаторы кода для JavaScript знаете?
Тестирование
260. Какие виды тестирования знаете? Какие из них вы практиковали при использовании Rails?
261. Какой фреймворк для тестирования используете?
262. Какие показатели качества для своих тестов можете назвать?
263. С помощью какой библиотеки вы контролируете процент покрытия тестами?
264. Расскажите об основах тестирования в Ruby. Что такое RSpec? Какая разница между describe, context и it?
265. Какая разница между юнит-тестами и интеграционными?
266. Что проверяют приёмным тестированием?
267. Что проверяют интеграционным тестированием?
268. Что тестируют в моделях?
269. Что тестируют в контроллерах?
270. Что тестируют в сериалайзерах?
271. Как тестировать API?
272. Как тестировать различные Service Objects?
273. Что такое RSpec? Какие задачи выполняет этот инструмент?
274. В чем разница между let и let! в RSpec?
275. Какие хуки в RSpec знаете?
276. Что выполняется раньше: let! или хук before (:all) ?
277. Что такое Capybara? Какие задачи решает Capybara?
278. Что такое стабы?
279. Что такое моки?
280. Что такое матчер?
281. Какую задачу выполняет гем Shoulda Matchers?
282. Какую задачу выполняет Faker?
283. Зачем нужны Webmock и VCR? Чем они отличаются?
284. Что такое WebKit и PhantomJS? В чем разница между ними? Какие еще есть драйверы?
285. Как работать с базой данных в тестах? Как работает gem database_cleaner?
Дополнительные RubyGems и Rails плагины
286. Какую задачу выполняет Devise?
287. Какую задачу выполняет Rake?
288. Какую задачу выполняет Cancancan и Pundit?
289. Какую задачу выполняет Kaminari и Will_paginate?
290. Какую задачу выполняет Carrierwave?
291. Какую задачу выполняет MiniMagick?
292. Какую задачу выполняет Aasm?
293. Какую задачу выполняет ActiveAdmin?
294. Какую задачу выполняет Nokogiri?
295. Какую задачу выполняет Formtastic и SimpleForm?
296. Какую задачу выполняет Omniauth?
297. Какую задачу выполняет Draper?
298. Какую задачу выполняет Faye?
299. Какую задачу выполняет Pusher?
300. Какую задачу выполняет Sidekiq, Resque?
301. Какую задачу выполняет Mongoid?
Управление, сервисы и DevOps
302. Что такое SSH? Как и для чего используется?
303. Каким образом можно настроить аутентификацию на хосте без пароля?
304. Какие задачи выполняет Heroku? В чем его особенность?
305. Какие задачи выполняет Digitalocean?
306. Какие задачи выполняет Docker?
Мониторинг
307. Какие задачи выполняют Airbrake, DataDog, NewRelic?
308. С какой целью используют Monit?
Ruby Web Tools
309. Какие есть веб-серверы, написанные на Ruby?
310. Что такое Sinatra?
311. Что такое API? Для чего используется? Что такое сериалайзеры и зачем они нужны?
312. Что такое клиент-серверная модель?
313. Какая разница между GET- и POST-запросами?
314. Что такое HTTParty и какие задачи он выполняет?
315. Что такое Faraday и какие задачи он выполняет?
316. Что такое Rack? Что такое Rack-application? Что такое Rack middleware?
317. Что такое push-технология?
Интеграции
318. Есть ли опыт интеграции с Facebook? Если да, то на каком проекте?
319. Есть ли опыт интеграции с Twitter? Если да, то на каком проекте?
320. Есть ли опыт интеграции с LinkedIn? Если да, то на каком проекте?
321. Есть ли опыт интеграции с Google? Если да, то на каком проекте?
Практические задания
322. Описать в ООП-стиле: один из предметов интерьера в контексте конкретного бизнеса. Например, кресло, на котором сидит кандидат, теперь надо продавать в магазине.
323. Написать консольную версию игры «крестики-нолики», где входные данные передаются через gets, а выводят через puts. Два пользователя на одной машине должны иметь возможность сыграть партию.
324. Отсортировать массив.
325. Написать функцию, которая вернет уникальные элементы массива, не используя функцию uniq или set, to_set со стандартной библиотеки.
Middle
Общее
1. Что такое SOLID? Приведите примеры на каждую из букв.
2. Что такое микросервисная архитектура? Какие плюсы и минусы вы видите во время её использования?
3. Знаете ли вы шаблоны проектирования Singleton / Factory / Facade / Decorator / Template Method / Strategy?
4. Можно ли измерить скорость выполнения алгоритма? Какие факторы влияют на скорость? Какие виды зависимостей вы знаете?
5. Что такое методология Scrum? На каких активностях / встречах может присутствовать / быть полезным Software Developer?
6. Какие инструменты для логирования используете в работе?
7. Какие инструменты для мониторинга веб-приложений используете?
8. С помощью какого/каких инструментов вы деплоили приложения на staging / production? Опишите процесс.
9. Если один из ендпоинтов в приложении отрабатывает очень долго, что делать, чтобы улучшить скорость?
10. Чем отличается библиотека от фреймворка?
11. Что такое трехзвенная архитектура? Зачем и когда ее используют? Приведите примеры.
12. Что такое кэширование? Зачем и когда его используют? Приведите примеры.
13. Что такое функциональное разделение? Зачем и когда его используют? Приведите примеры.
14. Что такое Comet-сервер? Зачем и когда его используют? Приведите примеры.
15. Что такое денормализация? Зачем и когда ее используют? Приведите примеры.
16. Что такое деградация функциональности? Зачем она и в каких случаях используется? Приведите примеры.
17. Что такое сервис-ориентированная архитектура? Зачем и когда ее используют? Приведите примеры.
18. Что такое монолитное приложение? Зачем и когда его используют? Приведите примеры.
19. Что такое асинхронная обработка? Зачем и когда ее применяют? Приведите примеры.
20. Что такое ленивые вычисления? Зачем и когда их используют? Приведите примеры.
Предметно-ориентированное проектирование
21. Что такое DDD? В чем преимущества перед классическим MVC?
22. Что такое домен?
23. Что такое модель?
24. Что такое контекст?
25. Что такое сущность?
26. Что такое value object?
27. Что такое агрегирование?
Git и code review
28. Что делают команды cherry-pick, log, stash, reset, squash?
29. Что такое Gitflow? Какие правила использования Git на вашем прошлом проекте?
30. Каких правил именования комитов / ветвей / Pull Request`ов вы придерживаетесь?
31. На что обращаете внимание при code review?
32. Что бы вы могли назвать плохо проведенным code review?
Базы данных
33. Для чего нужны индексы?
34. Какие есть виды индексов?
35. Ускоряют ли индексы все операции с базами?
36. Что такое DB view?
37. Чем отличаются materialized db view от non-materialized db view?
38. Как можно сохранить данные в различные таблицы и гарантировать, что все они или запишутся, или нет?
39. Можно ли строить индексы по нескольким полям? Важен ли порядок этих полей в индексе?
40. Какие вы знаете constraints при создании столбцов?
41. В чем разница между SQL и NoSQL базами данных?
42. Как бы вы импортировали большие массивы данных в БД (1-2 миллиона строк в CSV-файл)?
43. Что такое N+1 и как избегать?
Реляционные базы данных
44. Какие различия между джоинами FULL OUTER JOIN, CROSS JOIN, NATURAL JOIN, INTERSECT и EXPECT?
45. Какие специфические типы данных есть в PostgreSQL?
46. Что такое view? С какой целью используется?
47. Что такое materialized view?
48. Что такое recursive view?
49. Что такое хранимая процедура и зачем она нужна?
50. Что такое партиционирование и какую проблему оно решает?
51. Умеете ли вы работать с чистыми SQL-запросами?
52. Каким образом можно работать с геолокацией в PostgreSQL?
53. Какие способы резервного копирования данных? Что такое pg_dump? В каком виде можно создавать резервные копии?
NoSQL базы данных
Redis
54. Что такое Redis? Какие задачи он выполняет?
55. Какие типы данных есть в Redis и для чего нужен каждый из них?
56. Что такое pub / sub?
57. Что такое транзакции?
58. Что такое mass insertion?
59. Что такое партиционирование?
60. Умеете ли работать с Redis в консоли?
61. Умеете ли настраивать Redis?
Elasticsearch
62. Что такое Elasticsearch и какие задачи он выполняет?
63. Что такое кластер?
64. Что такое нода?
65. Что такое индекс?
66. Что такое тип?
67. Что такое документ?
68. Что такое шарды и реплики?
69. Что такое Query DSL?
70. Что такое мапинг?
Статический анализ кода
71. Что такое overcommit и зачем нужна эта утилита?
72. Что такое danger и для чего используют эту утилиту?
73. Какую задачу выполняет каждый из нижеперечисленных гемов?
Rubocop;
Reek;
Rails Best Practices;
Brakeman;
RubyCritic;
SimpleCov;
Bundle Audit;
Bundle Leak;
Traceroute.
74. Какие задачи выполняет каждый из нижеперечисленных модулей?
Eslint;
Stylelint;
Prettier.
Ruby
75. Какие проблемы в Ruby (как в языке программирования) вы видите? Какие, по вашему мнению, нужно решать как можно быстрее?
76. Какими библиотеками, кроме фреймворка Rails, пользовались для создания структуры проекта?
77. Как можно в Ruby запросить сторонний API? Какой встроенный класс позволяет это сделать?
78. Что такое Thread? Чем он отличается от Process?
79. Есть ли в Ruby возможность создать абстрактный класс? Есть ли способ искусственно создать абстрактный класс?
80. Есть ли в Ruby возможность множественного наследования? Есть ли способ искусственно заменить множественное наследование?
81. Назвать максимально точный путь поиска методов в Ruby
82. Какие минусы использования method_missing знаете?
83. Можно ли узнать идентификатор объекта в памяти, если да, то каким образом?
84. Какие виды enumerator для массива вы знаете?
85. Что такое мемоизация методов? Зачем ее используют?
86. С помощью какого хука можно посчитать количество потомков определенного класса?
87. В чем разница запуска rspec и bundle exec rspec?
88. Создавали ли вы гем в Ruby? Какая механика / последовательность действий для создания гема?
89. Что такое Rack middleware?
90. Есть такой код:
users = User.where (id: [1,3,4])
users.where (name: "Alex")
users.inspect
После какой строчки кода ActiveRecord выполняет запрос в базу?
Ruby on Rails
91. Что такое ActiveSupport? Зачем нужен? Какие задачи выполняет? Приведите пример методов, которые добавляет ActiveSupport.
92. Что такое Action Cable? Зачем используют этот фреймворк?
93. Как создать функциональность для отправки имейла в Rails-приложении?
94. Какие библиотеки для background jobs использовали? Какая механика работы таких библиотек?
95. Какие и виды кэша в Rails знаете? Где можно хранить кэш?
96. Какие библиотеки / подходы для создания API документации знаете / используете?
97. Что такое Swagger? Какие преимущества создания API документации в Swagger-формате?
98. Что такое Query Objects? Когда и как их можно использовать?
99. Что такое Decorators? Когда и как их можно использовать?
100. Что такое Form Objects / Contract? Когда и как их можно использовать?
101. Где и как вы рекомендуете держать бизнес-логику в Rails-приложении?
102. Что такое JSON API формат? Использовали ли вы библиотеки для сериализации объектов в JSON API формате?
Тестирование
103. Работали ли вы с feature-тестами? Что такое capybara?
104. Что такое TDD? Какие преимущества / недостатки использования TDD-подхода видите?
105. Что такое BDD? В чем отличие между TDD и BDD?
106. Что может быть причиной того, что тесты на проекте выполняются очень долго?
107. Что такое принцип тестирования FIRST?
108. Как порекомендуете писать тесты на код, в котором посылается запрос на сторонний сервис (API)?
109. Какие инструменты помогают контролировать качество тестов?
110. Какие составляющие response`a вы тестируете, когда пишете тест на определенный эндпоинт?
111. Является ли 100% code coverage на проекте залогом низкой вероятности что-то «сломать» во время багфиксинга / имплементации новой функциональности? Объясните свой ответ.
Управления, сервисы и DevOps
112. Опишите CI / CD-подход на своем последнем проекте? Как бы вы его изменили?
113. Какие в целом Continuous strategies знаете? Чем отличается Continuous Deployment от Continuous Delivery?
114. Что такое Docker? Чем отличается Docker от виртуальной машины?
115. Для чего используют docker-compose?
116. Умеете ли вы работать с Docker?
117. Что такое image в Docker? Как работать с ним в Docker?
118. Что такое container в Docker? Как работать с контейнерами? Как запускать и останавливать контейнеры? Как узнать список рабочих контейнеров?
119. Что такое Docker Daemon?
120. Что такое Docker Client?
121. Что такое Docker Hub?
122. Что такое Docker Compose?
Практические задания
123. Написать клиент для открытого API ресурса с использованием только низкоуровневых библиотек: Net::HTTP, HTTP.rb, Faraday, etc.
124. Как бы вы посчитали количество пассажиров, которые заходят или выходят на определенной станции метро?
125. Посчитать количество автомобилей в пробке.
126. Организовать автомобильную стоянку.
127. Написать функцию, которая вернет уникальные элементы массива, не используя uniq или set, to_set со стандартной библиотеки. Ожидается вариант с применением хеш-таблицы, где ключами будут уникальные элементы из массива, а значениями true.
Senior
Общие вопросы
1. Опишите основные способы аутентификации в API.
2. Назовите основные принципы построения REST API.
3. Вам нужно спроектировать API, какие основные вопросы будете задавать клиенту?
4. Какие основные преимущества и недостатки монолитной архитектуры?
5. Какие основные преимущества и недостатки микросервисной архитектуры?
6. Что такое SOLID? Какие из принципов, по вашему мнению, чаще всего нарушаются, какие являются наиболее критичными?
7. Опишите Singleton-паттерн. Где и когда вы его использовали?
8. Опишите принцип работы DNS?
9. Что такое code smells? Каковы основные признаки плохого кода?
10. Что такое reverse proxy, для чего он нужен?
11. Что такое load balancer, основные разновидности?
12. Что такое MVC и как не попасть с ним в беду?
13. Опишите процесс обработки HTTP-запроса на примере любого веб-фреймворка в Ruby (Rails, Hanami, Sinatra, Roda, etc).
14. Чем отличается refactoring от оптимизации? Как и когда нужно выполнять каждый из вышеназванных процессов?
15. Знаете ли вы GraphQL? Какие плюсы и минусы вы видите по сравнению с REST?
16. Что такое multi-tenant architecture? Когда рекомендуете ее использовать?
17. Чем отличается понятие Dependency Inversion от Dependency Injection и от Inversion of Control?
18. Что такое GDPR? Назовите правила, которые использовали, чтобы быть GDPR compliant?
Метапрограммирование и DSL
19. Параллельное выполнения кода через Thread, Fiber, Ractor. Объясните на примерах.
20. Дизайн-паттерны: Service, Form, Value, Policy, Guard, etc. Объясните на примерах.
21. Расскажите об архитектурных паттернах: Monolith, Microservices, Distributed app, etc.
22. Как организовать бизнес-логику, когда в проект уже 1000+ бизнес-операций?
23. Что такое Sidekiq? Как правильно организовывать очереди?
24. Расскажите об оптимизации быстродействия через benchmark, lineprof и flamegraph.
25. Работали ли вы с Garbage collector? Расскажите.
26. Расскажите о собственных примерах решений, которыми гордитесь и почему.
Ruby / Rails
27. Что такое Thread? Какие особенности использования тредов в разработке?
28. Что такое Process? Какие особенности использования процессов в разработке?
29. Что такое Mutex? Приведите примеры использования мьютексов в разработке?
30. Если нужно определить, сколько выполняется тот или иной код, как порекомендуете это сделать?
31. Какие недостатки видите в Ruby? Когда и как они могут себя проявить во время разработки?
32. Можно ли передать контекст выполнения одного метода в другой метод? Если да, то как это сделать?
33. Какие callback-s знаете в Ruby?
34. Как реализовать Singlethon-класс Ruby? Опишите базовые концепты.
35. Как работает Garbage collection в Ruby? Опишите базовые концепты.
36. Что такое Ractor? Какая разница между классической моделью работы с тред и работой с помощью Ractor?
37. Как работают Lazy Enumerators? Чем они отличаются от классических Enumerators? Как и когда они могут помочь?
38. Назвать примеры использования Fiber`ов
39. Как include добавляет метод модуля в класс? Что происходит на уровне MRI? В чем разница по сравнению с extend и prepend?
40. У вас есть задача импортировать пользователей в базу Rails-приложения. Пользователи записаны в CSV-файле, где каждая строка - это данные. Опишите ваш подход к решению проблемы. Как изменится решение, если файл станет очень большим (> 300000 строк)?
41. Если в модели User у вас есть callback, то какие могут возникнуть проблемы при решении предыдущей задачи?
42. Как мы можем отслеживать прогресс Background Job?
43. Опишите жизненный цикл Request - Response в Rails. Через какие основные компоненты фреймворка проходит запрос и для чего они нужны?
44. Какие основные типы тестов используете и с какой целью?
45. Как вы относитесь к интеграционным тестам?
46. Что такое полиморфные ассоциации в ActiveRecord?
47. Как бы вы порекомендовали построить semantic versioning для Rails API, работающего с мобильными приложениями (iOS, Android, Web)? Поверхностно опишите стратегию.
48. Если необходимо, чтобы каждый запрос, пришедший к Rails app независимо от роута, возвращал 403 статус как можно быстрее, как бы вы порекомендовали реализовать код для этой задачи?
49. Какие, по вашему мнению, пять основных минусов Rails? Что бы вы порекомендовали изменить, чтобы нейтрализовать эти минусы?
50. Можно ли в Rails работать с несколькими базами, если да, то как это сделать?
Базы данных
51. Что такое транзакция? Какие основные свойства транзакций?
52. Что такое database lock и чем он отличается от транзакций?
53. Что такое Pessimistic и Optimistic locking?
54. У нас есть таблица Users. Мы добавили к ней индекс в трех полях: first_name, last_name, email. Именно в таком порядке. Теперь делаем запрос SELECT * FROM users WHERE first_name = "Alex" AND email = "<a href="mailto:test@mail.com"> test@mail.com </a>". Поможет ли нам индекс ускорить такой запрос, и почему?
55. Что такое Database View? Какие виды есть?
56. Что такое Database trigger?
57. Что такое партицирование? Опишите кейсы, когда партицирование было бы полезным?
58. Поверхностно опишите шаги для реализации партицирования на примере любой СУБД.
59. Что такое триггеры? Как и когда их можно использовать? Какие плюсы и минусы вы видите в сравнении с тем, чтобы использовать триггеры / колбеки на уровне бэкенд?
60. Что такое WAL? Какую роль он играет?
61. Была ли у вас возможность / необходимость использовать шардинг? Чем отличается шардинг от партицирования?
62. Опишите принципы, преимущества и недостатки работы с primary / secondary (master / slave) репликацией?
63. Знакомы ли вы с CAP-теоремой? Если да, объясните основную идею.
64. Знаете ли вы ACID? Как вы понимаете букву "I" в этой аббревиатуре?
65. Представьте ситуацию, когда ваш сервер, на котором размещен redis, по неизвестным причинам перезапустился. Что рекомендуете сделать заранее, чтобы такие ситуации не нанесли большой вред?
Тестирование
66. Знаете ли вы, что такое Load Testing? Чем может помочь разработчик при Load Testing?
67. Какие инструменты используют для того, чтобы собрать как можно больше метрик при Load Testing?
68. Какие подходы вы бы порекомендовали использовать, чтобы ускорить тесты на CI?
69. Как внедрить процесс написания тестов, если проект (Rails API) их совсем не имеет?
Практические задания
70. Написать реализацию структуры данных Set. Объяснить алгоритмическую сложность добавления элементов к сету.
71. Спроектировать реферальную систему (то есть, пользователь может пригласить других пользователей, которые становятся его рефералами, они приглашают своих рефералов, и так формируется древовидная структура). Есть модель:
class Users <ActiveRecord :: Base
end
Как бы вы связали ее с рефералами?
72. Добавьте метод:
class Users <ActiveRecord :: Base
end
который возвращает рефералы пользователя поуровнево. Например, user имеет рефералы user1, user2. user1 имеет реферала user3, user2 имеет рефералов user4 и user5. Должны получить результат:
{0 => [user]
1 => [user1, user2],
2 => [user3, user4, user5}
Спасибо за вопросы Денису Земляному, Николаю Воронину, Сергею Гнилицкому, Владимиру Свередюку, Михаилу Одинюку, Виктору Нову, Александру Шестопалу, Андрею Зеленцу, Кириллу Шевченко, Виктору Новицкому.