Как стать великим программистом?

Что делает программиста действительно великим?
Amy M Haddad

Очень полезный материал от начинающего программиста и блогера Amy M Haddad, опубликованный в freeCodeCamp.org. Адаптированный перевод.

Что делает программиста действительно великим?

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

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

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

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

Решение проблем Extraordinaire

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

Хотя обычно есть несколько способов решить задачу, этот процесс всегда можно разделить на несколько частей. Программисты, которые хорошо решают задачи, вначале разбирают задачу по существу, чтобы определить главную цель и решают задачу всегда фокусируясь на цели. Затем они разбивают задачу на маленькие, управляемые части – и решают каждую часть по очереди, часто используя визуализацию, рисуя картинку, чтобы сделать ее «реальным миром».

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

Ситуация начала меняться, когда я начал узнавать о процессе решения и о том, как эффективно решать задачи. Я сейчас начинаю решение с цели. У меня есть книга Джорджа Поли «Как это решить» , которому я благодарна за этот совет.

Я адаптировала некоторые идеи Поли к программированию, например, понимание проблемы. «Задача должна быть понята», – пишет Поли. Это включает в себя умение «выделить основные части задачи, неизвестное, данные и условия». Для каждой задачи я вынимаю лист бумаги и пишу ответы на следующие вопросы: что я решаю или пытаюсь решить? (неизвестно); что дано? (данные); и какие ограничения или детали мне нужно учесть? (условия).

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

Исходя из этого, я делаю план, который является еще одним из предложений Поли. Это имеет смысл. Я пишу план, прежде чем написать статью. Художник делает эскиз картины перед началом работы над самой картиной. Строитель использует чертежи и схемы, чтобы построить дом. Также и с программированием. Вместо того , чтобы мчаться и делать, мне нужно начать думать о том, чего я хочу добиться, чтобы сделать план решения.

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

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

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

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

А как насчет вашего компьютера?

Изучение информатики (computer science) – второй фундамент программирования. Я недавно начала изучать информатику, и мне это нравится, потому что я выхожу за пределы поверхностного уровня. Я иду «за кулисы», чтобы узнать, что происходит, например, когда я использую встроенную функцию. Я также изучаю память и время выполнения, среди многих других тем. Короче говоря, я узнаю, почему компьютер делает то, что делает.

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

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

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

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

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

Поделиться...
Поделиться в facebook
Поделиться в twitter
Поделиться в vk