Прочти этот код:
let a = 10;
let b = a;
a = 0;
Какие примут значения a и b после запуска кода? Прежде чем переходить дальше представь это в голове.
Если ты уже пишешь на JavaScript'e какое-то время, то ты явно возразишь: "Этот кусок кода намного проще чем то, что я пишу каждый день. В чем смысл?"
Целью этого упражнения не является знакомство с переменными. Предполагается, что ты уже знаком с ними. Вместо этого, цель - обратить твое внимание на твою ментальную модель и поразмышлять об этом.
Что такое Ментальная Модель?
Прочти код снова с намерением удостовериться в результате. (Немного позже ты поймешь, почему намерение важно.)
Читая код во второй раз, обрати пристальное внимание на то, что происходит в твоей голове, шаг за шагом. Рассмотрим твой монолог:
Возможно твой монолог немного отличается.Возможно ты говоришь "присвоить" вместо "задать", или же ты читаешь немного в другом порядке. Возможно ты пришел к другому результату. Главное, обрати внимание в чем отличие твоего результата. Заметь, что даже этот монолог не отражает того, что на самом деле происходит в твоей голове. Ты мог сказать: "задать b a", но что это вообще значит задать переменной. (eng ver: You might say “set b to a”, but what does it even mean to set a variable?)
Ты мог обнаружить, что для каждого известного фундаментального принципа в программировании, например переменные и операции на них такие, как присваивание значений, существует набор укоренившихся аналогий, которые ты с этими принципами ассоциируешь. Некоторые аналогии приходят из реального мира. Другие могут быть позаимствованы из других областей наук, например числа из математики. Такие аналогии могут пересекаться и даже противоречить друг другу, но они все также помогают понять то, что происходит в коде.
Например, множество людей изучали переменные, что они как "коробки", в которые можно положить вещи. Даже если ты больше ярко не представляешь коробки, когда смотришь на переменные, они могут вести себя квадратно в твоем воображении. Эти аппроксимации, как что-то обрабатывается в твоей голове, и называются "ментальные модели". Это может быть сложно, если ты программировал довольно долго, но попробуй проанализировать свои ментальные модели. Они, скорее всего, представляют собой комбинации визуальных, пространственных и механических умственных сокращений.
Такие интуитивные понятия, как "квадратность" переменных, влияют на то, как мы читаем код. Иногда, наши ментальные модели подводят. Возможно, пособие, которое мы прочитали, утратило истинность в угоду простоте объяснений. Возможно, ты получил интуитивное понятие о какой-то возможности языка программирования совершенно неверное из-за того, что почерпнул похожее понятие в другом языке. Возможно, ты определил для себя ментальную модель из некоторого фрагмента кода и никогда не проверял, была ли она точной.
Определение и исправление таких проблем - вот что такое Just JavaScript. Ты постепенно построишь (или, возможно, переделаешь) свою ментальную модель о JavaScript, чтобы она была точной и полезной. Верная ментальная модель поможет найти и исправить баги (ошибки) быстрее, лучше понимать чужой код, и быть уверенным в написанном коде.
(Кстати, a - 0 и b - 10 правильный ответ.)
Программирование, Быстро и Медленно.
"Думай медленно… Решай быстро" от автора Даниэль Канеман - широко известная нехудожественная книга. С главным посылом того, что люди используют две различные "системы", когда думают.
Всякий раз, когда мы можем, мы полагаемся на "быструю" систему. Мы разделяем эту систему со многими животными, и это дает нам удивительные силы, например передвигаться без падений. "Быстрая" система хороша в сопоставлении паттернов (необходимых для выживания) и для "моментальной реакции". Но такая система не годится для планирования.
Однозначно, благодаря развитию лобной доли, люди также обладают "медленной" системой мышления. Эта "медленная" система отвечает за сложные пошаговые рассуждения. Это позволяет планировать будущие события, участвовать в спорах или следовать математическим доказательствам.
По причине того, что использование "медленной" системы ментально истощает, мы склонны по умолчание к "быстрой" - даже когда занят интеллектуальными задачами такими как программирование.
Представь, что ты загружен сложной задачей и тебе необходимо быстро понять, что делает эта функция. Взгляни на нее по-быстрому:
function duplicateSpreadsheet(original) { if (original.hasPendingChanges) { throw new Error('You need to save the file before you can duplicate it.'); } let copy = { created: Date.now(), author: original.author, cells: original.cells, metadata: original.metadata, }; copy.metadata.title = 'Copy of ' + original.metadata.title; return copy; }
Ты наверняка заметил:
Что ты мог не заметить (гг вп если заметил) то, что функция также по ошибке меняет заголовок исходной таблицы.
Допущение подобных ошибок происходит с каждым программистом, каждый день. Как только ты узнал о существовании ошибки, прочитаешь ли ты код иначе? Если ты прочитал код в "быстром" режиме то, скорее всего тебе пришлось переключиться на "медленный", чтобы найти эту ошибку.
В "быстром" режиме ты догадываешься, что делает код, основываясь на названии, комментариях и общей структуре. В "медленном" режиме ты просматриваешь "что делает код" шаг за шагом.
Поэтому наличие верной ментальной модели так важно. Имитация компьютера в наших головах достаточно сложна - и эти усилия напрасны из-за неправильных ментальных моделей.
Не переживай, если не получилось найти баг. Это значит, что ты получишь максимум от этого курса! В следующих модулях мы вместе перестроим нашу ментальную модель так, что подобные ошибки будут видны как ясный день.
В следующем модуле мы построим ментальные модели для одних из самых фундаментальных принципов JavaScript - значения и переменные.
----
Адаптация и перевод статьи первого модуля Just JavaScript от Den Abramov. Подписаться на почтовую рассылку на английском языке можно на сайте Just JavaScript.