На рынке сейчас — десятки, если не сотни тренингов по программированию: специализированных, общих, для начинающих и продвинутых… Рынок ими будто переполнен. Но есть загвоздка — большинство из них будут для вас… бесполезны, или принесут минимум пользы.
Почему? Дело в том, что большинство курсов создаются не с целью решить вашу проблему, а по другим причинам. И речь даже не о деньгах.
99% курсов в Интернете создают у вас ощущение прогрессии, того, что вы стали специалистом
Вот вам дали простые задания — вы с ними справились. Уровень сложности повысился — и вы тоже их одолели, а потом смогли решать даже самые сложные задания. Но обычно мало кого волнует, насколько эти задания совместимы с реальной жизнью и работой.
На самом деле главные проблемы — ещё глубже, в самой структуре большинства обучающих материалов.
Как обычно преподают программирование (и не только)
В 90 процентов курсов (и не только по программированию) осуществляется следующий порядок обучения: теоретический блок — практика — теоретический блок — практика и т. д., пока не дойдет до финального экзамена. По сути, так устроена вся мировая система образования.
Это отлаженная и проверенная система, но в современных условиях она вызывает несколько проблем. Во-первых, возникают проблемы с теорией. Для создателя курса это — самая трудоемкая часть, куда вкладывается большая часть усилий и времени. При этом для пользователя она… самая ненужная! Ведь почти всю теорию по программированию можно легко найти в Сети. Более того — даже предположим в каком-то курсе теория подана классно и легко, она может быстро устареть.
Во-вторых, и с практикой не все так просто. Ведь она обычно привязана к той теории, которую «блоками» выдают в курсе. То есть человек может пройти курс, успешно в одиночку решить все практические задания, сделанные «под условия»… а потом прийти на работу и не справится с написанием даже простой программы! Нельзя учить программистов на материалах, написанных при Java 6, а потом попросить их написать что-то на Java 16.
Особенно отчетливо все эти проблемы проявляются на интервью. Кроме пробелов в практических навыках, в отличии от большинства зарубежных соискателей, выходец из постсоветского пространства часто ведет себя там как на тесте — пытается сам все решить стоя молча у доски, в то время как интервьюер проверяет как раз умение кандидата решать проблемы в команде.
А самое плохое: трудно с ходу придумать замену этой схеме. После шести лет преподавания курсов по программированию мы поняли, что хотим что-то изменить в сложившейся картине. Именно тогда мы и задали себе вопрос:
Как обучать эффективнее в новых условиях?
С этим вопросом мы удалились на подумать и в течении долгого времени не вышло ни одного нового курса от нашей команды. Но результат того стоил — мы внедрили в обучающий процесс новую методику, основанную на UODP (User Oriented Development Process), которая ориентируется на потребности студентов.
Чтобы создать максимально полезный, решающий проблемы учеников курс, мы подходим с совершенно другой стороны:
Программа максимально сосредоточилась на практике, минимум теоретических основ;
Чтобы практика была наглядной каждый блок курса создан на основе реальных задач, с которыми постоянно сталкиваются программисты.
И самое главное. Все ученики могут делится своими решениями проблемы и обсуждать их.
Давайте по последнему пункту. В обычной ситуации у всей группы — один учебник/преподаватель/справка. Из этого источника знания все извлекут одинаковую информацию — кто больше, кто меньше. Но теперь ученикам нужно искать теорию самим, где они сочтут нужным.
Даже при одинаковых запросах в Google два человека получат разный результат, кликнут на разные ссылки. После этого они по-своему решат задачу и поделятся этим решением со всей группой! Т. е. ученик вместо одного «правильного» решения проблемы получит множество по-своему интересных, до которых сам бы возможно не дошел. А потом сможет в своей практической работе применить то, которое максимально подойдет. Знания взаимодополняют друг друга.
Насколько этот подход оказался эффективным?
Говоря честно, этот подход конечно оказался сложнее прежней схемы — но показывает невероятную эффективность. В обычном курсе 10% учеников не заканчивают курс, 75 — справляются, но не получают желаемого результата, и только 15% достигают того, что хотели: получают новую, интересную им профессию.
В рамках эксперимента мы организовали серию, по началу совсем бесплатных групп организованных по этой новой методике. В новой схеме обучения расклад интереснее: около половины участников курса не проходят его с первого раза. Но при этом более 40 (!)% говорят «да, мы получили то, что хотели от этого курса». Со второго раза курс проходят больше 60% участников — цифра уже выше.
Да, даже повторное прохождение на нашем курсе далеко от «нормальных» показателей — 30% учеников не могут справится и во второй раз. Но наша цель — не красивые цифры тысяч человек, окончивших курс. Важнее, чтобы люди получили те навыки и знания, за которыми они приходят.
Конечно данных пока мало, так как обучение прошло пока только с десяток групп, но то что есть уже указывает на то, что подобная методика оказалась намного более эффективной в сравнении с классическим подходом.
Если вам интересно узнать подробнее о нашем процессе обучения заходите к нам в Discord — там живое общение студентов и печеньки.
eandr_67
Программирование — это не умение писать код, а умение из десятков разных алгоритмов решения задачи выбрать оптимальный для данных конкретных условий. И теория нужна для того, чтобы:
Исключая теорию, вы получаете очередных кодеров, бездумно копипастящих куски кода и не умеющих оценивать эффективность принимаемых решений.
И работа в команде тут не поможет: совместное обсуждение задачи группой неучей не приведёт к нахождению оптимального решения — даже если это оптимальное решение и возникало в процессе обсуждения.
glebuar Автор
Вы совершенно правы с точки зрения важности теории. Однако самый эффективный способ изучения, который всегда был и есть — под чутким руководством старшего наставника. Как вы правильно сказали, задача такого наставника — определить материал, который нужно учить и описать проблемы, которые он/она ожидает, что вы решите. Наставник не учит вас лекциям и не читает вам теорию, он объясняет непонятное, но только тогда, когда вы сами уже прокапали в указанном им направлении.
Именно такую систему обучения мы и строим. Пример: если вы только начали изучать материал, то первая проблема может быть установить JDK. Сегодня нетрудно в сети найти, что такое Java, что такое JDK/JRE, как это установить, чтобы решить эту первую проблему. Помимо этого, в каждой группе мы специально набираем как людей без опыта, так и более опытных людей, которые приходят к нам чтобы прокачать свои soft skills и попробовать себя в роли наставников. После полугода работы мы уже довольно неплохо представляем набор и сложность проблем, которые нужно давать студентам, чтобы они были решаемы, но при этом еще и сложны ровно настолько, чтобы студенты изучили необходимый материал.
Интересный факт: в группах более сложного курса, чем начальный, были попытки написать всеобъемлющую теорию для своих коллег, которая была бы достаточна для решения задачи ReadLine. По мере решения проблемы новыми группами эта теория разрасталась, так как каждый раз находились мелочи, непонятные тому или иному слушателю. В результате теория выросла до таких масштабов, что студентам опять было проще начать просто делать и, по мере того как они сталкивались с проблемами выполнения задачи, решать именно их, чем перечитывать всю всеобъемлющую теорию по теме. Это еще раз показало верность того, что выдавая людям проблемы они смогут тут же понять, что именно из теории нужно учить (с учетом того, что проблема для них подобрана с учетом их текущего уровня).
Студенты изучают теорию из разных источников — это приводит к тому, что решения задач получаются у всех разные. Защита проектов является частью обучающего процесса и построена на проверке задач друг у друга. Таким образом студенты понимают разницу разных решений. Не просто копируют то, что было показано на лекции, а именно видят разницу, сравнивая со своим решением. Это намного быстрее приводит к осознанию того, что для задачи не существует одного верного решения, а их масса, они разные и каждое по-своему верное.
eandr_67
Невозможно адекватно «объяснить непонятное», если ученик не владеет знаниями, необходимыми для понимания объяснения. И прежде, чем ментор сможет объяснить, почему в данных конкретных условиях оптимальным будет именно этот конкретный алгоритм, ученик должен изучить, что такое O-большое и как именно оно связано с реальным быстродействием разных реализаций данного алгоритма, применённых к разным наборам входных данных. Ту самую теорию, необходимость которой вы отрицаете.
Да, есть и другой путь: вульгаризировать объяснение до уровня неуча. Но это не обучение, а его имитация, дающая лишь иллюзию понимания без реальных знаний.
Всё, о чём вы говорите — не теория. Теория — курс дискретной математики (от начал булевой алгебры и матлогики до «Конкретной математики» Кнута). Теория — сравнительный анализ алгоритмов сортировки у Вирта («Алгоритмы и структуры данных») или Кормена («Алгоритмы. Вводный курс»). Теория — основы алгоритмики, никак не зависящие от используемых языков программирования…
Установка Java SDK — системное администрирование, не имеющее отношения к программированию. А ReadLine — частная практическая задача, прибитая гвоздями к конкретному языку программирования. И строить «всеобъемлющую теорию» на одной частной задаче в одном частном языке программирования — это, мягко говоря, абсурд.
Теория — прежде всего, систематический набор знаний. А то, что ученик находит в интернете — не теория, а конкретные решения конкретных задач. В лучшем случае, с какими-то обломками теории.
И если ученик не понимает, что такое «вычислительная сложность» (теория), то никакое сравнение разных решений не поможет ему научиться выбирать из множества решений лучшее.