Результати пошуку за запитом: Видеокурс c
Введення в розробку програм під iOS. Частина 2.
Автор: Volodymyr Bozhek
Здравствуйте дорогие читатели.
В этом уроке мы добавим форму списка товаров на складе. Разберем класс “UITableViewController” и как с ним работать.
Откройте проект Warehouse из предыдущего урока. Необходимо добавить в наш проект две View. На одной будут содержаться все товары, которые есть на складе. На второй форма редактирования товара.
Для реализации View со списком всех товаров мы будем использовать готовый табличный класс контроллера “UITableViewController”. Данный класс уже реализовал все необходимые протоколы внутри себя для уверенной работы табличного контроллера.
Есть и другой вариант, который мы не будем рассматривать в этом уроке, это сделать свой класс “UITableViewController”, унаследовшись от базового класса “UIViewController” и реализовав протоколы “UITableViewDelegate” и “UITableViewDatasource”.
В панели навигатора откройте модуль “Main.storyboard”.
Найдите в библиотеке компонентов, компонент “Table View Controller” и перетяните в пустую область дизайнера рядом с View входа в систему.
В панели навигатора, нажмите правой кнопкой мыши на папке “Warehouse” и в контекстном меню выберите пункт “New File...”. Откроется диалоговое окно добавления новых модулей в проект. Найдите в нем модуль “Swift File”, выделите его и нажмите кнопку “Next”.
Появится диалоговое окно задания названия добавляемого модуля. В поле “Save As” введите “SuppliesViewController.swift”, нажмите кнопку “Create”.
Откройте модуль “SuppliesViewController.swift”, вы увидите в нем только “import Foundation”, это добавление пространства имен на базовую библиотеку классов Swift (аналог в C#, пространство имен “System”).
Удалите эту строку. Добавьте в этот модуль следующий код:
Разберем это код построчно.
На 9 строке, мы подключили пространство имен “UIKit” в нем содержатся классы для взаимодействия с компонентами пользовательского интерфейса в iOS.
На 11 строке, мы объявили класс с именем “SuppliesViewController”, который наследуется от класса “UITableViewController”.
На 12 строке, мы объявили строковый массив с именем “supplies”, в этом массиве содержится статический список товаров (чуть позже мы заменим его на модель).
На 17 строке, мы переопределили метод “viewDidLoad” класса “UITableViewController”, данный метод вызывается когда View начинает загрузку. В этом методе необходимо делать предварительную инициализацию компонентов, какими либо данными.
На 18 строке, мы вызываем базовый метод “viewDidLoad” класса “UITableViewController”, с помощью ключего слова “super” (аналог в C#, ключевое слово “base”).
Начиная с 21 строки и по 33 строку, мы переопределяем поведение базового контроллера “UITableViewController”, для отображения данных в нем. Более конкретно, мы переопределяем реализацию протокола “UITableViewDataSource”.
На 21 строке переопределенный метод “numberOfSections”, возвращает количество секций в нашем табличном представлении. Секции это разделители между сгруппированными наборами ячеек в табличном представлении. У нас будет одна секция.
На 25 строке переопределенный метод “numberOfRowsInSection”, возвращает количество ячеек в секции. Секция у нас одна, поэтому возвращаем количество товаров, которые будут в этой секции.
На 29 строке переопределенный метод “cellForRowAt indexPath”, возвращает представление ячейки таблицы.
На 30 строке мы создаем экземпляр типа “UITableViewCell” с повторно используемым идентификатором “сell”, первый параметр в инициализаторе это стиль ячейки, второй параметр это идентификатор этой ячейки в табличном представлении. Данный метод вызывается столько раз, сколько ячеек мы добавляем в нашу таблицу. Каждый вызов данного метода содержит в аргументе “indexPath” текущую позицию ячейки относительно таблицы.
На 31 строке мы обращаемся к компоненту “Label”, расположенному внутри ячейки, чтобы задать текст, для этого используем свойство “textLabel”, затем от этого свойства уже обращаемся к свойству “text”, чтобы задать текст компонента “Label”. Текст мы извлекаем из массива товаров “supplies” через subscript (по индексу). Чтобы получить текущий номер строки, необходимо обратиться к аргументу “indexPath” и обратиться к свойству “row”.
На 32 строке мы возвращаем созданную ячейку. Эта ячейка затем внутренними механизмами будет добавлена в табличное представление.
Откройте модуль “Main.storyboard”, выделите добавленный ранее “Table View Controller”.
В панели свойств, откройте вкладку “Show the identity inspector”, найдите поле “Class”, введите значение “SuppliesViewController”. Через это свойство мы подвязываем класс контроллера “SuppliesViewController” к нашему табличному представлению в дизайнере.
Найдите свойство “Storyboard ID”, задайте значение в нем “SuppliesViewController”. Данное свойство содержит уникальный идентификатор представления, этот идентификатор будет позднее использоваться нами при поиске табличного представления программно в экземпляре “Storyboard”.
Теперь нам необходимо добавить в обработчик события на нажатие кнопки “Вход”, переход на табличное представление.
Откройте модуль “ViewController”. Добавьте код в метод “loginButtonTapped”, как показано ниже (смотреть выделенный код):
Разберем добавленный код:
На 23 строке, правым операндом мы обращаемся к свойству “storyboard” контроллера “ViewController”, в этом свойстве содержится экземпляр модуля “Main.storyboard”. Вызов метода “instantiateViewController” производит поиск представления по идентификатору “Storyboard ID”, которое мы задавали ранее, в модуле “Main.Storyboard” и возвращает базовый класс контроллера “UIViewController”.
Класс “UITableViewController” наследуется от класса “UIViewController”, соответственно допустимо приведение данного экземпляра к классу “UITableViewController”.
Класс “SuppliesViewController“ наследуется от класса “UITableViewController”. Соответственно мы приводим полученный экземпляр в правом операнде к типу “SuppliesViewController” и присваиваем его левому операнду c именем “controller”.
Левый операнд объявлен константой, поскольку он не будет в дальнейшем проходить переинициализацию.
На 24 строке, мы обращаемся к свойству “navigationController”, в данном свойстве содержится экземпляр класса “UINavigationController” (сейчас он не инициализирован и содержит значение “nil”). Затем от экземпляра этого свойства мы вызываем метод “pushViewController”. Данный метод принимает два аргумента, экземпляр контроллера, который надо отобразить и флаг использовать анимацию при отображении контроллера или нет.
Если вы сейчас запустите приложение, заполните поля “Имя пользователя” и “Пароль пользователя” и нажмете кнопку “Вход”, вы получите ошибку, так как текущее представление не содержит экземпляра “UINavigationController”.
Давайте это исправим.
Откройте модуль “Main.storyboard”. Выделите в дизайнере представление “ViewController”, затем в меню Xcode выберите “Editor -> Embed In -> Navigation Controller”. После этого действия в дизайнер Storyboard добавится представление “Navigation Controller” привязанное к представлению “ViewController”.
Данное представление инициализирует свойство “navigationController” класса “ViewController”, данное свойство имеет тип доступа только для чтения и не подлежит переинициализации в коде контроллера.
Модуль “Main.storyboard” должен выглядеть так:
Теперь запустите приложение. Заполните поля “Имя пользователя” и “Пароль пользователя”, нажмите кнопку “Вход”. Откроется табличное представление:
Но в нем нас смущает “Top Bar”, который отображается сверху. Его не должно быть видно на странице входа в систему. Чтобы его убрать, откройте модуль “Main.storyboard”, выделите представление “ViewController”, в панели свойств перейдите на вкладку “Show the attributes inspector”.
На этой вкладке найдите свойство “Top Bar” и установите для него значение “None”, в дизайнере “Top Bar” пропал, но вот если вы запустите приложение снова, то он остался на прежнем месте. Чтобы его скрыть, перейдите в модуль “ViewController.swift”. После переопределенного метода “viewDidLoad” вам необходимо переопределить еще два метода класса “UIViewController” это методы “viewWillAppear” и “viewWillDisappear”. Исправьте код в соответствии с кодом ниже:
Разберем построчно внесенные изменения.
На 33 строке мы переопределили метод “viewWillAppear”. Данный метод вызывается когда наше представление уже появилось на экране.
На 34 строке мы вызываем метод “viewWillAppear” из базового класса “UIViewController”, чтобы сохранить его поведение.
На 35 строке мы обращаемся к свойству “navigationController” и вызываем от экземпляра этого свойства метод “setNavigationBarHidden”. Данный метод скрывает или отображает “Top Bar” и принимает два аргумента, первый аргумент указывает скрыть или отобразить “Top Bar”, второй указывает, сделать это с анимацией или без. В этом методе мы скрываем “Top Bar”.
На 38 строке мы переопределяем метод “viewWillDisappear”. Данный метод вызывается когда наше представление перекрывается другим представлением поверх него.
На 39 строке мы вызываем метод “viewWillDisappear” из базового класса “UIViewController”, чтобы сохранить его поведение.
На 40 строке мы обращаемся к свойству “navigationController” и вызываем от экземпляра этого свойства метод “setNavigationBarHidden”. В этом методе мы отображаем “Top Bar”.
Запустите приложение.
Теперь все отображается правильно.
С одной стороны да, с другой нет. После того как мы выполнили переход на табличное представление, в нем в левом верхнем углу отображается кнопка навигации “< Back”, но ведь наше приложение на русском.
Давайте изменим текст этой кнопки на “<- Назад”. Откройте модуль “SuppliesViewController.swift”. После метода “cellForRowAt indexPath”, добавьте следующий код:
Разберем этот код построчно.
На 36 строке мы объявили метод с именем “initNavigationButtons”, который ничего не возвращает и ничего не принимает.
На 37 строке мы вызываем обращаемся в левом операнде к свойству “navigationItem” в котором содержится экземпляр класса “UINavigationItem”. Данное свойство предоставляет доступ к системным кнопкам навигации. От экземпляра свойства “navigationItem” мы обращаемся к свойству “leftBarButtonItem” в котором содержится экземпляр класса “UIBarButtonItem” инициализированный по умолчанию текстом “< Back”.
В правом операнде мы создаем новый экземпляр класса “UIBarButtonItem” и вызываем его инициализатор, который принимает 4 аргумента.
Первый аргумент “title” задает текст кнопки навигации. Чтобы в текст вставить специальный символ Unicode, необходимо в меню среды разработки Xcode выбрать “Edit -> Emoji & Symbols”, затем выбрать подходящий символ и нажать на него.
Второй аргумент “style” принимает перечисление типа “UIBarButtonItemStyle”, в этом аргументе мы задаем значение по умолчанию.
Третий аргумент “target” имеет тип “AnyObject?”, в него мы передаем экземпляр нашего контроллера.
Четвертый аргумент “action” имеет тип “Selector?”, в него мы передаем метод обработчик нажатия на кнопку навигации. Обратите внимание на запись “#selector(SuppliesViewController.backToParent)”, в этой записи с помощью выражения “#selector” создается экземпляр типа “Selector”. В скобках мы указываем путь к методу обработчику события в формате “Класс контроллера . метод”.
На 40 строке мы объявляем метод обработчик события нажатия по кнопке навигации с именем “backToParent”, который не принимает аргументов и ничего не возвращает.
На 41 строке мы обращаемся в правом операнде к свойству “navigationController” и вызывает от экземпляра этого свойства метод “popViewController”. Данный метод скрывает текущее представление и переход на предыдущее представление в иерархии вызова представлений. Принимает один аргумент, который задает стиль открытия предыдущего представления с анимацией или без.
Добавьте в метод “viewDidLoad”, вызов метода “initNavigationButtons” (19 строка).
Запустите приложение. Вы увидите такой результат:
На этом урок подошел к концу.
На следующем уроке, мы создадим модель товара. Добавим кнопку добавления нового товара, добавим форму редактирования товара и зададим поведение в табличном представлении на редактирование/удаление товара. После того, как редактирование товаров будет завершено, можно будет приступать к уроку в котором будут разбираться иконка приложения и папка Assets.
Введення в розробку програм під iOS. Частина 1.
Автор: Volodymyr Bozhek
Здравствуйте, дорогие читатели.
Данный блок будет продолжением темы “Введение в разработку под iOS", которую мы затронули ранее.
В этом уроке мы:
рассмотрим пользовательский интерфейс среды разработки;
сделаем форму авторизации для нашего приложения Warehouse;
научимся добавлять обработчиков событий на элементы управления.
Работу продолжим на примере приложения Warehouse, который мы создавали в первом уроке.
В среде разработки Xcode можем видеть две панели. Левая из них - это панель навигации по составляющим проекта:
Правая делится на панель свойств и панель библиотеки компонентов.
Панель свойств:
Библиотека компонентов:
Также вы можете использовать набор функций в панели инструментов, который находится сверху:
Обратите внимание на кнопки этой панели справа:
Нажимая на них, вы будете скрывать или отображать левую, правую, нижнюю панель в среде разработки.
Левее находится блок функциональных кнопок для отображения данных выбранного модуля:
Кнопка отображения текущего представления модуля.
Кнопка отображения связанного модуля с текущим модулем. Применяется для того, чтобы видеть на одной половине экрана код контроллера, а на другой - дизайнер представления.
Кнопка отображения изменений с момента последней заливки данных в репозиторий. Используется, если ваш проект находится под управлением GIT
Панель снизу - это панель отладки и логирования:
В панели навигации откройте модуль “Main.storyboard”. Обратите внимание на стрелку слева, которая указывает на View. Эту стрелку можно перемещать, зажав ее левой кнопкой мыши.
Отмечу, что при включении в настройках вашей OS X эмуляции двухкнопочной мыши важно понимать, что на тачпаде нет понятия нажатия левой или правой кнопки мыши, есть просто нажатие.
Данная стрелка означает точку входа в наше приложение. Точка входа привязывается только к одной View, и эта View будет отображаться первой при старте нашего приложения. Исключением может быть только модуль конфигурации предварительной заставки “LaunchScreen.storyboard”, тогда сначала будет появляться заставка с презентацией функций приложения, а затем наша View, на которую была привязана точка входа.
Нажмите на View, на панели свойств откройте вкладку “Show the identity inspector”.
В поле “Class” содержится класс контроллера, который привязан к нашему представлению (View).
Рядом с названием класса “ViewController” есть серая иконка со стрелкой вправо, если вы нажмете на нее, то попадете в модуль контроллера “ViewController”.
Вернитесь в модуль “Main.storyboard”.
В свойствах дизайнера внизу выберите устройство “iPhone 6s”:
Перенесите из библиотеки компонентов два элемента управления “Text Field” и один элемент управления “Button” на View. Выделите элемент управления “Text Field” справа и слева от него будут видны квадратики, потяните за правый квадратик и растяните поле на всю ширину экрана. То же самое проделайте со вторым элементом управления “Text Field” и элементом управления “Button”.
У вас должно получится так, как на картинке ниже:
Обратите внимание на кнопки внизу дизайнера:
Это кнопки для отображения панелей свойств элементов управления. На этих панелях задаются выравнивания элементов управления либо относительно View, на котором они расположены, либо относительно других элементов управления, находящихся с ними по соседству. В терминологии Apple они называются ограничениями (Constraints).
Это отдельная и довольно объемная тема для понимания, поэтому пока мы будем пользоваться только одной панелью задания ограничений, более простой для понимания.
Выделите первый элемент управления “Text Field”, затем нажмите на кнопку “Pin” в дизайнере:
Появится диалог ограничений для данного элемента управления:
Выпадающие списки сверху, снизу, слева и справа - это допустимое расстояние элемента управления относительно стен View соответственно.
Нам необходимо задать ограничение, чтобы наш элемент управления остался на том же месте, где он сейчас расположен на View , но при этом, в зависимости от ширины экрана устройства, подстраивался под эту ширину. Чтобы этого добиться, снимите галочку с “Constrain to margin”, отметьте галочкой поле “Height”, чтобы высота элемента управления не менялась. Отметьте линии верхняя, левая и правая. У вас должно получиться вот так:
Заметьте, кнопка “Add 4 Constraints” стала активной. Нажмите на нее.
Теперь проделайте ту же самую операцию для второго элемента управления “Text Field” и элемента управления “Button”. Значения в выпадающих списках не меняйте.
Можно запустить приложение и посмотреть, что получилось.
Остановите приложение.
Откройте модуль “Main.storyboard”. Теперь нам необходимо привести в порядок пользовательский интерфейс и сделать его понятным для пользователя.
Выделите первый элемент управления “Text Field”. В панели свойств откройте вкладку “Show the attributes inspector”, на этой вкладке найдите поле “Placeholder”, введите в это поле текст “Введите имя пользователя”. Свойство Placeholder задает текст, который отображается в поле ввода, когда это поле не заполнено.
Выделите второй элемент управления “Text Field”, в панели свойств, откройте вкладку “Show the attributes inspector”, на этой вкладке найдите поле “Placeholder”, введите в это поле текст “Введите пароль пользователя”. Затем найдите поле “Secure Text Entry” и отметьте его галочкой. Данное свойство будет отображать звездочки вместо текста, вводимого пользователем, используется для полей ввода паролей.
Выделите кнопку “Button”, в панели свойств, откройте вкладку “Show the attributes inspector”, найдите поле без названия с текстом “Button”, удалите этот текст и добавьте текст “Вход”.
Найдите поле “Text Color”, установите цвет текста “White Color”.
Найдите поле “Background”, установите фон кнопки цветом “Blue Color”.
Перетащите из библиотеки компонентов на View под кнопку “Вход” элемент управления “Label”. Растяните его по ширине экрана. Задайте ему такие же ограничения, как мы задавали выше для прошлых элементов управления.
Выделите элемент управления “Label”, в панели свойств, откройте вкладку “Show the attributes inspector”. На этой вкладке найдите поле без названия с текстом “Label”. Удалите из него текст, введите текст “Нет ошибок”.
Найдите поле “Alignment”, задайте выравнивание текста по центру.
Выделите View, в панели свойств, откройте вкладку “Show the attributes inspector”, найдите поле “Background”, установите фон View “Light Green”.
У вас должно получиться следующее:
Теперь необходимо добавить действие на нажатие кнопки “Вход” и объявить переменные для полей ввода и элемента управления “Label”. Для этого в панели инструментов нажмите кнопку “Show the assistant editor”, экран разделится пополам. Если экран вашего компьютера не позволяет нормально видеть дизайнер и модуль контроллера, скройте панель навигатора и панель свойств.
Выделите первый элемент управления “Text Field” в дизайнере, не отводя курсор мыши с этого элемента управления, зажмите кнопку “Ctrl”, нажмите и удерживайте левую кнопку мыши, затем начинайте вести курсор на окно с модулем контроллера, когда курсор окажется между фигурными скобками класса контроллера, отпустите левую кнопку мыши, появится диалоговое окно параметров элемента управления:
В данном окне есть несколько полей.
Давайте их рассмотрим подробнее.
Поле “Connection”, может принимать несколько вариантов значений, в данном уроке нас будут интересовать всего два значения “Outlet” (используется для создания переменной, связанной с элементом управления) и “Action” (используйте для задания обработчика события на какое либо действие элемента управления).
Поле “Name”, сюда вы вводите название вашей переменной, которая будет связана с элементом управления.
Поле “Type”, содержит тип элемента управления (название класса элемента управления), можно ввести другой класс, если вы знаете иерархию наследования элемента управления UITextField.
Поле “Storage”, содержит вид размещения созданной переменной в памяти операционной системы. Может принимать значения “Weak” или “Strong”.
В поле “Name” введите название переменной “userNameTxt” и нажмите кнопку “Connect” или кнопку “Enter” на клавиатуре. В модуле контроллера добавится строчка с названием переменной, которую вы задали.
Обратите внимание на черный шарик, находящийся на одном уровне с этой переменной слева в области нумерации строк. Нажмите на него, и в дизайнере выделится элемент управления, к которому привязана данная переменная.
Вот пример:
Повторите данное действие для остальных элементов управления.
Для второго текстового поля укажите название переменной “passwordTxt”.
Для элемента управления “Label” укажите название переменной “validationLabel”.
Для кнопки выберите в поле “Connection” значение “Action”, у вас добавится еще одно поле “Event”. В данном поле задается событие, на которые вы хотите назначить обработчик в коде контроллера. По умолчанию установлено событие “Touch Up Inside”, оставьте его как есть.
В поле “Type” установлено значение “AnyObject” (Это класс, который может содержать любые типы данных, аналог подобного класса в других языка программирования, например, C# - это класс Object). Измените это значение на тип элемента управления UIButton, поскольку данный объект будет передан в аргументы метода обработчика назначенного события и намного удобнее будет обращаться явно к экземпляру кнопки, чем распаковывать этот экземпляр путем приведения к типу “UIButton” из типа “AnyObject”.
В поле “Name” введите “loginButtonTapped”. У вас должно получиться вот так:
Нажмите кнопку “Connect”. Код контроллера должен выглядеть вот так:
Теперь давайте проверим, работает ли событие нажатия по кнопке “Вход”. Добавьте в метод “loginButtonTapped” следующий код:
Давайте разберем этот код.
На 16 строке идет проверка наличия текста в поле ввода “Имя пользователя”. Ключевое слово “self” означает ссылка на самого себя, в других языках программирования аналог, например, в C# - это ключевое слово “this”.
Из переменной “userNameTxt” мы обращаемся к свойству “text”, данное свойство возвращает текст, который вы ввели в данный элемент управления. Знак вопроса в конце этого свойства ставится, так как это свойство имеет тип String? и может содержать значение “nil” (аналог “null” в C#).
Далее мы обращаемся к свойству “characters” , которое содержит массив символов и от этого массива вызываем свойство “count”, чтобы получить количество символов в строке. Такая запись введена, начиная со Swift 3, доступного с обновлением среды разработки до Xcode 8 версии.
В ранних версиях Swift, например, версии 2.1-2.3 можно было получить длину строки намного короче “self.userNameTxt.text?.length”.
Если поле ввода “Имя пользователя” не заполнено, мы отображаем сообщение валидации “Имя пользователя не задано”.
На 18 строке мы делаем аналогичную проверку для поля “Пароль пользователя”.
На 20 строке мы проверяем, если заполнены оба поля ввода, тогда все хорошо и мы выводим сообщение “Нет ошибок”.
Обратите внимание на запись “(self.userNameTxt.text?.characters.count)!”, скобки и знак восклицания в конце, на самом деле, применяются к свойству “text”, так как оно имеется Nullable тип. Этой записью мы гарантируем компилятору, что в данном свойстве не будет содержаться значение “nil” и данное свойство будет инициализировано.
Теперь запустите приложение и проверьте его работу.
На этом урок подошел к концу.
В следующем уроке мы рассмотрим работу с классами UITableViewController, навигацию между представлениями, понятие делегата, разберем формат и размеры иконки приложения, научимся использовать Assets.
150+ питань з .NET для Junior, Middle та Senior
Автор: Редакция ITVDN
Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 10 ноября 2020 года. Оригинальная версия на украинском языке доступна по ссылке.
На DOU размещено более 450 вакансий для .NET-разработчиков, что свидетельствует о популярности этой технологии. Редакция DOU собрала вопросы, которые .NET-разработчики задают своим коллегам на технических собеседованиях. Готовьтесь на здоровье :)
Вопросы для Junior
Общее
1. Назовите основные принципы ООП.
2. Что такое наследование, инкапсуляция, абстракция, полиморфизм: приведите примеры (желательно из собственного опыта). От какого класса неявно наследуются все классы в .NET? Разрешено ли множественное наследование в C#?
3. Что такое рекурсия?
4. Что такое лямбда-выражение?
5. Что такое параллельное программирование (многопоточность) и его назначение? Какие классы используются?
6. Что такое JSON?
7. Как вы понимаете REST?
8. Расскажите о SPA concept.
9. Какие GoF-паттерны использовали?
10. Какая разница между GET и POST HTTP методами?
11. Какую проблему решает Docker? Каковы его плюсы и минусы?
12. Чем принципиально отличаются unit-тесты от интеграционных тестов?
Обработка исключений
13. Что такое Exception?
14. Для чего служат try, catch, finally? В каком случае может не выполниться блок finally?
15. Что такое call stack? Какие ключевые слова вы знаете?
Платформа .NET
16. Что такое ASP.NET?
17. Какие существуют типы Action filters?
18. Что такое Web Service?
19. Что такое CLR?
20. Что такое сборщик мусора (Garbage Collector) на базовом уровне?
21. Что такое делегат?
22. Отличается ли Delegate от Action?
23. Что такое LINQ и для чего используется? Приведите несколько примеров применения LINQ.
24. Что такое пространство имен (namespace) и зачем это нужно?
Типы данных, коллекции и структуры данных
25. Какие типы данных вы знаете?
26. Какие примитивные типы знаете?
27. Что такое Nullable-тип?
28. Что такое тип значения, а что такое тип ссылки? Что из этого class, а что struct? В каком участке памяти они хранятся?
29. Чем отличаются value от reference type? String - это reference или value?
30.В чем отличие между string builder и string?
31. Что такое дженерики? Какие проблемы они решают?
32. Что такое boxing / unboxing?
33. Что такое Array, List, HashSet, Dictionary? Приведите примеры использования этих структур данных. Какая сложность операций с ними (поиск, вставка, удаление)?
34. Какие знаете коллекции?
35. Что делает оператор yield?
Классы, структуры и интерфейсы
36. Что такое класс?
37. Чем отличается класс от абстрактного класса?
38. Чем отличается абстрактный класс от интерфейса? Для чего нужны интерфейсы и какие задачи они выполняют?
39. Какие вы знаете модификаторы доступа?
40. В чем разница между обычным классом и статическим?
41. В чем разница переопределения метода между ключевыми словами new и override?
42. Какое различие между const и read only?
43. Разница между структурой и классом. Приведите примеры структур.
44. Может ли экземпляр структуры храниться в куче (heap)? Как это сделать?
Асинхронность
45. Что такое асинхронность и чем она отличается от многопоточности?
46. Какие есть ключевые слова для использования асинхронности в коде?
47. Что означают ключевые слова async / await?
Базы данных
48. Разница между реляционными и нереляционными базами, плюсы и минусы использования обоих вариантов.
49. Что такое индексы в RDBMS?
50. Какие типы JOIN существуют в SQL?
Тестирование
51. Для чего нужны unit-тесты?
52. Какие преимущества и недостатки использования unit-тестов?
53. Из каких трех логических блоков состоит unit-тест?
Вопросы для Middle
Общее
54. Вы набираете google.com в браузере. Расскажите как можно подробнее, что происходит в это время на HTTP-уровне?
55. Как работает HTTPS?
56. Как вы понимаете SOLID?
57. Какие протоколы сериализации вы знаете и где они применяются?
58. Что такое в вашем понимании чистая функция? Какие у нее преимущества?
59. Что такое dependency injection и зачем оно нужно?
60. Что такое cohesion и coupling (связанность и связность)?
61. Что такое IaaS, PaaS, SaaS и каковы различия между ними?
62. Какие способы отладки программы вы используете?
63. Какие знаете паттерны? Объясните суть перечисленных.
64. В чем суть паттерна Singleton? Почему его еще называют антипаттерном?
65. Для чего нужен паттерн Strategy?
66. Какие ключевые различия между распределенными системами и монолитными?
67. Какие паттерны проектирования распределенных систем вы знаете?
68. Какие есть принципы работы Message bus? Почему могут возникать дубликаты в очередях?
69. Какие принципы построения идемпотентных сервисов знаете?
70. Расскажите, как работают асинхронные методы? Чем асинхронность отличается от параллелизма?
Платформа .NET
71. Какие исключения нельзя остановить в блоке catch?
72. Какая разница между .NET Standard Class Library и .NET Core Class Library?
73. Объясните разницу между отложенным и немедленным исполнением в LINQ. Приведите примеры.
74. Для чего нужен метод ConfigureServices в Startup.cs?
75. Какая разница между services.AddTransient и services.AddScope в ASP.NET Core?
76. Что такое Kestrel?
77. Опишите ASP.NET MVC request pipeline.
78. Как в ASP.NET WebAPI настроить кэширование ответов на HTTP-запросы?
Управление памятью
79. Что такое куча и стек? Различия, принцип работы.
80. Как работает сборщик мусора?
81. Зачем нам зарезервированное слово using в C#, если в .NET есть автоматическое управление памятью? Как с этим связан disposable-паттерн и зачем такой сложный паттерн для managed и unmanaged ресурсов?
82. Какие особенности работы с Large Object Heap?
Типы данных, коллекции и структуры данных
83. Когда генерируется дженерик-класс конкретного типа - при выполнении программы или во время компиляции?
84. Что такое рефлексия?
85. Расскажите о коллекции LinkedList <T>. Чем она отличается от других коллекций?
86. Что такое индексатор?
87. Что такое immutable object? Какие преимущества дает использование immutable object? Предложите способ реализации его в .NET.
88. Когда использовать StringBuilder, а когда string? Как работает StringBuilder?
89. Что такое балансирование деревьев?
90. Что такое Key-value структуры?
100. Что такое хэш-функция и зачем нужны хэш-таблицы?
101. Какими свойствами должна обладать идеальная хеш-функция?
102. Что такое коллизии и как с ними бороться?
103. В чем заключается сложность CRUD-операций в Dictionary <K, V> в .NET?
104. Где хранятся массивы? Массивы примитивных типов?
105. В чем отличие между массивом (T [ ]) и списком (List <T>)?
106. В чем разница между IList <T> и IEnumerable <T>?
107. Зачем нужны Enumerable, Observable, AsyncEnumerable и какие модели получения данных они реализуют?
108. В чем разница между IEnumerable и IQueryable?
109. Что такое enum flags?
Базы данных
110. Расскажите о нормальных формах в СУБД.
111. Что такое индекс в БД?
112. Когда следует использовать индексы? Преимущества и недостатки.
113. Какие типы индексов существуют? Чем они отличаются?
114. Что такое ACID?
115. Какие вы знаете уровни изоляции транзакций?
116. Что такое план выполнения запроса (execution plan) в MS SQL?
117. Проблема: запрос долго выполняется. Какие есть методы ее диагностики и решения?
118. Как ORM (Entity Framework или Entity Framework Core) транслируют C# код в язык запросов базы данных? Что для этого используется?
Параллелизм
119. Для чего использовать Task.ConfigureAwait?
120. Например, есть веб-сервер, который по HTTP-запросу делает выборку из базы данных. Всего на сервере 16 тредов (threads). Каждый HTTP-request выполняет запрос в базу и ожидает результатов, в этом случае тред блокируется. Можно ли оптимизировать эту работу средствами .NET?
121. Зачем нужен ThreadPool? Опишите механику работы: как поток выделяется и возвращается обратно в ThreadPool.
Вопросы для Senior
Общее
122. Какие ещё практики, кроме ООП, использовали (AOP, FP и т. д.)?
123. Назовите три самые сложные проблемы, которые вам приходилось решать. Как вы это сделали, как пришли к этому решению?
124. Что такое слабосвязанный код? Чем он лучше сильносвязанного кода? Как бы вы достигали более слабой связности кода?
125. Использование статических классов повышает или понижает связность кода?
126. Как можно измерить performance кода? Влияет ли факт замеров на производительность?
127. Для чего используются и как работают multi-stage билды в Docker?
128. Как понять, что какая-то часть кода утилизирует много памяти или долго выполняется? Что может быть ботлнеком в разных случаях? Какие есть способы уменьшения памяти и трафика памяти?
129. Как бы вы реализовали cross-cutting concern (например, логирование, валидация, транзакции)?
130. Расскажите о Rest Maturity Model.
131. Что такое CPU и IO-bound задачи?
132. Что такое маршалинг?
133. Как работает async / await (подробно)? Почему нельзя использовать async void методы?
Платформа .NET
134. Как работает lock? Можно ли использовать структуры внутри выражения lock?
135. Что такое Expression Tree?
136. Как работает сборщик мусора (подробно)? Почему в GC три поколения, а не, скажем, пять, десять или два?
137. Как бы вы организовали трассировки Web API сервисов?
138. Как в .NET Core можно настроить хранение секретов на компьютерах разработчиков и на рабочих средах?
139. Как бы вы организовали процесс CI/CD .NET Core сервисов для их деплоймента в облачную инфраструктуру?
140. Как включить CORS в AspNetCore?
Типы данных, коллекции и структуры данных
141. Как реализованы дженерики?
142. Как создать собственный immutable-тип?
143. Как работает IEnumerable <T> (подробно)?
144. Какой алгоритм использует коллекция STACK?
145. Какие структуры данных вы реализовывали сами для платформы .NET? Расскажите, чем они отличались от стандартных реализаций.
146. Чем отличается интерфейс от абстрактного класса? В каких случаях вы использовали бы и то, и другое?
147. Почему в структуре нет конструктора по умолчанию?
Базы данных
148. Как БД сохраняет данные?
149. Какие типы БД вы знаете?
150. Как и когда БД лучше использовать?
151. Что такое денормализации?
152. Когда и какие уровни изоляции транзакций можно использовать?
153. Как в популярных СУБД реализованы принципы ACID (SQL Server, PostgreSQL и т. д.)?
154. Приходилось ли вам оптимизировать запрос в БД? Если да, то как?
155. Опишите, какие вы знаете потенциальные проблемы, связанные с параллельными запросами к БД.
156. Какую базу данных вы бы использовали для реализации distributed lock механизма? Расскажите детали реализации.
Микросервисы
157. Какую проблему решают микросервисы?
158. Какие есть способы коммуникации микросервисов?
159. Расскажите варианты реализации распределенных транзакций в микросервисах.
160. Что такое circuit breaker?
161. Каким образом вы будете налаживать систему, состоящую из множества микросервисов, если нужно отследить полный путь обработки запроса?
162. Что такое брокеры сообщений? Что такое at-least-once, at-most-once семантика? Есть ли какие-то брокеры, которые гарантируют exactly-once семантику?
163. Как должен работать код клиента брокера в зависимости от выбранной семантики?
164. Какие инструменты для работы с очередями вам известны (как в .NET, так и отдельные продукты), какой инструмент/продукт вы бы выбрали и почему?
MS Azure
165. Какие виды сервисов бывают в Service Fabric?
166. Какие особенности и ограничения Azure Table Storage?
167. Как бороться с проблемой холодного старта в Azure Functions?
168. В чем отличие очередей и топиков в Azure Service Bus?
Практические задания
Junior only
Опишите, как бы вы реализовали калькулятор. Если понадобится добавить поддержку для римской системы счисления, что будете делать?
Напишите программу, чтобы проверить, является ли число простым или нет.
Найдите наименьший элемент в массиве.
Упорядочите структуры папок в файловой системе.
Напишите программу, которая симулирует fizz-buzz.
Расскажите, что делает этот код, и предложите, как его улучшить.
а)
public bool IsArrayEmpty(string[] array)
{
if (array.Length > 0)
return false;
else
return true;
}
б)
protected string GetClass(object url)
{
string result = string.Empty;
if (SiteMap.CurrentNode != null && SiteMap.CurrentNode.Url == url.ToString())
result = "class=\"active\"";
return result;
}
Middle
Напишите программу для тиражирования последовательности Фибоначчи для заданного числа.
Спроектируйте базу данных врачей и пациентов в SQL. Создайте stored procedure или запрос в SQL, который вернет врачей, имеющих больше, чем N пациентов.
Проверьте коллекцию на наличие дубликатов.
Спроектируйте thread-safe класс Singleton в C#.
Надо записать некую сущность в базу данных и отправить событие в брокер сообщений. Как это сделать с минимальным риском потери данных?
Имеются три сервиса. Выполняется HTTP-запрос на первый. Первый должен записать данные во второй, а второй - в третий. Как гарантировать, что данные при такой сложной коммуникации не потеряются? Как предотвратить записи дубликатов данных?
Будет ли работать этот код и почему?
a)
SomeClass myClass = null;
myClass.SomeMethod();
б)
var table = GetTable();
table.Draw();
…
private SomeClass GetTable()
{
using(var table = new SomeClass())
{
table.ID = "www";
table.Width = "95%";
table.Controls.Add(tr);
return table;
}
}
Расскажите, что делает этот код, и предложите, как его улучшить:
а)
Shape shape = GetNextShape();
if(shape is Circle)
Console.WriteLine(((Circle)shape).Radius);
б)
public int Quantity
{
get
{
try
{
return int.Parse(TxtQuantity.Text);
}
catch (Exception)
{
return 0;
}
}
}
Что не так с кодом?
try
{
SomeMethod();
}
catch(Exception e)
{
Log(e.Message);
throw e;
}
Senior
Как бы вы спроектировали FTP-сервер? Web-сервер? Хостинг картинок с разделением прав доступа? Систему, состоящую из front- и back-офисов? Создайте клон любой популярной социальной сети (Instagram, Facebook и т.д.)
Допустим, есть сущность сделки (Bid). И в сделке есть список партнеров, с которыми эта сделка заключается. Сами сделки хранятся в сервисе сделок (bidding service), а партнеры - в своем сервисе (partners service). И когда показывается список сделок, на начальном скрине нужно отразить количество партнеров. Как бы вы спроектировали хранение и изображение этого счетчика?
Задача на знание LINQ: с исходной коллекции данных необходимо получить новую коллекцию по определенным требованиям (например, отсортированную, без дубликатов и т. д.).
Напишите программу, которая проверяет, является ли поле судоку 9×9 правильно заполненным.
Реализуйте свой Select, Where, SelectMany со всеми характеристиками LINQ (отложенное исполнение, одномоментная (eager) проверка входных данных).
С помощью LINQ напишите метод, который вернет такие элементы коллекции, которые делятся на N без остатка, отсортированные от наибольшего значения к наименьшему. Сигнатура метода: List <int> Filter (IEnumerable <int> collection, int n) ;.
Напишите функцию, которая вернет сумму всех четных элементов массива, который передается в функцию (JavaScript).
Выражаем благодарность за подготовку статьи Алексею Краевому, Максиму Шнуренку, Андрею Ткаченку, Владу Медведовскому, Сергею Селецкому, Андрею Губскому, Сергею Мащуренку, Александру Скриннику, Андрею Соболю, Богдану Нановскому, Святославу Аксёнчикову, Ивану Корнелюку, Михаилу Пивоварову, Алексею Дерке, Евгению Гуреву, Михаилу Меркулову, Юрию Воронину.
WebForms чи MVC?
Автор: Редакция ITVDN
Введение
Когда в 2008 году компания Microsoft придумала ASP.NET MVC, у многих возник вопрос: «Зачем нужна ещё одна технология ASP.NET?».
Многие считают, что ASP.NET MVC не обязательно использовать, заменив на Web Forms ASP.NET. Однако, это неправда. Оба имеют свои плюсы и минусы. В статье мы рассмотрим преимущества этих двух технологий – и каждый сможет определиться, какая из них ему ближе. Мы также объясним понятия ASP.NET, ASP.NET Web Forms, MVC, ASP.NET MVC.
Опытным разработчикам в ASP.NET MVC данная статья поможет переосмыслить свои концепции.
Web-технологии
Когда речь идёт о web-технологиях, на ум приходит классический ASP, PHP, JSP, ROR, ASP.NET Web Forms, ASP.NET MVC и другое. Классический ASP - web-технология, созданная корпорацией Microsoft. У классического ASP было два недостатка: слишком большой, неудобный исходный код и ненадёжность. К примеру, у Вас есть текстовые поля и кнопка. Нажав на кнопку, можно проверить данные, хранящиеся на сервере. Успешная проверка означает, что данные хранятся в базе, а в обратном случае выведется определённое сообщение об ошибке. В чём проблема такого сценария? Вам нужно совершить много действий.
Приложение ASP.NET
ASP.NET – приложение Microsoft, его структура построена на всеязыковой среде выполнения для построения динамических веб-сайтов – для создания можно использовать такие языки: C#, VB.NET и другие. ASP.NET поддерживает две модели: Web Forms и ASP.NET MVC.
ASP.NET Web Forms
Корпорация Microsoft первой вывела ASP.NET Web Forms из ASP, таким образом они решили множество проблем путём создания высокого уровня абстрагирования. Web Forms включает в себя postback (постит данные на заданную страницу) и ViewState. И самое интересное в том, что для ASP.NET Web Forms не требуется написания вручную ни единой строчки кода.
ASP.NET 4.0
В ASP.NET 4.0 придумали, как преодолеть некоторые трудности:
появилась возможность отключать и контролировать размер ViewState;
с URL routing можно предоставить собственный URL вместо физического пути;
в ASP.NET 4.0 мы имеем лучший контроль над ID элементов и, таким образом, интеграция с платформой JavaScript стала проще.
Шаблон MVC
MVC – архитектурный шаблон. Многие используют его с Java-технологией. MVC – не новое понятие, созданное Microsoft. Однако, в MVC ASP.NET нужно разобраться. До этого стоит уточнить для себя некоторые определения – в том числе, что такое MVC.
Архитектурный шаблон – то, что решает наш вопрос на суб-системном уровне или на коротком уровне модуля. Речь идет о проблеме, связанной с архитектурой проекта. Это говорит о том, как можно разделить системы, а в частности - почему. Создаются библиотеки классов, компоненты, веб-сервисы, чтобы решить данный вопрос.
MVC – архитектурный шаблон, позволяющий уловить тонкую связь между input-логикой, бизнес-логикой и UI-логикой.
Платформа ASP.NET MVC
ASP.NET MVC – еще одна платформа web-приложений от Microsoft. В ней устранены недостатки, имеющие место в предыдущих, подобного типа платформах. Эта платформа построена на всеязыковой среде выполнения (CLR) и полностью основана на MVC-архитектуре.
Источник: http://www.codeproject.com/Articles/528117/WebForms-vs-MVC#Visual_in_Web
Правила застосування основних тегів HTML5
Автор: Антон Гончаров
Введение
Все мы уже знаем (ну или что-то слышали об) основных правила применения элементов разметки HTML5. Появилось много "плюшек" и “вкусностей” в новой спецификации HTML. Вместе с тем, появились новые элементы разметки. Но не все помнят/знают, как их использовать правильно.
Коротко остановлюсь на главных нововведениях HTML5:
Новые элементы: header, footer, section, article, video, audio, progress, nav, meter, time, aside, canvas;
Новые значения для атрибута type тега ;
Новые атрибуты HTML5 для элементов, такие как: dragable, contenteditable, hidden, contextmenu, data-*, dropzone, role, spellcheck[8] и т.д.;
Атрибуты class, dir, id, lang, style, tabindex, title, существовавшие в HTML4, теперь можно применять ко всем елементам HTML разметки;
Устаревшие элементы HTML страницы, которые частично поддерживаются и не рекомендуются к ипользованию: acronym, applet, basefont, big, center, dir, font, frame, frameset, isindex, noframes, strike, tt, u.
Итак, более детально рассмотрим, как же правильно использовать основные новые теги.
Элемент
Элемент <main>содержит главную информацию вашего сайта. Такие повторяющиеся элементы как логотип, окно поиска, меню навигации не рекомендуется вкладывать в <main>. Также не стоит помещать сам элемент <main> внутрь элементов <article>, <aside>, <header>, <footer> или <nav>.
Элемент
В элемент <article> следует помещать тот контент, который может быть удален без ущерба для всего сайта. К примеру, краткое описание новостей, рекламный баннер, статья, комментарии. Можно вкладывать <article> в <article>, что будет связывать вложенные элементы <article> с родительским.
Элемент
Элемент <header>, как понятно из названия, используется для оглавления отдельного контента или всей страницы. Должен содержать заглавие, дату статьи и т.д.
Элемент
Элемент <footer> служит для предоставления информации об авторе статьи/страницы, ссылки на авторские права и т.д. Обычно является прямым потоком тега <body> (помещается сразу за элемент <body>).
Элемент
Этот элемент содержит информацию об окружающем контенте, дополнительную информацию пользователю. Может содержать такой элемент, как <nav>, сноски, ссылки и т.д.
Элемент
Предназначен для предоставления контактной информации о статье или всей странице. Стоит отметить, что этот элемент часто помещают в
, для размещения ссылок для связи с авторами страницы.
Элемент
Элемент <nsfw> (англ. - Not Safe For Work – небезопасно для отработки) используется для размещения на странице контента сомнительного характера. Часто этот тег используют для размещения порнографии. Чтобы браузер не отображал такой контент, используют CSS код
nsfw {display: none ;}
Элемент
Элемент предназначен для размещения видео контента на странице. Для корректного отображения контента стоит прописать дополнительно атрибуты width, height, src, controls. Ваш код будет выглядеть примерно так:
<video width="840" height="480" src="../video/myVideo.mp4" controls> video>
Если же Вы хотите разместить у себя на странице видео, которое расположено на сайте youtube.com.
Вам стоит зайти на страницу c видео, правой кнопкой мыши нажать на видео, и из выпадающего меню выбрать “Получить код для встраивания”.
Копировать код из “попап” окошка.
В разметке вашего сайта, в нужном вам месте, кликнуть правой кнопкой мыши и выбрать “Вставить”.
У вас получится примерно такой код:
<iframe width="854" height="510" src="https://www.youtube.com/embed/_giinWWrNlQ" frameborder="0" allowfullscreen>iframe>
В свою очередь, элемент > создает область, которая позволяет загружать любой документ в себя.
Элемент
Элемент <audio> позволяет добавить на страницу аудио дорожки.
Также в HTML5:
Реализована возможность добавления на станицу геолокационных карт, а также определения местоположения пользователя в данный момент.
Теперь мы можем рисовать с помощью технологии canvas. А также использовать 3D графику.
Стало возможным просто перетягивать документы и прикреплять к письму.
И еще много новых "плюшек", которые вы можете узнать и научиться их использовать, пройдя наши курсы в учебном центре CyberBionic Systematics.
Всем удачи и хорошего кода)
Нові можливості CSS3
Автор: Редакция ITVDN
Введение
CSS3 произвел революцию в мире веб разработки, поскольку он принес много новых функциональных возможностей. Эта технология продолжает развиваться и внедрять новые возможности. В Новом, 2015 году будут добавляться новые свойства, про некоторые из них мы расскажем в этой статье.
CSS - маски
В Webkit браузерах CSS-маски функционируют уже давно. В ноябре 2014 года была опубликована новая спецификация CSS масок, теперь мы ждем, когда поддержку данного свойства получат все браузеры.
Что такое маска? Проще говоря, маской можно назвать изображение с белой или черной фигурой и прозрачным фоном. Применяя маску на изображение или элемент, мы получим маскированное изображение.
Пример:
Маски можно использовать сейчас, но, к сожалению, только в браузерах Webkit отображение будет корректным.
Использование масок в Webkit
На движке Webkit маски выполняются очень легко, просто используйте тег mask.
.element {
-webkit-mask: url('mask.png');
}
Давайте попробуем создать пример. Вот наше изображение маски:
Накладывать маску будем на эту фотографию:
Теперь добавим немного кода:
class="element">
src="image.jpeg" alt="" />
type="text/css">
.element {
width: 500px;
overflow: hidden;
}
.element img {
-webkit-mask: url(mask-image.png);
}
В результате мы получим вот такое изображение:
Кроме того, можно использовать свойства. Например, Вы можете установить позицию:
.element img {
-webkit-mask: url(mask-image.png) 30% 30% repeat-x border-box;
/* .. тоже самое что и.. */
-webkit-mask-image: url(mask-image.png);
-webkit-mask-position: 30% 30%;
-webkit-mask-repeat: repeat-x;
-webkit-mask-box-clip: border-box;
/* Так же можно указать и размер! */
-webkit-mask-size: 30% 30%;
}
CSS-исключения
CSS-исключения (CSS Exclusions) - очень мощная функция, позволяющая изменить отображение контента на странице. Используя только одно свойство, можно поменять весь стиль страницы, это очень похоже на редактирование страницы в редакторе WYSIWYG. Давайте посмотрим на самое интересное свойство - “wrap-flow”.
Wrap-flow
Wrap-flow позволяет определить, какое количество элементов влияет на другие, когда они поверх остальных. Зачастую блоки перекрываются. С помощью wrap-flow все элементы адаптируются под верхний элемент на странице.
Wrap-flow имеет несколько настроек:
auto: обычное состояние, ни один из элементов не регулируется
start: все, что после элемента - удаляется
end: удаляется все, что до элемента
both: удаляется контент под объектом
minimum: удаляется сторона с наибольшим количеством контента
maximum: удаляется сторона с наименьшим количеством контента
clear: c двух сторон от объекта всё содержимое удаляется
Диаграмма для помощи:
Композиции и модели смешивания (Composition and Blending)
Режимы смешивания в CSS стали частью официальной спецификации W3C. Это значит, что Вы можете выполнять затемнения основы (color burn) через CSS. Данная спецификация новая, так что возможны изменения прежде, чем она попадет в другие браузеры. У нее такой принцип работы: есть 2 изображения, они накладываются одно на другое с помощью абсолютного позиционирования.
Это будет выглядеть так:
<div class="blend">
<img src="duck.gif" alt="Duck" class="duck" width="500" height="500" style="position: absolute; top: 0; left: 0" />
<img src="penguin.gif" alt="Penguin" class="penguin" width="500" height="500" style="position: absolute; top: 0; left: 0" />
div>
Пример CSS кода:
.blend {
position: relative;
}
.blend .duck {
mix-blend-mode: overlay;
}
В целом вся конструкция выглядит так:
Если Вам интересно, то можете попробовать режимы наложения прямо сейчас. Для этого Вам необходимо скачать Adobe’s experimental webkit browser
Источник: http://www.inserthtml.com/2013/01/future-css3/
ITVDN для корпоративних клієнтів Інтерв'ю із Дмитром Охріменком.
Автор: Редакция ITVDN
Дмитрий Охрименко – один из создателей ITVDN, автор видео курсов, консультант по построению распределенных и веб-ориентированных приложений, сертифицированный специалист Microsoft (MCTS, MCPD, MCT). Более 10 лет Дмитрий проводит корпоративные тренинги для IT специалистов в таких компаниях как 3Shape, GlobaLogic, Ciklum, Terrasoft, Simcorp и других.
Мы попросили Дмитрия ответить на ряд вопросов, связанных с обучением IT специалистов и о том, в какой мере ITVDN может помочь в решении этих задач.
Как HR-специалисту узнать, какие новые технологии нужно изучить разработчику?
Для этого есть много инструментов, которыми можно воспользоваться для определения действительно важных для разработчика тем. Так как бизнес должен зарабатывать деньги, то неправильно будет идти только на поводу у разработчика. Если говорить о мотивации, то все люди любят платить деньги за то, что приносит пользу, либо за то, что приносит удовольствие. Если брать разработчиков, то пользу им приносит все то, что может помочь в решении их повседневных задач. Если компания, например, разрабатывает какие-то веб-приложения, то, возможно, стоит обратить внимание на изучение их популярных библиотек, которые используются в проектах, на изучение разработки BackEnd-части. Это то, что можно отнести к пользе, которую получит разработчик. Если говорить об удовольствии, то все разработчики любят говорить, что они знают все самые последние технологии, что они имели опыт с последними версиями: C#, JavaScript, C++ и т.д. Поэтому мотивация может заключаться в том, чтобы проводить обучение, может, не совсем полезное для проекта, но зато - это новые технологии, и разработчик будет чувствовать себя частью передовых технологий.
Также необходимо проводить обучение для поднятия общего уровня знаний специалистов в проекте. По сути, как узнать, что нужно разработчикам? Лучше всего на этот вопрос ответит не сам разработчик, а тимлид или человек, который занимается организацией всей команды. Потому что четко понятно, что у этих ребят не хватает опыта работы с таким-то языком, инструментом и необходимо подтянуть именно эти навыки.
Можно сделать, например, общий опросник для всех разработчиков и узнать, что они хотят. Как показывает практика, это обычно разбросанные требования: хочу учить С#, хотя человек пишет на Java, или хочу учить Python, хотя в проекте он не будет вообще использоваться.
Для того, чтобы обучение мотивировало разработчиков и было полезно для самой компании, то HR-специалисту нужно собрать информацию не только от конкретных разработчиков, а еще и уточнить, что действительно необходимо для реализации тех задач, которые стоят перед командой в целом. Чтобы команда смогла поставить действительно качественный продукт.
Как происходит процесс построения корпоративного тренинга?
Чаще всего компания понимает, что ей не хватает каких-то знаний в определенных направлениях. По своему опыту, если возникает какая-то задача у HR-специалиста или у тимлида, что команду нужно подтянуть по знаниям, например, по JavaScript, то мы просто приезжаем от Учебного центра CyberBionic Systematics и предоставляем перечень тех курсов и материалов, которые уже существуют. Если компании необходимо подготовить, допустим, Frontend-разработчиков, то мы приезжаем с теми наработками, которые уже есть. Также предварительно готовим конкретное предложение, если от компании уже поступили рекомендации, что, например, нужно сделать больший акцент на объектно-ориентированное программирование, на библиотеку, на определенные инструменты. То есть, мы подготавливаем предложение таким образом, чтобы высветлить те проблемы, которые возникают перед разработчиками и дополнительно добавляем какие-то материалы, которые могут поспособствовать дальнейшему росту специалистов.
Мы проводим встречу с компетентными лицами. Собираемся с тимлидерами, с senior-разработчиками, они высказывают свои пожелания, они корректируют эту программу, и мы берем время на доработку дополнительных материалов. У нас очень много опыта по работе с киевскими компаниями. Очень часто компания Terrasoft заказывала именно абсолютно новую, индивидуальную программу. Они смотрели на то, что у нас есть, но вносили корректировки, которые требовали разработки 30-40 часов, под свои проекты.
Чтобы обучение было действительно качественным и эффективным, чтобы компания получила из этого выгоду, специалистам компании необходимо озвучить, какие проблемы есть и в каком направлении нужно учить команду. В большинстве случаев тимлид и senior-разработчик понимают, что у его 10-ти мидлов, джуниоров и других специалистов не хватает опыта в определенных заданиях. Обычно это знания выборочные и их нужно подтянуть, или их просто нет, тогда нужно донести до слушателей.
Наша задача понять, чего не хватает для того, чтобы специалисты были действительно продуктивными, и их работа была результативная. Для этого нужно подготовить программу, которая принесет пользу компании и специалисты будут удовлетворены. Мы расскажем им, что нужно знать и как нужно работать. Задачи компании будут решатся, а рабочих проблем должно стать меньше после того, как тренинг успешно закончится.
Какие формы обучения наиболее подходят для IT-специалиста?
Чтобы обучение было максимально эффективным, я думаю, его необходимо комбинировать. Использовать обучение вместе с тренером, когда он будет своим примером мотивировать разработчика, заставлять что-то новое учить и двигаться дальше. Также комбинировать обучение необходимо с добавлением онлайн-составляющих, дополнительной литературы. Если брать корпоративное обучение, то максимально эффективное будет очное и онлайн, когда приезжает тренер или обучает через скайп и подобные ресурсы. Непосредственно взаимодействуют все группы слушателей и дополнительно к этому добавляется обучение в видеоформате.
Для большинства проектов не всегда есть возможность оторвать людей от производственного процесса, есть определенные часы, в которые тренеру можно пообщаться с коллективом, рассказать теоретическую часть, но не всегда у разработчиков есть возможность полностью переключиться на подобного рода обучение. Обучения, когда в течение 5 дней в неделю по 5 часов учат определенную технологию, я считаю не очень эффективным, потому что информации очень много, не хватает времени, чтобы её освоить и закрепить. Я считаю, что обучение должно быть постоянным, интенсивным, но при этом в меру, чтобы была возможность переварить саму информацию.
Чтобы был максимальный эффект, необходимо комбинировать очное и онлайн-обучение, когда тренер рассказывает материал и добавлять видеоформат обучения. Конечно, в идеале было бы перевести все на видеоформат и сделать так, чтобы слушатели только смотрели видеоматериалы, но у многих часто возникают вопросы.
Если брать, например, проект ITVDN, то корпоративное обучение подразумевает еще и консультации, то есть команда может взять себе набор видеоуроков.
Создатели и авторы курсов ITVDN хорошо понимают, что именно и в какой последовательности учить и какой эффект будет максимально достигнут. Мы можем составить индивидуальную программу, сделать временные метки и консультировать команду уже по ходу обучения, чтобы они смотрели все в видеоформате и не отрывались от рабочего процесса, при этом мы будем проверять результаты тестирования и отвечать на возникшие вопросы в ходе обучения.
Мы открыты для диалога с компаниями, которые хотят мотивировать своих разработчиков и организовывать для них обучение. Наша команда готова разрабатывать индивидуальные программы, создавать индивидуальный график и подход к каждой компании в отдельности. У каждой компании свои собственные бизнес-процессы, своя корпоративная культура и всех под одну гребенку поставить не выйдет, поэтому мы готовы свои процессы подстроить под график конкретной организации.
Как ты посоветуешь "расшаривать" знания, делиться опытом внутри команды?
Я считаю, что лучшего всего организовывать мастер-классы, когда сама команда для себя что-то полезное рассказывает. В команде всегда есть разработчики, у которых больше опыта. Неплохо было бы организовать день мастер-классов, составить график, где каждый разработчик должен выступить в течение 10-20-ти минут, рассказать о чем-то новом, показать технологию, сделать минимальную презентацию и просто поделиться знаниями, которые он получил на последнем проекте или вычитал, например, в статье. Польза в этом всем в том, что все понимают, над чем они работают, с какими сталкиваются задачами и технологиями, поэтому такие мастер-классы могут быть максимально эффективными для команды.
Если компания пишет, например, используя Angular, то все мастер-классы нужно заточить под Angular и культивировать освоение тех частей этой библиотеки, которые необходимы для работы в проекте. Тимлидер может составить список докладов, и каждый сможет их проводить, будет общая копилка тех тем, по которым разработчик может провести мастер-класс и сделать расписание – это будет наиболее эффективный способ поделиться знаниями в команде.
Также как способ - экстремальное программирование, вместе работать с одной задачей. Кто-то один знает процесс и диктует, а второй набирает код. Экстремальное программирование никто не отменял, но не в каждом проекте оно может примениться, чтобы более опытный специалист смог передать свои знания.
Введення в розробку програм під 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 нам пока не интересен, мы его рассматривать не будем, чтобы не путаться.
На этом урок завершается.
На следующем уроке, в первой части, мы рассмотрим с вами, как пользоваться элементами управления, как привязывать к ним обработчики событий и как взаимодействовать с ними.
Використання HTML Agility Pack та CSS Selectors
Автор: Редакция ITVDN
Введение
В следующих примерах используется HTML Agility Pack (НАР), чтобы загрузить HTML в объект модели документа (DOM) и разбить на узлы. Дополнительно есть случаи, когда приходилось анализировать документ об элементах, которые не являются действительно узлами, такие как комментарии.
В дополнение к наблюдениям около HAP в целом будут указаны методы расширения, предоставляемые пакетом HAP.CSSSelectors, что позволяет значительно проще выбирать.
Задний план
Был успешно использован Html Agility Pack для клиента, проанализированы HTML документы, чтобы извлечь необходимую информацию. Расширения CSSSelector будет добавлять новый мощный уровень абстракции, чтобы собрать необходимые данные.
Использование кода
Пакеты для примера нужно будет импортировать с помощью NuGet. Описания пакетов будут загружены в проекте, но нужно будет установить менеджер пакетов NuGet для восстановления библиотек.
В проект был включен очень простой HTML файл с примерами вопросов, которые необходимы для решения своих проектов.
Чтобы проверить без лишних изменений, необходимо скопировать файл HTML в следующем дисководе и каталоге - C: \ TestData.
HtmlAgility имеет ряд классов, доступных для его добавляемых классов и перечисления, которые представляют различные части DOM, эти классы включают HtmlAttribute, HtmlAttributeCollection, HtmlCommentNode и так далее.
Первый класс, который мы будем изучать, это HTMLDocument класс. Этот класс имеет методы для загрузки и анализа документа в его соответствующих частях.
В исходном коде вызывается каждая секция кода, использующая номенклатуру (часть X), где X представляет собой число.
Чтобы использовать, следующая строка должна быть реализована:
HtmlAgilityPack.agpack = new HtmlAgilityPack.HtmlDocument();
Следующий метод вызывает метод для загрузки документа. Вы можете загрузить его из строки:
agpack.LoadHtml(Html string)
//or from a resource –
agpack.Load(@"c:\testdata\testdat.htm");
Файл в себя включает недостающий закрывающийся тег шрифта и неуместный закрывающий тег. Он прекрасно работает в браузере, не выдает ошибку в HAP, но может быть проверенным на это.
var errors = agpack.ParseErrors;
ParseErrors будет возвращать коллекцию и подсчет ошибок. Достаточно интересная вкладка, закрытие шрифта не выдаст ошибку.
После того, как документ был загружен, двумя основными способами для поиска являются:
SelectNodes(string XPath) // from the DocumentNode
GetElementbyId(string Id) // from the HtmlDocument
Поскольку может быть только один ID, getElementById вернет один узел и SelectNodes вернет коллекцию узлов, потому что с помощью XPath он может соответствовать одному или нескольким элементам.
Находим приложение, где будет добавляться несколько файлов вместе, ограничивающее каждый документ с начальным и конечным комментариями. Ниже показано, как обрабатывать разделения этого документа обратно в его составную часть. Файл, который включен, имеет секцию, которая очерчена с комментариями:
HTML Body
Вы можете использовать следующую команду, чтобы получить комментарий:
var comment = agpack.DocumentNode.SelectNodes("//comment()[contains(., 'Start Table:')]");
Это говорит от всего документа ("//") выбор комментариев, что содержат от текущего местоположения (.) слово Начало табл.
Так как это является комментарием, то не имеет дочерних узлов и внутреннего текста, только текст самого комментария. Это полезно, если то, что вы хотите сделать - это разобрать комментарий, чтобы определить значение в комментарии (номер счета в данном случае), но на самом деле не поможет, если вы хотите видеть текст между комментариями. Чтобы достичь этого, возвращаемся обратно в регулярные выражения и группировки.
var html = Regex.Match(agpack.DocumentNode.InnerHtml,@"(?.*)",RegexOptions.Singleline).Groups[1];
Теперь в html.Value имеется текст между двумя тегами.
Переходим к нахождению элементов в DOM, первый пример находит узел, используя getElementById. Есть три таблицы, но только два идентификатора возложены на них. Одним из них является ID = "abc", другой ID = "table3".
Начнем с таблицы ID = "abc":
var node = agpack.GetElementbyId("abc");
Это вернет один узел, представляющий таблицу. InnerHtml будет содержать весь текст между тегами.
Он также будет содержать набор узлов, представляющих DOM структуру таблицы.
Один из подходов к получению узла строк заключается в использовании Linq, чтобы обнаружить их:
var rownodes = node.ChildNodes.Where(w => w.OriginalName == "tr");
Если проверить подсчет, вы увидите, что у вас есть три строки. Однако, на самом деле существует четыре ряда, первый записанный не будет найден.
Другой подход заключается в использовании SelectNodes на узле, чтобы обнаружить элементы tr.
rownodes = node.SelectNodes("tr");
Но это также проблема - найти все строки, проще найти элементы управления.
Как насчет node.SelectNodes ("/ tr")? Это ничего не возвращает.
Как насчет node.SelectNodes ("// tr")? Хорошая новость состоит в том, что он нашел недостающую строку вместе со всеми строками (12) в документе.
После небольшого углубления нашлись следующие два рабочих решения:
rownodes = node.SelectNodes(node.XPath + "//tr");
//or
// http://www.w3schools.com/xsl/xpath_axes.as
rownodes = node.SelectNodes("descendant::tr");
это возвращает все четыре. Возможно, HAP делал бы SelectNodes от текущего узла "//tr" и работал бы, увы "//" - говорит искать от корня документа. Но второй вариант работает, как потолок от выбранного узла.
Аналогичным образом мы можем найти все td элементы, используя те же процедуры. Отметим, что для таблицы нужно 3 вернуть двенадцать td элементов, даже если они являются дочерними.
node = null;
node = agpack.GetElementbyId("table3")
nodes = node.SelectNodes("descendant::td");
Переходим к HAP.CssSelectors.
Это находится на вершине HtmlAgility пакета и будет на самом деле обеспечивать установку в качестве части пакета NuGet.
Это позволяет выбрать элементы, используя CssSelectors, нежели XPath. Например:
rownodes = agpack.QuerySelectorAll("#abc tr");
В этом случае не нужно искать в узле, просто, выбрав из всего документа, он вернет ожидаемых 4 ряда.
listTDNodes = agpack.QuerySelectorAll("#table3 td");
Ниже приведен пример получения только s (три) во втором ряду.
listTDNodes = agpack.QuerySelectorAll("#table3 tr:nth-child(2) td");
Это вернуло двенадцать пунктов, четыре ряда из 3 колоноки. Одно замечание. Способ QuerySelectorAll возвращается, как список <узлов>, а не коллекция узлов. Это важно знать, если планировать смешивать и сочетать.
В дополнение к выбору по идентификатору (#) можно выбрать по классам (.), это гораздо проще, чем искать атрибут с классом, используя XPath.
listTDNodes = agpack.QuerySelectorAll(".table");
Возвращаем первую и третью таблицу с классом table.
Точки интереса
В заключении скажем, что продление CssSelectors - это еще один полезный инструмент для легкого выбора элементов, без необходимости копать вглубь XPath или перебирать коллекции.
Источник: http://www.codeproject.com/Articles/1038320/Using-HtmlAgility-pack-and-CssSelectors
Чи потрібна програмісту вища освіта?
Автор: Влад Сверчков
Статистика DOU та Stack Overflow
Що відбувається у технічних ВНЗ на “айтішних” напрямках?
Вага диплому
Чому навчають у вишах?
Чи потрібна математика в програмуванні?
Рейтинг українських ВНЗ
Вартість навчання у ВНЗ
Підсумки
Вітаємо вас, дорогі читачі блогу ITVDN!
Сьогодні ми розглянемо дуже важливу тему, яка має багато гострих кутів. Стосуватиметься вона вищої освіти, а саме – її необхідності для програмістів. Відразу зазначимо – тема наповнена багатьма нюансами. Ми намагатимемося охопити всі важливі моменти, які допоможуть скласти максимально цілісну картину та дати розгорнуту відповідь на головне питання цієї статті.
Давайте не зволікатимемо з ліричним відступом і відразу приступимо до пошуку інформації, а також до розстановки всіх точок над “i” в обговореннях “чи потрібна програмісту вища освіта?” і що потрібно для програміста у виші взагалі.
Статистика DOU та Stack Overflow
Насамперед дізнаємося, як справи з вищою освітою у тих, хто зараз займається розробкою. Для цього звернемося до опитування Stack Overflow Developer Survey 2022, яке цього року зібрало 70 000 анкет.
Якщо вірити цьому джерелу, 80% респондентів мають певну форму вищої освіти. Виходить, 4 з 5 розробників мають диплом. Що цікаво, 38% з тих людей, що тільки навчаються програмуванню і ще не мали досвід комерційної розробки, мають диплом. Це свідчить про те, що навчатися ніколи не пізно – навіть якщо у вас є наукова ступінь не за ІТ-фахом і ви тільки зараз почали вивчати кодинг.
Відповідно до опитування Stack Overflow Developer Survey 2020 (65 000 анкет), майже 85% опитаних з числа професійних розробників вважають, що формальна освіта хоча б більш-менш є важливою. Проте майже 16% вірять, що вища освіта і зовсім зайва.
Тепер звернемося до портрета IT-фахівця за підсумками 2020 року від DOU. Вся інфографіка складена на підставі 12419 анкет. Аналізуючи розділ “Освіта та саморозвиток”, можна сказати таке: хто б що не говорив про вищу освіту, але більшість IT-фахівців мають повну вищу освіту, а деякі — навіть дві. Дві вишки переважно у Senior PM, а максимальна кількість кандидатів наук у фахівців Data Science, яким потрібна сильна математична база для виконання посадових обов'язків (її вони й отримують у ВНЗ). Найменша кількість тих, хто закінчив вищий навчальний заклад, припадає на Junior розробників ПЗ. Це й не дивно — більшість отримують свою першу посаду в IT ще на студентській лаві.
Таким чином, як вітчизняна, так і зарубіжна статистики показують, що переважна кількість професійних розробників таки має диплом. Це зовсім не означає, що на роботу в галузі IT вони потрапили виключно завдяки знанням, отриманим у ВНЗ. Те ж опитування від Stack Overflow, тільки за 2019 рік (90 000 респондентів), показало, що понад 86% опитаних самостійно вивчали необхідну їм мову, фреймворк або інший інструмент розробки.
Хоча в опитуванні 2022 року не було такого ж пункту, ми впевнені, що статистика самоучок на поточний рік не сильно змінилася і плюс-мінус той же відсоток зберігся до сьогодні. Виходить цікава колізія: якщо переважна більшість закінчувала (або закінчує в даний момент) вузи, то чому ці студенти/випускники самостійно вивчають те, що їм треба в роботі? Чому навчають в університетах у такому разі? Давайте розбиратися.
Що відбувається у технічних ВНЗ на “айтішних” напрямках?
Сучасні вищі навчальні заклади несуть мало радості тим, хто має намір стати програмістом. Безумовно, студентська романтика та пригоди чекають на вас у будь-якому місці здобуття вищої освіти. Проте ми ведемо мову саме про цільове призначення цих закладів.
Відповідаємо на запитання цього розділу: в університетах досить неоднозначний стан речей. Усі суперечливі моменти ми представимо у вигляді списку:
З одного боку, у ВНЗ справді вивчається програмування, алгоритми, структури даних, дискретна математика та інші важливі для програмістів речі. З іншого боку, багато предметів є зайвими, або такими, які студентам не до душі.
Ми не порушуватимемо тему, які дисципліни справді важливі для програмістів, а які мають сумнівну цінність, проте факт залишається фактом: дуже часто студенти обурені наявністю філологічних предметів, таких, як історія, філософія, менеджмент, правознавство, історія культури та інші. Подібні ситуації виникають і з технічними напрямками. Припустимо, студент очікував вивчення програмування на C# та інших високорівневих мовах; насправді ж на "шарпи" припадає 3 семестри, а на наступних курсах доводиться працювати з низькорівневим Асемблером і писати програми під логічні контролери за допомогою ST, FBD і SFC, які часто використовуються для автоматизації виробничих процесів. Кожен університет має свої навчальні програми, але подібні розбіжності очікувань та реальності зустрічаються скрізь.
Окрему увагу варто приділити якості освіти. Вище ми говорили, що в університетах все ж таки викладають те, що необхідно програмісту, хоч і частково. Але і тут є кілька проблем.
Перше, що варто мати на увазі: у жодному вітчизняному ВНЗ із вас не зроблять, наприклад, сучасного .NET розробника, або DevOps інженера. Окрім того, що самі програми навчання застарілі років на 10 (у кращому випадку), їх іноді ведуть сивочолі старожили кафедр, які зачитують матеріал із книг епохи Горбачова. І вони не мають наміру оновлювати навчальну програму, оскільки вникати в нові технології для них не комільфо.
Також іноді буває, що такий викладач не проти повчити вас життя, або просто нівелювати вас як особистість. Чули історії про те, як студенти до ночі захищали свої лабораторні / розрахункові роботи? А про те, як деяким просто неможливо здати предмет, який навіть близько не потрібний програмістам?
Безумовно, зустрічаються і цілком лояльні, добрі та приємні викладачі, але на кожній кафедрі ви знайдете таку людину, від якої вас хапатиме Кіндратій. Чи хотіли б ви кілька семестрів (а то й весь термін навчання) провести в компанії такої людини і вимотати свої нерви?
Відносно молоді програмісти-викладачі, які займаються розробкою на комерційній основі, звичайно, зустрічаються, і з кожним роком їх все більше і більше, проте і серед них знайти тямущих лекторів — ще те завдання. Найчастіше такі викладачі просто сідають за ноут, включають проєктор, пишуть код (проєктуючи все на дошку) і щось коментують, поки інші сидять і півтори години дивляться. Так, це краще, ніж ті ж викладачі похилого віку з крейдою в руках. Але просто кодингу недостатньо. Студенти також люди; їм потрібна жвава подача матеріалу від цікавого лектора, який вміє приковувати до себе та свого коду увагу. Крутий програміст, який уміє кодити, але не вміє зрозуміло доносити до решти те, що він робить, далеко не найкращий варіант.
Якщо нас читають лектори-програмісти більш-менш відомих ВНЗ, які при цьому не користуються популярністю у своїх студентів, закликаємо їх замислитись над своїми методами подачі матеріалу. Гарний програміст – не те саме, що гарний викладач. Якщо людина вміє грамотно подавати матеріал, у неї буде менше проблем із відвідуваністю та дисципліною, а також більше позитивного фідбеку від студентів. Викладання (від слів “викладати”, “викласти”) – це навичка донесення інформації, і її необхідно розвивати, над нею треба працювати.
Обираючи навчання в університеті, варто враховувати, що він орієнтований на самостійну роботу самих студентів. Вважається, що 80% навчального часу студенти повинні приділяти самостійному вивченню предмета, а решта 20% покладаються на лекції викладачів.
Ті абітурієнти, котрі вважають, що в універі їх вивчать на програмістів, помиляються. Ніхто нікого вчити не збирається, адже це не школа. І студент повинен це усвідомлювати. Також часто буває так, що на лекціях вам розповідають одне, а на лабораторних ви робите зовсім інше.
Тонни лабораторних та розрахунково-графічних робіт — постійні супутники кожного студента-технаря, зокрема й студента-програміста.
Головні рушійні сили технічного університету – "корочка", яка необхідна для роботи, очікування та надії членів сім'ї, а також уникнення армії.
Щире бажання отримати професію, якою ти “палаєш”, є далеко не у всіх, оскільки у 17 років дуже складно визначити майбутній фах всього свого життя. А у щасливчиків таке щире бажання швидко згасає, коли вони зіштовхуються з реаліями і розуміють, що просто виконуючи навчальний план протягом 4-6 років в університеті особливо нічого не досягнеш на поприщі ІТ.
Хтось скаже, що така ситуація у ВНЗ — чудова школа життя. З одного боку, це справді так. Але якщо подивитися на систему навчання вітчизняних ВНЗ з точки зору "як має бути" і "як є насправді", ви помітите, що досвід та знання, з якими студенти закінчують навчання, отримуються не завдяки, а всупереч цим самим вишам. На жаль.
Вага диплому
Чи потрібна вища освіта у сфері IT для успішного працевлаштування? В українських IT-компаніях часто вимагають хоча б диплом незакінченої вищої освіти або щоб кандидат був на шляху до його отримання. Однак це не означає, що без диплому вас не приймуть до лав розробників – просто у кожної компанії своя політика, а чим більша компанія, тим солідніші запити щодо претендентів. Більше того, диплом на співбесіді – це формальність, галочка. Насправді ж ви будете проходити тестові завдання та відповідати на технічні запитання, тож навіть червона “корочка” фактично нічого не вирішує.
Якщо говорити про розвинені країни, то там все серйозніше. Навчання у вищих навчальних закладах важче і диплом справді відіграє більш значиму, ніж у нас, роль. На тих, хто закінчив виш, роботодавець і дивиться по-іншому – з повагою та визнанням. Досить часто іноземні компанії, незалежно від навичок та досвіду, вимагають наявність диплома бакалавра або, як мінімум, щоб ви на момент розгляду резюме перебували на старших курсах ВНЗ. Більше того, диплом спрощує процес отримання робочої візи, без якої ви не зможете вирушити працювати програмістом, наприклад, у європейські країни або США.
А ось на які посади вас із максимальною вірогідністю не візьмуть без диплому як у рідній країні, так і за кордоном — це керуючі позиції в ІТ. Їх займати має право лише людина з повною вищою освітою.
Маємо дві сторони медалі. Якщо глянути на аверс — диплом для “галочки”, який при цьому вистражданий потом, кров'ю та вашим часом. Але реверс говорить нам про зарубіжжя та керівні посади, а також про незабутню школу життя, зрештою.
Чому навчають у вишах?
У кожному вищому навчальному закладі є своя навчальна програма. Однак якщо підсумувати, то можна виділити такі дисципліни:
Алгоритми та структури даних
Алгоритмічне програмування
Програмування популярними мовами (C/C++, C#, Java, Python)
Вебпрограмування
Комп'ютерна графіка
Дискретна математика
Вища математика
Комп'ютерні мережі
Бази даних
Теорія інформації та кодування
Криптографія
Операційні системи
інші дисципліни
Крім цього, у вузах студентам також читають предмети, які напряму не пов'язані з програмуванням та інформаційними технологіями: економіка, правознавство, історія, психологія, охорона праці, філософія та інші. На стику філологічного та технічного розташуємо англійську мову, оскільки вона надважлива для успішної взаємодії із зарубіжними навчальними матеріалами, статтями, відеороликами, професійними книгами. Також вона знадобиться для вільного спілкування з іноземними колегами та роботодавцями. Інгліш знадобиться і для написання грамотного коду (без спотворених, “кривих” назв).
При всьому багатстві вибірки дисциплін, у вітчизняному виші ви можете розраховувати лише на ази будь-якої айтішної спеціальності. Вам дадуть все поверхнево – цих знань вистачить для розуміння того, що відбувається в тій чи іншій сфері. Все інше ви повинні будете доучувати, самостійно практикуватися, відвідувати відповідні курси, проходити інтернатуру в IT-компанії і таким чином добирати знання, яких вам бракує.
Звичайно, на Заході існують такі виші, де ви зможете пройти гарне профільне навчання. Наприклад, факультет Informatics, Games Engineering in Technical University Of Munich (Німеччина). За кордоном усвідомлюють важливість IT-індустрії та намагаються відповідати новим тенденціям, а не просто пхати у вас “вічну класику”. Тому факультет розробки комп'ютерних ігор – норма для розвинених країн.
Однак у таких державах і ставлення до вищої освіти зовсім інше. Наприклад, у Чехії випускників ВНЗ дійсно цінують роботодавці, оскільки і навчання складніше, і саме викладання на голову вище за вітчизняні аналоги. Іноземна освіта враховує технологічний прогрес і намагається йти нога в ногу з ним. Чого не скажеш без грудки у горлі про навчання у більшості вишів пострадянського простору.
Є один бонус від ВНЗ, про який ми мало не забули. Багато вітчизняних університетів мають програми співпраці із закордонними університетами. Таким чином, навчаючись на батьківщині, у вас є можливість стати учасником такої програми та перебратися за кордон заради здобуття європейської освіти. Круто, чи не так? =)
Чи потрібна математика в програмуванні та в якому обсязі?
Одна з головних переваг будь-якого технічного вишу — математична база. Зазвичай, лише у вищому навчальному закладі можна отримати гарні знання з вищої математики. Тут ми порушимо ще одне популярне питання, яке часто задається тими, хто хоче йти в IT: кому потрібна математика і чи потрібна вона взагалі для програміста?
Відповідь – потрібна. Однак є один приємний момент: кожному розробнику математика потрібна по-різному. Якщо ви хочете працювати у якості FrontEnd розробника (створення клієнтської сторони вебдодатків), то математика вам буде потрібна меншою мірою, ніж для C# / .NET розробника, який, наприклад, зайнятий розробкою корпоративних рішень. Вузівський матан незамінний для тих, хто збирається пов'язати свою професійну діяльність з наукою, шифруванням, Data Science, машинним навчанням, штучним інтелектом та всім, що пов'язано з великими обсягами даних.
Для криптографічних завдань вам знадобиться загальна та лінійна алгебра. У 3D-моделюванні не обійтися без геометрії та механіки. Для роботи з великими масивами даних необхідні статистика, теорія ймовірностей, лінійна алгебра. Біоінформатика потребує знань у галузі дискретної математики та статистики. Так можна перераховувати безліч IT-напрямків.
Однак переважна більшість людей бере не той орієнтир. У програмуванні важлива не стільки математика, скільки саме математичне мислення.
Найчастіше IT не вимагає глибоких знань, і необхідний мат. апарат обмежується початковими курсами університету (теорія множин, графів, автоматів, алгоритми, базова логіка) + стандартна шкільна програма (куди ж без неї?).
Василь Кобзар, викладач GeekBrains, який спеціалізується на адмініструванні Linux, має чудову відповідь на запитання "Наскільки програмісту потрібне знання математики в роботі?" (джерело):
“Якщо математика буде являтися предметною областю, то знати її потрібно настільки добре, наскільки це потрібно для вирішення завдання. Однак питання, мабуть, поставлене для загального випадку і пов'язане з існуючою думкою. Програмістові добре було б розібратися з логікою та абстрактною алгеброю, які не викладаються ні в школі, ні у більшості вишів. Також не завадять матстат і дискретка. Матан здебільшого марний, так само як і, скажімо, тригонометрія. Загалом, корисна та частина математики, що «розум у порядок приводить», а знання будь-яких формул напам'ять тільки забиває голову”.
Підводячи підсумки цього розділу, скажемо наступне. Математика в програмуванні – це насамперед про математичне та аналітичне мислення, які допомагають критично мислити, абстрагуватися та розв'язувати задачі, вміло використовуючи логіку. Саме раціональний підхід до вирішення завдань, що забезпечується мат. мисленням – головний інструмент програміста. З його розвитком вам допоможуть спеціалізовані книги, а також практичні вправи – написання коду, вирішення математичних завдань та інші вправи, які можна знайти на вебресурсах.
Рейтинг українських ВНЗ
Розглянемо рейтинг за 2019 рік від dou.ua. Чому саме за 2019? Бо рейтинг того року був максимально “народним” – окрім традиційної статистики він містив додаткові відповіді респондентів, які вже мають вищу освіту, на деякі і донині актуальні запитання: в якому виші краще вчитися (український/зарубіжний), чи корисним було навчання, чи радили б ви отримувати вищу освіту і т. д. У наступні роки ні dou.ua, ні інші українські інформаційні ресурси не робили подібного опитування, тому будемо вдовольнятися даним.
Отже, до першої десятки топових технічних освітніх закладів, в яких є IT-спеціальності, у 2019-му році потрапили:
Національний університет "Києво-Могилянська академія" (НаУКМА).
Український католицький університет.
Чорноморський національний університет імені П. Могили (ЧНУ ім. Петра Могили).
Харківський національний економічний університет імені С. Кузнеця (ХНЕУ ім. Кузнеця).
Донецький національний університет імені В. Стуса (ДонНУ ім. В. Стуса).
Харківський національний університет радіоелектроніки (ХНУРЕ).
Сумський державний університет (СумДУ).
Київський національний університет імені Т. Шевченка (КНУ ім. Шевченка).
Чернівецький національний університет імені Ю. Федьковича (ЧНУ ім. Федьковича).
Львівський національний університет імені І. Франка (ЛНУ ім. Франка).
В опитуванні взяло участь 3038 студентів та випускників українських вишів. Рейтинг був складений на основі різних аспектів навчання в університеті.
Відповідно до даної публікації, 69.2% опитаних все ж таки радять здобути вищу освіту в українському виші. З них майже 16% рекомендували б відучитися в іншому вітчизняному закладі, відмінному від того, де респонденти самі отримують/отримували вишку, а 12% воліли б обрати іншу спеціальність/факультет. При цьому майже кожен четвертий (24%) вважає, що отримувати диплом треба лише за кордоном. На думку цих респондентів, за межами країни якість освіти краща. Також їх приваблює досвід життя та роботи в іншій країні. При цьому 5.6% опитаних були категоричними і виступили проти здобуття вищої освіти в принципі.
Які предмети потрібно здавати на програміста у ВНЗ – в кожному закладі можуть бути свої критерії, проте зазвичай обов'язковими є рідна мова, математика, англійська, а іноді й фізика.
Вартість навчання у ВНЗ
Для з'ясування цього питання пройдемося найпрестижнішими українськими закладами, а потім вишами, які займають другорядні позиції.
Спочатку візьмемо вартість контрактного навчання в КПІ на IT-напрямках. Найдешевшими за ціною є спеціальності “Комп'ютерні науки”, “Системний аналіз” та “Кібербезпека” — 35 000 грн за рік очного навчання на бакалавраті. 42 000 грн коштує навчання за спеціальностями “Інформаційні системи та технології” і “Комп’ютерна інженерія”, а 45 000 доведеться віддати за “Інженерію програмного забезпечення”.
Візьмемо на розгляд НаУКМА. "Комп'ютерні науки" та "Інженерія програмного забезпечення" коштують по 55 000 грн за рік навчання на бакалавраті.
У КНУ ім. Шевченка ситуація така: ті самі спеціальності, що були перераховані вище, оцінюються у 38 000 грн за рік очного навчання на бакалавраті.
Перейдемо до вузів, які досягли менших висот, ніж розглянуті попередники. На черзі маємо НАУ. "Комп'ютерні науки", "Кібербезпека", “Інформаційні системи та технології” – 26 000 грн, "Інженерія програмного забезпечення" – 29 000 грн, "Комп'ютерна інженерія" – 28 000 грн.
Національний транспортний університет. За "Інженерію програмного забезпечення" та "Комп'ютерні науки" доведеться віддати 25 750 грн. Рік навчання на очному відділенні, звісно.
У СумДУ за "Кібербезпеку" та "Комп'ютерні науки" за перший рік навчання з вас візьмуть 13 440 грн. Наступні курси навчання коштуватимуть 15 365 грн, 20 370 грн та 23 660 грн відповідно.
Цінова вилка досить непогана — приблизно від 13 до 55 тисяч. Причому це не обов'язково граничні значення. Ми розглянули лише декілька університетів, адже їх сотні й у кожного свої особливості. Але навіть із цього списку можна робити відповідні висновки.
Якщо порівнювати вартість навчання у ВНЗ із курсами програмування, то виходить, що курси набагато вигідніші. На курсах ви витратите приблизно 15-25 тисяч на опанування IT-спеціальності, зате через півроку зможете працювати на посаді Junior розробника і з легкістю відіб'єте всю ту суму, яка була витрачена на навчання. В університеті ж ви витратите щонайменше 4 роки і на виході отримаєте такий набір знань, який недостатній для роботодавця. Все одно доведеться звертатися до сторонніх ресурсів (книги, курси, онлайн-ресурси тощо) і займатися самоосвітою, щоб дотягнутися до вимог тієї чи іншої компанії.
Підсумки
Отже, під час пошуків відповіді на питання “Чи потрібна програмісту вища освіта?” нам вдалося багато чого з'ясувати. Розіб'ємо головні тези на “за” та “проти”.
“За” навчання у ВНЗ:
більшість професійних програмістів мають вищу освіту, а також рекомендують іншим отримати диплом;
деякі компанії вимагають наявність диплома у кандидатів на обов'язковій основі; це ж стосується деяких видів IT-професій (біоінженерні розробки і т. д.);
ВНЗ з айтішних напрямів навчають основам майже всього, що пов'язано з IT;
вища математика у ВНЗ дуже важлива для тих, хто збирається пов'язати свою професійну діяльність з наукою, шифруванням, Data Science, Big Data, машинним навчанням, штучним інтелектом та всім, що пов'язано з великими обсягами даних;
диплом допомагає в отриманні візи та керівних посад в IT;
навчаючись у вітчизняному виші, можна стати учасником програми обміну студентами та виїхати на навчання до іншої країни;
навчання на курсах не можна назвати дешевим
відстрочка від армії
ВНЗ - непоганий вибір, якщо ви хочете йти в науку
наявність ярмарок вакансій, де ви можете познайомитися з різними роботодавцями – навіть з інших країн
мережа корисних знайомств у ІТ, яка сприятиме працевлаштуванню і зануренню в айті
"Проти" навчання у ВНЗ:
диплом швидше потрібен для “галочки”, все одно вас тестуватимуть на співбесіді та перевірятимуть ваші вміння та навички
головні рушійні сили технічного університету – не навички та знання, а необхідна для роботи "корочка", очікування та надії членів сім'ї, а також армія
багато навчальних програм в освітніх установах на IT-напрямках є застарілими
ВНЗ з айтішних напрямів навчають лише основам
за рік очного навчання у більш-менш пристойному виші треба буде заплатити не менше 25 тисяч
щоб влаштуватися програмістом в IT-компанію, вам необхідно доучуватися після університетської освіти
Нейтральне, але не менш корисне висловлювання: математичне та аналітичне мислення важливіше, ніж знання формул, проте варто враховувати, що знати математику потрібно настільки добре, наскільки це потрібно для вирішення робочих завдань.
Якщо заплющити очі на безліч суперечливих моментів, університет — це справді своєрідна школа життя. Найважливіше, що можна собі винести з вишу — це зв'язки, досвід від універу та досвід, отриманий під час проживання в гуртожитку. Ви можете отримати гарні знайомства і дізнатися дуже корисні поради щодо перспектив в IT з перших вуст. Через знайомих можна навіть рекомендацію на посаду в IT-компанії отримати.
Тож чи варто отримувати вищу освіту програмісту? На жаль, як засіб вивчення конкретного IT-ремесла університет не можна розглядати, зате все побічне, що пов'язано з ним, зроблено на пристойному рівні. Студентська романтика, незабутнє життя в гуртожитку, ярмарки вакансій, програми співпраці універів із престижними IT-компаніями (курси та інтернатури), програми співпраці з іноземними вузами, знайомства тощо. Саме ці плоди ви повинні збирати під час навчання у ВНЗ.
Якщо ви наважилися здобути вищу освіту, вам не завадить наступна порада. Більшість колишніх студентів рекомендують відучитися перші рік-два, а потім шукати роботу (проходити курси, влаштовуватися до інтернатури). Як підсумок — після закінчення бакалаврату ви маєте і університетську базу, і диплом, і досвід роботи. Час даремно не втратили і при цьому університетське життя скуштували.
Але якщо ви не готові витрачати стільки часу заради сумнівних привілеїв, робіть вибір у сторону курсів. Там вас не навчатимуть нічому зайвому і ви в максимально короткі терміни зможете опанувати бажану спеціальність, а потім отримати свою першу роботу на посаді програміста.
Якщо у вас виникли зауваження або побажання до статті, сміливо залишайте їх у коментарях.
Залишайтеся з ITVDN!