Как мыслить когда учишь язык программирования

Недавно я постарался создать курс обучения “для самых маленьких”, т.е. я знаю
русский (сомнительно, судя из опечаток), знаю JS (хотя постоянно нахожу новое),
а вот люди, которые мечтают стать программистами и ездить на лимузине чем-то
отличаются от меня.

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

Сразу скажу ответ: чтобы прийти к успеху нужно не нервничать, не бояться, не откладывать на потом,
нужно стараться, нужно разбираться. И самое главное - пробовать использовать (новый) язык (инструмент).

Кто-то сказал:

Выучить что-то новое – это, когда ты привык это использовать.

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

Так вот, когда шла речь о сложении, происходило 2 вещи одновременно, первая –
мы пытались понять что-же такое сложение (ну, я надеюсь, что люди хотят понять
что-то новое), второе – мы пытались научиться выражать свои мысли: “Один плюс один
равно два”.

Первична мысль, вторичен язык.

Конечно, когда мы стали взрослее, и нам рассказывали что-то про интегралы или про
химию, то был и обратный процесс, язык, который мы не знали (H2O - ну, и кто скажет, что это
нормальный “русский язык”, это язык химиков), превращать в мысль. Так мы учились.

Я не смогу охватить всех аспектов обучения, я сфокусируюсь на двух:

  • появление мысли
  • трансформация в язык

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

К сожалению, я не люблю учить людей медленно, я вообще не понимаю, зачем учить людей!
Люди сами могут учиться! И поэтому, я сторонник хардкора :)
Нужно дать человеку задачу, и пусть делает.

Мои методы не всем по-душе. Но я считаю, что единственный способ научиться английскому -
это использовать его! Говорить, писать, читать, слушать. Нельзя только учить
грамматику, да и в эру интернет, если что-то не ясно, всегда можно найти статью,
в которой очень доступно объясняется что такое, например, артикли.
Но это уже последующий шаг. Сначала была задача: сказать на английском “это ручка”.

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

В программировании очень легко. Это то, что придумали умные люди для остальных людей,
чтобы остальные писали им бложеки, программировали домофоны и делали всякую
грязную работу. В программировании твой учитель это компилятор/интерпретатор.
Тут всегда можно просто взять и запустить, просто запустить то, что написал.
Это же замечательно, реальному человеку неправильно переведешь “ты не можешь” и
он подумает, что вы ругаетесь. Он больше с вами и говорить не станет.
С компьютером всё можно - и он тоже ругается, ну каждый язык по-своему,
некоторые понятно, некоторые нет. Но тут можно,
даже нужно брать и пробовать.

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

Когда приходит задача “посчитать сумму двух чисел”, кодер скажет: “Пфф, var a = b + c”, и
может быть, другой кодер даже поймёт это. Но ведь в реальности это не решение задачи! Это так,
разговор двух грузчиков: “И шо, и это тудой,” а в ответ “Хватит качать, тут же 3 метра!”,
и это им понятно, что они говорили об очередном мешке с картошкой, и о том, что его тяжело нести,
а второй ему говорил, что не тяжело, и что тут не нужна рокла, и что до грузовика совсем чуть-чуть,
уже бы мол давно донёс и выполнили бы задачу.

Сначала нужно понять. Первый вопрос мог бы быть в духе “А откуда взять эти числа”,
или “А что потом, когда я их посчитаю”. Опытнй тестировщик добавил бы что-то в духе:
“А какая точность нужна, а цифры это деньги? А нужно ли их отображать в
валюте пользователя?” и так далее. Кстати, в этом и отличие кодера от тестера:
кодер (по крайней мере хороший) думает как сделать задачу проще, и лишь некоторые
моменты продумывает наперёд; а тестер не должен думать как вообще сделать задачу
(ну, по крайней мере, в основном), но тестер должен думать о всех вариантах,
которые упростил программист. В этом отличие - способ осмысления, но оба они
обдумывают, формируют модель, формализируют её, проверяют модель на самопротиворечивость,
и иногда даже записывают (кто в тест кейсы, кто в блок схемы, кто в блокнот, кто
в таск трекер). Будьте бдительны, когда идёте к своей мечте, тестировщику
сложно научиться мыслить как кодер, то-же и наоборот.

Мы часто не замечаем как что-то делаем на автомате, компьютер, это что-то между ребёнком и калькулятором:
считать умеет, точно, быстро, а вот что такое деньги не знает.
Ему нужно всё объяснить. А для этого нужно всё самому понять. Не упускать мелочей, не вносить неясности. Всё
должно быть строго!

Как ни печально, но мыль свойственную языку проще выразить именно на этом языке.
Это значит, что если вы не думаете о том, определён ли предмет из контекста или
нет, то вам сложно перевести это на английский (“this is pen”, “this is the pen”,
“it is a pen” …), и наоборот, как только вы начали думать соответственно языку,
пусть вы думаете как компьютер, то вам проще всего записать эту мысль на языке
компьютеров.

Это печально потому, что это значит, что вы не научитесь говорить, пока не научитесь
думать в парадигмах этого языка, но вам сложно понять, как нужно думать, чтобы
мысль была свойственна языку…
И тут, барабанная дробь, на сцену объявили выход панацеи… чтобы выучить язык –
используйте его!
и для программирования, это очень просто.

Хочу сказать ещё пару рекомендаций, для самообучения, надеюсь, вы уже нашли тот
ресурс, где вы будете читать про выбранный вами язык, и ресурс, где вы будете
находить задачи. Не придумывайте себе лишнего, например, “я буду учить сложение
после того, как прочитаю книгу про Лейбница” или “я буду учить циклы, когда
пойму, что такое строки и массивы”.
Когда решаете задачу, не думайте, что вы её не можете решить, никогда так не
думайте! Только вы решаете для себя: можете вы решать задачи или нет. Я очень
сомневаюсь, что вы будете брать задачи, которые вам не по силам.
Когда вы видите очень простую задачу, то просто сделайте её, повторите пройденное,
это будет просто и легко, а если не очень просто и не очень легко, то вам просто
необходимо её решить!

И да, как программист (ну, хоть в каком-то смысле), я ответственно заявляю:
“Всё тлен” – регулярно что-то не понимаю, постоянно что-то гуглю,
часто смотрю чужой код, иногда обращаюсь к исходной документации. И так уже давно.
Вас ждёт то-же самое :)
p.s. и куча матов, криков, боли вас тоже ждёт. только через боль мы очищаем
нашу душу :)