Результати пошуку за запитом: начальный курс c
Асинхронне програмування на JavaScript
Автор: Дмитро Охріменко
План:
1. Різниця між синхронним та асинхронним кодом
2. Багатозадачність процеси й потоки, у чому різниця
3. Особливості багатозадачності в JavaScript
4. Асинхронні операції на практиці HTTP-запит як найпоширеніший кейс
5. Підходи до написання асинхронного коду:
Promise
Async/Await
Observable
6. Практичні поради
Різниця між синхронним та асинхронним кодом
Для початку давайте визначимо ці два терміни:
Синхронний код - це код, який виконується послідовно, функція за функцією.
Асинхронний код - код, який може виконуватися паралельно: наступна функція запускається, не чекаючи завершення попередньої.
Щоб провести аналогію з реального життя, уявімо кухаря. Якщо кухар працює синхронно, то поки він не завершить приготування однієї страви, не переходить до наступної. Але це неефективно й призводить до втрати часу. Якщо ж кухар діє асинхронно, то поки м’ясо запікається в духовці, а на плиті закипає вода, він нарізає овочі. Тобто він один, але не стоїть без діла - виконує інші задачі, поки щось готується саме.
Уявімо, що кухар - це процесор. А запікання м’яса в духовці - це завантаження файлу з мережі. Кухар може просто стояти й дивитись, як м’ясо готується. А може нарізати овочі, перевіряти, чи не з’явились нові замовлення, або скролити стрічку в соцмережі. Так само і з програмами: поки мережева карта завантажує файл, процесор не мусить чекати - він може малювати інтерфейс, оновлювати прогрес-бар чи виконувати обчислення у фоні. Але для цього потрібно правильно написати код - так, щоб він міг працювати асинхронно.
Код який виконується синхронно
```js
console.log("Початок");
console.log("Дія");
сonsole.log("Кінець");
```
Результат:
Початок
Дія
Кінець
Код який виконується асинхронно. і
``js
console.log("Початок");
setTimeout(() => { // за допомогою setTimeout ми відкладаємо запуск коду на певний час
console.log("Дія через 2 секунди");
}, 2000);
сonsole.log("Кінець");
```
Результат:
Початок
Кінець
Дія через 2 секунди
Це не та багатозадачність, як у деяких інших мовах програмування. Тут не використовуються додаткові потоки, а все працює завдяки механізму подій. Але про це детальніше дал
Багатозадачність: процеси й потоки, у чому різниця
Багатозадачність в операційній системі - це можливість запускати та керувати кількома задачами одночасно. Наприклад, працювати в браузері, слухати музику, завантажувати файл і паралельно редагувати код у Visual Studio.
На практиці процесор дуже швидко перемикається між усіма цими задачами, створюючи ілюзію одночасного виконання. Якщо процесор багатоядерний - деякі задачі справді можуть виконуватись паралельно.
Багатозадачність тісно пов'язана з двома важливими поняттями - процесами та потоками.
Процес (process) - це окремий екземпляр програми у пам'яті, який має власні ресурси: виділену область оперативної пам'яті, дескриптори файлів, змінні оточення тощо.
Потік (thread) - це одиниця виконання всередині процесу. Потоки одного процесу працюють незалежно, але мають спільний доступ до пам'яті та ресурсів процесу.
Процеси дозволяють запускати різні програми одночасно - наприклад, Google Chrome, Visual Studio Code і т.д.
Потоки дають змогу виконувати кілька задач усередині однієї програми. Наприклад, у Visual Studio Code один потік відповідає за оновлення інтерфейсу, інший перевіряє помилки в коді, ще один формує підказки під час написання. Це, звісно, спрощений приклад - у реальності VS Code використовує ще й окремі процеси для розширень і мовних серверів.
Операційна система керує як процесами, так і потоками. Вона розподіляє процесорний час між ними, ставить у чергу, може призупиняти виконання або відновлювати його за потреби.
Давайте трохи адаптуємо наш приклад з кухарем із попереднього посту. Уявімо, що процес - це ресторан, а потік - це кухар. Ресторан має все необхідне для приготування їжі: кухонне приладдя, продукти, рецепти (це можна розглядати як пам’ять і доступ до інших ресурсів). Кухар читає рецепт і, використовуючи ресурси ресторану, готує страву - так само, як потік виконує інструкції нашої програми, використовуючи ресурси процесу. Якщо ресторан хоче готувати кілька страв одночасно, йому потрібно більше кухарів, які працюють паралельно на одній кухні. Аналогічно, якщо програма повинна виконувати кілька задач одночасно - завантажувати файли, обробляти введення, оновлювати інтерфейс - вона може використовувати кілька потоків.
Коли ми створюємо програму і хочемо зробити її зручною для користувача, а також ефективною з точки зору використання ресурсів, які виділяє операційна система на процес, ми іноді починаємо використовувати потоки та прийоми багатопотокового програмування. Це велика окрема тема, і ми її зараз чіпати не будемо. Одна з причин - у JavaScript немає прямого доступу до потоків.
Уточнення. Якщо ви хочете використовувати JavaScript і все ж таки працювати з потоками - у вас є Web Workers:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers
А якщо JavaScript виконується не в браузері (наприклад, у Node.js), тоді можна використовувати модуль `worker_threads`. Але варто розуміти, що це не частина стандарту мови, а можливість середовища виконання.
Додаткові корисні ресурси по цій темі:
https://www.youtube.com/@CoreDumpped - канал з короткими відео про те як працює комп'ютер.
Modern Operating System by Andrew Tanenbaum - принцип побудови та роботи операційних систем (може бути викликом для новачка, але нормально як для технічної книжки)
Особливості багатозадачності в JavaScript
JavaScript працює в одному потоці - це означає, що в будь-який момент часу виконується лише один фрагмент коду. Увесь код, який ми пишемо, виконується у call stack: це структура, в яку потрапляють усі функції, що викликаються.
Якщо одна з функцій виконується довго (наприклад, важке обчислення), усі інші задачі - включно з обробкою кліків, рендерингом чи відповідями від сервера - будуть чекати, поки call stack не звільниться.
Щоб не блокувати цей єдиний потік, браузер надає асинхронні API (setTimeout, fetch, Web API). Коли ми викликаємо, скажімо, fetch(), у стек додається лише короткий виклик цієї функції. Власне мережевий запит виконується в окремому потоці, який створює браузер. Тобто, один потік виконує задачі які є у call stack, а інший потік чекає поки відповідь поверне сервер.
Але асинхронна операція колись завершиться і треба механізм який віддасть нашому головному потоку результат роботи іншого потоку. Коли це стається колбек або проміс‑резолвер не додається одразу у call stack. Спершу він потрапляє до черги подій (task queue). За роботою черги стежить event loop. Його правило просте - поки стек порожній дістати першу задачу із черги і покласти у стек.
Так ми досягаємо псевдобагатозадачності: основний потік виконує короткі шматки коду послідовно, а довгі операції «живуть» поза стеком. Коли довгі операції завершуються вони формують чергу задач, які треба виконати а event loop ці задачі закидає до стеку, коли call stack стає порожнім.
Це максимально спрощене пояснення, і без візуалізації може здатися складним. Якщо хочете краще зрозуміти, дуже раджу подивитись відео Jake Archibald — "In The Loop" на YouTube (англійською). https://www.youtube.com/watch?v=8aGhZQkoFbQ
Або приходьте на мій курс JavaScript Поглиблений, де ми розбираємо це на практиці.
Також корисна стаття на MDN, де ці процеси описані докладніше.
Асинхронні операції на практиці: HTTP-запит як найпоширеніший кейс
Один з прикладів асинхронної операції - це запит на сервер через HTTP-протокол. Якщо організовувати запит через JavaScript у браузері без використання React, Angular або Vue.js, то це можна зробити за допомогою:
fetch
XMLHttpRequest
Спеціалізована бібліотека, наприклад, Axios
Ось так буде виглядати простий код написаний на fetch
```js
fetch('https://jsonplaceholder.typicode.com/users')
.then(res => res.json())
.then(data => console.log(data));
```
А так на axios (axios одразу повертає розпарсений JSON як response.data, на відміну від fetch, де потрібно викликати .json() вручну)
```js
axios.get('https://jsonplaceholder.typicode.com/users')
.then(response => console.log(response.data));
```
Якщо розглянути саме fetch то ось що відбулося під капотом:
fetch створює HTTP запит вказавши HTTP метод, заголовки, тіло тощо
Цей запит передається у вбудовану систему Web API - окрему від JavaScript середу, яка працює в іншому потоці.
JavaScript не чекає відповіді - основний потік продовжує виконувати інший код
fetch повертає Promise - об'єкт, що представляє асинхронну операцію, результат якої з’явиться пізніше
Коли відповідь від сервера приходить, Web API кладе callback в чергу.
Event Loop перевіряє, чи call stack порожній, і виконує цю мікрозадачу.
Така поведінка дозволяє браузеру одночасно виконувати інші задачі, не чекаючи завершення запиту.
Про використання асинхронного коду в JavaScript є [безкоштовний урок на YouTube](https://www.youtube.com/watch?v=cvR1EQ1R0EQ)
Також більше про синтаксис Promise можна дізнатися в уроці [Асинхронний код. Promise](https://itvdn.com/ua/video/javascript-essential-ua/js-promise-ua) на ITVDN, а детальніше про варіанти організації такого коду буде написано далі.
Підходи до написання асинхронного коду
Складність роботи з асинхронним кодом полягає в тому, що обробка результату операції відбувається не відразу, а через певний час після її запуску. Ми ініціюємо асинхронну операцію й можемо виконувати інші завдання, але все одно маємо якось дізнатися про її завершення та обробити результат. Проблема в тому, що в цей момент програма вже виконує інші дії.
Тому для обробки асинхронних операцій використовується push-модель взаємодії: отримувача даних (наш код) викликає провайдер даних - окремий механізм, який керує асинхронною операцією. По суті, розробнику потрібно відреагувати на подію завершення асинхронної операції. Для цього існує кілька підходів:
callback-функція
Promise
async/await (синтаксичний цукор над Promise)
Observables
Використання функцій зворотнього виклику (callback)
Почнемо з callback-функцій. Це найпростіший підхід, але він може призвести до заплутаного коду, особливо коли одна асинхронна операція запускає іншу, і так утворюється ланцюг.
Уявімо, що маємо функцію downloadImage(url, callback), яка завантажує зображення асинхронно, не блокуючи основний потік. Перший параметр - це адреса зображення, яке потрібно завантажити, а другий - функція, яку буде викликано після завершення завантаження. При цьому саме зображення буде передане як параметр у callback.
Приклад використання:
```js
downloadImage(url1, image => document.body.append(image))
```
На перший погляд усе просто. Але якщо потрібно завантажити кілька зображень послідовно, код стає менш зрозумілим:
```js
downloadImage(url1, image => {
document.body.append(image);
downloadImage(url2, image => {
document.body.append(image);
downloadImage(url3, image => {
document.body.append(image);
})
})
});
```
Така вкладена структура швидко ускладнюється, особливо якщо замість одного рядка з DOM-змінами з’являється додаткова логіка. Подібний стиль називають "Pyramid of Doom", і його краще уникати.
Один зі способів спростити обробку асинхронних викликів - це використання Promise.
Використання Promise
Promise - це об’єкт, який представляє асинхронну операцію. У перекладі з англійської promise означає «обіцянка». Можна уявити, що це обіцянка від браузера надати в майбутньому або результат операції, або помилку, пов’язану з її виконанням.
Приклад використання: перепишемо попередню функцію downloadImage, щоб вона повертала Promise.
```js
let promise = downloadImage(url1);
promise.then(image => document.body.append(image));
```
Тут ми все одно використовуємо callback-функцію, але передаємо її вже в метод .then() об’єкта promise. Це важливий момент:
тепер асинхронна операція має об’єктне представлення, яке можна передавати як параметр у різні частини коду;
можна будувати ланцюжки промісів, позбуваючись вкладеності, яка виникала з callback.
Приклад:
```js
downloadImage(url1) // отримуємо проміс
.then(image => { // вказуємо що робити коли promise перейде в стан resolved
document.body.append(image);
return downloadImage(url2); // виконуємо метод, який повертає promise
})
.then(image => { // результат роботи попереднього промісу передається як значення
document.body.append(image);
return downloadImage(url3);
})
.then(image => {
document.body.append(image);
});
```
Тепер код виглядає лінійним і набагато зручнішим для супроводу.
У прикладах вище ми не розглядали, як саме створюється Promise, адже важливо зрозуміти мотивацію використання цих об’єктів. Тим більше, що більшість API браузера вже повертають готові проміси. Наприклад:
```js
fetch('<https://jsonplaceholder.typicode.com/users>')
.then(res => res.json());
```
Якщо хочете детальніше розібратися зі створенням Promise вручну - перегляньте документацію на MDN або мій відео урок на ITVDN.
Async/await
Супроводжувати синхронний код завжди простіше, ніж асинхронний. У 2012 році в мові C# з’явився синтаксичний цукор, який значно спростив роботу з асинхронними операціями: замість вкладених callback можна було використовувати послідовний синтаксис з новими ключовими словами async та await. Згодом цю концепцію перейняли й інші мови програмування, зокрема Python та JavaScript. В JavaScript підтримку async/await додали у 2017 році.
Призначення ключових слів
async - додається до функції та вказує, що вона завжди повертає Promise.
await - використовується перед об’єктом-промісом, щоб "дочекатися" результату перед виконанням наступних рядків коду.
Перепишемо попередній приклад із завантаженням зображень, використовуючи async/await:
```js
let image = null;
image = await downloadImage(url1);
document.body.append(image);
image = await downloadImage(url2);
document.body.append(image);
image = await downloadImage(url3);
document.body.append(image);
```
Тепер код виглядає як звичайний синхронний: немає вкладених callback, усе читається рядок за рядком. Можна подумати, що await "зупиняє" виконання, очікуючи на результат промісу. Насправді ж код не блокує основний потік - під капотом він перетворюється на машину станів, де кожен стан описує дію до або після await.
Ще одна перевага async/await - знайомий синтаксис для обробки помилок:
```js
try {
let image = null;
image = await downloadImage(url1);
document.body.append(image);
image = await downloadImage(url2);
document.body.append(image);
image = await downloadImage(url3);
document.body.append(image);
} catch (ex) {
// обробка помилки
}
```
У результаті асинхронний код виглядає так само зрозуміло, як і синхронний, що значно спрощує його супровід.
Observable
Observable - це ще один підхід до організації асинхронного коду. Назва походить від однойменного патерна проєктування (Observer pattern), який описує створення об’єктів, за якими можна «спостерігати», отримуючи від них сповіщення. Тобто це реалізація подієвої моделі за допомогою ООП.
У сучасному JavaScript ця ідея пішла далі й стала основою реактивного програмування та бібліотеки RxJS.
Якщо Promise представляє одне майбутнє значення (успішне або помилкове), то Observable - це потік значень, які можуть з’являтися з часом.
Можна уявити:
Promise - це одна посилка, яку ви отримаєте в майбутньому;
Observable - це підписка на журнал, нові випуски якого надходитимуть регулярно.
Щоб створити Observable, використовують конструктор або готові оператори RxJS. Наприклад, функція downloadImages(urls) може завантажувати кілька картинок і відправляти їх «у потік» по мірі завантаження:
```js
import { Observable } from 'rxjs';
function downloadImages(urls) {
return new Observable(subscriber => {
urls.forEach(url => {
downloadImage(url, image => {
subscriber.next(image); // надсилаємо картинку у потік
});
});
subscriber.complete(); // повідомляємо, що потік завершено
});
}
```
Щоб використати Observable, на нього треба підписатися за допомогою subscribe:
```js
downloadImages([url1, url2, url3])
.subscribe({
next: image => document.body.append(image), // що робити з новим значенням
error: err => console.error(err), // обробка помилок
});
```
Переваги Observable
працюють із потоком даних, а не з одним результатом;
підтримують підключення операторів трансформації (фільтрація, мапінг, комбінування потоків);
можна легко скасувати виконання (відписатися від потоку).
Нижче приклад обробки даних через оператори. В RxJS оператори підключаються через метод pipe:
```js
import { filter, map } from 'rxjs/operators';
downloadImages([url1, url2, url3])
.pipe(
filter(image => image.width > 100), // пропускаємо лише великі картинки
map(image => {
image.classList.add('highlight');
return image;
})
)
.subscribe({
next: image => document.body.append(image),
error: err => console.error(err),
complete: () => console.log('Готово')
});
```
Таким чином, як і у випадку з Promise, можна будувати ланцюжки обробки. Але Observable значно гнучкіші: вони дозволяють працювати не лише з одним значенням, а з динамічною послідовністю даних у часі.
Для глибшого занурення рекомендую офіційний гайд Observable на RxJS.dev. та відео уроки Observables. Частина 1, та Observables. Частина 2[1]
Практичні поради по работі за асинхроним кодом
Не змішуйте підходи без потреби
Якщо почали писати з async/await, не вставляйте всередину .then() без особливої причини. Це ускладнює читання.
Обробляйте помилки
Використовуйте try/catch для async/await або .catch() для Promise. У випадку Observable завжди додавайте обробку error у subscribe().
Скасовуйте непотрібні операції
Для Observable використовуйте unsubscribe(), коли потік більше не потрібен. Для fetch можна застосувати AbortController, щоб зменшити навантаження й уникнути витоків пам’яті.
Уникайте "Pyramid of Doom"
Замість вкладених callback застосовуйте Promise, async/await або Observable.
Використовуйте паралельне виконання
Якщо операції незалежні, запускайте їх одночасно через Promise.all().
Ізолюйте логіку обробки
Розділяйте завантаження даних та маніпуляції з DOM. Це спростить тестування й повторне використання коду.
Логуйте стан і помилки
Під час розробки виводьте у консоль ключові події асинхронних операцій, щоб відстежувати їх послідовність.
Пам’ятайте про event loop
Розуміння різниці між мікрозадачами й макрозадачами допоможе прогнозувати порядок виконання коду.
Перевіряйте сумісність середовища
Деякі API можуть бути відсутні у певних середовищах (наприклад, fetch у Node.js доступний лише починаючи з версії 18).
Чи не пізно починати навчання після 30 років?
Автор: Редакция ITVDN
Коли мова заходить про зміну професії або навчання з нуля, багато хто ставить собі запитання: «А чи не запізно вже? Мені ж 30, а в когось у цьому віці вже 10 років досвіду».
Цей страх знайомий дуже багатьом. Але насправді він не має під собою серйозних підстав.
Міф 1. Після 30 вже занадто пізно
Як думають:
У 20 років люди швидше сприймають нову інформацію, легше адаптуються до змін і мають більше часу «на помилки». А після 30 начебто потрібно просто «триматися» за стабільність і не ризикувати.
Насправді:
30 — це навіть кращий вік для початку. У вас вже є:
життєвий досвід і вміння робити усвідомлений вибір;
чітке розуміння своїх сильних і слабких сторін;
внутрішня мотивація, яка базується не на чужих очікуваннях, а на особистих цілях.
Більшість студентів після 30 кажуть, що навчаються ефективніше, ніж у 20. Чому? Бо вони знають, навіщо їм ці знання: щоб отримати нову роботу, підняти зарплату, відкрити власний проєкт чи просто відчути розвиток.
Університети часто жартують: у 18 років студенти приходять «за компанію», а в 30+ — «за результатом». І це працює на користь.
Міф 2. Роботодавці не беруть “новачків” у цьому віці
Як думають:
Компанії шукають молодих і «гнучких». Якщо вам 30–35, ви вже «застаріли» для першої роботи в новій сфері.
Насправді:
У сучасному ІТ-ринку головне — знання й уміння. Паспортний вік ніхто не питає на співбесіді, а от портфоліо та практичні навички — так.
Більше того, дорослі новачки часто навіть цікавіші для роботодавців, ніж студенти без досвіду. Чому? Тому що вони приносять із собою бекграунд:
менеджери — вміють організовувати процеси й команду;
бухгалтери — розуміють цифри та відповідальність;
маркетологи — вміють мислити клієнтоорієнтовано;
вчителі — знають, як навчатися і навчати інших.
Ці навички часто стають потужною конкурентною перевагою. У багатьох командах сьогодні працюють спеціалісти, які прийшли в ІТ у 32, 35 і навіть у 40+.
Є навіть окремий термін — «career switcher» (той, хто змінює кар’єру). Для багатьох компаній це вже норма, а не виняток.
Міф 3. Вчитись після 30 складніше
Як думають:
Пам’ять вже «не та», концентрація падає, часу менше — значить, вчитися буде надто важко.
Насправді:
Так, у дорослому віці навчання виглядає інакше. Але сучасні формати роблять його максимально доступним:
гнучкі графіки — ви самі обираєте, коли навчатися;
курси у записі — можна зупинити, переглянути ще раз, повторити;
онлайн-заняття з викладачем — підтримка й пояснення «наживо»;
практика замість теорії — ви бачите результат одразу у власному коді чи проєкті.
Крім того, дорослі студенти виграють завдяки своїй дисципліні. Вони вміють планувати час, поєднувати навчання з роботою чи сім’єю, краще розуміють пріоритети.
І головне: мотивація у 30+ набагато сильніша. Якщо ви сіли вчитися після роботи чи вихідними, значить, вам це справді потрібно. І саме ця мотивація «тягне» далі навіть тоді, коли матеріал стає складним.
Чому саме після 30 варто задуматися про нову професію?
Свідомий вибір. Ви вже знаєте, що вам подобається, а що — ні. Це означає, що новий напрям ви оберете осмислено, а не «бо всі так роблять».
Фінансова стабільність. У більшості випадків у вас вже є певний дохід, і ви можете інвестувати у своє навчання.
Кар’єрні перспективи. Навіть якщо ви починаєте з нуля, через 1–2 роки ви можете отримати першу роботу в ІТ. А далі — все залежить від вашої наполегливості.
Особистий розвиток. Навчання тримає мозок у тонусі, розвиває нові навички, допомагає залишатися гнучким у світі, що швидко змінюється.
Реальні історії
У нашій практиці багато прикладів студентів, які почали навчання після 30 і сьогодні успішно працюють в ІТ.
Олена, 34 роки, бухгалтер у минулому. Пройшла курси FrontEnd і через 7 місяців отримала першу роботу в аутсорсинговій компанії.
Андрій, 37 років, колишній вчитель. Вивчив Python і сьогодні працює у стартапі, розробляє автоматизацію для освітніх процесів.
Сергій, 41 рік, колишній військовий. Завдяки курсам QA тестування змінив професію і зараз працює тестувальником у міжнародній компанії.
Ці історії доводять: вік — це лише цифра. Головне — бажання та готовність вчитися.
Чому варто обрати саме наші курси?
Актуальні програми. Усі курси створені практикуючими спеціалістами й регулярно оновлюються.
Гнучкий формат. Ви можете обирати коли та де навчатись.
Практика з перших уроків. Усі студенти виконують реальні завдання й проєкти, що формують портфоліо.
Кар’єрний сервіс. Ми допомагаємо скласти резюме, підготуватись до співбесіди та навіть пропонуємо стажування.
Висновок
Починати новий шлях після 30 — це не пізно. Навпаки, це часто найкращий момент: ви маєте мотивацію, досвід і бажання змінити життя.
Якщо ви давно думали про ІТ чи іншу сферу — саме зараз час спробувати.
👉 Ваші 30, 35 чи навіть 45 можуть стати точкою відліку для нової, успішної кар’єри.
Співбесіда з Android. 250+ питань для Junior, Middle, Senior
Автор: Влад Сверчков
Junior
1.1 Базовые вопросы
1.2 Алгоритмы, структуры данных, хранение данных
1.3 Работа с сетью
1.4 Многопоточность, Java Core, RxJava
1.5 Android SDK, Kotlin
1.6 Другое
1.7 Практические задачи
Middle
2.1 Базовые вопросы
2.2 Алгоритмы, структуры данных, хранение данных
2.3 Работа с сетью
2.4 Многопоточность, Java Core
2.5 Android SDK
2.6 Kotlin
2.7 RxJava
2.8 Тестирование
2.9 Другое
Senior
3.1 Базовые вопросы, архитектура
3.2 Многопоточность
3.3. Java Core, Android SDK, Kotlin
Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 3 ноября 2021 года. Оригинальная версия на украинском языке доступна по ссылке.
Если вы готовитесь к собеседованию по Android — или проходить, или проводить — возможно, этот перечень вопросов пригодится вам. Редакция DOU поинтересовалась у разработчиков, проводящих технические интервью в компании в Украине, о чем они спрашивают кандидатов.
Это уже десятая статья из рубрики «100+ технических вопросов»; ознакомиться с вопросами для других языков программирования на DOU.ua на украинском языке вы сможете, перейдя по ссылке.
Junior
Базовые вопросы
1. Назовите основные принципы ООП.
2. Что такое класс? Что такое интерфейс? Какая между ними разница?
3. Назовите базовые типы данных.
4. В чем отличие примитивных типов от объектов?
5. Какая разница между абстрактным классом и интерфейсом?
6. Что такое паттерны проектирования? Какие паттерны вы знаете?
7. Чем отличается Java от Kotlin?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Kotlin, а также статье Kotlin vs Java: что лучше для Android-разработки? и вебинаре Структуры данных в Java и Kotlin.
Алгоритмы
8. Что такое алгоритм и как выбрать правильный?
9. Что такое сложность алгоритма? Как и с помощью чего её можно вычислить?
10. Что такое нотация big-O?
11. Что такое рекурсия?
12. Какие алгоритмы сортировки вы знаете?
Структуры данных
13. Расскажите о таких структурах данных, как List, Set, Map?
14. Какая разница между ArrayList и LinkedList?
Ответы на эти вопросы вы найдёте в вебинаре Структуры данных в Java и Kotlin.
Хранение данных
15. Как можно хранить данные в Android?
16. Когда следует использовать SharedPreferences?
17. Из каких компонентов состоит библиотека Room?
18. Что такое @PrimaryKey, @Ignore, @Embedded, @TypeConverters в Room?
19. Для чего нужна миграция в базах данных?
Ответы на некоторые из этих вопросов вы найдете в видео курсе SQLite. Базы данных в Android приложениях (урок 2, урок 3).
Работа с сетью
20. Что такое JSON, XML?
21. Какие варианты реализации работы с сервером?
22. Что такое REST?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Разработка приложений под Android. Базовый курс (урок 2), Android Углубленный (урок 9).
Многопоточность
23. Что такое процесс?
24. Что такое поток?
25. Для чего используют ключевое слово synchronized?
26. Зачем синхронизировать потоки?
27. Какая разница между синхронным и асинхронным исполнением?
28. Как мы можем создать поток в Java?
29. Что такое deadlock?
30. Какие варианты реализации многопоточности есть в Android?
31. Что такое main thread? Какие операции нужно выполнять на main thread, а какие нельзя делать?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Android Углубленный (урок 5).
Java Core
32. Что такое Exceptions? Зачем они нужны?
33. Зачем используют ключевые слова final, finally и finalize?
34. Что такое абстрактный класс? Что такое интерфейс?
35. Что такое анонимный класс? Использовали ли на практике? Для чего?
36. Что такое статический класс (static class)?
37. Что такое enum? Зачем его используют?
38. Можем ли мы сделать конструктор приватным?
39. Какая разница между ключевыми словами throw и throws?
40. Какая разница между Error и Exception?
41. Какая разница между checked и unchecked exception?
42. Что такое Object class и какие методы он имеет?
43. Какие существуют модификаторы доступа для классов? Какая разница между ними?
44. Что такое итератор?
45. Как безопасно удалить элемент из коллекции?
46. Зачем нам переопределять equals() и когда не нужно это делать?
47. Какой должен выполняться контракт при переопределении equals()?
Ответы на некоторые из этих вопросов вы найдете в вебинаре Что такое Java EE и Java Core и видео курсе Java Базовый (урок 2, урок 4, урок 6, урок 7, урок 8, урок 9).
RxJava
48. В чем разница между map() и flatMap() в RxJava?
49. Когда используете observeOn(), а когда subscribeOn()?
50. Как можно обработать ошибки в RxJava?
51. Какие schedulers знаете в RxJava? Назовите их отличия.
52. Что такое Disposable? Зачем его используют?
53. В чем разница между Hot и Cold Observables? Назовите примеры в RxJava.
Ответы на некоторые из этих вопросов вы найдете в видео курсе Создание пользовательских элементов управления в Android (урок 1).
Android SDK
54. Какие базовые Android-компоненты можете назвать?
55. Что такое ContentProvider?
56. Какие типы Service знаете?
57. Что такое BroadcastReceiver и какие типы существуют?
58. Для чего используют механизм фрагментов?
59. Опишите жизненный цикл Activity.
60. Опишите жизненный цикл Fragment.
61. Есть ли у Fragment контекст? Если да, то как его получить?
62. Чем отличается Fragment от Activity? Зачем выдумали Fragment?
63. Что такое изменение конфигурации? Что происходит с приложением на Android при этом?
64. Что такое Intent? Что такое explicit/implicit Intent?
65. Что такое SharedPreferences?
66. Что такое ANR? Как избегать таких ситуаций?
67. Что такое DataBinding?
68. Что такое LiveData? Какие виды знаете?
69. Как создать ViewModel? Почему создавать ViewModel нужно именно так?
70. Что такое Context и зачем он?
71. Что такое AndroidManifest.xml? Зачем его используют? Что мы можем там декларировать?
72. Перечислите layout, с которыми работали? Когда и какой нужно использовать?
73. Расскажите, что нужно реализовать, чтобы отобразить список строк в RecyclerView.
74. Объясните паттерн ViewHolder. Для чего он применяется?
75. Что такое DiffUtil?
76. Расскажите о ConstraintLayout.
77. Для чего используют Group, Guideline, Barriers, Chains в ConstraintLayout?
78. У вас есть Activity с двумя Fragment'ами, у одного есть кнопка, у другого TextView. При нажатии кнопки изменяется TextView. Как вы реализуете это?
79. Что такое WorkManager? Когда используем?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Разработка приложений под Android. Базовый курс (урок 2, урок 4, урок 5, урок 7), Android Углубленный (урок 3, урок 6, урок 9), Android User Interface (урок 3), Создание пользовательских элементов управления в Android (урок 9).
Kotlin
80. Как вы понимаете термин Null safety?
81. Что такое nullable и non-nullable типы? Какая разница между val и var?
82. Как задекларировать getter/setter для property?
83. Почему классы Kotlin по умолчанию final?
84. Что такое sealed class?
85. Что такое data classes?
86. Какая разница между sealed class и enum?
87. Почему у Kotlin нет checked exceptions?
88. Что такое Extensions? Использовали ли вы их на практике?
89. Что такое перегрузка операторов (operator overloading)? Зачем нужен этот механизм?
90. Как работают примитивы в Kotlin?
91. Расскажите об объекте Unit в Kotlin.
92. Расскажите об объекте Any в Kotlin.
93. Как создать Singleton объект в Kotlin?
94. Что такое companion object?
95. Чем отличается const val от val?
96. Какие знаете модификаторы доступа?
97. Что означает модификатор lateinit?
98. Coroutines – что это за механизм? Использовали ли его на практике?
99. Зачем нужны Coroutines? Чем они лучше обычных тредов?
100. Что такое suspend-функция?
101. Что такое Job?
102. Что такое Dispatcher? Какие есть виды?
102. Что такое Scope?
103. Как писать Java compatible API в Kotlin?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Kotlin.
Другое
104. Расскажите, что такое memory leak. Как избежать?
105. Как бы вы искали memory leak?
106. Расскажите о Dependency injection. Какие варианты реализации в Android?
107. Для чего нужна система контроля версий?
108. Что такое Git?
109. Для чего используем .gitignore-файл?
110. Расскажите о командах push, pull, fetch в Git?
111. Что такое merge и rebase? Какая разница?
112. Что такое CI? Зачем используем?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Dependency Injection в Android-разработке, Основы работы с Git.
Практические задачи
113. Разверните Linked List. Отпишите о зацикленности в LinkedList или ее отсутствии.
114. Напишите функцию, которая вернет n первых неотъемлемых чисел:
un nMin(items: List<String>, n: Int): List<Int> {
//return n minimal non negative items
}
Пример вызова функции: nMin(listOf("1","-11","-12","22","100","-30",”2”, “5”), 3)
Ожидаемый результат: [1, 22, 100]
115. Что будет выведено в консоль? Объясните результат.
var globalId = 0
data class User(val name: String) {
val id = globalId++
}
fun main(args: Array<String>) {
val user1 = User("User")
val user2 = User("User")
println(user1)
println(user2)
println(user1 == user2)
}
116. Исправьте все ошибки в коде:
class Animal
class Dog: Animal {}
117. Для коллекции items:
val items = listOf(1, -2 ,-3 , 4, 5, 0, 2, -2)
Подсчитайте количество отрицательных элементов.
Вычислите среднее арифметическое значение отрицательных и неотрицательных чисел.
Middle
Базовые вопросы
1. Нужно ли придерживаться SOLID-принципов? Почему да/нет?
2. Какие паттерны использовали на практике? Приведите примеры.
3. Опишите паттерны MVP и MVVM. Какие из них использовали? Какой предпочитаете? Знаете ли/использовали другие паттерны?
4. Почему слой Model должен быть отделен от View или Presenter?
5. Что такое инверсия зависимости (dependency inversion)?
6. Объясните пример паттерна Singleton. Где его использовать в Android?
7. Объясните пример паттерна Observer. Где его использовать в Android?
8. Объясните пример паттерна Builder. Где его использовать в Android?
9. Как вы понимаете термин «архитектура приложения»? Зачем это вообще нужно? Почему инженеры пытаются усложнить процесс разработки и тратят время на проектирование архитектуры? Может, лучше сэкономить ресурсы и пойти по простому пути — держать весь код в одном файле?
10. Что такое иммутабельный объект? Для чего его используют? Как сделать иммутабельный объект в Java?
11. MVP vs MVVM – в чем основное отличие?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Архитектура Android приложений (урок 1-5), Создание пользовательских элементов управления в Android (урок 4), SOLID принципы в Java.
Алгоритмы
12. Есть много алгоритмов сортировки. Возможно ли выбрать один самый быстрый и использовать его повсюду? Почему да/нет?
13. В чем сложность поиска произвольного элемента в ArrayList? В LinkedList?
14. Какие алгоритмы используют в Android/Java коллекциях под капотом?
Структуры данных
15. HashMap. Используете ли вы на практике? Если да, то зачем? Как она работает изнутри?
16. Какая разница между HashMap и LinkedHashMap?
17. Что такое бинарное дерево?
Сохранение данных
18. Как бы вы реализовали сохранение зашифрованных данных в SharedPreferences? Базу данных?
19. Как реализовать миграцию таблицы, где нужно из non-nullable поля сделать nullable поле?
Работа с сетью
20. Расскажите, какие методы можно применить в REST API? Зачем какой нужен?
21. Что можно использовать, кроме REST API, для работы с сервером?
Многопоточность
22. Что такое Thread Pool? Каковы его особенности?
23. Что такое Executor/ExecutorService? Какую задачу выполняют и как использовать?
24. Какие есть виды Executor?
25. Какая разница между методами start() и run() в классе Thread?
26. На что указывает ключевое слово synchronized? Какова его основная функция?
27. Модификатор volatile. Приходилось ли использовать? Зачем нужен?
28. Знаете ли вы о таком понятии, как «эффект гонки» (race condition)? Как это предотвратить? Какие механизмы в Java для предотвращения этого?
29. Что такое атомарная операция?
30. Как остановить поток в Java? Можно ли продолжить выполнение потока после его остановки?
31. Знаете ли вы о потокобезопасных коллекциях в Java/Android? Приходилось ли их использовать?
32. Какие стратегии можно применить, чтобы добиться потокобезопасности?
33. Какие варианты реализации потокобезопасности кода есть у Kotlin?
34. Как сделать переменную потокобезопасной?
35. Что такое Mutex и Monitor? Кто может выступать в роли монитора?
36. Что такое атомарные операции?
37. Почему инкрементация и операции с long не являются атомарными?
38. Какие классы атомарных переменных?
39. Что такое устаревшие данные (stale data)? Как избежать этого эффекта?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Android Углубленный (урок 5).
Java Core
40. Механизм Generics. Какую проблему решает?
41. Что такое soft reference, weak reference?
42. Что такое сериализация объекта? Какую проблему она решает? Какие стандартные механизмы у Java?
43. Какой контракт существует между equals() и hashCode()?
44. По вашему мнению, почему строки в Java сделаны иммутабельными?
45. Можем ли мы задекларировать пустой интерфейс? Если да, то зачем?
46. Что такое String pool? Зачем он нужен?
47. Что такое StringBuilder, какую проблему он решает?
48. Что такое Stack в JVM и какие данные там хранятся?
49. Что такое Heap в JVM и какие данные там хранятся?
50. Что такое garbage collector, как он вообще работает? Каковы реализации GC?
Ответы на некоторые из этих вопросов вы найдете в вебинаре Что такое Java EE и Java Core и видео курсе Java Углубленный (урок 5).
Android SDK
51. Назовите основные изменения в версиях Android.
52. Как реализовать IPC в системе Android?
53. Как реализовать отложенную задачу?
54. Что такое Doze Mode?
55. Что такое App Standby mode?
56. Что такое AIDL и зачем он нужен? Какие типы данных поддерживаются?
57. Что такое Multidex?
58. Что такое KeyStore API?
59. Что такое PendingIntent?
60. Как безопасно хранить user-sensitive данные?
61. Какие методы защиты приложения?
62. Что такое SSL/TLS Pinning? Как его реализовать в Android?
63. Что такое ViewBinding?
64. Для чего нужны методы onSaveInstanceState/onRestoreInstanceState? Что такое permissions? Как запросить permissions?
65. Что такое Intent? Что такое Explicit/Implicit Intent? Что такое Sticky Intent, Pending Intent?
66. Какие типы данных мы можем положить в Bundle?
67. В чем разница между Serializable и Parcelable?
68. Если фрагмент для работы нуждается во входных данных, каким образом будет правильно передать их фрагменту?
69. Что такое ViewModel? Какие ее свойства?
70. Объясните работу ViewModel с Jetpack. Что такое ViewModelProviders, ViewModelProvider.Factory?
71. Что такое LiveData? Зачем её используете?
72. Какая связь между LiveData и LifecycleOwner?
73. Приведите пример LifecycleOwner?
74. Что такое Looper?
75. Использовали ли HaMeR фреймворк (Handler/Message/Runnable)? Для чего он?
76. Какую информацию содержит контекст? Какие типы контекста знаете?
77. Для чего используют Content Provider?
78. Что такое Data Binding? Что такое View?
79. Преимущества Fragments против View?
80. Как работает Content Provider?
81. Какая разница между Single Activity и Multiple Activity?
82. Какие виды Context знаете? Где какой использовать?
83. Объясните работу BroadcastReciever и его реализацию.
84. Зачем LocalBroadcastManager?
85. Для чего нужен MotionLayout?
86. Опишите, как реализовать анимацию в MotionLayout.
87. Как можно обнаружить проблемы в скорости UI и устранить их?
88. Расскажите о вариантах реализации custom view.
89. Что делают методы onMeasure, onLayout, onDraw во View?
90. Как воплотить анимацию при переходе между Activity-фрагментами?
91. Когда необходимо использовать foreground service вместо service?
92. Когда использовать workmanager, а когда service?
93. Есть ли у workmanager лимиты для выполнения работы?
94. Расскажите о Jetpack Compose. Зачем придумали основной принцип работы, как устроено?
95. Что такое WakeLock?
96. Что такое AlarmManager? Какие особенности работы?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Разработка приложений под Android. Базовый курс (урок 4, урок 7), Android Углубленный (урок 6, урок 8), Создание пользовательских элементов управления в Android (урок 9).
Kotlin
97. Чем отличается работа с Exceptions в Kotlin и Java?
98. Что такое платформенные типы?
99. Что такое нелокальный return?
100. Для чего нужны reified generics?
101. Какая разница между Unit, Any, Nothing?
102. Расскажите о функциях высшего порядка, лямбда, функциях, которые могут использоваться в качестве аргумента.
103. Что такое inline-модификатор? Noinline?
104. Какая разница между crossinline и noinline?
105. Какие типы конструкторов вы знаете?
106. Что такое Flow? Что такое SharedFlow?
107. В чем разница методов run, let, apply, also, with, use?
108. Что произойдет, если в классе переопределить метод hashCode следующим образом: override fun hashCode(): Int = Random.nextInt()? А если так: override fun hashCode(): Int = 1?
109. Расскажите о Flow. В чем разница между Hot и Cold Flow?
110. Что такое деструктурирующее объявление? Что нужно сделать, чтобы иметь возможность использовать его для своего класса? Какие проблемы могут возникнуть с таким объявлением?
111. Для чего использовать data class? Почему нельзя работать с обычным классом?
112. Приведите пример делегатов в Kotlin?
113. Как реализовать кастомный делегат?
114. Объясните, как работает suspen-функция? Что такое continuation?
115. Как обрабатывать ошибки в Coroutines?
116. Что такое SupervisorJob и когда применяется?
117. Как остановить/отменить Coroutines?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Kotlin.
RxJava
118. В чем разница между flatMap(), concatMap(), switchMap()?
119. Какие Subjects вы знаете в RxJava, чем отличаются от Observable?
120. Чем отличается Observable от Flowable?
121. Что такое backpreassure? Какие стратегии есть для решения?
122. Что такое Single, Maybe, Completable?
123. Какие варианты обработки ошибок есть, кроме onError?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Создание пользовательских элементов управления в Android (урок 1).
Тестирование
124. На какие группы можно поделить тесты (Unit (JUnit) и Instrumental или UI Tests (espresso))?
125. Чем отличаются Unit и UI тесты (контекст)?
126. Расскажите, какие библиотеки использовали для mock?
127. Как тестировать DB?
128. Как “замокать” network layer в инструментальных тестах?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Unit тестирование для Android разработчиков.
Другое
129. Расскажите, с какими DI-фреймворками работали.
130. Расскажите о Dagger Hilt.
Senior
Базовые вопросы
1. Расскажите о функциях высшего порядка. Когда они нужны?
2. Опишите, как происходит процесс деплоя Android-приложения.
3. Расскажите о многомодульной архитектуре. Зачем используют и когда ее нет смысла использовать?
4. Вам нужно написать простое приложение для работы с рецептами (несложное, имеет экран списка, поиска и детали). Оно должно работать с определенным API для получения/модификации вашего списка рецептов и хранить его локально в БД для отображения, если интернета нет. Опишите, как бы вы создавали приложение такого типа? Из каких уровней оно бы состояло, каково предназначение каждого уровня? Представьте, что в этом приложении необходимо добавить возможность изменять основную картинку рецепта (т. е. получать новые данные из галереи/камеры и загружать их на сервер через API) и это реализовано на экране с подробным описанием рецепта. Вам пришел запрос сделать такой же функционал и на экране список рецептов. Как вы это сделаете?
Архитектура
5. Как организовать CI/CD для Android-проектов?
6. Различия архитектурных подходов в Android. Какие и когда лучше использовать?
7. Как вы понимаете Clean Architecture?
8. Опишите основные отличия между MVC/MVP и MVVM. Как MVVM стал одним из рекомендованных паттернов?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Архитектура Android приложений.
Многопоточность
9. Какие еще знаете механизмы синхронизации данных, кроме synchronized?
10. Что такое переключение контекста (context-switching), когда речь идет о многопоточности?
11. Что мы понимаем, когда говорим о «честной» блокировке (fair lock)?
Java Core
12. Если бы пришлось имплементировать иммутабельный класс на Java, как бы вы это сделали?
13. Что такое Java Memory Model?
14. Сравните принципы композиции и наследования (Composition vs Inheritance).
Android SDK
15. ViewModel сохраняет свое состояние при повороте экрана? Как это возможно? Можете ли предложить, как сделать такой механизм?
16. Android Architecture Components. Что из этого приходилось применять на практике? Какие задачи решали?
17. Приходилось ли исследовать «утечки» памяти? Какие инструменты использовали для этого?
18. Представьте, что у вас есть экран со списком товаров. Во время скроллинга вы замечаете, что рендеринг не плавный, в логах много фреймов скипается и вообще-то экран тормозит. Что будете делать, чтобы улучшить ситуацию?
19. Если бы была задача написать приложение для интернет-магазина с нуля, какие технологии/подходы выбрали бы?
20. Приведите пример применения GoF-паттернов в Android SDK.
Kotlin
21. Опишите взаимодействие кода Kotlin и Java.
22. Что изменилось в обработке ошибок в Kotlin, если сравнить с Java?
23. Что такое делегированные характеристики (Delegated properties)?
Благодарим за эту статью Виктора Чистякова, Михаила Дьяченко, Влада Тищенко, Александра Романишина, Андрея Люшенка, Дмитрия Пашко, Вячеслава Сергеева, Антона Козленка, Артема Грищука, Евгения Трощия, Романа Белоконя, Константина Красильникова, Сергея Харченка, Андрея Друка, Виктора Косенко.
Поради новачкові з навчання програмування
Автор: Редакция ITVDN
В этой статье вы найдёте несколько полезных советов для тех, кто хочет стать программистом.
Совет 1. Определитесь с языком программирования
Выбор языка программирования — первая трудность, с которой встречаются новички. Сколько программистов — столько и мнений о языках, поэтому выделить «лучший» среди них нельзя. Почему?
Каждый язык создан для определённой области разработки и решения определённых задач.
Для выбора языка программирования, ориентируйтесь на ваши желания. Какие программы и сервисы вы хотите создавать? Делать игры на Unity? Сайты на HTML, CSS и JavaScript? Или, может быть, бизнес-приложения на С# или Java? Python широко используется в науке для быстрых вычислений.
При выборе учитывайте порог вхождения языка (Python, например, изучается быстрее и легче С++) и ваши предрасположенности.
Кроме того, перед изучением любого языка стоит изучить основы программирования. Разберитесь, что такое двоичный код, компилятор, познакомьтесь с алгоритмами и шаблонами проектирования.
Совет 2. Применяйте метод дробления материала
Если вы решили стать программистом, вам нужно будет очень мнрогое изучить и запомнить. Сделать это «с наскока» будет трудно. Не хваатайтесь за все сразу. Ставьте перед собой небольшие реальные, достижимые цели. Например, изучайте одну тему за 1 день.
При изучении любого языка начинайте с самых основ, постепенно продвигаясь вперёд. Закрепляйте пройденный материал практикой, если есть какие-то небольшие пробелы в знаниях — двигайтесь дальше, возможно, вы заполните их потом. Но не оставляйте слишком много «белых пятен», иначе запутаетесь.
На помощь в структурировании информации вам придут различные техники запоминания (ассоциации, карточки) и ваш собственный дневник обучения, в котором вы можете записывать усвоенный материал, как говорят, «своими словами», и затем проверять его на практике.
Совет 3. Не стесняйтесь использовать детские обучающие программы и курсы.
В детских программах часто подают упрощенные знания, основы основ. Не стесняйтесь пробовать детские игры и курсы, в которых материал усваивается значительно легче. Кроме того, это бываает весело! Прослушав материал в упрощенном виде, вы сможете понять его, и дальнейшее изучение программирования будет даваться вам значительно легче.
Кроме того, к временной помощи детских курсов можно прибегнуть, если какой-то участок материала даётся вам с трудом, и понять его вы никак не можете. Прослушав упрощенный материал, вы получите взгляд со стороны и, возможно, наконец сможете понять материал.
Совет 4. Разбирайте чужой код
Это больше относится к практике. Разбирая чужой код, вы начнёте понимать, почему программа работает или не работает. Перенимая чужой опыт, вы получаете новые знания и фишки, которые помогут вам в будущем.
Читая код другого программиста, вы улучшите своё общее понимание программирования и убережете себя от ошибок.
Кроме того, разбор чужого кода также может помочь вам сдвинуться с мёртвой точки. Если вам что-то не понятно, то вы можете просмотреть чей-то код и получить его советы. Таким образом, вы сможете понять, как сделать правильно и почему часть программы у другого человека работает правильно, а у вас — нет.
Совет 5. Читайте полезную литературу
Не смотря на то, что сейчас больше людей предпочитают литературе курсы, статьи и видео, чтение актуальных книг по программированию поможет вам глубже изучить программирование.
Некоторые книги вообще являются признанной классикой, например книга Роберта Мартина «Чистый Код» детально описывает процесс создания чистого кода, и указывает на ошибки, которые могут возникнуть при написании красивого кода. Фактически, эта книга — «библия» для тех, кто стремится писать чистый код.
Поискав в Гугле другие книги по вашему направлению, вы можете скомбинировать их со справочниками, и получить «универсальный набор» программиста, в котором вы найдёте ответы на большинство своих вопросов.
Общепризнанную литературу можно читать в переводе, но большинство актуальной литературы выходит в мир на английском, и переводится на русский с опозданием в год-два, когда уже всё поменялось. Поэтому дополнительный совет: уделите внимание изучению английского языка! С английским вы всегда сможете получать актуальную информацию, общаться с зарубежными программистами, английский облегчит вам изучение программирования в несколько раз, и, возможно, в будущем вы найдете работу в зарубежной компании.
Совет 6. Запишитесь на курсы
Для некоторых людей самостоятельное изучение программирование может даваться с трудом, ведь рядом нет никого, кто мог бы в любой момент ответить на их вопросы. Многим не понятно, с чего начинать обучение и как структурировать информацию.С наставником и одногруппниками вы будете продвигаться в обучении быстрее.
Если вы хотите начать изучать программирование, вам будет интересно посмотреть записи вебинаров ITVDN из серии «С чего начать?», и «Как стать программистом?» . Ваши вопросы вы можете задать, обратившись в службу поддержки ITVDN. Консультанты нашего образовательного ресурса будут рады помочь вам.
ТОП-7 найкращих Linux дистрибутивів для розробника в 2019 році
Автор: Армен Маїлян
ТОП 7 дистрибутивов Linux
7-е место - Gentoo
6-е место - Gentoo
5-е место - Linux Mint
4-е место - Fedora
3-е место - Debia
2-е место - Arch Linux
1-е место - Ubuntu
Несколько не вошедших в ТОП рейтинга, но все еще интересных дистрибутивов Linux
Antergos
Puppy Linux
Manjaro Linux
Существует большое разнообразие операционных систем, используемых на рабочих станциях как простыми пользователями, так и разработчиками ПО. Какую же операционную систему следует выбрать разработчику в 2019 году?
Согласно опросу, проведенному среди более чем 76 000 разработчиков и опубликованному в ежегодном отчете Stack Overflow’s 2018 Developer Survey, лидирующее положение в качестве основной операционной системы все еще занимает OS Windows. Однако, уже почти четверть из числа разработчиков используют в качестве основной ОС – Linux, или правильнее сказать Linux-based операционную систему.
Этот немалый процент пользователей не может не заставить задуматься – а какие плюсы дает использование Linux в качестве операционной системы для разработчика? Возможно, имеет смысл мигрировать на Linux с OS Windows и MacOS?
Но давайте для начала уточним несколько моментов.
Что такое Linux
История UNIX-подобных операционных систем начинается в 1960-х годах с совместного проекта Массачусетского Технологического Института и компаний General Electric и Bell Labs. В последствии компании прекратили финансирование проекта и его развитие продолжилось энтузиастами. Это привело к появлению в 70-х годах системы UNICS, затем сменившей название на UNIX.
В 1980-х годах набор дистрибутивов UNIX был выпущен под коммерческой лицензией компанией AT&T, в которую входила Bell Labs. Однако, по политическим причинам, AT&T была вынуждена предоставить исходный код OS UNIX, под ограничивающей возможности лицензией, ряду вузов, включая университет Беркли. Так, начиная с 1978 года, появилось одно из первых ответвлений Unix-подобных систем – BSD Unix. (BSD - Berkeley Software Distribution).
Работавший в начале 1980-х в MIT Ричард Столлман был недоволен коммерциализацией и закрытостью лицензий UNIX. В 1983 году он объявил о новом проекте – GNU (GNU – рекурсивный акроним GNU’s Not UNIX). В рамках этого проекта получила начало разработка Unix-подобной операционной системы под свободной лицензией GNU GPL. Стоит отметить, что данная лицензия не только дает право разработчику свободно использовать программы, выпущенные под этой лицензией, но и обязывает разработчика выпускать все производные программы также под данной лицензией.
Операционная система Linux появилась на свет в 1991 году благодаря Линусу Торвальдсу, разочаровавшемуся в существующих на тот момент операционных системах, бывших либо платными, либо выпущенными под лицензией BSD – с правом применения только в образовательных целях. В новой операционной системе Линусом Торвальдсом было переписано ядро, задачей которого является, в основном, координация доступа приложений к ресурсам системы. Возникшая на основе UNIX-подобной системы MINIX, работавшей под лицензией BSD, операционная система Linux в дальнейшем претерпела значительных изменений. Так были заменены многие компоненты на те, что написаны под лицензией GNU. В последствии произошло более глубокое слияние проектов GNU и Linux с образованием операционной системы GNU/Linux или той, что сейчас зачастую называют просто - Linux.
До сих пор существует путаница в том, какие дистрибутивы ОС следует относить к Linux, а какие – нет. Ряд пользователей называет Linux-ом все операционные системы, использующие ядро Linux. В число таких ОС входит, в частности – Android. Другие пользователи признают под Linux только те дистрибутивы, которые состоят как из стандартного ядра, так и из обязательно включенной части ПО GNU (в число таких Android входить, соответственно, не будет).
В рамках данной статьи, мы примем за определение Linux следующее:
Операционная система Linux – это продукт, состоящий из ядра Linux, и набора внешних модулей GNU.
Часто многие обзорные статьи и рейтинги операционных систем под заголовками «ТОП ... лучших Linux дистрибутивов» включают в себя не только сборки из семейного дерева Linux, но и те, которые фактически относятся к другим ветвям Unix-подобных систем, в частности - FreeBSD. Такая путаница действительно существует. Но не стоит забывать – это разные «ветви» развития операционных систем, имеющих общий исторический «корень» – Unix.
Преимущества Linux, как системы для разработчиков
Почему Linux хорошая альтернатива для разработчика?
Рассмотрим отдельно преимущества и недостатки использования Linux как основной операционной системы.
Общие преимущества для пользователей:
Выбор. Огромное разнообразие дистрибутивов Linux, с разным набором компонентов, позволяет профессиональному пользователю найти тот, который будет удовлетворять его потребности как в работе, так и в быту.
Настраиваемость и гибкость системы. Являясь, вероятно, самой настраиваемой и гибкой системой, Linux позволяет подогнать операционную систему под себя буквально.
Бесплатное распространение. Распространяясь под лицензией GNU GPL, сами дистрибутивы Linux являются бесплатными. Однако ряд дистрибутивов являются коммерческими и полный спектр возможностей (поддержка, доступ в ряд репозиториев и т.п.) предоставляют на платной основе.
Открытое программное обеспечение – Open Source. Огромное количество разнообразных программ с отрытым исходным кодом, бесплатных и общедоступных. Значительное количество специфических программ для обучения. При этом сохраняется возможность установки проприетарных программ.
Использование эмулятора Wine позволяет запускать на Linux многие приложения операционной системы Windows.
Низкие системные требования и высокая скорость работы. Благодаря глубокой кастомизации дистрибутивов, обеспечивается более высокая скорость работы операционной системы и приложений. Это позволяет с большим комфортом пользоваться относительно старым железом при правильном подборе дистрибутива ОС.
Активное сообщество пользователей и разработчиков.
Безопасность. Конечно безопасность операционной системы в первую очередь зависит от пользователя, но нельзя не признать, что количество вирусов под Linux на порядки меньше чем под Windows. Кроме того, благодаря доступу к публичным, контролируемым репозиториям для установки ПО, нет необходимости брать программы из непроверенных источников. Также нельзя не отметить глубокую настраиваемость механизмов, обеспечивающих безопасность в Linux.
Преимущества Linux для разработчиков:
Возможность тестировать разрабатываемое ПО прямо в том же окружении, в котором оно будет работать после выхода в продакшн. Вы можете иметь на вашем персональном компьютере весь тот же самый софт, с теми же версиями и настройками, как тот, который будет «крутиться» на сервере для вашего приложения.
Удобство при активном использовании механизмов командной строки, Git и текстового редактора Vim отмечают многие разработчики.
Стабильность в работе без перезагрузок. Многие пользователи не перезагружают операционную систему, пока не появляется необходимость в обновлении.
Параноикам от мира разработчиков будет приятно знать, что Linux не собирает статистику на пользователя, в отличие от той же Windows
Недостатки Linux, как системы для разработчиков:
Отсутствие ряда профессиональных программ, сравнимых с таковыми под Windows. Несмотря на возможность запуска многих программ под Wine нехватка профессиональных приложений ощущается. Особенно это заметно при необходимости работы с графикой и моделированием.
Сложность разработки под Windows. Если вы работаете под Linux, это не значит, что в ваши задачи не будет входить написание кода под Windows. К сожалению полноценная Visual Studio под Linux не работает, а эта IDE сейчас является основной для Windows-разработки.
Определенная сложность в обучении работы с инструментами. Нельзя не отметить, что порог вхождения в работе под Linux заметно выше.
Мы выделили основные плюсы и минусы в работе на Linux для программиста. Теперь давайте рассмотрим наиболее приемлемые Linux дистрибутивы.
Разнообразие дистрибутивов Linux и статистика
История дистрибутивов Linux насчитывает уже более 28 лет. Не удивительно, что из года в год появляющиеся и отмирающие ветви дистрибутивов этой операционной системы сегодня представляют уже целый зоопарк – фигурально выражаясь.
Для примера можно посмотреть на стилизованный под периодическую систему список наиболее используемых дистрибутивов Linux, отсортированных по материнским версиям операционных систем.
Как видно из этой схемы, таких дистрибутивов – не мало. И это только наиболее популярные. Известный портал distrowatch.com насчитывает только активных более 260 дистрибутивов.
Чтобы помочь определиться с тем, какой дистрибутив Linux лучше выбрать разработчику, рассмотрим несколько рейтингов дистрибутивов Linux.
Статистика использования пользователями разных дистрибутивов Linux согласно порталу phoronix.com
Согласно данным опроса, проведенного в 2017 году порталом phoronix.com среди почти 30 000 людей, использовавших Linux дистрибутивы на ноутбуках, лидером по применению является дистрибутив Ubuntu. Этот дистрибутив линукс получил 38,9% голосов. Следом за Ubuntu по популярности идет дистрибутив Arch Linux, получивший 27,1% пользователей. Затем идут, Debian, Fedora и Linux Mint, получившие, соответственно, 15,3%, 14,8% и 10,8% аудитории. Шестое место в этом рейтинге дистрибутивов Linux занял openSUSE с 4,2%, а седьмое – Gentoo с 3,9% аудитории.
Стоит отметить, что почти три четверти этих пользователей (73,1%) использовали указанную ими операционную систему для разработки ПО.
Топ дистрибутивов Linux по статистике портала gamingonlinux.com
По данным опроса, проведенного порталом gamingonlinux.com среди более 2 500 своих пользователей и действительному на 01.01.2019 – большая часть их пользователей использует Arch Linux - 21,2%. Затем идут Ubuntu – 19,15%, Linux Mint – 9,37%, Manjaro – 7,36%, Debian – 6,28%, Fedora – 4,72%, Antergos – 4,61%.
Опрос для рейтинга дистрибутивов линукс на портале reddit.com
Проведенный на портале reddit.com в 2017 году, опрос среди почти 2 500 человек в сообществе r/unixporn, показал наибольшую популярность таких дистрибутивов линукс: Arch Linux использовали 27.0% пользователей, Ubuntu – 17,9%, Debian – 11,8%, Fedora – 6,09%. Затем идут Rasbian – 5,52%, Manjaro – 5,43% Antergos – 4,67%, Linux Mint – 3,41% и Gentoo – 2,44%. Множество других дистрибутивов Linux, включая openSUSE, Puppy Linux, CentOS и т.п., использует значительно меньшая доля пользователей.
При этом указанные дистрибутивы использовались на ноутбуках более чем в 80% случаев, а на стационарных компьютерах – более чем в 60% случаев.
Данные Google Trends
Данные Google Trends, по пяти наиболее популярным дистрибутивам, показывают существенный отрыв Ubuntu даже от других дистрибутивов первой пятерки.
Давайте рассмотрим непосредственно наш рейтинг Linux дистрибутивов, составленный на основе указанных выше статистических данных.
ТОП 7 дистрибутивов Linux
7-е место - Gentoo
Дистрибутив Gentoo версии 1.0 увидел свет в 2002. Этот дистрибутив создавался Дэниелом Роббинсом на основе другой его разработки, начатой еще в 1999 году - Enoch Linux. В 2004 году Роббинсом был создан некоммерческий Фонд Gentoo, которому он передал в последствии права на торговые марки и авторские права, после чего покинул пост главного архитектора проекта.
Философия проекта Gentoo состоит в предоставлении пользователям линукс, желающим иметь полный контроль своей системы, возможность контролировать, что установлено и запущено на их компьютере. У пользователей есть возможность собирать персональные системы и серверы очень эффективными, если они готовы потратить немалое время, для установки и настройки системы. Gentoo рекомендует пользователям создавать ядро Linux с учетом их конкретного оборудования. Пользователи могут полностью контролировать, установленные и запущенные службы. Возможно существенно уменьшить потребление системой памяти в сравнении с работой других дистрибутивов, исключив незадействованные пакеты и службы ядра. Соответственно, может быть увеличена и скорость работы операционной системы - благодаря отсечению лишнего. Само название дистрибутива, происходит от названия вида пингвинов - Gentoo penguin, самого быстрого в мире.
Значительная часть версий Linux являются пакетными. Сам процесс установки дистрибутивов такого типа происходит из пакетов, заранее собранных с откомпилированными исполняемыми файлами. Gentoo, в свою очередь, дистрибутив не пакетный, а source-based. У такого типа дистрибутивов исходники пакетов хранятся в репозиториях, а при установке – пакеты собираются из исходников прямо на пользовательском компьютере.
Официальный сайт – https://www.gentoo.org/
Особенности линукс дистрибутива Gentoo:
source-based дистрибутив;
системы менеджмента пакетами Portage, Pkgcore, Paludis;
для ряда приложений (особенно долго компилируемых) есть готовые бинарные сборки;
созданные при компиляции на одном компьютере бинарные пакеты можно переносить на другой, с таким же железом;
скользящие обновления (rolling-релиз);
возможность установки существует для таких платформ - x86, x86-64, ARM, PowerPC, PowerPC 970, SPARC, MIPS, DEC Alpha, PA-RISC, IBM/390, SuperH и 68k.
Плюсы дистрибутива линукс Gentoo:
глубокая настройка ОС с компилированием под индивидуального пользователя с конкретным железом;
очень большое число доступных для установки приложений;
большое количество доступных репозиториев;
очень высокая стабильность работы правильно настроенных приложений;
благодаря rolling-релизам обновление становятся менее болезненным;
развитое сообщество пользователей и разработчиков;
хорошая документация;
возможность продолжения компиляции пакетов в случае если она была прервана;
возможность устанавливать одновременно несколько веток софта;
ряд исследований показывает, что в Gentoo потребление PHP памяти может быть уменьшено на количество вплоть до 50%.
Минусы дистрибутива Gentoo:
излишне высокий порог вхождения для обычного пользователя;
первоначальная установка занимает много времени;
необходимость в частых обновлениях;
если систему долго не обновлять, то обновление потом будет по сложности сравнимо с установкой с нуля;
основная работа только через командную строку;
возможны проблемы в процессе установки (компиляции пакетов) на слабых компьютерах.
Минимальные системные требования Gentoo Linux для desktop:
Фактически может работать на самых минимальных возможных конфигурациях, в зависимости от задач и сборки.
6-е место - openSUSE
Начало дистрибутиву openSUSE положено в 1992 году, когда четыре «любителя Linux» - Роланд Дайрофф, Томас Фер, Хьюберт Мантел и Бурхард Стейнбилд запустили SuSE - свой проект по продаже локализованных наборов Slackware Linux. Начиная с 1996 года, SuSE Linux стала независимым дистрибутивом. В дальнейшем, в состав SuSE Linux добавили менеджер пакетов RPM и представили общественности YaST - графический инструмент управления системой. Частые выходы новых версий дистрибутива, доступность SuSE Linux в магазинах Европы и Америки, наличие полной печатной документации – все это смогло поднять популярность дистрибутива.
Novell Inc приобрела SuSE Linux в конце 2003 года. Вскоре произошел ряд изменений в политике SuSE. Так широкой публике представили YaST, дистрибутив SuSE лицензировали под GPL, образы дистрибутива начали распространять свободно с общедоступных серверов загрузки, и, что наиболее важно, разработка дистрибутива стала открытой для участия общественности. С версии SuSE 10.0, благодаря сообществу openSUSE, дистрибутив начинает распространятся полностью бесплатно, с открытым исходным кодом. На основе кода openSUSE был создан коммерческий продукт, сначала под именем Novell Linux, но позже разделившийся на два и изменивший название на SUSE Linux Enterprise Desktop и, также, SUSE Linux Enterprise Server. Сейчас проект openSUSE финансируется как компанией SUSE, так и рядом других компаний, и энтузиастов.
Сейчас openSUSE доступен в двух основных редакциях - Leap, которая обеспечивает стабильную платформу с многолетней поддержкой и Tumbleweed, который обеспечивает скользящий выпуск обновлений дистрибутива. openSUSE часто хвалят за простоту настройки (через YaST), расширенную поддержку файловой системы Btrfs, а также за автоматические снимки файловой системы и загрузочные среды.
Официальный сайт - https://www.opensuse.org/
Особенности дистрибутива openSUSE:
версия ядра Linux – 4.12;
в качестве графических сред, использует - Cinnamon, Enlightenment, GNOME, IceWM, KDE Plasma, LXDE, LXQt, MATE, Xfce;
частота обновления версий – 12 месяцев;
в качестве менеджера пакетов применяется RPM;
поддерживает x86-64.
Плюсы дистрибутива openSUSE:
комплексный и интуитивно понятный инструмент настройки;
большой репозиторий доступных пакетов ПО;
отличная документация проекта;
файловая система Btrfs, по умолчанию.
Минусы дистрибутива openSUSE:
ресурсоемкая работа рабочего стола и графики зачастую замедляет работу системы.
Минимальные системные требования openSUSE:
Pentium 4 1,6 GHz – процессор;
1 GB – оперативной памяти;
3 GB – свободного места на жестком диске;
CD-ROM или USB порт.
5-е место - Linux Mint
Linux Mint - основанный на Ubuntu ирландский дистрибутив, впервые выпущенный в 2006 году. Mint доминировал во многих рейтингах с 2011 по 2017 год. Такую популярность он приобрёл за свою стабильность, разнообразие поддерживаемых настольных менеджеров и полноценные мультимедийные возможности.
Изначально планировалось выпускать несколько версий дистрибутива Mint под каждый выпуск версии Ubuntu. Однако, со временем, цикл разработки удлинился, сейчас составляя 2 года. При этом теперь дистрибутив базируется только на LTS-версиях Ubuntu (.
В настоящий момент разрабатывается и управляется сообществом. Разработчики Mint сосредоточены на стабильности, поэтому они предпочитают консервативный цикл выпуска. Вы не будете получать новейшие обновления, но все равно будете в курсе событий разработки. Вас также не привлекут к разработке в качестве непроизвольного бета-тестера.
Официальный сайт - https://linuxmint.com/
Особенности дистрибутива Mint:
основывается на LTS версиях дистрибутива Ubuntu;
версия ядра линукс – 4.15;
специально разработанная среда рабочего стола Cinnamon, также доступны MATE, Xfce;
частота обновления версий – 2 года;
в качестве системы менеджмента пакетов - применяется dpkg;
поддерживает x86 архитектуру;
в сравнении с Ubuntu, базовый дистрибутив включает более расширенный мультимедийный функционал;
использует тот же программный репозиторий, что и Ubuntu;
вход под суперпользователем по умолчанию запрещён, как и в Ubuntu;
своя система как обновления, так и установки приложений.
Плюсы дистрибутива Mint:
превосходная коллекция мультимедийных инструментов;
высокая стабильность работы;
открытое сообщество разработчиков.
Минусы дистрибутива Mint:
в альтернативные «общественные» релизы редко добавлены последние функции;
проект не выпускает рекомендации по безопасности.
Минимальные системные требования дистрибутива Linux Mint:
x86 - процессор;
512 MB – доступной оперативной памяти;
9 GB - места на жёстком диске;
CD-привод или USB-порт.
4-е место - Fedora
Хотя официально год представления дистрибутива общественности - 2004, фактически история Fedora начинается в 1995. Дистрибутив, с именем Fedora, его авторами Бобом Янгом и Марком Юингом изначально был назван - Red Hat Linux.
В последствии, Red Hat представила в 1997 году новый менеджер пакетов – RPM (RPM - рекурсивный акроним RPM Package Manager - менеджер пакетов), во многом признанный революционным.
В 2003 году, после выхода 9й версии Red Hat, в продуктах компании произошел ряд изменений. Имя Red Hat (товарный знак) - сохранился для коммерческих продуктов, публике же был представлен дистрибутив Fedora Core (затем сменивший имя на Fedora), изначально ориентированный на сообщество «любителей Linux».
Несмотря на неприятие изменений сообществом, Fedora уже через несколько выпусков смогла вернуть себе звание одной из наиболее востребованных версий дистрибутива Linux. В свою очередь компания Red Hat, благодаря внедрению множества инноваций, превосходной поддержке клиентов и ряду других моментов, смогла стать крупнейшей и прибыльнейшей Linux-компанией в мире.
В 2015 году Fedora представила обновленную версию своего дистрибутива под названием Atomic Host. Используя те же пакеты, что и Fedora's Server edition, Atomic обеспечивает обновления базовой ОС используя технологию OSTree.
Сегодня Fedora - это один из самых распространенных и инновационных дистрибутивов Linux. К началу 2019 года только загрузок дистрибутива с официального сайта было произведено около 1 500 000. Широко известен вклад проекта Fedora в код ядра системы Linux, в ряд библиотек и технологий. Однако, в дистрибутиве все еще отсутствует определенность в стратегии развития десктоп-сегмента, которая упростила бы использование этого линукс дистрибутива для всех тех, кто выходит за рамки цели «любителя Linux».
Официальный сайт - https://getfedora.org/
Особенности дистрибутива Fedora 29:
версия ядра Linux – 4.18;
менеджер пакетов RPM;
использует по умолчанию графическую среду GNOME 3.30;
частота обновления – 6-8 месяцев;
поддерживает x86, x86-64, ARM, i686, POWER, MIPS, IBM System/39 платформы;
единый глобальный репозиторий с исключительно бесплатным ПО (есть ряд неофициальных репозиториев);
проект как разрабатывается, так и поддерживается сообществом, при этом спонсором выступает компания Red Hat;
Fedora Project запретила поставку дистрибутива в Крым, Сирию, Судан, Иран, Северную Корею, и Кубу.
Плюсы дистрибутива Fedora:
значительная инновационность дистрибутива;
встроенная поддержка Docker;
впечатляющие возможности обеспечения безопасности;
огромное количество поддерживаемых пакетов;
философская концепция свободного ПО;
устоявшееся сообщество разработчиков и пользователей дистрибутива;
наличие Live-CD со многими графическими оболочками.
Минусы дистрибутива Fedora:
приоритеты дистрибутива Fedora, ориентированы, чаще, на решения корпоративных задач, а не на удобство при использовании персональных компьютеров;
некоторые передовые внедрения (к примеру - раннее переключение на KDE 4 и GNOME 3) отталкивают ряд устоявшихся пользователей настольных компьютеров.
Минимальные системные требования дистрибутива Fedora:
1 GHz - процессор;
1 GB – оперативная память;
10 GB – свободного места на жестком диске.
3-е место - Debia
OS Debian GNU анонсировали в 1993 году. Создателем дистрибутива Debian был Ян Мердок, который, совместно с сотнями разработчиков-добровольцев, проектировал новый, полностью некоммерческий дистрибутив. Несмотря на общий скепсис в отношении новой операционной системы, Debian выжил. Кроме того, он стал крупнейшим дистрибутивом и, вероятно, самым крупным совместным проектом ПО из когда-либо созданных!
Успешность Debian можно проиллюстрировать следующими цифрами. Его разрабатывали более 1000 добровольных разработчиков. Репозитории Debian содержат около 50 000 бинарных пакетов (написанных для 8 различных процессорных архитектур) и участвуют в создании около 130 установочных дистрибутивов и систем LiveCD на основе Debian. Ни одна другая ОС семейства Linux не может похвастаться похожими достижениями.
Фактическая разработка OS Debian происходит в четырех (включая экспериментальную) основных ветвях с повышающимися уровнями стабильности работы ПО: «нестабильная» - «sid», «тестовая» и «стабильная». Именно благодаря этой схеме постепенной стабилизации и интеграции компонентов, Debian на сегодня считается одним из наиболее протестированных и наиболее свободных от ошибок дистрибутивов Linux.
Официальны сайт - https://www.debian.org/
Особенности stable дистрибутива Debian Linux:
дистрибутив основан на ядре версии 4.9.
работает на следующих архитектурах - Intel x86, Intel 64, AMD64, ARM, ARM с аппаратным FPU, 64-битные ARM, 32bit MIPS, 64bit MIPS, Power Systems, 64-битный IBM S/390.
Плюсы дистрибутива Debian:
признанная очень высокая стабильность;
глубокий и последовательный контроль качества разработки;
огромная библиотека пакетов в репозиториях - более 30 000 пакетов ПО;
Универсальность касательно применения с различными видами процессорных архитектур. Debian поддерживает на сегодня больше их видов, чем любые другие линукс дистрибутивы.
Минусы:
достаточно быстрое устаревание стабильных версий из-за длинного цикла разработки – 1-3 года на цикл;
консервативный состав дистрибутива – новые технологии, зачастую, не включаются в состав дистрибутива из-за необходимости поддержки сразу многих процессорных архитектур;
относительно старая версия ядра;
демократичность руководства проектом зачастую приводит к неоднозначным решениям, вызывая конфликты в сообществе разработчиков и тормозя развитие проекта.
Системные требования Debian:
128 MB – оперативная память;
2 GB - свободного места на жестком диске.
2-е место - Arch Linux
Дистрибутив Arch Linux был основан Джаддом Винетом на философии KISS (keep it simple, stupid - не усложняй, тупица) в 2002 году. Сначала развитие проекта Arch Linux проходило, как дистрибутива для достаточно продвинутых пользователей, и Arch был мало популярен. Ситуация изменилась после того, как к дистрибутиву была применена политика обновлений Rolling release (плавающий релиз). Теперь операционную систему достаточно стало установить единожды, после чего мощный менеджер пакетов сам обновлял соответствующие пакеты согласно выходящим обновлениям, без необходимости переустановки ОС. Из-за этого мажорные выпуски Arch Linux немногочисленны и ограничиваются базовым установочным образом, который обновляется только при значительных изменениях в базовой версии системы.
Официальный сайт - https://www.archlinux.org/
Особенности дистрибутива Arch Linux:
быстрый и мощный менеджер пакетов Pacman предоставляет возможность легко управлять и настраивать под себя как пакеты, размещенные в официальных репозиториях Arch, так и собранные самостоятельно;
возможность устанавливать пакеты ПО из исходного кода;
доступны следующие варианты графических оболочек – GNOME, KDE, LXDE, MATE, Xfce, Cinnamon, Enlightenment.
в своем базовом виде дистрибутив Arch Linux содержит тщательно отобранный набор ПО, необходимого для ежедневной работы.
основанная на философии «не усложняй», Arch Linux предоставляет ПО в том виде, в котором оно изначально представлено разработчиками. Для обеспечения совместимости вносятся только минимально необходимые изменения.
последняя версия работает с ядром 4.20.5.
Плюсы дистрибутива Arch Linux:
отличная инфраструктура управления программным обеспечением;
возможности глубокой настройки системы под себя;
удобства системы обновлений Rolling release;
доступность обширной библиотеки документации системы.
Минусы дистрибутива Arch Linux:
опасности ошибок и нестабильности при обновлениях благодаря особенностям принципа обновлений «roll-release»;
требовательность к относительно высокому уровню знаний пользователя;
зачастую невозможность установки новой - «мажорной» версии ОС, поверх старой.
Системные требования Arch Linux:
x86_64 - совместимый процессор;
512 MB - оперативная память;
800 MB – свободного места на жестком диске;
подключение к Интернету.
1-е место - Ubuntu
Топ 1 нашего рейтинга - операционная система Ubuntu, является широко распространенной версией Linux, в свое время основанной на другом дистрибутиве – Debian.
Впервые о выходе Ubuntu заявили в 2004 году. Несмотря на относительную новизну, развиваться он начал стремительно. Пройдя тернистый путь популяризации длинной в 15 лет, Ubuntu занимает место самой популярной версии Linux для настольных компьютеров. Этот проект сделал очень много для разработки простой и удобной в использовании, бесплатной операционной системы для настольных компьютеров. Сегодня дистрибутив Ubuntu успешно конкурирует как со свободными, так проприетарными ОС.
В чем причины потрясающего успеха Ubuntu? Среди главных выделяют Марка Шаттлворта - автора проекта. Участвовавший ранее до Ubuntu в разработке Debian, Шаттлворт является мультимиллионером, владеющим компанией Canonical Ltd, которая и финансирует проект в настоящее время.
Во-вторых, проект Ubuntu извлек уроки из проблем в разработках схожих проектов и смог избежать их – разработчики смогли создать удобную веб-инфраструктуру с Wiki-документацией и креативным средством сообщения о багах системы, профессионально подходя к конечным потребителям.
В-третьих – с помощью финансовых возможностей автора, участники проекта смогли разослать бесплатные образцы дистрибутива заинтересованным пользователям. Это напрямую поспособствовало скорейшему распространению Ubuntu.
Фактически, Ubuntu основывается на нестабильной ветке дистрибутива Debian, включив в себя такие распространенные пакеты, как - GNOME, LibreOffice, Firefox и др., обновив их до стабильных версий. Этот дистрибутив Linux выходит с предсказуемым шестимесячным графиком, периодически выпуская версии с долгосрочной поддержкой (LTS), которые поддерживаются обновлениями безопасности на протяжении 5 лет. Выпуск без LTS, в свою очередь, поддерживается 9 месяцев.
Официальный сайт - https://www.ubuntu.com/
Особенности дистрибутива линукс Ubuntu:
дистрибутив основывается на Debian;
вход под суперпользователем отключен. Для получения полномочий суперпользователя используется утилита sudo;
доступны варианты дистрибутивов с разными пакетами графических оболочек - GNOME - по умолчанию в версии 18.04, KDE – Kubuntu, Xfce – Xubuntu, LXDE/ LXQt – Lubuntu и другие.
в версии Ubuntu 18.04 сбор пользовательских данных включён по умолчанию (возможно отключить);
ядро Linux версии 4.15 в LTS версии;
проект разрабатывается и поддерживается компанией Canonical.
Плюсы дистрибутива Ubuntu:
исправлен цикл релиза и период поддержки, в сравнении с Debian;
наличие долгосрочной поддержки (LTS) с 5-летним сроком предоставления обновлений безопасности;
интерфейс, дружественный для начинающих;
множество как официальной, так и пользовательской документации;
широко распространенный дистрибутив с обширным комьюнити, большим количеством репозиториев и широкой возможностью выбора программ для установки.
поддержка новейших технологий «из коробки» - к примеру, 3D эффекты графической оболочки и элементов рабочего стола;
простая установка проприетарных драйверов для различных устройств беспроводных сетей и видеокарт NVIDIA и ATI;
возможность выбора варианта дистрибутива с менее требовательной графической оболочкой.
Минусы:
отсутствие совместимости с дистрибутивом Debian;
часто выходящие важные изменения дистрибутива, как правило, отталкивают некоторых пользователей;
не LTS релизы поставляются только с 9-месячной поддержкой безопасности.
Минимальные системные требования дистрибутива Ubuntu:
2 GHz dual core процессор;
2 GiB – доступная оперативная память;
25 GB – свободного места на жестком диске;
CD/DVD привод или USB порт для.
Несколько не вошедших в ТОП рейтинга, но все еще интересных дистрибутивов Linux
Antergos
Antergos- это относительно новый дистрибутив Linux, основывающийся на Arch. Изначально выпущенный в 2012 году под именем Cinnarch, этот дистрибутив был клоном Arch Linux, с Cinnamon в качестве окружения рабочего стола. На уровне системы отличий между Antergos и Arch Linux – нет. Разница между дистрибутивами находится в подходе к пользователю. В отличие от Arch, рассчитанного на уже опытного пользователя, Antergos направлен на всех, как опытных, так и начинающих Linux пользователей.
В качестве установщика Antergos использует собственную разработку - CNCHI, созданный чтобы максимально упростить для пользователя процесс установки. Минимальный набор входящих в дистрибутив приложений подойдет тем, кто хочет собрать дистрибутив под свои нужды. Если же вам нужен уже готовый к работе дистрибутив, предоставляющий полный набор приложений для повседневного использования - вам Antergos не подойдет.
Галийское слово Antergos (означающее: предки) было выбрано, «чтобы связать прошлое с настоящим». Это название символизирует, что несмотря на все глубокие существенные изменения в дистрибутиве, глубокая связь с основой дистрибутива, Arch Linux - остается.
Официальный сайт - https://antergos.com/
Особенности дистрибутива Antergos:
основывается на Arch Linux;
Использует версию ядра 4.20;
Доступны такие виды графической оболочки – Cinnamon, GNOME, KDE, Xfce, Openbox, MATE
Скользящая модель обновлений.
Плюсы дистрибутива Antegos:
Открытое сообщество, как для разработчиков, так и для пользователей с их пожеланиями и замечаниями;
Собственный установщик, упрощающий процесс установки;
Поддерживается то же железо, что и у Arch Linux,
Отличный внешний вид благодаря сотрудничеству с Numix;
Использует репозитории Arch Linux;
Быстрый выход обновлений для разнообразного ПО.
Минусы дистрибутива Antergos:
Сложности с установкой проприетарных драйверов на ряд устройств - нужно ставить вручную.
Puppy Linux
Puppy Linux это дистрибутив Linux, созданный Барри Каулером в 2003 году. Puppy Linux – не является цельным дистрибутивом Linux, как Debian. Puppy Linux также не является дистрибутивом Linux с несколькими разновидностями, как Ubuntu (с его вариантами Ubuntu, Kubuntu, Xubuntu и т. д.), хотя и поставляется в разных вариантах.
Puppy Linux - это совокупность нескольких дистрибутивов Linux, построенных на одних и тех же общих принципах, с использованием одного и того же набора инструментов, на основе уникального набора приложений и конфигураций, специфичных для Puppy, и в целом обеспечивающих согласованное поведение и работу, независимо от того, какой дистрибутив вы выбираете.
Не смотря на очень маленький размер, дистрибутив является полнофункциональным. В отличие от дистрибутивов LiveCD, которые должны постоянно подгружать данные с компакт-диска, Puppy загружается сразу в RAM. Таким образом все ПО будет запускаться практически мгновенно и мгновенно реагировать на ввод данных пользователем. Puppy Linux может загружаться с любого USB-накопителя, CD-ROM, Zip-диска или супердиска LS 120/240, дискет, внутреннего жесткого диска. Он может даже использовать мультисессионный формат CD-RW / DVD-RW, чтобы сохранить всё обратно на CD / DVD без жесткого диска вообще.
Есть три основных направления дистрибутивов Puppy Linux:
официальные дистрибутивы – являются дистрибутивами общего назначения и поддерживаются командой Puppy Linux. Как правило, создаются с использованием сборщика систем Puppy Linux (называемого Woof-CE).
собранные в коллекцию Woof, дистрибутивы Puppy Linux - разрабатываются для удовлетворения конкретных потребностей, предназначаются для общего пользования и собраны с использованием системного компоновщика Puppy Linux с рядом дополнительных или модифицированных пакетов.
неофициальные производные дистрибутивы («щенки») - являются ремастерами (или ремастерами ремастеров), созданными и поддерживаемыми энтузиастами Puppy. Обычно предназначаются для определенных конкретных целей.
Официальный сайт - http://puppylinux.com/
Особенности дистрибутивов Puppy Linux:
минимум системных служб;
ядро версии 4.4. Можно обновить до 4.9;
свой менеджер пакетов - Puppy Package Manage;
поддерживает архитектуру i386, x86_64.
Плюсы дистрибутивов Puppy Linux:
ядро и софт, оптимизированные под домашнего пользователя;
содержит все инструменты повседневного использования;
легкая установка – драйвера на большинство современного и старого оборудования работают автоматически;
малый размер системы – 300 MB или меньше;
возможна работа в режиме полной установки, а также полноценная работа c CD-ROM (LiveCD) или USB-Flash;
возможность установки нескольких FRUGAL дистрибутивов на раздел с установленным Windows;
удобная переносная система с вашими настройками на USB-флешке, карте памяти или HDD;
удобный оконный «бабушка-френдли» интерфейс системы;
большое количество производных дистрибутивов под нужды каждого пользователя.
Минусы дистрибутивов Puppy Linux:
Из-за необходимости поддерживать совместимость со старым железом, графический интерфейс, некоторыми пользователями воспринимается сильно устаревшим.
Рекомендуемые системные требования:
1 или больше GHz - процессор;
2 GB - оперативная память.
Manjaro Linux
Manjaro это дистрибутив Linux, основывающийся на Arch Linux. Впервые представленный в 2011 году, дистрибутив Manjaro до 2013 года находился в режиме беты. Основываясь на Arch, проект Manjaro со времен своего основания своей целью ставил создание дистрибутива, сочетающего в себе как дружественность по отношению к неопытным пользователям, так и возможности Arch Linux.
Официальный сайт - https://manjaro.org/
Особенности дистрибутива Manjaro:
Использует менеджер пакетов Pacman;
Поддерживает платформу x86-64;
Поддерживает версию ядра 4.20.3;
Отказ от использования персональных архив пакетов (Personal Package Arhive - PPA).
Плюсы дистрибутива Manjaro:
Удобный менеджер драйверов с возможностью автоматической установки;
Поддержка обширного списка оборудования;
Использование репозиториев Arch, полная совместимость с Arch User Repository;
rolling release в обновлениях с предварительным тестированием пакетов участниками проекта Manjaro;
удобная возможность установки множество версий ядра и удобного переключения между ними;
доброжелательное сообщество.
Минусы дистрибутива Manjaro:
Отказ от поддержки архитектуры i686;
Пользователи отмечают перенасыщенность брендингом включая обои, закладки в браузерах и тп;
Относительно малочисленной сообщество со всем вытекающим для Linux-пользователя.
Вывод.
Выбирая для себя операционную систему, стоит помнить, что операционная система — это инструмент, который, с одной стороны, должен быть для вас удобным, а с другой – обладать нужным для вас функционалом. Какая система лучше для пользователя: Windows или Linux, или MacOs, или FreeBSD– это тема многих «священных форумных войн», так и не давших однозначного ответа на этот вопрос. Такие же баталии, хотя и с меньшим градусом агрессии, проходят на тему «лучший дистрибутив linux».
Мы не сможем дать Вам однозначного ответа на вопрос – какой дистрибутив является лучшим дистрибутивом Linux для разработчика. Если Вы только раздумываете над возможностью перейти на работу c OC Linux, Вам будет полезно рассмотреть наш рейтинг в качестве отправной точки. Если же Вы уже являетесь опытным пользователем Linux – мы надеемся, что наш рейтинг дистрибутивов Linux поможет Вам в выборе нового инструмента, или утвердит в желании остаться на проверенном Вами.
Не так важно определиться раз и на всегда в операционной системе. Не бывает однозначно абсолютно удобных инструментов (многие разработчики используют одновременно 2 и более операционных систем.). Главное, чтобы Вы продолжали профессионально расти и развиваться, используя подходящие и удобные для Вас инструменты. Со своей стороны, портал ITVDN готов предоставлять для этого развития актуальную и полезную информацию.
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.
.NET & Blazor. Створення веб-програми на основі браузера
Автор: Daniel Roth
В рамках сегодняшней статьи я рад представить новый экспериментальный проект от команды ASP.NET под названием Blazor. Что такое Blazor? Blazor – это экспериментальный веб UI – фреймворк на базе C#, Razor и HTML, который работает непосредственно в браузере посредством WebAssembly. Цель эксперимента – в значительной мере упростить задачу построения простых и качественных одностраничных приложений, которые могут быть запущены в рамках любого браузера. Достигается это за счет написания .NET веб-приложений, которые при помощи открытых веб-стандартов могут запускаться на стороне клиента.
В случае если вы уже работаете с .NET, подобный подход открывает перед вами следующие перспективы: вы сможете использовать навыки разработки браузерных приложений в дополнение к существующим сценариям серверных, облачных, нативных и игровых приложений. Однако, даже если вы непосредственно с .NET не знакомы, мы надеемся, что Blazor подтолкнет к его изучению.
Зачем использовать .NET для браузерных приложений?
Хотя веб-разработка за прошедшие годы значительно упростилась, создание современных веб-приложений - задача далеко не всегда тривиальная. Построение же веб-приложений на базе .NET предоставляет уникальную возможность улучшить качество написания подобного рода программ. Среди основных преимуществ стоит выделить:
Стабильность и целостность: инструменты стандарта .NET на протяжении многих лет зарекомендовали себя в качестве надежных помощников при разработке приложений.
Современные инновационные языки: с использованием C# и F# процесс создания программ, по сути, становится чем-то вроде развлечения, настолько широким спектром возможностей эти языки обладают.
Популярная среда разработки: стек IDE Visual Studio обеспечивает максимальное удобство работы с Windows, Linux и macOS.
Быстрота вычислений: .NET обладает длинной историей по улучшению производительности, надежности и защиты веб-приложений для серверов. Соответственно, при разработке full-stack .NET приложений все указанные преимущества также ощущаются.
Browser + Razor = Blazor!
Blazor базируется на существующих веб-технологиях, таких как HTML и CSS, но в этом случае для создания UI-элементов вы используете C# и Razor – синтаксис вместо JavaScript. Однако отметьте, что это не то же самое, что и деплой существующего проекта UWP или Xamarin в браузер.
Blazor будет обладать всеми ключевыми особенностями современных веб-фреймворков, включая:
Компонентную модель для построения комплексных UI
Маршрутизацию
Слои
Формы и валидацию
Внедрение зависимостей
Поддержку JavaScript
Перезагрузку в браузере во время разработки «вживую»
Рендеринг на стороне сервера
Полноценную поддержку .NET – отладки (как в браузере, так и в IDE)
IntelliSense и прочие различные инструменты
Возможность запускать более старые (не WebAssembly) браузеры через asm.js
Публикацию и мониторинг размера приложения
Изменения WebAssembly
Запуск .NET – приложений в браузере стал возможен благодаря WebAssembly, новому веб-стандарту для «портативных, умеренных в размерах и быстрых» веб-приложений. Таким образом, WebAssembly вводит фундаментально новый способ построения веб-приложений, так как код, скомпилированный под WebAssembly, не уступает скорости нативных .NET-приложений. Никаких прочих сторонних зависимостей нам не нужно: вы можете запустить обычные .NET-сборки в браузере с использованием WebAssembly.
В августе прошлого года наши друзья из команды Xamarin Microsoft анонсировали планы по созданию Mono .NET специально для браузеров с использованием все той же WebAssembly. По сути, Blazor частично базируется на результатах их работы.
Новый эксперимент
Сейчас мы восхищаемся возможностями Blazor-технологии, но не стоит забывать, что сейчас это лишь экспериментальная технология, а не официально выпущенная и готовая для полноценной работы. На этой стадии мы можем более глубоко ознакомиться с основными функциональными возможностями представленной технологии, а также выразить свои замечания и пожелания разработчикам.
Я хочу попробовать!
Найти технологию вы можете в Blazor repo, который сейчас доступен для использования. Это проект с полностью открытым исходным кодом: все текущие изменения и дополнения могут быть отслежены в вышеупомянутом репозитории.
Пожалуйста, отметьте, что технология находится в статусе раннего доступа. Здесь еще нет никаких инсталляторов или шаблонов проектов, кроме того, многое из заявленного еще не реализовано. Даже то, что уже сделано, не оптимизировано. Если вам интересно, вы можете загрузить репозиторий, построить его и протестировать, но пытаться на его базе разработать рабочий проект – задумка явно не удачная. Что же касательно предложений и поддержки, вы можете использовать issue tracker репозитория. Через месяц мы планируем выпустить первые черновые версии заготовок веб-проектов и инструментов, сделав технологию более доступной для широкой аудитории.
Автор перевода: Евгений Лукашук
Источник
Пошукова оптимізація для сайтів ASP.NET
Автор: Редакция ITVDN
Введение
Наверное, каждый ASP.NET разработчик (или по крайней мере большинство) хочет иметь большое количество посетителей на своем сайте. Но посетители будут заходить на сайт, только если он будет на первых страницах Google или других поисковых систем. Поэтому каждый хочет видеть свой сайт в самом начале списка выдачи. За первые позиции идет нешуточная борьба, и Вы должны следить за каждым фактором оптимизации, влияющего на позицию в этом списке.
Существует более 100 важных факторов, используемых поисковыми системами для оценки релевантности страницы. Большинство из них – просто теории, так как Google, Yandex и т.д. не раскрывают свои алгоритмы ранжирования. Кроме того, их алгоритмы очень часто меняются для поддержки релевантности результатов поиска. Google не может вручную изменить позицию страниц, даже если он считает, что некоторые из них должны иметь более низкую позицию. Вместо этого поисковые системы пытаются исправить ошибку алгоритма. Из-за этого SEO – очень динамическая и шаткая область веб разработки, но существуют основы, необходимые всем для изучения.
Уникальный заголовок (title) для каждой страницы
Каждая страница сайта должна иметь свой уникальный заголовок. Он должен быть кратким, содержательным и обязательно включать в себя ключевые слова, релевантные контенту на странице. Нежелательно вставлять название компании в начале каждого заголовка, поисковые системы могут посчитать данный ход как спам. Тег title может быть отредактирован на любой стадии проекта, но, если у вас имеется система управления контентом (CMS), Вы можете изменять его через свойство Page.Title:
[ C# ]
Page.Title = "ITVDN.com";
[ VB.NET ]
Page.Title = "ITVDN.com";
Не используйте слишком длинные названия, так как поисковые системы обрезают тег title до 12-15 слов.
Использования мета-тегов “Description” и “Keywords”
Данные теги очень важны для поисковой оптимизации, но сейчас ими начали злоупотреблять. Сегодня мета-тег keywords - бесполезный инструмент, однако description по-прежнему остается основным ключевым тегом в SEO оптимизации. Google часто использует description при отображении результатов поиска в качестве текста под ссылкой на страницу. Поэтому, если у вас релевантный мета-тег description, Вы можете получить больше посещений, даже если Вы не на первых страницах поиска. Желательно установить уникальные описания для каждой страницы. Как и заголовок, Вы можете изменить данный мета-тег в разметке страницы, или динамически, на стороне сервера:
[ C# ]
protected void Page_Init(object sender, EventArgs e)
{
// Тег description
HtmlMeta metaDescription = new HtmlMeta();
metaDescription.Name = "Description";
metaDescription.Content = "Видеокурсы, видеотренинги для программистов. Языки программирования и информационные технологии";
Page.Header.Controls.Add(metaDescription);
// Тег keywords
HtmlMeta metaKeywords = new HtmlMeta();
metaKeywords.Name = "Keywords";
metaKeywords.Content = "IT видео, Видео тренинги, видеокурсы, технологии Microsoft, видео обучение, ITVDN,Акции";
Page.Header.Controls.Add(metaKeywords);
}
[ VB.NET ]
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
' Тег description
Dim metaDescription As HtmlMeta = New HtmlMeta()
metaDescription.Name = "Description"
metaDescription.Content = "Видеокурсы, видеотренинги для программистов. Языки программирования и информационные технологии "
Page.Header.Controls.Add(metaDescription)
' Тег keywords
Dim metaKeywords As HtmlMeta = New HtmlMeta()
metaKeywords.Name = "Keywords"
metaKeywords.Content = "IT видео, Видео тренинги, видеокурсы, технологии Microsoft, видео обучение, ITVDN,Акции"
Page.Header.Controls.Add(metaKeywords)
End Sub
Использование тега H1
Тег h1 – очень важный и в то же время очень простой способ улучшить Вашу позицию в результатах поиска. Лучше всего, если h1 будет иметь то же содержание, что и тег title. Просто поместите короткое, релевантное ключевое слово в теги h1 и title. Как и любой другой тег HTML, он изменяется в разметке, или динамически при добавлении runat="server" и установке его id:
<h1 runat="server" id="MyPageHeader" >h1>
Теперь вы можете манипулировать тегом h1 с помощью серверного кода ASP.NET:
[ C# ]
MyPageHeader.InnerText = "ITVDN.com";
[ VB.NET ]
MyPageHeader.InnerText = "ITVDN.com";
Переадресация url адреса в ASP.NET
Иногда Вам нужно переместить страницу на другой URL или же полностью сменить домен. Типичный пример – смена ASP на ASP.NET. Для этого необходимо изменить расширения файлов с .asp на .aspx. Если посетитель заходит на Ваш старый адрес, он должен перенаправляться на новый адрес. Есть два вида переадресации:
Временное перенаправление, выдающее сообщение “302 Found”. Используется очень редко.
Постоянное перенаправление, выдающее “301 Moved Permanently”. Используется для передачи популярности (веса) на новый адрес.
Дружественные URL для SEO
Поисковые “web spiders” не любят непонятных символов в URL. Если Вы получаете данные из базы, чаще всего используется строка запроса вида /ShowProduct.aspx?id=23445. Данная гиперссылка выглядит достаточно логичной с точки зрения программирования, но неправильной для поисковых систем. Лучше использовать URL, содержащие ключевые слова, разделенные дефисом. Таким образом, вместо /ShowProduct.aspx?id?=23445 мы должны получить что-то вроде /My-Product-Name.aspx. Заметим, что URL, содержащая ключевые слова, легче читается человеком и лучше индексируется.
ViewState и SEO в ASP.NET
Существует предположение, что поисковые системы ограничены в чтении количества байтов для каждой страницы. Значение ViewState является скрытым полем на стороне клиента. Если у вас большой ViewState в начале страницы ASP.NET, то, возможно, “web spider” не увидит реального содержания страницы. Это может вредить ранжированию в результатах поиска. Самое простое решение проблемы – отключить ViewState, если он Вам не нужен. Но есть более правильный способ его отключения. В .NET Framework 3.5 SP1 введено новое свойство RenderAllHiddenFieldsAtTopOfForm. Установив значение на false, все генерируемые системой скрытые поля будут отображаться в конце страницы.
Комментируйте и оценивайте данную статью.
Источник: http://www.codeproject.com/Articles/667340/SEO-For-ASP-NET-Web-Site
Нововведення в С# 8
Автор: Jonathan Allen
Хотя внимание разработчиков приковано сейчас к таким глобальным вещам, как дефолтная реализация методов интерфейсов, мы хотим поговорить с вами о нюансах новой версии популярного языка программирования С#.
Новые операторы присвоения: &&= и ||=
Начиная с самой первой версии, C# поддерживал комбинирования операторов присвоения с другими операторами. Существует поддержка всех бинарных операторов (а именно - +, -, & и так далее), кроме булевских && и ||. Теперь комбинации типа &&= и ||= дополнят этот список.
Дословно-интерполируемые строки
Дословные строки начинаются на @”. Интерполируемые строки используют $”. Но что, если нам нужно создать дословно-интерполируемую строку? Что нам писать - @$” или $@”? Сейчас первый вариант работает, но второй выдает ошибку уровня компиляции, что может вызывать некоторые неудобства у многих разработчиков, так как обычно такие нюансы часто забывают.
Суть нововведения заключается в том, что в новой версии можно использовать как первый вариант конструкции, так и второй.
Впрочем, некоторые все равно находят это изменение лишним, так как оно может привести к некоторой фривольности кода и проблемам с единым стилем.
Выражение using структурно соответствует IDisposable
У компилятора C# интересное отношение к интерфейсам. Довольно часто вам не нужно на самом деле реализовывать абстрактный интерфейс для определенных фичей языка. Все, что вам нужно, так это просто реализовать в классе определенный публичный API, что по своей структуре повторяет абстрактный интерфейс.
Классическим примером этого является foreach и IEnumerable. Если класс обладает методом GetEnumerator, возвращающим значение свойства Current и методом MoveNext, тогда вы можете использовать foreach. Сами типы возвращаемых данных не имеют значения, что позволяет таким классам, как List<T>, реализовывать более быстрые перечисления. Этот подход достаточно часто называется структурным соответствием.
В рамках новой версии языка using также будет поддерживать структурное соответствие. На первый взгляд, это нововведение кажется лишенным смысла, так как мы вряд ли ожидаем увидеть класс для использования с using без реализации интерфейса IDisposable. Впрочем, мы упускаем такое нововведение как ref struct. Реализация интерфейса в данном случае невозможна, поэтому здесь нам на помощь приходит структурное соответствие.
Методы расширения с foreach и using
Как дополнение к предыдущему посту, теперь мы можем добавить GetEnumerator и Dispose в качестве методов расширения для работы с foreach и using соответственно. Опять же, здесь мы говорим об особенности, которая станет полезной в частном случае. К примеру, вы хотите добавить Dispose-расширение в COM-объект сторонней библиотеки (к примеру, дабы вызвать Marshal.ReleaseComObject).
Впрочем, информация об этом еще неполная и мы можем упустить некоторые случаи использования данной фичи.
Using неявной области видимости
На данный момент выражение using может быть использовано только в рамках явной области видимости (в скобках). Если данное нововведение будет принято на вооружение, теперь вы можете писать конструкции следующего вида:
Каждая из этих переменных будет автоматически очищена в конце текущей области видимости в реверсивном порядке. Функционально написанное выше эквивалентно этому, но гораздо более элегантно:
Подобное может быть полезно в тех случая, когда в одно и то же время создается множество dispose-объектов. Теперь вы можете создавать подобные объекты даже внутри выражений в полной уверенности в безопасности данного типа объявлений.
Возможный минус данного нововведения в том, что оно не совместимо с оператором goto.
Автор перевода: Евгений Лукашук
Источник
Вступ до NUnit
Автор: Редакция ITVDN
Введение
Статья рассказывает об NUnit – открытой среде юнит-тестирования приложений для .NET. В данной статье мы рассмотрим, что такое NUnit, как его загрузить и установить, создание классов тестов , а также запуск теста.
NUnit - открытая среда юнит-тестирования приложений для .NET, которая позволяет создавать автоматические тесты. Даный вид тестов обладает рядом преимуществ:
Высокое качество программы;
Снижение стоимости;
Безопасность регрессии сети
Чем выше качество программы, тем меньше средств затрачивается на устранение недостатков проекта. То есть, если найти недостатки в проекте на раннем этапе, решить их будет дешевле.
Загрузка и установка NUnit
Вы можете скачать NUnit с сайта http://www.nunit.org/
После завершения загрузки, разархивируйте файл и запустите программу.
Создание проекта библиотечного класса
Теперь создадим простой класс теста, используя C#, который добавляет два показателя, и протестируем его. Чтобы создать тест класса в Visual Studio, используя С#, выполните следующие шаги:
Шаг 1: Создание проекта библиотечного класса
Откройте Visual Studio.
Для создания проекта библиотечного класса сначала нажмите File -> New -> Project, выберите Visual C # в установленном шаблоне, выберите Class Library. Введите подходящее название (мы используем IntroNUnitTest), нажмите "OK".
После того, как Вы кликнули кнопку "OK", Вы увидите Ваш проект в Solution Explorer (в правом верхнем углу Visual Studio).
Шаг 2: Добавьте ссылки к Вашему проекту.
Чтобы добавить ссылку NUnit к Вашему проекту, кликните правой кнопкой мыши на ссылку, выберите Add reference-> Browse, затем nunit.framework.dll и «OK».
Шаг 3: Создание тестового класса.
Кликните правой кнопкой мыши на Вашем проекте, выберите Add -> Class, введите имя (используем MyNUnitTestClass) и далее "Add".
После того, как Вы кликнули на кнопку Add, Вы увидите класс.
После того, как Вы создали класс, добавьте using NUnit.Framework.
Следует соблюдать некоторые условия и понятия:
Каждый класс должен содержать атрибут [TestFixure] и должен быть общедоступен.
В каждом методе должен присутствовать атрибут [Test].
Оператор подтверждения об отсутствии ошибок: Булевские значения, описывающие, что должно быть ключевым словом, когда выполняется действие.
Ожидаемое исключение: один из типов исключения, который мы ожидаем во время выполнения тест-метода.
Установка: программа, которая запускается перед выполнением каждого тест-метода (например, регистрация в системе конкретного пользователя или инициализация одноэлементных классов).
Демонтаж: программа запускается после окончания каждого тест-метода (например, удаление строк из таблицы, которые были вставлены во время теста).
На примере мы постараемся сравнить две переменные х и у. Каждой переменной присвоили значение 20. В общей сложности написали 4 теста (PositiveTest, NegativeTest, ExpectedExceptionTest и NotImplementedException).
Запуск тестов
После написания всех тестов в тестовом классе необходимо запустить тесты, чтобы проверить, проходят ли они успешно. Для запуска тестов перейдите в папку NUnit, выберите NUnit Application (.exe) и дважды кликнике по ней, выберите команду File-> Open Project, выберите проект (в нашем случае это IntroNUnitTest.dll), затем кликаем Run.
Далее Вы увидите количество тестов, которые не сработали, и количество невыполненных тестов.
Если Вы хотите запустить какой-то определенный тест, кликните правой кнопкой мыши в тесте, который Вы хотите запустить, и выберите Run test(s).
Другие настройки
Вы также можете использовать другие настройки для запуска тестов:
Testdriven.net
ReSharper Jetbrains
Источник: http://www.c-sharpcorner.com/UploadFile/18fc30/introduction-to-nunit-test-driven-development-using-nunit-a/