Результати пошуку за запитом: Обучение 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).
Выражаем благодарность за подготовку статьи Алексею Краевому, Максиму Шнуренку, Андрею Ткаченку, Владу Медведовскому, Сергею Селецкому, Андрею Губскому, Сергею Мащуренку, Александру Скриннику, Андрею Соболю, Богдану Нановскому, Святославу Аксёнчикову, Ивану Корнелюку, Михаилу Пивоварову, Алексею Дерке, Евгению Гуреву, Михаилу Меркулову, Юрию Воронину.
Що нового в Angular 5
Автор: Дмитро Охріменко
Переход от AngularJS к Angular 2 был огромным шагом вперед. При этом изменилось абсолютно все, без обратной совместимости. В то же время, Angular 4 добавила новые возможности, но при этом была обратно совместимой с Angular 2 (Версия Angular 3 была пропущена из-за @angular/router, который на момент релиза был 3.x, в то время как остальные пакеты 2.x. Для того, чтобы избежать путаницы и перевести все пакеты к одной версии, третья версия была пропущена). Angular 5 - это следующее обновление, в котором изменения затронули механизмы, работающие «под капотом».
Многие пользователи ITVDN задают вопрос об актуальности учебных программ видеокурса Angular Essential, который записан с использованием версии 2 и видеокурса Angular Advanced (версия 4). Angular 5 не является чем-то абсолютно новым, это улучшение существующего Фреймворка. Чтобы понять и начать использовать возможности, которые появились в пятой версии, необходимо знать основы, которые не изменились, начиная со второй версии.
Что нового в Angular 5?
Улучшенный компилятор. В Angular 4 компилятор перекомпилировал все файлы при каждом изменении. В Angular 5 компилятор работает только с теми файлами, в которых есть изменения, а это значит, что время на компиляцию проекта в целом значительно снизилось.
Оптимизированная сборка. В Angular CLI при использовании production build совместно с версией Angular 5 по умолчанию будет применяться build optimizer, который с помощью семантического анализа кода приложения сможет значительно уменьшить его размер.
Акцент на упрощение разработки PWA (Progressive Web Apps). PWA - это приложения, которые объединяют в себе лучшее, что есть в веб-приложениях и лучшее, что есть в мобильных приложениях.
PWA работают независимо от выбранного браузера;
адаптируются под устройство - десктоп, планшет, телефон;
могут работать без подключения к Интернет или при перебоях со связью;
выглядят как приложение, установленное на устройство;
благодаря Service Worker содержат актуальную обновленную информацию;
являются безопасными, так как работают через HTTPS;
используют возможности, подобные push уведомлениям;
Installable – позволяют пользователю добавить приложение на домашний экран устройства.
Поддержка TypeScript 2.4. Angular 5 поддерживает версию TypeScript 2.4, что дает возможность использовать новые возможности TS: перечисления, основанные на строках, улучшения проверки типов при работе с generic-типами, week-type-detection и прочее https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html
Pipes, адаптированные под локализацию. Обновленные Pipes для Date, Currency, Number и Percent, нет необходимости использовать i18n. https://github.com/angular/angular/blob/master/CHANGELOG.md#i18n-pipes
Новые события Router. Используя события ActivationStart и ActivationEnd или ChildActivationStart и ChildActivationEnd, можно организовать отображения индикаторов загрузки при смене маршрута.
HttpClient. Новый HttpClient был добавлен в версии 4.3, старый http клиент помечен как depreceted в новой версии. В Angular 6 старый клиент будет удален. Из преимуществ нового клиента можно выделить самостоятельное извлечение JSON без необходимости явного применения метода map и возможность применять interceptors. https://angular.io/guide/http
Валидация форм. Теперь при работе с формами, c помощью свойства updateOn, можно определить, в какой момент будет происходить проверка – на событие blur или submit (вместо проверки на каждое событие input).
Замена ReflectiveInjector на StaticInjector. Изменен механизм для внедрения зависимостей. Для нового StaticInjector не нужен полифил Reflect (но при использовании JIT данные полифил все равно нужно будет использовать), что может уменьшить размер приложения.
Angular CLI 1.5 использует Angular версии 5.
Улучшение NgZone. NgZone стала еще быстрее, также библиотеку можно отключить для применения другой библиотеки для улучшения производительности.
Улучшенный RxJS. Поддержка обновлена до версии 5.5.2 и выше. Поддержка новых pipable operators https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md
Angular 5 получился компактней и быстрее, чем его предшественники, и не обошелся без новых возможностей. Запуск следующей версии Angular планируется на 28 марта 2018 года. Будем ждать улучшений и новых возможностей от команды Angular.
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/
Введення в розробку програм під 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
Идеальное резюме программиста: что писать в резюме IT специалисту
Автор: Влад Сверчков
Всем привет!
Что такое резюме? По сути, это визитная карточка, которая должна убедить рекрутера либо HR-менеджера пригласить вас на собеседование. Однако, она может не только убеждать нанимателей, но и давать отказ разработчикам даже с завидным багажом опыта и знаний. Что написать о себе в резюме IT специалисту? Каким должно быть резюме у программиста, чтобы оно понравилось рекрутеру и стало вашим пропуском в IT-компанию? Чем отличаются резюме опытного разработчика и начинающего программиста (junior)? Давайте разберемся!
Прежде всего отметим, что в вашем резюме должно отсутствовать:
Размытость, неточности. Каждый человек дорожит своим временем. Особенно рекрутер, у которого помимо вашего еще несколько десятков (а бывает даже и сотен) резюме. Никто не захочет тратить время на переспрашивание или уточнение у вас информации, которая важна для той или иной позиции, но при этом которую вы забыли либо не захотели указать.
Вода. Резюме — не сочинение на вольную тему и не автобиография, начиная с пеленок. Этот документ имеет четкую цель и предназначение, а значит пустословие в нем — дурной тон и заодно самый верный путь в корзину рекрутера.
Ложь. Также, не забывайте, что ложь всегда всплывает наружу — либо во время собеседования, либо непосредственно в ходе трудовых будней. Не выдавайте желаемое за действительное и составляйте честное резюме. Мы еще поговорим в этой статье о том, под каким соусом лучше подавать ту или иную информацию, будучи честным и в выигрышном положении одновременно.
Если подытожить эти пункты, то верно следующее: хорошее резюме должно пестрить лаконичностью, быть честным и содержать только важную информацию. Теперь поговорим подробнее, что оно должно в себя включать и как правильно составлять каждый раздел.
Структура
Жестких требований к оформлению резюме для программистов нет. Однако, существуют определенные правила, которых следует придерживаться в процессе его составления. Рекомендуем использовать следующий шаблон (в скобках указано название, которое надо использовать при составлении резюме на английском):
Фамилия, имя (First Name, Last Name)
Возраст (Age)
Контакты (Contacts) — город проживания, телефон, e-mail, Skype. Акцентируем внимание, на том, что название электронной почты и скайпа должно быть в официальном стиле в виде вашего имени и фамилии: a.ivanov@... либо alexander_ivanov@... и т. д. Никаких stasik_ananasik@... и прочих вычурных названий. Почту лучше выбирать из популярных — Gmail, Outlook и подобные. Также, почта не должна быть привязана к предыдущим местам работы.
Здесь же добавьте ссылку на ваш профиль в GitHub, где находятся опубликованные вами проекты. Если имеете хорошо заполненный профиль в LinkedIn (с указанными местам учебы и работы, изученными технологиями, вашим хорошим фото и другой информацией), добавьте ссылку и на него.
Здесь же затронем и вопрос социальных сетей. Если ваше резюме всерьез заинтересовало рекрутера, высока вероятность, что вас найдут через соцсети и ознакомятся с содержимым ваших страничек. Поэтому проведите предварительную ревизию своих профилей в Сети и уберите все то, что будет портить вам имидж (острые политические высказывания, посты, противоречащие общепринятым нормам морали, и другие элементы, которые будут работать против вас).
Цель (Objective) — пункт, в котором вы сообщаете нанимателю, какую позицию желаете занимать в компании.
Резюме квалификации (Summary Of Qualification) — в этом разделе следует разместить основную информацию из резюме, которую будет полезно узнать работодателю в первую очередь (не более пяти ключевых тезисов, которые расскажут о вас и вашем опыте работы в выбранной сфере IT). Если не имеете каких-то сильных аргументов о вашем карьерном пути, пропустите этот пункт.
Профессиональные навыки (Hard Skills) — здесь вы описываете все технологии, которые знаете и умеете использовать. Рядом указывайте уровень владения каждой. Допустим, что-то знаете отлично, что-то базово, но готовы изучать дальше. Главное — пишите честно, ведь за каждую технологию или указанный вами язык программирования спросят.
Личные навыки (Soft Skills) — это нетехнические навыки, которыми вы обладаете. Какие ключевые навыки указать в резюме программиста? Умение работать в команде, решать конфликтные ситуации, быть внимательным к деталям, обладание хорошо развитым критическим мышлением, умение слушать и четко излагать свои мысли, а также другие подобные навыки относятся к софт скиллам, которые важно было бы услышать работодателю. То есть, это те умения, которые помогают нам быть эффективными на работе. Много софт скиллов писать не надо, однако, минимум три наилучших своих качества указать необходимо.
Здесь тоже пишите честно не вводя работодателей в заблуждение — собеседование заставит вас вскрыть карты в любом случае. На помощь придет небольшой совет, который поможет оставаться честным и при этом не касаться ваших недостатков.
Каждый работодатель хочет, чтоб его сотрудник был рабочей лошадкой с отличными коммуникативными навыками, быстрой обучаемостью, прекрасно владел техниками тайм-менеджмента и другими скиллами. Но все знают, что идеальных людей не бывает. Допустим, если вы интроверт и нуждаетесь в определенном времени на раскрытии себя в коллективе, не пускайтесь в обман, мол, вы быстро и с легкостью находите общий язык с командой. Будет разумно поступить иначе — обойти стороной ваши навыки коммуникации и указать другие положительные качества, которыми обладаете — например, умение слушать, анализировать информацию и быстро находить выход из назревшей проблемы.
Опыт (Experience) — следует указывать в обратном порядке, начиная с вашего последнего места работы. Каждое описываемое место работы должно иметь следующую структуру:
даты начала и конца работы (будет плюсом, если добавите в скобках время, в течении которого занимали должность);
название компании;
занимаемая позиция;
краткое описание проекта (по возможности со ссылкой), обязанностей, описание используемых технологий и достижений.
Если вы до этого работали не по специальности, попробуйте в последнем пункте описать какие-то важные навыки, которыми овладели в ходе работы и которые при этом важны в той позиции, на которую вы подаете резюме.
Если вы только выпустились из университета, попробуйте поразмышлять и написать об университетском опыте — наверняка вы занимались чем-то полезным на кафедре, состояли в какой-то университетской организации или с одногруппниками разрабатывали собственные проекты, занимались общественной деятельностью, вследствии чего освоили некоторые умения/навыки или просто получили опыт применения определенных программных или аппаратных средств.
С одной стороны, может показаться, будто опыт работы не по специальности совершенно не интересует работодателя. Отчасти это так, однако, грамотному рекрутеру/HR-менеджеру этот пункт (при правильном его описании) откроет вас как человека, который, имеет опыт работы и коммуникации внутри команды. А если вы еще и указали, что в процессе работы научились рационально распоряжаться своим временем и вовремя выполнять возложенные на вас поручения, это еще один плюсик вам.
Однако, если у вас уже есть определенный IT-бэкграунд, то стоит указывать лишь опыт в IT — какие самые удачные проекты, какой командой руководили (если руководили), какие обязанности выполняли, чего добились и т. д.
Образование (Education) — информация о высшем образовании. Указывайте название ВУЗа, факультет, специальность, полученную степень, годы обучения. Если получили красный диплом — упомяните об этом. Школу упоминать нет нужды. Разве что это ваша первая работа либо стажировка в IT и вы имеете за плечами какой-нибудь крутой технический лицей.
Если недавно окончили учебное заведение, можете написать тему вашей дипломной работы и средний балл за все время обучения.
Дополнительные навыки (Additional Skills) — информация про курсы, семинары, тренинги и другие обучающие программы, которые вы проходили самостоятельно. Тут же расскажите о ваших сертификатах, если они у вас имеются — здесь наступает их звездный час.
Знание языков (Knowledge Of Languages) — простой пункт. Составляется в виде “Язык — уровень владения языком”. Ключевым в данном разделе является знание английского, ведь попасть в IT без него практически нереально. Не будьте профаном и не пишите, например, “English — хороший”. Английский имеет несколько уровней владения: Elementary, Pre-Intermediate, Intermediate, Upper-Intermediate, Advanced, Proficiency, поэтому в данном примере уместно писать “English — Intermediate”. Можете добавить уточнение, мол, без проблем читаете техническую документацию, но разговорный инглиш еще подтягиваете. Допускается указать рядом с уровнем владения языком, что на данный момент вы посещаете соответствующие курсы, если это соответствует действительности.
Объективно оценивайте свой уровень владения английским — это очень легко проверяется в ходе собеседования.
Дополнительная информация (Additional Information) — сведения о вас, которыми вы хотели бы поделиться: ваши интересы, увлечения, либо определенные особенности — наличие маленького ребенка, родственника, за которым вам необходимо присматривать и т. д. В конце концов, на работу берут не шестеренку, которая будет частью бездушного механизма, а личность с определенными знаниями, профессиональными навыками, взглядами на жизнь и чертами характера.
Главное — умело подать информацию. Имеете маленького ребенка и много времени работали из дому — уточните, что данные условия научили вас стрессоустойчивости и многозадачности. Будьте на позитиве, извлекайте из, казалось бы, тупиковых ситуаций положительные стороны и демонстрируйте их тому, кто будет смотреть ваше резюме.
Общие советы
Требования к тексту.
Для резюме выбирайте 12-14 кегль и шрифт Arial либо Times New Roman — текст будет максимально читабелен и без раздражающих элементов. Для новичков оптимальный размер текста — до одной страницы А4, от опытных программистов ожидают текста побольше, но лучше не превышать 2-х страниц. Причем бо́льшую часть должны занимать ваши скиллы и опыт работы.
Сплошной текст читать сложно, утомительно и не интересно. Оформляйте резюме таким образом, чтоб оно было легким и само просилось в глаза. Для этого структурируйте информацию, используйте отступы, абзацы, линии и т. д. К примеру, тот же раздел “Опыт” можно изобразить в виде таблицы. Главное — сгруппировать информацию по блокам. Всё должно быть лаконично, аккуратно и читабельно.
Не забывайте о грамотности написанного текста. Перед отправкой делайте тщательную вычитку резюме — грамматические, орфографические и пунктуационные ошибки прекрасно портят мнение рекрутера о соискателе.
К слову о фото.
Его можно как добавлять, так и нет. Фотография должна быть хорошего качества, но не с вечеринки, шашлыков либо других мест повышенной концентрации отдыхающих. Также, на ней должно быть отчетливо видно ваше лицо. Если верить психологам, лучшее фото — на котором вы в позитивном настроении и с улыбкой. Подходящей фотографии нет? Тогда не добавляйте ее вовсе. В некоторых странах фото в резюме — табу по причине возможной дискриминации по половому, расовому либо иному признаку. Также, отсутствие изображения позволяет оценивать человека по его профессиональным и личностным качествам, а не по внешним данным.
Формат электронного резюме.
На рассмотрение рекрутеру необходимо присылать резюме в формате PDF. Это самый универсальный формат электронных документов, который беспроблемно открывается и читается на всех возможных устройствах.
Соответствие резюме вакансии.
Также, внимательно просматривайте требования к каждой должности и, если необходимо, вносите коррективы в написанное вами резюме таким образом, чтобы было видно, что данное резюме было составлено именно для соответствующей вакансии — и рекрутеру удобнее и вам больше шансов быть замеченным. Ведь резюме, которое рассылается всем без оглядки на требования и пожелания работодателей (резюме-спам) не вызывает симпатий и имеет большие шансы попасть в урну.
Резюме на английском.
Если вакансия составлена на английском языке, значит, работодатель однозначно хочет от кандидата англоязычное резюме. Даже если вакансия русскоязычная, а вы составили и прислали резюме на инглише, это будет солидным плюсом, ведь, как мы говорили ранее, данный язык в IT очень важен. Главное, не забывайте о грамотном написании. После составления резюме дайте его на проверку тому, кто хорошо знает английский.
Неформальность в резюме.
Интересный момент: в IT допускается неформальность в резюме программиста, к примеру — шутки. Однако, это хождение по очень тонкому льду. Если вы и собираетесь в каком-то месте показать остроту своего ума, делайте это умело и уместно, иначе будет только хуже. Но все же арсенал шуток лучше приберечь на само собеседование — там они помогут и виртуозно выйти из затруднительных положений, и зарядить всех позитивом.
Портфолио.
Как мы уже указали, в пункте “Контакты” стоит разместить ссылку на свой GitHub, где располагаются ваши проекты, которые и составляют ваше портфолио. Если вы новичок, там должны быть именно те проекты, которые вы разрабатывали самостоятельно (не содранные с ютуба или прочих ресурсов). Продемонстрируйте работодателю все свои навыки и умения в них. Дайте понять, какими технологиями и языками владеете.
Навигация по портфолио также должна быть интуитивно понятной и удобной.
Сопроводительное письмо.
В Украине практика написания сопроводительного письма не особо популярна, однако, правильное его составление может дать вам дополнительное преимущество перед другими кандидатами-конкурентами. Это письмо, которое дополняет резюме. Его цель — заинтересовать рекрутера/работодателя и создать хорошее первое впечатление о себе. Структура сопроводительного письма следующая:
Приветствие, обращение к работодателю.
Источник информации о вакансии.
Сведения, которые характеризуют вас как специалиста.
Демонстрация заинтересованности в вакансии.
Контактные данные.
Фривольностей здесь лучше не допускать — придерживайтесь официального стиля изложения.
Встаньте на место рекрутера/работодателя.
При составлении резюме время от времени абстрагируйтесь и смотрите на него с разных сторон. Нравится ли вам то, что написано? Есть ли последовательность и логичность в написанном? Что можно сократить? Как лучше выделить ту или иную способность / умение / качество / технологию? Подобная рефлексия поможет объективно рассматривать резюме и на выходе получить действительно качественный экземпляр.
Ресурсы для автогенерации резюме
Фишка двадцать первого века — повсеместная автоматизация различных рутинных процессов. Коснулась эта тенденция и сферы поиска работы. На данный момент существует множество сервисов, которые предоставляют услуги по созданию качественного резюме. Мы делим их на два типа: встроенные и независимые.
К первому типу относятся сервисы, которые находятся на сайтах поиска работы. Как пример, такая функциональность реализована на сайтах work.ua, grc.ua и т. д. Весь необходимый костяк резюме уже создан, ваша задача — грамотно заполнить разделы. Если вдруг где-то запутаетесь — каждый пункт содержит подсказки, что очень удобно.
Также, вы можете скачать созданное резюме, однако, оно не будет таким стильным и красочным, как то, которое предлагают ресурсы генерации “визитки” второго типа.
Независимые сервисы создания резюме — специализированные сайты, которые имеют множество инструментов для создания эффектного внешнего вида резюме. Вам необходимо только выбрать понравившийся шаблон, настроить его под себя и заполнить разделы. Расскажем о некоторых из них.
LinkedIn — социальная сеть для делового общения, которая ориентирована на поиск сотрудников и вакансий. При создании аккаунта вы указываете различные данные о себе: места учебы и работы, технологии и языки программирования, которыми владеете, дополнительную информацию о себе, фото и т. д. LinkedIn имеет встроенный инструмент генерации резюме исходя из информации, опубликованной в вашем профиле, однако, хорошо заполненный профиль уже в некотором роде является вашей визитной карточкой. И все же, рекрутеры будут его рассматривать лишь во вторую очередь в качестве прикрепленной ссылки в разделе резюме “Контакты”.
При этом LinkedIn обладает одной особенностью: в будущем, когда вы станете разработчиком уровня Middle+ и будете иметь широкую сеть знакомств на этом ресурсе (400+ человек), никакое резюме вам более не понадобится — рекрутеры будут сами вас находить и предлагать вакантные должности. А пока вы джуниор с нулевым опытом работы, LinkedIn не сможет заменить вам полноценное резюме.
Canva.com — сервис, позволяющий бесплатно создать стильное и привлекательное резюме при помощи сотен различных дизайнерских шаблонов на любой вкус. Выбираете один из них, настраиваете цвета, шрифты, фон и сам макет, а затем вносите вашу информацию и фото. Удобно и просто.
Cvmaker.com — бесплатный ресурс, который дает возможность создавать резюме, используя один из девяти классических шаблонов, отличающихся своей лаконичностью и отсутствием излишеств. Хороший вариант для поклонников легкого минимализма.
Также существует множество других сервисов создания резюме — используйте гугл и вы найдете для себя тот вариант, который вам идеально подойдет.
Ну а самой оригинальной и эффективной анкетой для работодателя может быть резюме фронтенд разработчика. Данный специалист по профессии разрабатывает веб-интерфейсы, а потому может реализовать своё CV в виде веб-сайта. Демонстрируете свои скиллы и одновременно подаёте необходимую информацию о себе – очень удобно и практично.
Итоги
Резюме разработчика — это пригласительное письмо на собеседование в IT-компанию, которое вы сами и составляете. Оно должно быть структурированным, информативным и при этом не содержать ничего лишнего. Самое главное — резюме должно произвести приятное впечатление на того, кто будет его просматривать, и принести желанное приглашение на собеседование. Пишите лаконично, избегайте воды, неточностей и неправды — обман все равно вскроется во время встречи. Откровенную ложь никто терпеть не станет. Прежде всего будьте честны с самим собой, объективно оценивая свои знания и способности. Заинтересовывайте при помощи креатива, нестандартного подхода — эти качества всегда ценятся нанимателями.
Резюме опытного программиста должно удерживать акцент на опыте и проектах, над которыми разработчик трудился: какие технологии были задействованы, какие обязанности выполнялись, какие результаты были достигнуты и т. д. Резюме начинающего программиста (junior) должно опираться больше на самостоятельно разработанные проекты, амбиции, личные качества и навыки соискателя, которые помогут ему развиваться в IT направлении.
Составлять резюме можете самостоятельно либо при помощи специализированных сервисов, которые помогут добавить эффектности и заметности вашему документу. Главное — не переборщить и все будет окей. Для дополнительного эффекта напишите хорошее сопроводительное письмо, которое поможет вам выделиться среди других кандидатов.
Следуйте нашим советам, и вы непременно преуспеете!
Желаем здоровья и успехов на вашем карьерном пути!
Оставайтесь на ITVDN!