Тест на готовность к программированию
Вообще, я бы на вашем месте не заморачивался с тестами на готовность к программированию, и рекомендовал бы пройти с самого начала - компьютерной, сетевой, цифровой грамотности. Люди вообще очень торопятся - бегут вперед и вперед, думая, что выучив синтаксис, смогут справляться с профессиональными задачами. К сожалению, нет. Когда вы увидите реально сложный код, вам станет плохо.
Давайте начнём с первого испытания.
Скажите, больно ли вам читать этот код?
const createProcessor = (config = { timeout: 1000, retries: 3 }) => {
const cache = new WeakMap();
const pending = new Map();
return (endpoint) => async (...args) => {
const { threshold = 0.5, transform = (v) => v } = args[0] || {};
const key = JSON.stringify({ endpoint, args: [...args] });
if (pending.has(key)) {
return pending.get(key);
}
const executor = async (attempt = 1) => {
try {
const result = await new Promise((res, rej) => {
const timer = setTimeout(() => rej(new Error('Timeout')), config.timeout);
fetch(endpoint, { method: 'POST', body: JSON.stringify(args) })
.then(r => r.json())
.then(data => {
clearTimeout(timer);
if (data.confidence < threshold) {
rej(new Error(`Low confidence: ${data.confidence}`));
} else {
res(transform(data.payload));
}
})
.catch(rej);
});
cache.set({ endpoint, args }, result);
return result;
} catch (err) {
if (attempt < config.retries) {
const delay = 2 ** attempt * 100;
await new Promise(r => setTimeout(r, delay));
return executor(attempt + 1);
}
throw err;
} finally {
pending.delete(key);
}
};
const promise = executor();
pending.set(key, promise);
return promise;
};
};
const {
process: proc,
meta: { version: v = '1.0.0-beta' }
} = (() => {
const p = createProcessor({ timeout: 2000, retries: 5 });
return {
process: p('/api/v2/data'),
meta: { version: '2.4.0' }
};
})();
proc({ threshold: 0.8, transform: (d) => d?.items?.map(i => i.id) || [] })
.then((ids) => ids.filter(id => id > 100))
.then((filtered) => Promise.all(filtered.map(id => proc({ id }))))
.then(console.log)
.catch(({ message, stack }) => console.error(`[FATAL] ${message}`, stack));
Это пример кода на JavaScript, с довольно обширным охватом инструментов - замыкания, асинхронность, тернарные операторы, деструктуризациия и экспоненциальная задержка.
Язык довольно массивный, сложный для новичка, но при этом часто примерно так и будет читаться крупный серьёзный код. Многие даже ненавидят JavaScript.
На курсах, которые проходят новички, такое не разбирают. Даже пройдя 50+ занятий, код пишется в стиле:
let test = "Привет"
let word = "Мир"
console.log(test+word)
Этот код читает легче, не так ли? Проблема в том, что его и НЕ программист прочитает.
Теперь ещё один, более древний "ужас" - пример на языке C++:
template<typename T, typename U>
auto compose(std::function<U(T)> f, std::function<T(T)> g) {
return [=](T x) -> U { return f(g(x)); };
}
auto pipeline = compose<int, std::string>(
[](int x) { return std::to_string(x * 2); },
[](int x) { return x + 1; }
);
Довольно сложно, не так ли? Особенно если вы не понимаете всех этих механик и инструментов.
Новичков обычно учат Python, даже школьников, и примеры там в стиле:
import random
names = ["Аня", "Боря", "Вика", "Гена"]
winner = random.choice(names)
print("Победитель:", winner)
Читать довольно легко, не так ли? На начальной стадии - да.
Но когда приступите к более сложным реализациям:
def draw(self, surface):
t = self.life / self.max_life
alpha = max(0, min(255, int(255 * t * t)))
size = max(1, int(self.size * (0.3 + 0.7 * t)))
if self.kind == "star" and size >= 3:
pts = []
for i in range(5):
a = math.tau * i / 5 - math.pi / 2
pts.append((self.x + math.cos(a) * size, self.y + math.sin(a) * size))
a2 = a + math.pi / 5
pts.append((self.x + math.cos(a2) * size * 0.4, self.y + math.sin(a2) * size * 0.4))
s = pygame.Surface((size * 4, size * 4), pygame.SRCALPHA)
shifted = [(p[0] - self.x + size * 2, p[1] - self.y + size * 2) for p in pts]
pygame.draw.polygon(s, (*self.color[:3], alpha), shifted)
surface.blit(s, (int(self.x) - size * 2, int(self.y) - size * 2))
else:
s = pygame.Surface((size * 2, size * 2), pygame.SRCALPHA)
rgb = tuple(max(0, min(255, int(c))) for c in self.color[:3])
pygame.draw.circle(s, (*rgb, alpha), (size, size), size)
surface.blit(s, (int(self.x) - size, int(self.y) - size))
То читать уже сильно сложнее, согласитесь?
Так вот. Если вы дошли до этого момента, и вам стало лишь интереснее, как оно так работает - значит вы всё же имеете тягу к программированию. Если же тяжелее, то тогда однозначно закрепите сначала компьютерную грамотность и изучите основы.
В блоках 2–4 важнее логика и умение объяснить шаги. Если вы не знаете - пропускайте спокойно.
Блок 1 проверяет, что вы не боитесь терминала — если он пустой, сначала "Тест на компьютерную грамотность" и раздел про командную строку. Код в задачах можно писать на любом знакомом языке.
Зафиксируйте интерес к темам в Навигаторе новичка и профилей — это поможет понять, идти ли дальше в языки, аналитику, безопасность или инфраструктуру.
| Блок | Смысл |
|---|---|
| 1 | Терминал, файлы, "как живёт процесс" |
| 2 | Переменные, ветвления, циклы, функции |
| 3 | Git, IDE, отладка (без Docker как обязательного) |
| 4 | Структуры данных и OOP — обзор |
| 5 | Языки — куда копать дальше |
1 — Среда и терминал
Вопросы
- Что делает операционная система для запущенной программы (память, CPU)?
- Зачем разработчику терминал, если есть графический интерфейс?
- Чем RAM отличается от файла на диске при выключении ПК?
- Что покажет команда текущей папки:
pwd(Linux/macOS) илиcdбез аргументов (Windows cmd)? - "Загрузка CPU 90%" — это всегда плохо?
Задачи
Задача 1.
Создайте файл hello.txt с текстом Hello, world! через терминал и команду проверки содержимого.
Задача 2.
Опишите, как узнать локальный IP вашего компьютера (одна команда или пункт меню ОС).
Разбор: блок 1
Вопросы
- Выделяет память, планирует потоки, даёт доступ к файлам и сети, изолирует процессы.
- Автоматизация, серверы, Git, сборки, скрипты — быстрее и воспроизводимее, чем кликать.
- RAM очищается; файл на диске остаётся.
pwd— путь;cdв cmd — текущий диск и каталог.- Не всегда: может быть тяжёлая задача; плохо, если так постоянно без причины или система тормозит.
Задачи
Задача 1.
echo "Hello, world!" > hello.txt
cat hello.txt # Windows: type hello.txt
Задача 2.
ipconfig / ip addr / "Параметры сети" → IPv4.
2 — Основы кода
Вопросы
- Что хранит переменная?
- Когда нужен
if, а когда цикл? forvswhile— одно практическое отличие.- Зачем выносить код в функцию?
- Почему
10 / 4в Python 3 даёт2.5, а в C приint/intчасто2?
Задачи
Задача 1.
Псевдокод или код — переменная age = 17, вывести, можно ли голосовать (порог 18).
Задача 2.
Цикл: вывести числа 1..10 включительно.
Задача 3.
Функция greet(name) → строка Привет, {name}!; вызов с "Анна".
Разбор: блок 2
Вопросы
- Значение по имени в памяти (число, строка, объект…).
if— ветвление по условию; цикл — повторение.for— когда известно число итераций;while— пока условие истинно.- Не дублировать, тестировать кусок отдельно, читать проще.
- Разные типы деления: float vs целочисленное.
Задачи
Пример (Python):
age = 17
print("Можно" if age >= 18 else "Нельзя")
for i in range(1, 11):
print(i)
def greet(name):
return f"Привет, {name}!"
print(greet("Анна"))
3 — Разработка и инструменты
Вопросы
- Зачем Git, если файлы и так на диске?
- Что такое коммит?
- Breakpoint в отладчике — зачем?
- Библиотека vs фреймворк — кто "ведёт" выполнение?
- Docker — зачем контейнер, если есть виртуальная машина? (одно отличие)
Задачи
Задача 1.
Последовательность Git: создать репозиторий, добавить readme.md с # Старт, коммит "Старт".
Задача 2.
Что вы увидите в отладчике, если поставить breakpoint на строке print в скрипте из трёх строк с переменной?
Разбор: блок 3
Вопросы
- История, ветки, откат, работа в команде без "файл_финал_2.zip".
- Снимок состояния репозитория с сообщением.
- Остановить выполнение и посмотреть переменные.
- Библиотеку вызываете вы; фреймворк задаёт каркас (например, обработчики HTTP).
- Контейнер легче, делит ядро ОС; VM — целая гостевая ОС.
Задачи
Задача 1.
git init → создать файл → git add readme.md → git commit -m "Старт" — разбор каждой команды в лабораторной шпаргалке Git
Задача 2.
Выполнение остановится до print; в панели переменных видны текущие значения.
4 — Структуры данных и ООП
Вопросы
- Класс и объект — в чём разница?
- Стек — какой принцип (LIFO/FIFO)?
- Поиск в неотсортированном массиве из n элементов — порядок сложности?
- Инкапсуляция — зачем скрывать поля?
- Сборка мусора — что освобождает?
Задачи
Задача 1.
Класс Counter с полем value, методами inc() и reset().
Задача 2.
Функция linear_search(arr, target) → индекс или -1.
Разбор: блок 4
Вопросы
- Класс — чертёж; объект — экземпляр в памяти.
- LIFO.
- O(n) — линейный поиск.
- Контроль инвариантов, меньше случайных поломок извне.
- Память объектов, на которые нет ссылок (в Java, Python, C# и др.).
Задачи
class Counter:
def __init__(self):
self.value = 0
def inc(self):
self.value += 1
def reset(self):
self.value = 0
def linear_search(arr, target):
for i, x in enumerate(arr):
if x == target:
return i
return -1
5 — Языки — ориентиры
Вопросы
- Какой язык в браузере без компиляции в отдельный exe?
- Python часто берут для скриптов и данных — почему (два фактора)?
- Java и C# — что общего в модели выполнения?
- C++ и Rust — что общего в цели "близко к железу"?
- Go — одна фишка для серверов?
Задачи
Задача 1.
Выберите один язык, который хотите изучать первым, и три причины (проект, работа, интерес — не "он модный").
Задача 2.
Функция на двух языках — сумма чётных чисел в массиве [1,2,3,4,5,6] → 12.
Разбор: блок 5
Вопросы
- JavaScript.
- Простой синтаксис, богатая экосистема (pandas, скрипты, ML).
- Виртуальные машины / байт-код, статическая типизация (в разной степени).
- Контроль производительности и ресурсов; Rust добавляет проверки владения на этапе компиляции.
- Простой синтаксис, горутины, один бинарник, быстрая сборка.
Задачи
Задача 2.
Python: sum(x for x in a if x % 2 == 0).
JS: a.filter(x => x % 2 === 0).reduce((s, x) => s + x, 0).
Задача 1 — индивидуальна; засчитывается связная аргументация.