Результати пошуку за запитом: mvc
Використання Redis як сервісу в Azure для прискорення роботи ASP.NET додатків
Автор: Редакция ITVDN
Введение
Microsoft Azure использует кэш Redis в качестве сервиса. В нем существуют два уровня. Уровень Basic является одним узлом кеша, а Standard – полностью воспроизведенным кэшем (два узла с автоматической отработкой отказа). Microsoft управляет автоматической репликацией между двумя узлами и предлагает высокую доступность SLA (Service Level Agreement).
Уровень Premium может использовать до половины терабайта оперативной памяти, десятки тысяч подключений клиентов и группироваться или масштабироваться в большие блоки. Разумеется, Вы можете управлять своим Redis через виртуальную машину, но существует SAAS (Software as a Service/программное обеспечение как сервис), который все значительно упрощает – достаточно просто использовать его и остальное будет обработано.
Мы испробуем Redis в качестве кэша для ASP.NET веб-приложений. В нем есть интересный Redis Desktop Manager с открытым исходным кодом. Еще один интересный графический интерфейс для Redis - это Redsmin.
Для небольших приложений и сайтов мы можем сделать простой (Basic) кэш и получить 250 мегабайт. Мы сделали экземпляр объекта Redis в Azure. Его создание занимает пару минут. С ним можно взаимодействовать программно с помощью StackExchange.Redis, ServiceStack.Redis или любой из многих других больших пользовательских библиотек.
Впрочем, сейчас существует мощная поддержка для Redis и кеширования в ASP.NET. Это библиотека под названием Microsoft.Web.RedisSessionStateProvider, которую можно получить из NuGet:
Install-Package Microsoft.Web.RedisSessionStateProvider
Она использует в себе библиотеку StackExchange, но это позволяет ASP.NET использовать объект Session и сохранять результаты в Redis, а не в памяти веб-сервера. Добавьте это к Вашей веб-конфигурации web.config:
mode="Custom" customProvider="FooFoo">
name="MySessionStateStore"
type="Microsoft.Web.Redis.RedisSessionStateProvider"
host="hanselcache.redis.cache.windows.net"
accessKey="THEKEY"
ssl="true"
port="1234" />
Вот строка из сессии ASP.NET, сохраненная в Redis, как показано диспетчером Redis Desktop Manager. Удобно использовать поставщик, если Вам не нужно делать изменений в любом коде.
Вы можете отключить SSL и подключиться к кэшу Azure Redis Cache через открытый доступ в Интернет, но вам действительно лучше использовать SSL. Вот инструкции по использованию диспетчера Redis Desktop Manager с SSL и Azure Redis. Обратите внимание на часть, где Вам понадобится файл с .pem расширением, который является открытым SSL-ключом для Azure Redis Cache. Вы можете получить этот ключ SSL здесь (на момент написания этой статьи).
Redis можно использовать не только в качестве состояния сессии, но и как молниеносный вывод кеша. Это означает кеширование HTTP-ответов в полном объеме. Его настройка в ASP.NET 4.x похожа на настройку провайдера состояния сессии (Session State Provider):
Install-Package Microsoft.Web.RedisOutputCacheProvider
Теперь, когда мы использовали атрибуты [OutputCache] в контроллерах MVC, или директивах OutputCache в веб-формах, как <%@ OutputCache Duration="60" VaryByParam="*" %>, ответы будут обработаны с помощью Redis. Только подумав о том, как работают Ваши строки запроса и URL-адреса, Вы можете быстро сделать приложение, как каталог продукции, например. И сделать это в 4-ре или 10 раз быстрее, используя кеширование. Это требует минимальных усилий, а результат приносит огромный. Странно, что даже в 2015 году некоторые люди обращаются к базе данных при каждом HTTP-запросе, когда теперешние нужды данных веб-приложений этого не требуют.
Конечно, Вы можете работать с Redis напрямую через код. Вот документы для .NET, Node.js, Java и Python на Azure. Это удивительный проект, и обладать им, полностью управляемым, в качестве услуги приятно. С сайта Azure Redis:
Redis является расширенным хранилищем значений ключей, которые могут содержать такие структуры данных, как строки, хэши, списки, наборы и сортированные наборы. Redis поддерживает набор атомарных операций с этими типами данных.
Redis также поддерживает в установке репликацию «master-slave» с очень быстрой первой синхронизацией без блокирования, автоматическим переподключением при разделении сети и так далее.
Другие особенности включают транзакции, публикации/подписки, сценарии Lua, ключи с ограниченным временем действия и параметры конфигурации, что позволяют Redis действовать как кэш.
Вы можете использовать Redis с помощью большинства теперешних языков программирования.
Кэш Redis для Azure использует идентификацию Redis, а также поддерживает SSL-подключения к Redis.
Возможно, Вы заинтересованы в Redis, но не хотите запускать его на Azure или, возможно, даже на Linux. Возможно запустить Redis с помощью Redis MSOpenTech на ОС Windows. Его можно установить с NuGet, Chocolatey или загрузить напрямую с репозитория проектов GitHub. Если у Вас Redis для Windows (это легко с Chocolatey), можете использовать redis-cli.exe в командной строке для коммуникации с Azure Redis Cache.
Запустить локальный сервер Redis легко: с помощью redis-server.exe проверить его в разработке, а затем изменить строку Redis-подключения Вашего приложения при развертывании на Azure. Можете проверить. В течение 30 минут Вы сможете настроить Ваше приложение, чтобы использовать кэш (Redis или другой) и увидеть некоторое, действительно, значительное ускорение.
Источник: http://www.hanselman.com/blog/UsingRedisAsAServiceInAzureToSpeedUpASPNETApplications.aspx
Логування проекту за допомогою NLog Framework
Автор: Богдан Ромашко
Введение
Многие начинающие разработчики при создании своих проектов не задумываются о такой вещи, как создание журнала события. Мол, проект у меня нормальный, и так сойдет. Но не забываем, что наше приложение мы пишем не для себя самих, а для клиента.
Всем нужна статистика и слежение за проектами. Итак, что же насчет логирования, так это процесс записи всех сведений о проекте, а именно: информации о работе тех или иных элементах приложения, предупреждение о критической нагрузке, всяческие ошибки и т.д. Для .NET приложений был разработан очень удобный фреймворк под название NLog, с его помощью можно вести учет о состоянии всего приложения. Есть поддержка записи в файл, в базу данных.
Настройка данной платформы очень удобна и легка, есть два способа:
через конфигурационный файл;
через конфигурационный объект LoggingConfiguration;
Первый способ самый простой, так как зондирование проекта уже встроено в саму библиотеку NLog. Вся работа основа на объекте Logger – парне, который занимается ведением учета состояния нашего проекта.
Для того чтобы продемонстрировать работу NLog, создадим проект по шаблону консольного приложения и назовем его NLogUnderstanding. Изначально наш проект выглядит следующим образом:
using System;
namespace NLogUnderstanding
{
class Program
{
static void Main(string[] args)
{
}
}
}
Чтобы начать работу данного фреймворка в нашем проекте, нужно установить следующие библиотеки через Package Manager Console (или же через сам менеджер расширений):
После установки NLog выбираем подход, по которому будем строить процесс слежения за состоянием приложение.
Настройка через конфигурационный файл:
Первое, что нужно сделать- это установить данный пакет:
После это у нас в проекте появится указанный файлик NLog.config:
Начальное содержимое файла выглядеть будет примерно так:
xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
targets>
<rules>
rules>
nlog>
Все, после того как мы подготовили данную библиотеку, начинаем настройку объекта Logger. Первое, что мы должны сделать, это указать ему, куда мы будем писать те или иные сообщения. Все эти файлы указываются в разделе <targets>. Первое, что мы добавим, так это все возможные записи, которые мы сможем проводить:
<targets>
<target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} | ${uppercase:${level}} | ${logger} | ${message}" />
targets>
Шесть возможных вариантов ведения учета:
Информация о состоянии элементов;
Информация, запущенная в режиме debug для отладки проекта (можно применять в тестах);
Всяческие предупреждения (например, связанные с нагрузкой);
Информация об исключениях;
Информация об ошибках, которые привели к критическому завершению приложения.
Для каждого сообщения присутствует свой метод все в том же объекте Logger, который мы чуть позже будем разбирать. Основные атрибуты, которые нужно заполнить, это:
name – название файла, нам оно понадобиться для организации правил, по которым мы будем писать именно в этот файл;
fileName – указываем файл и путь к файлу, в который будем писать наши логи;
layout – шаблон, по которому будет заполнятся наш файл.
Как Вы уже заметили, заполнение значений атрибутов ведется в характерной манере регулярных выражений. То есть, мы используем заранее подготовленные в библиотеке маркеры подстановки для ведения учета наших сообщений в разные файлы. Основные, которые мы использовали, это:
${basedir} – вернет базовую директорию вашего приложения. При компиляции этот маркер вернет изначальный путь (папку bin);
${shortdate} / ${longdate} – маркеры подстановки устанавливают текущую дату и время в зависимости от маркера (полную дату и время или же только дату);
${uppercase:${level}} – интересное использование вложения маркеров. Как Вы поняли, маркер ${level} будет указываться уровень сообщения (мы их перечислили ранее), приводим в верхний регистр;
${message} – под данный маркер подставляется сообщение, указанное в аргументных скобках методов (об этом далее);
${logger} – название класса, от которого поступило сообщение.
После настройки целей для записи наших сообщений мы приступаем к организации правил, по которым будем заполнять наши файлы:
<rules>
<logger name="*" minlevel="Trace" writeTo="file" />
rules>
Тут все намного проще, единственное, что нужно заполнить - это основные атрибуты, т.к. minlevel (минимальный уровень заполнения файла, имя которого указанного в атрибуте writeTo). После того как настроили конфигурационный файл, приступаем к работе с проектом и нашим Logger. Первое, что нужно - это создать экземпляр Logger. Это можно сделать двумя способами:
Создать через первый фабричный метод LogManager.GetLogger("Example"), в аргументах указываем название логгера, менее эффективный способ, т.к. всегда нужно указывать название класса, в котором происходит запись в журнал;
Создание через второй фабричный метод LogManager.GetCurrentClassLogger(), пользуясь данным методом, мы предоставляем возможность экземпляру логгера самому узнать полное квалификационное название класса, в котором произошла запись в журнал.
Теперь привнесем изменения в наш созданный проект:
using System;
using NLog;
namespace NLogUnderstanding
{
class Program
{
static void Main()
{
Logger logger = LogManager.GetCurrentClassLogger();
log.Trace("trace message");
log.Debug("debug message");
log.Info("info message");
log.Warn("warn message");
log.Error("error message");
log.Fatal("fatal message");
}
}
}
После компиляции проекта у нас создается файл с текущей датой и в него внесутся следующий записи:
2015-05-06 14:33:46.0911 | TRACE | NLogUnderstanding.Program | trace message
2015-05-06 14:33:46.1380 | DEBUG | NLogUnderstanding.Program | debug message
2015-05-06 14:33:46.1380 | INFO | NLogUnderstanding.Program | info message
2015-05-06 14:33:46.1536 | WARN | NLogUnderstanding.Program | warn message
2015-05-06 14:33:46.1536 | ERROR | NLogUnderstanding.Program | error message
2015-05-06 14:33:46.1693 | FATAL | NLogUnderstanding.Program | fatal message
Теперь можно приступать к внедрению NLog в Ваш проект, и отслеживать состояние ваших объектов.
P.S. Если вы планируете применять слежение за состоянием вашего проекта, то экземпляр логгера нужно будет создавать в нужных для отладки классах. В следующей части я опишу, как применять логгирование в веб проектах на основе ASP.NET MVC.
Подарунки та великі знижки до Дня народження ITVDN
Автор: Редакция ITVDN
Друзі, 14 січня 2023 року освітній платформі ITVDN виповнюється 9 років і ми хочемо відзначити це свято разом із вами. Ми підготували для вас невеличкі подарунки. Про них буде далі, але спочатку хочемо кілька слів сказати про підсумки останнього року.
ITVDN у 2022 році
Від початку війни - вже понад 10 місяців ми надаємо безкоштовний доступ на 30 днів до всіх відео курсів ITVDN громадянам України. Цією пропозицією скористалося понад 50 тисяч українців!
У квітні була створена безстрокова програма безкоштовного навчання для захисників України і, звичайно, значну частину коштів ми спрямовуємо на допомогу ЗСУ.
У відповідь на блекаути наприкінці 2022 року ми створили особливий пакет підписки – “Преміум Plus”. Він дозволяє завантажувати відео уроки і навчатися в умовах відстутності електропостачання та інтернету.
Одна з наших найбільших цілей у 2023 році – створення українськомовних відео курсів; наразі ми активно шукаємо авторів, які хочуть розвивати українське ІТ.
ПОДАРУНКИ ТА ЗНИЖКИ ДО ДНЯ НАРОДЖЕННЯ
На честь Дня народження ITVDN ми влаштовуємо акцію! 13 січня кожен користувач нашого сервісу отримає 500 бонусів, які зможе витратити на отримання будь-якого відео курсу з нашого каталогу (термін навчання за обраним курсом – 1 місяць).
Поспішайте використати свої подарункові бонуси! Вони доступні з 13 по 16 січня. Потім подарункові бонуси згорять.
Як отримати курс за бонуси?
Заходите в свій особистий кабінет на ITVDN.
Спускаєтеся нижче і серед горизонтальних табів обираєте таб «Бонуси».
Під горизонтальними табами з’явилося два блоки – обираєте в блоці ліворуч («Подарунки, які можна отримати») послугу «Курс у подарунок» і натискаєте «Детальніше».
У випадаючому переліку обираєте бажаний курс і натискаєте кнопку «Отримати».
Доступ до обраного курсу відкривається на 30 днів, тому сплануйте своє навчання так, аби встигнути вивчити матеріал, зробити необхідні д/з, пройти тестування та отримати Сертифікат з пройденого курсу.
Знижки до 50% на універсальні пакети
Акційні ціни з 13 по 16 січня:
Пакет “Преміум Plus” (12 міс.) – 100 USD (замість 199.99 USD)
Пакет "Преміум" (12 міс.) – 85 USD (замість 169.99 USD)
Пакет "Базовий" (6 міс.) – 54 USD (замість 89.99 USD)
Пакет "Стартовий" (3 міс.) – 35 USD (замість 49.99 USD)
Універсальні пакети – це чудовий вибір, якщо ви хочете мати доступ до всіх курсів і вивчати різноманітні технології у зручному для вас темпі.
Знижки до 50% на спеціальності
Акційні ціни з 13 по 16 січня:
Python Developer (доступ на 6 місяців) – 54 USD
FrontEnd Developer (7 міс.) – 52 USD
Верстальник сайтів (4 міс.) – 42 USD
JavaScript Developer (3 міс.) – 31 USD
React Developer (4 міс.) – 42 USD
Angular Developer (4 міс.) – 42 USD
.NET Developer (8 міс.) – 60 USD
ASP.NET Core Developer (6 міс.) – 54 USD
ASP.NET MVC Developer (5 міс.) – 52 USD
Unity / Game Developer (6 міс.) – 63 USD
Java Developer (7 міс.) – 52 USD
Android Developer (5 міс.) – 45 USD
PHP Developer (5 міс.) – 45 USD
C++ Developer (3 міс.) – 31 USD
Ruby Developer (4 міс.) – 42 USD
Оплата частинами
Друзі, дуже рекомендуємо користуватися послугами Оплата частинами від ПриватБанку та Монобанку – це дозволить вам розбити платіж на декілька частин без комісій. Наприклад, якщо ви обираєте пакет «Преміум Plus» та оплату частинами від Монобанку під час акції, розбивайте платіж на 6 частин і сплачуйте менше 17 USD на місяць. При цьому курс долара фіксується поточний на дату здійснення покупки.
Подарункові сертифікати також зі знижками!
Якщо у вас є друг, який хоче опанувати IT-професію або розширити свої знання у програмуванні, ви можете порадувати його – вручити подарунковий сертифікат з доступом до всіх відео курсів. Під час акції подарункові сертифікати також продаватимуться зі знижками, а активувати їх можна будь-коли протягом року.
Дякуємо всім, хто користується нашим ресурсом. Залишайтесь на ITVDN.
Святкуємо разом!
UPD від 15 січня
У зв'язку з черговим нападом агресії рашистів 14 січня багато українців залишилися без електрики та інтернету. Нам дуже шкода, що ці сумні для України події збіглися з нашим Днем народження, і тому ми продовжуємо акцію до 16 січня включно. Слава Україні, смерть ворогам!
Як стати 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!
Хто такий Full-stack розробник
Автор: Влад Сверчков
Суперечки навколо Full-stack
Різновиди Full-stack розробників. Стек мов та технологій для кожного
Плюси професії Full-stack Developer
Мінуси професії Full-stack Developer
Як стати Full-stack розробником?
Зарплати Full-stack розробників
Підсумки
Оновлено 9 червня 2023 року
Привіт, друзі!
Full-stack розробник (вимовляється "фул стек") – це якийсь майстер на всі руки у світі веб-розробки. Йому під силу реалізувати як клієнтську, так і серверну сторону додатку, якими, зазвичай, займаються FrontEnd і BackEnd розробники окремо один від одного. Таким чином, Full-stack спеціаліст здатний одноосібно вести проєкт від початку до кінця.
Ще в далеких нульових і раніше не існувало такого розподілу обов'язків між розробниками. Відносна простота ПЗ, що розроблялося, так само як і технології того часу дозволяли тримати процеси, які зараз виконують різні люди, в одних руках. Наприклад, у ті часи IT-фахівець, який називається веб-майстром, і зовнішній вигляд сайту створював, і серверну частину реалізовував, і розміщував сайт на хостингу. Тобто, Full-stack розробники існували і раніше, просто ніхто їх так не називав.
Однак IT-сектор не стояв на місці. Вимоги до програмних продуктів зростали, з'являлися нові мови та технології, змінювалися підходи до розробки. Дерево IT почало ставати все більш гіллястим, породжуючи нові спеціальності. Разом із цим професія універсального бійця розбилася на два окремі напрямки, а потім знову відродилася з гордою назвою "Full-stack Developer".
Суперечки навколо Full-stack
Не все так гладко, як здається на перший погляд. Багато досвідчених програмістів та IT-фахівців вищої ланки не визнають цю посаду за визначенням. "Чому?" — спитаєте ви. Адже раніше були ті самі веб-спеціалісти, які успішно поєднували обов'язки сучасних напрямків — фронту та беку. Чому сьогодні поняття Full-stack викликає суперечки?
Поширеною є думка, що Full-stack розробників не існує, а ті, хто такими називаються, насправді не відповідають вимогам цієї спеціальності.
Наприклад, Сергій Немчинський — програміст з 20-річним стажем, керівник та власник навчально-виробничої компанії FoxmindEd — в опублікованому відео на YouTube відгукується про Web Full-stack розробників наступним чином (посилання):
“В принципі, в ідеалі, Full-stack розробник – це класно та чудово. Проблема в тому, що... Таких немає. Фактично все, що ми маємо на ринку з тих людей, які називають себе Full-stack девелоперами – це приблизно 50% BackEnd девелоперів, які трошки вивчили FrontEnd і вже можуть Angular або React скомпілювати і, відповідно, зібрати-підключити, плюс трошки розуміють у верстанні – навіть не на рівні Junior верстальника. Вони у більшості випадків зробити добре, красиво не можуть ніяк. Максимум, що можуть – зробити так, щоб кнопка натискалася.
Або ж Full-stack девелопери – це решта 50% FrontEnd розробників, які трошки вивчили BackEnd; в більшості випадків – якийсь Node.js. Можливо, PHP. Такий розробник мінімально вміє щось підрихтувати, але, знову-таки, говорити про те, що він сяде і напише вам нормальний Full-stack додаток – ні, ні і ще раз ні.
(…)
Чесно скажу, мені ідея з об'єднанням у Full-stack девелоперів здається, з одного боку, не дуже вдалою, тому що фактично ми отримуємо "ні риба, ні м'ясо". З іншого боку, ринок вимагає – отже, треба. Тому затребуваність у Full-stack девелоперів, за великим рахунком, трохи більша, ніж у чистих BackEnd або FrontEnd розробників. Однак ринок вже усвідомив, що вони (Full-stack розробники) у своїй більшості "ні риба, ні м'ясо", і тому термін "Full-stack" починає пропадати. Тепер просто вважається, що це BackEnd розробник з невеликим знанням фронту і, навпаки, FrontEnd розробник з невеликим знанням однієї з BackEnd мов. Мені здається, що так набагато правильніше”.
Інші розробники схиляються більше до того, що Full-stack розробка – це ні що інше, як хитрощі бізнесу. Роботодавець не бажає переплачувати за двох різних фахівців, віддаючи перевагу більш дешевому аналогу, котрий вміє все те саме.
По суті, вся суперечка щодо Full-stack розробника зав'язана на скептицизмі. Прихильники міфологічності цієї професії не вірять у існування розробника, здатного добре реалізувати як FrontEnd, так і BackEnd частини, оскільки за обома ховається безліч технологій і мов, а вивчити все і працювати не гірше за фронтендерів і бекендників — практично неможливо.
Ті ж, хто займаються Full-stack девелопментом, парирують, вказуючи на велику кількість часу, проведеного за розробкою, в ході чого так чи інакше доводиться заглядати по інший бік барикад і розбиратися в усіх процесах, що супроводжують розробку всього проєкту від і до. Ну а далі справа техніки — вивчаєш необхідні інструменти, практикуєшся і можеш самостійно працювати над цілим проєктом. Звичайно, пізнання у всіх використовуваних мовах і технологіях у Full-stack спеціаліста будуть не такі глибокі, як у вузькоспеціалізованих побратимів по цеху, але зробити повноцінний робочий проєкт з нуля, реалізувавши як BackEnd, так і FrontEnd, йому буде під силу.
Різновиди Full-stack розробників
Варіацій Full-stack розробників насправді безліч: PHP Full-stack Developer, Node.js Full-stack Developer, Java Full-stack Developer і так далі. Назва, яка стоїть на початку спеціальності, говорить про те, яка мова/платформа береться за основу під час реалізації BackEnd частини. Стек технологій FrontEnd практично завжди однаковий і відрізняється лише використовуваними JavaScript-фреймворками / бібліотеками: Angular, React або Vue.js. А ось бекенд надає набагато більше можливостей для реалізації своїх амбіцій.
Ще раз проговоримо, що Full-stack Developer – це розробник, який бере безпосередню участь у всіх етапах розробки веб-додатків: від створення клієнтської частини (візуальна частина + логіка користувача) до реалізації серверної (бази даних, серверна архітектура, програмна логіка). Який стек технологій та мов знаходиться у розпорядженні цього фахівця? Якщо говорити про FrontEnd складову (клієнтська сторона), то вона у всіх приблизно однакова:
мова верстання HTML та мова стилів CSS;
мови програмування JavaScript та TypeScript;
препроцесори SASS та LESS;
фреймворк Angular/Vue.js або бібліотека React;
технології DOM, AJAX, REST API, знання про інтернет та веб-технології в цілому тощо;
навички адаптивного та кросбраузерного верстання.
А що потрібно знати full stack розробнику із серверного набору? Тепер розберемося з відгалуженнями в бекенді, які вказують на популярні мови та технології, що використовуються під час реалізації серверної сторони веб-додатків, котрі розробляються.
Node.js Full-stack Developer
BackEnd складова (серверна сторона) може мати різну начинку, на відміну від FrontEnd. Якщо говорити про Node.js Full-stack розробника, то в якості основної мови виступає JavaScript, а сам стек наступний:
платформа Node.js;
фреймворки Express.js, Nest.js;
пакетний менеджер npm;
Web Sockets;
розуміння REST API;
інші спеціалізовані технології.
Java Full-stack Developer
Головний акцент робиться на мову програмування Java та пов'язані з нею технології. BackEnd-стек у такого розробника має бути наступним:
мова Java + Java Core;
веб-сервер Apache;
інструменти для комфортної взаємодії з БД – JDBC, Hibernate;
веб-сервіси;
фреймворк Spring та його популярні модулі (Spring MVC, Spring Boot, Spring REST, Spring Web тощо);
ASP.NET Full-stack Developer
.NET розробники мають широкий інструментарій для самореалізації у вебі. Як основну мову програмування вони використовують C#. Скарбничка знань BackEnd частини у ASP.NET Full-stack Developer-а повинна містити:
мову C#;
знання інфраструктури .NET.
платформу ASP.NET MVC/ASP.NET Core (Web API);
Entity Framework (Core);
хмарний сервіс Azure;
мову T-SQL;
розуміння RESTful API.
PHP Full-stack Developer
PHP – класична мова веб-розробки. Типовий BackEnd-стек даного розробника відрізняється від інших своєю компактністю. РНР у вебі вже досить давно, а тому йому багато не потрібно; достатньо лише:
власне, сама мова PHP;
фреймворк Yii2/Symfony/Laravel.
Python Full-stack Developer
Універсальність Python не знає меж! Не стала винятком сфера веб-розробки. BackEnd-стек Python Full-stack спеціаліста наступний:
мова Python;
фреймворк Django/Flask;
REST API;
Web Sockets;
навички роботи з ОС Linux та веб-сервером Nginx/Apache (можливо);
досвід роботи із хмарними сервісами.
Також окрім спеціалізованих технологій, усім Full-stack розробникам необхідно:
знати систему керування версіями Git + сервіс для хостингу IT-проєктів GitHub;
знати реляційні (SQL) та нереляційні (NoSQL) бази даних, вміти їх проєктувати;
розумітися на протоколах HTTP, HTTPS та роботі FrontEnd + BackEnd загалом;
вміти оперувати мовою запитів SQL та однією із СУБД – MySQL / PostgreSQL / SQLlite, або однією з NoSQL СУБД (MongoDB, Redis, Cassandra, наприклад);
вміти проводити тестування додатків;
здійснювати Code Review;
використовувати Docker;
володіти англійською мовою на рівні Intermediate та вище;
знати популярні патерни програмування та вміти їх реалізовувати;
мати гарне знання алгоритмів та структур даних.
Також від Full-stack спеціаліста можуть вимагати навички мобільної розробки, якщо роботодавець має намір портувати веб-додаток на відповідні платформи.
Як бачите, список необхідних мов і технологій для створення гарної серверної складової веб-додатків є досить значним. У наступному розділі ми розберемося, які переваги та недоліки чатують на тих, хто таки має намір пов'язати свою професійну діяльність з Full-stack розробкою.
Плюси професії Full-stack Developer
Можливість самостійно вести цілий проєкт
Очевидна перевага розробника даної спрямованості полягає в об'єднанні двох течій – FrontEnd та BackEnd – в одному фахівці. Крім того, що такий професіонал здатний реалізувати обидві частини веб-додатку, він може безпроблемно налаштувати їхній взаємозв'язок, що є частим каменем спотикання між фронтендниками та бекендниками. Тим самим усуваються непорозуміння і протиріччя, які неминуче виникли б між декількома розробниками, які працюють над одним і тим самим продуктом.
В'ячеслав Лобода, Senior Full-stack PHP Developer, про свою професію відгукується наступним чином:
“Часто при вирішенні завдань веб-розробки виникає необхідність вносити редагування одночасно і до FrontEnd, і до BackEnd. Для цього можна найняти двох різних спеціалістів чи одного Full-stack розробника. Останній варіант дозволяє заощадити час на комунікацію”
Даний відгук і всі наступні взяті зі статті на dou.ua "Кар'єра в IT: посада Full-stack розробник".
Висока швидкість розробки, можливість приймати власні рішення, мінімальні витрати часу на зайву комунікацію
Full-stack розробник – це вже фахівець досить високого рівня, який здатний приймати певні самостійні рішення, не витрачаючи час на зайві обговорення та узгодження з іншими розробниками, адже проєкт цілком перебуває під його крилом.
“Подобається, що можу створювати веб-додатки одноосібно, менше затримок під час роботи. Наприклад, коли працюєш як FrontEnd і потрібно, щоб BackEnd віддавав нові дані, ти просиш колегу внести зміни, чекаєш. Full-stack розробнику чекати ні на кого не потрібно. Взяв і зробив як слід” – Геннадій Догаєв, Web Full-stack Developer
Легкість пошуку роботи на фрілансі
На біржах фрілансу замовники найчастіше шукають такого веб-спеціаліста, який зробить всю роботу самостійно без залучення додаткових розробників. Хто, як не Full-stack девелопер найкраще підійде на цю роль, маючи таку перевагу перед вузькоспеціалізованими побратимами? Отже, обравши цей шлях, ви не залишитеся без роботи і зможете користуватися всіма благами, які дарує фрілансерство.
Великі кар'єрні можливості
Широкоформатність професії Full-stack розробника дозволяє реалізувати себе в будь-якій сфері веб-девелопменту. Ви можете в будь-який момент перейти на більш вузький профіль – чисту FrontEnd або чисту BackEnd розробку (горизонтальний розвиток, поглиблення в конкретну сферу діяльності), а можете стати сильним тімлідом або архітектором, який чудово розуміється на всіх процесах створення веб-додатків і має багатий досвід за плечима (вертикальний розвиток, просування кар'єрними сходами).
Також Full-stack розробник може знайти успішне застосування своїм здібностям у стартапах. Стартап-команди, як правило, мають дуже малий бюджет і їм набагато вигідніше мати тих, хто може взяти на себе обов'язки декількох людей. Таким чином ви і новий досвід отримаєте, і зможете попрацювати над чимось свіжим, цікавим, раніше не баченим.
Ну а щодо потреб ринку в Full-stack розробниках навіть згадувати не варто – безліч компаній хоче отримати спеціаліста широкого профілю в свій штат. Кількість вакансій для них менша, ніж для фронтендників та бекендників, однак і конкуренції теж не так багато.
Мало рутини та вигорянь
Багата на різноманітність діяльність Full-stack розробників знижує ризики загрузнути в одноманітній роботі. Ви володієте великим арсеналом знань, що дозволяє вам періодично перемикатися між проєктами і менше втомлюватися від застосування одних і тих самих технологій.
Легкість у розвитку свого продукту
Ви маєте достатньо знань та вмінь, щоб самостійно створити власний проєкт. У майбутньому ви зможете організувати свою команду для вдосконалення та подальшого розвитку програмного продукту, проте вже на старті ви маєте все необхідне для того, аби реалізувати ваші ідеї.
Мінуси професії Full-stack Developer
Програш вузькоспеціалізованому розробнику на його полі бою
Full-stack девелопер володіє багатьма інструментами, але не може знати кожен настільки ж добре, наскільки окремо взятий фахівець. Ця професія передбачає подібне розпилення і унеможливлює поглиблення в будь-яку мову або технологію. Виходить, ви вмієте все, але гірше за розробника конкретного напряму.
Багато часу на навчання
Технологій, які має опанувати Full-stack спеціаліст, багато. Під час вивчення, наприклад, бекенду легко забути те, що ти вчив по фронтенду. Щоб усі знання та вміння утримувати на гарному рівні, необхідно витрачати багато зусиль. Впоратися з цим можна наступним чином: вивчаєте одну спеціальність, влаштовуєтеся на роботу, а потім вивчаєте другий напрямок. Виходить, ви не тільки поточні знання зберігаєте, але й примножуєте їх, рухаючись до фул-стек розробки.
“Нарощуйте компетенцію поступово, з невеликих завдань. Пройдіть курс із напрямку, якого вам бракує, щоб вникнути в базові принципи. А далі опановуйте знання на практиці за правилом Learning by doing” – Олексій Голубєв, Team Lead Full-stack Developer в GlobalLogic.
Важко стежити за новими тенденціями
Світ IT дуже гнучкий і мінливий. Наче імперії – виникають і руйнуються нові мови, технології, підходи в розробці ПЗ, техніки написання та ревізії коду. Вам, як фахівцю широкого профілю, необхідно знати всі новинки, адже, зрештою, цього і вимагатимуть від вас роботодавці — використання сучасних інструментів та підходів.
Занадто багато обов'язків
Роботодавці іноді починають висувати велику кількість вимог до фул-стек фахівця. Раніше згадуваний Full-stack розробник Геннадій Догаєв має таку думку щодо цього:
“Замовники хочуть звалити на одну людину надто багато. Наприклад, вже зустрічаються оголошення Node.js+React.js+React Native, тобто до веб-стеку додається ще й мобільна розробка. Це впливає на якість знань та кінцевого продукту: чим більше технологій потрібно охопити, тим більш поверхнево знаєш кожну з них. Крім того, людині не можуть подобатися всі напрямки одночасно. Мені з цього набору не дуже цікава мобільна розробка”.
Вами хочуть залатати дуже багато дірок
Фул-стек розробнику можуть часто делегувати різноманітні завдання на робочому місці. Дописати за кимось код, щось переглянути, пофіксити, доробити. Працювати замість FrontEnd/BackEnd розробника, який пішов у відпустку, – мила справа. А якщо вас найняли як альтернативу 5-ти розробникам, то й взагалі будуть тримати як раба.
Складні завдання
Ви знаєте більше інших, а значить, вам під силу розібратися з тою чи іншою важкою задачею. Принаймні так думає той, хто вам їх роздаватиме.
Велика завантаженість
Як ви вже помітили за попередніми пунктами, Full-stack розробнику не дадуть відпочити. Справ по вуха – це точний опис його стану на кожний робочий день.
Складнощі у заміні
Цей пункт одночасно є і перевагою, і недоліком. З одного боку, вам важко знайти заміну і, відповідно, вас цінуватимуть. З іншого боку, вам буде проблемно піти у відпустку, адже де взяти заміну? Тут і почнуться дзвінки у будь-який час доби, неможливість перекладання деяких завдань на інших розробників та інше.
Як стати розробником Full-stack?
Відповідь проста – оберіть найбільш близький до вас варіант професії та вивчіть необхідні технології за допомогою різних ресурсів, або підіть на курси full stack розробників. Радимо зробити свій вибір на користь освітньої IT-платформи ITVDN – тут ви зможете знайти 90% усіх потрібних вам відео курсів за будь-яким із обраних напрямків. Наприкінці статті ми залишимо корисні посилання на всі спеціальності, які допоможуть вам у вивченні ремесла Full-stack.
Наприклад, вам сподобався BackEnd-стек Python розробника – тоді вам підійдуть 2 курси за наступними спеціальностями:
FrontEnd Developer.
Python Developer.
З кожною програмою навчання ви зможете ознайомитися докладніше, перейшовши за залишеними посиланнями.
Зарплати Full-stack розробників
Відповідно до липневої зарплатної аналітики від DOU.ua (опитано 6605 українських розробників), медіанна зарплата FullStack розробників наступна:
Junior – 980 USD;
Middle – 2475 USD;
Senior – 4750 USD.
При цьому ЗП у колег по цеху – FrontEnd та Mobile розробників – приблизно такі ж. Єдині, хто помітно виділяються – BackEnd девелопери рівня Middle та Senior. Їхня медіанна оплата праці становить 2800 USD і 5000 USD відповідно, що на кілька сотень доларів перевищує зарплату фулстеккерів.
Якщо звернутися до міжнародного веб-сайту з пошуку роботи Jooble (має українське коріння), то станом на липень середня пропозиція щодо зарплати для FullStack Developer у Києві становить 114 183 грн (приблизно 3100 USD).
Відповідно до міжнародного опитування Stack Overflow Developer Survey 2023 (понад 90 000 респондентів з усього світу), річна медіанна ЗП FullStack фахівця складає 71 140 USD (приблизно 5930 USD на місяць).
Підсумки
Full-stack Developer — універсальний веб-розробник, який поєднує у собі силу FrontEnd та BackEnd напрямків. Так, спеціалізовані девелопери зроблять всю роботу краще, ніж фул-стек фахівець, проте головний коник героя цієї статті – можливість розробляти повноцінні веб-додатки самостійно, доводячи їх до повністю готового стану. Як і будь-яке інше, Full-stack ремесло має свої переваги та недоліки.
Шлях, яким повинен пройти full stack розробник з нуля досить тернистий і насичений. Проте недаремно казали класики — терпіння та праця все перетруть. Так що все у ваших руках!
Можливо, нас читають розробники Full-stack? Із задоволенням прочитаємо вашу точку зору на позиції, викладені в цій статті. Також будемо раді будь-яким питанням та зауваженням від усіх читачів!
Ну а тим, хто вирішив обрати професію Full-stack Developer, ми бажаємо бути впертими, оптимістичними і з незагасаючим вогником спраги знань в очах.
Успіхів та кодерського натхнення на вашому шляху!
Корисні посилання
Весь каталог спеціальностей: ІТ-спеціальності на ITVDN.
FrontEnd складова: відео курс за спеціальністю FrontEnd Developer.
BackEnd складова:
Python Developer
PHP Developer
ASP.NET MVC Developer
ASP.NET Core Developer
Java Developer
Онлайн навчання в групі з тренером за спеціальністю FullStack Node.js Developer.
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}
Спасибо за вопросы Денису Земляному, Николаю Воронину, Сергею Гнилицкому, Владимиру Свередюку, Михаилу Одинюку, Виктору Нову, Александру Шестопалу, Андрею Зеленцу, Кириллу Шевченко, Виктору Новицкому.
Як не треба використовувати патерн "Repository"
Автор: Редакция ITVDN
Обобщенный паттерн Репозиторий
Чтобы избежать недоразумений, давайте для начала проясним, что здесь имеется ввиду под понятием обобщенного репозитория. Видели ли вы когда-нибудь интерфейс вроде этого:
Или может вы видели его брата-близнеца, который имеет иной вариант метода Get:
Вдохновение для написания первого примера пришло из официальной документации Microsoft для ASP.NET MVC 4. Что же касательно второго примера, в Интернете вы можете найти бесконечное число блогов, описывающих именно этот вариант написания репозитория — иногда лишь с небольшими отличиями в виде возвращения IEnumerable<TEntity> вместо IQueryable<TEntity>. И в последнем случае часто еще и с дополнительным методом для генерации запросов. Что-то вроде этого:
Так что плохого в них, вы можете спросить? Почти ничего, если не считать плохое именование методов из примера Microsoft (здесь лучше было бы использовать Find и FindAll вместо Get и GetAll).
Но «почти ничего» - это далеко не то же самое, что «ничего». Первую проблему, которую я здесь вижу, так это нарушение Принципа Сегрегации Интерфейсов (Interface Segregation Principle). Они выражают полный набор CRUD-операций даже для тех сущностей, для которых операции удаления не имеют никакого смысла (к примеру, когда вы деактивируете пользователей вместо удаления их записей из базы данных). Но эта проблема может быть решена при помощи просто разбиения на три интерфейса — для чтения, обновления и удаления записей.
Реальная проблема, которую мы здесь имеем, заключается в некорректном использовании. Оригинальная идея заключается в том, что интерфейсы должны быть использованы в качестве базовых для ваших пользовательских интерфейсов. Что-то вроде этого:
Ваши обработчики событий и сервисы (клиенты пользовательских репозиториев) должны сами определять нужные методы и помещать их в пользовательские интерфейсы.
Это в теории. К сожалению, за свою карьеру мне довольно часто приходилось видеть несколько иную картину:
Кто-то создал рабочую реализацию IGenericRepository. Что хуже в этой реализации, так это то, что эта имплементация почти всегда регистрируется в IoC-контейнере и может быть внедрена в ваши обработчики команд и сервисы точно так же, как и любая другая зависимость.
Код выглядит достаточно красиво и чисто. На самом деле — нет. Почему именно так — скажу немного позже. Теперь же я бы хотел поговорить об одном из решений неправильной интерпретации GenericRepository<T> многих разработчиков. Само решение выглядит примерно так (диалог на code-review):
Джим Сеньор: вы когда-либо слышали, что NHibernate ISession или DbSet из Entity Framework на самом деле репозитории? А то, что вы только что создали — всего лишь небольшая обертка над ISession или DbSet? Де-факто, мы можем отказаться от этого обобщенного репозитория и просто использовать DbSet — результат будет аналогичным. Единственное, в чем IGenericRepository<T> действительно полезен — так это в том, что он скрывает большую часть ненужных для нас методов, которыми обладает DbSet.
Джонни Джуниор: да, в этом действительно есть смысл. Я полагаю, использование обобщенного репозитория в нашем случае было лишним (счастливо возвращаемся к написанию программы…)
Как по мне, что GenericRepository<T>, что DbSet – в большинстве ситуаций их использование лишнее (ну разве что вы пишите наиболее заCRUDженное приложение в своей жизни). Почему? Вот почему:
Единственный способ убедиться, что все LINQ-запросы будут верно преобразованы в SQL — это протестировать их на том же типе базы данных, что находятся в продакшине. Кроме того, в таком случае задача написания интеграционных тестов становится достаточно затруднительной. К примеру, взглянем на код:
Чтобы выполнить эти запросы, должны быть соблюдены два условия. За счет этого интеграционный тест становится менее читабельным. Теперь же давайте представим, что этот метод помещен в метод репозитория. Теперь в тесте нам нужно просто вызвать метод репозитория и проверить результат — просто, не так ли?
Я уверен, вы согласитесь, что LINQ-предикаты внутри сервисов нельзя использовать повторно и они имеют плохую тенденцию повторяться на протяжении всего кода. Даже если программист желает извлечь запрос в свой собственный метод, обычно это будет приватный метод конкретного сервиса. Инкапсуляция запросов внутри методов репозитория приведет к большей читабельности кода и в значительной мере упростить его использование.
LINQ-предикаты не именуются. Как правило, единственный способ узнать, что же, собственно говоря, делает наш запрос (без углубления в его логику), так это имя переменной-результата. К сожалению, искусство информативного именования переменных постигается с опытом, а поскольку в нашей индустрии полно начинающих программистов, мы имеем дело с переменными вроде result, ordersToProcess или просто — orders. Создавая обертку над запросами в виде метода репозитория, это автоматически обязывает разработчика дать этому самому методу конкретное имя. Даже если это имя не из лучших, в последствии провести небольшой рефакторинг не составит труда!
Порой, по причине скорости, мы вынуждены доставать данные из базы посредством чистого SQL. Подумайте, вы действительно хотите в своей бизнес-логике работать с такими низкоуровневыми сущностями, как DbConnection или SqlException? Подобный код лучше прятать за методами репозиториями.
Никаких обобщений — только конкретные репозитории
Перед тем как начать разработку репозитория, необходимо определить его интерфейс. Интерфейс должен содержать только те методы, которые нужны конечным клиентам. Другими словами, если никому не нужно удалять сущности данного типа, нет никакого смысла в написании функционала для их удаления.
Если вы боитесь закончить среди разных имен для базовых CRUD-операций — таких как Delete в одном репозитории и Remove в другом — вы можете создать полезные интерфейсы типа ICanDeleteEntity<TEntity>, ICanUpdateEntity<TEntity> и так далее. В таком случае конкретный репозиторий будет реализовывать только действительно нужные из них.
Ни один из методов репозитория не должен возвращать IQueryable<T>. Также убедитесь, что репозиторий не возвращает IQueryable<T>, скрытые за IEnumerable<T>. Всегда вызывайте ToList() или ToArray() дабы «материализовать» значения, придав им более конкретный тип данных.
Как только заходит речь о реализации репозитория, вы можете наследовать абстрактный класс GenericRepository<TEntity>. Если угодно — можно также использовать напрямую ISession и DbSet. Не важно, какой подход вы выбираете. Помните: любые «лишние» в данном контексте методы — по типу Delete из базового класса — будут скрыты за интерфейсом репозитория.
Также не забывайте, что ваш репозиторий не несет ответственности за транзакции базы данных. Лучше всего эта концепция реализуется при помощи паттерна Unit Of Work. Этот паттерн уже реализован в рамках ISession и DatabaseContext. Все, что нам нужно — это хороший интерфейс над ними:
Для большинства веб-приложений чтобы начать транзакцию через IUnitOfWork в виде начала запроса и Commit / Rollback в конце запроса — этого функционала вполне достаточно. Так же подобное может быть достигнуто при помощи фильтров действий или декораторов обработчиков / сервисов.
Пример репозитория, созданного при соблюдении всех приведенных рекомендаций:
Сейчас все стало ясно, но давайте еще раз проясним. Каждый метод наших репозиториев должен быть учтен по крайней мере одним интеграционным тестом, который должен использовать тот же тип базы данных, что и продакшн. Всегда используйте интеграционные тесты для проверки своих репозиториев.
Немного о недостатках
Не существует роз без шипов, и представленный выше подход — не исключение. Некоторые из них можно решить, используя отличимую от трехуровневой архитектуру. Наиболее часто с конкретными репозиториями возникали следующие проблемы:
За длительное время репозитории могут набрать большое количество Find-методов. Достаточно часто эти методы похожи друг на друга. Есть два способа это предотвратить. Один из них — это группировка нескольких Find-методов в один общий. Этот метод должен принимать object, что представляет собой критерий запроса. Пример:
Чтобы создать запрос с критерием запроса, мы строим набор критериев шаг за шагом:
Зачастую слишком большие репозитории обрастают целой плеядой различных сервисов. Вы можете избежать этого при помощи чего-то, что я называю CQRS-light. Отличием от полной версии является использование тех же таблиц как для чтения, так и для записи. Используя эту технологию, мы можем использовать ту же самую ORM как для чтения, так и для записи. Обращаться же к CQRS только в тех случаях, когда приложение в этом действительно нуждается (например, при обработке 80+ колонок, с использованием 20+ join). Диаграмма ниже представляет типичную архитектуру CQRS-приложения:
Ключевые принципы CQRS-light следующие:
Деление всех действий пользователя на две категории. Первая категория — действия, изменяющие систему. К примеру, оформление заказа в интернет-магазине. Вторая категория — действия, систему не трогающие. К примеру, просмотр списка товаров. Первая категория пишет — это команды, другая — читает, это запросы.
Обработчики запросов для доступа к данным могут использовать только репозитории. Доступ к данным может осуществяться посредством любой технологии. Обычная конфигурация включает в себя ORM для чтения-записи, ORM для записи и микро-ORM для чтения (вроде Dapper) или же ORM для записи и чистый SQL для чтения.
Обработчики команд для доступа и изменения данных могут использовать только репозитории. Для получения данных из базы обработчики команд не должны использовать обработчики запросов. Если обработчик команд должен выполнить комплексный запрос и этот запрос должен получить ответ от обработчика запроса, вы должны продублировать логику этого обработчика запроса и поместить его как в обработчик запроса, так и в метод репозитория (операции чтения и записи должны быть разделены).
Обработчики запросов тестируются только в интеграционных тестах. Для обработчиков команд существуют юнит и — опционально — также интеграционные тесты.
CQRS даже в своей легкой форме — сама по себе объемная тема и заслуживает отдельного блога.
Теперь же давайте вернемся к теме недостатков паттерна конкретного репозитория. Другой недостаток, о котором я бы хотел упомянуть, заключается в нежелательной миграции бизнес-логики в определение запросов. К примеру, даже такой простой запрос:
содержит часть бизнес-логики, описывающей необходимые параметры, дабы заказ стал активным. Как правило, ORM не позволяет нам инкапсулировать такие части логики в отдельные свойства, как IsActive.
Что нам здесь нужно, так это паттерн спецификации. Теперь наш запрос в форме паттерна спецификации будет выглядеть так:
Автор перевода: Евгений Лукашук
Источник
Мій перший досвід перенесення .NET програми під .NET Core
Автор: Ben Emmett
Мой первый опыт переноса .NET приложения под .NET Core
Совсем недавно я портировал .NET 4.5.2 – приложение под .NET Core 2.0. Хочу сразу отметить, что эта статья не является гайдом, и тем более это не перечень того, что может во время процесса пойти «не так». Однако она призвана дать общее понятие операции, мои впечатления от перехода на Core – стандарт и вообще, а стоит ли это делать.
Приложение
Приложение, которое я портировал, импортирует и обрабатывает информацию от ресурса SurveyMonkey. Проект DataPersistence – это уровень для взаимодействия с базой данных, в моем случае – через Entity Framework 6.2. Логика взаимодействия с SurveyMonkeys и преобразования данных так же, как и различные администрирующие функции, помещены в библиотеке ImporterCore. Importer – это небольшое консольное приложение, которое инкапсулирует определенную функциональность из ImporterCore, позволяя запустить ее в качестве запланированной Windows-задачи. Проект Explorer является веб-приложением ASP.NET MVC 5 для анализа информации. Проект Tests (на диаграмме не представлен) построен с использованием nUnit3 и обновляет все проекты к 5 версии.
Кратко о процессе
Сам порт занял у меня около двух дней. В конце концов картинка была следующая:
Более 80 процентов усилий были затрачены на чтение блогов, логов ошибок и, конечно же, употребление кофе. Но только после всего этого я смог собой гордиться. Впрочем, если бы мне пришлось повторить порт снова, сейчас бы он занял у меня всего лишь одну четвертую от того времени, которое я потратил. Итак, касательно порта я могу сказать следующее:
Просто погуглите готовые решения и применяйте их до тех пор, пока все это дело не заработает снова.
Для всех компонентов, кроме, собственно говоря, самого веб-проекта, обновите csproj-файлы к более новому и упрощенному VS15-формату, который все еще поддерживает версию .NET 4.5.2. Я подумал, что лучше сделать это вручную, чем пересоздавать проекты с нуля.
Выгрузите все проекты из решения отдельно от DataPersistance, которая была в основании пирамиды приложения. Соберите для .NET Core – стандарта.
Обновите все пакеты библиотеки DataPersistence к последним версиям, поддерживаемым .NET Core. В некоторых исключительных случаях (наподобие работы с Entity Framework) полностью замените пакеты программ на .NET Core – аналоги (в нашем случае это будет Entity Framework Core).
Просмотрите все провальные билды и исправляйте все изменения api до тех пор, пока проект не скомпилировался.
Повторите шаги 2-4, добавляя дополнительные пакеты к приложению (по одному за раз).
Чтобы заставить заработать веб-проект после порта, мне пришлось бы столько всего фиксить и исправлять, что я просто предпочел создать новый пустой проект и просто скопировал папку контроллеров, моделей и представлений + различные статические файлы в виде JavaScript и CSS. Перенос сайта на новый проект вместо исправления старого было определенно правильным решением.
Запустите тесты. Запомните, что «построение того же самого, что и раньше» - это не то же, что «делать то же самое, что и раньше».
Исправьте баги шага 7.
Проведите мануальные тесты.
Упущения
К сожалению, далеко не все прошло так гладко, как хотелось бы. В основном замеченные ошибки были связаны с не совсем правильным выполнением шагов 7 и 8.
Несовместимые библиотеки
Дело в том, что ImporterCore зависела от библиотеки, которую я написал несколько лет назад и которая не поддерживает стандарт .NET Core. Она использует WebClient, который не существует в рамках .NET Core 1.0 / 1.1. К счастью, уже в версии 2.0 появилась поддержка WebClient, что значительно упростило обновление системы – нужно всего лишь внести некоторые изменения в csproj, AssemblyInfo и nuspec – файлы. Однако в случае, если вы все же сильно зависите от неподдерживаемых библиотек, порт приложения будет невозможен.
Entity Framework
Эта вещь заняла больше всего времени. Дело в том, что Entity Framework 6.2 в .NET Core не поддерживался, а его аналог – Entity Framework Core – значительно различается, что делает процесс порта достаточно трудоемким. А именно:
Маппинг
В конце концов EF Core мне понравился больше, чем EF 6.2. Здесь я привожу пример оригинального файла маппинга для оригинального объекта – Survey. Здесь Entity Framework получает информацию об именах колонок для всех свойств, названия таблицы, ключевом свойстве.
В EF Core при преобразовании свойства производится маппинг к соответствующей колонке (разве что вы не укажете другую логику маппинга). Также считается, что если в вашем классе вашей сущности есть свойство Id или SurveyId, это будет считаться свойством-ключом (опять же, если вы не укажете обратное). Так что мне удалось избежать написания около 1000 строк лишнего кода, что достаточно круто.
Большинство из оставшихся нюансов маппинга могут быть настроены через аннотации, композитные ключи и так далее.
Изменения в API
Здесь также есть целая серия замечательных изменений. К примеру, для конфигурирования «иностранных» ключей мы писали следующий код:
Однако в EF Core метод HasRequired() заменился на HasOne(). Также раньше для тестов приходилось использовать context.Database.Create() и context.Database.Delete(), которые в EF Core были заменены на context.Database.EnsureCreated() и context.Database.EnsureDeleted().
Наложение
Немного больше усилий пришлось приложить, чтобы настроить кастомную работу со значениями типа DateTime. Приложение всегда сохраняет значения типа DateTime в базе как Utc, но когда EF читает это, указанный тип не распознается, таким образом он маркируется как DateTimeKind.Unspecified, что в последствии может приводить к нежелательным последствиям. В рамках предыдущей версии EF я использовал возможности фичи – Intersection, которая, увы, больше не доступна в полной мере в раках EF Core. Впрочем, я смог решить проблему при помощи использования инструмента EntityMaterializerSource.
Лично меня сводит с ума то, что ни одна версия Entity Framework – технологии не поддерживает в нормальном виде работу с UTC – форматом.
Lazy Loading
Это было наибольшее разочарование: EF Core не поддерживает Lazy Loading. Да, в грядущей версии EF 2.1 эта опция должна появиться, но на данный момент решения не существует. В свое время я написал немного горькой правды о производительности Entity Framework, потому использование возможностей Lazy Loading было бы разумным решением. Отследить правильность работы с базой во время построения приложения невозможно. К счастью, при помощи некоторых тестов мне удалось вовремя заметить, что EF Core не использовал возможности Lazy Loading, но представьте себе, что было бы, если бы я этого не заметил и выпустил приложение в продакшн.
Конечно, решение использовать Eager Loading вместо Lazy Loading не стало концом света, но оно вынудило писать большее количество тестов, усложнило код (в основном из-за использования вложенных Include() и ThenInclude() - конструкций) и слегка замедлило работу. Возможно, с релизом EF Core 2.1 я все же верну все так, как было.
Конфигурация
В то время, как .NET Framework хранит все записи о конфигурации в виде xml в app.config / web.config – файлах, .NET Core использует appsettings.json. Лично мне это понравилось, но вместе с этим мне пришлось внести некоторые изменения.
Хостинг на IIS
Оригинальный веб-сайт Explorer развернут под IIS. ASP.NET Core использует Kestrel, который запускается в качестве отдельного от IIS – процесса. Вам необходимо установить .NET Core Windows Server Hosting Bundle, что позволяет Kestrel непосредственно работать с кодом, а IIS – отвечать за безопасность и некоторые задачи администрирования. Также необходимо настроить пул приложения для запуска неуправляемого кода.
К несчастью, деплой подобного в продакшн – сложный и трудоемкий процесс. Пришлось ждать помощи от дружественно настроенного сисадмина. Упс.
Вердикт
По сути, я не встретил ничего особо страшного. Только парочку незначительных багов, каждый из которых потребовал немного времени на устранение. Для отслеживания подобных багов я советую использовать Portability Analyzer, который значительно упростит вам работу.
Я портировал небольшое приложение – всего лишь 5 проектов с несколькими десятками тысяч строчек кода. Если я буду делать что-то подобное вновь, весь процесс должен занять у меня намного меньше времени, чем пара дней. А в целом перед портированием больших приложений я все же советую пока попрактиковаться на маленьких.
Вообще, если говорить о целесообразности перехода на стандарт .NET Core, я был вынужден это сделать только потому, что нам предстоит взаимодействовать с другими приложениями этого же стандарта. А так, безусловно, новая технология ASP.NET Core заслуживает своего внимания.
Автор перевода: Евгений Лукашук
Источник
Введення в розробку програм під iOS. Частина 0.
Автор: Volodymyr Bozhek
Здравствуйте, дорогие читатели. Меня зовут Владимир.
Любая технология рано или поздно приедается и рост себя как специалиста затрудняется. Было принято решение что то кардинально поменять в своей жизни. А так как писать различные интересные проекты я просто обожаю, было принято решение начать изучение в корне другой платформы, среды разработки и языка программирования. Поиск этой платформы оказался достаточно прост для меня. Я решил, что это будет мобильная платформа.
У меня было много разных телефонов с разными операционными системами. Но свой выбор я сделал в пользу iOS, так как при железе слабее, чем у других телефонов, софт работает намного быстрее, чем на других платформах. Это не все преимущества этой платформы, но о других я рассказывать я не буду, дабы не раздувать дискуссию на эту тему. Скажу лишь одно, что телефон c iOS меня ни разу не подвел, даже в самые нужные моменты.
Разумеется, что для разработки под iOS необходим mac, и я его купил. Перед покупкой, разумеется, пробовал разработку под мобильные платформы в гибридных платформах типа Xamarin, Ionic, но на то время функционал в них был не так совершенен, как сейчас, да и пользуясь ими, я бы остался на платформе Windows, это нарушало цель, которую я перед собой поставил по поводу другой платформы.
В течение отпуска, где то за месяц я разобрался, как писать под iOS приложения и сразу начал искать проект, на котором смогу потренироваться. Друг предложил такой проект и я взялся.
За 9 месяцев написал серьезное приложение, купил учетную запись разработчика, выкладывал сборки на Test Flight, их тестировали тестировщики, прошел валидацию в App Store и выложил приложение в App Store.
А теперь по сути. Я постараюсь написать серию статей, в которых распишу простым языком, что надо делать, чтобы у вас тоже это получилось и вы таки выложили свое приложение в App Store.
Касаемо разработки под iOS, то это просто мое хобби во вне рабочее время (надо же как то развлекаться), основной хлеб приносит разработка под Windows/Web платформу с технологиями Microsoft.
Итак, приступим.
Включите свой мак, найдите на панели задач иконку App Store и нажмите на нее.
Выглядит эта иконка вот так:
Затем введите в поле поиска, текст “xcode”, вы должны увидеть следующее:
У меня Xcode уже установлен, поэтому на скриншоте отображается кнопка “Open”, у вас будет отображаться кнопка “Install”. Установите Xcode себе на компьютер, версия Xcode с которой мы будет работать с вами в этом примере, будет 8, на текущий момент это последняя версия этой среды разработки.
Язык программирования, который мы будем использовать, называется Swift, по синтаксису он больше похож на JavaScript и где-то даже на C# местами.
Синтаксис языка Swift в этих статьях мы разбирать не будем, в сети интернет есть полно руководств на эту тему. Сам синтаксис языка не сложно изучить, это делается за день, сложность как раз возникнет при попытке разработки приложения под iOS.
Вот именно эту сложность, мы с вами и постараемся одолеть.
Чтобы серия статей была как-то взаимосвязана, мы с вами напишем проект под названием “Warehouse” (склад), в котором можно будет добавлять товары, заполнять их атрибуты, редактировать и удалять товары. Данные будут сохраняться в настройки телефона.
Вы уже установили Xcode 8? Если да, тогда запускайте его, вы увидите следующее:
Нажмите кнопку “Create a new Xcode project”. Вы увидите такой экран:
Выделите проект “Single View Application” и нажмите кнопку “Next”. Вы попадете на экран задания названия проекта:
На данном скриншоте виден пример того, как заполнить название приложения. В поле “Product Name“, введите “Warehouse”, так будет называться наше приложение.
В поле “Organization Name”, введите свои имя и фамилию, или название вашей компании.
В поле “Organization Identifier”, вводится уникальный идентификатор приложения, который будет использоваться как ключ при регистрации данного приложения в iTunes, чтобы была возможность подписывать сборки и отправлять на бета сервер Test Flight для тестирования, но об этом позже. Вкратце “com” - это сокращенно “company”, “bozhek” это название компании, у вас это будет другое название.
В поле Bundle identifier видно полное название вашего приложения в iTunes.
В поле Language, оставьте Swift. В поле Devices, выберите iPhone.
Нажмите кнопку “Next”. Откроется проект, который мы создали:
Обратите внимание на красный кружок в поле Status: “Signing for Warehouse reguires a development team”. Это сообщение говорит нам о том, что приложение надо подписать сертификатом, без сертификата мы не соберем и не запустим это приложение.
Давайте это исправим. В поле Team, откройте выпадающий список и выберите в нем пункт “Add an Account...”, откроются свойства среды разработки Xcode, с предложением ввести логин и пароль от
вашей учетной записи в App Store, под которой вы устанавливаете приложения себе на телефон:
Если же у вас по каким то причинам нет этой учетной записи, создайте ее, нажав на кнопку “Create Apple ID”. Создание этой учетной записи я не буду рассматривать в данной статье, поскольку она создается очень легко и в сети интернет есть полно информации на эту тему.
Итак, вы ввели в поля Apple ID и Password свои данные, нажмите кнопку “Sign In”. После этого красный круг с ошибкой пропадет и вы увидите следующее:
Теперь вы сможете собрать и запустить свой проект.
Заметьте, я рассказываю чисто практически как и что делается, особо не вникая в детали.
Если вам нужна более подробная информация, вбейте в гугл WWDC, и посмотрите официальные видео сессии от компании Apple, в их двухчасовом видео много воды, но зато есть теория, которая будет вам нужна. Я даю только суть.
Нажмите на иконку приложения в проекте:
Выберите симулятор “iPhone 7”.
Затем нажмите на кнопку Собрать и запустить приложение:
Будет запущена сборка проекта и запущен симулятор “iPhone 7”, в котором откроется наше приложение:
Сейчас мы видим только белый экран и больше ничего, так как мы еще ничего не делали.
Чтобы выйти на рабочий стол в симуляторе, выполните сочетание клавиш Shift + Command + H, это сочетание означает нажатие кнопки Home:
Вы увидите на рабочем столе наше приложение "Warehouse".
Теперь давайте остановим выполнение приложения, для этого в Xcode нажмите кнопку:
Теперь давайте посмотрим, что у нас есть внутри проекта.
Выделите в левой панели среды разработки файл “Main.storyboard”, в этом файле содержится представление приложения.
В панели справа отображаются свойства представления.
Разработка под iOS строится через паттерн MVC (Model View Controller), файл Main.storyboard, содержит View, которые вы будете использовать в своем приложении для создания визуального
интерфейса. Теперь давайте выделим в панели свойств вкладку Class:
В поле Class , мы видим класс контроллера, привязанный к данному представлению.
Теперь выделите вкладку Size:
На данной вкладке задаются размеры представления.
Выделите вкладку Events:
На данной вкладке задаются обработчики событий в представлении с привязкой к методам в контроллере.
Теперь выберите в левой панели файл ViewController.swift :
На 9 строке подключено пространство имен UIKit.
На 11 строке объявляется класс с именем ViewController, который наследуется от базового класса контроллера UIViewController.
На 13 строке мы переопределяем метод, загрузки представления, этот метод вызывается когда представление начинает свою загрузку. В этом методе необходимо предварительно проинициализировать данные элементов управления, используемых на вашем представлении.
На строке 14, вызывается метод базового класса ViewController.
Код на строке 18 нам пока не интересен, мы его рассматривать не будем, чтобы не путаться.
На этом урок завершается.
На следующем уроке, в первой части, мы рассмотрим с вами, как пользоваться элементами управления, как привязывать к ним обработчики событий и как взаимодействовать с ними.