Education

Что отличает отличных программистов от хороших? Это вопрос, который занимает меня с тех самых пор, как я только начал учиться программировать.

Рассмотрим основные черты, которые присущи отличным программистам. Они не похожи на остальных, и результаты говорят в их пользу.

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

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

Программирование — это не то, чем отличные программисты занимаются изредка, лишь время от времени. И это не то, что они делают с девяти до пяти с понедельника по пятницу.

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

Один мой знакомый программист первые два часа дня (шесть дней в неделю) посвящает проектам или проблемам, работа над которыми помогает ему самосовершенствоваться. В это время он занимается изучением интересных для него тем или оттачиванием своих навыков и умений. Он умудряется втиснуть это «программирование для себя» в свой рабочий график — обычно до начала работы, пока повседневная рутина не поглотила его.

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

Каков ваш пробег программиста?

Вопрос в том, как быть последовательным? Многим из нас этого трудно достичь. Я нашёл решение, которое состоит из двух этапов.

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

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

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

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

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

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

  • привлечь кого-то для выполнения части работ по дому;
  • сократить время на просмотр телевизора после работы;
  • вставать на час раньше, тогда у вас появится дополнительное время до начала работы.

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

План программиста

Между моим первым опытом программирования и первым полумарафоном, который я бежал, есть что-то общее: отсутствие планов и плачевные результаты.

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

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

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

В конце дня я открываю Evernote на своём компьютере и составляю расписание на следующий день. Так во вторник вечером я составляю расписание на среду.

Вот вам пример:

С 6:30 до 8:30 — программа.

  • Просмотр карточек Anki для Python в течение 20 минут.
  • Решение проблемы “Word Cloud Data”.

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

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

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

Кроме того, ежемесячный план наполняет смыслом мои ежедневные планы. Задаёт определённое направление с конкретными целями, к достижению которых надо стремиться. «Так, сегодня я изучаю JavaScript. Он нужен мне для достижения цели этого месяца: завершить проект Х».

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

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

Гораздо легче проявлять настойчивость и упорство, работая над чем-то поддающимся решению.

Система решения проблем

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

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

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

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

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

  • Понимание вводных данных и ожидаемых результатов выполнимо.
  • Выявление пограничных случаев выполнимо.
  • Написание псевдокода выполнимо.
  • Решение упрощённой версии проблемы выполнимо.

Думаю, вы уловили идею. Этапы могут быть непростыми, но они выполнимы.

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

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

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

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

Но его ответ поразил меня. «Ух ты, отличная проблема!» — сказал он. По мере того как он вникал в делали, интерес его только увеличивался.

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

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

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


Перевод статьи Amy M Haddad: 2 Traits of Great Programmers

Предыдущая статьяСтоит ли учить Julia?
Следующая статьяСинхронизация в Java. Часть 1