Результати пошуку за запитом: mvc4 5
Читабельність програмного коду
Автор: Редакция ITVDN
Введение
Вам приходилось возвращаться к фрагменту кода, написанному год или месяц назад? Каково это было? Это было просто, или приходилось вникать в код исходя из заметок? Если у Вас не получается быстро разобраться в коде и Вы задаете себе вопрос: «Что же я тогда имел ввиду?» – Вы определенно делаете что-то не так. Скорее всего, Ваш код работает правильно. И Вы знали его вдоль и поперек, когда над ним работали. Почему же Вы не можете его вспомнить сейчас? Быть может, он не был написан достаточно доступно и не соответствовал стандартам машинного кода? В этой статье Вы найдете полезную информацию о том, как научиться писать доступный не только для себя, но и для остальных разработчиков код.
Пример использования стандарта оформления кода
Рассмотрим это на следующем примере метода в C#:
public string Transform(List<DateTime> s)
{
string d = null;
foreach (DateTime kc in s)
{
if (kc > DateTime.Now)
{
d = d + kc + "\n";
}
else
{
d = d + "Delayed\n";
}
}
return d;
}
Скорее всего, Вы не можете понять, какую функцию он выполняет и как его можно использовать. Но после короткой реконструкции кода мы получим:
public string GetText(List<DateTime> arrivalTimes)
{
var stringBuilder = new StringBuilder();
foreach (DateTime arrivalTime in arrivalTimes)
{
if (arrivalTime > DateTime.Now)
{
stringBuilder.AppendLine(arrivalTime.ToString());
}
else
{
stringBuilder.AppendLine("Delayed");
}
}
return stringBuilder.ToString();
}
Или если мы обратимся к оператору “?:”, мы получим:
public string GetText(List<DateTime> arrivalTimes)
{
var stringBuilder = new StringBuilder();
foreach (DateTime arrivalTime in arrivalTimes)
{
string message = arrivalTime > DateTime.Now ? arrivalTime.ToString() : "Delayed";
stringBuilder.AppendLine(message);
}
return stringBuilder.ToString();
}
Что произошло с кодом? Некоторые изменения сделали наш код более читабельным:
1. Имя метода получило более понятное название.
2. Мы изменили названия переменных:
1. “kc” изменена на arrivalTime,
2. “s” изменена на arrivalTimes,
3. “d” изменена на stringBuilder,
Это облегчит понимание того, за что отвечает каждая переменная и как она используется.
3. Скобки были стандартизированы.
4. Добавлены вкладки для читаемости, размещения и разметки в скобках.
5. Оператор “?:” был введен для того, чтобы сократить наш код до четырех строчек.
6. Добавлен класс StringBuilder, чтобы избежать конкатенации (“string” + “string”). Кто-то может возразить, что создание экземпляра StringBuilder будет замедлять метод из-за его распределения памяти. Но стоит помнить, что конкатенация струн создает много мусора в памяти, который вынужден чистить Garbage Collector. Считается, что ~ 5 непрерывных строк равны созданию реализации StringBuilder, так что если список состоит из пяти или более элементов, то производительность этого метода будет увеличена. А для больших коллекций этот метод будет работать в несколько раз быстрее.
Правильный способ составления кода
Давайте перейдем к другому примеру. Рассмотрим класс пользователя:
public class User
{
public bool HasConfirmedEmail { get; set; }
public bool HasActiveAccount { get; set; }
public bool IsLoggedIn { get; set; }
public bool HasPremiumAccount { get; set; }
public bool StatusAutoGenerated { get; set; }
public DateTime LastStatusChange { get; set; }
public bool SetStatus(string status)
{
// write to Data Base
return true;
}
}
Метод, отвечающий за обновление статуса пользователя, который должен проверить, все ли свойства в правильном состоянии:
public string UpdateStatus(string status, User user)
{
if (user.HasActiveAccount)
{
if (user.HasConfirmedEmail)
{
if (user.IsLoggedIn)
{
if (user.HasPremiumAccount)
{
if (!user.StatusAutoGenerated)
{
if (user.LastStatusChange < DateTime.Now.AddDays(-1))
{
if (user.SetStatus(status))
{
return "Updated";
}
}
}
}
}
}
}
return "Fail";
}
Хотя этот код более понятный, чем первый, представленный в этой статье, он все еще не соответствует стандартам программного кода. Вот пример того, как этот код можно сделать немного лучше:
const string OK = "Updated";
const string FAIL = "Fail";
public string UpdateStatus(string status, User user)
{
if (!CanUpdateStatus(user)) return FAIL;
if (!user.SetStatus(status)) return FAIL;
return OK;
}
public static bool CanUpdateStatus(User user)
{
if (!user.IsLoggedIn) return false;
if (!user.HasActiveAccount) return false;
if (!user.HasConfirmedEmail) return false;
if (!user.HasPremiumAccount) return false;
if (user.StatusAutoGenerated) return false;
if (!(user.LastStatusChange < DateTime.Now.AddDays(-1))) return false;
return true;
}
Основные изменения, внесенные в этот код, чтобы улучшить его читабельность:
Static method был создан, чтобы проверить возможность обновления статуса пользователя. Это делает метод UpdateStatus более понятным с первого взгляда. Кроме того, логика метода CanUpdateStatus может быть повторно использована в других частях системы, если они являются public и static.
Все " if " были заменены, чтобы уменьшить вложения. Количество скобок значительно уменьшилось, и код гораздо легче читать и компилировать. Еще одним преимуществом данного условия является его масштабируемость. Представьте себе, что класс User имеет теперь еще три свойства, которые должны быть проверены перед обновлением статуса – будут необходимы еще три "if" выписки. Теперь Вы можете добавить только три (не более) линии в методе CanUpdatedStatus.
Строки, которые представляют сообщения, были удалены из тела методов и были введены в постоянные переменные. Это помогает поддерживать код, потому что независимо от числа использований кода есть только одно место, где Вы должны изменить содержание сообщения, если это необходимо. Но, на самом деле, все тексты должны быть помещены в проект внешних ресурсов.
Источник: http://blog.goyello.com/2014/12/11/clean-code/
Як вибрати свою першу мову програмування: інструкція від HR
Автор: Вікторія Чабан
Якщо ти плануєш увійти в ІТ і не знаєш, з чого почати — ця стаття для тебе. Вибір першої мови програмування схожий на вибір першого велосипеда: важливо, щоб підходив саме тобі, а не був «наймоднішим». У ролі кар'єрного консультанта та HR я спираюсь на реальні кейси студентів і запити компаній. Ось чіткий та короткий план, який допоможе обрати першу мову грамотно.
🎯 Крок 1. Визнач свою цільову сферу
Запитай себе: що саме я хочу створювати? Це головний орієнтир.
🧑💻 FrontEnd (веб-сайти, інтерфейси) → JavaScript, далі можна додати TypeScript, React
📱 Мобільні додатки → Kotlin (Android), Swift (iOS), або React Native
📊 Аналітика, машинне навчання, ШІ → Python
🏦 Корпоративні рішення, банківські системи → C# / .NET або Java
🧪 QA Automation (автотести) → Python, Java, JavaScript
💡 Порада: якщо не визначився — обирай універсальну мову для старту, наприклад, Python або JavaScript.
📊 Крок 2. Перевір актуальність на ринку
За даними DOU та Djinni (станом на 2025 рік), топ-5 мов за кількістю вакансій:
JavaScript / TypeScript
Python
C#
Java
PHP
JavaScript домінує завдяки своїй універсальності (веб, мобайл, backend).
Python — лідер у сфері ШІ, автоматизації та наукових обчислень.
C# / .NET — улюблене рішення для бізнесу в Україні та Східній Європі.
Java — база для багатьох міжнародних проєктів, особливо у банках та ентерпрайз-продуктах.
🔍 Працювати з мовою, яка має стабільний попит — логічний крок для першої роботи.
👶 Крок 3. Почни з доступної до навчання
Навіть найкрутіша мова нічого не дасть, якщо ти не зможеш її зрозуміти. Ось три мови, які найкраще підходять для старту:
Python — простий синтаксис, читається як англійська, популярний у всіх сферах.
JavaScript — швидкий результат (можна написати код і одразу побачити на екрані).
C# — добре структурований, допомагає швидко зрозуміти основи ООП.
🧠 Якщо тебе лякає синтаксис або ти сумніваєшся — подивись безкоштовний вступний курс. На ITVDN є 3 безкоштовних уроки, які допомагають обрати напрям без ризику.
🔮 Крок 4. Дивись на перспективу
Програміст не вчить лише одну мову на все життя. Але перша створює базу. Після неї буде легше вивчити інші.
Якщо мрієш стати FullStack-розробником — комбінуй JavaScript (FrontEnd) + Node.js або C# (BackEnd).
Хочеш піти в Data Science — починай з Python, а далі додай бібліотеки як Pandas, NumPy, TensorFlow.
💡 Висновок
Не існує «ідеальної» мови для всіх. Вибір має бути практичним:
✅ під твої задачі
✅ з урахуванням попиту
✅ з урахуванням складності на старті
🎓 Обирай шлях, який не лише приведе до першої роботи, а й зробить навчання цікавим. І пам’ятай: важлива не мова, а твоє бажання вчитися!
CSS vs JavaScript: руйнуємо міфи
Автор: Редакция ITVDN
Введение
Многие разработчики заблуждаются, считая, что CSS – единственный способ работы с анимацией в WEB. CSS становится все более и более популярным, он считается самым надежным и удобным инструментом создания анимаций. Но это не означает, что он лучше, чем JavaScript.
В этой статье мы расскажем, почему лучше использовать JavaScript, а не CSS, а также разоблачим мифы, связанные с CSS.
1. JQuery
JavaScript и JQuery ошибочно объединяют. Анимации, разработанные с JavaScript – быстрые и динамичные, тогда как анимации JQuery – медленные. Причина в том, что несмотря на его мощные инструменты, JQuery не был создан для анимации.
2. Отсутствие управления вращением и позиционированием
Для выполнения анимации необходимо использовать элементы управления вращением и определением позиции. В CSS все эти функции содержатся в свойстве «transform». Это создает проблемы для уникальной анимации чего-либо через один общий элемент. Например, анимирование «rotation» и «scale» отдельно, с разными таймингами, возможно только с JavaScript, потому что он позволяет использовать различные функции, не поддерживаемые CSS. CSS удобно использовать только для простой анимации.
3. Производительность с Velocity и GSAP
Velocity и GSAP – наиболее популярные библиотеки JavaScript. Они работают без JQuery. Нет уменьшения производительности, так как эти библиотеки работают за пределами основных анимаций JQuery.
Velocity и GSAP можно применять даже, когда jQuery не используется на странице.
* Работа без JQuery * /
Velocity(element, { opacity: 0.4 }, 900); // Velocity
TweenMax.to(element, 1, { opacity: 0.4 }); // GSAP
В приведенном выше примере Вы видете, что velocity использует тот же синтаксис, даже когда JQuery не применяется. Он просто смещает все элементы в правильном направлении, чтобы создать пространство для целевых элементов.
4. GPU-фактор
Полностью оптимизированный код с GPU отлично подходит для выполнения различных задач, включая преобразование матриц и изменение прозрачности, поэтому все ведущие браузеры сначала перенаправляют такие задачи от CPU к GPU. Нужно разделять все анимационные элементы на разные слои GPU. Таким образом мы избавимся от необходимости вычислять каждый пиксель в каждой минуте. Можно сэкономить много времени, просто перемещая один пиксель за другой.
Обратите внимание: нет необходимости делать собственный слой для каждого элемента из-за ограничения видеопамяти GPU.
5. Быстрые анимации JavaScript
JavaScript обходит CSS в производительности и скорости. JavaScript достаточно универсальный, чтобы создать впечатляющую 3D демо-анимацию, которую Вы можете увидеть через WebGL. Он достаточно быстрый, чтобы построить мультимедийный тизер, разработанный с использованием Flash, или After Effects. С JavaScript это легко сделать с помощью canvas.
Вывод
Данная статья доказывает, что анимация JavaScript более быстрая, по сравнению с анимацией CSS. Но это не означает, что CSS не стоит использовать. Он хорошо подходит для простой анимации, но если Вы хотите сделать анимацию более гибкой, Вам лучше использовать JavaScript.
Источник: http://www.script-tutorials.com/css-vs-javascript-myths-fall-to-pieces/
Угода при розробці AngularJS програми
Автор: Антон Гончаров
Введение
Давайте рассмотрим практику написания AngularJS приложения. Приведенные ниже примеры помогут вам писать приложение правильно, чисто и более обдуманно. С помощью применения данной практики вы разработаете приложение, которое будет разделено на блоки, что в конечном итоге поможет строить правильную архитектуру приложения.
Итак, начнем.
1) Создавая новое приложение, старайтесь разделять модуль, контроллер, фабрику, вынося их в отдельные файлы. Этот прием имеет ряд приимуществ:
улучшается читаемость приложения
улучшается рефакторинг приложения
легче производить дебаггинг приложения
//плохая практика
angular
.module('app', ['ngRoute'])
.controller('myController', myController)
.factory('myFactory', myFactory);
function myController() { };
function myFactory() { };
//рекомендуется
//myapp.module.js – файл модуля
angular
.module('app', ['ngRoute']);
//mycontroller.js – файл контроллера
angular
.module('app')
.controller('myController', myController);
function myController() { };
//myfactory.js – файл фабрики
angular
.module('app')
.factory('myFactory', myFactory);
function myFactory() { };
2) Старайтесь оборачивать код в самовызывающиеся функции.
Это позволяет :
сохранить переменные от глобального объекта scope
предотвратить перетирание глобальных переменных (т.к. они локальны)
при минификации кода помогает избежать путаницы переменных
//плохая практика
angular
.module('app')
.factory('myfactory', myfactory);
function myfactory() { };
//рекомендуется
(function () {
'use strict';
angular
.module('app')
.factory('myfactory', myfactory);
function myfactory() { };
})();
3) Старайтесь придерживаться иерархии именования. Это поможет правильно структурировать приложение, что в итоге приведет к правильной архитектуре программы.
Избегайте создания модуля через переменную и используйте цепочный синтаксис (в виде цепочки)
//плохая практика
var app = angular.module('app', [
'ngAnimate',
'ngCookies',
'firebase'
]);
//рекомендуется
angular
.module('app', [
'ngAnimate',
'ngCookies',
'firebase'
]);
4) Используйте именованные функции. Код становится более читабельным и куда лучше тестируется.
//плохая практика
angular
.module('app')
.controller('mycontroller', function () { });
//рекомендуется (обратите внимание на контроллер он вынесен в отдельный файл
//от модуля)
//myapp.module.js – файл модуля
angular
.module('app', ['ngRoute']);
//mycontroller.js – файл контроллера
angular
.module('app')
.controller('myController', myController);
function myController() { };
5) Используйте controller as нотацию вместо просто controller. Она более читабельна, помогает не запутаться в коде
//плохая практика
<div ng-controller=”myController”>{{title}}div>
//используем
<div ng-controller=”myController as mycontroller”>{{mycontroller.name}}div>
6) Используйте слово vm(ViewModel) внутри контроллера вместо ключевого слова this. Это поможет избежать подмены контекста внутри функции.
//антипаттерн
function mycontroller () {
this.name = {};
this.deleteSome = function () {};
};
//паттерн
function mycontroller () {
var vm = this;
vm.name = {};
vm.deleteSome = function () {};
};
Это лишь базовые приемы, которые вы можете использовать в своей практике. Они помогут вам избежать некоторых проблем в вашей роботе и сделать код вашего приложения чище и понятнее. Желаю вам хорошего кода и светлых идей.
6 основних тенденцій, які будуть популярні у веб-розробці у 2015 році
Автор: Редакция ITVDN
Введение
Подошел к концу 2014 год и самое время спросить себя: «Какие тенденции будут преобладать в сфере веб-разработки в 2015 году?». Представляем вашему вниманию подборку трендов, которые, по нашему мнению, будут популярны в следующем году.
1. Адаптивный дизайн
Вместе с ростом популярности на планшеты начал расти спрос на адаптивный дизайн, сегодня это - неотъемлемая часть любого сайта. С помощью “Responsive Design” пользователь сможет спокойно просматривать Ваш сайт на любом девайсе, будь то PC или мобильный телефон. Зачем Вам адаптивный дизайн? Ответ простой, сейчас все больше пользователей просматривают новости через разные устройства с разным расширением экрана, поэтому выбор ресурса напрямую зависит от удобства его использования на всех носителях. Главный критерий выбора – ширина контента не должна превышать ширину экрана, иначе пользователю будет неудобно воспринимать информацию и он к вам больше не вернется.
2. Плоский дизайн (Flat Design)
Плоский дизайн начал набирать свою популярность после релиза Windows 8, благодаря компании Microsoft и ее Metro-стилю. Концепция плоского дизайна заключается в том, что двухмерные изображения не перегружают восприятие пользователя и уменьшают загруженность ресурса. В плоском дизайне отсутствуют лишние эффекты: тени, блики и градиенты, в противовес им выдвигаются яркие цветовые решения.
3. Карточный дизайн
Карточный дизайн — это способ подачи контента на страницах сайта. Каждая карточка содержит в себе определенную информацию, это дает ресурсу возможность концентрировать внимание пользователя и легко группировать содержимое сайта. Главное преимущество данного типа дизайна — это легкость взаимодействия пользователя с Вашим сайтом, ведь карточки легко можно опубликовать на своей странице в социальных сетях, сохранить в избранное или прокомментировать. Первопроходцами карточного дизайна считаются Pinterest и Google+. Благодаря своей отзывчивости и адаптивности все больше сайтов переходит на карточный дизайн.
4. Фоновые изображения и видео
За последнее время все большую популярность набирают ресурсы с широкоформатным изображением или видео на фоне, с небольшой цитатой поверх него. Этот прием идеально подходит для сайта-портфолио или сайта-визитки.
5. Рисованные иллюстрации и шрифты
Сайты с рисованной типографикой или иллюстрациями подкупают своей неповторимостью. Все больше сайтов начали использовать в своем дизайне элементы, разработанные вручную, именно под определенный проект. Эти детали делают сайт уникальным и запоминающимся, пользователю приятней пользоваться таким сайтом, он захочет рассказать о нем другу и обязательно вернется сам.
6. SVG иконки и анимации
SVG — это специальный язык разметки векторной графики, который разрабатывается W3C с 1999 года. Возможность создавать SVG изображения доступна в большинстве векторных редакторов: Illustrator, Corel Draw или Sketch. SVG-графика часто используется для создания иконок, они выглядят качественней и легко адаптируются под разные расширения экрана. И напоследок, с помощью SVG можно создавать анимированные иконки.
Источник: http://www.sevensignature.com/blog/articles/top-10-sign-things-come-2015-web-design-trends/
Найвищі зарплати в ІТ. Які спеціальності, країни та міста в лідерах?
Автор: Влад Сверчков
Тренди.
Найвищі зарплати Junior, Middle, Senior інженерів.
Найвищі зарплати керівної інженерної ланки.
Зарплати інших ІТ-фахівців.
Найвищі зарплати в США, Європі та решті світу.
Дані для рейтингу.
Levels.fyi – компанія, що базується в США – нещодавно опублікувала річний звіт за 2023 рік з переліком компаній, міст, тайтлів та різних трендів, які мають найбільші грошові винагороди. Відповідно до інформації на сайті компанії, аналітичні матеріали Levels.fyi дозволяють людям будувати кращі кар’єри в ІТ, відштовхуючись від чесних та прозорих зарплат. Давайте разом подивимось, які ІТ-спеціалісти в яких куточках світу отримують найбільше?
Тренди
Спочатку дізнаємось, як змінилися зарплати ІТ-спеціалістів порівняно з 2022 роком. На картинці нижче – медіанні ЗП в доларах США (сумарно за рік) для кожного сімейства спеціальностей.
Найвідчутніший приріст мають технічні менеджерські напрямки, повний штиль у Data Scientists, а невеликий від’ємний приріст – у розробників програмного забезпечення та дизайнерів продукту.
Найвищі зарплати Junior, Middle, Senior інженерів
Розглянемо річні компенсаційні медіани інженерів, які мають досвід від 0 до 15+ років в розробці. В кожному розділі буде ТОП-7 компаній, які найбільш щедро винагороджують своїх працівників в залежності від їхнього досвіду.
Укладачі рейтингу зазначають, що в поняття компенсації входять зарплата, акції та бонуси, отримані за минулий рік, але для простоти ми ототожнюємо “компенсацію” та “зарплату” в даній статті.
Інженер початкового рівня (від 0 до 2 років досвіду)
Рейтинг включає інженерів рівня Intern/Trainee/Junior. Зазвичай це випускники з невеликим або взагалі нульовим досвідом в галузі. Вони розвивають та підтримують компоненти низької та помірної складності, використовуючи настанови та підтримку членів команди з більшим досвідом.
Тут вам можуть бути знайомі Figma та LinkedIn. Перша компанія – всесвітньо відомий розробник онлайн-інструменту для дизайнерів, а друга – соціальна мережа для встановлення ділових зв’язків.
Engineer (від 2 до 5+ років досвіду)
Даний тайтл можна прирівняти до Middle. Сюди відносяться спеціалісти, які працюють над компонентами середньої та високої складності, і навіть здатні керувати невеликою командою або проєктом. Можуть менторити та консультувати менш досвідчених інженерів, проводити код-рев’ю, працювати над невеликими проєктами від початку до кінця.
Межі відповідальності такого фахівця різняться від команди до команди. В багатьох компаніях спеціалісти можуть працювати постійно на цьому рівні, не боячись, що їх звільнять за те, що вони не просуваються кар’єрною драбиною далі.
Senior Engineer (понад 5 років досвіду)
Сеньйори – від них очікується керування іншими та просування власних комплексних технічних ініціатив. Можуть виконувати візіонерські функції, визначаючи подальший вектор руху команди. Також здатні впливати на інші команди в межах компанії.
Їхня роль більше охоплює дизайнерські задачі, ніж реалізацію – залежно від розміру та очікувань компанії. Зазвичай таких спеціалістів в компанії не більше 30%.
У кого в ІТ найбільші ЗП? Рейтинг світу. Найвищі зарплати керівної інженерної ланки
Staff Engineer – інженер управлінського апарату
Ця посада передбачає 10+ років досвіду, і є досить бажаною порівняно з Junior, Middle та Senior. Менше 10% персоналу займають цю позицію, при цьому їхній вплив досить масштабний і простягається на різні організації.
Інженерам даної ланки довіряють важливі бізнес-проєкти та встановлення технічного бачення для однієї або декількох організацій.
Найбільшу винагороду отримують саме staff-інженери з OpenAI – компанії, що наприкінці 2021 року випустила в світ славнозвісний ChatGPT і нещодавно мала бурхливий скандал навколо звільнення гендиректора OpenAI Сема Альтмана.
Principal Engineer – головний інженер
Посада передбачає 15+ років досвіду, причому менше 3% персоналу сягають цього рівня. Головний інженер характерний для компаній середнього та великого розміру, а в маленьких зазвичай відсутній. Вплив Principal Engineer може поширюватися як на всю компанію, так і на індустрію. Від цих спеціалістів очікують повну автономію в роботі.
Аналітики рейтингу зазначають: даний тайтл властивий малому відсотку людей в компанії, а тому деякі компанії не мають інформації в достатній кількості, аби бути включеними в цей список.
Зарплати інших ІТ-фахівців. ІТ-компанії з найбільшими ЗП
Аналітики даного звіту розробили стандарт рівнів для менеджерських ролей та ролей індивідуального спеціаліста (individual contributor) в цьому році. Оскільки на початку 2023 у них не була встановлена система рівнів, вони вказують ТОП-5 компаній з найвищим рівнем компенсації, використовуючи медіанне значення в межах компанії для наведених нижче професійних категорій незалежно від рівня. Варто враховувати, що це найвищі медіани, і вони можуть не відображати весь ринок.
Software Engineering Manager
SE Manager може керувати однією або кількома командами інженерів, які створюють програмне забезпечення (ПЗ). Він комбінує технічні обов’язки з управлінськими і відповідає за:
створення сприятливого середовища для ефективної роботи Engineering-команди;
визначення структури та навантаження, яке покладається на кожного в команді;
трансляцію команді загального руху та цілей компанії;
контроль та підготовку технічного роадмапу разом з Tech Lead та інженерами для визначення інструментів, ресурсів та пріоритетів у роботі;
надання технічної експертизи;
вимірювання показників якості та ефективності команди;
тощо.
Product Manager
Product Manager орієнтований на стратегічне управління продуктом в цілому, включаючи стратегію продажів, ринковий аналіз і взаємодію з клієнтами. На відміну від SE Manager, даний фахівець досить далекий від технічної складової і натомість сконцентрований на досягненні бізнес-цілей.
Він фокусується на визначенні функціональності та властивостей продукту, які задовольняють потреби клієнтів, взаємодіє з усіма рівнями команди, включаючи розробників, маркетологів, дизайнерів і т. д.
Product Designer
Це НЕ UX/UI дизайнер. У Product Designer`а зміщено фокус з UX/UI на досягнення цілей бізнесу, продукту. Якщо “юікс-юай” займається безпосередньо створенням інтерфейсу (роль виконавця), то PD аналізує ринок користувачів, досліджує та визначає їхні потреби, на основі чого можна спроєктувати якісний інтерфейс, який приноситиме користувачеві максимально комфортний досвід, а власнику – аудиторію і прибутки (роль мудрого архітектора, дослідника).
Hardware Engineer
Важка артилерія від світу розробки. Ці спеціалісти займаються не програмним, а апаратним забезпеченням – “залізом”. Серед їхніх обов’язків: дизайн, розробка, тестування комп’ютерних систем та пристроїв, розробка схемотехнічних рішень та друкованих плат, покращення існуючих пристроїв (заміна компонентів, тестування тощо).
Data Scientist
Data Scientists працюють з великими обсягами даних і виконують збір, аналіз, структурування і подальшу візуалізацію інформації. Спочатку йде збір великої кількості невпорядкованих даних, а потім – їхнє перетворення у зручний формат, з яким далі працюють аналітики.
Найвищі зарплати в США, Європі та решті світу
В яких містах світу топові ЗП у галузі Software Engineering? Американські аналітики дають відповідь і на це питання.
Ситуація в США, Європі та світі загалом, відповідно:
До останньої картинки автори додають примітку: цей список включає лише одне місто з найвищою оплатою праці в кожній країні. Інші міста в межах країни також можуть мати високу зарплату, яка не відображена в цьому списку.
Дані для рейтингу
Головне джерело даних для аналітики – анонімні відгуки, які можна залишити у відповідній формі на сайті. Для цього треба надати наступну інформацію:
Розмір компенсації.
Інформація про рівні у компанії.
Бонуси від компанії.
У 2023 році компанія Levels.fyi отримала понад 200 000 заявок від тисяч компаній з усього світу.
Нещодавно ми досліджували рівень ЗП та кар’єрний шлях українських DevOps-спеціалістів та Embedded-розробників – переходьте за посиланнями, щоб дізнатись, наскільки цінується їхня праця.
Мій перший досвід перенесення .NET програми під .NET Core
Автор: Ben Emmett
Мой первый опыт переноса .NET приложения под .NET Core
Совсем недавно я портировал .NET 4.5.2 – приложение под .NET Core 2.0. Хочу сразу отметить, что эта статья не является гайдом, и тем более это не перечень того, что может во время процесса пойти «не так». Однако она призвана дать общее понятие операции, мои впечатления от перехода на Core – стандарт и вообще, а стоит ли это делать.
Приложение
Приложение, которое я портировал, импортирует и обрабатывает информацию от ресурса SurveyMonkey. Проект DataPersistence – это уровень для взаимодействия с базой данных, в моем случае – через Entity Framework 6.2. Логика взаимодействия с SurveyMonkeys и преобразования данных так же, как и различные администрирующие функции, помещены в библиотеке ImporterCore. Importer – это небольшое консольное приложение, которое инкапсулирует определенную функциональность из ImporterCore, позволяя запустить ее в качестве запланированной Windows-задачи. Проект Explorer является веб-приложением ASP.NET MVC 5 для анализа информации. Проект Tests (на диаграмме не представлен) построен с использованием nUnit3 и обновляет все проекты к 5 версии.
Кратко о процессе
Сам порт занял у меня около двух дней. В конце концов картинка была следующая:
Более 80 процентов усилий были затрачены на чтение блогов, логов ошибок и, конечно же, употребление кофе. Но только после всего этого я смог собой гордиться. Впрочем, если бы мне пришлось повторить порт снова, сейчас бы он занял у меня всего лишь одну четвертую от того времени, которое я потратил. Итак, касательно порта я могу сказать следующее:
Просто погуглите готовые решения и применяйте их до тех пор, пока все это дело не заработает снова.
Для всех компонентов, кроме, собственно говоря, самого веб-проекта, обновите csproj-файлы к более новому и упрощенному VS15-формату, который все еще поддерживает версию .NET 4.5.2. Я подумал, что лучше сделать это вручную, чем пересоздавать проекты с нуля.
Выгрузите все проекты из решения отдельно от DataPersistance, которая была в основании пирамиды приложения. Соберите для .NET Core – стандарта.
Обновите все пакеты библиотеки DataPersistence к последним версиям, поддерживаемым .NET Core. В некоторых исключительных случаях (наподобие работы с Entity Framework) полностью замените пакеты программ на .NET Core – аналоги (в нашем случае это будет Entity Framework Core).
Просмотрите все провальные билды и исправляйте все изменения api до тех пор, пока проект не скомпилировался.
Повторите шаги 2-4, добавляя дополнительные пакеты к приложению (по одному за раз).
Чтобы заставить заработать веб-проект после порта, мне пришлось бы столько всего фиксить и исправлять, что я просто предпочел создать новый пустой проект и просто скопировал папку контроллеров, моделей и представлений + различные статические файлы в виде JavaScript и CSS. Перенос сайта на новый проект вместо исправления старого было определенно правильным решением.
Запустите тесты. Запомните, что «построение того же самого, что и раньше» - это не то же, что «делать то же самое, что и раньше».
Исправьте баги шага 7.
Проведите мануальные тесты.
Упущения
К сожалению, далеко не все прошло так гладко, как хотелось бы. В основном замеченные ошибки были связаны с не совсем правильным выполнением шагов 7 и 8.
Несовместимые библиотеки
Дело в том, что ImporterCore зависела от библиотеки, которую я написал несколько лет назад и которая не поддерживает стандарт .NET Core. Она использует WebClient, который не существует в рамках .NET Core 1.0 / 1.1. К счастью, уже в версии 2.0 появилась поддержка WebClient, что значительно упростило обновление системы – нужно всего лишь внести некоторые изменения в csproj, AssemblyInfo и nuspec – файлы. Однако в случае, если вы все же сильно зависите от неподдерживаемых библиотек, порт приложения будет невозможен.
Entity Framework
Эта вещь заняла больше всего времени. Дело в том, что Entity Framework 6.2 в .NET Core не поддерживался, а его аналог – Entity Framework Core – значительно различается, что делает процесс порта достаточно трудоемким. А именно:
Маппинг
В конце концов EF Core мне понравился больше, чем EF 6.2. Здесь я привожу пример оригинального файла маппинга для оригинального объекта – Survey. Здесь Entity Framework получает информацию об именах колонок для всех свойств, названия таблицы, ключевом свойстве.
В EF Core при преобразовании свойства производится маппинг к соответствующей колонке (разве что вы не укажете другую логику маппинга). Также считается, что если в вашем классе вашей сущности есть свойство Id или SurveyId, это будет считаться свойством-ключом (опять же, если вы не укажете обратное). Так что мне удалось избежать написания около 1000 строк лишнего кода, что достаточно круто.
Большинство из оставшихся нюансов маппинга могут быть настроены через аннотации, композитные ключи и так далее.
Изменения в API
Здесь также есть целая серия замечательных изменений. К примеру, для конфигурирования «иностранных» ключей мы писали следующий код:
Однако в EF Core метод HasRequired() заменился на HasOne(). Также раньше для тестов приходилось использовать context.Database.Create() и context.Database.Delete(), которые в EF Core были заменены на context.Database.EnsureCreated() и context.Database.EnsureDeleted().
Наложение
Немного больше усилий пришлось приложить, чтобы настроить кастомную работу со значениями типа DateTime. Приложение всегда сохраняет значения типа DateTime в базе как Utc, но когда EF читает это, указанный тип не распознается, таким образом он маркируется как DateTimeKind.Unspecified, что в последствии может приводить к нежелательным последствиям. В рамках предыдущей версии EF я использовал возможности фичи – Intersection, которая, увы, больше не доступна в полной мере в раках EF Core. Впрочем, я смог решить проблему при помощи использования инструмента EntityMaterializerSource.
Лично меня сводит с ума то, что ни одна версия Entity Framework – технологии не поддерживает в нормальном виде работу с UTC – форматом.
Lazy Loading
Это было наибольшее разочарование: EF Core не поддерживает Lazy Loading. Да, в грядущей версии EF 2.1 эта опция должна появиться, но на данный момент решения не существует. В свое время я написал немного горькой правды о производительности Entity Framework, потому использование возможностей Lazy Loading было бы разумным решением. Отследить правильность работы с базой во время построения приложения невозможно. К счастью, при помощи некоторых тестов мне удалось вовремя заметить, что EF Core не использовал возможности Lazy Loading, но представьте себе, что было бы, если бы я этого не заметил и выпустил приложение в продакшн.
Конечно, решение использовать Eager Loading вместо Lazy Loading не стало концом света, но оно вынудило писать большее количество тестов, усложнило код (в основном из-за использования вложенных Include() и ThenInclude() - конструкций) и слегка замедлило работу. Возможно, с релизом EF Core 2.1 я все же верну все так, как было.
Конфигурация
В то время, как .NET Framework хранит все записи о конфигурации в виде xml в app.config / web.config – файлах, .NET Core использует appsettings.json. Лично мне это понравилось, но вместе с этим мне пришлось внести некоторые изменения.
Хостинг на IIS
Оригинальный веб-сайт Explorer развернут под IIS. ASP.NET Core использует Kestrel, который запускается в качестве отдельного от IIS – процесса. Вам необходимо установить .NET Core Windows Server Hosting Bundle, что позволяет Kestrel непосредственно работать с кодом, а IIS – отвечать за безопасность и некоторые задачи администрирования. Также необходимо настроить пул приложения для запуска неуправляемого кода.
К несчастью, деплой подобного в продакшн – сложный и трудоемкий процесс. Пришлось ждать помощи от дружественно настроенного сисадмина. Упс.
Вердикт
По сути, я не встретил ничего особо страшного. Только парочку незначительных багов, каждый из которых потребовал немного времени на устранение. Для отслеживания подобных багов я советую использовать Portability Analyzer, который значительно упростит вам работу.
Я портировал небольшое приложение – всего лишь 5 проектов с несколькими десятками тысяч строчек кода. Если я буду делать что-то подобное вновь, весь процесс должен занять у меня намного меньше времени, чем пара дней. А в целом перед портированием больших приложений я все же советую пока попрактиковаться на маленьких.
Вообще, если говорить о целесообразности перехода на стандарт .NET Core, я был вынужден это сделать только потому, что нам предстоит взаимодействовать с другими приложениями этого же стандарта. А так, безусловно, новая технология ASP.NET Core заслуживает своего внимания.
Автор перевода: Евгений Лукашук
Источник
Процедури та таймінг у відділі SEO
Автор: Андрій Афанасьєв
Введение
Всем привет! У меня давно созрела навязчивая мысль написать о том, какой является структура работы в техническом отделе SEO. “Почему именно такая тематика?” - спросите Вы. Это наболевшее. Иногда клиенты, да и просто люди, которые не занимаются всерьез данным продуктом, смотрят на весь процесс со стороны и думают: “Да это же просто дело. Взял проектик, денек-два оптимизировал сайт, ссылочек подкупил, всего делов. Может мне и самому SEO заняться?” Забавляет и интернет-пространство, например, рекламой с лозунгами наподобие: “Хватит платить сеошникам. Продвинь свой сайт самостоятельно!”. Это не может не веселить, если, конечно, не учитывать, что часть пользователей все-таки ведутся на подобные вещи.
Ну а если всерьез, то я скажу банальную вещь, что любая стоящая работа требует не менее качественного подхода. Любое интернет-агентство маленького, среднего или большого размаха разрабатывает и выстраивает свой процесс отработки клиентских проектов. В данной статье мы рассмотрим только работу технического отдела, потому что существует еще и аккаунтинг, и топ-менеджмент, которые тоже важны во взаимодействии компании и клиента. Но там “своя кухня” и она несколько отличается от технической.
Идем дальше…
Как известно, для того, чтобы построить качественный и надежный дом, нужно начать с фундамента. Так вот, в отделе SEO таковым является регламент процедур и тайминга. Это путеводитель как для руководителя отдела, так и для остальных членов команды. Зачем он нужен?
Отвечаю. У каждой компании в отработке находится много текущих + еженедельный поток новых клиентов, которые требуют в разы больше внимания, чем текущие. Когда я приведу пример технологии Abweb, Вы поймете критическую важность этого регламента. Если одновременно ведется работа по десяткам проектов, просто физически невозможно держать все в голове. Необходимо иметь универсальный план действий, который разбит на множество подзадач и переносить его в проекцию каждого проекта.
Ну, теперь конкретно о процессах
Для того, чтобы всю информацию было проще воспринять, я четко структурирую все процессы в виде двух таблиц. Как правило, процесс продвижения можно условно поделить на 2 глобальных этапа: внутренняя и внешняя оптимизация. Поэтому и процедуры для них разные.
Внутренняя оптимизация (1-й месяц)
Процедура
Старт выполнения
Тайминг
Проверка доступов от клиента (админка, FTP, хостинг)
1-й день работ
5 рабочих дней
Создание папки проекта и файла проекта в CRM с семантикой и основными доступами
1-й день работ
Анализ проекта, составление технического задания по внутренней оптимизации для программиста и техническое задание для копирайтера
2-й день работ
Отправка сформированных технических заданий аккаунт-менеджеру, который ведет проект.
В тот же день, когда составлено ТЗ, но не позднее 5-ого рабочего дня со старта проекта
Внедрение правок на тестовом домене.
В день, когда аккаунт-менеджер дал сигнал, что ТЗ на оптимизацию утверждено клиентом.
5 рабочих дней (4 дня реализация + 1 день на исправление багов по программной части)
Написание текстов для целевых страниц.
В день, когда аккаунт-менеджер дал сигнал, что ТЗ на тексты утверждено клиентом.
Отправка выполненного ТЗ по оптимизации на тестовом домене аккаунт-менеджеру.
В день, когда ТЗ было полностью внедрено и проверено.
1 рабочий день
Отправка написанных текстов аккаунт-менеджеру.
В день, когда тексты были полностью написаны и проверены.
Перенос выполненных правок на основной домен.
В день, когда аккаунт-менеджер дал сигнал, что ТЗ на тестовом утверждено клиентом.
2 рабочих дня
Размещение текстов.
В день, когда аккаунт-менеджер дал сигнал, что клиент утвердил тексты.
3 рабочих дня
Тестирование основной функциональности сайта после внесенных правок (форм заказа, авторизация, регистрация, добавление контента и его сохранение и т.д.) + исправление багов, если они есть
В день, когда все правки по внутренней оптимизации были перенесены на основной домен.
2 рабочих дня
Отправка сайта и целевых страниц на принудительную переиндексацию поисковыми системами для скорейшего индексирования ПС
В день, когда все правки по внутренней оптимизации были перенесены на основной домен + протестирован основной функционал
1 рабочий день
Добавление сайта в систему мониторинга для отслеживания позиций.
Когда все внедрено, отправлено на переиндексацию.
Итого примерно
19 рабочих дней
Ситуация выглядит таким образом, что за 16 рабочих дней (условно 3 рабочих недели) вся оптимизация должна быть внесена на основной версии сайта. 1 рабочая неделя отводится на тестирование выполненных правок, переиндексацию сайта, мониторинг динамики по позициям и составления отчета по всей проделанной работе.
Обращаю внимание, что тут предлагается такой подход, в котором сначала все внедряется на тестовой копии (которую обязательно нужно закрыть от индексации), демонстрируется и согласовывается с клиентом и, если все OK, переносится на основной домен. Я склонен считать, что это процесс затратный по времени, но зато безопасный!
Переходим ко второму и последующим месяцам.
Второй и дальнейшие месяцы плюс-минус похожи в плане выполняемых процессов.
Внешняя оптимизация (2-й и последующие месяцы)
Процедура
Старт выполнения
Тайминг
Планирование и составление ссылочной стратегии в виде ТЗ со списком закупаемых анкоров.
После получения оплаты
3 рабочих дня
Регистрация аккаунтов для закупки ссылок по проекту
1 этап закупки ссылок
На 4-й рабочий день
2 рабочих дня
Пополнение ссылочного аккаунта для 1 этапа
Плановая проверка сайта на предмет внутренней оптимизации/составление ТЗ по дооптимизации/отправка аккаунт-менеджеру на утверждение
12-й рабочий день
2 рабочих дня
Внедрение правок по дооптимизации на основании предыдущего пункта
В день, когда аккаунт-менеджер дал сигнал, что ТЗ на дооптимизацию утверждено клиентом.
4 рабочих дня
Пополнение ссылочного аккаунта для 2 этапа
14-й рабочий день
2 рабочих дня
2 этап закупки ссылок
Модерация ссылочных бирж
1 раз в 2 рабочих дня
11 рабочих дней
Наполнение ТЗ на ссылки списком доноров, откуда куплены ссылки
За день до составления и отправления отчета аккаунт-менеджером.
1 рабочий день
Итого примерно
22 рабочих дня
Выше приведена таблица со всеми процедурами и ориентировочными дедлайнами по каждому из них.
Хочу сделать акцент на том, что весь этот грандиозный план действий должен быть ориентиром, но всегда бывают исключения. Сроки реализации задач часто зависят от сложности и объема работ по проекту, оперативности клиента по согласованиям технических заданий, текстов и внесенных правок. Могут также вклиниваться и форс-мажорные задачи, которых мы, как правило, не ожидаем. К таким нюансам нужно быть морально готовым и все равно максимально выстроить процессы под нужные дедлайны.
Достаточно ли этого?
Буду честен. Конечно, нет. Недостаточно лишь прописать процедуры. Чтобы все было “в ажуре”, Вам и нам нужны:
Квалифицированные и перспективные ребята, которые будут закрывать все вопросы и задачи, которые расписаны выше (SEO-специалисты, копирайтеры, программисты и т.д.);
Календарные планы по процессам. Например, календарный план по закупке ссылочной массы на каждый месяц, который позволит не запутаться в большом потоке, когда что закупать;
Правильная постановка задач друг другу в худшем случае с помощью блокнота, а в лучшем - CRM-систем или других программ для фиксирования задач и планирования;
Высокая степень самоорганизованности и четко выстроенный тайм-менеджмент у каждого сотрудника;
Регулярное проведение планерок.
Я с удовольствием поделился с Вами прототипом своего видения по выстраиванию процессов в отделе производства SEO. Буду рад услышать замечания и положительные отзывы. На сегодня пока все;)
Пріоритет операторів у JavaScript (частина 1)
Автор: Олександр Марченко
Введение
В данной статье мы познакомимся со стандартными операторами и их применением в языке программирования JavaScript для работы с переменными и со значениями.
Сперва познакомимся со специфической терминологией, которая используется при работе с операторами.Большинство операторов обозначаются символами пунктуации, такими как =, +, - и другими. Некоторые – специальными ключевыми словами, к примеру, delete и new. Но, как знаки пунктуации, так и ключевые слова обозначают обычные операторы, просто используют для этого разный синтаксис.
Оператор присвоения
Операнд – то, к чему будет применен оператор, или порой можно встретить название: «аргумент оператора».
Оператор присваивания выглядит как знак равенства = :
var a = 1, b = 2;
В данной строке переменной "a" было присвоено значение 1, а переменной b – значение 2.
var a = a + 2;
В этой строке переменной "a" было присвоено ее значение, увеличенной на 2. Иначе говоря, сперва выполнится операция сложения текущего значения переменной a, результат которого будет пере-присвоен переменной a.
Полезной особенностью данного оператора является использование его по цепочке:
var a, b, c;
a = b = c = 2 + 3;
В результате работы последней строки всем трем переменным будет присвоено значение 5.
Арифметические операторы
Арифметические операторы используются для определения простейших математических операций над операндами, в качестве которых могут выступать как значения, так и переменные: плюс + , минус - , умножить * , поделить / , деление по модулю (определение остатка от деления) %.
Большинство JavaScript-операторов работают с двумя операндами, следовательно, способны два простых выражения объединить в одно более сложное. Но JavaScript поддерживает несколько унарных операторов, которые преобразуют только одно выражение в другое, более сложное.
Таким оператором является унарный минус, который изменяет знак числа на противоположный. В таком случае оператор «минус» в выражении -1 представляет собой унарный оператор и выполняет смену знака у своего единственного операнда 1.
<script type="text/javascript">
var x = 1;
document.write(-x + " ");
document.write(-(-x) + " ");
document.write(-(x + 4) + " ");
script>
Унарный плюс, используемый в качестве арифметического оператора, не выполняет каких-либо действий:
<script type="text/javascript">
document.write(+1);
document.write(" ");
document.write(+(1 - 2));
script>
Более распространенным применением унарного плюса является преобразование значения в число.
В случае объединения двух выражений в одно более сложное используются бинарные операторы, иначе говоря, бинарным называют оператор, который применяется к двум операндам, к примеру, если оператор плюс будет стоять между двумя числами, он будет представлен в своей бинарной форме:
<script type="text/javascript">
var a = 1, b = 2;
document.write(a + b + " ");
document.write(b + a + " ");
script>
Кроме того, если у нас есть две переменные со строковыми значениями, бинарный плюс сложит эти строки. произведя конкатенацию, а применение унарного плюса к каждой из переменных произведет преобразование их значений к числу.
var a = "2";
var b = "3";
alert(a + b); // "23", произошла конкатенация строк
alert(+a + b); // "23", второй операнд - всё ещё стоковая переменная
alert(+a + +b); // 5, число, поскольку оба операнда предварительно преобразованы в числа ((+a) + (+a))
В то же время, если использовать оператор «минус», мы получим другие результаты:
var a = "2";
var b = "3";
alert(a - b); // -1, произошло неявное преобразование типов
Таким образом, мы подошли к тому, что создавая JavaScript-выражения, важно обращать внимание на типы данных, передаваемых операторам, и, как следствие, на типы данных, которые они возвращают. Стоит отметить, что различные операторы требуют, чтобы операнды, с которыми они работают, возвращали значения только определенного типа. Так, нельзя выполнить умножение строк, поэтому выражение var a = "text1" * "text2"; не является допустимым и приведет к ошибке. В то же время, выражение var a = "2" * "3"; вполне допустимо, потому что интерпретатор JavaScript будет пытаться по мере возможностей преобразовать выражение в требуемый тип данных, в нашем случае из строкового типа в числовой.
Познакомимся с работой операторов умножения и деления на простом примере. В данном случае мы используем бинарные формы операторов, поскольку они взаимодействуют с двумя операндами:
<script type="text/javascript">
document.write("2" / 2 + " "); // 1, произойдет неявное преобразование строки в число
document.write(((2 + 2) * 6) / "12" + " "); // 2, произойдет неявное преобразование строки в число
document.write(12 * 7 / 2 + " "); // 42
document.write(17 % 7 + " "); // 3, возвращаем остаток от целочисленного деления
document.write(21 / 3 - 1 + " "); // 6, наблюдаем правильный порядок выполнения операций: сперва деление, затем нахождение разницы
script>
Если с работой операторов +, -, *, / в самом простом их применении мы были знакомы еще из младшей школы, то с оператором % стоит познакомиться детальней. Оператор деления по модулю % вычисляет остаток, получаемый при целочисленном делении первого операнда на второй, которые в курсе школьной математики именовались как делимое и делитель соответственно, а в результате самого деления мы получали частное и остаток от деления. Деление по модулю подразумевает возвращение остатка от деления.
Например, выражение var a = 190 % 27; будет выполнено следующим образом:
Оператор деления по модулю зачастую применяют к целочисленным операндам, но он корректно работает и с вещественными значениями. Так, в итоге выполнения выражения var a = -6.3 % 3; переменной a будет присвоено значение -0.3.
Кроме этого, стоит отметить следующие особенности вычислений в JavaScript:
<script type="text/javascript">
var a = 4,
b = true;
c = undefined,
d = Infinity,
e = 0,
res = undefined;
res = a * d;
document.write(res + " "); // Infinity, умножение числа на бесконечность возвращает бесконечность
res = a + b;
document.write(res + " "); // 5, true преобразовывается в 1 и производится операция сложения
res = a / e;
document.write(res + " "); // Infinity, деление числа на ноль возвращает бесконечность
res = a * c;
document.write(res + " "); // NaN, умножение числа на неопределенный тип данных, вернет сигнализацию об ошибке в виде NaN - Not a Number
script>
В дальнейшем мы познакомимся с такими операторами как инкремент/декремент, операторами сравнения, равенства и идентичности, которые будут часто использоваться в написании клиентских сценариев c использованием языка JavaScript.
250+ питань з Java для Junior, Middle, Senior
Автор: Влад Сверчков
Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 1 февраля 2021 года. Оригинальная версия на украинском языке доступна по ссылке
Редакция DOU.ua обратилась к СТО и опытным специалистам, которые проводят интервью по направлению Java, о том, какие теоретические вопросы задают и какие задачи и задания предлагают решить кандидатам. Ведь, готовясь к техническому собеседованию, важно иметь четкий план. На основе полученных ответов составлена эта подборка вопросов с градацией по уровню специалиста. Надеемся, этот список вопросов станет своеобразным путеводителем, который поможет получить желаемую должность.
Junior
Общие
1. Какие знаете шаблоны проектирования? Расскажите о двух шаблонах, которые использовали в работе.
Java Core
2. Какие есть типы данных в Java?
3. Чем отличается объект от примитивных типов данных?
4. В чем разница передачи параметров по ссылке и по значению?
5. Что такое JVM, JDK, JRE?
6. Зачем используют JVM?
7. Что такое bytecode?
8. Какие признаки JavaBean?
9. Что такое OutOfMemoryError?
10. Что такое стектрейс? Как его получить?
11. Назовите все методы класса object.
12. В чем отличие между try-with-resources и try-catch-finally при работе с ресурсами?
13. Что такое конструкторы? Какие типы знаете?
14. Что такое побитовые операции?
15. Объекты каких стандартных классов immutable в Java?
16. Дайте краткую характеристику immutable object. Зачем они нужны?
17. Как создать immutable object?
18. Какие преимущества immutable object перед обычными объектами?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Стартовый (урок 1, урок 2, урок 5), Java Базовый (урок 1, урок 2, урок 8, урок 9).
ООП
19. Что такое ООП? Назовите принципы с примерами.
20. В чем преимущества ООП перед процедурным программированием?
21. В чем заключается главная особенность ООП?
22. Расскажите, какие преимущества мы получаем при использовании ООП?
23. Расскажите, какие есть недостатки в ООП?
24. Расскажите о принципе наследования в ООП? Зачем он нужен?
25. Дайте определение принципа полиморфизма в ООП? Как работает полиморфизм?
26. Что такое статический и динамический полиморфизм?
27. Дайте определение принципа абстракции в ООП.
28. Какие элементы языка отвечают за инкапсуляцию?
29. Какие элементы языка отвечают за наследование?
30. Какие элементы языка отвечают за полиморфизм?
31. Что такое SOLID? Приведите примеры.
32. Что такое перегрузки (overloading) метода?
33. Что такое переопределение (override) метода?
34. Что такое класс, объект, интерфейс?
35. Что такое класс POJO? Приведите пример такого класса.
36. Какие элементы могут содержать класс?
37. Дайте определение объекта.
38. Расскажите о наследовании в Java. Какие особенности использования ключевого слова super?
39. Что такое сигнатура метода? Приведите примеры правильных и неправильных сигнатур.
40. Можно ли в конструкторе применять return?
41. Можно ли в конструкторе выкинуть исключение (exception)?
42. Из каких элементов состоит заголовок класса? Напишите пример.
43. Из каких элементов состоит заголовок метода? Напишите пример.
44. Создайте в объекте-наследнике конструктор по умолчанию, если в базовом классе он не определен (но определен другой конструктор).
45. Когда применяется ключевое слово this?
46. Что такое инициализатор?
47. Для наследования класса public class Child extends Parent напишите порядок инициализации объекта.
48. Какие знаете отношения между классами (объектами)?
49. Какие ассоциативные связи между объектами вы знаете?
50. Что такое модификаторы доступа в Java? Назовите их. Для чего используются?
51. Назовите основную особенность статических переменных и методов.
52. Какие основные ограничения действуют на статические переменные и методы?
53. Что означает ключевое слово static? Может ли статический метод быть переопределенным или перегруженным?
54. Может ли метод быть статическим и абстрактным одновременно?
55. Можно ли использовать статические методы внутри обычных? Наоборот? Почему?
56. Что означает ключевое слово final?
57. Что такое abstract? Абстрактный класс? Абстрактный метод?
58. Что такое interface? Может ли быть final interface?
59. В чем разница между абстрактным классом и интерфейсом в Java?
60. Где можно инициализировать статические поля?
61. Что такое анонимные классы?
62. Что такое примитивные классы?
63. Что такое класс «обертка» (wrapper)?
64. Что такое Nested class? Когда используется?
65. Какие модификаторы доступа могут быть у класса?
Ответы на некоторые из этих вопросов вы можете найти в видео курсах Java Базовый (урок 1-4, урок 6, урок 7, урок 9), SOLID принципы в Java.
Библиотеки и стандарты
67. Что такое Hibernate? В чем разница между JPA i Hibernate?
68. Что такое каскадность? Как она используется в Hibernate?
69. Может ли entity-класс быть абстрактным классом?
70. Что такое entity manager? За что отвечает?
71. Что такое класс Assert? Зачем и как его использовать?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе JDBC & Hibernate.
String
72. Дайте характеристику String в Java.
73. Какие есть способы создания объекта String? Где он создается?
74. Как сравнить две строки в Java и/или отсортировать их?
75. Предложите алгоритм преобразования строки в знак. Напишите соответствующий код.
76. Как превратить строку в массив байтов и обратно? Напишите соответствующий код.
77. Что такое строковый пул и зачем он нужен?
78. Какие GOF-шаблоны применяются в строковом пуле?
79. Как разделить строку на части? Напишите соответствующий код.
80. Почему массив символов лучше, чем строка для хранения пароля?
81. Какая разница между String, StringBuffer и StringBuilder?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 5).
Enum
82. Дайте краткую характеристику Enum в Java.
83. Может ли Enum реализовывать (implement) интерфейс?
84. Может ли Enum расширить (extends) класс?
85. Можно ли создать Enum без экземпляров объектов?
86. Можем ли мы переопределить метод toString() для Enum?
87. Что будет, если не будем переопределять метод toString() для Enum?
88. Можем ли мы указать конструктор внутри Enum?
89. В чем разница между == и equals()?
90. Что делает метод ordinal() в Enum?
91. Можно ли использовать Enum с TreeSet или TreeMap в Java?
92. Как связаны методы ordinal() и compareTo() в Enum?
93. Напишите пример Enum.
94. Можно ли использовать Enum в switch case?
95. Как получить все имеющиеся значения в экземпляре Enum?
Ответы на некоторые из этих вопросов вы можете найти в видео курсах Java Базовый (урок 7), Java Углублённый (Урок 3).
Stream API
96. Что такое Stream в Java?
97. Назовите основные свойства транзакций.
98. Какие есть уровни изоляции транзакций?
99. Какая разница между Statement и PreparedStatement?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 15).
Collections
100. Расскажите об итераторах и об их применении.
101. Какая иерархия коллекций в Java Collection Framework?
102. Какое внутреннее строение ArrayList?
103. Какое внутреннее строение LinkedList?
104. Какое внутреннее строение HashMap?
105. Чем отличается ArrayList от LinkedList?
106. Чем отличается ArrayList от HashSet?
107. Зачем в Java такое многообразие имплементации динамического массива?
108. Зачем в Java такое многообразие имплементации key-value storage?
109. Как отсортировать коллекцию элементов?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый (урок 5), Java Углублённый (урок 3, урок 15).
Class Object. Equals and HashCode
110. Дайте краткую характеристику class object в Java.
111. Для чего используют Equals and HashCode в Java?
112. Расскажите о контракте между Equals and HashCode в Java?
113. Какие условия выдвигаются касательно переопределения соглашения при переопределении Equals?
114. Что будет, если не переопределить Equals and HashCode?
115. Какие значения мы получим, если у нас не перераспределены Equals and HashCode?
116. Почему симметричность выполняется, только если x.equals(y) возвращает true?
117. Что такое коллизия в HashCode? Как с ней бороться?
118. Что будет, если элемент, участвующий в контракте с HashCode, меняет свое значение?
119. Напишите методы Equals and HashCode для класса Student, который состоит из полей String name и int age.
120. В чем разница применения if (obj instanceof Student) и if (getClass() == obj.getClass())?
121. Дайте краткую характеристику метода clone().
122. В чем заключается особенность работы метода clone() с полями объекта типа-ссылки?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый (урок 9).
Exceptions
123. Дайте определение понятию exception (исключительная ситуация).
124. Какие знаете особенности использования оператора try ... catch?
125. В чем разница между error и exception?
126. Какая разница между checked и unchecked, exception, throw, throws.
127. Какой есть иерархия исключений?
128. Что такое checked и unchecked exception?
129. Нужно ли проверять checked exception?
130. О чем говорит и как использовать ключевое слово throws?
131. Какие возможные способы обработки исключений вы знаете?
132. Напишите пример перехвата и обработки исключения в блоке try-catch метода.
133. Напишите пример перехвата и обработки исключения в секции throws-метода и передачи вызывающему методу.
134. Напишите пример перехвата и обработки исключения с использованием собственных исключений.
135. Какие есть правила для проверки исключений при наследовании?
136. Могли бы ли вы написать код, если блок finally не будет выполнен?
137. Напишите пример обработки нескольких исключений в одном блоке catch.
138. Какой оператор позволяет принудительно выбросить исключение? Напишите пример.
139. Может ли метод main выбросить throws-исключение? Если да - куда передаст?
140. Напишите пример try with resources.
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый (урок 8).
Многопоточность
141. Какие средства для работы с многопоточностью знаете?
142. Что такое процесс и поток? Чем отличается процесс от потока?
143. Расскажите о синхронизации между потоками. Для чего используют методы wait(), notify() - notifyAll(), join()?
144. Как остановить поток?
145. Как между потоками обмениваться данными?
146. В чем заключается отличие класса Thread от интерфейса Runnable?
147. Есть потоки Т1, Т2 и Т3. Как реализовать их последовательное выполнение?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 13, урок 14).
Практические задания
148. Matrix Diagonal Sum (задача с Leetcode).
149. Move Zeroes (задача с Leetcode).
150. Дан List <String> names. Удалите первую букву из каждого имени и верните отсортированный список.
151. Перевернуть массив.
152. Проверить, является ли строка палиндромом.
153. Написать простой алгоритм сортировки (Bubble, Selection или Shuttle). Как его можно улучшить?
154. Напишите алгоритм (последовательность действий) составления литерала типа int и литералов типа byte. Объясните, что происходит с памятью.
Middle
Общие
1. В чем преимущества и недостатки ООП, если сравнивать с процедурным/функциональным программированием?
2. Чем отличается агрегация от композиции?
3. Какие паттерны GoF вы использовали на практике? Приведите примеры.
4. Что такое прокси-объект? Приведите примеры.
5. Какие нововведения анонсировано в Java 8?
6. Что такое High Cohesion и Low Coupling? Приведите примеры.
Лучше всего тема шаблонов в Java раскрыта в видео курсе Паттерны проектирования в Java.
ООП
7. Каким образом можно реализовать множественное наследование в Java?
8. Какая разница между методами final, finally и finalize()?
Java Core
9. В чем разница между статическим и динамическим связыванием в Java?
10. Можно ли использовать private или protected переменные в interface?
11. Что такое Classloader и для чего используется?
12. Что такое Run-Time Data Areas?
13. Что такое immutable object?
14. В чем особенность класса String?
15. Что такое ковариантность типов?
16. Какие есть методы в классе Object?
17. Приведите примеры удачного и неудачного использования Optional.
18. Можно ли объявлять main method как final?
19. Можно ли импортировать те же самые package/class дважды? Какие последствия?
20. Что такое Casting? Когда можем получить исключение ClassCastException?
21. Почему современные фреймворки используют в основном только unchecked exceptions?
22. Что такое static import?
23. Какая связь между методами hashCode() и equals()?
24. Когда используют BufferedInputStream и BufferedOutputStream классы?
25. Какая разница между классами java.util.Collection и java.util.Collections?
26. Какая разница между Enumeration и Iterator?
27. В чем разница между итераторами fail-fast и fail-safe?
28. Зачем нужен модификатор transient?
29. Как влияют на сериализацию модификаторы static и final?
30. Какие особенности использования интерфейса Cloneable?
31. Какие особенности использования интерфейса AutoCloseable?
32. Что такое FunctionInterface и чем он отличается от обычного интерфейса?
33. Что такое Atomic types и зачем они нужны?
34. Что такое Happens-before? Какие особенности использования ключевого слова volatile?
35. Расскажите о Heap и Stack память в Java. В чем разница между ними? Где хранятся примитивы?
36. Чем отличается stack от heap памяти? Когда и какая область памяти резервируется? Зачем такое разделение нужно?
37. Какие принципы работы и области памяти Garbage Collector?
38. Как работает Garbage Collector? Расскажите о Reference counting и Tracing.
39. Расскажите о механизме работы autoboxing в Java.
40. Как реализована сериализация в Java? Где мы можем ее увидеть?
41. Расскажите, в чем разница между WeakReference и SoftReference?
42. Что такое generics? Для чего они нужны? Какую проблему решают?
43. Что такое PECS и как используется? Приведите примеры.
44. Зачем на практике могут понадобиться immutable объекты?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый и Java Углублённый.
Библиотеки и инструменты
45. Чем полезны инструменты Maven, Ant, Gradle?
46. Что такое Unit Tests? Чем класс JUnit.Assert отличается от ключевого слова assert?
47. Что такое и зачем нужен Spring core? Раскройте понятие Inversion of Control и Dependency Injection.
48. Как «под капотом» работает @Transactional?
49. Как «под капотом» работает Spring?
50. Что такое и зачем нужен Hibernate? Раскройте понятие ORM.
51. Что такое и когда возникает LazyLoadingException?
52. Как «под капотом» работает Hibernate? Как бы вы написали собственный Hibernate?
Ответы на некоторые из этих вопросов вы можете найти в видео курсах JDBC & Hibernate, Unit тестирование в Java с JUnit, Spring, Spring MVC.
Многопоточность
53. Какие преимущества и недостатки использования многопоточности?
54. Расскажите о четырех способах работы со многими потоками и чем отличается wait ... notify ... notifyAll от synchronized? От Future?
55. Что такое и зачем нужен ThreadLocal?
56. В чем разница между Thread.sleep() и Thread.yield()?
57. Как работает Thread.join()?
58. Что такое deadlock?
59. Что такое race condition?
60. Для чего использовать volatile, synchronized, transient, native?
61. Расскажите о приоритетах потоков.
62. Что такое потоки-демоны и для чего их устанавливать?
63. Почему нежелательно использовать Thread.stop()?
64. Как реализовать пул потоков?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 13, урок 14).
Collections
65. Чем отличается List от Set?
66. В чем разница между HashSet, LinkedHashSet и TreeSet?
67. Какая внутренняя структура HashMap?
68. Какое время поиска элемента в ArrayList, HashSet?
69. Как реализовать свой Stack?
70. Как работает метод put в HashMap? Почему нам нужно высчитывать позицию бакета? В чем преимущества такой операции?
71. В чем разница между HashMap и TreeMap? Когда и где их нужно использовать?
72. Какое внутреннее строение TreeMap? Рассказать об RBT.
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 1, урок 2, урок 3).
Stream API
73. Какие есть методы в интерфейсе Stream?
74. Чем отличается метод map от flatMap?
75. Какой функциональный интерфейс использует метод filter?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Углублённый (урок 15).
Базы данных
76. В чем разница между реляционными и нереляционными базами данных?
77. Как хранятся соотношения one-to-one, one-to-many и many-to-many в виде таблиц?
78. Что такое нормализация БД? Приведите примеры из реального проекта.
79. Какие есть виды индексов в БД?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе SQL Базовый.
Практические задания
80. Valid parentheses (задача с LeetCode).
81. Reverse Linked List (задача с LeetCode).
82. Дано String s, найти длину максимального substring без повтора символов.
83. Определить, является ли односвязный LinkedList палиндромом.
Senior
Общие
1. Когда лучше использовать наследование, а не агрегацию?
2. Расскажите о принципах работы Kubernetes.
Java Core
3. В чем разница между Java NIO и Java IO?
4. Чем отличается Lambda от анонимного класса?
5. Расскажите о Java Memory Model.
6. Какие есть типы памяти в JVM?
7. Опишите жизненный цикл Java-объекта. Каким образом объект переходит из одной области памяти Garbage Collector в другую? Что является триггером такого перехода?
8. Каким образом можно заставить JVM запустить Garbage Collector?
9. Какие существуют Garbage Collectors в JVM и зачем их столько?
10. Какие виды Garbage Collector есть в HotSpot? Как работают?
11. Что будет с Garbage Collector, если finalize() будет долго выполняться или в процессе выполнения получим исключение?
12. Чем ForkJoinPool отличается от ScheduledThreadPoolExecutor и ThreadPoolExecutor?
13. Какая разница между HashMap, WeakHashMap, Hashtable, IdentityHashMap?
14. Что такое LinkedHashMap?
15. Что такое EnumSet? Для чего использовать? Как реализовать?
16. Расскажите об особенностях сериализации в Java. Зачем serialVersionUID и InvalidClassException?
17. В чем проблема сериализации Singleton?
18. Какие бывают алгоритмы обхода деревьев и почему они разные?
19. Что такое deadlock? Какие типы существуют? Нарисуйте схематично, как может произойти.
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Java Базовый и Java Углублённый.
Базы данных
20. Что такое ACID?
21. Что означает CAP-теорема?
22. Какие есть уровни изоляции транзакций?
23. Есть ли смысл отказываться от использования ORM?
24. Что такое n+1 проблема?
25. Что такое cartesian product проблема?
Библиотеки и инструменты
26. Каким образом построить monitoring в Java? Расскажите об особенностях использования Java micrometrics или DropWizard, или Prometheus frameworks.
27. Опишите механизм работы ORM.
28. Какие способы выборки данных в Hibernate вы знаете?
29. Какие изоляции транзакций существуют в Hibernate?
Spring
30. Что такое IoC и DI?
31. Каков жизненный цикл объектов, которые создает Spring?
32. Какие есть виды контекстов?
33. Как создать и поднять контекст с целью тестирования приложения?
34. Какие возможности Spring предоставляет для коммуникации с базой данных?
35. Какие признаки того, что класс - Java Bean? Чем POJO отличается от Java Bean?
36. Опишите механизм инъекции зависимости в Spring.
37. Почему все зависимости Spring являются Java Beans? Возможно ли использовать Spring для управления зависимостями между не Java Beans классами?
38. Чем Spring singleton отличается от prototype?
39. Есть ли смысл отказываться от использования Dependency Injection?
Ответы на некоторые из этих вопросов вы можете найти в видео курсах Spring, Spring MVC.
Многопоточность
40. Что такое race-condition?
41. Какие элементы есть в java.util.concurrent пакете?
42. Что такое optimistic и pessimistic locking?
43. Какие особенности многопоточности в Java EE и Spring?
Stream API
44. Какие основные принципы Stream API?
Практические задания
45. Реализовать сервис, который на вход принимает url и возвращает короткую версию (вроде bit.ly/86gfr3).
Редакция DOU.ua благодарит за помощь в подготовке статьи Александра Редька, Антона Наумова, Богдана Чупика, Максима Ляшенко, Александра Навка, Сергея Маленко, Андрея Петрика, Сергея Громового, Дениса Душина, Ивана Чуба.
Смотрите также статьи с вопросами на собеседовании по Python, .NET и JavaScript.