Результаты поиска по запросу: обучение c
Вступление в NUnit
Автор: Редакция ITVDN
Введение
Статья рассказывает об NUnit – открытой среде юнит-тестирования приложений для .NET. В данной статье мы рассмотрим, что такое NUnit, как его загрузить и установить, создание классов тестов , а также запуск теста.
NUnit - открытая среда юнит-тестирования приложений для .NET, которая позволяет создавать автоматические тесты. Даный вид тестов обладает рядом преимуществ:
Высокое качество программы;
Снижение стоимости;
Безопасность регрессии сети
Чем выше качество программы, тем меньше средств затрачивается на устранение недостатков проекта. То есть, если найти недостатки в проекте на раннем этапе, решить их будет дешевле.
Загрузка и установка NUnit
Вы можете скачать NUnit с сайта http://www.nunit.org/
После завершения загрузки, разархивируйте файл и запустите программу.
Создание проекта библиотечного класса
Теперь создадим простой класс теста, используя C#, который добавляет два показателя, и протестируем его. Чтобы создать тест класса в Visual Studio, используя С#, выполните следующие шаги:
Шаг 1: Создание проекта библиотечного класса
Откройте Visual Studio.
Для создания проекта библиотечного класса сначала нажмите File -> New -> Project, выберите Visual C # в установленном шаблоне, выберите Class Library. Введите подходящее название (мы используем IntroNUnitTest), нажмите "OK".
После того, как Вы кликнули кнопку "OK", Вы увидите Ваш проект в Solution Explorer (в правом верхнем углу Visual Studio).
Шаг 2: Добавьте ссылки к Вашему проекту.
Чтобы добавить ссылку NUnit к Вашему проекту, кликните правой кнопкой мыши на ссылку, выберите Add reference-> Browse, затем nunit.framework.dll и «OK».
Шаг 3: Создание тестового класса.
Кликните правой кнопкой мыши на Вашем проекте, выберите Add -> Class, введите имя (используем MyNUnitTestClass) и далее "Add".
После того, как Вы кликнули на кнопку Add, Вы увидите класс.
После того, как Вы создали класс, добавьте using NUnit.Framework.
Следует соблюдать некоторые условия и понятия:
Каждый класс должен содержать атрибут [TestFixure] и должен быть общедоступен.
В каждом методе должен присутствовать атрибут [Test].
Оператор подтверждения об отсутствии ошибок: Булевские значения, описывающие, что должно быть ключевым словом, когда выполняется действие.
Ожидаемое исключение: один из типов исключения, который мы ожидаем во время выполнения тест-метода.
Установка: программа, которая запускается перед выполнением каждого тест-метода (например, регистрация в системе конкретного пользователя или инициализация одноэлементных классов).
Демонтаж: программа запускается после окончания каждого тест-метода (например, удаление строк из таблицы, которые были вставлены во время теста).
На примере мы постараемся сравнить две переменные х и у. Каждой переменной присвоили значение 20. В общей сложности написали 4 теста (PositiveTest, NegativeTest, ExpectedExceptionTest и NotImplementedException).
Запуск тестов
После написания всех тестов в тестовом классе необходимо запустить тесты, чтобы проверить, проходят ли они успешно. Для запуска тестов перейдите в папку NUnit, выберите NUnit Application (.exe) и дважды кликнике по ней, выберите команду File-> Open Project, выберите проект (в нашем случае это IntroNUnitTest.dll), затем кликаем Run.
Далее Вы увидите количество тестов, которые не сработали, и количество невыполненных тестов.
Если Вы хотите запустить какой-то определенный тест, кликните правой кнопкой мыши в тесте, который Вы хотите запустить, и выберите Run test(s).
Другие настройки
Вы также можете использовать другие настройки для запуска тестов:
Testdriven.net
ReSharper Jetbrains
Источник: http://www.c-sharpcorner.com/UploadFile/18fc30/introduction-to-nunit-test-driven-development-using-nunit-a/
400+ вопросов на собеседовании по С++
Автор: Влад Сверчков
Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 5 апреля 2021 года. Оригинальная версия на украинском языке доступна по ссылке.
Junior
1.1 Общие вопросы
1.2 Метапрограммирование
1.3 Препроцессор и компиляция
1.4 Язык C
1.5 Язык С++ и ООП
1.6 STL / Algorithms
1.7 Многопоточность
1.8 Networking
1.9 OS/Linux
1.10 SCM / CI / CD
1.11 Практические задания
Middle
2.1 Общее
2.2 Препроцессор и компиляция
2.3 Язык С
2.4 Язык С++
2.5 Паттерны проектирования
2.6 Метапрограммирование
2.7 OOP/OOD
2.8 STL / Algorithms
2.9 Многопоточность
2.10 Networking
2.11 SCM / CI / CD
2.12 Практические задания
Senior
3.1 Общее
3.2 Препроцессор и компиляция
3.3 C/C++
3.4 OOP/OOD
3.5 STL / Algorithms
3.6 Многопоточность
3.7 SCM / CI / CD
3.8 Практические задания
Предлагаем список технических вопросов, которые, вероятно, вам поставят на собеседованиях по C++. Вопросы предоставили специалисты, принимающие участие в проведении технических интервью по этому языку. Учтите, что есть широкий спектр специализаций, поэтому выбирайте свое направление и готовьтесь.
Junior
Общие вопросы
1. В чем заключаются основные принципы ООП?
2. Что такое сложность алгоритма?
3. Код работает неправильно. Что делать?
4. Объясните такие структуры данных, как стек и очередь.
5. Какие книги, связанные с программированием, читали? Чему с них научились?
6. Что интересного нашли в новых стандартах С++17, С++20?
7. Что такое таблица ASCII?
8. Что такое Unicode?
9. Что такое паттерны проектирования и для чего их используют?
10. Патерны Singleton, Strategy, Template-Method, Decorator?
11. Для чего нужны модульные тесты?
12. Какая разница между модульными и интеграционными тестами?
13. Что такое TDD?
Метапрограммирование
14. Что такое шаблонный класс и шаблонная функция?
15. Что такое конструкторы? Какие типы знаете?
16. Может ли конструктор быть шаблонной функцией?
17. Может ли виртуальная функция быть шаблонной?
18. Что такое инстанциация шаблона?
19. Что такое специализация шаблона? Частичная специализация шаблона?
20. Расскажите об имплементации шаблонных классов в срр-файле?
Препроцессор и компиляция
21. Как проходит процесс компиляции срр-файлов в бинарный файл?
22. Что такое препроцессор?
23. Как работает препроцессор?
24. Какие знаете команды препроцессора?
25. Как работает директива include?
26. Как работает директива define?
27. Что именно линкует линкер?
28. Что такое оптимизация компилятора?
29. Что такое флажки компиляции?
30. Как защитить хедер от повторного включения?
31. Что делает директива include?
32. Как работают макросы?
Язык C
33. Как static влияет на глобальные/локальные переменные?
34. Как сonst влияет на переменную?
35. Какие варианты использования extern знаете?
36. Какие варианты использования volatile знаете?
37. Какие есть битовые операции?
38. Что такое булевая алгебра?
39. Расскажите об этапах разработки библиотеки или программы.
40. Что такое алгоритмы сортировки и какие вы знаете?
41. Какие алгоритмы работы со строками знаете?
42. Какие алгоритмы на графах знаете?
43. Где может храниться переменная?
44. Какая разница между calloc и malloc?
45. Для чего используют realloc?
46. Что такое указатель?
47. Каков размер указателя и от чего он зависит?
48. Какие есть операции с указателями?
49. Что такое struct?
50. Как определить размер структур?
51. Что такое выравнивание в структурах?
52. Что такое union?
53. Какой размер union?
C++/OOP
54. Что такое класс?
55. Какие есть основные типы данных в C++?
56. Что такое инкапсуляция? Как она реализуется в C++?
57. Какие есть встроенные типы в С++?
58. Что такое enum?
59. Как соотносится класс и объект?
60. Какая разница между структурой и классом?
61. Разница между private/protected/public и где они используются?
62. Какие методы класса являются стандартными для класса?
63. Что такое абстрактный класс и зачем он?
64. Сколько памяти занимает объект пустого класса class A {}; ?
65. Что случится с функцией, если к ней добавить ключевое слово static? В контексте члена класса? В контексте метода класса?
66. Какие особенности статических полей класса?
67. Какая особенность константных методов-членов класса?
68. Как изменить поле класса в константном методе класса?
69. Какие методы можно вызвать из константных объектов?
70. Что такое куча и стек? Различия, принцип работы.
71. В чем разница между указателем и ссылкой?
72. Для чего нужен указатель на функцию? Как его объявить?
73. Что будет, если забыть вызвать delete? Когда освободится эта память?
74. Что такое умный указатель? Какие умные указатели есть в стандартной библиотеке?
75. Как работает std::unique_ptr?
76. Как работает std::shared_ptr?
77. Расскажите о константности переменной, ссылки, указателя. Что такое константный указатель и указатель на константу? Размер указателя в памяти?
78. Расскажите о передаче аргументов по значению, по ссылке и по указателю.
79. Расскажите о порядке вычисления аргументов функции?
80. Что произойдет, если вернуть ссылку на временный объект?
81. Что такое перегрузки функции? Виды перегрузки.
82. Что такое явное и неявное приведение типов в С++? Расскажите о функциях явного приведения типов в C++.
83. Что такое инициализация переменной в if?
84. Что такое ленивые вычисления в С++?
85. Расскажите о циклах for и range-for.
86. Что делает ключевое слово auto? auto-определение return-типа, аргументов функции?
87. Чем отличаются delete и delete [ ] ? Что случится, если вызвать delete у объекта, созданного через new [ ] ?
88. Обработка ошибок в С++. Какие конструкции используют при обработке exception?
89. Можно ли выбрасывать exception из конструктора? Какие поля будут сконструированы, какие поля будут разрушены?
90. Что такое memory leak?
91. Можно ли выбрасывать exception из деструктора?
92. Как отловить деление на 0 в С++?
93. Как работают константные методы?
94. Что такое лямбда-функция в С++? Как получить доступ к переменным во внешней области видимости?
95. Для чего использовать namespace, anonymous namespace?
96. Как вызвать объект из nested namespace?
97. Как работают inline-функции? Может ли такая функция быть рекурсивной?
98. Что такое полиморфизм?
99. Для чего используется наследование?
100. Какие бывают типы наследования?
101. Для чего используют виртуальное наследование?
102. Как можно решить проблему ромбовидного наследования без использования виртуального наследования?
103. Что случится, если класс-наследник передать по значению в функцию, которая принимает базовый класс?
104. Что случится, если пронаследоваться от базового класса, который не имеет виртуального конструктора?
105. Что случится, если вызвать переопределенную virtual function из конструктора? Может ли конструктор быть виртуальным?
106. Может ли pure virtual function иметь имплементацию? Что случится, если вызвать pure virtual function из конструктора?
107. Какие методы генерируются для класса по умолчанию? В каком случае такие методы не будут генерироваться? Как заставить компилятор добавить/удалить эти методы?
108. Как запретить наследовать класс?
109. Какой порядок конструирования и разрушения классов в иерархии? Порядок инициализации полей класса?
110. Какие есть способы инициализации полей класса?
111. Может ли деструктор быть виртуальным?
112. Что делает ключевое слово virtual?
113. Для чего используют виртуальный деструктор?
114. Что такое глубокое копирование?
115. Что такое виртуальные функции и зачем они нужны?
116. Как защитить объект от копирования?
117. Что такое семантика перемещения?
STL / Algorithms
118. Из чего состоит STL?
119. Какие алгоритмы применяли с STL? В чем преимущество использования алгоритмов перед собственноручно написанными функциями?
120. Расскажите о контейнерах стандартной библиотеки vector, list, map, unordered_map.
121. Какие знаете типы итераторов? Чем они отличаются? В каких контейнерах используются?
122. Какая разница между std::set, std::map, std::unordered_multimap?
123. Что такое идиома remove-erase?
124. Как получить наименьшее значение типа?
125. Какая разница между std::map и std::hashmap?
126. Как подсчитать количество элементов в std::list?
127. Что такое сложность алгоритма и от чего она зависит?
128. В чем разница между vector и list и в каких случаях их лучше использовать?
Многопоточность
129. Что вам известно о многопоточности?
130. Что общего и различного в процессах и потоках?
131. Как синхронизировать передачи информации между потоками?
132. Какая разница между мьютексом и семафором?
133. Что такое deadlock?
134. Является ли С++ thread-safe?
135. Что такое race-condition?
136. Как избежать состояния гонки?
137. Что такое атомарная операция?
138. Как работать с std::mutex?
Networking
139. Что такое сокет?
140. Какие операции можно делать с сокетом?
141. Какая информация нужна, чтобы создать сокет?
142. Какие бывают модели сетей?
143. Расскажите об уровнях модели OSI.
144. Расскажите об уровнях модели TCP/IP.
145. Что такое IP-адрес?
146. Для чего используется маска подсети?
147. Какая разница между IPv4 и IPv6?
148. Сколько памяти необходимо для хранения IPv4?
149. Для чего нужен порт?
150. Сколько максимально может быть портов?
151. Какая разница между TCP и UDP?
152. Для чего такой ненадежный UDP-протокол?
OS/Linux
153. Что такое менеджер пакетов?
154. Какие бывают менеджеры пакетов?
155. Какие бывают дистрибутивы Linux?
156. Что такое PID?
157. Для чего используют файловые дескрипторы?
158. Расскажите о стандартных файловых дескрипторах процесса.
159. Что такое Pipe?
160. Что такое Named Pipe?
161. Что такое UID?
162. Расскажите о командах bash.
SCM / CI / CD
163. Какие есть виды SCM?
164. Для чего используют системы контроля версий?
165. Какие есть команды git?
166. Какие этапы во время комита изменений?
167. Разница между git fetch и git pull?
168. Какие есть этапы решения merge conflict?
Практические задания
169. Посчитайте количество единиц в произвольном числе.
170. Есть структура по типу «односвязный список». Напишите функцию, которая разворачивает список. То есть, первый элемент становится последним, а последний - первым.
171. Напишите реализацию функции int atoi (const char *str); преобразования строки в число.
172. Для структуры типа односвязный список напишите функцию вставки элемента.
173. Реализуйте класс vector.
174. Реализуйте бинарный поиск в массиве.
175. Реализуйте любую сортировку.
176. Реализуйте макрос для сравнения двух строк.
177. Реализуйте реверс строк.
178. Реализуйте перевода числа из строки в int.
179. Реализуйте подсчет слов в предложении.
180. Реализуйте подсчет чисел Фибоначчи.
181. Найдите такие элементы двух массивов, которые попадаются только в каждом из них. Желательно использовать STL.
182. Удалите из unordered_map элементы, которые делятся на 2 и выведите ключи этих элементов.
183. Напишите класс для логирования, который мог бы логировать к консоли или файлу.
184. Напишите функцию для определения, является ли определенный год високосным.
185. Напишите функцию для определения, является ли определенное слово палиндромом.
186. Напишите реализацию паттерна Singleton.
187. Напишите реализацию std::vector с операциями: push_back, push_front, pop_back, pop_front, size, clear.
188. Напишите рекурсивный поиск значения в дереве бинарного поиска.
189. Напишите функцию, которая проверяет, является ли дерево сбалансированным.
190. Напишить функцию для поиска уникального элемента в массиве.
Middle
Общее
1. Какие курсы прошли или книги прочитали за этот год? Чему научились?
2. Что нравится и не нравится в С++? Чего не хватает?
3. Что интересного нашли в новых стандартах С++17, С++20 (конкретные фичи)?
4. Расскажите о фичах, которые появились в разных версиях языка.
5. Расскажите о модели памяти, которая появилась в С++11 стандарте.
6. Что такое сериализация? Какие библиотеки знаете?
7. Какие знаете паттерны проектирования?
8. Что такое операционная система? Какие существуют типы по назначению?
9. Назвать основные составляющие и принципы работы ОС Linux в качестве примера системы общего назначения.
10. Что такое SFINAE и PIMPL?
11. Назовите порождающие, структурные и поведенческие паттерны программирования и приведите примеры их использования.
Препроцессор и компиляция
12. Расскажите о системах автоматизации билд-процесса.
13. Какая разница между статической и динамической библиотеками?
14. Какая разница между исполнительным файлом и динамической библиотекой?
15. Что такое DLL hell?
16. Что такое флажки компиляции (fPIC)?
17. В чем разница между дебаженной и релизной сборкой?
18. Что нужно для использования сторонней библиотеки?
19. Что такое internal linkage?
C
20. Что будет, если дважды вызвать free?
21. Как происходит вызов функции?
22. Как происходит передача параметров в функцию?
23. Как прорабатывается константа переменных?
24. Что означает ключевое слово inline?
25. Для чего используют выравнивания, можно ли его контролировать?
26. Расскажите о битовых полях.
27. Для чего нужен extern "C"?
28. Что будет, если в двух файлах сделать функцию с одинаковым именем и параметрами? На каком этапе возникнет ошибка?
29. Как экспортировать/импортировать функции из динамической библиотеки?
30. Какая разница между С-style приведением типов и C++ приведением?
C++
31. Что такое явное и неявное приведение типов в С++? Зачем делать explicit-конструктор?
32. Что такое Uniform initialization? Aggregate initialization?
33. Что такое Reference to temporary object? Как продлить время жизни временного объекта?
34. Что такое делегирующий конструктор?
35. Что такое список инициализации?
36. Какой порядок инициализации полей класса? Что случится, если конструктор инициализирует поля в другом порядке?
37. Что случится, если инициализировать поле другим полем?
38. Что такое copy elision? Сколько раз будет вызван конструктор/деструктор у объекта, которого возвращают по значению?
39. Что такое move-семантика?
40. В каких случаях не будет сгенерирован конструктор копирования?
41. Чем отличается конструктор копирования от оператора присваивания?
42. При каких условиях в конструкторе можно выбросить exception?
43. Что такое конструктор по умолчанию? Для чего нужны default и delete?
44. Чем отличается интерфейс от абстрактного класса?
45. Какие виды полиморфизма в С++?
46. Как реализовано наследование в большинстве компиляторов?
47. Множественное наследование: за и против?
48. Виртуальное наследование и порядок конструирования?
49. Зачем использовать override?
50. Какие есть правила вывода типа при использовании auto? В каких случаях auto может привести к нежелательному копированию объекта?
51. Расскажите обо всех возможных способах использования ключевого слова static в С++. Что такое static initialization order fiasco?
52. Что делает вызов throw; в блоке catch?
53. Чем отличается constexpr от const?
54. Что такое const correctness?
55. В каком случае можно использовать const_cast?
56. Что такое ключевое слово mutable и когда его нужно использовать?
57. Что такое ключевое слово friend и когда его нужно использовать?
58. Расскажите о лямбда-выражениях в С++ и доступ к переменным во внешней области видимости, захват this в лямбду и время жизни лямбды и захваченных переменных?
59. Что такое функтор? Напишите пример.
60. Что такое специализация шаблона?
61. Что такое dynamic_cast и run-time type identification?
62. Что такое exception? Как бросить и поймать?
63. Что будет, если бросить exception из конструктора? А из деструктора?
64. Что будет, если не поймать exception?
65. Что произойдет, если exception выйдет за пределы блока noexcept функции?
66. Для чего можно использовать приватное наследование?
67. Что такое контракт функции?
68. Что такое vptr и vtable?
69. Где содержится vptr?
70. Где содержится vtable?
71. Какая разница между overload and override?
72. Как компилятор различает члены класса и обычные переменные в функциях?
73. Зачем используют exceptions?
74. Что такое блоки try-throw-catch?
75. Расскажите о логике catch-блоков.
76. Что такое move constructor?
77. В чем разница между константным методом и неконстантным?
78. Что такое В-нотация и как определить сложность любого алгоритма?
79. Что такое таблица виртуальных методов?
80. Какие функции класса автоматически генерирует компилятор, если их не определить?
81. Что такое выравнивание данных?
82. Что такое exception?
83. Какие есть стандартные контейнеры и на основе каких структур они построены?
84. Что такое Undefined behavior? Приведите примеры.
85. Как определить, что в программе есть memory leak?
86. Для чего нужен std::make_shared? Чем он лучше создания std::shared_ptr через конструктор?
87. Что будет, если выделить один объем памяти, а записать больше?
88. Что такое переполнение stack?
Паттерны проектирования
89. Зачем нужны паттерны? Какие типы паттернов различают?
90. Недостатки паттерна Singleton? Когда он уместен?
91. Преимущества и недостатки PIMPL?
92. В чем разница между паттерн-фабрикой и фабричным методом? Когда использовать какой из них?
93. Что такое паттерн Observer?
94. Як контролировать состояние программы? Машину состояний? Паттерн состояние?
95. Что такое паттерн Visitor?
Метапрограммирование
96. Какие есть правила вывода типа в шаблоне?
97. Чем отличается using от typedef?
98. Сколько памяти занимает произвольная структура? Что такое выравнивание объекта?
99. Почему пустая структура занимает 1 байт? Какая минимальная единица адресации в С++?
OOP/OOD
100. Что такое SOLID? Что означает каждый из этих принципов?
101. Расскажите о паттернах проектирования.
102. Что такое Dependency Injection? Приведите пример.
103. Какие преимущества и недостатки функционального подхода?
104. Что такое принцип RAII?
105. Что такое принцип DRY?
106. Что такое принцип KISS?
107. Какие преимущества композиции перед наследованием?
STL / Algorithms
108. Какие алгоритмы с STL использовали? Каких не хватает?
109. Какими особенностями должен обладать класс, чтобы он был итератором?
110. Какие бывают итераторы?
111. Расскажите об инвалидации итераторов.
112. Как оптимизировать удаление элемента со средины вектора?
113. Как реализован vector?
114. Как реализован list?
115. Как расширить STL-контейнеры?
116. Какие есть алгоритмы в STL?
117. В чем разница между vector, deque, list, set e STL?
118. Когда надо использовать map? Когда - unordered_map? Какая сложность поиска и вставки в этих контейнерах?
119. Как проверить, есть ли в контейнере элементы? Почему вызов container.size() является плохой практикой?
120. Что такое exception safety guarantee? Какую exception safety guarantee имеют STL-контейнеры?
121. Расскажите о типах умных указателей и о подсчете ссылок в них.
Многопоточность
122. Является ли С++ thread-safe?
123. В чем разница между многопоточностью и асинхронностью?
124. Что такое многопоточность? Какую функциональность предоставляет С++ для разработки многопоточных приложений? Какие основные проблемы многопоточных приложений?
125. Как передать информацию между несколькими процессами?
126. Как синхронизировать между собой несколько процессов?
127. Какие есть особенности работы с shared memory?
128. Как работает spinlock?
129. Какие вы знаете особенности использования recursive mutex?
130. Расскажите о read-write mutex.
131. Что такое race-condition? Взаимная блокировка? Что такое критическая секция?
132. Как избежать состояния гонки?
133. Чем отличается мьютекс от семафора?
134. Какие примитивы синхронизации реализованы в C++? Преимущества lock_guard?
135. Что случится, если exception выйдет за пределы потока? Какие инструменты есть для безопасной асинхронности в С++?
136. Чем отличается std::launch::async от std::launch::deferred?
137. Что такое атомарная операция? std::atomic?
138. Как работать с std::conditional_variable?
139. Как создать поток с помощью std::thread?
140. На сколько потоков лучше разбить задачу? От чего это зависит?
141. Как работать с std::async?
142. Thread-safe гарантии контейнеров в С++? В чем недостаток интерфейса front() + pop_front()?
Networking
143. Что такое TCP handshake?
144. Какая разница между TCP и UDP?
145. Расскажите о протоколах верхнего уровня.
146. Какая разница между HTTP и HTTPS?
147. Расскажите об SSL/TLS handshake.
SCM / CI / CD
148. Расскажите о процессах CI.
149. Как отредактировать комит?
150. Расскажите об интерактивном rebase.
151. Какие могут быть способы дебаггинга кода?
152. Для чего нужны Unit test? Чем отличается от Functional Test?
153. Как тестировать код? Какой используете фреймворк?
154. Какие библиотеки знаете для написания тестов?
155. Что такое mock?
156. Сколько тестов нужно написать на одну функцию?
157. Что такое побочный эффект, идемпотентность и чистые функции?
158. Что такое контейнеризация и в чем преимущества и недостатки? Что такое Docker или иной инструмент контейнеризации?
159. Что такое CI/CD и какие преимущества приносит для разработчика?
160. Какие принципы итеративных методологий?
161. Какие преимущества и недостатки code-convention?
Практические задания
162. Напишите максимально корректную реализацию класса string с конструктором копирования и оператором присваивания.
163. Напишите реализацию очереди.
164. Реализуйте функцию, которая за один проход найдет уникальный элемент в контейнере.
165. Напишите thread-safe пул потоков.
166. Напишите игру жизни в ООП стиле.
167. Напишите класс, который достает из базы список товаров по фильтру и показывает на консоли. Напишите тесты для него.
168. Любая задача на написание кода, чтобы проверить умение проектировать интерфейсы и придерживаться принципов SOLID, DRY, KISS.
169. Напишите свою реализацию std::atomic.
170. Напишите программу для анализа графов: нахождение циклов, deadlock-состояний, циклов, недоступных состояний.
171. Напишите программу, которая бы проверяла, что в системе запущен только один ее экземпляр. Решение должно быть cross-platform.
172. Проанализируйте C++ код с точки зрения качества: выявить потенциальные memory leak, нерациональное использование STL-контейнеров, алгоритмов, неоптимальные конструкции и тому подобное.
173. Напишите код для решения судоку.
174. Напишите код, который найдет зацикливание в односвязном списке.
Senior
Общее
1. Как вы понимаете SOLID?
2. Как разработать систему плагинов на С++?
3. Что такое RPC? Какие библиотеки знаете?
4. На что обращать внимание при проведении code review?
5. Какие есть проблемы при написании кроссплатформенного кода? На что обращать внимание?
6. Что делать, если код работает медленно?
7. Какие есть способы и методологии измерения быстродействия кода? Как можно устранить/уменьшить влияние замеров на быстродействие?
8. Что такое SFINAE? Для чего используется?
9. Что такое метапрограммирование? С помощью чего реализуется на С++?
10. Как использовать variadic templates?
11. Как тестировать закрытые методы?
12. Как считать покрытие тестами? Нужно ли это делать?
13. Что такое cache miss и как это выявить?
14. Что такое SIMD-инструкции? Какие необходимые условия и способы их использования?
15. Что такое покрытие кода и как обеспечивается?
16. Опишите принципы lock-free структур данных и свой опыт работы с ними.
Препроцессор и компиляция
17. Расскажите о построении билд-системы.
18. Как работать с билд-системами: Make, CMake.
19. Как интегрировать third-party в проект?
20. Что такое барьеры памяти?
21. Расскажите о работе с сырыми указателями и о ручном управлении памятью.
22. Что такое статический анализатор кода? Какие знаете?
23. Что такое динамический анализатор кода? Какие знаете?
24. Проект медленно собирается. Как можно ускорить?
C/C++
25. Расскажите об использовании realloc в контейнерах.
26. Как работают шаблоны?
27. Расскажите о специализации шаблонов.
28. Как работает RTTI?
29. Можно ли использовать exception в конструкторе/деструкторе?
30. Что такое rvalue и lvalue?
31. В чем особенности контейнеров std::set, std::map, std::unordered_map, std::hash?
32. Что такое placement new? Для чего используют? Как сделать placement delete?
33. Как размещается в памяти класс со множественным наследованием и виртуальными функциями?
34. Как работают точки остановки?
35. Что такое уязвимости? Каков механизм их работы?
36. Как написать собственный std::shared_ptr?
37. Что такое curiously recurring template pattern?
38. Опишите назначение и принцип работы std::shared_ptr, std::unique_ptr и std::weak_ptr.
39. Какое назначение и отличия использования std::variant и std::any?
40. Какие улучшения получил std::search в С++17 ?
41. Что такое copy elision и когда он становится возможным? Какие особенности для разных стандартов?
42. Что такое Return Value Optimization?
OOP/OOD
43. Объясните принципы SOLID.
44. Объясните принципы KISS.
45. Объясните принципы YAGNI.
46. Какие есть подходы к оптимизации кода?
47. На что стоит обращать внимание при code review?
48. Какие есть паттерны проектирования? Почему не советуют использовать Singleton?
49. Что такое статический полиморфизм?
STL / Algorithms
50. Когда std::vector может использовать std::move?
51. Расскажите о своем любимом алгоритме поиска.
52. Что такое lock-free и wait-free алгоритмы? В чем их отличия и способы реализации?
53. Опишите назначение execution policy для параллельных алгоритмов.
Многопоточность
54. Расскажите о построении API, рассчитанных на многопоточное использование.
55. В чем разница между kernel-level и user-level потоками?
56. Что такое coroutine?
57. Что делает спецификатор thread_local?
58. Как реализовать синхронизацию в задаче producer-consumer?
59. Як синхронизироваться между различными процессами?
SCM / CI / CD
60. Расскажите о настройке процесса менеджмента ветвей репозитория.
61. Расскажите о стратегии разветвления (branching).
Практические задания
62. Напишите базовую реализацию std::shared_ptr.
63. Реализуйте алгоритм сортировки.
64. Реализуйте алгоритм хеширования.
65. Реализуйте shared_ptr с расширением для weak_ptr.
66. Реализуйте простейший producer-consumer, используя условные переменные.
67. Опишите как можно подробнее, что происходит в системе, когда приложение делает сетевой запрос.
68. Детально описать дизайн программного компонента, например, системы голосования; учесть при этом высокую нагрузку и сделать ее расширяемой и отказоустойчивой.
Выражаем благодарность за участие в статье Александру Жакуну, Ярославу Пушко, Назару Семенишину, Сергею Подоброму, Владимиру Кочуну, Владимиру Новикову, Сергею Кривоносу, Марку Цирульнику, Кириллу Пшеничному, Виктору Шуму, Сергею Братусю.
Как подготовиться к собеседованию в IT на английском
Автор: Влад Сверчков
Английский в IT. Для каких задач нужен?
English в школе. Опыт автора.
Какой английский необходим для разработчиков и тестировщиков?
Что не работает.
Что реально работает в изучении English.
Как это организовать.
Глоссарий.
Рекомендации по изучению английского + бонус!
Заключение.
Друзья, предлагаем вашему вниманию занимательную статью, написанную на основании интервью одного IT-специалиста из Кремниевой долины. В своё время ему потребовался английский для работы над крутыми международными проектами, однако камнем преткновения стал разговорный English. Это краткая и поучительная история о том, как наш герой перепробовал множество вариантов, но таки смог найти тот самый, который помог ему «заговорить» и добиться желаемого в IT. Приятного чтения!
Приветствую!
Сегодня мы поговорим о том, как быстро прокачать английский для собеседований в IT-компанию. Я буду рассказывать на примере своего опыта, когда решения на базе искусственного интеллекта ещё не были распространены.
Немного о себе. Меня зовут Александр, сейчас я работаю аналитиком в EPAM в Калифорнии, проект у нас в компании Google. В прошлом у меня уже был опыт управления проектами. Сам я из цеха программистов, но сейчас занимаюсь бизнес-анализом.
Эта статья будет полезна в первую очередь для тех, кто хочет подтянуть свой английский для работы в информационных технологиях. Данный способ подходит не только для IT, но и для любой другой сферы.
Когда говорим про обучение, нужно понимать, что есть множество способов и вариантов. Я помогу выбрать лучший способ именно в контексте работы в IT.
После прочтения статьи вы поймете, как сэкономить время на изучение английского языка. Время – это самый драгоценный ресурс, поэтому думаю, что вам будет полезно.
Английский в IT. Для каких задач нужен?
Пару слов об IT и какой английский нужен.
Приведу свой пример: когда я был разработчиком, English сводился к тому, что я читал мануалы на английском языке, первоисточники, использовал Stack Overflow, читал на форумах. В основном это была текстовая информация, то есть беглое чтение больших объемов информации. Если говорим про какую-то документацию, протоколы и т. д., я выделяю это как первичный уровень знания языка.
Также упомяну про английский для резюме. Сталкивался с тем, что у людей прекрасный инглиш, и у них в резюме указано, что уровень B2 или TOEFL. Но касаемо работы это не приносило бенефитов. Нужно четко разделить английский в плане работы, особенно в IT, на два уровня.
Английский для различных ролей в IT
Английский, который нужен тестировщикам и разработчикам, является первым входным порогом. Следующий порог – это там, где требуется коммуникация, например, для ролей бизнес-аналитика или проектного менеджера, которые общаются с англоговорящими заказчиками или стейкхолдерами.
Если говорить о разработчиках, тестировщиках, архитекторах, то один из важных аспектов – это техническое интервью. Оно может быть для собеседования в компанию или внутренним. В моем случае, чтобы подтвердить свою компетентность, я проходил assessment – экзамен, на котором присутствовало пять человек из разных стран с разным уровнем знания языка и акцентами. Нужно было отвечать на профессиональные вопросы и приводить примеры из прошлого опыта.
Говоря о техническом интервью, важно отметить, что английский язык необходим не только для понимания вопросов, но и для передачи своего опыта и знаний. Кроме того, есть понятие поведенческого интервью, где тоже важно владеть языком.
Английский в школе. Опыт автора
Расскажу про свой опыт изучения английского в школе. У нас English был со второго класса, это были базовые буквы и слова. В пятом классе начался обычный школьный английский: много грамматики, сложные слова, которые нужно было заучивать наизусть. Произношению уделялось меньше внимания, особенно если говорить не о гимназиях и школах с углубленным изучением языка.
Мы делились на группы по уровню знаний. В одной группе были ученики с более сильным английским, куда попал и я. В другой группе учительствовал профессиональный переводчик без преподавательского образования: ученики слушали песни, общались только на английском – обучение было больше в игровой форме без особого упора на грамматику. Баллы во второй группе, соответственно, были ниже.
В итоге, несмотря на хорошие оценки в школе и институте, в реальной жизни, при поездках в Европу, я убедился, что мой английский был недостаточно хорош для повседневного общения – я не понимал людей, равно как и они меня.
Чему не учат в школе:
Простоте и понятности. В школе не дают базовые потребительские фразы, которые можно заучить и использовать в повседневной жизни.
Беглости и плавности. Школьная программа не учит беглому чтению и пониманию общего смысла текста или речи без детального перевода каждого слова. Также не учат говорить плавно и непринужденно, как и пониманию живой речи собеседника.
Практическим навыкам. Научиться говорить естественно и понимать собеседника в реальном времени – это то, что приходит с практикой и чего в школе не преподают.
Английский, необходимый для разработчиков и тестировщиков
Первый и важнейший ресурс – это время. Все хотят быстро выучить язык, но в реальности это требует времени и усилий. Для того чтобы подтянуть английский, нужно им регулярно заниматься, а также использовать на практике.
Второй ресурс – деньги. В идеале, чтобы всё было бесплатно. Однако даже если у вас есть средства, нужно понимать, сколько вы отдадите и какое качество получите взамен.
Порог входа
Для тестировщиков и разработчиков начальным порогом является базовое владение английским, чтобы понимать и использовать техническую документацию, писать простые отчеты о багах, взаимодействовать с другими членами команды. Однако, если вы претендуете на роль бизнес-аналитика или проектного менеджера, где требуется постоянное взаимодействие с англоязычными заказчиками и стейкхолдерами, уровень английского должен быть значительно выше.
Технические и внутренние интервью
Как я уже упоминал выше, английский пригодится для собеседований на работу в иностранную команду / работу с иностранным заказчиком, а также могут быть внутренние технические интервью (для подтверждения квалификации, например). Важно уметь отвечать на профессиональные вопросы и приводить примеры из своего опыта.
Что не работает
Учитель-академик. Академический подход с упором на грамматику и теорию мало помогает в развитии навыков свободного общения.
Письма, чаты и статьи. Письменная практика не дает значительных результатов в развитии разговорных навыков.
Голосовые сообщения. Запись голосовых сообщений создает иллюзию обучения, но не развивает навык быстрой реакции, схватывания на лету и понимания в реальном времени.
Зазубривание теории и слов. Заучивание теоретических вопросов и слов не помогает в реальном разговоре, так как любое отклонение от заученного сценария вызывает замешательство.
Просмотр фильмов и сериалов. Хотя это полезно для общего понимания языка, данный метод не способствует развитию активных навыков спикинга и понимания на высоком уровне.
Что действительно работает при изучении английского
Очень эффективным является ежедневное общение на английском языке по 45 минут либо по часу в день. Это может быть разговор с носителем языка или человеком с уровнем выше вашего. Важно, чтобы это была активная разговорная практика, а не пассивное восприятие информации. Практика в экстремальных условиях, когда нужно быстро реагировать и формулировать мысли, значительно улучшает спикинг-навыки.
Как это организовать
Найдите собеседников внутри компании. Отправьте письмо коллегам с предложением готовиться вместе к профессиональному интервью / экзамену либо чему-то в этом роде. Укажите список вопросов и предложите созваниваться раз в неделю. Таким образом, у вас будет постоянная практика.
Используйте сервисы для общения. Как пример – сервисы вроде Conversation Exchange или Italki. Они помогут найти людей для практики, с которыми можно регулярно созваниваться и общаться на английском – как профессиональных преподавателей, так и простых энтузиастов, готовых заниматься за небольшую плату. Именно так я заполнял свой ежедневный часовой спринт.
Платные преподаватели. В случае если коллег недостаточно или вы хотите повысить интенсивность занятий, можно обратиться к платным преподавателям на том же Italki.
Глоссарий
В моей практике словарный запас оказался особенно важен, поскольку необходимо было уверенно использовать профессиональные термины, специфичные для разработки, тестирования, архитектуры и бизнес-анализа. И чтобы свободно общаться я создал свой глоссарий.
Как я создал свой глоссарий:
Взял книги, которые считаются "библиями" в области управления проектами и бизнес-анализа:
PMBOK (Project Management Body of Knowledge) для менеджеров проектов.
BABOK (Business Analysis Body of Knowledge) для бизнес-аналитиков.
Скачал эти книги в формате PDF, затем скопировал их содержимое в текстовый файл.
Заменил все пробелы на переносы строки, чтобы сформировать одну колонку текста.
Для анализа текста и выделения наиболее часто используемых слов – Excel. В Excel я создал сводную таблицу (pivot table), чтобы определить частоту встречаемости слов.
Из тысячи слов я выбрал 40 самых употребляемых и заучил их. Это позволило мне быстро расширить свой профессиональный словарный запас и начать активно использовать эти термины в своей речи.
При построении глоссария важно использовать проверенные и авторитетные источники. Книги, такие как PMBOK и BABOK, предоставляют стандартизированные термины, которые часто употребляются в профессиональных кругах. Это гарантирует, что глоссарий будет достоверным и актуальным.
Можете выбрать другие авторитетные книги. Главное — следовать методике: создайте колонку с текстом, проанализируйте частотность слов и выберите наиболее часто встречающиеся термины для заучивания.
Рекомендации по изучению английского
Ежедневная практика. Первая и самая важная рекомендация — ежедневно уделять не менее одного часа на общение на английском языке. Хотите хорошо говорить и проходить собеседования на английском? Просто говорите и слушайте. Уже через месяц-два регулярной практики вы увидите результаты.
Определение канала восприятия. Важно определить, как вы лучше всего воспринимаете информацию: через аудио, текст или визуальные материалы.
Экспериментирование. Пробуйте разные методы изучение языка и найдите то, что работает именно для вас. Не бойтесь делать ошибок!
Поддержание языковой среды. Окружите себя источниками английского языка для улучшения восприятия и запоминания:
текстовый формат: книги, статьи и новости на английском языке;
аудио: подкасты, аудиокниги;
используйте стикеры с новыми словами и расклейте их на видных местах, чтобы легче запоминать;
переведите интерфейсы телефонов и компьютеров на английский язык.
Бонус: бесплатный сервис для практики английского языка
А теперь я хочу поделиться с вами действительно полезным бонусом — это бесплатный сервис под названием Pramp. Он позволяет вам находить собеседников со всего мира, имеющих разный уровень подготовки. Вы можете выбрать тему для интервью, будь то техническое или поведенческое собеседование.
Алгоритм использования Pramp прост:
Найдите человека для общения: на выбор множество стран, собеседники с разным уровнем английского.
Выберите тему для интервью: FrontEnd, системный дизайн, поведенческое интервью и т. д.
Организация созвона, который длится около 30 минут. У вас есть заранее подготовленный набор вопросов.
Задаете вопросы своему собеседнику, делаете заметки о том, что понравилось и что можно улучшить.
Меняетесь ролями: ваш собеседник задает вам вопросы.
В сервисе есть множество готовых наборов вопросов для каждой тематики. Вы можете следовать им или использовать свой собственный список. Так же может поступить и собеседник.
Повторюсь: сервис бесплатный. Вы сможете общаться с людьми из разных стран и с различным профессиональным опытом; вопросы и темы максимально приближены к реальным собеседованиям. Вы не только улучшите свои языковые навыки, но и получите ценные советы по прохождению интервью.
Я использовал этот сервис для подготовки и могу сказать, что это великолепная возможность. Общался с менеджерами проектов, инженерами из Америки, Азии и Индии. Pramp идеально сочетает в себе все необходимые элементы для успешной подготовки к прохождению собеседований.
Заключение
Самое главное в изучении английского – это регулярность и интенсивность практики. Ежедневные занятия по часу в стрессовых условиях с различными собеседниками помогут быстро повысить уровень английского языка, улучшить беглость и плавность речи, а также развить навыки понимания собеседника. В своё время мне очень помогли Conversation Exchange, Italki, Pramp.
В моём случае я перепробовал много различных вариантов: тексты, статьи, аудиокниги, сериалы, подкасты, преподаватели английского. Наблюдал увеличение словарного запаса, совершенствование грамматики, но «заговорить» так и не мог.
В итоге, именно регулярный живой разговорный формат и помог мне достичь успеха на англоязычном собеседовании и осуществить свои карьерные амбиции. Уверен, что мой опыт окажется ценным для многих из вас. Успехов в изучении английского!
.NET Core 2.1, 2.2 и 3.0: что нас ждет в новых версиях?
Автор: João Carrasqueira
Во время конференции Microsoft Ignite было сделано довольно много заявлений. Значительная часть из них относится к .NET Core. На презентации компания выделила некоторые основные фичи .NET Core 2.1, которые сейчас может опробовать любой желающий. Также она выделила грядущие изменения релизов 2.2 и 3.0.
Говоря об изменении версии 2.1, вы можете заметить повышение производительности в сравнении с версией 2.1. Согласно бенчмаркам TechEmpower, новый релиз в среднем на 15 процентов быстрее при работе с чистым текстом, на 18 процентов быстрее при обработке JSON и порядка 147 процентов — при взаимодействии с Fortune, обрабатывая 240 000 запросов за секунду (при 97 000 запросов версии 2.0).
Версия 2.1 также привносит целую серию новых инструментов, таких как Global Tools и Windows Compatibility Pack, позволяющий использовать API более старых приложений в рамках .NET Core. Также в рамках Entity Framework (EF) Core поставляются такие вкусные вещи, как lazy loading, конверсия типов и более. В дополнение, теперь ASP.NET Core поддерживает HTTPS-протокол и такие вещи, как SignalR. К слову, теперь Azure SignalR является встроенной технологией, позволяющей ощутить все ее прелести в режиме реального времени.
Microsoft поделилась информацией о новшествах версии 2.2. Как заявляет компания, разработка сфокусирована на трех пунктах: улучшение работы с Web API, микросервисы и Azure, а также улучшение производительности. Помимо прочего, также идет поддержка многоэтапной JIT-компиляции и поддержка расширений SQL Server и SQLite для EF Core.
ASP.NET Core будет обладать обновленными шаблонами Bootstrap и Angular, версий 4 и 6 соответственно. Microsoft также улучшает Web API, добавляя поддержку API Security + включая HTTP/2 для всех соединений ASP.NET Core.
Забегая наперед, можно сказать, что .NET Core 3.0 сосредоточится на настольных приложениях, AI и IoT-устройствах. Если вы опасаетесь, что Microsoft желает заметь .NET Framework на IoT, можем заверить вас, что поводов для беспокойства нет. Более традиционный стандарт будет по-прежнему доступен для backward-поддержки, просто .NET Core будет постепенно развиваться, становясь основным стандартом для работы.
В рамках этого обновления также будут включены некоторые фичи, такие как XAML Islands и XAML Controls для WPF и WinForms, что были анонсированы ранее в этом году в числе других правок для WinForms с высокой нагрузкой на DPI. Также .NET Core-приложения получат доступ ко всем Windows 10-API в версии 3.0. Плюс в релизе будет включен Application Bundler – приложение, помещающее все выходные файлы в один исполняемый файл, который можно будет запустить везде, не важно, установлен .NET Core или нет.
Помимо прочего, в версии 3.0 Microsoft также намерена реализовать Razor Components, интегрирующие Blazor в ASP.NET Core, тем самым позволяя запускать их на сервере в связке с .NET Core. Подобное нововведение хорошо помогает совместимости веб-приложений, так как при помощи WebAssembly один и тот же код может быть запущен на разных устройствах. Дата релиза .NET Core 3.0 еще не анонсирована, но, скорее всего, он будет доступен уже в этом году.
Также компания напомнила, что фреймворк машинного обучения для .NET-приложений ML.NET недавно обновился к версии 0.5, добавился TensorFlowTransform, что позволит разработчикам использовать существующую модель TensorFlow в рамках ML.NET.
Автор перевода: Евгений Лукашук
Источник
ТОП-10 лучших видео по FrontEnd
Автор: Влад Сверчков
Здравствуйте!
Друзья, сегодня мы подготовили для вас подборку лучших вебинаров от ITVDN по направлению FrontEnd. В рейтинг были включены как познавательные вебинары с актуальной информацией, так и вебинары прикладного характера, которые нацелены на совершенствование ваших навыков написания кода. Давайте приступим к их рассмотрению.
Как стать FrontEnd разработчиком? Пошаговая инструкция для начинающих
Автор — Тысячный Влад, Middle React.js / React Native Developer.
FrontEnd Developer — это разработчик, который создает клиентскую сторону веб-сайтов. Ваши любимые сервисы — социальные сети, видеохостинги, интернет-магазины — любой интернет-продукт необходимо преподнести пользователю в привлекательном и удобном для него виде. В такой задаче никак не обойтись без фронтенд специалиста.
Какие требования выдвигают работодатели к FrontEnd-разработчику? Что нужно знать и уметь, с чего начать и как лучше спланировать обучение. На вебинаре, вы получите ответы на все интересующие вас вопросы и составите целостное представление о профессии FrontEnd разработчика.
Адаптивная верстка на FlexBox и Grid
Автор — Ткаченко Анастасия, FrontEnd Developer.
Flexbox и Grid – технологии, которые широко используются в верстке сайтов и существенно упрощают реализацию их адаптивности. Что они являют собой?
CSS Flexbox (Flexible Box Layout Module) — модель макета гибкого контейнера — представляет собой способ компоновки элементов, в основе лежит идея оси. Flexbox состоит из гибкого контейнера (flex container) и гибких элементов (flex items). Гибкие элементы могут выстраиваться в строку или столбик, а оставшееся свободное пространство распределяется между ними различными способами.
CSS Grid Layout — система двухмерного макета, оптимизированного для дизайна пользовательского интерфейса. Главная идея, лежащая в основе макета сетки, заключается в разделении веб-страницы на столбцы и строки. В образовавшиеся области сетки можно помещать элементы сетки, а управлять их размерами и расположением можно с помощью специальных свойств модуля.
В ходе вебинара были продемонстрированы возможности этих технологий и преимущества их комбинации на практике (в каком случае какую технологию стоит использовать) для создания адаптивных страниц.
Создание игры Тетрис на JavaScript | Часть 1, 2, 3
Автор — Ростислав Силивейстр, FrontEnd Developer.
Отличный вебинар, который подойдет даже тем, кто имеет нулевой уровень знаний языка JavaScript. Обучение программированию путем реализации культовой игры Тетрис — это тот самый случай, когда вы совмещаете приятное с полезным, а результаты могут с гордостью быть презентованы своим знакомым, друзьям и родственникам.
Каждая часть вебинара затрагивает определенные автором темы:
Первая часть включает в себя постановку задачи, ознакомление с правилами игры, реализацию поля, падения и перемещения фигур в стороны.
Вторая часть ориентирована на реализацию вращения фигур, ускорение их падения, исчезновение заполненных рядов, начисление очков, перехода на следующий уровень, а также базовые игровые опции (старт, пауза, начать заново, game over).
Третья часть заключительная — происходит тестирование и исправление недочетов, оптимизация кода и подведение итогов.
После старательного изучения всех трёх частей вебинара и упорной практики вы научитесь:
разбираться в структурах, типах данных, функциях JavaScript;
работе с DOM в JavaScript;
работе со средствами HTML/CSS для расположения элементов на странице;
систематическому подходу к решению задач, не упуская деталей;
пониманию логики создания игр;
пониманию основ алгоритмов.
Memory Game на JavaScript за 2 часа
Автор — Ярослав Вовченко, FrontEnd Developer.
Чтобы начать писать на JavaScript, не обязательно сразу углубляться в изучение документации. На примере написания простой Memory Game вы узнаете, как выбирать элементы в DOM, проходиться по спискам и массивам, добавлять, убирать элементы и слушатели действий.
На вебинаре вы вместе с автором погрузитесь в практическую разработку на JavaScript. Для этого необходимо иметь базовые знания HTML, CSS и JavaScript.
Вебинар организован следующим образом:
Создание структуры проекта, написание первых файлов.
Разметка и стилизация игрового поля с помощью HTML и CSS.
Основы работы с перспективой в CSS.
Сохранение и сравнение выбранных карточек.
Написание дополнительного функционала.
Итоги, вопросы и ответы.
Данный вебинар будет интересен тем, кто хочет изучить основы JavaScript в легкой и доступной форме без многочасового чтения документации.
5. Объектно-ориентированное программирование в JavaScript | ООП в JavaScript
Автор — Георгий Клюковкин, Lead Software Engineer.
Это видео поможет вам понять, в чем отличие ООП подхода к разработке в мультипарадигменном языке JavaScript от ООП подхода в классических объектно-ориентированных языках, как, например, Java. Вы узнаете, какими плюсами и минусами обладает ООП в JavaScript, а также, какие правила ООП мы можем в нём применять.
Автор затрагивает следующие темы:
Главные принципы ООП.
Наследование vs Композиция.
Объектно-прототипное наследование в JS.
Функции-конструкторы и классы.
Single responsibility principle.
Вебинар будет полезен начинающим JavaScript разработчикам, либо тем, кто работает в другом направлении и при этом желает разобраться в особенностях ООП на JavaScript.
6. Пять обязательных алгоритмов для JavaScript разработчика.
Автор — Тысячный Влад, Middle React.js / React Native Developer.
Если Вы начинающий JavaScript разработчик и хотите разобраться в том, насколько глубоко нужно вникать в изучение алгоритмов и структур данных, как часто и какие алгоритмы нужно будет использовать в работе, хотите понять, как от правильного выбора алгоритма зависит скорость работы сайта, а также узнать, как оптимальность алгоритма влияет на скорость загрузки информации на сайте — тогда этот вебинар для Вас.
В нем рассматриваются следующие темы:
Что такое алгоритмы и структуры данных.
Как правильно считать сложность алгоритма.
Нужно ли знать все алгоритмы и как это влияет на ваш кошелёк (примеры из реальной жизни).
5 самых важных алгоритмов.
Практика написания алгоритмов сортировок.
Ответы на вопросы.
7. Подготовка к собеседованию по JavaScript в 2021.
Автор — Дмитрий Моисеев, Software Engineer at EPAM Systems.
В вебинаре затрагиваются основные вопросы на собеседовании по JavaScript, которые вызывают больше всего непонимания, особенно у тех, кто перешел с другого языка программирования, а также у тех, кто не знаком с его “сложными” частями, такими как замыкания, прототипное наследование и особенности асинхронного выполнения кода.
Автор затрагивает следующие темы:
Типы данных и их преобразования.
Области видимости и замыкания.
Прототипное наследование.
Асинхронное выполнение кода.
Ответы на вопросы участников вебинара.
Данный вебинар будет интересен тем, кто планирует проходить собеседование на позицию FrontEnd разработчика на уровень Junior или Middle Developer. Начинающим он не подойдет, так как в вебинаре не будут рассматриваться основы языка, а лишь его “острые углы”.
8. React и Redux на примере реального приложения.
Автор — Александр Краковский, Software Engineer at EPAM.
Данный вебинар поможет вам на реальном примере разобрать, как взаимодействуют и работают современные инструменты разработки — React и Redux. Вы сможете написать свое приложение, которое будет работать с реальным API.
В ходе реализации программы будут выполнены следующие пункты:
Установка зависимостей, настройка проекта;
Создание базовых компонентов и подключение Redux;
Настройка зависимостей для работы с запросами к серверу;
Создание запросов и обработка данных через Redux;
Запуск приложения, исправление возникших ошибок;
Анализ проделанной работы.
9. Создание первого проекта на Angular
Автор — Генрих Коваленко, FrontEnd Developer.
В этом вебинаре вы познакомитесь со структурой и компонентами фреймворка Angular, а также создадите первый проект с использованием Angular CLI.
На вебинаре рассматриваются следующие темы:
Что такое Angular и в чем его отличие от других популярных фреймворков и библиотек.
Angular CLI, его установка и использование в создании первого проекта.
В чем назначение компонентов и как их применить для удобства поддержки кода в дальнейшем.
Сервисы в Angular.
Модули.
Пайпы и их применение создание своих пайп.
Директивы *ngFor и *ngIf
Итоги. Вопросы ответы.
Данный вебинар будет интересен тем, кто владеет языком JavaScript на базовом уровне и при этом хочет познакомиться с Angular для последующей работы с данным фреймворком.
10. Как стать React разработчиком
Автор — Олег Мельничук, Full Stack JS Developer.
React — библиотека JavaScript, которая уверенно держит позиции в мире веб-разработки на ряду с самыми востребованными фреймворками. На вебинаре затрагивается история возникновения React.js, после чего идет его сравнение с другими популярными веб-технологиями.
Автор рассказывает, почему React — это хороший выбор для входа во FrontEnd. Вы узнаете, насколько нужен чистый JS и можно ли сразу учить React. Будет детально разобран Roadmap React разработчика: что можно пропустить на первых этапах, что лучше изучить детально, а на что не стоит тратить силы. Также, автор предоставляет перечень знаний и навыков, с которыми можно найти первую работу в качестве React Developer`a.
Будет затронут вопрос дальнейшего развития — как с Frontend разработчика на React можно стать Full Stack или Mobile разработчиком.
Данный вебинар будет интересен начинающим Frontend разработчикам, а также веб-разработчикам, которые планируют перейти на React или изучить его в качестве дополнительной технологии.
Изучайте FrontEnd разработку на ITVDN!
10 крутых англоязычных подкастов для программистов
Автор: EnglishDom
80% всей информации в интернете, которая хоть немного касается программирования, написана на английском. И самые свежие новости и тренды всегда сначала выходят на английском, а уже потом переводятся на остальные языки.
Хотите всегда быть в курсе? Онлайн-школа английского языка EnglishDom собрала для вас топ-10 англоязычных подкастов для программистов. Максимум полезной информации, интересные темы и обсуждение нюансов и секретов, о которых многие не знают.
Итак, не будем долго рассусоливать. Поехали!
Code Newbie
Частота публикаций: 1 эпизод в неделю
Запущен в 2014 году
Требуемый уровень английского: advanced
Замечательный подкаст для тех, кто интересуется программированием, но не знает, с чего начать. В этом подкасте большое количество интервью с различными известными программистами и их историями успеха. Подкаст больше общеобразовательный, чем узконаправленный. Его будет интересно послушать и тем, кто просто интересуется, но не собирается заниматься программированием профессионально.
Каждый эпизод знакомит новичка с разными особенностями разработки и анализа данных. Здесь вы найдете огромное количество советов, которые помогут определиться со сферами дальнейшего изучения языков программирования.
Правда, английский здесь довольно сложный. Интервью дают носители языка, которые говорят быстро и не всегда внятно. Так что придется напрячься, чтобы понять абсолютно все.
Software Engineering Daily
Частота публикаций: 1 эпизод в день
Запущен в 2015 году
Требуемый уровень английского: intermediate
Просто must have для разработчиков программного обеспечения. Здесь просто огромное количество полезной информации как для новичков, так и для Senior-разработчиков.
В среднем подкасты длятся полчаса-час и очень детально раскрывают один или несколько нюансов разработки. Кроме подкастов на сайте есть большое количество специализированных статей.
Английский у лекторов почти сценический. Фразы проговариваются очень четко, темп вполне нормальный. Есть, конечно, большое количество специфической лексики, но даже для Junior’ов все вполне понятно.
Talk Python To Me
Частота публикаций: 1 эпизод в неделю
Запущен в 2015 году
Требуемый уровень английского: upper-intermediate
Если вы изучаете Python, то этот подкаст снабдит вас огромным количеством полезной информации.
Здесь вы узнаете, как правильно изучать Python, чтобы не упустить ничего важного, как использовать все нюансы архитектуры. Это огромная база знаний с более чем 260 часами записей на тему Python. Особенно рекомендуем подкаст разработчикам с уровнем Middle.
По лексике английского никаких сложностей, но нужно привыкнуть к речи лекторов. Они говорят довольно бегло, так что здесь потребуется высокий навык восприятия речи на слух.
The Cynical Developer
Частота публикаций: 2 эпизода в месяц
Запущен в 2016 году
Требуемый уровень английского: advanced
«Циничный разработчик» — это отличный подкаст, где о разработке рассказывают с юмором и иронией.
Он будет полезен не только кодерам, но также менеджерам проектов и тимлидам. Очень много информации о комплексном процессе разработки, ведению проектов, работе в команде. Также авторы рассказывают о популярных тенденциях и трендах в разработке.
Что касается английского, то здесь очень беглый язык. Некоторые слова и фразы произносятся слитно, редуцируются отдельные звуки, темп речи очень высокий. Полезной информации просто куча, но чтобы ее получить, нужен уровень английского не ниже advanced.
Coding Blocks
Частота публикаций: 2 эпизода в месяц
Запущен в 2013 году
Требуемый уровень английского: intermediate-advanced
Еще один хороший подкаст для разработчиков ПО. Широченный архив полезных материалов буквально по всем темам: от анализа big data до всех тонкостей разработки приложений на iOS и Android.
Также есть подкасты на темы личной эффективности программиста, обзоры полезных каналов, конференций и материалов для обучения. Очень удобная система тегов, по которой можно найти все эпизоды на интересующую вас тему.
Английский здесь несложный, но все зависит от конкретного лектора. Одни говорят предельно понятно, а другие — бегло и смазано. Поэтому нужно смотреть по каждому конкретному эпизоду.
Front End Happy Hour
Частота публикаций: 3 эпизода в месяц
Запущен в 2016 году
Требуемый уровень английского: intermediate
А вот и полезности для фронтенд-разработчиков подъехали. Авторы обсуждают новые инструменты, полезные для верстальщика, делятся новыми библиотеками, рассматривают распространенные проблемы и их решения.
Тонны информации для веб-разработчиков. Кстати, недавно они отпраздновали свой 100-й выпуск, с чем их и поздравляем.
Речь авторов довольно быстрая, но у них очень четкая артикуляция, поэтому в целом подкаст воспринимается очень хорошо.
Test and Code
Частота публикаций: 1 эпизод в неделю
Запущен в 2015 году
Требуемый уровень английского: upper-intermediate
Авторы цепляют большое количество тем, среди которых тестирование, разработка программного обеспечения, программирование на Python и много связанных вопросов и проблем. Базы данных, автоматизация, постоянная интеграция, пирамида тестирования, TDD — и это только небольшая часть информации, которую вы сможете получить.
Очень годный подкаст, который особенно хорошо зайдет Python-разработчикам. Но иногда бывает ужасный звук, который жутко мешает восприятию. Лексика английского довольно специализирована, поэтому для абсолютных новичков не подойдет.
Learn to Code With Me
Частота публикаций: 2 эпизода в месяц
Запущен в 2016 году
Требуемый уровень английского: intermediate
Еще один подкаст для новичков. Авторы канала реально позаботились о них, потому что здесь собрана уйма действительно полезных материалов для Junior’ов в разных отраслях программирования.
Будет очень полезным для самоучек, которые изучают программирование или веб-дизайн самостоятельно.
Язык подкаста довольно понятный, но самое главное — вместе с каждым выпуском есть ключевые моменты в текстовом формате, которые можно проработать после или прямо во время прослушивания. Так можно ознакомиться с основной лексикой и терминологией.
Fragmented
Частота публикаций: 1 эпизод в день
Запущен в 2015 году
Требуемый уровень английского: intermediate
Отличный подкаст для разработчиков мобильных приложений на Android, в котором обсуждают возможности и особенности самой платформы, ее инструментов, паттернов и практик, с помощью которых можно превратить хорошее приложение в идеальное.
Авторы сами активно занимаются разработкой приложений, поэтому обсуждают только те моменты, которые успели оценить на практике.
Большинство лекторов говорят с акцентом, что усложняет понимание материала. НО лексика вполне понятная и если привыкнуть к акцентам, можно почерпнуть много полезного.
Soft Skills Engineering
Частота публикаций: 1 эпизод в неделю
Запущен в 2016 году
Требуемый уровень английского: intermediate
Этот подкаст больше не про разработку или отдельные инструменты программиста. В нем рассказывают, как развиваться, чтобы быть грамотным специалистом. Тут много полезной информации про методики обучения программированию, организацию времени и рабочего пространства.
Рекомендуем этот подкаст всем разработчикам, вне зависимости от сферы и уровня знаний.
Английский подкаста просто отличный. Несложный, вполне себе понятный и хорошо артикулированный. Так что можно его попробовать понять даже с уровнем pre-intermediate, но лучше все же intermediate.
Конечно, еще есть большое количество полезных подкастов, которые мы здесь не упомянули. Выбирайте, какие нравятся вам больше всего, и слушайте с удовольствием. Учите английский вместе с EnglishDom и пусть код всегда будет идеальным.
Красивый код: почему он так важен?
Автор: Редакция ITVDN
Красивый код — не просто абстрактное понятие, а вполне реально существующая вещь в среде программистов. Научившись писать красивый код, вы значительно сэкономите своё (и чужое) время, а ваши программы станут работать быстрее и стабильнее. Как научиться писать красивый код и каким нюансам стоит уделить внимание — узнаете в этой статье.
Почему так важно писать красивый код?
Код — штука тонкая, в которой эстетика и полезность тесно связаны, как в архитектуре. Полезный, но не эстетично выглядящий код будет трудночитаемым и в результате менее эффективным, чем мог бы быть. Каким образом?
Трудночитаемый код сложно корректировать и тестировать возможные решения, поэтому он отнимает больше времени на корректировку, чем обычный код.
Чистый код создан для людей, поэтому другие программисты, которые будут читать его, будут вам очень благодарны за красивый код.
Благодаря чистому коду поиски одного бага могут сократиться с нескольких часов до нескольких минут, а программа будет работать стабильнее и не выдавать сюрпризов.
Однако овладеть мастерством написания чистого кода с наскока не получится — до момента написания первого элегантного кода, вызывающего восхищение коллег, вы напишите ещё десяток не самых красивых кодов, от которых будут плеваться.
Впрочем, если вы немного измените мышление и овладеете несколькими навыками, то успехи у вас будут значительно лучше, и к написанию красивого кода вы придёте значительно быстрее. Для начала определимся, как вообще научиться писать красивый код, и какие знания нужны для этого, а затем — с навыками, которые необходимо будет развить.
Как научиться писать чистый код?
Прежде чем приступить к написанию красивого кода, запомните два основных принципа, которые вытекают из прошлой части статьи:
Красивый код должен быть легко читаемым и понятным для других программистов.
Красивый код должен работать, а если он не работает — легко фикситься.
Для того, чтобы соответствовал этим требованиям, он должен быть коротким, а функции — линейными. Таким образом, при написании чистого кода вы должны ориентироваться на эти принципы. И постоянно практиковаться: пишите код каждый день, и каждый раз пытайтесь написать наиболее лучший вариант. Со временем у вас начнёт получаться.
Не забудьте почитать книгу Clean Code под авторством Роберта Мартина. Эта книга — настольная библия для программистов, которые стремятся к совершенному коду. На 900 страницах расписано всё, что следует знать программисту, который стремится к чистому коду.
Во время чтения книги можете также зайти на Хабру или другие сайты с полезными для прогеров статьями. Так вы сможете узнать ещё больше о чистом коде и позже закрепить свои знания практикой.
Также вы можете пройти обучение по видео курсам ITVDN. Авторы видео курсов – сертифицированные разработчики. Они помогут вам научиться писать хороший код.
Нужно ли изучать алгоритмы и паттерны?
Изучение алгоритмов — дело ваше, но запоминание паттернов является обязательным для программистов, как изучение таблицы умножения для детей. Без паттернов найти решение типичной проблемы будет трудно, поскольку не будет готового решения.
Впрочем, это не значит, что вы всегда должны использовать паттерны в каждой непонятной ситуации, иногда они не смогут помочь и вам придётся продумывать самостоятельное нестандартное решение, или обращаться за помощью к старшим коллегам. Но само изучение паттернов существенно упростит вам жизнь.
Для желающих начать изучение паттернов рекомендуем великолепный курс Александра Шевчука.
Изучение алгоритмов — чуть более глубокая сторона программирования. Сам алгоритм — это записанные в определённой последовательности команды, которые должны решить стоящую перед ними задачу. Если вы решили взяться за их изучение, то вам нужно не только знать сами алгоритмы, но и уметь их выводить, иначе от знаний не будет толку.
Если вы решили изучать алгоритмы, то рекомендуем обратиться к школьному курсу информатики и статьям для программистов, где подробно рассказывают об алгоритмах. Если в статье вы встретили упоминания как минимум трёх основных видов алгоритмов (линейный, разветвлённый и циклический) — то вы на верном пути.
Хорошим вариантом для старта будет статья Ворожцова А. В. «Что такое алгоритм?», затем знания можно углубить изучив курс Алгоритмы и структуры данных.
С общими требованиями к красивому коду и необходимыми знаниями определились, теперь перейдём к навыкам.
Какие полезные привычки необходимо завести?
Для написания чистого кода необходимо развить следующие навыки:
1) Уделять внимание форматированию кода и стараться делать его как можно более линейным. Это сделает код более понятным и элегантным. Не стоит гнаться только за производительностью, если не хотите получить знаменитый «индусский код»:
2) Короткие методы и функции. Чем короче — тем понятнее, чем понятнее — тем лучше. Слишком длинные функции запутают любого программиста и он потратит кучу времени, пытаясь разобраться в функциях.
Запомните золотое правило: одна функция — одно действие.
3) Удобные названия для функций. Это кажется нелепым, но придумать действительно хорошее название для функции — та ещё задачка, по сложности сравнимая с придумыванием имени для вашего персонажа в MMORPG. Совет, который может помочь, — при наименовании классов используйте существительные, а для методов используйте глаголы. Это сильно упростит понимание кода. Для примера можете взглянуть на два кода ниже и сказать, какой из них выглядит более понятно: первый (до переделывания) или второй (после).
До
После
Как видно на примере, в первом варианте код не так плох, но из-за непонятных названий труден для понимания. Во втором варианте он разбит на более мелкие блоки, а правильно придуманные названия («sendTOmAILsERVER, Client, Message) помогают понять его с первого взгляда.
4) Грамотная обработка ошибок. Даже если вы по каким-либо причинам не можете написать короткие функции и красивый код, вы всё ещё можете исправить ошибки. Ни одна программа не застрахована от сбоев, поэтому создать идеально работающую прогу не получится. Однако вы можете воспользоваться методом try-catch-finally.
Сущность этого метода заключается в эдакой «страховке» от ошибок. При использовании этого метода, вы должны будете создать 3 блока: try, catch и finally. Затем, при запуске команды, она будет выполняться в блоке Try.
Если что-то пойдёт не так, то она попадёт в блок catch, где вы сможете поймать ошибку и исправить её. Если же ошибки не было, или вы её исправили, то команда продолжит выполнение в блоке Finally, где и будет завершена.
Такой метод является универсальным для поиска и исправления ошибок и его может написать даже джун. Это, кстати, будет лучше и элегантнее, чем грузить код лишними функциями и превращать его в лапшу.
Написание красивого кода — дело непростое и требующее практики, но освоив эту методику, вы станете ещё на один шаг ближе к совершенству и завоюете больше уважения от коллег, а также сможете считаться уже более опытным программистом.
Если вы хотите овладеть искусством написания красивого кода, изучайте программирование на ITVDN. Опытные наставники разложат всё по полочкам и после окончания обучения вы научитесь писать красивый чистый код. При условии конечно, если будете прикладывать и свои усилия.
Обзор элементов в HTML5
Автор: Редакция ITVDN
Введение
HTML5 – последняя версия языка разметки. У HTML5 есть семантическая структура. В пятой версии языка ввели определенные средства для управления – они дают возможность сэкономить Ваше время при разработке веб-сайтов. В этой статье мы рассмотрим упомянутые средства управления, а также функции в HTML5.
Прежде чем начать, необходимо установить Visual Studio.
Мы можем включить опцию HTML в целевом разделе:
Tools -> Options -> Text Editor -> HTML.
Разметка HTML5
Объявление DOCTYPE:
<!DOCTYPE html>
Объявление кодировки символов:
<meta charset="utf-8" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sibeesh Passion wish you a happy new yeartitle>
head>
<body>
Welcome to Sibeesh Passion
body>
html>
Структура HTML5
Как уже говорилось, у HTML5 есть семантическая структура. Это уменьшает усилия UI-разработчика. На изображении объясняется эта структура.
До применения HTML5:
После:
Исходя из рисунка, понятно, что в HTML5 доступны такие элементы:
Header
Nav
Section
Aside
Article
Footer
Добавление собственных элементов
Вы можете создать собственный элемент, используя стили. Разметка должна выглядеть таким образом:
<!DOCTYPE html>
<html>
<head>
<title>Your own element title>
<script>document.createElement("yourelement")script>
<style>
yourelement {
display: block;
}
style>
head>
<body>
<div>
Normal element
div>
<yourelement>My elementyourelement>
body>
html>
Вы создали новый элемент «yourelement».
Новый синтаксис Атрибута
В HTML5 введен новый синтаксис атрибута:
Empty
Unquoted
Double Quoted
Single Quoted
Можно присвоить текстовое значение тега input type таким образом:
<input type="text" value="Sibeesh" disabled>
<input type="text" value=Sibeesh>
<input type="text" value="Sibeesh">
<input type="text" value=’Sibeesh’>
Примените CSS
Так же, как к обычным элементам HTML, так и к новым семантическим элементам можно применять стили.
footer{border:1px solid;}
Предыдущий стиль будет применен ко всем footer, доступным на странице. Не рекомендуется использовать верхний регистр (Footer, FOOTER) в названии элементов.
Обзор элемента Canvas
Если Вы хотите создать определённый графический контент, элемент Canvas, то Вам нужно:
Объявление Canvas
<canvas id="canvasExample" width="200" height="100"
style="border:1px solid #ccc;">
Bad Luck, It seems your browser won't support :(
canvas>
Реализация Canvas
var c = document.getElementById("canvasExample"); //Get the element
var ctx = c.getContext("2d"); // Get the context for the element
var grd = ctx.createLinearGradient(0, 0, 200, 0); //Create the line
grd.addColorStop(0, "blue"); // Apply the colors
grd.addColorStop(1, "white"); // Apply the colors
ctx.fillStyle = grd; //apply the style
ctx.fillRect(10, 10, 150, 80); // Fill
Здесь мы применили градиент к canvasExample.
Введение в SVG
Масштабируемая векторная графика (Scalable Vector Graphics) – графика для web типа canvas. Одно из различий между canvas и SVG то, что SVG поддерживает обработчик событий, а элементы canvas – нет.
Объявление SVG
<canvas id="canvasExample" width="200" height="100"
style="border:1px solid #ccc;">
Bad Luck, It seems your browser won't support :(
canvas>
Полный вариант HTML-документа:
<!DOCTYPE html>
<html>
<body>
<table style="border:1px solid #ccc;">
<tr style="border:1px solid #ccc;">
<td style="border:1px solid #ccc;">
<h2 style="text-align:center;">Canvash2>
<canvas id="canvasExample" width="200" height="100"
style="border:1px solid #ccc;">
Bad Luck, It seems your browser won't support :(
canvas>
td>
<td style="border:1px solid #ccc;">
<h2 style="text-align:center;">SVGh2>
<svg width="200" height="200">
<circle cx="100" cy="100" r="50"
stroke="green" stroke-width="4" fill="yellow" />
Bad Luck, It seems your browser won't support :(
svg>
td>
tr>
table>
<script>
var c = document.getElementById("canvasExample"); //Get the element
var cctx = c.getContext("2d"); // Get the context for the element
var grd = ctx.createLinearGradient(0, 0, 200, 0); //Create the line
grd.addColorStop(0, "blue"); // Apply the colors
grd.addColorStop(1, "white"); // Apply the colors
ctx.fillStyle = grd; //apply the style
ctx.fillRect(10, 10, 150, 80); // Fill
script>
body>
html>
Источник: http://www.c-sharpcorner.com/UploadFile/65794e/html-5-elements-in-a-look-part-1/
http://www.c-sharpcorner.com/UploadFile/65794e/html-5-elements-in-a-look-part-2/
Что такое паттерны проектирования в программировании
Автор: Влад Сверчков
Что такое паттерн (шаблон) проектирования.
Когда используют шаблоны.
Какими бывают паттерны проектирования.
Порождающие.
Структурные.
Паттерны поведения.
Как выбрать шаблон?
Выводы.
Начинающие программисты всегда приходят к точке, когда их код превращается в "спагетти". Его трудно читать, он содержит массу повторений, лишних функций, а добавление нового функционала превращается в десятый круг ада.
Одно из лучших средств предотвращения этого – использовать паттерны проектирования (Design Patterns). Является ли это серебряной пулей, какие преимущества и недостатки паттернов существуют, и какие из них необходимо знать разработчикам? Ответы разбираем ниже.
Что такое паттерн (шаблон) проектирования?
Паттерны – это типичные архитектурные решения проблем, которые часто встречаются при разработке ПО. Их другое название – шаблоны, и что интересно – человечество очень часто окружает себя шаблонами в повседневной жизни:
одинаковые гнезда розетки и формы вилок в помещениях – универсальное решение для электропитания;
вилки и ложки – инструменты потребления почти любой пищи;
чашки – емкости для размещения любой жидкости и так далее.
Человек всегда стремится упростить традиционную деятельность, и это не могло обойти стороной программирование.
Идеи создания универсальных правил для качественной разработки существовали ещё до 90-х годов прошлого века, но действительно прорывной стала работа "Design Patterns: Elements of Reusable Object-Oriented Software" (1994) авторства Эриха Гамма, Ричарда Хелма, Ральфа Джонсона и Джона Влиссидеса, которые именуют себя как "Банда четырех" (Gang of Four, GoF).
В книге описано 23 паттерна и их применение в объектно-ориентированном дизайне. Этот труд стал фундаментальным и теперь паттерны gof составляют костяк многих обсуждений качественного кода.
Когда используют паттерны
В разработке шаблоны используют при необходимости приведения кода к следующим критериям:
Читабельность – другие разработчики должны без труда понимать написанное.
Масштабируемость – легкость в создании нового функционала.
Поддерживаемость – обновление кодовой базы должно проходить как можно более плавно.
Также они способны повысить скорость и производительность разработчика – паттерны это действительно обеспечивают. Они хорошо справляются и со следующими задачами:
уменьшение количества потенциальных ошибок и узких мест;
упрощение рефакторинга;
уменьшение технического долга;
улучшение коммуникации девелоперов с другими программистами, проектными менеджерами, владельцами и т. д.
Необходимость использовать шаблоны проектирования растет вместе с увеличением кодовой базы, особенно при коммерческой разработке – когда создаваемое ПО должно приносить прибыль.
Важно помнить, что использование паттернов иногда вовсе неуместно. Оно может значительно усложнить читабельность, громоздкость и масштабируемость кода. Например, несложный функционал, который нечасто используется и занимает немного места в коде, не требует pattern-вмешательства. А вот репетативный код, решающий классические задачи (сортировка, перебор данных и т. д.) – идеальный претендент на применение шаблона.
Чтобы не ошибиться сначала выясните контекст вашей проблемы, а уже потом выбирайте паттерны программирования, которые лучше всего удовлетворяют требованиям.
Какими бывают паттерны проектирования
В своей книге GoF выделяют три больших семейства:
Семейство
Краткое описание
Порождающие паттерны или Creational Patterns
Предоставляют лучшие способы
создания объектов. Они абстрагируются
от процесса конкретизации и
делают вашу систему независимой
от создания, компоновки и представления
ее объектов.
Популярные примеры: "Абстрактная фабрика" (Abstract Factory), "Одиночка" (Singleton), "Прототип" (Prototype), "Фабричный метод" (Factory Method).
Структурные паттерны или Structural Patterns
Фокусируются на композиции объекта. Помогают убедиться в том, что изменение части системы не повлечет за собой необходимость изменений в других ее составляющих.
Популярные примеры: "Прокси" (Proxy), "Адаптер" (Adapter), "Компоновщик" (Composite), "Фасад" (Facade).
Паттерны поведения или Behavioral Patterns
Зона ответственности – алгоритмы и обмен информацией между объектами.
Популярные примеры: "Посетитель" (Visitor), "Итератор" (Iterator), "Цепочка обязанностей" (Chain of Responsibility), "Стратегия" (Strategy).
Рассмотрим более подробно некоторые из них.
Порождающие
Порождающие паттерны – это надежные помощники в создании объектов таким образом, чтобы в будущем с ними было максимально легко работать.
Дадим краткое описание некоторых шаблонов:
Паттерн Одиночка / Синглтон обеспечивает наличие только одного экземпляра класса с глобальной точкой доступа. Singleton распространен в задачах конфигураций или логирования в приложениях, где нужен единый контролируемый доступ.
Шаблон Прототип позволяет создавать новые объекты путем копирования существующих экземпляров. Используется Prototype в ситуациях, когда создание объекта слишком дорого, например, при клонировании сложных или ресурсоемких объектов.
Фабричный метод определяет интерфейс для создания объектов, но позволяет подклассам самостоятельно определять тип создаваемых объектов. Fabric Method полезен во многофункциональных приложениях, где классы должны иметь возможность выбирать тип объектов, например, при работе с различными форматами документов, системами онлайн платежей и т. д.
Абстрактная фабрика определяет интерфейс для создания семейств связанных объектов без указания их конкретных классов. Используют Abstract Factory для создания различных компонентов пользовательского интерфейса, которые должны работать вместе и обеспечивать единый стиль (светлая/темная тема веб-сайта и т. д.).
Рассмотрим пример на паттерне Singleton. Представьте себе простое приложение – музыкальный плеер. Он позволяет пользователям воспроизводить музыкальные файлы. Однако одновременно должен работать только один экземпляр плеера – возможность открытия нескольких одновременно надо пресечь. Этого можно достичь с помощью шаблона Singleton.
Простой пример кода на языке C#:
public class MusicPlayer
{
private static MusicPlayer _instance;
private MusicPlayer()
{
// Инициализируем музыкальный плеер (например, загружаем плейлисты)
}
public static MusicPlayer Instance
{
get
{
if (_instance == null)
{
_instance = new MusicPlayer();
}
return _instance;
}
}
public void PlaySong(string songPath)
{
// Запустить песню
}
public void PauseSong()
{
// Поставить на паузу
}
public void StopSong()
{
// Остановить воспроизведение
}
}
// Получаем экземпляр MusicPlayer
MusicPlayer player = MusicPlayer.Instance;
// Используем функционал MusicPlayer
player.PlaySong("C:\\Users\\yourUsername\\Music\\mySong.mp3");
player.PauseSong();
player.StopSong();
Каждый раз, когда в разных участках проекта вам нужно будет создавать экземпляр плеера для соответствующего взаимодействия, вы всегда будете работать только с одним и тем же экземпляром, избегая дублирования.
Если вы программируете на языке си шарп, подробно разобрать популярные паттерны проектирования C# с примерами вы можете по ссылке.
Структурные
Из краткого описания в таблице легко сделать вывод, что структурные паттерны позволяют сформировать надежную, масштабируемую и поддерживаемую архитектуру проекта. Краткое знакомство:
Прокси обеспечивает объект-посредник для контроля доступа к другому объекту. Обычно шаблон Proxy используют для реализации "ленивой" загрузки, когда объект создается или инициализируется только при обращении к нему (например, загрузка картинок с высоким разрешением).
Адаптер позволяет объектам с несовместимыми интерфейсами работать вместе. Применяется паттерн Adapter для интеграции новых компонентов в существующую систему без изменения ее кода. Подходит для использования новой библиотеки в старом приложении.
Компоновщик используется для иерархической компоновки объектов для дальнейшей работы с ними как с единым объектом. Используется для создания древовидных структур, таких как файловые системы или GUI, где каждый узел может быть как простым, так и Composite объектом.
Фасад (Facade) предоставляет упрощенный интерфейс для взаимодействия со сложной системой или набором классов. Он уменьшает сложность работы с подсистемами и предоставляет пользователям единый входной интерфейс для выполнения рутинных операций.
Изучить именно структурные паттерны проектирования C# (с примерами) вы можете по ссылке.
Поведенческие
Паттерны поведения в первую очередь определяют связи между объектами и то, как они осуществляют обмен информацией. Например:
Паттерн Посетитель (Visitor) позволяет добавлять новые операции к объектам без изменения их оригинальных классов. Используется для взаимодействия с объектами со сложной структурой, когда внесение дополнительной логики в оригинальные классы неоправданно усложняет код.
Итератор / Iterator предоставляет удобный механизм последовательного и простого доступа к элементам коллекции, несмотря на сложность ее построения. Данный паттерн поведения популярен при обходе элементов контейнеров, например списков или массивов – он предоставляет универсальный интерфейс для различных типов коллекций.
Цепочка обязанностей или же паттерн Chain of Responsibility позволяет передавать запрос цепочкой обработчиков, пока один из них не обработает запрос. Незаменим при обработке запросов на сервере, где каждый обработчик может передать запрос следующему обработчику в цепочке: проверка при авторизации на сайте, обработка событий в GUI и тому подобное.
Для входа в паттерны проектирования книга от Gang of Four будет хорошей точкой отсчета. Вы познакомитесь с классикой и академическим раскрытием темы, используя паттерны gof. Если же вы хотите обогатить свои знания шаблонов, но предпочитаете язык Java, рекомендуем видео курс "Паттерны проектирования Java".
Как выбрать паттерн?
Сначала вы должны проанализировать задачу – для большей понятности выполните ее декомпозицию, разбив на несколько составляющих. При этом используйте системный подход: просчитайте, как ваше решение повлияет на весь проект, какие элементы оно затронет сейчас, и какое влияние оно окажет на добавление нового кода.
Если вы уже работаете в IT-компании, ваши коллеги, тимлид или архитектор могут подсказать вам целесообразность использования того или иного паттерна, раскрыть нюансы уже существующей архитектуры, кодового стиля и многое другое.
Только после тщательного анализа можно переходить к подбору шаблона, учитывая все преимущества и недостатки. Кстати, в этих задачах хорошими помощниками будут бесплатные AI-ассистенты вроде ChatGPT, Gemini и др.
Также не забывайте об использовании других методик улучшения кодовой читабельности, масштабирования и чистоты:
SOLID принципы – они регламентируют 5 основных принципов создания структурированного, качественного кода. Недавно мы проводили вебинар, на котором разбирали каждый принцип в деталях, приглашаем к просмотру! А если вас интересует прикладной характер SOLID принципов на Java, можете пройти данный видео курс.
GRASP (General Responsibility Assignment Software Patterns) – паттерны для объектно-ориентированного проектирования. Они не имеют выраженной структуры и носят более абстрактный характер, чем паттерны gof.
DRY (Don't Repeat Yourself) – главная идея данного принципа заключается в создании кода, который не будет иметь дубликаций в проекте.
KISS (Keep It Simple, Stupid) – регламентирует написание как можно более простого кода, чтобы его можно было легко читать и понимать.
Рефакторинг – возвращение к уже написанному коду с целью его улучшения без изменения функциональности.
Другие техники, зависящие от проектов.
Выводы
Паттерны играют ключевую роль в современной разработке. Они аккумулируют в себе лучшие практики создания кодовой базы таким образом, чтобы достичь максимальной легкости и эффективности разработки, особенно на больших проектах.
Конечно, не всегда их использование уместно – нужно анализировать задачи и продумывать последствия применения того или иного шаблона, чтобы не получить огромный чемодан без ручки.
Развивайте вашу экспертизу в области паттернов – это win-win стратегия. С одной стороны перед работодателями вы предстанете как опытный и высококвалифицированный специалист, а с другой – ваши программные решения будут иметь элегантный характер, легкость в чтении, поддержке и масштабировании.
Используете ли вы паттерны во время разработки? Возможно, только изучаете? Оставляйте в комментариях ваши ответы!
Лучшие видео курсы, статьи и вебинары ITVDN в 2023 году
Автор: Влад Сверчков
Привет, друзья!
Бурный и насыщенный событиями 2023 год уже позади. Многие украиноязычные курсы, статьи и другие активности на ITVDN уже в фазе активного создания, а пока можно взглянуть на всё лучшее, что было опубликовано в прошлом году!
Предлагаем вашему вниманию ТОП-10 видео курсов ITVDN, вебинаров и статей за 2023 год.
Лучшие курсы
В 2023 году мы выпустили целых 30 новых видео курсов на украинском языке по таким направлениям, как FrontEnd, Python, Java, C#/.NET, PHP, Unity/Game разработка, мобильная разработка на Android и т. д.
ТОП-10 лучших новых видео курсов в 2023 (по количеству просмотров):
Python Базовый.
JavaScript Стартовый.
HTML5 & CSS3 Стартовый.
React Базовый.
Python Стартовый.
Docker.
Основы использования Git.
SQL Базовый.
TypeScript.
Основы администрирования Windows Server.
Лучшие вебинары
В 2023 году мы провели 73 вебинара, среди которых были обзоры IT-специальностей, советы по подготовке к собеседованию и получению первой работы в IT, а также практические вебинары по разным языкам программирования и технологиям.
ТОП-10 вебинаров 2023 года по количеству просмотров и “лайков”:
Kotlin – язык Full Stack разработчика. Автор – Григор Артём, инженер-исследователь.
Пишем веб-сайт на Django с помощью ChatGPT. Автор – Лазорик Михаил, Software developer.
Пишем игру Танки 2D на Pygame. Автор – Догонов Дмитрий, Python Developer.
Spring Cloud: интеграция с внешними веб-сервисами на примере Feign Client. Автор – Боговик Максим, консультант по Java стеку технологий.
Математика для программиста (Часть 1 и Часть 2). Автор – Ольга Задорожная, Software Engineer в Meta (Facebook).
Microsoft Azure – что это? Обзор возможностей и примеры использования. Автор – Олег Заревич, DevOps инженер.
Redux vs React Query. Что лучше выбрать для проекта? Автор – Тысячный Влад, Middle React.js / React Native Developer.
Разрабатываем блог на Django с нуля. Автор – Окаль Юрий, Senior BackEnd Developer в TanSoft Canada.
PyCharm с нуля. Лучшая IDE для Python разработки. Автор – Константин Зивенко, BackEnd Developer из Черногории (свитчер в 35+ лет), имеет 3 высших образования и опыт работы на руководящих должностях в крупных компаниях (максимальное количество подчиненных – около 10 000 человек).
Как стать разработчиком после 35 лет. Автор – Валевский Андрей, Java Software Engineer, ментор по Java.
Лучшие статьи
В 2023 году мы опубликовали 8 статей, вот пятерка, которая пользуется наибольшей популярностью среди читателей:
Что должен знать FrontEnd разработчик в 2023 году.
Какой язык программирования следует учить первым.
Как стать тестировщиком, QA, QC в 2023 году? Что нужно знать и уметь, чтобы получить работу в IT-компании?
ТОП-10 телеграм-каналов для поиска работы в IT.
Кто такой DevOps инженер? Обязанности, инструменты и ЗП.
Обогащайте себя знаниями и навыками на ITVDN! Пусть счастье будет вашим верным спутником в новом году!