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

Структура статьи

  1. Погружение в навыки
    1.1 Навык
    1.2 Алгоритм действий и знания
    1.3 Осознанность применения навыка
    1.4 Комплексные навыки

  2. Этапы формирования навыков
    2.1 Передача знаний
    2.2 Усвоение знаний
    2.3 Формирование навыка
    2.4 Применение и интеграция навыка
    2.5 Оценка и рефлексия
    2.6 Закрепление навыка

1. Погружение в навыки

1.1 Навык

Навык — это умение выполнять определенные действия для достижения заданного результата или решения задачи. Применительно к программированию навыком можно назвать как в целом умение программировать, так и умение выполнять какую-то небольшую операцию, например, объявить переменную, найти индекс элемента в массиве и т.д. В данном случае различается комплексность навыков. Умение программировать — это очень комплексный навык, состоящий из множества более мелких навыков. А умение объявить переменную, наоборот, простой, мелкий навык, практически не требующих других навыков программирования.

1.2 Алгоритм действий и знания

Любой навык (и более комплексный, и менее) выражается в каком-то алгоритме действий, который нужно совершить, чтобы прийти к результату. Например, для того, чтобы объявить переменную в JavaScript нужно:

  • Выбрать ключевое слово var, const или let;

  • Подобрать допустимое имя переменной;

  • Поставить оператор присвоения “=”;

  • Указать значение переменной в соответствии с правилами того типа данных, к которому относится значение. Например, строку взять в кавычки, дробное число писать через точку, массив взять в квадратные скобки, а элементы разделить запятой и т.д.

Выполнение алгоритма действий неотрывно связано со знаниями, как устроена предметная область. Так для алгоритма выше нужно знать различия между ключевыми словами var, const и let, знать базовые правила наименования переменных и оператор присваивания, знать синтаксис записи различных типов данных и тд.

1.3 Осознанность применения навыка

Можно не обладать всеми этими знаниями на высоком уровне, чтобы объявить переменную. Например, студент просто помнит, что преподаватель называл переменные английскими словами: age, count, res и использует подобные слова при решении задач. Но при этом студент может не помнить ни одного правила наименования переменных и при случаи попробует обозначить переменные просто цифрами.

На примере с переменной мы подошли к осознанности применения навыка. Осознанность применения навыка — это способность студента соотносить действия по выполнению навыка со знаниями предметности области. Чем больше знаний о предметной области и чем лучше студент соотносит их с действиями, тем выше осознанность применения навыка и правильность действий. Преподавателю всегда стоит помнить, что внешне студент может демонстрировать владение навыком, но при этом осознанность выполняемых действий может быть низкая. При изменении контекста задачи такой студент не справится с применением навыка. Поэтому так важно не просто решать задачи, но и просить студентов озвучивать ход решения, аргументировать выполняемые действия. В данном случае лучше решить меньше задач, но глубже их проработать.

1.4 Комплексные навыки

Чем с более комплексными навыками мы имеем дело, тем больше количество действий в алгоритме, больше вариативность этих действий, больше требований к знаниям предметной области, чтобы выбрать правильные действия. Так уже при написании простого приложения, например, ToDo List студент столкнется не только с необходимостью осознанно писать код, но и структурировать свою работу, разделять ее на этапы, думать на несколько шагов вперед. Тут уже часто проявляется проблема, что студенты не знают с чего начать, как выстроить последовательность шагов к результату. В таких случаях в обучении незаменим лайвкодинг, когда преподаватель показывает в динамике как из ничего создается программа.

2. Этапы формирования навыка

Давайте рассмотрим, из каких этапов состоит формирование навыка у студента.

2.1 Передача знаний (Knowledge Transfer)

Прежде всего мы сообщаем студенту знания, необходимые для применения навыка, и показываем, как выполняется алгоритм действий для достижения результата навыка.

Для передачи знаний обычно используются такие форматы:

  • Рассказ/лекция — концептуальное объяснение теории: что значат те или иные понятия, принципы и тд. Например, что такое переменная, как концептуально выглядит работа цикла for, что такое DOM и т.д.

  • Лайвкодинг — демонстрация применения навыка с объяснением значения каждого действия. Демонстрация объявления переменных, вывод в консоль элементов массива с помощью цикла for, получение значение элемента DOM и т.д.

  • Разбор готовых примеров — разбор различных комбинаций кода, чтобы студенты лучше понимали, как адаптировать навык к различным ситуациям.

Обычно преподаватели хорошо справляются с этим этапом. Среди ошибок, которые здесь встречаются, это заполнение трансфером знаний всего времени урока или большей его части. Нужно уметь вовремя остановиться, выделять главное и переходить к следующим этапам.

2.2 Усвоение знаний (Knowledge Acquisition)

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

Чтобы спровоцировать усвоения знаний подойдут такие методы:

  • Пересказ. На первом этапе можно просто стимулировать студентов пересказать то, что они услышали от преподавателя. Например, расскажите, как работает хук useEffect в React? И далее продолжаем с вопросами, которые просто заставляют студентов вспомнить материал. Из каких составных частей он состоит? Какой функционал нужно помещать в этот хук?

  • Вопросы на понимание. Когда студенты смогли хотя бы пересказать материал, то необходимо переходить к вопросам, которые потребуют от студентов более глубокого обдумывания материала и, соответственно, понимания темы, например: Что случится с компонентом, если useEffect будет написан без массива с зависимостями? Или вопросы на интеграцию новых знаний с другими знаниями, например, как выполнение useEffect встраивается в жизненный цикл компонента?

  • Объяснение примеров кода, что выведет код — по аналогии с разбором кода от преподавателя на этапе трансляции знаний здесь уже студенты объясняют код, а также предсказывают его результат на основе своего понимания его работы.

Этим этапом усвоение знаний не ограничивается. Далее по ходу практической работы студенты будут дополнять и уточнять свои представления о том, как устроена предметная область. Однако перед тем, как нырять в эту самую практическую работу, где студенты столкнуться не только с проблемами понимания, но и правильного синтаксиса при написании кода, лучше, чтобы они просто проговорили порядок работы с новой конструкцией программирования.

Если говорить про реальную ситуацию на уроках, то здесь часто преподаватели ждут вопросов от студентов. А у них обычно нет вопросов. Это, конечно, не значит, что все понятно. Студенты просто не умеют анализировать свои знания и задавать вопросы. Поэтому этот этап требует проактивной позиции преподавателя.

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

2.3. Формирование навыка (Skill Formation)

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

Формирование навыка уместно сравнить с тем, как дети учатся ходить. В начале они много видят, как ходят взрослые (трансляция и усвоение знаний). Однако это не приводит к тому, что дети сразу встают и идут. На первых порах их нужно поддерживать, предоставлять возможность выполнить ограниченное количество шагов и тд. Постепенно мышцы ребенка укрепляются, он начинает лучше чувствовать равновесие и, как следствие, проходить все более длинную дистанцию пока не начнет свободного ходить.

Точно также и при освоении навыков программирования: студенты видят как преподаватель пишет код, объясняет его, возможно, могут даже сами его интерпретировать, но это не значит, что после они могут сразу же сами свободно программировать. Необходимо плавно подводит студентов к самостоятельному программированию и решению задач, постепенно передавая все больший контроль за решением задачи. Вот два основных метода, как это можно сделать:

  • Решение задач с помощью преподавателя. Например, вы предлагаете публично решить задачу одному из студентов группы и с помощью вопросов и подсказок направляете его на правильное решение. Далее берете другого студента и другую задачу и постепенно уменьшаете количество подсказок. Больше вовлекаете остальную группу в участие в решении.

  • Решение задач, где уже есть часть решения (задачи на завершение). Это другой способ плавного подведения студентов к полностью самостоятельному решению задач. В этом случае вы даете задачи, где уже частично написан код решения, но пропущены какие шаги (какие-то строки кода). И это могут быть разные шаги в нескольких задачах, так что студенты проработают разные элементы кода. Чтобы решить задачу студентам нужно понять уже имеющийся код и дописать недостающий. Постепенно объем готового кода уменьшается, а количество кода, который нужно написать, увеличивается.

  • Решение задачи командой студентов. В это подходе главным образом студенты помогают друг другу. Сила этого подхода в том, что студенты могут свободно, без давления авторитета преподавателя обсуждать и проговаривать ход своей работы, видеть, как по-разному восприняли одну и туже информацию от преподавателя разные студенты и, таким образом, более глубоко погружаться тему. Преподаватель здесь может играть роль тренера, который переодически вмешивается в командное решение, чтобы направить его в правильное русло или просто сделать более активным. Для преподавателя преимущества командной работы студентов перед индивидуальной еще и в том, что он может видеть со стороны, как рассуждают студенты. И далее на основе этой информации лучше объяснять и подсказывать студентам.

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

Постепенное уменьшение поддержки приводит нас к полностью самостоятельному решению задач студентами. Важная часть мастерства преподавателя состоит в выстраивании оптимального пути уменьшении этой поддержки. В каких-то темах этот путь должен быть коротким, а в каких-то включать больше промежуточных шагов (задач с поддержкой).

По ходу формирования навыка идут несколько учебных процессов:

  • Уменьшение поддержки от преподавателя;

  • Увеличение требований к осознанности решения: более аргументированное объяснение, поиск пробелов, ошибок в знаниях студентов;

  • Увеличение сложности задач (более длинный алгоритм решения, использование более редких знаний);

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

2.4 Применение и интеграция навыка (Application and Integration)

Когда студенты научились решать небольшие изолированные задачи на изучаемый навык, то необходимо постепенно расширять контекст задач. Давать более комплексные задачи, требующие применения не только изучаемых конструкций, но и других ранее пройденных конструкций/концепций программирования. В примере с useEffect можно предложить студентам написать программу, где будет использоваться пройденные ранее useState, useRef, рендеринг массива в JSX и т.д.

При этом не стоит недооценивать сложность таких заданий для студентов. Тот факт, что будут использовать только ранее изученные конструкции, часто заставляет воспринимать такие задачи как простые для студентов, а иногда и вовсе от них отказываться по причине большей приоритетности изучения новой темы. Однако интеграция и совместное использование нескольких навыков это отдельная сложная учебная задача. Студенты могут по отдельности довольно неплохо применять изученные конструкции, но при этом быть неспособными писать комплексные программы. Учитывая, что конечная цель обучения программирования, решение бизнес задач, требующих совместного использования широкого спектра навыков, интеграция является важным шагом обучения, который не стоит пропускать или оставлять на конец курса.

Что касается трудностей для преподавателей на этом этапе, то для тех, кто доходит до такой интегрированной практики, может не всегда хватать на нее время, учитывая низкую скорость программирования студентов. Распространенным заблуждением является убеждение, что для интеграции достаточно большого комплексного проекта в конце. Это не так, нужен регулярный “continuous integration”.

2.5 Оценка и рефлексия (Assessment and Reflection)

  • Оценка

Оценка происходит по ходу всего урока. Преподавателю следует постоянно соотносить ход своего повествования, предлагаемых активностей, задач с тем, насколько студенты хорошо осваивают новые знания и навыки. Тем не менее к концу урока или к концу изучения темы необходимо уделить оценке больше внимания, чтобы сформировать достаточно четкое понимание возможностей студентов:

  • Что студенты знают/понимают, в чем ориентируются из того, что прошли.

  • Что могут написать, какие задачи решить?

  • Могут ли интегрировать полученные навыки в контекст более комплексных задач?

При оценке нужно прежде всего опираться на наблюдения:

  • Вы что-то спрашивали и студенты аргументировано вам отвечали;

  • Давали студентам задачи или более комплексные проекты и студенты их сами решали.

Тут велико искушение пойти по пути: “ну я же это им рассказывал”, “ну мы же разбирали такой пример”, поэтому они должны знать, уметь и т.д. То есть оценивать студентов на основе того, что вы, как преподаватель, говорили, показывали, писали, а не что делали сами студенты. На этапе оценке речь идет не о том, что студенты должны, а что они могут по факту. Это кажется очевидным, но заблуждения здесь встречаются в 3 из 4 случаев.

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

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

  • Рефлексия

Под рефлексией здесь понимается самооценка студента или представление студента о своих знаниях, навыках, возможностях. Это отдельный мягкий навык, который у большинства студентов развит довольно плохо.

По ходу уроков желательно стимулировать студентов к рефлексии над тем, что они поняли, что они могут написать, какие задачи решить. Задавать простые вопросы, например,

  • В чем чувствуете себя уверенно, а в чем нет в новой теме?

  • Что вам кажется не совсем логичным или запутанным в новой теме?

  • Представьте, какие задачи могли бы решить с текущим пониманием темы? Подумайте, в какой момент могли бы начаться трудности.

Тут не нужны сложные вопросы. Регулярная работа с рефлексией поможет найти наиболее работающие вопросы для вашей группы студентов. Однако 90% успеха рефлексии зависит от атмосферы: насколько студенты доверяют преподавателю, насколько эмоционально безопасным выглядит демонстрирование непонимания и т.д.

2.6 Закрепление (Reinforcement)

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

Повторяющаяся, регулярная практика не значит, что нужно каждый урок прорешивать задачи на все пройденные темы. Это избыточно и не получится по времени. Наоборот, с течением времени промежутки между повторениями стоит увеличивать.

Закрепление будет происходить естественно, если при изучении новых тем преподаватель регулярно проходит со студентами этап Применения и интеграции навыка, который предполагает решение комплексных задач, включающих в себя не только новую изучаемую конструкцию, то и ранее изученные темы. И здесь уже стоит следить за собой, чтобы не давать какие-то однотипные задачи, где, например, постоянно используется работа с массивом и циклом for, но слишком редко применяется объекты и цикл while. При придумывании задачи на интеграцию стоит просто спросить себя, что из ранее изученного мы давно не использовали?

2.7 Работа с этапами формирования навыка

Процесс обучения не линейный. В процессе можно много раз возвращаться к тем или иным стадиям. Некоторые стадии идут параллельно другим (например, усвоение знаний, оценка и рефлексия). Не всегда нужно проходить все этапы. Однако иметь в голове понимание процесса формирования навыков полезно. Анализируя проведенные уроки и эти этапы можно лучше понимать проблемы студентов с формированием навыков программирования.

Комментарии (23)


  1. Imaginarium
    02.08.2024 14:35

    "заниматься авторством" -- гм... Грамотно было бы сказать "являются авторами, создают контент".


  1. amazingname
    02.08.2024 14:35

    Этапы формирования навыков программирования, которые я наблюдал раза 3 (шаги примерно такого уровня, но у всех разные):

    1. Может собрать алгоритм на скретче, но не особо инетерсуется.

    2. Посмотрел 30 минутное видео про питон. За три дня поднял графическую библиотеку и написал годную игру. Не использовал никаких готовых решений, код ужасен и запутан невероятно, все дублируется что можно, все называется непостижимо, но код работает и понятен автору.

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

    4. "Папа, хочу сделать сетевую игру" - "есть такая хрень как сокеты". На завтра уже все работает.

    5. Приходит с вопросами зачем нужны классы и функции. Пытается использовать, в основном крайне неудачно и не по назначению.

    6. Приходит к отцу с вопросом: "мои игры слишком медленные, хочу переписать их на c++". Отец - та ты только графику там подымать умрешь. За неделю подымает графику. Не пытается изучать язык, приходит с вопросом - зачем звездочка и крючки? Получает ответы, типа "у компа есть память, она с адресами, в памяти есть стек и куча, ", этого оказывается достатоыно, переписывает свои программы на работоспособный c++. Не пытается ничего читать, экспериментирет чтобы понять что происходит. Код по прежнему ужасен абсолютно, но работает.

    7. Хочет написать бота на майнкрафт. Посмотрел в ютубе, что это можно сделать на node js. Приходит с вопросами чего за хрень js, пакетные менеджеры и прочее. Пишет бота за пару дней, все работает.

    8. Собирается с друзьями поучаствовать в хакатоне по написанию игр (всем примерно по 16 лет). Спешно за ночь изучают юнити, гит, с#. Начинают говорить "запушить" и прочее. За две недели собирают игру, занимают N-е место.

    9. Начинает задаваться вопросом - как не утонуть в сложном коде. Схватывает идеи построения архитектуры. Смотрит базы, фронт. В целом почти готовый девелопер (примерно 18 лет).

    10. Большая пауза (несколько лет). Игры писать больше не интересно, деньги зарабатывать еще рано. Когда приходит время зарабатывать деньги, содится готовиться к собесам. Или случайно попадает в коллектив где сразу надо работать.

    11. Через примерно 2 года работы выходит синьорский уровень.

    Что касается этапов, описанных в статье выше, то люди которые прошли эти этапы попадают на рынок и сталкиваются в прямой конкуренции с людьми, прошедшими описанные мной этапы. И тогда задаются вопросом "а оно мне было надо"?


    1. Zenitchik
      02.08.2024 14:35

      Чтобы осваивать это всё так быстро, нужно ничем больше не интересоваться. Ни астрономией, ни биологией, ни физикой. Такие программисты потом теряются на вопросе, может ли коптер висеть в движущемся вагоне метро...


      1. amazingname
        02.08.2024 14:35

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

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

        Я сам не сильно крутой программист и могу испытывать проблемы в поиске работы. Но даже я 30 лет назад не помню момента когда научился программировать. Просто c 6 по 11 класс для развлечения (тогда мало кто думал что программирование - это профессия) читал одну страницу руководства по ассемблеру/паскалю/бейсику/c++ и так далее и сразу писал что мне нужно было. Если человеку нужно учиться программировать это значит он столкнется с кучей таких которым учиться не нужно было совсем.


        1. Zenitchik
          02.08.2024 14:35

          Этот список с списывал с моего сына, его другей, бывших коллег из прошлого.

          Урежьте осетра примерно втрое. Я тоже полагаю, что кто сам не способен изучить язык по книжке, тому в отрасли не светит. Но темпы освоения Вы написали нереалистичные для человека, имеющего, помимо программирования, другие хобби.

          Да, я видел людей, которые говорили: "У меня есть другие хобби, я занимаюсь ещё математикой". И они как программисты - несоизмеримо выше меня. Но шаг вправо-влево из отрасли - и они тупят даже в элементарщине (как пресловутый вертолёт).

          Конкурировать с нимм можно только до тех пор пока рынок раздувается и берет вообще всех.

          Рынок УЖЕ вырос настолько, что "моцартов" не хватает.

          Со всеми профессиями когда-то так было.


    1. aaoo
      02.08.2024 14:35
      +1

      между пунктами 1 и 2 у вас наверняка должно быть что-то. ну вот не поверю, что годное что-то получится после скетча (это та детская штука, где из блоков примитивные алгоритмы учат, верно?) и 30 минут ролика про питона (серьёзно?). за всем вышеописанным должно стоять ещё что-то, кмк.


      1. amazingname
        02.08.2024 14:35

        Что именно там должно быть между? Концепции переменных, массивов, выражений, присваивания, цикла и условного оператора? Это вещи до которых в современном мире можно догадаться самому даже если никогда непосредственно о них не слышал. Мое поколение в 80-х все как-то догадывались до этих вещей получив в руки игровой компьютер без интернета, курсов и доступных книг, в мире где электрический выключатель был самым сложным логическим элементом. Что стоит до этого догадаться ребенку который тыкает в планшет с 2-х лет и ставит моды на майнкрафт?


        1. aaoo
          02.08.2024 14:35
          +1

          что именно? теоретическая подготовка и практика. как раз эти концепции, плюс связь с синтаксисом языка и требуют времени и упорных стараний по изучению. как вы это сделаете - не важно. но тем не менее это весомый пласт работы.


          1. amazingname
            02.08.2024 14:35

            Нет. Это не пласт работы. Это самоочевидные вещи, как например концепция подсчета предметов, про которую никто не помнит когда он усвоил. Так это работает для любого действительно хорошего программиста. Те кто хочет быть программистом должен об этом знать, чтобы потом не было миллиона разочаровавшихся безработных, когда пузырь в очередной раз лопнет.

            Я никогда не сяду учить ноты, в надежде срубить денег играя сольные концерты Рахманинова. Но по определенным причиам в программировании это пока стало нормой.


            1. aaoo
              02.08.2024 14:35
              +1

              вы просто забыли сколько времени это понимание занимает. человеку свойственно забывать такие вещи :) вснм кажется, что они такие умные стали вот прям сразу. за последние 15 лет мне пришлось обучить десятки людей разных возрастов и уровней от пре-джун до мидл, а так же детей. и расстояние между вашими пунктами 1 и 2 довольно большое и трудозатратное у всех. ну и 30минутный ролик естественно не сделает погоды, вообще смешно


              1. amazingname
                02.08.2024 14:35

                Ключевое слово "вам пришлось обучить". Если человек нужндается чтобы его учили, это уже не тот контингент. Если уже в детали, то первыми программами моего сына на питоне были клеточный автомат, разложение в ряд фурье потрета бабушки и собвтвенный 3d движок. Он пришел ко мне с вопросами - что такое интеграл (объяснил на пальцах, этого хватило), как работает тригонометрия (в школе до нее еще не дошел) и как организовать хранение слабозаполненной матрицы. Я смотрел но не увидел момента когда он освоил совственно сам питон. Как думаете почему? Потому что это слишком просто чтобы этому учиться.

                Но вообще здесь дело не в уровне интеллекта а в его направленности. У множества людей достаточно математической креативности, чтобы изобрести программирование с нуля как это сделал Тюринг и прочие когда-то. Поэтому им не нужно обучаться. Не нужно изучать то до чего можно догадаться.


                1. aaoo
                  02.08.2024 14:35

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


                  1. amazingname
                    02.08.2024 14:35

                    Говнокод - это не то слово. Я вообще не могу понять как можно такое заставить работать. Это выглядело как гуление ребенка, которое появляется перед настоящей речью, но только в программировании. По математике, да, науськивал. Например он спросил что такое комплексные числа, я сказал "число с углом", спросил что такое интеграл, я сказал "площадь под графиком". Этого хватило. Он не один такой. Его друг спросил у меня классе в 4-м что такое корень. Я сказал "умножение само на себя, но в обратную сторону" он ухватил. Этот тоже программирует, но немного подругому - тянет решения на все случаи жизни из интернета и слепливает вместе (ему 16).


                    1. aaoo
                      02.08.2024 14:35

                      вспомнился анекдот.

                      Рабинович у сексолога (уролога? я не в курсе как там правильно).

                      Р: доктор, Мойша говорит, что может 6 раз за ночь.

                      Д: ну так и вы говорите

                      :) без обид. приукрашательство анонимом в интернетах это такое себе. спорить можно до посинения. удачи


                1. aaoo
                  02.08.2024 14:35

                  и да. опять же, допускаю, что это единичный частный случай. при чём вы высокомерно заявляете об единственно верном варианте для всех. комментаторы до этого вам указывали, что такие "специалисты" очень узкого круга мышления получаются


        1. aaoo
          02.08.2024 14:35

          да, и два года сеньор выйдет мягко говоря слабенький :)


          1. amazingname
            02.08.2024 14:35

            Помню взял в отдел брата друга. Сам друг был программистом от бога, а этот его брат был совсем не то, почти ничего не пытался делать, учился на электронщика, на программиста не смог поступить (конец 90-х, начадо 2000-х). Для начала я дал ему пробную задачу написать на c++ графический редактор чтобы пользователь мог рисовать схемы. За пару месяцев написал. Еще через пару месяцев уволился, пошел в коммерческий сектор, за пару первых месяце исправил больше багов чем вся команда вместе взятая (с его слов). Через год был уже тимлидом, через два купил квартиру за ЗП без кредита. Это история программиста и с этими ребятами периодически нужно биться за место под солнцем.


            1. aaoo
              02.08.2024 14:35

              частный случай, не находите? ну и опять же, написать можно классную приложуху. сразу. скажем через месяц. а потом? как этот говнокод новоиспечённого сеньора (серьёзно?) поддерживать? сколько говнокода от таких сеньоров "от бога" я вычистил - я не могу даже подсчитать. программист должен создавать продукт. продукт должен на долгом промежутке времени приносить пользу и поддерживаться. такому навыку за 2 года не научишься. особенно, как вы указали, с 18ти лет ни жизненного опыта нет у человека, ни производственного. так что, сказки рассказываете, либо искренне заблуждаетесь.


        1. Sollita
          02.08.2024 14:35

          Какой игровой компьютер в 80-х? У Вас что-то с памятью? :)

          Если в переменных, массивах, выражениях, присваивании и даже условном операторе нет ничего нового по сравнению с математикой. То цикл - это то, до чего самому додуматься может и можно, только выглядеть с огромной вероятностью Ваш самодельный цикл будет совсем не так, как общепринятый. А с нуля вообще "догадаться самому" ни о чём нельзя. Чтобы усвоить даже элементарные понятия программирования, необходимо иметь базовые знания математики. А тыкая в планшет и играя в Майнкрафт вообще ничему научиться нельзя. А вот мозги атрофироваться от таких занятий с двух лет вполне могут.

          Я вполне понимаю, почему у некоторых программистов возникает ощущение, что они ничему не учились и всё произошло само собой. Программирование - это такой большой конструктор, который позволяет из готовых запчастей создать готовый продукт. И некоторые именно этим и занимаются, поэтому и учиться им особо нечему. Но чтобы создать свои собственные запчасти, хочешь не хочешь, а учиться придётся. :) И судя по тому, как безграмотно Вы выражаете свои мысли, я подозреваю, что Вы из первых.


          1. amazingname
            02.08.2024 14:35

            Какой игровой компьютер в 80-х? У Вас что-то с памятью? :)

            В конце 80-х. В 88 у меня появился Радио-86рк. Потом у людей пошли Вектор на той же платформе и до того БК-0010. Они больше подходили под определение "игровой", это да. И уже потом синклеры и прорыв - первый IBM совместимый MК-88, нереальная круть, мне на тот момент недоступная.

            И судя по тому, как безграмотно Вы выражаете свои мысли, я подозреваю, что Вы из первых.

            Не, я тупой как дрова троечник и не сильно успешный программист. Но даже я осваивал программирование по такой схеме: в 5м классе пошел в библиотеку и прочитал что такое компьютер и бейсик. В 6-м попал за первый комп в дворце пионеров. Сказали написать простейшую программу, написал, больше не ходил, потому что слишком просто и скучно. В 8-м классе получил таки комп домой, сразу написал игру с бомбящим самолетиком на бейскике и после этого написал пару игр на ассемблере. Никто меня не учил, ничего я не читал. Было несколько распечатанных страниц от друзей отца и дальше эксперименты.

            Ну не было в моей жизни момента, когда я изучал упорно базовые концепции вроде циклов. И в жизни большинства программистов этого тоже не было. Просто они не пишут здесь, потому что зачем заниматься понто-резтвом, демотивировать людей и сливать карму. А у меня просто настроение депрессивное и поэтому занялся "раскритием глаз". Сейчас закончиу и забуду прохабр на пол года.


    1. WebPeople
      02.08.2024 14:35

      Не знаю, почему вас заминусили. За обычное мнение, пусть и ошибочное.

      Вы упускаете из внимания некоторые вещи:

      1. Возраст. Молодые в целом быстрее учатся.

      2. Интерес. Он есть не у всех. Причем интерес не к самому кодингу, а к результату. Сам кодинг воспринимается как досадная помеха на пути к желаемому. Зато когда сделал - это гордость перед друганами.

      3. Папа программист, у которого можно спросить непонятное. И папа способствует хобби ребенка. А ведь папы разные бывают...

      4. Школа, окружение - оно у всех разное. Друзья могут и не интересоваться программированием. В итоге ребенок не получит социальной поддержки, гордости, состязания и т.п. стимулов к продолжению кодинга.

      В общем, чтобы появился условный "Моцарт", нужна куча совпадений по жизни. Это скорее редкость, а не норма. Но даже такие ребята - они все равно проходят по тем этапам, что указаны в статье. Просто интуитивно. И вы ошибаетесь, что это происходит все так быстро и без напряга.

      К тому же сделать что-то по видосику - это не значит научится и приобрести навык. Я вот не разработчик, но тоже могу по видео или статьям сделать многое. Помню, как-то ради любопытства, я развернул за пару часов vue.js и потом за пару дней сделал сайт на нем, правда без бэкенда. Видосики, туториалы, статьи мне помогали в этом. А мне тогда было ближе к 30. Я далеко не "Моцарт".

      Вот и ваш сын и его друзья навыки приобретали в течение нескольких лет, а не за несколько дней, когда вы могли отметить "прогресс". К тому же, сейчас в хороших школах учат программированию. Т.е. навыки у ребенка не только случайные, но еще имеют системную поддержку от школьного образования. И в резульате оказывается, что за спиной "через два года сеньора" оказывается лет 8-10 практики в программировании (с детства), а не 2 года.

      Любые навыки долго формируются. Даже на относительно простые, типа вождения авто, нужны многие месяцы, чтобы достичь уверенности. Хотя казалось бы, крути руль, жми педаль, да верти головой по сторонам.

      Такова реальность. Кстати, "моцартов" в музыке сейчас умеют готовить. Сам видел одну методику. Там дети в 5-6 лет уже играют Рахманинова на пианино)) Может почти любой ребенок научиться. Без особого напряга. Правда эта методика не учит создавать шедевры))) но нотную грамоту и умение хорошо играть - даёт.


  1. S_gray
    02.08.2024 14:35

    В 90-х дело было... Жил в маленьком городке и всё время приходилось искать любую возможность для подработки, в частности, по типу "учи, дурень, компьютеру". Однажды знакомый подкинул клиента - пацан лет четырнадцати с крутым (по местным меркам) папашей, который хотел сынка в жизни чему-то научить. Выбрал, почему-то, программирование. Купил сыночку комп. Ну, пришёл он, послушал первый урок... В начале второго смотрю парню в глаза, а они у него пустые, как... мой кошелёк. Спрашиваю - ты сам-то чего хочешь? Он что там рассказал про хакеров, взломы паролей, ещё чего-то. Говорю:"То есть, ты полагал, что я тебе за пять минут покажу пару приёмов и ты пойдешь сайты крушить в Интернете.?" Ответ - "Ну да!" Нет, говорю, братец, извини, так не бывает. Не стал я его учить. Потом приятель, который мне его сосватал, рассказал, что папаша застал сыночка за просмотром порнухи в Интернете и выкинул комп в окно...


  1. Sollita
    02.08.2024 14:35

    Вы рассказали о формировании ЗУН (знаний, умений и навыков) то, что знает любой педагог. Но сделали некоторые методические ошибки. Например, все педагоги знают, что когда один студент будет решать задачу на доске с комментированием, остальные будут заниматься бог знает чем. Поэтому лучше, чтобы все студенты решали задачу одновременно в своих тетрадях и решение комментировали кусками по очереди те из студентов, кого Вы назовёте, и тогда все студенты будут вынуждены заниматься делом и Вы будете полностью контролировать процесс. :)

    Что касается формирования ЗУН именно по программированию, Вы упустили некоторые важные моменты. Вы уделяете время всему, кроме самого главного: анализа текста задачи. Необходимо научить студентов, во-первых, анализировать текст задачи, т.е. выделять, что нужно получить в результате, какие знания для этого потребуются, что мы уже знаем, чего не знаем, где это найти. И, во-вторых, научить формулировать ПИСЬМЕННО логику происходящего. Типа:

    чтобы получить такой результат, нужно сделать следующее:

    1. Создаём файл картинки с этим uri

    2. Проверяем, существует ли он

    3. Если существует, читаем его

    4. Создаём Битмап и т.п.

    Дело в том, что пока студент не научится формулировать предстоящие действия словами, он не получит никаких знаний, и, тем более, умений и навыков. Только сформулированные словами знания могут сохраниться надолго в нашей памяти. А самое главное, этот навык поможет ему в будущем, когда придётся использовать гораздо более сложную логику при написании программ.

    Ну и, конечно, для того, чтобы студенты чему-то научились, необходимы адекватные учебники и сборники задач разного уровня сложности по каждой из тем. С чем именно в программировании очень большие проблемы. Скорее всего, потому, что большинство программистов методику преподавания не изучали, но при этом пытаются писать учебники и статьи по программированию ;)