Есть в программировании темы, на которых многие ученики застревают. Эти темы кажутся трудными, сложными, мозг пухнет, можно вымотаться всего за полчаса, пытаясь понять их.
Но стоит понять, стоит произойти некоему «щелчку» в голове — и всё. И вот уже человек не может понять, в чём была сложность. А через какое-то время часто забывает, что сложность вообще была. Вот эти темы:
1. Присваивание
В математике «=» значит совсем другое, и поначалу тяжело понять, что «равно» в программировании обозначается «==», а «=» это присваивание. Плюс разные нюансы. Многим трудно понять, что «a = b» не значит что они теперь связаны навсегда. Поменял b — a не изменилась. Звучит очевидно, но поначалу многие ожидают «математического равенства».
2. Индексы
Во-первых, то, что считать нужно с нуля. Во-вторых, в принципе механизм того, как обратиться к элементу по индексу. Просто достать элемент это ещё не тяжело, что там, написать mas[3]. Но когда в ход идут циклы и индекс это уже абстрактный i — тут голова потеет у многих. Пока не «щёлкнет».
3. Условия и булева логика
Особенно операторы «и», «или». Люди долго пишут что-то вроде
if x == 1 or 2
вместо
if x == 1 or x == 2
и искренне не понимают, почему не работает. В речи же мы так говорим? Проблема в том, что человек ещё не до конца понимает, как именно работают операторы да и в принципе, как данные «текут» по коду
Те, кто имел дело с логикой, особенно математической, легко это преодолевают, но многие застревают и сильно.
4. Счётчики и флаги
Многим людям нужно время, чтобы уложить в голове концепцию «накопительных» переменных. Переменная, в которой хранится, который раз сейчас повторяется цикл, переменная, в которой хранится сумма каких-то элементов и т.д. Да, у кого-то получается быстро понять, но многим приходится погреть голову над этой темой.
Флаги это отдельный разговор — люди привыкают, что после if обязательно идёт >, <, == или что-то такое. Поэтому когда в коде обнаруживается что-то вроде
if problem_exists
это приводит к крайнему изумлению. «А что, так можно? И как это работает»
5. Параметры функции и return
Многим непонятно, зачем эти штуки нужны, ведь они уже привыкли как-то выводить вводить и выводить информацию из программы. Сама концепция изоляции подпрограммы с абстрактными входами и абстрактным выходом непонятна, так как ученик обычно ещё не сталкивался с проблемами, которые это решает.
Я обычно объясняю эти вещи именно как универсальные входы и универсальный выход — когда данные могут прийти откуда угодно и как угодно, и параметры с return позволяют не беспокоиться об этом. И показываю, почему это важно, когда кода в программе очень много.
6. Область видимости
Почему в программе есть переменная, но в этой части программы её вроде как нет? Это тоже ломает голову, так как ну никак не понятно, зачем это. Новичок ещё не пробовал писать больших программ и не путался в них из-за того, то все переменные глобальные.
7. Работа с файлами (куки/LocalStorage в JavaScript)
Не важно, какой язык программирования, но как только дело доходит до файлов, как у многих даже очень способных учеников начинается ступор. У меня он тоже был. Я до конца не понимаю, в чём он заключается, до сих пор, но давно уже знаю, как это лечить, а в идеале вообще не доводить до него. Банально дробить эту тему на подтемы и побольше практиковаться на каждой из подтем.
8. Рекурсия
Чтобы понять рекурсию, нужно сначала понять рекурсию. Мозг ломается только так, но на деле эта штука очень облегчает жизнь. Но тоже когда её поймёшь. Через практику, кипитя себе мозги, человек может дойти до того, что рекурсия — это такой способ коротко описывать сложные циклы, которые через for или while занимали бы километры строк кода, а так можно уместить это всё в 10 строчек.
9. Указатели, ссылки
Рано или поздно человек может это наконец-то понять, кому-то очень помогает объяснение, что это как ярлык на рабочем столе на какой-то файл. Но это тоже помогает не всем или не сразу.
10. ООП
Объекты и классы для меня это что-то элементарное, как и для любого профессионала. Но уложил я их в голове попытки с третьей и спустя года 4 после первой попытки понять их. Но да, сейчас легко и просто.
11. Асинхронность
Очень долго непонятно, почему код выполняется не по-порядку. И как и во многих предыдущих случаях, непонятно, зачем это вообще надо. Потому что новичок ещё не делал большие проекты и не чувствовал боль из-за проблем, которые асинхронность решает
12. Замыкания
Почему функция "помнит" переменные из внешней области видимости? После щелчка в мозге это кажется очевидным, но путь к этому щелку всё так же тяжёл.
13. Функциональщина
Функция, которая возвращает аргумент для функции, которая возвращает аргумент для метода, который возвращает аргумент для функции... У кого в вузе были всякие матаны, тому несложно понять всё это дело, ведь это же старая добрая композиция функций. Но не все погружались в математику настолько глубоко, не все в вузе такое изучали. И приходится понимать по ходу дела.
14. Любая другая тема
Кроме этих тем, новичок может индивидуально застрять на абсолютно любой теме, даже самой простой. Может даже так случиться, что человек не будет застревать ни на одной из вышеперечисленных тем, но зато застрянет на паре каких-то совсем ерундовых вещей. Или не на паре — люди разные, и пробелы в знаниях и навыках тоже у всех разные.
Почему это тяжело и как преодолевать такие темы быстрее?
Тяжелы эти темы в основном из-за двух причин:
- Новичок ещё пока не понимает, как работает код
- Новичок ещё не писал больших проектов с кучей кода и не страдал из-за проблем, которые эти штуки решают
Поэтому, можно меньше застревать на таких вещах, если как раз работать на понимание того, как работает код и какие проблемы могут быть в больших проектах.
Но есть и третий способ — сразу прокачивать мета-навыки в программировании и мышление. Речь о навыках и способах мыслить, которые одинаково нужны всем программистам. Без разницы, что там за язык прораммирование.
Кроме того, эти мета-навыки, в том числе мета-навыки мышления прокачивают и понимание кода, и понимание того, как работает большой проект. Я расскажу о них и том, как их развивать, через пару статей в своём телеграм-канале:
А в закрытом телеграм-чате я уже выложил две из трёх частей, где показываю, как эти навыки нарабатывать, в мини-курсе на тему «Что делать, когда регулярно понимаешь тему, а использовать не можешь?». Вот ссылка на статью и там ссылки на закрытый телеграм-чат: