Programming Flashcards

1
Q

O нотація, оцінка складності алгоритму

A

O(1) — (складність порядку 1) одна операція для всіх можливих вхідних даних. Алгоритм виконується за константний час. Якщо операцій декілька, все одно вважається O(1), оскільки нас цікавить співвідношення до вхідних даних.

O(n) — (складність порядку n) лінійний алгоритм. Наприклад, пройтися по масиву та підрахувати суму елементів.

O(log n) — якщо масив відсортований, можна застосувати алгоритм бінарного пошуку та кожного разу відкидати половину елементів, які нам не підходять. У цьому випадку не потрібно перебирати кожен елемент, і час виконання буде меншим.

O(n^2) — (складність порядку n у квадраті) у алгоритмів із вкладеним циклом.

O(n * log n) — коли ми замінили два вкладених проходи на бінарний пошук.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Поток vs процес

A

Процес — це окремий екземпляр програми, якому виділені ресурси системи. Кожен процес ізольований і не може безпосередньо отримати доступ до змінних іншого. У Node.js можна використовувати модуль child_process для запуску паралельних процесів та обміну повідомленнями.

Потоки — виконуються паралельно всередині процесу, і потоки одного процесу можуть працювати з однією областю пам’яті через SharedArrayBuffer. Створення нового потоку відбувається швидше, ніж створення нового процесу. У Node.js можна використовувати worker_threads для запуску завдань у новому потоці.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Stack vs queue

A

Stack - first in last out. Queue - first in first out.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Основні принципи ООП

A

Абстракція - відображення сутностей реального світу у вигляді об’єктів із прихованням деталей їхньої реалізації.

Наслідування — клас може мати класи-нащадки, які можуть розширювати й змінювати його поведінку.

Поліморфізм — класи можуть мати однаковий інтерфейс, але різну поведінку.

Інкапсуляція — приховування реалізації. У класу може бути публічний і приватний інтерфейс.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Generic, узагальнений тип

A

Дозволяє зарезервувати місце для типу, який буде вказано пізніше при виклику функції, роботі з класами або типами.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Паттерни проектування, які ти використовуєш у своїх проектах

A

Singleton — реалізується просто завдяки вбудованому механізму кешування модулів у Node.js. Після першого підключення, модуль стає доступним як той самий екземпляр по всьому проекту.

Adapter — створює простіший інтерфейс для взаємодії з іншою бібліотекою, дозволяючи використовувати значення за замовчуванням.

Decorator — додає додаткову функціональність до методу або класу динамічно, не змінюючи їхньої базової структури.

Factory — забезпечує простий інтерфейс для створення об’єктів, абстрагуючи складності інстанціації.

Observer — дає змогу отримувати сповіщення про зміну стану, що дозволяє налаштовувати реакції на ці зміни.

Dependency Injection — у цьому паттерні залежність передається як аргумент. Це робить модуль легшим для тестування, бо ініціалізація залежності відбувається ззовні, знімаючи відповідальність за це з самого модуля. У результаті можна уникнути синглтонів, просто ініціалізуючи модуль один раз і передаючи його далі по ланцюжку.

Mediator — дозволяє об’єктам взаємодіяти через посередника, без прямої залежності один від одного.

Facade — єдиний інтерфейс до множини інших інтерфейсів, спрощуючи доступ до складних підсистем.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Принцип SOLID

A

Принцип єдиного обов’язку (Single Responsibility Principle) — об’єкт має мати пов’язаний набір функціоналу з єдиною відповідальністю.

Принцип відкритості/закритості (Open/Closed Principle) — функціонал повинен бути відкритий для розширення, але закритий для зміни. Код має бути гнучким і легко масштабованим.

Принцип підстановки Лісков (Liskov Substitution Principle) — нащадки і батьківські класи мають бути взаємозамінними.

Принцип розділення інтерфейсу (Interface Segregation Principle) — кілька спеціалізованих інтерфейсів кращі, ніж один універсальний. Погано, коли ми створили інтерфейс, а під час його реалізації робимо методи-заглушки.

Принцип інверсії залежностей (Dependency Inversion Principle) — код має залежати від абстракцій, а не від деталей. Наприклад, у JS можна створити клас MessageQueue, який, не прив’язуючись до конкретного клієнта чи протоколу, буде відправляти та отримувати повідомлення. Це дозволить легко змінити реалізацію черг при потребі.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Принцип KISS

A

KISS — keep it simple, stupid. Хороший код легко читається, його просто зрозуміти, він використовує загальноприйняті впізнавані підходи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Принцип DRY

A

DRY — don’t repeat yourself. Потрібно уникати копіювання коду та ситуацій, коли його потрібно змінювати в декількох місцях одночасно. Краще винести код в окремий модуль або додати йому універсальності.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Принцип YAGNI

A

YAGNI — You Ain’t Gonna Need It. Не варто писати код, який не потрібен зараз, але може знадобитися в майбутньому. Кожен написаний код має бути добре протестований і задокументований, інакше виникнуть проблеми з його підтримкою. Якщо ж ми робимо це для непотрібного функціоналу, то даремно витрачаємо час.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

IoC

A

Інверсія керування - це принцип програмування, при якому об’єкт не самостійно керує своїми залежностями, а отримує їх ззовні (Dependancy Injection).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Рекурсия, trampoline

A

Функція, яка викликає саму себе.

У JS, щоб уникнути stack overflow, можна реалізувати trampoline. Для цього потрібно створити функцію, яка прийматиме рекурсивну функцію і виконуватиме її в циклі while, поки результатом є функція, а не значення. Сама рекурсивна функція повинна обгорнути рекурсивний виклик в анонімну функцію.

const trampoline = fn => {
while (typeof fn === ‘function’) {
fn = fn();
}
return fn;
};

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Яке буває масштабування?

A

Вертикальне масштабування — нарощування потужностей. Збільшуємо розмір інстансу.

Горизонтальне масштабування — запуск більшої кількості серверів або екземплярів застосунку. Додаємо збоку більше машин.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Що таке TCP?

A

Transport Control Protocol (TCP) — це протокол передачі даних у мережі. Працює на 4-му транспортному рівні. Підтримує попереднє встановлення з’єднання, повідомляє про результати доставки, здійснює повторний запит у разі втрати даних і усуває дублювання. Тобто TCP гарантує цілісність передачі даних.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Що таке UDP?

A

UDP (User Datagram Protocol) — це швидкий, ненадійний протокол передачі даних без підтвердження доставки та перевірки порядку пакетів. Використовується для застосунків у реальному часі, де затримка важливіша за надійність, як у стрімінгу й іграх.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

HTTP протокол

A

HTTP запрос складається з метода, uri ресурсу, версії протокола, хедерів та тіла запиту.

17
Q

Що таке REST?

A

Representational state transfer (передача стану через представлення) — архітектурний стиль побудови розподілених систем у мережі. Ключове поняття — це ресурс, який ми можемо отримувати або змінювати. Використовує HTTP-методи. Основні особливості: уніфікований інтерфейс, наявність клієнта і сервера, багаторівнева система з можливими посередниками, кешування відповідей, відсутність зберігання стану клієнта на сервері.

18
Q

Антипатерни

A

God object — об’єкт, що містить надто багато функціональності, яку можна розбити на частини.
Public Morozov — відкриття доступу до закритих даних і функцій.
Класи-полтергейсти — непотрібні шари абстракції.
Магічні числа і рядки — використання незрозумілих констант без пояснення.
Передчасна оптимізація — витрати часу на те, що може не знадобитися або мати мінімальний ефект. Часто погіршує читабельність.
Спагеті-код — заплутана система, яку важко зрозуміти.

19
Q

Композиція в ООП

A

Композиція — це використання функціоналу інших класів шляхом включення їх в інший клас. Це гнучкіший підхід, ніж наслідування, і може замінити множинне наслідування, дозволяючи комбінувати можливості різних класів

20
Q

Що відбувається від вводу адреси в браузері і кліку Enter до повного рендеру сторінки

A
  1. DNS Lookup: Браузер перевіряє локальний кеш DNS і, якщо адреса не знайдена, звертається до DNS-серверів для отримання IP-адреси введеного домену. Цей етап завершується, коли браузер отримує IP-адресу для підключення до сервера.
  2. Встановлення з’єднання: Відбувається TCP-підключення до сервера через триетапний процес TCP Handshake. Після цього, при HTTPS-з’єднанні, відбувається обмін SSL/TLS сертифікатами для встановлення безпечного з’єднання.
  3. HTTP-запит: Браузер надсилає HTTP/HTTPS-запит на сервер для отримання HTML-документа. Запит включає заголовки, як-от User-Agent, кукі, сесійні токени та іншу інформацію.
  4. Відповідь сервера: Сервер обробляє запит і надсилає HTTP-відповідь із HTML-контентом сторінки. Відповідь може містити код статусу (200, 404, 500 тощо), заголовки та власне HTML. Може відрендерити готову сторінку або віддати HTML для рендеру на клієнті.
  5. Парсинг HTML: Браузер починає парсити HTML-документ і створює DOM (Document Object Model). Одночасно він виявляє ресурси, що потребують завантаження, як-от CSS, JavaScript, зображення.
  6. Завантаження ресурсів: CSS завантажується та парситься, що дозволяє побудувати CSSOM (CSS Object Model). JavaScript обробляється відповідно до атрибутів <script блокуючий, асинхронний або відкладений).
  7. Побудова рендер-дерева: Об’єднуються DOM і CSSOM, формуючи рендер-дерево для визначення видимих елементів та їх стилів.
  8. Лейаут (розміщення): Браузер обчислює точні позиції та розміри елементів на сторінці відповідно до рендер-дерева.
  9. Побудова та малювання: На основі лейауту браузер “малює” елементи на екран у процесі, відомому як реконструювання і репейнт.
  10. Інтерактивність: Після рендеру браузер активує JavaScript і обробляє події користувача (кліки, скролінг).
21
Q

SAML

A

Стандарт для налаштування аутентифікації та авторизації між двома сторонами.

Identity Provider (IdP) — постачальник ідентифікації, який підтверджує особу користувача.
Service Provider (SP) — додаток або служба, яка довіряє ідентифікації від IdP.

Як працює:
1. Користувач запитує доступ до сервісу (SP).
2. SP перенаправляє користувача на IdP для аутентифікації.
3. IdP аутентифікує користувача і створює SAML-токен з інформацією про нього.
4. Токен передається назад до SP, який перевіряє його валідність і надає доступ.

22
Q

gRPC

A

gRPC (Google Remote Procedure Call) – це фреймворк для віддалених процедурних викликів (RPC), який використовує HTTP/2 та Protobuf для швидкої й ефективної передачі даних. Підтримує стріми для отримання відповідей в колбеці. Підходить для мікросервісної архітектури завдяки мультиплатформності (12+ мов), високій швидкості та ефективності. Для браузерів використовується gRPC-Web із проксі (наприклад, Envoy). Недоліки: складність дебагу через бінарний формат та додаткові налаштування для веб-клієнтів.

23
Q

Що таке алгоритм?

A

Алгоритм визначає кроки, які потрібно виконати у визначеному порядку, щоб отримати потрібний результат.

24
Q

What is the difference between composition and aggregation?

A

В ООП композиція коли дочірній обʼєкт не може існувати без батьківського. Engine and Car. Видаляється батьківський і з ним дочірній.
Агрегація - коли дочірній може існувати окремо. Наприклад студенти і університет.

25
Q

MVVM

A

Model, View, ViewModel.
Model - дані та логіка.
View - інтерфейс користувача.
ViewModel - логіка по обробці даних для інтерфейсу.

26
Q

Переваги та недоліки мікросервісів

A

Переваги:
- Вибір необхідних технологій, мов програмування та бази
- Підтримка стає легша, можна мати невеличку команду під певні мікросервіси
- Відмовостійкість - один впав, частина системи працює
- Скейлінг тільки тих що більше навантажені
- Легша підтримка, можна оновити тільки один сервіс
- Можливість перевикористання сервісів
- Розділена логіка по bounded context.

Недоліки:
- Складність моніторінгу, оновлення залежностей, налаштування інфраструктури великої кількості сервісів
- Мережеві затримки
- Складність у налаштуванні комунікації, треба використовувати черги, HTTP, gPRC. Правильно налаштувати взаємодію.
- Ваще дебажити помилки у розподіленій системі
- Більша вартість на інфраструктуру
- Складніше підтримувати консистентність даних.
- Розподілені транзакції.

27
Q

Domain-Driven Design

A

Domain-Driven Design (DDD) — це підхід до розробки програмного забезпечення, орієнтований на моделювання програмної системи відповідно до реального бізнес-домену.

Domain - Це сфера діяльності або бізнес-проблема, яку система повинна вирішити.
Наприклад, у банківській системі доменом є “управління рахунками”.

Ubiquitous Language - команда розробників і бізнесу використовує одну спільну мову для опису домену, щоб уникнути непорозумінь.

Bounded Context - Домен поділяється на логічні частини (контексти), кожен із яких має власну модель.

Entities - об’єкти, які мають унікальний ідентифікатор і життєвий цикл.

Aggregates - Групи об’єктів, які мають єдину точку доступу (кореневу сутність).
Наприклад, “Замовлення” як агрегат може містити список “Товарів”.

Repositories - Інтерфейси для доступу до агрегатів у сховищі даних.

Value Objects - Об’єкти без унікального ідентифікатора, які представляють атрибути сутностей.

28
Q

Нові можливості в HTTP/2

A

Використовується бінарний формат замість текстового в 1.
Кілька запитів і відповідей можуть передаватися через одне TCP-з’єднання одночасно.
HTTP/2 стискає заголовки, які можуть повторюватися між запитами,
Сервер може надсилати клієнту ресурси до того, як вони будуть запитані.
HTTP/2 дозволяє задавати пріоритети для запитів, визначаючи, які ресурси важливіші.

Загалом, підвищена швидкість, менше затримок.