D:\sideБлогСужение задачи

⚠️ Обращайте внимание на даты.
Этот блог больше не ведётся с 17 января 2023, и на тот момент с написания этой страницы (05.10.2015) прошло 7 лет.

Я довольно часто занимаюсь т. н. “менторством”. Просто так, мне весело. Но довольно часто начинаю замечать, что часть моих ответы на вопросы подчиняются определённому алгоритму. После некоторого анализа я выяснил вот что.

Ничего не напоминает?

Стек вызовов

Когда вы вызываете функцию (почти в любом языке), внутри система сохранит “откуда вызвали”: какие локальные переменные там были, флаги процессора (если применимо), аргументы. Когда функция завершается, достаёт последнюю сохранённую запись и возвращает данные из неё (локальные переменные, флаги) на соответствующие места, после чего передаёт управление на место вызова, записав в условленное место возвращённое значение.

Т. е. с “местом сохранения” производятся две операции: “сохранить” и “загрузить”, причём при загрузке достаётся (и убирается оттуда) запись, которая была сохранена последней. “The Last to get In is the First to get Out”, LIFO. Это стек.

Аналогия

Более крупные программы строятся из более мелких функций. Они либо вырабатывают результат сами, либо обращаются к другим функциям.

Вызовом функции здесь является поиск более мелкой проблемы, а возвратом из функции – разрешение проблемы. Вот пример такого взаимодействия:

В чём-то напоминает оглавление книги, только каждая отдельная запись/глава является задачей.

Это можно реализовать в виде асимметричного чатика 1-на-1, ментор и ученик. Ученик, по большей части, отвечает на вопросы в чатике, посматривая на текущее состояние “стека задач”, а ментор управляет этим стеком: добавляет при необходимости более мелкие задачи, и возвращается к предыдущей, если текущая решилась.

В самом чате при этом много оформления не нужно, а вот в описаниях задач неплохо бы подогнать хотя бы комплект форматирования, представленный в этом блоге: Markdown, подсветка синтаксиса, TeX-подобные формулки.

Может, однажды у меня даже дойдут руки это сделать. Под это, на вид, подходят NodeJS и Clojure, на серверной части оба умеют асинхронно работать с вебсокетами, и в браузерах тоже можно оба запустить.