Перейти к основному содержимому

Тест на готовность к программированию

Всем

Вообще, я бы на вашем месте не заморачивался с тестами на готовность к программированию, и рекомендовал бы пройти с самого начала - компьютерной, сетевой, цифровой грамотности. Люди вообще очень торопятся - бегут вперед и вперед, думая, что выучив синтаксис, смогут справляться с профессиональными задачами. К сожалению, нет. Когда вы увидите реально сложный код, вам станет плохо.

Давайте начнём с первого испытания.

Скажите, больно ли вам читать этот код?

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Переменные, ветвления, циклы, функции
3Git, IDE, отладка (без Docker как обязательного)
4Структуры данных и OOP — обзор
5Языки — куда копать дальше

1 — Среда и терминал

Вопросы

  1. Что делает операционная система для запущенной программы (память, CPU)?
  2. Зачем разработчику терминал, если есть графический интерфейс?
  3. Чем RAM отличается от файла на диске при выключении ПК?
  4. Что покажет команда текущей папки: pwd (Linux/macOS) или cd без аргументов (Windows cmd)?
  5. "Загрузка CPU 90%" — это всегда плохо?

Задачи

Задача 1.
Создайте файл hello.txt с текстом Hello, world! через терминал и команду проверки содержимого.

Задача 2.
Опишите, как узнать локальный IP вашего компьютера (одна команда или пункт меню ОС).

Разбор: блок 1

Вопросы

  1. Выделяет память, планирует потоки, даёт доступ к файлам и сети, изолирует процессы.
  2. Автоматизация, серверы, Git, сборки, скрипты — быстрее и воспроизводимее, чем кликать.
  3. RAM очищается; файл на диске остаётся.
  4. pwd — путь; cd в cmd — текущий диск и каталог.
  5. Не всегда: может быть тяжёлая задача; плохо, если так постоянно без причины или система тормозит.

Задачи

Задача 1.

echo "Hello, world!" > hello.txt
cat hello.txt # Windows: type hello.txt

Задача 2.
ipconfig / ip addr / "Параметры сети" → IPv4.


2 — Основы кода

Вопросы

  1. Что хранит переменная?
  2. Когда нужен if, а когда цикл?
  3. for vs while — одно практическое отличие.
  4. Зачем выносить код в функцию?
  5. Почему 10 / 4 в Python 3 даёт 2.5, а в C при int/int часто 2?

Задачи

Задача 1.
Псевдокод или код — переменная age = 17, вывести, можно ли голосовать (порог 18).

Задача 2.
Цикл: вывести числа 1..10 включительно.

Задача 3.
Функция greet(name) → строка Привет, &#123;name&#125;!; вызов с "Анна".

Разбор: блок 2

Вопросы

  1. Значение по имени в памяти (число, строка, объект…).
  2. if — ветвление по условию; цикл — повторение.
  3. for — когда известно число итераций; while — пока условие истинно.
  4. Не дублировать, тестировать кусок отдельно, читать проще.
  5. Разные типы деления: 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 — Разработка и инструменты

Вопросы

  1. Зачем Git, если файлы и так на диске?
  2. Что такое коммит?
  3. Breakpoint в отладчике — зачем?
  4. Библиотека vs фреймворк — кто "ведёт" выполнение?
  5. Docker — зачем контейнер, если есть виртуальная машина? (одно отличие)

Задачи

Задача 1.
Последовательность Git: создать репозиторий, добавить readme.md с # Старт, коммит "Старт".

Задача 2.
Что вы увидите в отладчике, если поставить breakpoint на строке print в скрипте из трёх строк с переменной?

Разбор: блок 3

Вопросы

  1. История, ветки, откат, работа в команде без "файл_финал_2.zip".
  2. Снимок состояния репозитория с сообщением.
  3. Остановить выполнение и посмотреть переменные.
  4. Библиотеку вызываете вы; фреймворк задаёт каркас (например, обработчики HTTP).
  5. Контейнер легче, делит ядро ОС; VM — целая гостевая ОС.

Задачи

Задача 1.
git init → создать файл → git add readme.mdgit commit -m "Старт" — разбор каждой команды в лабораторной шпаргалке Git

Задача 2.
Выполнение остановится до print; в панели переменных видны текущие значения.


4 — Структуры данных и ООП

Вопросы

  1. Класс и объект — в чём разница?
  2. Стек — какой принцип (LIFO/FIFO)?
  3. Поиск в неотсортированном массиве из n элементов — порядок сложности?
  4. Инкапсуляция — зачем скрывать поля?
  5. Сборка мусора — что освобождает?

Задачи

Задача 1.
Класс Counter с полем value, методами inc() и reset().

Задача 2.
Функция linear_search(arr, target) → индекс или -1.

Разбор: блок 4

Вопросы

  1. Класс — чертёж; объект — экземпляр в памяти.
  2. LIFO.
  3. O(n) — линейный поиск.
  4. Контроль инвариантов, меньше случайных поломок извне.
  5. Память объектов, на которые нет ссылок (в 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 — Языки — ориентиры

Вопросы

  1. Какой язык в браузере без компиляции в отдельный exe?
  2. Python часто берут для скриптов и данных — почему (два фактора)?
  3. Java и C# — что общего в модели выполнения?
  4. C++ и Rust — что общего в цели "близко к железу"?
  5. Go — одна фишка для серверов?

Задачи

Задача 1.
Выберите один язык, который хотите изучать первым, и три причины (проект, работа, интерес — не "он модный").

Задача 2.
Функция на двух языках — сумма чётных чисел в массиве [1,2,3,4,5,6]12.

Разбор: блок 5

Вопросы

  1. JavaScript.
  2. Простой синтаксис, богатая экосистема (pandas, скрипты, ML).
  3. Виртуальные машины / байт-код, статическая типизация (в разной степени).
  4. Контроль производительности и ресурсов; Rust добавляет проверки владения на этапе компиляции.
  5. Простой синтаксис, горутины, один бинарник, быстрая сборка.

Задачи

Задача 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 — индивидуальна; засчитывается связная аргументация.