Что отличает отличных программистов от хороших? Это вопрос, который занимает меня с тех самых пор, как я только начал учиться программировать.
Рассмотрим основные черты, которые присущи отличным программистам. Они не похожи на остальных, и результаты говорят в их пользу.
В статье мы рассмотрим две черты, которые обнаружились в ходе изучения опыта отличных программистов, с которыми я вместе работал или читал о них. Между ними, без сомнения, есть определённая общность, проявляющаяся в двух их качествах: они последовательны и настойчивы.
К счастью, мы как программисты можем развить в себе эти две важные черты и использовать их в своей работе.
Программирование — это не то, чем отличные программисты занимаются изредка, лишь время от времени. И это не то, что они делают с девяти до пяти с понедельника по пятницу.
Регулярность у них проявляется, скорее, в улучшении своих знаний и навыков в свободное время: до или после работы и в выходные.
Один мой знакомый программист первые два часа дня (шесть дней в неделю) посвящает проектам или проблемам, работа над которыми помогает ему самосовершенствоваться. В это время он занимается изучением интересных для него тем или оттачиванием своих навыков и умений. Он умудряется втиснуть это «программирование для себя» в свой рабочий график — обычно до начала работы, пока повседневная рутина не поглотила его.
Но это не значит, что такие, как он, программируют круглосуточно. Они такие же, как и все мы, и им есть чем заняться помимо программирования. Но они последовательны: у отличных программистов самосовершенствование входит в привычку.
Каков ваш пробег программиста?
Вопрос в том, как быть последовательным? Многим из нас этого трудно достичь. Я нашёл решение, которое состоит из двух этапов.
Во-первых, определите количество часов, которые вы можете уделять программированию каждую неделю. Это число будет вашим еженедельным «пробегом программиста».
Когда-то я занимался бегом на длинные дистанции и каждую неделю наматывал определённый километраж. Это был мой еженедельный пробег. Теперь у меня есть пробег программиста: то количество часов, которые я посвящаю каждую неделю программированию.
Большинство людей этим этапом пренебрегают. Они сразу переходят к проекту, который нужно завершить, или к теме, которую надо изучить, не задумываясь о том, откуда взять время. Они работают весь день, продолжают ночью или устраивают себе шестнадцатичасовой рабочий день.
В этом подходе есть одна проблема: долго в таком режиме не проработаешь. Навыки программиста не оттачиваются после одной-двух недель напряжённой работы. Над этим нужно постоянно и последовательно работать в течение долгого времени.
Вот почему так важно определить свой пробег программиста. Как это сделать? Попробуйте несколько дней вести учёт используемого времени. Возьмите лист бумаги и записывайте туда всё, что вы делаете каждый день, и количество времени, которое вы на это тратите, включая то время, которое уходит на соцсети и проверку электронной почты.
Так будет легче определить, где у вас имеются резервы времени и где его расход можно уменьшить. Вы можете:
- привлечь кого-то для выполнения части работ по дому;
- сократить время на просмотр телевизора после работы;
- вставать на час раньше, тогда у вас появится дополнительное время до начала работы.
Определив свой пробег программиста, вы можете приступить к составлению плана. Это вторая часть, необходимая программисту, чтобы быть последовательным.
План программиста
Между моим первым опытом программирования и первым полумарафоном, который я бежал, есть что-то общее: отсутствие планов и плачевные результаты.
Но и кое-что ещё. В обоих случаях после таких плохих результатов я составлял план и придерживался его. И когда вы это сделаете, результаты приходят сами.
План — это один из наиболее эффективных способов быть последовательным и в конечном счёте достигать поставленных целей. Ведь в этом случае все детали определены заранее, вам лишь остаётся реализовывать этот план каждый день.
В моих планах подготовки к полумарафону было подробно расписано, сколько километров мне нужно пробегать каждый день и с какой скоростью. Теперь я составляю планы программиста, в которых также должно быть расписано, что мне делать каждый день.
В конце дня я открываю Evernote на своём компьютере и составляю расписание на следующий день. Так во вторник вечером я составляю расписание на среду.
Вот вам пример:
С 6:30 до 8:30 — программа.
- Просмотр карточек Anki для Python в течение 20 минут.
- Решение проблемы “Word Cloud Data”.
Я следую этому шаблону при составлении плана на каждый рабочий день: обозначаю количество времени, которое потрачу на задачу, и что конкретно нужно сделать за это время.
Также я составляю ежемесячный план. В него я включаю три пункта: что построить, изучить или завершить в предстоящий месяц.
Раньше я составлял квартальные планы. Но за три месяца многое может измениться. Месяца вполне достаточно, чтобы достичь заметных результатов и продолжить в том же духе, не сбавляя темпа.
Кроме того, ежемесячный план наполняет смыслом мои ежедневные планы. Задаёт определённое направление с конкретными целями, к достижению которых надо стремиться. «Так, сегодня я изучаю JavaScript. Он нужен мне для достижения цели этого месяца: завершить проект Х».
Вторая черта отличных программистов — это настойчивость. Они прорабатывают проблему, обнажая слой за слоем, и находят решение.
Похоже, в этом и есть их секрет. Отличные программисты обладают невероятной способностью разбирать проблемы на составляющие их части, вскрывая целые слои проблемы или неоднозначной ситуации. Короче говоря, у них есть система решения проблем.
Гораздо легче проявлять настойчивость и упорство, работая над чем-то поддающимся решению.
Система решения проблем
В самом начале, когда я только начинал учиться программировать, я упирался в стену, пытаясь решить очередную проблему.
Меня так и не научили в школе решать задачи. Когда нам на уроке математики задавали на дом задачки, я просто с ходу без особых раздумий бросался их решать. Так я и делал, начиная программировать. Никакого плана. Никакой системы. Никаких размышлений. Никакого разбора. Неудивительно, что в обоих случаях я зря тратил время и силы и постоянно натыкался на препятствия.
Теперь у меня есть система решения проблем, которая помогает разбивать проблему на составляющие, вскрывая все её слои.
Например, первый этап в моём процессе решения проблемы — это понимание постановки задачи. «Так, здесь просто нужно понять, в чём вопрос», — говорю я себе, когда передо мной очередная проблема, а я не имею ни малейшего представления, как к ней подобраться. Это первый выполнимый этап решения проблемы.
Разобравшись с постановкой задачи, сосредоточиваемся на следующем выполнимом этапе, и только на нём.
- Понимание вводных данных и ожидаемых результатов выполнимо.
- Выявление пограничных случаев выполнимо.
- Написание псевдокода выполнимо.
- Решение упрощённой версии проблемы выполнимо.
Думаю, вы уловили идею. Этапы могут быть непростыми, но они выполнимы.
Решение трудных проблем помогает нам становиться лучше, а также придаёт уверенности. Преодолев одну трудную проблему, мы готовы к большему.
Начинается всё, однако, с разбиения задачи на мелкие части и работы с каждой из них по отдельности. Поступая таким образом и проявляя настойчивость, вы делаете трудную проблему вполне решаемой.
На пути к тому, чтобы стать отличными программистами у нас есть ещё кое-что, что нужно учитывать: настрой. Отличные программисты с бодрым, оптимистичным настроем подходят к неоднозначным и сложным проблемам.
Этот момент стал мне понятен, когда я задал старшему разработчику несколько вопросов о проблеме, над которой я безуспешно бился. Я был озадачен и расстроен. Разработчик поначалу тоже пришёл в замешательство.
Но его ответ поразил меня. «Ух ты, отличная проблема!» — сказал он. По мере того как он вникал в делали, интерес его только увеличивался.
Конечно, это не значит, что отличные программисты никогда ни на чём не спотыкаются. Но их отличает настрой. Отличных программистов неизвестность не страшит, а увлекает — такой урок усвоил я в тот день. Они понимают, что обязательно узнают что-то новое, вскрыв слои проблемы.
Мы можем многое для себя понять, изучая опыт лучших программистов. Но в конечном счёте вся ответственность лежит на нас: надо действовать и каждый следующий день быть лучше.
Читайте также:
- Разоблачение мифов о сеньоре
- Прикольные анимации для Flutter-приложений
- Как мне не удалось совладать с устаревшим кодом
Перевод статьи Amy M Haddad: 2 Traits of Great Programmers