Занимательное чтиво) Неэффективный программист или как взломать свой мозг за 2 дня
Disclaimer: Автор понимает, что ничего нового не открыл, но подача материала может оказаться достаточно полезной, особенно для тех, кто регулярно пытается сконцентрироваться и расти над собой.
Интернет сделал нас ленивыми!
Почему? Кто в последний раз посмотрел видео больше 3х минут? Кто прочитал пост больше 2 страниц? Какой заголовок более привлекателен, «63 способа бла-бла-бла» или «3 проверенных метода бла-бла-бла»? А если эти три проверенных метода выделены от основного текста, то это вообще гуд (можно не читать текст вовсе, а просто пробежаться по выделенным подзаголовкам).
В этом свои плюсы. Наш мозг эволюционировал, и обрабатывает информацию быстрее, чем, скажем, 15-20 лет назад (да и эволюционирует быстрее, чем это было возможно век назад). Как компании справляются с высокими нагрузками? Как процессор выполняет программу по возможности быстро? С помощью кэширования! (как вариант, но самый приоритетный). Что делает наш мозг, чтобы справиться с большой нагрузкой? Кэширует! Что именно и как — оставим на размышление ИИшникам (специалистам по искусственному интеллекту). В противном случае при увеличении размера обрабатываемой информации время «отклика» бы увеличилось в разы, и на ответ на «как добраться до ближайшей больницы?» уйдет больше времени, чем человек «в силе ждать». «Сила ждать» тоже уменьшилась, «размер» нашего терпения уменьшился, и мы быстро устаем, если продолжительность видео большая, размер статьи большой (на самом деле продолжительность может не влиять на терпение, больше всего влияет полезная информация, если «воды» меньше или вовсе нет, то и терпеть ничего не приходится, посему данный пост написан «эз лаконик эз посибл»).
«Раньше» получая на вход картинку с рекламного щита, мозг анализировал текст, классифицировал ее (что такое «обычный порошок»? как часто «носитель» использует порошок, какова польза от новой информации, ...), запоминал на достаточно долгое время (вдруг в скором времени информация понадобится).
«Сейчас» получая на вход ту же картинку мозг возвращает «реклама:False», отбрасывая всю информацию. Точка.
(«Раньше» подразумевается тогда, когда рекламные щиты только-только появлялись, а «Сейчас» — когда их о*уенно, *лядь, много).
Когда мы впервые зарегистрируемся в некой соц.сети, мы активно ставим лайки и комментируем все (почти все) посты. Когда вы в последний раз ставили лайк, или комментировали пост/статус? (не буду раскрывать мысль, думаю и так понятно, это стало обыденным явлением, и уже не эффективно тратить время на высказывание собственных мнений под каждым постом).
Мозг — машина эффективная, в отличие от человека. Звучит странно, вроде человек и мозг — одно целое. Позвольте прояснить этот неловкий момент.
Представим мозг как программу, допустим, в куче разных функций есть две функции (абстрактно) обработки и получения ответа на что-то, возврашающих в принципе одинаковый результат, но функция A() анализирует аргументы и изменяет состояние объекта (самообучается, сохраняет/накапливает опыт), а функция B() быстро возвращает результат — из магического кэша (при этом почти ничего не изменяя). При каждом вызове функция B() старается уменьшить время своего следующего вызова.
Задача мозга выполнять свой код максимально эффективно. Ваша задача — приобрести как можно больше опыта.
Дело в том, что вам нужно вызвать функцию А(), но мозг вызывает функцию B().
Чтобы проверить это, достаточно вспомнить, что при непонятной ошибке в коде, или при использовании новой библиотеки, первым делом мы (вариант 1) открываем google, stackoverflow и т.д., быстро находим то, что нам нужно и (в основном) тупо копипастим. Не стараемся (вариант 2) проникаться в смысл, понять сущность ошибки, не пытаемся методично изучать библиотеку, ее архитектуру, API, хорошие практики и т.д. Как вы могли заметить, вариант 1 — это вызов функции B(), а вариант 2 — вызов А(). Когда вы в последний раз вызывали функцию А()? Запомните так, вызывается или A() или B(), поэтому, когда вы не находите необходимый ответ «эффективным путем» (с помощью google и т.п.), то не сразу переходите к вызову А() (прощу прощения, если на самом деле вы сразу переходите к вызову А(), просто я вынужден писать по сценарию). До вызова А() вы можете выйти покурить/погулять и т.д. Обсуждать с коллегами «этот чертов баг», попытаться обяснить менеджеру, почему так сложно фиксить этот баг, ведь «даже google не знает как»! Все это не прокрастинация или лень, или откладывание дел, а простой эгоизм мозга — «если эффективным путем это не сработало, то не сработает никаким другим!».
Здесь, как ни странно, эффективность мозга оборачивается для нас проблемой. Достаточно «отключить» интернет на несколько дней и разработка проекта затормозит в разы. Почему мы не заботимся о собственных знаниях и опыте? Не эффективно! При варианте с учебой уходит много времени, а результат нужен, как известно, вчера. С точки зрения компании, где мы работаем, проекта, над которым работаем, да и коллег, с которыми мы работаем — время потраченное на доскональное изучение «предметной области» (подразумевается все, что связано с проектом, библиотеки, сама предметная область, например, бухгалтерский учет, алгоритмы, используемые в проекте, паттерны и т.д.) не является эффективной тратой времени. Да и с вашей точки зрения, время ограничено, а доскональное изучение всего — неосуществимаянедостижимая «мечта». Если мыслить глобально, это сейчас у нас нет времени, и «сейчас» через десять лет тоже не будет времени. Это тема для другой статьи, но если мы хотим быть/стать крутыми специалистами, то должны «сейчас» тратить несколько лет на доскональное изучение всего, что попадется, а через 5-10 лет, когда опять не будет времени, мы будем работать эффективно в большей части без google, stackoverflow и т. д.
Дело в том, что функция B() не всегда возвращает свой результат используя прежний опыт и Базу Данных Мозга (далее, просто — БДМ), а (в основном) показывает как получить результат, возвращает где этот результат можно найти.
Что нужно помнить? — Времени всегда нет!
Взлом — заставить свой мозг вызывать (по возможности много, для 100-процентного эффекта — всегда) функцию А().
Как? — Начинать нужно с малого, в первые дни в 8-часовой рабочий день нужно посвятить функции А() хотя бы час,через неделю потом два, потом три и мозг сам воспримет «привычку» вызывать А(), то есть привычку думать и работать с умом.
Примечание — функцию А() нужно вызывать не всегда, нужно иногда «баловать» свой мозг, используя всю накопленную информацию и опыт для молниеносного получения результата (а чем больше вызывается функция А(), тем быстрее работает функция B(), ваша цель — достичь мгновенного исполнения функции B()).
/* Не забудьте — мозг будет сопротивляться. */
Инициализация темпоральной памяти… силой
Рассмотрим ту же функцию обработки и возвращения результата (выше, A или B). Оказывается, функция может работать«одновременно по-разному». И анализирующий, и эффективный варианты функции выполняют некий пре-анализ, сохраняя динамически растущие аргументы в некий «темпоральный буфер». Когда мы решаем некую задачу, во время «анализа» задачи на вход подаются переменные задачи.
"Дан массив из целочисленных элементов..."
функция помещает в темпоральный буфер информацию «массив из целых»,
"..каждый элемент массива может принимать значение из промежутка 0..5947.."
мозг помещает в буфер информацию "массив::элемент->значение = промежуток(0, 5947)",
"..если первый элемент принимает значение 0, то все остальные приращивают свои значения на значения своих индексов, а если первый элемент принимает значение от 3 до 77, то все элементы с четнымы индексами обнуляют свой значения.."
мозг помещает в темпоральную память информацию....«если 0...»...«3 и 77»… что-то я запутался.
Давайте с начала, есть массив из целых. Ок, это ясно. Каждый элемент принимает значение из промежутка 0..5941... нет, простите,5947. Так, дальше, если первый элемент равен нулю, то все остальные инкрементируются на значение своего индекса, то есть… если это элемент "х" с индексом 13, то изменяем его "x=x+13", в общем случаеarri += i, где i > 0Но, если первый элемент >= 3 и <= 77, то все элементы arri, где i — четное число, обнуляются(arri = 0)
Можно идти дальше…
Не важно какая функция вызвана, А() (что хорошо для нас, поскольку мы учимся и набираемся опыта), или B() (что хорошо для мозга, поскольку операция выполняется чуть ли не за О(1)), мозг всегда попытается очистить темпоральный буфер. Когда мы концентрируемся на задаче пытаясь понять суть, функции А() или B() посылается сигнал «подготовить темпоральный буфер». Всю входную информацию, что мы получаем при чтении задачи, анализируется и сохраняется в темпоральный буфер для дальнейшего его использования. Это помогает нам строить догадки и находить решение, опираясь на уже анализированную информацию из темпорального буфера. В конце функции, темпоральный буфер передается другой функции "сохранить_с_умом()", которая делает выборку полезной информации и новых паттернов (выявленных при анализе/решении задачи) и сохраняет в БДМ и мы опятьстановимся чуточку умнее и с немного большим опытом, чем прежде.
Что нужно помнить? — Мозг старается как можно чаще очистить темпоральную память (чтобы использовать память на О(1)), а вам нужно непрерывно посылать сигнал, чтобы темпоральная память всегда была «начеку».
Взлом — всегда концентрируйтесь на полную катушку, непрерывно посылайте мозгу сигнал для подготовки темпорального буфера. Представьте как она заполняется новыми переменными.
Примечание (или «да, но как?») — есть много методов (отбросить все лишнее, отключить телефон, предупредить коллег, чтобы не беспокоили, ...), о которых можно знать читая стандартные статьи из GTD, но они быстро становятся неактуальными и придется начать с начала. Вам нужно реально научиться концентрироваться на боевых условиях, не обращать внимания ни на что, кроме задачи. Помните профессора Нэша из Игр Разума, когда его пригласили в Пентагон? Увидев задачу он позабыл обо всем.
/* Не забудьте, концентрация — непрерывный процесс, а мозг всегда сопротивляется. */
Шерлок Холмс и его дедукция
Почему достопочтенный Шерлок был таким великолепным детективом? Он натренировал себя на отлично. Как это?
Помните в рассказе Холмс спрашивал Ватсона «Сколько ступенек вы сосчитали, когда поднимались ко мне?», когда тот задал вопрос типа «как стать таким великолепным детективом как Холмс»? Ватсон, естественно (по сценарию), не сосчитал ничего, но маленький урок был классным. Детектив должен быть очень и очень внимательным.
Можем ли мы стать такими внимательными? Конечно, достаточно всегда помнить об этом. Попробуйте, считать все ступеньки по которым вы подниметесь :) На самом деле этого не достаточно, нужно быть внимательными ко всем деталям. Если вы заставите себя это делать достаточно долгое время, ваш мозг будет обрабатывать окружающий мир со всеми деталями и с максимально возможной скоростью. В итоге для вас это будет «естественным», а для окружающих вас «обычных» людей вы будете выглядеть очень умным «детективом» :).
Все это вы наверное давно знали, попробуем понять логику. И так, мозг работает эффективно, слишком эффективно. Внимание к деталям? Никогда. Вы выбираетесь из дома, чтобы идти на работу. Задача для мозга — "носитель должен добраться до работы". Мозг обрабатывает минимум (максимально возможный минимум) информации для того, чтобы выполнить задачу (то есть, чтобы вы добрались до работы). Входит ли в обработку подсчет того, по скольким ступенькам вы спустились или поднялись? Нет. Входит ли в обработку номера всех машин, которые вы встретили по дороге на работу? Нет. Еще раз, мозг работает эффективно. Все лишние детали являются лишними. Опять точка. Поэтому, если мы хотим «натренировать» себя на детектива, мы вынуждены постоянно быть начеку, не позволяя мозгу работать эффективно (звучит странно).
О дедукции можно лишь сказать, что это детали, расположенные в нужном порядке, то есть каждый из нас способен на дедуктивное мышление, нужно лишь позаботится о сборе необходимых данных. Сопоставление всех фактов — задача мозга, вообще, все — задача мозга, но мозг ленив, больше чем мы с вами, поэтому его надо всегда «наталкивать на внимательность». Для программиста внимательность к деталям может ограничиться проектом с соответствующим кодом, документацией, коллег, работающих над его модулями,…
"Детективная внимательность" позволяет почти мгновенно понять нововыявленный баг, «следить» за каждым изменением кода (в пределах нормы, и не забывая об абстракциях), максимально точно спланировать задачи. Вы будете тестировать проект лучше самих тестировщиков. Результат? Доскональное знание проекта, удачный проект с минимумом багов.
Что нужно помнить? — Мозг не любит лишние детали, а для него все детали потенциально лишние.
Взлом — как бы это трудно и скучно не было, вы должны проявить максимальный интерес/внимательность ко всем деталям, окружающих вас (как программиста). Со временем энергия, потраченная на внимательность окупится достаточно скоро и, так сказать, сторицей.
Примечание — начать стоит опять с малого. Не нужно сразу броситься к запоминанию деталей (это заблокирует мозг, что тоже интересная тема для размышлении). Нужно спустится по уровням проекта шаг за шагом, каждый раз увеличивая число деталей.
/* Не забудьте — мозг сопротивляется. Всегда. Достаточно дать слабину и проявить невнимательность к некой детали и мозг будет крушить всю систему. «Детективность программиста» — тоже непрерывный процесс. */
В следующем эпизоде..
Напоследок — найдется много людей, которые могут в разы лучше и правильнее объяснять все, что я здесь сказал, но думаю, пост, в худшем случае заслуживает игнора, чем минуса.
#interesting@itcookies