--- layout: post title: Сужение задачи tags: - Гипотетически - Программирование - Веб --- Я довольно часто занимаюсь т. н. "менторством". Просто так, мне весело. Но довольно часто начинаю замечать, что часть моих ответы на вопросы подчиняются определённому алгоритму. После некоторого анализа я выяснил вот что. * Ко мне обычно обращаются за решением конкретной задачи. И обычно оказывается, что задача вопрошающему не по зубам. Тогда я выясняю, где именно загвоздка и даю задачу именно на эту загвоздку. * Иногда этот алгоритм заходит в рекурсию -- загвоздка оказывается не по зубам, тогда находится загвоздка в загвоздке и разбирается, пока не найден ответ. * Когда загвоздка разрешается, можно вернуться к предыдущей задаче, если таковая существует. Ничего не напоминает? ### Стек вызовов Когда вы вызываете функцию (почти в любом языке), внутри система сохранит "откуда вызвали": какие локальные переменные там были, флаги процессора (если применимо), аргументы. Когда функция завершается, достаёт последнюю сохранённую запись и возвращает данные из неё (локальные переменные, флаги) на соответствующие места, после чего передаёт управление на место вызова, записав в условленное место возвращённое значение. Т. е. с "местом сохранения" производятся две операции: "сохранить" и "загрузить", причём при загрузке достаётся (и убирается оттуда) запись, которая была сохранена последней. "The Last to get In is the First to get Out", LIFO. Это стек. ### Аналогия Более крупные программы строятся из более мелких функций. Они либо вырабатывают результат сами, либо обращаются к другим функциям. Вызовом функции здесь является *поиск более мелкой проблемы*, а возвратом из функции -- *разрешение проблемы*. Вот пример такого взаимодействия: * Как создать первое приложение на Rails? - Как установить свежий Ruby? + Как установить RVM? * Как запустить Linux в Windows? - Где найти VirtualBox? - Где скачать дистрибутив? * Как открыть терминал? - В чём редактировать код на Ruby? - Утилиты `rails` нет. Где её найти? + Что такое `gem`? В чём-то напоминает оглавление книги, только каждая отдельная запись/глава является задачей. Это можно реализовать в виде асимметричного чатика 1-на-1, ментор и ученик. Ученик, по большей части, отвечает на вопросы в чатике, посматривая на текущее состояние "стека задач", а ментор управляет этим стеком: добавляет при необходимости более мелкие задачи, и возвращается к предыдущей, если текущая решилась. В самом чате при этом много оформления не нужно, а вот в описаниях задач неплохо бы подогнать хотя бы комплект форматирования, представленный в этом блоге: Markdown, подсветка синтаксиса, TeX-подобные формулки. Может, однажды у меня даже дойдут руки это сделать. Под это, на вид, подходят NodeJS и Clojure, на серверной части оба умеют асинхронно работать с вебсокетами, и в браузерах тоже можно оба запустить.