Как стать отличным программистом

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

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

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

Представьте себе пирамиду. Он имеет большое основание, но постепенно становится все меньше и тоньше к вершине. Эту основу составляет изучение основ программирования. Оттуда все взлетает.

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

Экстраординарный способ решения проблем

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я писатель (amymhaddad.com) и начинающий программист.