Результати пошуку
ITVDN: курси програмування
Відеокурси з
програмування
Підписка

300+ курсів за популярними IT-напрямками

Вибери свою IT спеціальність

Підписка
Підписка

300+ курсів за популярними IT-напрямками

Результати пошуку за запитом: принцип открытости*...2...
Що повинен знати FrontEnd розробник у 2023 році

Автор: Влад Сверчков

Основні технології HTML5 & CSS3 Flex та Grid CSS CSS препроцесори Git & GitHub Знання про веб-технології та мережу інтернет JavaScript JavaScript Core (DOM, AJAX, JSON) REST API Алгоритми та структури даних Фреймворки JavaScript Інструменти керування станом програми (State Management) TypeScript Основи Figma Англійська мова Необов’язкові технології Патерни проєктування JavaScript Лінтери Тестування Webpack Gulp / Grunt SOLID принципи Зарплати FrontEnd розробників Підсумки FrontEnd – одна з найлегших професій розробника в ІТ. Вона вигідно вирізняється тим, що поєднує в собі програмування та творчість, оскільки девелопер працює над оживленням дизайнерського макету та створенням відповідної користувацької логіки. Також перевагою фронтенду є те, що побачити результат своєї роботи можна майже одразу – в будь-якому браузері. Відносна легкість фронтенду породжує велику популярність серед бажаючих потрапити в ІТ, а враховуючи наслідки відкритої агресії по відношенню до України – особливо велику популярність, адже це можливість працювати віддалено (на ІТ-компанію або на фрилансі) і отримувати гарну зарплату. Відповідно, конкуренція серед Trainee/Junior FrontEnd розробників шалена, а тому роботодавці вимушені закручувати гайки і підвищувати вимоги до кандидатів, аби відібрати найкращих.   Тож як стати фронтенд розробником? Якими технологіями необхідно володіти, аби стати Intern/Junior FrontEnd розробником у 2023 році? Проаналізувавши вакансії на українському ринку айті, ми склали список актуальних інструментів, які зазвичай вимагають роботодавці від кандидатів. Їхній перелік – нижче у статті. Frontend developer roadmap. Основні технології HTML5 & CSS3 HTML5 і CSS3 – це фундаментальні технології, без знання яких не обійтися жодному веб-розробнику. За допомогою мови гіпертекстової розмітки HTML створюється розмітка (каркас) кожної веб-сторінки. Потім мова стилів CSS збагачує візуальне оформлення сайту і надає йому привабливого та ефектного зовнішнього вигляду. Крім цього, необхідно володіти: кросбраузерним адаптивним верстанням, щоб вміти створювати сайти під мобільні пристрої, планшети і широкоформатні екрани та для різних браузерів; семантичним верстанням для підвищення якості розмітки та покращення пошукової індексації сайту; валідним верстанням, яке передбачає повну відповідність коду розробника всім стандартам W3C - організації, яка створює та впроваджує технологічні стандарти для World Wide Web. Приділіть особливу увагу верстанню під мобільні пристрої, тому що сучасний веб-споживач дуже багато часу проводить у смартфоні. Існує навіть спеціальний підхід, при якому спочатку верстається веб-сайт під мобільні пристрої, а потім під десктопи – називається Mobile First. Це загальні вимоги щодо верстання. Тепер розглянемо більш детально вимоги безпосередньо щодо мови стилів – CSS. Тут ви повинні знати основні властивості CSS3: фони, градієнти, тіні, анімації, трансформації, переходи, а також технології Flex та Grid, про які ми ще поговоримо. Гарне володіння HTML та CSS вже дозволяє займатися верстанням сайтів та заробляти гроші. Саме з цих двох базових технологій починається шлях до професії FrontEnd розробника. Якісно вивчити HTML та CSS ви зможете за допомогою наступних наших курсів: HTML5 & CSS3 Стартовий; HTML5 & CSS3 Базовий; HTML5 & CSS3 Поглиблений. Flex та Grid CSS Технології верстання надійних адаптивних веб-сторінок, які дозволяють легше створювати динамічні сайти та зручніше структурувати їх вміст. Найкраще Flex-верстання в дії показує інтерактивний сайт flexboxfroggy.com, а Grid-верстання – cssgridgarden.com. На нашому ресурсі також є курси, які гарно пояснюють теми Flex та Grid верстання: "Верстання сайту на CSS Grid", "Верстання сайту на FlexBox CSS". CSS препроцесори CSS препроцесор — це програма, яка має власний синтаксис, але може згенерувати з нього CSS-код. Найпопулярнішими вважаються SASS, Stylus, LESS і PostCSS, проте найбільше ком'юніті саме у SASS. Препроцесори призначені для: прискорення процесу написання коду; спрощення читання коду та його подальшої підтримки; мінімізації рутинної роботи під час написання коду. Для підвищення ефективності написання CSS-коду цілком достатнім буде вивчення лише одного препроцесора. Git & GitHub Git - найбільш популярна система контролю версій, яка дозволяє вести історію розроблення проєкту з можливістю доступу до кожної збереженої версії. Крім того, варто вміти працювати з сервісом онлайн-хостингу проєктів, який використовує систему контролю версій. У даному випадку це GitHub. У тандемі з Git він дозволяє розробникам зберігати свій код онлайн у хмарному сховищі, а потім взаємодіяти з іншими розробниками у різних проєктах. Дані системи дозволяють команді програмістів працювати над одним проєктом одночасно, зберігаючи внесені зміни, і навіть відслідковувати виконання завдань кожним членом групи. Git & GitHub — дуже важливі інструменти для будь-якого IT-розробника, вивченням яких слід зайнятися якомога раніше. Ми рекомендуємо вивчати Git на ITVDN за допомогою курсу «Основи роботи з Git». Знання про веб-технології та мережу інтернет Щоб якісно виконувати свою роботу, фронтенд розробник повинен розбиратися у вебі і розуміти принципи його функціонування. Таким чином, необхідно знати: як працює інтернет; протоколи HTTP/HTTPS, веб-сокети; як працюють браузери; що таке DNS та як він працює; що таке доменне ім'я; що таке хостинг. Також буде непогано, якщо ви спробуєте налаштувати сайт на якомусь безкоштовному хостингу, прив'яжете домен до цього хостингу. JavaScript Мова програмування, яка використовується як при розробленні клієнтської сторони веб-застосунку, так і серверної. За допомогою JavaScript (скорочено JS) можна писати навіть настільні та мобільні додатки, використовуючи певні програмні платформи та бібліотеки. Ця мова дозволяє: динамічно змінювати HTML-розмітку; здійснювати інтерактивну взаємодію з користувачем; анімувати зображення; здійснювати валідацію форм; керувати мультимедіа тощо. Іншими словами, JavaScript "оживлює" сторінку та додає їй функціональності. Гарне володіння цією мовою програмування є обов'язковим пунктом для кожного FrontEnd розробника. JavaScript використовує офіційний стандарт ECMAScript (скорочено - ES), який має на увазі певний формальний опис синтаксису, базових об'єктів та алгоритмів. На даний момент існує багато різних версій ES. Роботодавці найчастіше вимагають знання ES6+. Однак спочатку необхідно вивчити чистий JavaScript (vanilla JavaScript) і лише потім вникати в нові стандарти. Як не крути, а класику треба знати. Завдяки гарному володінню JS можна швидко розібратися в будь-якій версії ES, а потім опанувати будь-який фреймворк або бібліотеку. ITVDN надає можливість вивчити JavaScript з нуля до поглибленого рівня за допомогою курсів: JavaScript Стартовий; JavaScript Базовий; JavaScript: Розширені можливості. JavaScript Core (DOM, AJAX, JSON) DOM (Document Object Model) – об'єктне представлення вихідного HTML-документу. Ключовим є поняття DOM-дерева, яке описує структуру сторінки. За допомогою об'єктної моделі JavaScript отримує повну владу над HTML-документом: можливість редагувати, видаляти та додавати елементи і атрибути HTML, змінювати CSS-код тощо.   AJAX (Asynchronous JavaScript And XML) – це синтез технологій JavaScript і XML, який фактично являє собою комбінацію: вбудованого в браузер XMLHttpRequest-об'єкту (щоб запитувати дані з веб-сервера); JavaScript та HTML DOM (щоб відображати або використовувати дані). AJAX дозволяє веб-сторінкам здійснювати асинхронне оновлення, обмінюючись даними з веб-сервером. Завдяки цій технології сторінка не потребує перезавантаження – оновлюється лише конкретна її частина (згадайте стрічку новин у соціальних мережах). JSON (JavaScript Object Notation) – це загальний формат обміну даними. Дозволяє здійснювати обмін інформацією між програмними продуктами, котрі написані різними мовами. Таким чином, клієнт, який використовує JavaScript, може легко передавати дані на сервер, реалізований за допомогою Ruby/Java/PHP. Всі три технології мають особливу цінність для кожного веб-розробника та розкривають організацію роботи інтернет-застосунку. REST API API – Application Programming Interface – це набір правил, при дотриманні яких програми можуть між собою взаємодіяти. Розробник створює API на сервері та дозволяє клієнтам звертатися до нього. Красномовним прикладом буде API від Google Maps, котрий дозволяє веб-розробнику вказати на гугл мапі розташування певної будівлі (точку видачі інтернет-замовлень, офіс компанії абощо) на своєму сайті. Таким чином програміст позбавляє себе необхідності самому розроблювати власну мапу і користується вже готовим рішенням від Google, використовуючи набір правил від API. REST – Representational State Transfer – це архітектурний підхід, котрий регламентує, як саме API мають виглядати. Цьому набору правил має слідувати девелопер під час створення власного застосунку. Простими словами, REST – це звичайний запит виду «клієнт-сервер» з використанням HTTP-протоколу. Фронтенд розробнику необхідно розбиратися у REST API, оскільки ця технологія використовується усюди, де є необхідність працювати з даними від сервера. Алгоритми та структури даних Розуміння алгоритмів та структур даних – обов'язок будь-якого грамотного програміста. До структур даних відносяться: стеки, черги, зв'язані списки, графи тощо. Вивчивши їх, ви зможете керувати складністю своїх програм, роблячи їх більш доступними для розуміння, а також розробляти високопродуктивні програми, які ефективно працюватимуть з пам'яттю. Знання алгоритмів дозволить вам створювати складні конструкції для ефективного розв'язання широкого спектра завдань. Коли говорять про алгоритми, зазвичай мають на увазі алгоритми сортування та пошуку: сортування прямим включенням, прямим вибором, злиттям, пірамідальне, прямий пошук, бінарний, індексно-послідовний та інші. Важливо розумітися і на нотації Big O, яка описує складність кожного алгоритму. Даний механізм допомагає визначити, за яких умов вигідніше використовувати той чи інший алгоритм. Зазначимо, що як новачкові, вам не треба пірнати вглиб цих тем. Буде достатньо теоретичного володіння, розуміння, де яку структуру даних слід використати, а також уміння написати декілька алгоритмів. У розробленні сайтів це не дуже потрібно, але практично жодна співбесіда не оминає тему алгоритмів і структур даних. Фреймворки JavaScript Це інструменти, за допомогою яких створюються динамічні веб-/мобільні/десктопні застосунки мовою JavaScript. Вони прискорюють розроблення веб-додатків та передбачають чітко структуровану організацію коду, підвищуючи його якість та чистоту. Найпопулярнішими фреймворками для фронтенд розроблення можна назвати Vue.js, Angular та бібліотеку React. Кожен із них призначений для вирішення свого спектру завдань і має різний ступінь складності: Vue.js – найлегший (але й з найменшою спільнотою), React – середньої складності, Angular – високої складності. Варто сконцентруватися на глибокому вивченні одного фреймворку, але в той же час дуже рекомендується знати особливості та сферу застосування всіх перерахованих вище технологій. Який фреймворк все ж обрати? Думки щодо цього розходяться. Інструментарій вибирається індивідуально під проєкт та важко передбачити, які задачі вам потрібно буде вирішувати. На даний момент найбільшою популярністю користується React, оскільки він збалансований як з точки зору складності, так і з точки зору багатства функціоналу. До того ж найбільша кількість вакансій припадає саме на цей фреймворк, а значить, що він цікавий не тільки розробникам, а й бізнесу. Кожен із фреймворків доступний для вивчення на платформі ITVDN. За напрямком Angular: Angular 11.0 Базовий; Angular Поглиблений. За напрямком React: React Базовий; React Поглиблений. За напрямком Vue.js: Vue.js Стартовий; Vue.js Базовий. Інструменти керування станом програми (State Management) Великі веб-застосунки постійно зростають у складності, а тому зберігати дані, які можуть використовуватися в різних місцях, стає все складніше. Для вирішення цієї проблеми були вигадані окремі бібліотеки, що йдуть паралельно з фреймворками — вони служать для управління глобальним сховищем даних усього веб-застосунку і називаються менеджерами станів. Їх застосування вже стало стандартом у FrontEnd розробленні. Для девелоперів, які використовують Vue.js, це VueX, для React-розробників – Redux і MobX, для Angular-девів – RxJS, NgRx. TypeScript Кросплатформна строго типізована мова, яка є розширенням JavaScript. Строга типізація дозволяє зменшити кількість потенційних помилок у вихідному коді, написаному на TypeScript. Також ця мова реалізує концепції, які близькі до об'єктно-орієнтованих мов, таких як C#, Java та подібних. TypeScript підвищує швидкість та зручність написання комплексних програм, внаслідок чого їх стає легше підтримувати, масштабувати та тестувати. У вакансіях ця мова зустрічається досить часто незалежно від цільового фреймворку. При цьому для Angular розробників знання TypeScript є обов'язковим. Через високу затребуваність даної мови ми помістили її у список обов’язкових для вивчення. Основи Figma Figma – це популярний дизайнерський інструмент для створення інтерактивних прототипів застосунків або веб-сайтів. З його допомогою дизайнер створює дизайн, який фронтенд-розробник потім верстає за допомогою HTML/CSS і додає інтерактивність при участі JavaScript. Знання основ фігми дозволяє девелоперу зручно взаємодіяти з дизайнерським прототипом: швидко дізнаватися необхідні розміри тих чи інших елементів, робити експорт картинок та іконок тощо. Додатковий плюс – можливість використання браузерної версії Figma. Англійська мова План навчання Front-end повинен обов'язково включати підтягування English. Знання англійської є однією з основних вимог до фронтенд-розробника, оскільки велика кількість корисної інформації знаходиться саме на англомовних сайтах. Рівень читання технічної документації буде достатньо для комфортного користування іноземними ресурсами (Intermediate). Однак чим вищий рівень вашої англійської, тим більші шанси отримати job-офер. Інгліш використовується не тільки при роботі з документацією, а і при комунікації з командою та клієнтами. Серед програмістів побутує вислів: «Яку мову програмування слід вчити першою? Вчи англійську!». Тому не пошкодуйте ваш час і гарненько підтягніть англійську – цілком можливо, що саме гарне володіння нею стане вирішальним при розгляді вашої кандидатури. Необов’язкові технології Патерни проєктування JavaScript Це найкращі практики, які описують типові способи вирішення поширених завдань, що виникають під час проєктування програмного забезпечення. Знання шаблонів проєктування дозволяє писати більш чистий, зрозумілий і читабельний код, а також уникати "винайдення велосипеда". Більше того, володіння патернами показує вашу грамотність як розробника і підвищує вашу цінність в очах роботодавця, що допоможе виділитися на тлі конкурентів. Щоб ви могли добре розібратися з темою шаблонів JavaScript, рекомендуємо курс “JavaScript Шаблони”. Лінтери Інструменти, які дозволяють аналізувати якість JavaScript-коду відповідно до стандарту ES. Вони вбудовуються в середовище розроблення і вказують на наявність невідповідностей стандарту коду, якщо такі є. Даний механізм корисний як для одноосібного розроблення (для самоконтролю), так і для командного, коли кожен розробник повинен слідувати тим самим мовним конструкціям, аби на виході отримати єдиний, цілісний проєкт. Один із найвідоміших лінтерів – ESLint. Це необов’язковий інструмент для роботодавця, але він дуже корисний для веб-розробників у силу його можливостей з контролю якості коду. Тестування Jest та Cypress– головні інструменти модульного тестування, яке покладається на плечі розробника. Але що це таке? Unit тестування (воно ж – модульне тестування) – процес, який полягає у створенні тестів для перевірки працездатності окремих ділянок написаного програмістом коду. Виконується безпосередньо автором коду. Яку користь приносить Unit тестування: суттєве скорочення багів у коді; спрощення рефакторингу коду; забезпечення якісного відокремлення інтерфейсу від реалізації; краще розуміння написаного коду; можливість протестувати найдрібніші ділянки коду. Усі інструменти вчити не треба — достатньо навчитися працювати лише з одним із них. Webpack Потужний збирач модулів, який дозволяє скомпілювати в один файл кілька різних модулів. Використовується для роботи над об'ємними проєктами. Успішно використовується як у фронтенд-розробці, так і при створенні бекенду. Gulp / Grunt Системи збирання, які автоматизують рутинні завдання розробників: мініфікацію коду, оптимізацію зображень, тестування, аналіз якості коду та інше. Підходять для розроблення невеликих проєктів. SOLID принципи SOLID – це принципи, які є своєрідним ременем безпеки для тих, хто працює відповідно до парадигм об'єктно-орієнтованого програмування. Вони були створені з метою убезпечити ООП-орієнтованого розробника від незрозумілого, заплутаного спагеті-коду, який також ще й дуже важко підтримувати. SOLID - це акронім, який складається з п'яти букв, що кодують п'ять основних принципів: S - Single Responsibility Principle (принцип єдиної відповідальності) O - Open-Closed Principle (принцип відкритості-закритості) L - Liskov Substitution Principle (принцип підстановки Барбари Лісков) I - Interface Segregation Principle (принцип розділення інтерфейсу) D - Dependency Inversion Principle (принцип інверсії залежностей) Володіння цими принципами дозволяє грамотно проєктувати та розробляти такі програмні системи, які з великою ймовірністю зможуть тривалий час розвиватися, розширюватися та підтримуватися. Хоча SOLID принципи написані переважно для ООП, їхні ідеї цілком застосовні і до сучасного JavaScript розроблення, що допоможе фронтенд-розробникам створювати більш чистий та лаконічний код. Зарплати FrontEnd розробників Звернемося до статистики, опублікованої на сторінці української IT-спільноти DOU, а саме – до зарплатної аналітики українських розробників за літо 2023 року. Медіанна зарплата всіх українських розробників, які взяли участь в опитуванні (а їх 6605), наступна: Intern Software Engineer – 450 USD; Junior Software Engineer – 1000 USD; Middle Software Engineer – 2600 USD; Senior Software Engineer – 4900 USD. Тепер поглянемо на медіанну ЗП FrontEnd розробників: Junior – 950 USD; Middle – 2500 USD; Senior – 4750 USD. Виходить, медіана фронтендників на всіх тайтлах трохи менша, ніж загальна медіана, проте розрив досить невеликий. Погляньмо, скільки заробляє цей фахівець за межами України. У цьому нам допоможуть результати опитування Stack Overflow Developer Survey 2023 (понад 90 000 респондентів із США, Індії, Німеччини, Канади, Великої Британії та інших країн). Ця цифра – 59 970 USD на рік (приблизно 5000 USD на місяць).   При цьому буде важливо сказати, що фронтендники з даного опитування мають у середньому 8 років професійного кодингу – і це один із найнижчих показників. Нижче за них розташовуються лише Data Scientist / ML Specialist – 7.9 років досвіду, а також студенти, які мають трохи більше 2.8 років досвіду у професійному створенні коду. Підсумки FrontEnd розробник – досить універсальний боєць у світі веб-розроблення. Він повинен вміти і верстати, і створювати логіку роботи клієнтської частини, і розуміти роботу серверної частини веб-застосунку. Для опанування такого великого інструментарію варто запастися часом, терпінням та завзятістю. Зазначені у статті засоби розроблення сайтів також мають аналоги, оскільки для вирішення різних завдань підходять різні веб-інструменти. Однак ми вибрали найпопулярніші та найефективніші з них. Якщо у вас є бажання опановувати цю професію і ви хочете самостійно “помацати”, чим займається фронтенд розробник, на ITVDN створено комплексну програму навчання у форматі відео навчання, яка включає 44 відео курси. Аби отримати доступ до всіх відео курсів на ITVDN терміном на 12 місяців з можливістю скачувати на ваш пристрій відео матеріали (що дуже актуально під час блекаутів), радимо розглянути пакет підписки «Преміум Plus». Якщо ж вам більше до вподоби живе онлайн навчання з тренером та у групі з іншими учнями, пропонуємо формат Live Online для вивчення спеціальності FrontEnd (Angular або React напрямки). Бажаємо вам успіхів у досягненні ваших цілей! Залишайтеся з ITVDN!
Плагіни та інструменти для створення найкращих веб-сайтів

Автор: Редакция ITVDN

Введение В такой среде, как веб-разработка, всегда есть куда развиваться. Поэтому Вам нужно следить за появлением новых продуктов, позволяющих сделать Ваш сайт лучше и интереснее. В этой статье Вы ознакомитесь с полезными JQuery плагинами, а также различными другими инструментами. Они помогут Вам работать качественнее и быстрее. Solo: Бесплатный сервис управления проектами для фрилансеров fullPage.js: Библиотека для создания полноэкранных сайтов со скроллингом Apiary: Сервис создания API   TogetherJS TogetherJS – бесплатная библиотека JavaScript с открытым кодом от Mozilla, предоставляющая функции совместной работы для вашего веб-сайта. После добавления TogetherJS на Ваш сайт, пользователи смогут помогать друг другу на сайте в режиме реального времени. Semantic UI Semantic UI делает построение веб-сайтов более семантически правильным. Он использует принципы “natural language”, что делает код более читаемым и понятным. mailpile Mailpail – современный и быстрый web-mail-клиент с удобным интерфейсом, обеспечивающий функции шифрования и конфиденциальности. Google Webdesigner С Google Webdesigner Вы можете сделать дизайн Вашего веб-сайта на основе HTML5 более увлекательным, добавить интерактивные элементы, запускающиеся на любом устройстве. Grid forms Grid forms предназначены для использования в приложениях, требующих много данных для ввода. Это крошечный Javascript/CSS framework, с его помощью Вы с легкостью сделаете формы на сетке. jInvertScroll JInvertScroll – это легкий jQuery плагин, позволяющий добавить Parallax эффект при прокрутке страницы вниз. Он очень прост в установке и не требует, практически, никакой настройки. Naver: jQuery плагин для адаптивной навигации Naver – простой способ сделать быстрореагирующую навигационную систему, поддерживаемую мобильными устройствами. Monsta FTP MonstaFTP – менеджер с открытым исходным кодом. Источник: http://www.designyourway.net/blog/resources/plugins-and-tools-to-help-you-create-better-websites/
Що таке патерни проєктування у програмуванні

Автор: Влад Сверчков

Що таке патерн (шаблон) проєктування. Коли використовують шаблони. Якими бувають патерни проєктування. Породжуючі. Структурні. Патерни поведінки. Як обрати шаблон? Висновки. Програмісти-початківці завжди приходять до точки, коли їхній код перетворюється на “спагеті”. Його важко читати, він містить масу самоповторень, зайвих функцій, а додавання нового функціоналу перетворюється на десяте коло пекла. Один із найкращих засобів запобігання цьому – використовувати патерни проєктування (Design Patterns). Чи є це срібною кулею, які переваги та недоліки патернів існують, і які з них необхідно знати розробникам? Відповіді розбираємо нижче. Що таке патерн (шаблон) проєктування? Патерни – це типові архітектурні рішення проблем, котрі часто зустрічаються під час розроблення ПЗ. Їхня інша назва – шаблони, і що цікаво – людство дуже часто оточує себе шаблонами у повсякденному житті: однакові гнізда розетки та форми вилок у приміщеннях – універсальне рішення для електроживлення; виделки та ложки – інструменти споживання майже будь-якої їжі; чашки – ємності для розміщення будь-якої рідини і так далі. Людина завжди прагне спростити традиційну діяльність, і це не могло обійти стороною програмування. Ідеї створення універсальних правил для якісної розробки існували ще до 90-х років минулого століття, але дійсно проривною стала праця "Design Patterns: Elements of Reusable Object-Oriented Software" (1994) авторства Еріха Ґамма, Річарда Гелма, Ральфа Джонсона та Джона Вліссідеса, які іменують себе як "Банда чотирьох" (Gang of Four, GoF). У книзі описано 23 патерна та їхнє застосування в об'єктно-орієнтованому дизайні. Ця праця стала фундаментальною і тепер патерни gof складають кістяк багатьох обговорень якісного коду. Коли використовують патерни В розробці шаблони використовують при необхідності приведення коду до наступних критеріїв: Читабельність – інші розробники мають без складнощів розуміти написане. Масштабованість – легкість у створенні нового функціоналу. Підтримуваність – оновлення кодової бази має проходити якомога плавніше. Також вони здатні підвищити швидкість і продуктивність розробника – патерни це дійсно дозволяють. Вони гарно справляються і з наступними задачами: зменшення кількості потенційних помилок та вузьких місць; спрощення рефакторингу; зменшення технічного боргу; покращення комунікації девелоперів з іншими програмістами, проєктними менеджерами, власниками тощо. Необхідність використати шаблони проектування зростає разом зі збільшенням кодової бази, особливо при комерційному розробленні – коли створюване ПЗ має приносити прибуток. Важливо пам’ятати, що використання патернів інколи є геть недоречним. Подекуди воно може значно ускладнити читабельність, громіздкість і масштабованість коду. Наприклад, нескладний функціонал, який нечасто використовується і займає мало місця в коді, не потребує pattern-втручання. А от репетативний код, що вирішує класичні задачі (сортування, перебір даних тощо) – ідеальний претендент на застосування шаблону. Аби не помилитися спершу з’ясуйте контекст вашої проблеми, а вже потім обирайте патерни програмування, які найкраще задовольняють вимогам. Якими бувають патерни проєктування У своїй книзі GoF виділяють три великі сімейства: Сімейство Короткий опис Породжуючі патерни або Creational Patterns Надають найкращі способи створення об'єктів. Вони абстрагуються від процесу конкретизації і роблять вашу систему незалежною від створення, компонування та представлення її об'єктів. Популярні приклади: “Абстрактна фабрика” (Abstract Factory), “Одинак” / “Одиночка” (Singleton), “Прототип” (Prototype), “Фабричний метод” (Factory Method). Структурні патерни або Structural Patterns Фокусуються на композиції об’єкту. Допомагають переконатися в тому, що зміна частини системи не потягне за собою необхідність змін в інших її складових. Популярні приклади: “Проксі” (Proxy), “Адаптер” (Adapter), “Компонувальник” (Composite), “Фасад” (Facade). Патерни поведінки або Behavioral Patterns Зона відповідальності – алгоритми та обмін інформацією між об’єктами. Популярні приклади: “Відвідувач” (Visitor), “Ітератор” (Iterator), “Ланцюжок обов’язків” (Chain of Responsibility), “Стратегія” (Strategy). Розглянемо більш детально деякі з них. Породжуючі Породжуючі патерни – це надійні помічники у створенні об’єктів таким чином, аби в майбутньому з ними було максимально легко працювати. Дамо короткий опис деяких шаблонів: Патерн Одинак / Сінглтон забезпечує наявність лише одного екземпляру класу з глобальною точкою доступу. Singleton поширений в задачах конфігурацій або логування в застосунках, де потрібен єдиний контрольований доступ. Шаблон Прототип дозволяє створювати нові об'єкти шляхом копіювання існуючих екземплярів. Використовується Prototype в ситуаціях, коли створення об'єкта надто дороге, наприклад, при клонуванні складних або ресурсоємних об'єктів. Фабричний метод визначає інтерфейс для створення об'єктів, але дозволяє підкласам самостійно визначати тип створюваних об'єктів. Fabric Method корисний у багатофункціональних застосунках, де класи повинні мати можливість вибирати тип об'єктів, наприклад, при роботі з різними форматами документів, системами онлайн платежів тощо. Абстрактна фабрика визначає інтерфейс для створення сімейств пов'язаних об'єктів без вказівки їх конкретних класів. Використовують Abstract Factory для створення різних компонентів інтерфейсу користувача, які повинні працювати разом і забезпечувати єдиний стиль (світла / темна тема вебсайту тощо). Розглянемо приклад на патерні Singleton. Уявіть собі просту програму – музичний плеєр. Він дозволяє користувачам відтворювати музичні файли. Однак водночас має працювати лише один екземпляр плеєра – можливість відкриття декількох одночасно повинна бути недоступна. Цього можна досягти за допомогою шаблону Singleton. Простий приклад коду мовою C#: public class MusicPlayer {             private static MusicPlayer _instance;             private MusicPlayer()             {              // Ініціалізуємо музичний плеєр (наприклад, завантажуємо плейлисти)             }             public static MusicPlayer Instance             {             get             {             if (_instance == null)             {                        _instance = new MusicPlayer();             }             return _instance;             }             }             public void PlaySong(string songPath)             {             // Запустити пісню             }             public void PauseSong()             {             // Поставити на паузу             }             public void StopSong()             {             // Зупинити відтворення пісні             } } // Отримуємо екземпляр MusicPlayer MusicPlayer player = MusicPlayer.Instance; // Використовуємо функціонал MusicPlayer player.PlaySong("C:\\Users\\yourUsername\\Music\\mySong.mp3"); player.PauseSong(); player.StopSong(); Щоразу як в різних ділянках проєкту вам треба буде створювати екземпляр плеєру для відповідної взаємодії, ви завжди працюватимете лише з одним і тим самим екземпляром, уникаючи дублікації. Якщо ви програмуєте мовою сі шарп, детально розібрати популярні патерни проєктування C# з прикладами ви можете за посиланням. Структурні З короткого опису в таблиці легко дійти висновку, що структурні патерни дозволяють сформувати надійну, масштабовану та підтримувану архітектуру проєкту. Коротке знайомство: Проксі забезпечує об'єкт-посередник для контролю доступу до іншого об'єкта. Зазвичай шаблон Proxy використовують для реалізації “лінивого” завантаження, коли об'єкт створюється або ініціалізується лише при зверненні до нього (наприклад, завантаження картинок з високою роздільною здатністю). Адаптер дозволяє об'єктам з несумісними інтерфейсами працювати разом. Застосовується патерн Adapter для інтеграції нових компонентів в існуючу систему без зміни її коду. Підходить для використання нової бібліотеки у старому застосунку. Компонувальник використовується для ієрархічного компонування об'єктів для подальшої роботи з ними як з єдиним об'єктом. Використовується для створення деревоподібних структур, як-от файлові системи або GUI, де кожен вузол може бути як простим, так і Composite об'єктом. Фасад (Facade) надає спрощений інтерфейс для взаємодії зі складною системою або набором класів. Він зменшує складність роботи з підсистемами і надає користувачам єдиний вхідний інтерфейс для виконання рутинних операцій. Вивчити саме структурні патерни проєктування C# (з прикладами) ви можете за посиланням. Поведінкові Патерни поведінки в першу чергу визначають зв’язки між об’єктами і те, як вони здійснюють обмін інформацією. Наприклад: Патерн Відвідувач (Visitor) дозволяє додавати нові операції до об'єктів без зміни їхніх оригінальних класів. Використовується для взаємодії з об’єктами зі складною структурою, коли внесення додаткової логіки в оригінальні класи невиправдано ускладнює код. Ітератор / Iterator надає зручний механізм послідовного та простого доступу до елементів колекції, незважаючи на складність її побудови. Даний патерн поведінки популярний при обході елементів контейнерів, як-от списки або масиви – він надає універсальний інтерфейс для різних типів колекцій. Ланцюжок обов’язків або ж патерн Chain of Responsibility дозволяє передавати запит ланцюжком обробників, поки один з них не обробить запит. Незамінний при обробці запитів на сервері, де кожен обробник може передати запит наступному обробнику в ланцюжку: перевірка при авторизації на сайті, оброблення подій у GUI тощо. Для входу в патерни проєктування книга від Gang of Four буде гарною точкою відліку. Ви познайомитеся з класикою та академічним розкриттям теми, використовуючи патерни gof. Якщо ж ви хочете збагатити свої знання шаблонів, але віддаєте перевагу мові Java, рекомендуємо відео курс “Патерни проектування Java”. Як обрати патерн? Спочатку ви маєте проаналізувати задачу – для більшої зрозумілості виконайте її декомпозицію, розбивши на декілька складових. При цьому використовуйте системний підхід: прорахуйте, як ваше рішення вплине на весь проєкт, які елементи воно зачепить зараз, і який вплив воно матиме на додавання нового коду. Якщо ви вже працюєте в ІТ-компанії, ваші колеги, тімлід або архітектор можуть підказати вам доцільність використання того чи іншого патерну, розкрити нюанси вже існуючої архітектури, кодового стилю та багато іншого. Лише після ретельного аналізу можна переходити до підбору шаблону, зважаючи на усі переваги та недоліки. До речі, в цих задачах гарними помічниками будуть безкоштовні AI-асистенти на кшталт ChatGPT, Gemini та ін. Також не забувайте про використання інших методик покращення кодової читабельності, масштабування й чистоти: SOLID принципи – вони регламентують 5 основних засад створення структурованого, якісного коду. Нещодавно ми проводили вебінар, на якому розбирали кожен принцип в деталях, запрошуємо до перегляду! А якщо вас цікавить прикладний характер SOLID принципів на Java, можете пройти даний відео курс. GRASP (General Responsibility Assignment Software Patterns) – патерни для об’єктно-орієнтованого проєктування. Вони не мають вираженої структури і носять більш абстрактний характер, аніж патерни gof. DRY (Don’t Repeat Yourself) – головна ідея даного принципу полягає у створенні коду, який не матиме дублікацій в проєкті. KISS (Keep It Simple, Stupid) – регламентує написання якомога простішого коду, аби його можна було легко читати і розуміти. Рефакторинг – повернення до вже написаного коду з метою його покращення без зміни функціональності. Інші техніки, що залежать від проєктів. Висновки Патерни грають ключову роль в сучасному розробленні. Вони акумулюють в собі найкращі практики створення кодової бази таким чином, аби досягнути максимальної легкості та ефективності розроблення, особливо на великих проєктах. Звісно, не завжди їхнє використання є доречним – потрібно аналізувати задачі і продумувати наслідки застосування того чи іншого шаблону, аби не отримати величезну валізу без ручки. Розвивайте вашу експертизу в області патернів – це win-win стратегія. З одного боку перед працедавцями ви постанете як досвідчений та висококваліфікований спеціаліст, а з іншого – ваші програмні рішення матимуть елегантний характер і відзначатимуться легкістю в читанні, підтримці та масштабуванні. Чи використовуєте ви патерни в своїй розробницькій діяльності? Можливо, тільки вивчаєте? Залишайте в коментарях ваші відповіді!
400+ питань на співбесіді щодо С++

Автор: Влад Сверчков

Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 5 апреля 2021 года. Оригинальная версия на украинском языке доступна по ссылке. Junior 1.1 Общие вопросы 1.2 Метапрограммирование 1.3 Препроцессор и компиляция 1.4 Язык C 1.5 Язык С++ и ООП 1.6 STL / Algorithms 1.7 Многопоточность 1.8 Networking 1.9 OS/Linux 1.10 SCM / CI / CD 1.11 Практические задания Middle 2.1 Общее 2.2 Препроцессор и компиляция 2.3 Язык С 2.4 Язык С++ 2.5 Паттерны проектирования 2.6 Метапрограммирование 2.7 OOP/OOD 2.8 STL / Algorithms 2.9 Многопоточность 2.10 Networking 2.11 SCM / CI / CD 2.12 Практические задания Senior 3.1 Общее 3.2 Препроцессор и компиляция 3.3 C/C++ 3.4 OOP/OOD 3.5 STL / Algorithms 3.6 Многопоточность 3.7 SCM / CI / CD 3.8 Практические задания Предлагаем список технических вопросов, которые, вероятно, вам поставят на собеседованиях по C++. Вопросы предоставили специалисты, принимающие участие в проведении технических интервью по этому языку. Учтите, что есть широкий спектр специализаций, поэтому выбирайте свое направление и готовьтесь.   Junior   Общие вопросы   1. В чем заключаются основные принципы ООП? 2. Что такое сложность алгоритма? 3. Код работает неправильно. Что делать? 4. Объясните такие структуры данных, как стек и очередь. 5. Какие книги, связанные с программированием, читали? Чему с них научились? 6. Что интересного нашли в новых стандартах С++17, С++20? 7. Что такое таблица ASCII? 8. Что такое Unicode? 9. Что такое паттерны проектирования и для чего их используют? 10. Патерны Singleton, Strategy, Template-Method, Decorator? 11. Для чего нужны модульные тесты? 12. Какая разница между модульными и интеграционными тестами? 13. Что такое TDD?   Метапрограммирование   14. Что такое шаблонный класс и шаблонная функция? 15. Что такое конструкторы? Какие типы знаете? 16. Может ли конструктор быть шаблонной функцией? 17. Может ли виртуальная функция быть шаблонной? 18. Что такое инстанциация шаблона? 19. Что такое специализация шаблона? Частичная специализация шаблона? 20. Расскажите об имплементации шаблонных классов в срр-файле?   Препроцессор и компиляция   21. Как проходит процесс компиляции срр-файлов в бинарный файл? 22. Что такое препроцессор? 23. Как работает препроцессор? 24. Какие знаете команды препроцессора? 25. Как работает директива include? 26. Как работает директива define? 27. Что именно линкует линкер? 28. Что такое оптимизация компилятора? 29. Что такое флажки компиляции? 30. Как защитить хедер от повторного включения? 31. Что делает директива include? 32. Как работают макросы?   Язык C   33. Как static влияет на глобальные/локальные переменные? 34. Как сonst влияет на переменную? 35. Какие варианты использования extern знаете? 36. Какие варианты использования volatile знаете? 37. Какие есть битовые операции? 38. Что такое булевая алгебра? 39. Расскажите об этапах разработки библиотеки или программы. 40. Что такое алгоритмы сортировки и какие вы знаете? 41. Какие алгоритмы работы со строками знаете? 42. Какие алгоритмы на графах знаете? 43. Где может храниться переменная? 44. Какая разница между calloc и malloc? 45. Для чего используют realloc? 46. Что такое указатель? 47. Каков размер указателя и от чего он зависит? 48. Какие есть операции с указателями? 49. Что такое struct? 50. Как определить размер структур? 51. Что такое выравнивание в структурах? 52. Что такое union? 53. Какой размер union?   C++/OOP   54. Что такое класс? 55. Какие есть основные типы данных в C++? 56. Что такое инкапсуляция? Как она реализуется в C++? 57. Какие есть встроенные типы в С++? 58. Что такое enum? 59. Как соотносится класс и объект? 60. Какая разница между структурой и классом? 61. Разница между private/protected/public и где они используются? 62. Какие методы класса являются стандартными для класса? 63. Что такое абстрактный класс и зачем он? 64. Сколько памяти занимает объект пустого класса class A {}; ? 65. Что случится с функцией, если к ней добавить ключевое слово static? В контексте члена класса? В контексте метода класса? 66. Какие особенности статических полей класса? 67. Какая особенность константных методов-членов класса? 68. Как изменить поле класса в константном методе класса? 69. Какие методы можно вызвать из константных объектов? 70. Что такое куча и стек? Различия, принцип работы. 71. В чем разница между указателем и ссылкой? 72. Для чего нужен указатель на функцию? Как его объявить? 73. Что будет, если забыть вызвать delete? Когда освободится эта память? 74. Что такое умный указатель? Какие умные указатели есть в стандартной библиотеке? 75. Как работает std::unique_ptr? 76. Как работает std::shared_ptr? 77. Расскажите о константности переменной, ссылки, указателя. Что такое константный указатель и указатель на константу? Размер указателя в памяти? 78. Расскажите о передаче аргументов по значению, по ссылке и по указателю. 79. Расскажите о порядке вычисления аргументов функции? 80. Что произойдет, если вернуть ссылку на временный объект? 81. Что такое перегрузки функции? Виды перегрузки. 82. Что такое явное и неявное приведение типов в С++? Расскажите о функциях явного приведения типов в C++. 83. Что такое инициализация переменной в if? 84. Что такое ленивые вычисления в С++? 85. Расскажите о циклах for и range-for. 86. Что делает ключевое слово auto? auto-определение return-типа, аргументов функции? 87. Чем отличаются delete и delete [ ] ? Что случится, если вызвать delete у объекта, созданного через new [ ] ? 88. Обработка ошибок в С++. Какие конструкции используют при обработке exception? 89. Можно ли выбрасывать exception из конструктора? Какие поля будут сконструированы, какие поля будут разрушены? 90. Что такое memory leak? 91. Можно ли выбрасывать exception из деструктора? 92. Как отловить деление на 0 в С++? 93. Как работают константные методы? 94. Что такое лямбда-функция в С++? Как получить доступ к переменным во внешней области видимости? 95. Для чего использовать namespace, anonymous namespace? 96. Как вызвать объект из nested namespace? 97. Как работают inline-функции? Может ли такая функция быть рекурсивной? 98. Что такое полиморфизм? 99. Для чего используется наследование? 100. Какие бывают типы наследования? 101. Для чего используют виртуальное наследование? 102. Как можно решить проблему ромбовидного наследования без использования виртуального наследования? 103. Что случится, если класс-наследник передать по значению в функцию, которая принимает базовый класс? 104. Что случится, если пронаследоваться от базового класса, который не имеет виртуального конструктора? 105. Что случится, если вызвать переопределенную virtual function из конструктора? Может ли конструктор быть виртуальным? 106. Может ли pure virtual function иметь имплементацию? Что случится, если вызвать pure virtual function из конструктора? 107. Какие методы генерируются для класса по умолчанию? В каком случае такие методы не будут генерироваться? Как заставить компилятор добавить/удалить эти методы? 108. Как запретить наследовать класс? 109. Какой порядок конструирования и разрушения классов в иерархии? Порядок инициализации полей класса? 110. Какие есть способы инициализации полей класса? 111. Может ли деструктор быть виртуальным? 112. Что делает ключевое слово virtual? 113. Для чего используют виртуальный деструктор? 114. Что такое глубокое копирование? 115. Что такое виртуальные функции и зачем они нужны? 116. Как защитить объект от копирования? 117. Что такое семантика перемещения?   STL / Algorithms   118. Из чего состоит STL? 119. Какие алгоритмы применяли с STL? В чем преимущество использования алгоритмов перед собственноручно написанными функциями? 120. Расскажите о контейнерах стандартной библиотеки vector, list, map, unordered_map. 121. Какие знаете типы итераторов? Чем они отличаются? В каких контейнерах используются? 122. Какая разница между std::set, std::map, std::unordered_multimap? 123. Что такое идиома remove-erase? 124. Как получить наименьшее значение типа? 125. Какая разница между std::map и std::hashmap? 126. Как подсчитать количество элементов в std::list? 127. Что такое сложность алгоритма и от чего она зависит? 128. В чем разница между vector и list и в каких случаях их лучше использовать?   Многопоточность   129. Что вам известно о многопоточности? 130. Что общего и различного в процессах и потоках? 131. Как синхронизировать передачи информации между потоками? 132. Какая разница между мьютексом и семафором? 133. Что такое deadlock? 134. Является ли С++ thread-safe? 135. Что такое race-condition? 136. Как избежать состояния гонки? 137. Что такое атомарная операция? 138. Как работать с std::mutex?   Networking   139. Что такое сокет? 140. Какие операции можно делать с сокетом? 141. Какая информация нужна, чтобы создать сокет? 142. Какие бывают модели сетей? 143. Расскажите об уровнях модели OSI. 144. Расскажите об уровнях модели TCP/IP. 145. Что такое IP-адрес? 146. Для чего используется маска подсети? 147. Какая разница между IPv4 и IPv6? 148. Сколько памяти необходимо для хранения IPv4? 149. Для чего нужен порт? 150. Сколько максимально может быть портов? 151. Какая разница между TCP и UDP? 152. Для чего такой ненадежный UDP-протокол?   OS/Linux   153. Что такое менеджер пакетов? 154. Какие бывают менеджеры пакетов? 155. Какие бывают дистрибутивы Linux? 156. Что такое PID? 157. Для чего используют файловые дескрипторы? 158. Расскажите о стандартных файловых дескрипторах процесса. 159. Что такое Pipe? 160. Что такое Named Pipe? 161. Что такое UID? 162. Расскажите о командах bash.   SCM / CI / CD   163. Какие есть виды SCM? 164. Для чего используют системы контроля версий? 165. Какие есть команды git? 166. Какие этапы во время комита изменений? 167. Разница между git fetch и git pull? 168. Какие есть этапы решения merge conflict?   Практические задания   169. Посчитайте количество единиц в произвольном числе. 170. Есть структура по типу «односвязный список». Напишите функцию, которая разворачивает список. То есть, первый элемент становится последним, а последний - первым. 171. Напишите реализацию функции int atoi (const char *str); преобразования строки в число. 172. Для структуры типа односвязный список напишите функцию вставки элемента. 173. Реализуйте класс vector. 174. Реализуйте бинарный поиск в массиве. 175. Реализуйте любую сортировку. 176. Реализуйте макрос для сравнения двух строк. 177. Реализуйте реверс строк. 178. Реализуйте перевода числа из строки в int. 179. Реализуйте подсчет слов в предложении. 180. Реализуйте подсчет чисел Фибоначчи. 181. Найдите такие элементы двух массивов, которые попадаются только в каждом из них. Желательно использовать STL. 182. Удалите из unordered_map элементы, которые делятся на 2 и выведите ключи этих элементов. 183. Напишите класс для логирования, который мог бы логировать к консоли или файлу. 184. Напишите функцию для определения, является ли определенный год високосным. 185. Напишите функцию для определения, является ли определенное слово палиндромом. 186. Напишите реализацию паттерна Singleton. 187. Напишите реализацию std::vector с операциями: push_back, push_front, pop_back, pop_front, size, clear. 188. Напишите рекурсивный поиск значения в дереве бинарного поиска. 189. Напишите функцию, которая проверяет, является ли дерево сбалансированным. 190. Напишить функцию для поиска уникального элемента в массиве.   Middle   Общее   1. Какие курсы прошли или книги прочитали за этот год? Чему научились? 2. Что нравится и не нравится в С++? Чего не хватает? 3. Что интересного нашли в новых стандартах С++17, С++20 (конкретные фичи)? 4. Расскажите о фичах, которые появились в разных версиях языка. 5. Расскажите о модели памяти, которая появилась в С++11 стандарте. 6. Что такое сериализация? Какие библиотеки знаете? 7. Какие знаете паттерны проектирования? 8. Что такое операционная система? Какие существуют типы по назначению? 9. Назвать основные составляющие и принципы работы ОС Linux в качестве примера системы общего назначения. 10. Что такое SFINAE и PIMPL? 11. Назовите порождающие, структурные и поведенческие паттерны программирования и приведите примеры их использования.   Препроцессор и компиляция   12. Расскажите о системах автоматизации билд-процесса. 13. Какая разница между статической и динамической библиотеками? 14. Какая разница между исполнительным файлом и динамической библиотекой? 15. Что такое DLL hell? 16. Что такое флажки компиляции (fPIC)? 17. В чем разница между дебаженной и релизной сборкой? 18. Что нужно для использования сторонней библиотеки? 19. Что такое internal linkage?   C   20. Что будет, если дважды вызвать free? 21. Как происходит вызов функции? 22. Как происходит передача параметров в функцию? 23. Как прорабатывается константа переменных? 24. Что означает ключевое слово inline? 25. Для чего используют выравнивания, можно ли его контролировать? 26. Расскажите о битовых полях. 27. Для чего нужен extern "C"? 28. Что будет, если в двух файлах сделать функцию с одинаковым именем и параметрами? На каком этапе возникнет ошибка? 29. Как экспортировать/импортировать функции из динамической библиотеки? 30. Какая разница между С-style приведением типов и C++ приведением?   C++   31. Что такое явное и неявное приведение типов в С++? Зачем делать explicit-конструктор? 32. Что такое Uniform initialization? Aggregate initialization? 33. Что такое Reference to temporary object? Как продлить время жизни временного объекта? 34. Что такое делегирующий конструктор? 35. Что такое список инициализации? 36. Какой порядок инициализации полей класса? Что случится, если конструктор инициализирует поля в другом порядке? 37. Что случится, если инициализировать поле другим полем? 38. Что такое copy elision? Сколько раз будет вызван конструктор/деструктор у объекта, которого возвращают по значению? 39. Что такое move-семантика? 40. В каких случаях не будет сгенерирован конструктор копирования? 41. Чем отличается конструктор копирования от оператора присваивания? 42. При каких условиях в конструкторе можно выбросить exception? 43. Что такое конструктор по умолчанию? Для чего нужны default и delete? 44. Чем отличается интерфейс от абстрактного класса? 45. Какие виды полиморфизма в С++? 46. Как реализовано наследование в большинстве компиляторов? 47. Множественное наследование: за и против? 48. Виртуальное наследование и порядок конструирования? 49. Зачем использовать override? 50. Какие есть правила вывода типа при использовании auto? В каких случаях auto может привести к нежелательному копированию объекта? 51. Расскажите обо всех возможных способах использования ключевого слова static в С++. Что такое static initialization order fiasco? 52. Что делает вызов throw; в блоке catch? 53. Чем отличается constexpr от const? 54. Что такое const correctness? 55. В каком случае можно использовать const_cast? 56. Что такое ключевое слово mutable и когда его нужно использовать? 57. Что такое ключевое слово friend и когда его нужно использовать? 58. Расскажите о лямбда-выражениях в С++ и доступ к переменным во внешней области видимости, захват this в лямбду и время жизни лямбды и захваченных переменных? 59. Что такое функтор? Напишите пример. 60. Что такое специализация шаблона? 61. Что такое dynamic_cast и run-time type identification? 62. Что такое exception? Как бросить и поймать? 63. Что будет, если бросить exception из конструктора? А из деструктора? 64. Что будет, если не поймать exception? 65. Что произойдет, если exception выйдет за пределы блока noexcept функции? 66. Для чего можно использовать приватное наследование? 67. Что такое контракт функции? 68. Что такое vptr и vtable? 69. Где содержится vptr? 70. Где содержится vtable? 71. Какая разница между overload and override? 72. Как компилятор различает члены класса и обычные переменные в функциях? 73. Зачем используют exceptions? 74. Что такое блоки try-throw-catch? 75. Расскажите о логике catch-блоков. 76. Что такое move constructor? 77. В чем разница между константным методом и неконстантным? 78. Что такое В-нотация и как определить сложность любого алгоритма? 79. Что такое таблица виртуальных методов? 80. Какие функции класса автоматически генерирует компилятор, если их не определить? 81. Что такое выравнивание данных? 82. Что такое exception? 83. Какие есть стандартные контейнеры и на основе каких структур они построены? 84. Что такое Undefined behavior? Приведите примеры. 85. Как определить, что в программе есть memory leak? 86. Для чего нужен std::make_shared? Чем он лучше создания std::shared_ptr через конструктор? 87. Что будет, если выделить один объем памяти, а записать больше? 88. Что такое переполнение stack?   Паттерны проектирования   89. Зачем нужны паттерны? Какие типы паттернов различают? 90. Недостатки паттерна Singleton? Когда он уместен? 91. Преимущества и недостатки PIMPL? 92. В чем разница между паттерн-фабрикой и фабричным методом? Когда использовать какой из них? 93. Что такое паттерн Observer? 94. Як контролировать состояние программы? Машину состояний? Паттерн состояние? 95. Что такое паттерн Visitor?   Метапрограммирование   96. Какие есть правила вывода типа в шаблоне? 97. Чем отличается using от typedef? 98. Сколько памяти занимает произвольная структура? Что такое выравнивание объекта? 99. Почему пустая структура занимает 1 байт? Какая минимальная единица адресации в С++?   OOP/OOD   100. Что такое SOLID? Что означает каждый из этих принципов? 101. Расскажите о паттернах проектирования. 102. Что такое Dependency Injection? Приведите пример. 103. Какие преимущества и недостатки функционального подхода? 104. Что такое принцип RAII? 105. Что такое принцип DRY? 106. Что такое принцип KISS? 107. Какие преимущества композиции перед наследованием?   STL / Algorithms   108. Какие алгоритмы с STL использовали? Каких не хватает? 109. Какими особенностями должен обладать класс, чтобы он был итератором? 110. Какие бывают итераторы? 111. Расскажите об инвалидации итераторов. 112. Как оптимизировать удаление элемента со средины вектора? 113. Как реализован vector? 114. Как реализован list? 115. Как расширить STL-контейнеры? 116. Какие есть алгоритмы в STL? 117. В чем разница между vector, deque, list, set e STL? 118. Когда надо использовать map? Когда - unordered_map? Какая сложность поиска и вставки в этих контейнерах? 119. Как проверить, есть ли в контейнере элементы? Почему вызов container.size() является плохой практикой? 120. Что такое exception safety guarantee? Какую exception safety guarantee имеют STL-контейнеры? 121. Расскажите о типах умных указателей и о подсчете ссылок в них.   Многопоточность   122. Является ли С++ thread-safe? 123. В чем разница между многопоточностью и асинхронностью? 124. Что такое многопоточность? Какую функциональность предоставляет С++ для разработки многопоточных приложений? Какие основные проблемы многопоточных приложений? 125. Как передать информацию между несколькими процессами? 126. Как синхронизировать между собой несколько процессов? 127. Какие есть особенности работы с shared memory? 128. Как работает spinlock? 129. Какие вы знаете особенности использования recursive mutex? 130. Расскажите о read-write mutex. 131. Что такое race-condition? Взаимная блокировка? Что такое критическая секция? 132. Как избежать состояния гонки? 133. Чем отличается мьютекс от семафора? 134. Какие примитивы синхронизации реализованы в C++? Преимущества lock_guard? 135. Что случится, если exception выйдет за пределы потока? Какие инструменты есть для безопасной асинхронности в С++? 136. Чем отличается std::launch::async от std::launch::deferred? 137. Что такое атомарная операция? std::atomic? 138. Как работать с std::conditional_variable? 139. Как создать поток с помощью std::thread? 140. На сколько потоков лучше разбить задачу? От чего это зависит? 141. Как работать с std::async? 142. Thread-safe гарантии контейнеров в С++? В чем недостаток интерфейса front() + pop_front()?   Networking   143. Что такое TCP handshake? 144. Какая разница между TCP и UDP? 145. Расскажите о протоколах верхнего уровня. 146. Какая разница между HTTP и HTTPS? 147. Расскажите об SSL/TLS handshake.   SCM / CI / CD   148. Расскажите о процессах CI. 149. Как отредактировать комит? 150. Расскажите об интерактивном rebase. 151. Какие могут быть способы дебаггинга кода? 152. Для чего нужны Unit test? Чем отличается от Functional Test? 153. Как тестировать код? Какой используете фреймворк? 154. Какие библиотеки знаете для написания тестов? 155. Что такое mock? 156. Сколько тестов нужно написать на одну функцию? 157. Что такое побочный эффект, идемпотентность и чистые функции? 158. Что такое контейнеризация и в чем преимущества и недостатки? Что такое Docker или иной инструмент контейнеризации? 159. Что такое CI/CD и какие преимущества приносит для разработчика? 160. Какие принципы итеративных методологий? 161. Какие преимущества и недостатки code-convention?   Практические задания   162. Напишите максимально корректную реализацию класса string с конструктором копирования и оператором присваивания. 163. Напишите реализацию очереди. 164. Реализуйте функцию, которая за один проход найдет уникальный элемент в контейнере. 165. Напишите thread-safe пул потоков. 166. Напишите игру жизни в ООП стиле. 167. Напишите класс, который достает из базы список товаров по фильтру и показывает на консоли. Напишите тесты для него. 168. Любая задача на написание кода, чтобы проверить умение проектировать интерфейсы и придерживаться принципов SOLID, DRY, KISS. 169. Напишите свою реализацию std::atomic. 170. Напишите программу для анализа графов: нахождение циклов, deadlock-состояний, циклов, недоступных состояний. 171. Напишите программу, которая бы проверяла, что в системе запущен только один ее экземпляр. Решение должно быть cross-platform. 172. Проанализируйте C++ код с точки зрения качества: выявить потенциальные memory leak, нерациональное использование STL-контейнеров, алгоритмов, неоптимальные конструкции и тому подобное. 173. Напишите код для решения судоку. 174. Напишите код, который найдет зацикливание в односвязном списке.   Senior   Общее   1. Как вы понимаете SOLID? 2. Как разработать систему плагинов на С++? 3. Что такое RPC? Какие библиотеки знаете? 4. На что обращать внимание при проведении code review? 5. Какие есть проблемы при написании кроссплатформенного кода? На что обращать внимание? 6. Что делать, если код работает медленно? 7. Какие есть способы и методологии измерения быстродействия кода? Как можно устранить/уменьшить влияние замеров на быстродействие? 8. Что такое SFINAE? Для чего используется? 9. Что такое метапрограммирование? С помощью чего реализуется на С++? 10. Как использовать variadic templates? 11. Как тестировать закрытые методы? 12. Как считать покрытие тестами? Нужно ли это делать? 13. Что такое cache miss и как это выявить? 14. Что такое SIMD-инструкции? Какие необходимые условия и способы их использования? 15. Что такое покрытие кода и как обеспечивается? 16. Опишите принципы lock-free структур данных и свой опыт работы с ними.   Препроцессор и компиляция   17. Расскажите о построении билд-системы. 18. Как работать с билд-системами: Make, CMake. 19. Как интегрировать third-party в проект? 20. Что такое барьеры памяти? 21. Расскажите о работе с сырыми указателями и о ручном управлении памятью. 22. Что такое статический анализатор кода? Какие знаете? 23. Что такое динамический анализатор кода? Какие знаете? 24. Проект медленно собирается. Как можно ускорить?   C/C++   25. Расскажите об использовании realloc в контейнерах. 26. Как работают шаблоны? 27. Расскажите о специализации шаблонов. 28. Как работает RTTI? 29. Можно ли использовать exception в конструкторе/деструкторе? 30. Что такое rvalue и lvalue? 31. В чем особенности контейнеров std::set, std::map, std::unordered_map, std::hash? 32. Что такое placement new? Для чего используют? Как сделать placement delete? 33. Как размещается в памяти класс со множественным наследованием и виртуальными функциями? 34. Как работают точки остановки? 35. Что такое уязвимости? Каков механизм их работы? 36. Как написать собственный std::shared_ptr? 37. Что такое curiously recurring template pattern? 38. Опишите назначение и принцип работы std::shared_ptr, std::unique_ptr и std::weak_ptr. 39. Какое назначение и отличия использования std::variant и std::any? 40. Какие улучшения получил std::search в С++17 ? 41. Что такое copy elision и когда он становится возможным? Какие особенности для разных стандартов? 42. Что такое Return Value Optimization?   OOP/OOD   43. Объясните принципы SOLID. 44. Объясните принципы KISS. 45. Объясните принципы YAGNI. 46. Какие есть подходы к оптимизации кода? 47. На что стоит обращать внимание при code review? 48. Какие есть паттерны проектирования? Почему не советуют использовать Singleton? 49. Что такое статический полиморфизм?   STL / Algorithms   50. Когда std::vector может использовать std::move? 51. Расскажите о своем любимом алгоритме поиска. 52. Что такое lock-free и wait-free алгоритмы? В чем их отличия и способы реализации? 53. Опишите назначение execution policy для параллельных алгоритмов.   Многопоточность   54. Расскажите о построении API, рассчитанных на многопоточное использование. 55. В чем разница между kernel-level и user-level потоками? 56. Что такое coroutine? 57. Что делает спецификатор thread_local? 58. Как реализовать синхронизацию в задаче producer-consumer? 59. Як синхронизироваться между различными процессами?   SCM / CI / CD   60. Расскажите о настройке процесса менеджмента ветвей репозитория. 61. Расскажите о стратегии разветвления (branching).   Практические задания   62. Напишите базовую реализацию std::shared_ptr. 63. Реализуйте алгоритм сортировки. 64. Реализуйте алгоритм хеширования. 65. Реализуйте shared_ptr с расширением для weak_ptr. 66. Реализуйте простейший producer-consumer, используя условные переменные. 67. Опишите как можно подробнее, что происходит в системе, когда приложение делает сетевой запрос. 68. Детально описать дизайн программного компонента, например, системы голосования; учесть при этом высокую нагрузку и сделать ее расширяемой и отказоустойчивой.   Выражаем благодарность за участие в статье Александру Жакуну, Ярославу Пушко, Назару Семенишину, Сергею Подоброму, Владимиру Кочуну, Владимиру Новикову, Сергею Кривоносу, Марку Цирульнику, Кириллу Пшеничному, Виктору Шуму, Сергею Братусю.    
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.
Dependency Injection у C#

Автор: Редакция ITVDN

Что такое Dependency Injection (внедрение зависимостей) на языке C#? Как это работает, типы внедрения зависимостей в C# и многое другое. В недавнем сообщении в блоге мы говорили о том, что язык C# в частности и виртуальная машина .NET в целом являются технологиями высокого уровня. Если вы планируете писать код на C#, внедрение зависимостей - это лишь одна из многих вещей, о которых вы должны знать. Продолжайте читать пример внедрения зависимостей C#, чтобы вы могли использовать его в своих интересах в своем следующем проекте. Определение Dependency Injection в C# Если вы более подробно рассмотрите Dependency Injection (DI), то увидите, что это паттерн проектирования программного обеспечения, который позволяет разрабатывать слабосвязанный код. Через DI вы можете уменьшить «жесткость» связи между программными компонентами. Внедрение зависимостей также известно как Inversion-of-Control (инверсия управления), которая упрощает модульное тестирование. Крайне важно сделать шаг назад к основам проектирования объектно-ориентированного приложения, где основным аспектом проектирования является «слабая связь». Это означает, что объекты имеют только столько зависимостей, сколько необходимо для выполнения своих заданий, а число зависимостей должно быть ограничено. Кроме того, зависимости объекта должны быть от интерфейсов, а не от конкретных объектов. Что такое конкретный объект? Это любой объект, созданный с помощью ключевого слова «new». Благодаря «слабому связыванию» вы упрощаете поддержку программного продукта и даёте большую возможность повторного использования. Кроме того, вы можете использовать так называемые Mock-объекты, предназначенные для замены дорогостоящих сервисов, таких как socket-communicator. Существует три типа DI: 1) Constructor Injection 2) Setter Injection 3) Method Injection Поскольку DI используется для упрощения сопровождения кода, он использует паттерн с объектом-конструктором для инициализации объектов и предоставления необходимых зависимостей объекту. Как вы можете видеть, теперь вы можете «внедрить» зависимость снаружи класса. Как работает Dependency Injection в C# Чтобы проиллюстрировать, что вашему классу Client необходимо использовать компонент класса Service, лучшего всего, чтобы ваш клиентский класс «знал» об интерфейсе IService вместо класса Service. Благодаря этому вы можете изменить реализацию класса Service столько раз, сколько хотите, не нарушая хост-кода. Полезно понимать Принцип Инверсии Зависимостей (Dependency Inversion Principle), который помогает нам при написании слабо связанных классов. Определение: Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. Как вы внедряете зависимость между двумя модулями? Через инверсию управления. Это фактический механизм, который вы можете использовать для создания модулей более высокого уровня, зависящих от абстракций. Вы должны инвертировать элемент управления, чтобы следовать принципу инверсии зависимостей. В результате ваши высокоуровневые модули больше не зависят от конкретных низкоуровневых реализаций. Давайте немного погрузимся в три типа Dependency Injection: Constructor Injection Основная предпосылка здесь заключается в том, что объект не имеет значений по умолчанию или одного конструктора. Для создания объекта необходимо задать определенные значения во время создания. Вкратце, Constructor Injection использует параметры для внедрения зависимостей. Это самый распространенный вид DI, который выполняется путем предоставления зависимости через конструктор класса при создании экземпляра этого класса. Кроме того, внедряемый компонент можно использовать в любом месте внутри класса. Хотя он должен использоваться, когда сия зависимость действительно необходима для работы класса. К тому же Constructor Injection используется в наиболее распространенном сценарии, когда классу требуется одна или несколько зависимостей. Вот несколько преимуществ Constructor Injection: • Инициирует контракт сильной зависимости. • Он поддерживает тестирование. • Можно сделать неизменным. Setter Injection Его также называют Property Injection (внедрение свойств). Setter Injection позволяет нам создавать затратные ресурсы и сервисы только по мере необходимости и как можно позже. Кроме того, он не требует предварительной проводки всего графика зависимостей. Единственная проблема - трудно определить, какие зависимости требуются. Хотя это не требует добавления или изменения конструкторов. К тому же перед использованием вам нужно будет проверить значение null. Method Injection Это наименее распространённый патерн, он используется только в крайних случаях. Как указано в названии, Method Injection вводит зависимость в метод, который будет ее использовать. В результате это удобно, когда для всего класса нужен только один метод, а не зависимость. Преимущества Dependency Injection C# С помощью DI вы можете вводить дополнительный код между зависимостями. Чтобы проиллюстрировать это, вы можете использовать Constructor Injection, чтобы предоставить объекту его зависимости. Если у вас есть класс с 10 методами, которые не имеют зависимостей, но вы хотите добавить новый метод с зависимостью, вы можете изменить конструктор для использования Constructor Injection. С другой стороны, вы можете просто добавить новый конструктор, который будет принимает зависимость. Тем не менее если зависимость нежелательна, вы можете использовать Setter Injection, поскольку она позволяет создавать дорогостоящие ресурсы только тогда, когда это необходимо. Как вы можете видеть, DI делает код надежным, поддерживаемым, многоразовым и читаемым. Источник
10 секретів ідеального коду

Автор: Nicolas Baptiste

Взято с настоящего поля битвы: работы Спустя практически 10 лет работы на Javascript мне захотелось поделиться своими ежедневными секретами написания кода. Многие советы были позаимствованы у моих коллег, из книг или видео. Такие приёмы не должны оставаться в тайне, поэтому я ими и хочу поделиться!   1. Меньше кода = меньше багов Это может прозвучать тривиально, но всегда держите это в уме. Любую часть можно убрать, даже не сомневайтесь! Просто удалите. Неработающий код, неиспользуемые переменные, лишние скобки: каждый малейший знак учитывается. 2. Развивайте читабельность кода Это дополнение к пункту 1. Если хочется сократить код, всегда нужно помнить о том, что рано или поздно код будет прочитан другими людьми. Может, кто-то другой, может, через несколько месяцев, но будет очень неприятно, если придется потратить больше времени на разбор кода, чем было потрачено на его написание. Запомните: код всегда важнее, чем комментарии или документация. Следите за переменными и именами функций, они должны быть достаточно наглядными, чтобы потом не объяснять их в комментариях. 3. Не пугайтесь функций, возвращающих функции Когда я начал кодить на javascript, мне не нравился метод написания кода с использованием функций, возвращающих функции, потому что, казалось, этому сложно следовать в процессе выполнения. Но этот шаблон, довольно мощный и часто используемый, называется замыканием. Это действительно полезная функция и, как только вы используете её, она значительно облегчает структуру кода. И это первый шаг для погружения в функциональное программирование. 4. Извлекание частей Функция становится слишком большой? Сделайте из нескольких частей отдельные функции! Не совсем понятно? Выделите их в переменную и дайте ей понятное имя. Такой метод, конечно, схож со вторым пунктом, но это сделает ваш код более читабельным. А знаете ли Вы, что Ваша среда разработки может помочь? Ctrl + alt + v выражение извлекается в Webstorm и потом выделяется в переменную. Ctrl + alt + m сделает из него функцию. 5. Переверните мышление Это первый шаг перед TDD. Скорее всего, вы всегда знаете, чего хотите достичь. Так начните с конца, напишите ожидаемый результат и пишите код в обратном порядке, чтобы получить то, что хотите. Если будете писать в прямом порядке, вероятней всего, Вы начнете писать и проверять, работает ли оно. Поменяйте, проверьте, напишите что-то другое, проверьте и…. Возможно, это даже не особо полезно для достижения Вашей цели. Но такое мышление поможет сфокусироваться и потратить меньше времени. 6. Исключите условные операторы Если для функции у вас на уме принцип единственной ответственности, условным операторам тут не место. Они создают ветвления в потоке выполнения. И один маленький if позволит другим разработчикам добавить всё больше логики в него. Я считаю, что условные операторы if вообще не должны использоваться без else, а их размещение внутри другого условного оператора нужно полностью запретить! Опять же, такой подход делает код более сложным, и часто оказывается, что функция выполняет больше, чем нужно. Как же от этого избавиться? Смотрите следующий пункт. 7. Используйте lodash_.get вместо проверки null/undefined Очень часто, анализируя код, я вижу использование ifs для проверки null или undefined значений. Но без использования else! То есть идёт работа только с одним путём, а другой путь остаётся местом загадок (и багов!). Тут на помощь приходит Lodash (лучшее, написанное когда-либо на javascript) с его замечательной функцией get. Её первым аргументом является объект, над которым вы работаете, вторым – путь к дочерним атрибутам, которые вы хотите получить, и третьим является значение по умолчанию в случае с undefined. Два преимущества использования всего одной функции! 8. Используйте тернарные операторы Кто-то может поспорить насчёт их читабельности, но если правильно извлекать функции, они станут превосходным инструментом. Они также заставят Вас сотрудничать с else case. Плюс, они не позволяют содержать в себе больше кода. Чем меньше ваш код похож на смертельную пирамиду, тем лучше. 9. Никаких больше for loops, только map, reduce и filter Мы, наконец-то, подошли тут к теме функционального программирования, так как эти методы являются основой этого стиля. Хоть названия или теории не особо известны, они действительно помогут избежать тяжело читаемого императивного стиля для выражений for. Эти методы сейчас уже встроены в большинство браузеров, так что используйте их! Но если вам всё же нужна совместимость, можно использовать lodash аналоги. Итак, когда их использовать? Выражение for, имеющее дело со всеми точками входа – это map for + if , вероятно, filter sum или accumulation -  это просто reduce  С помощью сочетания этих методов вы можете сделать много работы в хорошей и краткой форме. 10. Читайте исходники Если документации недостаточно - читайте исходники! Это поможет Вам узнать, как их использовать и даст неплохое представление об их качестве. Плюс, некоторые библиотеки имеют исходники, встроенные в их документацию. Так с ними даже быстрее можно ознакомиться. С нашей IDE можно часто обращаться к источнику с помощью ctrl + clic на имя метода. Это отличный способ убрать магию и набраться вдохновения для собственного кода!   В заключение хотелось бы сказать, что это те принципы, которые помогают лично мне. Жаль, что я не знал их раньше, например, в школе… Зато ты знаешь их сейчас. И ими можно пользоваться практически в любом контексте. Некоторые из них распространяются не только на javascript, так что пользуйтесь ими где угодно :) Также хотелось бы обратить ваше внимание на великого Uncle Bob и его сайт . Вам определённо стоит посмотреть эти видео, даже несмотря на то, что они по большей части касаются Java, идеи применимы и в Javascript. Переведено с источника.
Пріоритет операторів у JavaScript (частина 2)

Автор: Олександр Марченко

Продолжение описания. Статья является продолжением статьи "Приоритет операторов в JavaScript", здесь будет проанализирована работа операторов дикремента и инкремента, а также рассказаны особенности применения сокращенной формы арифметических операторов.  В случае, если в любом математическом выражении используется сразу несколько разных операторов, то порядок их выполнения будет определяется приоритетом. Всем известно, что операция умножения будет выполнятся в выражении раньше, нежели операция сложения. Но, поскольку в JavaScript существует гораздо больше операторов, крайне полезно ознакомиться с таблицей приоритетов. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence. Рассмотрим простой пример: <script type="text/javascript">         var a = 3 + 4 * 5;     alert(a); </script> Оператор умножения * имеет приоритет несколько выше, чем оператор сложения +, при этом не важно, что стоит после него. Поэтому операция умножения будет выполнена первой, ее операндами будут значения 4 и 5, результат умножения станет вторым операндом в операции сложения. Оператор присваивания = имеет наименьший приоритет, следовательно, операция присваивания будет выполнена после операции сложения. В итоге получим значение a = 23. Приоритет операторов можно переопределить, используя скобки. Таким образом, получим следующее выражение: var b = (3 + 4) * 5; alert(b); Теперь результат сложения будет первым операндом в операции умножения, и получим результат b = 35. На практике, если вы точно не уверены в приоритетах используемых операторов, используя скобки, вы разбиваете сложное выражение на совокупность более простых, которые выполняются по отдельности. Инкремент и декремент. Довольно часто возникает потребность провести увеличение или уменьшение значения переменной, изменить элемент массива, увеличив его или уменьшив на единицу, для этого используются специальные операторы: Инкремент ++, выполняет изменение значения переменной, увеличивая на единицу. Может принимать две формы: постфиксный и префиксный. Декремент --, выполняет изменяет значение переменной, уменьшая на единицу, и также принимает две вышеупомянутые формы. Ознакомимся с отличиями постфиксного и префиксного изменения переменной на примере инкремента. <script type="text/javascript">      var myVariable1 = 1;      var myVariable2      myVariable1++; // myVariable1 = myVariable1 + 1;      document.write("Значение переменной myVariable1 = " " + myVariable1 + "");      ++ myVariable1; // myVariable1 = myVariable1 + 1;      document.write("Значение переменной myVariable1 = " " + myVariable1 + ""); // В случае когда в инструкции используется исключительно оператор инкремента, нет разницы какую форму мы используем.            myVariable2 = myVariable1++; // myVariable2 = myVariable1      document.write("Значение переменной myVariable2 = " " + myVariable2 + "");      document.write("Значение переменной myVariable1 = " " + myVariable1 + ""); // В данном случае значение переменной myVariable1 увеличивается на 1, но в переменную myVariable2 передается старое значение. Иначе говоря, сперва происходит операция присвоения myVariable2 = myVariable1, а затем увеличения myVariable1 = myVariable1 + 1         myVariable2 = ++ myVariable1; // y = myVariable1 + 1     document.write("Значение переменной myvariable2 = " " + myVariable2 + "");     document.write("Значение переменной myVariable1 = " " + myVariable1 + ""); // В этом случае, вызов ++ myVariable1 сперва увеличит переменную, и затем вернет ее значение (увеличенное значение) в переменную myVariable2. </script> Как видим, особенностью инкремента является наличие у него постфиксной формы, которая срабатывает лишь после завершения той инструкции, в которой она использовалась, т.е. после первой встречающейся точки с запятой «;», которая сигнализирует о завершении инструкции JavaScript. Что касается декремента, принцип его работы идентичен инкременту, с отличием лишь в том, что происходит операция вычитания единицы от единственного операнда. Если он стоит перед операндом, он уменьшает его на единицу и возвращает уменьшенное значение, в случае размещения после операнда – уменьшает операнд, и возвращает прежнее неизмененное значение. Сокращенная форма. Кроме операторов увеличения и уменьшения на единицу (инкремента и декремента), для упрощения записи простых арифметических операций (по типу x = x + 3;) существуют следующие специальные операторы: +=, -=, *=, /=, которые работают по следующему принципу: <script type="text/javascript">         var myVariable1 = 9;    myVariable1 += 3; // myVariable1 = myVariable1 + 3;    document.write("myVariable1 += 3 = "" + myVariable1 + "");        myVariable1 -= 3; // myVariable1 = myVariable1 - 3;    document.write("myVariable1 -= 3 = "" + myVariable1 + "");        myVariable1 *= 3; // myVariable1 = myVariable1 * 3;    document.write("myVariable1 *= 3 = "" + myVariable1 + "");    myVariable1 /= 3; // myVariable1 = myVariable1 / 3;    document.write("myVariable1 /= 3 = "" + myVariable1 + ""); </script> Применяя сокращенные операторы, важно помнить об их приоритете выполнения. В таблице приоритетов вы найдете приоритет сокращенных операторов ( +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |= ) одним из самых низких. После них находится только оператор множественного вычисления « , ». Это означает, что действия, заложенные в эти операторы, будут выполняться после всех прочих из вашего выражения наравне с оператором присвоения. Использование коротких форм применения операторов позволяет существенно ускорить написание вашего сценария и при должном внимании упростить процесс его создания. Зачастую подобное использование операторов применяют в написании тела условных и циклических конструкций.
Що повинен знати Java розробник у 2020 році?

Автор: Влад Сверчков

Язык программирования Java и ООП Алгоритмы и структуры данных Шаблоны проектирования Язык запросов SQL Технологии JDBC & Hibernate Java Enterprise Edition и фреймворк Spring MVC SOLID Модульное тестирование Git & GitHub Scrum Английский язык Выводы   Мы вновь приветствуем вас, друзья! На этот раз в нашей рубрике “Что должен знать разработчик...” под прицелом оказался такой многофункциональный язык программирования, как Java. В современном IT-рынке область веб-разработки является очень популярной, поэтому сегодня вы узнаете, каким стеком технологий должен обладать потенциальный соискатель вакансии Java веб-разработчика. Не будем медлить - начинаем!   Язык программирования Java (“Джава”) Опираясь на данные Stack Overflow Developer Survey (около 90 000 опрошенных респондентов), можно сказать, что язык Java входит в пятерку самых популярных. Это универсальный объектно-ориентированный язык программирования, который используется в создании различного информационного продукта: веб-приложений (серверной части); мобильных приложений под Android; облачных хранилищ данных; настольных приложений; компьютерных игр; программного обеспечения для банковских систем и т. д. Java был создан компанией Sun Microsystems в 1995 году. Он достаточно быстро завоевал популярность среди программистов и стал использоваться в создании клиентских приложений и серверного программного обеспечения. Java-приложения транслируются в специальный байт-код, выполняемый виртуальной машиной JVM (Java Virtual Machine), которая может быть установлена практически на любое устройство. Это делает программы, разработанные на Java, кроссплатформенными.    Что конкретно необходимо знать? Языком Java следует владеть на достаточно хорошем уровне, поэтому и список необходимых для освоения тем будет немаленьким.  Среди обязательных базовых разделов: машинная математика, переменные и типы данных, условные конструкции, логические операции, циклические конструкции, методы, рекурсия, массивы, объекты и классы, списки, обработка исключений, суперкласс Object, обобщения (Generics), работа с памятью. Далее идут более продвинутые темы: коллекции, карты (Map), основы вывода (IO, NIO), методы работы со строками (String, StringBuilder, StringBuffer), регулярные выражения, Date API, рефлексия, ClassLoader, аннотации, Javadoc, VarArgs, сериализация, клонирование, потоки и интерфейс Runnable, лямбда выражения, Stream API. Стоит знать, что совокупность вышеперечисленных разделов Java + ООП парадигмы в среде джавистов именуется Java Core (от англ. “core” - ядро). Дабы закрепить знания и не лишиться полученных навыков написания кода мы советуем вам как можно чаще практиковаться и решать прикладные задачки из интернета либо составленные самолично. Также советуем использовать онлайн-тренажеры, например, интерактивный тренажер от ITVDN. С его помощью вы сможете потренироваться в кодинге на Java и проверить свои знания.   Объектно-ориентированное программирование (ООП) Объектно-ориентированное программирование - это методология разработки программного обеспечения, в основе которой лежат четыре главных принципа: абстракция, инкапсуляция, наследование и полиморфизм. Поскольку Java является объектно-ориентированным языком, необходимость изучения и полного понимания ООП парадигм обязательно. Однако, есть и приятная новость: все принципы быстро и легко усваиваются во время изучения Java.   Алгоритмы и структуры данных Понимание алгоритмов и структур данных  - обязательное требование для любого программиста. Это необходимый фундамент, благодаря которому разработчик обучается написанию хорошего исходного кода путем подбора оптимальных формы представления информации и последовательности действий. Изучив структуры данных, вы сможете управлять сложностью своих программ, делая их более доступными для понимания, а также разрабатывать высокопроизводительные приложения, которые будут рациональнее работать с памятью. Знание алгоритмов позволит вам создавать сложные конструкции для эффективного решения широкого спектра задач на Java.   Шаблоны проектирования Паттерны (они же шаблоны) представляют собой архитектурные конструкции, которые описывают типичные способы решения распространенных задач, возникающих в ходе проектирования программного обеспечения. Всего существует более двух десятков шаблонов, однако виртуозно ими владеть должен архитектор ПО, а не рядовой разработчик. Обычно в одном проекте используется небольшое количество паттернов, поэтому вам достаточно знать лишь самые популярные из них.   SQL Structured Query Language - декларативный язык структурированных запросов, который создан для взаимодействия с базами данных. Особенность SQL состоит в том, что он лишь описывает необходимые компоненты и желаемые результаты, не указывая, как именно эти результаты должны быть получены. Каждый программный продукт подразумевает работу с данными, будь то обыкновенная процедура приема данных от сервера (например, скачивание файлов) или внесение в БД информации о новом зарегистрированном пользователе - умение работать с данными одинаково важно во всех сферах разработки, разве что за исключением FrontEnd. Также изучите одну из систем управления базами данных (СУБД). Это может быть  MySQL либо PostgreSQL. Их главное отличие от SQL в том, что SQL - это язык запросов, а MySQL/PostgreSQL - реализации СУБД, имеющие свой диалект языка SQL.   XML Extensible Markup Language - расширяемый язык разметки, с помощью которого можно структурировать данные для удобства их дальнейшей обработки. Прежде всего нацелен на использование в интернет среде и являет собой формат хранения и передачи данных на сервер. XML хорошо масштабируем, сочетает в себе простой и удобный синтаксис, а также базируется на кодировках Юникод для представления содержания документов.   JDBC & Hibernate Java Database Connectivity - это стандарт взаимодействия Java-приложений с различными СУБД. Простыми словами, JDBC имеет единый интерфейс, позволяющий любой Java-программе работать с любой базой данных одинаковыми методами. Для реализации этого универсального взаимодействия применяются специальные драйвера (не те, которые мы привыкли устанавливать на наши компьютеры). Как результат - программа никак не меняется от переключения с одной базы данных на другую, что дает JDBC весомую значимость в Java разработке. Hibernate - это ORM (от англ. “Object-Relational Mapping” - объектно-реляционное отображение) фреймворк, главная задача которого отображение объектно-ориентированной модели данных в традиционные реляционные базы данных, то есть, связывание ООП с реляционной БД. Представляет собой программное обеспечение с открытым исходным кодом.   Java EE / Spring Java Enterprise Edition - это платформа для создания корпоративных решений с помощью языка Java. Чаще всего на ней разрабатывают различные веб-приложения и веб-сервисы. Java EE включает в себя множество спецификаций (JSP, EJB, CDI, JPA, Servlet и прочие), главная задача которых состоит в обеспечении масштабируемости приложений и целостности данных во время работы системы. Spring - популярный фреймворк с открытым исходным кодом, который используют для создания веб-приложений на Java. Он дает Java-разработчикам большую свободу в проектировании приложений, предоставляя средства решения проблем корпоративного масштаба. Является альтернативой Java EE в создании веб-сервисов. Spring имеет обширную документацию и достаточно прост в использовании. Максимальной популярностью на данный момент пользуется именно Spring. Его лучше всего выбирать при создании небольших приложений или программ с микросервисной архитектурой. Java EE больше подходит для разработки легко масштабируемых монолитных приложений.   MVC (Model-View-Controller) Архитектурный шаблон, который предусматривает разделение приложения на три компонента: Модель, Представление, Контроллер, что способствует реализации концепции распределения и закрепления ответственности за каждым компонентом. Данный подход позволяет упростить и ускорить разработку проектов, благодаря чему паттерн MVC широко применяется множеством разработчиков. Java EE и Spring имеют специальные MVC-надстройки, которые обеспечивают удобное использование данного шаблона.   Scala (опционально) Строго типизированный мультипарадигмальный язык программирования. Одной из его особенностей является комбинирование стандартного ООП подхода с функциональным программированием. Scala, как правило, применяется в мощных системах с большим объемом данных и внушительным количеством пользователей. Данный язык программирования подходит для машинного обучения и анализа данных. Scala не является обязательной к изучению для Java программистов. Однако, ее знание будет огромным плюсом на собеседовании. В дальнейшем вы сможете переквалифицироваться в полноценного Scala разработчика, имея необходимый бэкграунд, полученный во время Java разработки.   SOLID Акроним, который обозначает пять основных принципов объектно-ориентированного программирования. Следование стандарту SOLID позволяет создавать легко поддерживаемые и масштабируемые проекты с удобной архитектурой и минимальным количеством “запахов кода”. Также знание данных принципов показывает грамотность разработчика, уровень его профессионализма. Это безусловно сыграет вам на руку на собеседовании.    Unit тестирование Тот самый тип тестирования, который берет на себя не тестировщик, а сам программист. Идея - в написании тестов под каждую нетривиальную функцию либо метод. Цель модульного тестирования — изолировать отдельные части программы и показать, что по отдельности они являются работоспособными. Таким образом происходит проверка кода на регрессию и соответствующее обнаружение ошибок.   Git & GitHub Git - наиболее популярная система контроля версий, которая позволяет вести историю разработки проекта с возможностью доступа к каждой сохраненной версии. В роли главного конкурента Git выступает SVN (централизованная система, в отличие от Git). Помимо этого, стоит уметь работать с сервисом онлайн-хостинга проектов, использующих систему контроля версий. В данном случае это GitHub. В тандеме с Git он позволяет разработчикам сохранять свой код онлайн, а затем взаимодействовать с другими разработчиками в разных проектах. Данные системы позволяют команде программистов работать над одним проектом одновременно, сохраняя внесенные изменения, а также отслеживать выполнение задач каждым членом группы.   Scrum Методология ведения разработки программного обеспечения, которая относится к семейству гибких (Agile). Исповедует командный подход к созданию ПО, короткие итерации, частые выпуски новых версий продукта, учет изменений и непрерывное улучшение в процессе работы. Scrum применяется не только в IT, но и в производстве, маркетинге, консалтинге и прочих сферах. Множество команд разработки ПО успешно применяют данную методологию, поэтому ее важность сложно переоценить.   Английский язык Знание английского языка - естественное требование для каждого разработчика в IT, поскольку большинство новых сведений о технологиях, курсы, учебные и справочные материалы появляются в первую очередь на английском. Для работы в команде разработчиков обычно знаний языка на уровне чтения технической документации и комментирования кода вполне достаточно, однако если вы планируете самостоятельно вести переговоры и переписку с иностранным заказчиком, ваш уровень должен быть выше.   Выводы Таким образом мы с вами рассмотрели основные технологии, которыми должен владеть кандидат, стремящийся занять должность Java разработчика. Сам Java уже много лет прочно удерживает высокие позиции во всевозможных рейтингах языков программирования и покидать свой пьедестал не собирается, о чем свидетельствуют следующие статистики: dou.ua (Украина), tiobe.com (Tiobe - нидерландская компания, которая занимается оценкой качества программного обеспечения),  вышеупомянутый Stack Overflow Developer Survey и другие информационные ресурсы. Несмотря на то, что в статье мы была затронута именно путь веб-разработчика на Java, данный язык успешно применяется в разработке Android-приложений (Kotlin и Objective-C), разработке объемных программных систем; также на нем можно писать настольные игры (хотя он не имеет таких инструментов создания игр, как у платформы .NET). Java достаточно универсален и способен на практически все что угодно в руках умелого программиста. А таковым вы можете стать с помощью наших курсов, направленных на интенсивное изучение языка Java. Программа обучения предлагает 23 видео курса общей продолжительностью более 160 часов. Также ITVDN предоставляет интерактивный тренажер, с помощью которого можно отточить навыки написания кода на различных языках, в том числе и на Java.   Если вам понравилась эта статья, поделитесь информацией с теми, кому она может быть интересна. Пишите в комментариях, на какие еще вопросы, связанные с выбором специальности и планированием обучения вы хотите получить ответы. Мы постараемся ответить на них в наших новых обзорах.
Забезпечення якості ПЗ та тестування: що в них загального та різного?

Автор: Редакция ITVDN

Введение Статья приводит примеры и доводы, которые способны развеять некоторые распространенные заблуждения, касающиеся роли тестирования и обеспечения качества ПО (SQA), а также выработать рекомендации для успеха SQA-команд. Условия тестирования и обеспечения качества ПО (QA) часто используются в IT-индустрии профессионалами тестирования (часто классифицируемыми как профессионалы по обеспечению качества). Несмотря на то, что оба понятия видят общей целью качество продукта, принципиальное различие между ними состоит в том, что тестирование проводится после того, как продукт был создан или в случае статических испытаний после того, как документ был написан. В отличие от этого контроль качества подразумевает деятельность, которая обеспечивает качество продукта на всех этапах его создания. Чтобы оценить различия между тестированием и QA, важно сначала понять тесно связанные с ними понятия - контроль качества (QС) и обеспечение качества (QA). Контроль Качества (QС)   ISO9000 определяет Контроль Качества (QС) как часть менеджмента самого качества, сосредоточенную на выполнении требований по отношению к оценке количества багов (при их наличии) в продукте. Контроль качества представляет собой набор процессов/действий, направленных на оценку разработанного продукта (проекта документа, системы развития и т. д.) и показатель соответствия требованиям заказчика. Это гарантирует проверку поставляемой продукции на качество и определяет, насколько хорошо она продумана и создана. Его цель заключается в поисках дефектов и обеспечении их исправления. Таким образом, тестирование является неотъемлемой частью контроля качества. FIGURE 1 Обеспечение качества (QA) ISO9000 определяет обеспечение качества ПО как часть менеджмента качества, ориентированную на создание уверенности в том, что требования к устранению багов будут выполнены. Целью QA является обеспечение гарантии того, что продукт будет соответствовать ожиданиям качества заказчика. Она состоит из процессов/действий, направленных на обеспечение качества разработки продукта на каждом из его этапов. Эти действия, как правило, предшествуют развитию продукта и продолжаются, пока процесс пребывает в состоянии развития. На самом QA лежит ответственность за разработку и внедрение процессов и стандартов для улучшения жизненного цикла разработки, и обеспечение уверенности в том, что эти процессы выполняются. Фокусом QA является предотвращение дефектов на всех этапах его реализации и постоянное его совершенствование. В то время, как QA является активной деятельностью, QC – наоборот, пассивной. Примеры деятельности по обеспечению качества включают установление стандартов и процессов, проверки качества и выбор инструментов. FIGURE 2 Отличия между обязанностями QA команд и тестировщиков: Тестировщики выполняют планирование тестирования, анализ результатов испытаний, проверку тестов, проверки и тестирования отчетности через различные уровни испытаний. В отличие от этого, QA-команды выполняют следующие функции: Реализация организационной политики касаемо качества, стандартов и процессов; Оказание помощи с подготовкой в области обеспечения качества и планов обеспечения качества проекта; Проверка соответствия процессов проекта планам качества; Проведение регулярных проверок проектных продуктов и процессов, а также представление регулярных оценок для высшего руководства; Эскалация ситуации, когда есть отклонения от руководящих принципов или стандартов.  Ведут контроль за: Выполнением независимых обзоров; Наличием процедур управления изменениями проектов; Наличием процедур управления конфигурациями проектов; Наличием ретроспективы того, что процессы планируются и воплощаются; Обеспечением уверенности в качестве путем развития системы жизненного цикла; Проведением непрерывных улучшений в процессе контроля качества и воплощением рекомендаций, основанных на усвоенных ранее уроках. Эти атрибуты определяются как QA-обязанности команды, но следует отметить, что это не означает их развитие командой QA, а, скорее, обеспечение их реализации в манере, которая является "пригодной для целей". В рамках своей роли по контролю качества тестировщики могут выдвигать требования по проверке образцов документов проекта, деятельности по управлению конфигурациями программного обеспечения, дизайна, кода и т.д. Отличия между планированием испытаний и документацией в тестировании и QA:   Тестировщики подготавливают тестовые стратегии и планы, основанные на базовых тест-документах, таких как бизнес-требования и проектные решения. Эти документы планирования тестирования являются основой испытания процессов на различных запланированных испытательных уровнях. Эти уровни и есть тест приемки, вход и критерии выходов между уровнями, подробные графики испытаний, экологические требования, управление дефектами, управление тестированием и ведение отчетности.  В отличии от этого, обеспечение качества программного продукта или планы качества включают более широкий набор действий на протяжении всех этапов разработки. Это играет свою роль в разработке методологий управления проектами, например Prince2, которая поощряет использование планов по качеству проекта и журналов качества, которые были разработаны в начале жизненного цикла, при инициировании проекта. Типичный проект плана качества включает в себя ожидания клиентов, критерии приемки, плановый контроль качества и аудита процессов, планы управления конфигурациями и процедуры управления изменениями. Планы по качеству для проектов используют политику самой организации в этой сфере, стандарты или руководящие принципы, являющие собой основы обеспечения качества. Мониторинг плана обеспечения качества проекта в ходе создания проекта осуществляется беспрерывно и обновляет результаты планируемого качества деятельности в журнале. Существуют различные точки пересечения между управлением рисками и качеством, и поэтому реестр рисков может сделать весомый взнос в подготовку планов по качеству. Кто выполняет функцию обеспечения качества в организации Потребность в команде по обеспечению качества программного обеспечения растет с размером организации и уровнем ее политики в области качества. Там, где требуется такая команда, очень важно, чтобы функция QA оставалась независимой от проекта и оперативных групп. Их линия связи, однако, должна предоставлять им мощную поддержку именно в том виде, в каком это требуется. Некоторые организации имеют функцию QA, встроенную в их предприятия отдельным звеном - Офисом управления проектами. Это отвечает критериям независимости, однако, организации, что следуют этой модели, необходимо убедиться, что эта команда состоит из обученных и/или специализированных аналитиков по обеспечению качества. Наблюдения и рекомендации для успешных QA-команд В то время как Вы берете на себя ответственность за обеспечение качества программного обеспечения, Вы можете испытать целый ряд проблем. Некоторые из этих проблем очерчены ниже. Независимость Чтобы быть успешными, QA-команды должны быть независимыми от проекта и оперативных групп. Это обеспечивает команде возможность проведения объективной оценки проектов. Возникает вопрос: следует ли функциям тестирования и QA находиться в одной команде? Это может хорошо работать в небольших организациях, однако появляется недостаток в виде создания возможного конфликта интересов при мониторинге деятельности тестирования. Это и подчеркивает заблуждение в том, что тестирование и QA являются синонимическими понятиями. Решение проблемы: в зависимости от политики самой организации в сфере качества, она может иметь отдельную команду отчетности для старшего менеджера, отвечающего за функции. Отношения внутри команды Если аналитики обеспечения качества слишком процессно-ориентированные и настаивают на процессах или документации, которые могут не иметь особого значения, это может ухудшать отношения с руководителями проекта. QA-команде будет намного легче работать с проектными группами, если они держат в уме "пригодный для целей" принцип. Предоставление помощи и содействия проектных команд формирует основу для поддержания хороших отношений, что является важным аспектом успешного тестирования. Завлечение нужных людей Еще один ингредиент для успешной деятельности QA-команд – качественная кадровая политика. Люди с опытом в области разработки жизненного цикла системы или программного обеспечения, будут хорошими кандидатами для роли в QA. Некоторые знания в рамках ISO и принципов CMMI дополнили бы знания того, кто уже имеет опыт в развитии процесса и неподдельный интерес к качеству. Контрольные списки Стандартные контрольные списки являются полезным механизмом для проведения аудита проектов, особенно если они разработаны в соответствии с фазами жизненного цикла разработки. Например, на этапе проектирования в перечень вопросов может быть снесено: "Есть ли прослеживаемость между дизайном и требованиями элементов?" Чтобы избежать разочарования менеджеров проекта, важно обеспечение участия в проекте заинтересованных сторон, чтобы получить от них обратную связь, когда будут предложения по внесению в перечни изменений. Связь и отчетность Хотя регулярная отчетность для высшего руководства очень важна, разработка правильных шаблонов и показателей, обеспечение топ-менеджеров требуемой информацией гарантирует, что этим отчетам уделяется должное внимание. Это лучше всего достигается путем проведения встреч с соответствующими представителями высшего руководства, предоставления им отчетов и получения от них отзывов и комментариев. Командам QA необходимо постоянно получать одобрение внесения изменений в процессы контроля качества и стандартов и обеспечивать эффективное взаимодействие с заинтересованными сторонами. Постоянное совершенствование Уроки, извлеченные из проектов, обеспечивают QA-команду основой для оценки процессов и рекомендациями по обеспечению качества, включая постоянные улучшения. Это включает разработку перечней, гибкость, поддерживаемость хороших отношений с заинтересованными сторонами и внесения улучшений в управленческую отчетность. Так, непрерывные усовершенствования могут также потребовать внесения изменений в методологии разработки системы, потому QA-командам рекомендуется сохранять методологию разработки ИТ-отдела. Преимущества Успешная QA-команда может добавить значительную ценность для организации. Некоторые из этих преимуществ включают в себя: Повышение качества производимой продукции Последовательность в процесах, используемых для доставки Продолжение совершенствования организации процессов Снижение общих расходов на доставку Увеличение приложений для документаци по поддержке продукта Недостатки Первоначальные затраты в штатном расписании аналитиков обеспечения качества ПО Усложнение процессов, которые могут генерировать разочарование в некоторых сотрудниках Выводы Сопоставление различий в деятельности и ответственности между контролем качества и обеспечением качества дает им хорошую оценку в различных условиях. QC подтверждает, что конкретные результат отвечают стандартам и спецификациям. В отличие от этого, QA является более широкой функцией, что охватывает планирование и контроль на протяжении всего жизненного цикла разработки. Тестирование, с другой стороны, является неотъемлемой частью контроля качества. Для того, чтобы организация эффективно осуществляла процессы управления качеством, эти потоки должны работать в тандеме. Источник: http://www.planit.net.au/resource/software-quality-assurance-is-it-the-same-as-testing/
Notification success