Учимся программированию как Эйнштейн

Эйнштейн был гением и одним из величайших ученых, когда-либо живших на земле. В 1905 году он опубликовал четыре научные работы, заложившие основы современной физики и изменившие взгляды на пространство, время, массу и энергию. Сделав себе имя этими работами, Эйнштейн в 1921 году получил Нобелевскую премию за свое объяснение феномена фотоэффекта.

Мы все можем извлечь уроки из жизни Эйнштейна, особенно из его методов работы и обучения. Даже если мы не все можем быть гениями уровня самого Эйнштейна, все же есть некоторые модели поведения, которым можно подражать во многих областях исследований, особенно в разработке программного обеспечения. Успех оставляет ключи к разгадке и показывает, как мы можем учиться у кого угодно.

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

Лучшие из лучших в своём деле часто отличаются необычными привычками, такими как сосредоточенность на важных вещах и навязчивая практика в своём деле, когда нет посторонних глаз. Они не только превосходят своих сверстников и других людей, но работают эффективнее и смотрят на обучение как на образ жизни.

Как говорит самый известный в мире тренер эффективности Тони Роббинс: “я думаю, что если вы жаждете учиться, вы жаждете расти, вы жаждете овладеть навыками в совершенстве. Если вы самостоятельно не согласитесь на меньшее, чем можете сделать на самом деле, то вы превзойдете любого”.

Учимся учиться

Фотограф Janko Ferlič на Unsplash

Говорят, что именно Эйнштейн сказал однажды: “Безумие  —  делать одно и то же снова и снова и ожидать разных результатов”. Если вы хотите достичь других результатов, вам нужно делать совсем не то, что делают другие. Если вы учитесь, как другие, то получите те же результаты, что и они. Чтобы быть похожим на Эйнштейна, нужно быть готовым углубиться в предмет и научиться чему-то другому.

Несколько десятилетий назад студент-физик отлично выступил на экзамене, но профессор поставил ему плохую оценку из-за вопроса о том, как измерить высоту здания с помощью барометра.

Студент написал: “Поднимитесь на самый верх здания. Бросьте барометр и считайте секунды, пока он не разобьется о тротуар внизу. Затем воспользуйтесь формулой ускорения под действием силы тяжести, чтобы определить высоту здания”.

Ожидаемый ответ был таким: использовать давление воздуха как инструмент измерения высоты, посмотрев показания барометра. Студент спорил, утверждая, что нашел нетрадиционное, но правильное решение. И тогда профессор заключил со студентом сделку: если он сможет правильно ответить на тот же вопрос, используя еще один подход, профессор поставит ему хорошую оценку.

Студент тут же придумал другой ответ. Он сказал, что воспользуется барометром, чтобы постучать в дверь хозяина дома. Когда хозяин откроет дверь, он спросит: “какой высоты это здание?”

Профессор предложил студенту придумать другой ответ на этот вопрос. Студент посоветовал привязать длинную веревку к барометру и измерить длину веревки с вершины здания. Или раскачивать веревку как маятник и определить высоту по её движению. Профессор признал, что все эти ответы правильны и поставил студенту хорошую оценку.

Согласно книге Скотта Янга “Learn More, Study Less” (Меньше теории, больше практики), этим студентом был Нильс Бор, получивший Нобелевскую премию по физике в 1922 году «за заслуги в изучении строения атома». Но он не изучал атом, посещая свои лекции по физике!

Вы должны быть действительно увлечены чем-то, чтобы перейти на новый уровень обучения, понять тему и придумать много ответов на один и тот же вопрос. Более того, вы также должны учиться иначе, чем большинство людей.

Большинство студентов готовятся к экзамену, потому что хотят получить хорошую оценку. Они не узнают больше, чем охвачено выпускным экзаменом. Не говоря уже о том, чтобы потратить больше времени на изучение чего-то, связанного с предметом, после экзаменов.

Точно так же многие разработчики программного обеспечения склонны использовать Google для решения проблемы, чтобы как можно быстрее исправить ошибку. Их главная забота в том, чтобы казаться продуктивными перед менеджерами. Они не тратят время на глубокое понимание решения или выяснение наиболее эффективного способа решить проблему. Они удовлетворены закрытием задачи в Jira.

Конечно, могут быть случаи, когда на вас давят, и вам нужно быстро исправить критическую ошибку, потому что быстро приближается дедлайн. Тем не менее вы не должны позволять таким случаям отвлекать вас от постоянного обучения.

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

1. Изучите основы информатики

Согласно биографии Альберта Эйнштейна, написанной Уолтером Айзексоном, еще до того, как Эйнштейну исполнилось 15 лет, он овладел дифференциальным и интегральным исчислением, поскольку рассматривал математику как способ понимания природы. Эти фундаментальные знания впоследствии оказались полезны в его работах в области физики.

Большинство людей часто избегают основ потому, что не видят плоды работы в краткосрочной перспективе. Гораздо приятнее сказать, что у вас есть приложение, готовое к загрузке из Play Store, а не что вы всё еще сосредоточены на основах.

Будьте не такими, как они. Очень тщательно изучите основы информатики (точнее, структуры данных и алгоритмы). Вы должны научиться самостоятельно реализовывать некоторые из наиболее часто используемых алгоритмов и структур данных без использования учебника.

Когда вы наконец поймете их на глубоком уровне, вы приобретете навык решать реальные проблемы в разработке программного обеспечения интуитивно понятным способом. Это, в свою очередь, может быть гораздо быстрее и эффективнее.

Как отмечает Айзексон, Эйнштейн считал, что “интуиция  —  не что иное, как результат предшествующего интеллектуального опыта”. В разработке программного обеспечения такой опыт требует твёрдого знания основ.

Как выразился основатель Linux и разработчик её ядра Линус Торвальдс:

Я утверждаю, что разница между плохим программистом и хорошим программистом заключается в том, считает ли он более важными свой код или же свои структуры данных. Плохие программисты беспокоятся о коде. Хорошие программисты беспокоятся о структурах данных и об их взаимоотношениях.

Крупные технологические компании, Microsoft, Google или Amazon, нанимают новых разработчиков, бросая им вызов жесткими техническими собеседованиями, которые в основном вращаются вокруг фундаментальных концепций. Другими словами, независимо от того, какой тип языка программирования вы используете, ваш код — это способ выражения алгоритмов и структур данных “под капотом”.

2. Учитесь, решая проблемы, а не пассивно читая учебники

Фотограф Chris Ried на Unsplash

Эйнштейн часто пропускал занятия в колледже. Айзексон цитирует его слова: “Я много прогуливал и дома с благоговением изучал работы ученых по теоретической физике”. Он не был заинтересован или принужден посещать его лекции. Он нашёл что-то более привлекательное и приносящее удовлетворение в решении сложных задач и любил самостоятельно одержимо играть в идеи и уравнения.

Есть много книг и учебников, которые могут научить вас программированию, но они часто дают только поверхностное представление о новых концепциях, в то время как более глубокое понимание и обучение происходит при решении реальных проблем с использованием этих концепций.

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

Вместо этого вы должны быть активно вовлечены в решение проблем, чтобы изучить новые концепции. Находите технические проблемы, которые проверят ваше понимание основ на онлайн-сервисах, таких как LeetCode, Codility, HackerRank, CodeChef, CodeForces и так далее.

Вы также можете внести свой вклад в проекты с открытым исходным кодом в GitHub, исправляя ошибки или оптимизируя существующие функциональные возможности или написав более эффективную реализацию чего-либо. Работа над проектами других людей поможет вам извлечь уроки из их реализаций и подходов и даже бросит вам вызов, когда нужно будет придумать новые решения.

Этот вид работы активно вовлекает ваше мышление, когда вы находите новые подходы к существующим решениям, которые, в конце концов, помогают вам изучать новое.

Если у вас уже есть штатная должность, или даже если вы независимый подрядчик, вы должны постоянно искать сложные задачи для вашего уровня опыта. Не бойтесь попросить руководителя проекта поручить вам такие задачи. Вместо того, чтобы уклоняться от возможностей учиться, будьте полны энтузиазма и ощутите привилегию получать деньги за обучение тому, чего вы раньше не знали. Как сказал Эйнштейн: “Развитие интеллекта должно начинаться с рождения и прекращаться только после смерти”.

Более того, не стесняйтесь начинать сторонний проект. Вам не нужно ждать пять лет, чтобы создать своё собственное приложение. Вы можете начать разрабатывать небольшое приложение и планировать его дальнейшее масштабирование по мере получения информации.

Опубликуйте код на GitHub и попробуйте запросить обратную связь у других программистов, связавшись с ними по электронной почте или в сообществах.

3. Пишите тесты, чтобы понимать больше

Дядя Эйнштейна Якоб бросил вызов своему тогда ещё небольшого возраста племяннику, чтобы тот доказал теорему Пифагора. “После долгих усилий мне удалось доказать её на основе подобия треугольников”,  —  вспоминал Эйнштейн. Доказывая, он приложил много усилий для развития понимания вещей. В результате он не только научился чему-то целостному, но и обрел достаточно уверенности, чтобы самостоятельно пробовать нечто иное.

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

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

Если вы хотите узнать, как работает тот или иной фреймворк с открытым исходным кодом, пишите тесты. Таким образом, вы не только поймёте, что фреймворк намного лучше, но и ваши тесты могут внести свой вклад в проект.

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

4. Глубоко концентрируйтесь

Фотограф Kevin Ku на Unsplash

Мы живем в эпоху слишком большого количества отвлекающих факторов. Как просыпаемся, мы сразу тянемся к телефону. Проверить сообщения, прочитать электронные письма. В среднем человек участвует в 76 отдельных телефонных сеансах в день.

Очевидно, что у Эйнштейна не было мобильного телефона, но были свои отвлекающие факторы и способы борьбы с ними, которые мы можем изучить. Его сын сообщил, что даже самый громкий детский плач, казалось, не беспокоил отца”, и добавил: “Он мог продолжать свою работу, будучи совершенно невосприимчивым к шуму”.

Способность Эйнштейна глубоко концентрироваться и работать в течение длительных периодов времени без перерыва помогла ему достичь исторических прорывов. “Я был в состоянии сделать то же, что за полный рабочий день, всего за два-три часа. Оставшуюся часть дня я работал над своими собственными идеями”, — говорит Эйнштейн об управлении своим временем на интеллектуально не стимулировавшей работе в Бернском патентном бюро, которая давала ему время сосредоточиться на более сложных задачах.

Разработчики программного обеспечения могут учиться у Эйнштейна и практиковать блокирование отвлекающих факторов. Не притворяйтесь, что можете глубоко сосредоточиться после бесчисленных “просто проверок” сообщений в Facebook!

Тим Феррис, автор бестселлера “Инструмент титанов” (Tool of Titans), пишет: “Однозадачность  —  это сверхспособность”. Он добавляет: “В цифровой экономике, где отвлечение  —  это валюта, если вы можете сосредотачиваться на одной вещи в течение трех-пяти часов и блокировать все отвлекающие факторы, у вас есть огромная фора, вы можете делать сложную работу и видеть неочевидное”.

Попробуйте пойти на компромисс со своим менеджером и отложить определенные часы дня на коммуникацию, а остальные часы вложить в бесценные познавательные усилия: изучение новых концепций и технологий, а также написание кода.

Когда мы в состоянии дистанцироваться от этих перерывов и применять развитые навыки управления временем, мы увеличиваем шансы погрузиться глубже в обучение, в результате становясь намного продуктивнее.

5. Будьте любопытны. Любите учиться

Разработка программного обеспечения  —  одна из самых востребованных профессий нашего времени. Постоянно появляются вакансии, привлекающие как молодежь, так и уже занятых людей самых разных профессий. Они знают, что можно получить действительно хорошую зарплату, работая разработчиком программного обеспечения, а значит, начинают карьеру с большими амбициями.

Однако, даже если вы получите работу в области разработки, вы сможете стать истинным профессионалом только в том случае, если любите учиться и программировать. Это одна из немногих профессий, в которой постоянно приходится учиться.

Дело не только в существующих концепциях. Нужно адаптироваться к постоянному изобретению новых технологий и языков. Вы должны адаптироваться к изменениям на рынке и узнавать всё новое —  то, что считается ценным сейчас. Учиться придётся постоянно и много. Чтобы ваш мозг постоянно учился, нужно проявлять любопытство и оставаться скромным.

Часто программисты трудоустраиваются на основе имеющихся знаний и начинают думать, что им больше не нужно учиться. Тем не менее вы сможете преуспеть только в том случае, если вам интересно и вы любите учиться, так как необходимость учиться никогда не перестает существовать.

В ноябре 1915 года Эйнштейн, написав всего две страницы того, что назвал “одним из самых красивых произведений в моей жизни” отправил письмо своему 11-летнему сыну Гансу Альберту. Он похвалил сына за его усилия в учении, сказав, что “это способ научиться всему… Когда ты делаешь что-то с таким удовольствием, что не замечаешь, как проходит время”.

“У любопытства есть своя причина существования”, — объясняет Эйнштейн. “Нельзя не трепетать, когда созерцаешь тайны вечности, жизни и чудесной организации реальности”.

Полюбопытствуйте о том, как работает и структурирован фреймворк. Когда вы изучаете что-то тщательно, то получаете чёткое представление о механизмах и функциях. Не просто согласитесь с тем, что Rails  —  отличный фреймворк для быстро разрабатываемых веб-приложений. Узнайте, как Rails работает изнутри. Кроме того, рассмотрите возможность вложиться в его развитие: исходный код Rails открыт.

Берегитесь стать одержимым деньгами. Конечно, всем нам нужны деньги, чтобы оплатить счета и купить еду для себя и/или своей семьи, но если вы хотите преуспеть в разработке программного обеспечения, вам нужно культивировать страсть к обучению и развитию. Нужно любить программирование и быть благодарным за то, что у вас есть возможность влиять на жизнь миллионов людей строчками кода, которые вы пишете.

Эйнштейн верил, что “любовь  —  лучший учитель, чем чувство долга”. Что мы можем понять из этого как разработчики программного обеспечения, так это важность того, что мы работаем не потому, что нам нужны деньги, а потому, что мы любим учиться, любим нашу работу в целом, а также у нас есть внутреннее любопытство и драйв, удерживающий внимание после работы или в выходные, когда на нас не смотрит начальник.

Всегда помните: программирование  — это обучение длиной в жизнь

Фотограф Patrick Tomasso на Unsplash

Помимо методики обучения, Эйнштейн является одной из самых влиятельных фигур в физике. Его работы помогли в различных сферах: от производства ядерной энергии до синхронизации спутников GPS с компьютерами, а также в производстве многих потребительских товаров.

Гений Эйнштейна и его достижения могут быть вне досягаемости для большинства из нас, но его трудовая этика, скромность, любопытство и упорство достойны подражания.

Если вы хотите быть успешным, то можете сэкономить себе время, копируя поведение успешных людей. Хотя Эйнштейн не написал ни одной строчки на Java или Python, его жизнь раскрывает некоторые вдохновляющие способы жить, которые мы все можем применить и в области разработки программного обеспечения.

Пример Эйнштейна может служить стимулом для того, чтобы сосредоточиться на изучении основ. Чтобы учиться, решая проблемы различных проектов, писать тесты и глубоко концентрироваться, а самое главное  —  любить учиться. Если мы хотим преуспеть в карьере, то должны увлечься обучением и признать его важнейшей частью нашей жизни.

Читайте также:


Перевод статьи Fatos Morina: How to Learn Programming Like Einstein Learned Physics