Быть хорошим инженером-программистом еще не значит быть эффективным. В этой статье Эдди Османи из Google выделяет десять ключевых качеств эффективных инженеров-программистов. [Эта статья – перевод. Ссылка на оригинал: https://leaddev.com/personal-development/what-makes-effective-software-engineer, прим. редакции]
Эффективность важна для программистов, поскольку она позволяет нам сосредоточиться на самом важном. Часто это приносит максимальную выгоду пользователям, бизнесу и, в конечном итоге, со временем и нашему карьерному росту. Если мы сосредоточимся на тех видах деятельности, которые считаются наиболее эффективными, мы также сможем продемонстрировать свою ценность команде, увеличить свои шансы на продвижение по службе и другие перспективы карьерного роста.
В этой статье я расскажу, что на мой взгляд делает инженеров эффективными, основываясь на своем опыте работы в Google.
Как стать эффективным инженером-программистом
Как инженер-программист, вы должны заботиться о своих пользователях и знать, чего они хотят. Вы должны понимать цели вашей компании и то, как ваша работа повлияет на эти цели. Это связано с тем, что вы в конечном итоге несете ответственность за создание программного обеспечения, которое решает поставленные задачи, и за решение которых клиенты готовы платить. Если вы не думаете о том, как люди будут использовать продукт или услугу, то, скорее всего, то, что создается, на самом деле будет бесполезным.
Хотя это может показаться очевидным, многим разработчикам бывает трудно это понять. Часто мы видим, как разработчики увлекаются деталями написания кода, не задумываясь до конца, зачем они вообще это делают. Это может отвлечь их от реальных целей, а также увести в сторону от работы, направленной на получение наилучшего результата. Разработчики будет сосредотачивать свое внимание на небольших задачах вместо того, чтобы способствовать решению более крупных стратегических задач.
Вот десять способов, как стать более эффективным инженером-программистом.
Забота о пользователе
Основная часть работы эффективного инженера-программиста — это забота о своих пользователях и их потребностях. Это более важно, чем использование конкретной технологии или платформы. Вот аспекты, которые должен учитывать эффективный инженер-программист.
- Область проблемы: чего пользователь хочет достичь с помощью вашего приложения?
- Бизнес-контекст: для кого вы создаете свой продукт и какую выгоду могут получить пользователи этого продукта?
- Технология: какими технологиями вы располагаете, и что лучше всего подходит для реализации данного сценария?
- Цели и задачи команды: как ваша работа будет способствовать (или нет) достижению целей вашей команды?
Быть эффективным специалистом по решению задач
Вы должны уметь решать поставленные задачи. Часто лучшие решения просты и элегантны. Но иногда вам может понадобиться мыслить нестандартно. Зачастую задачу можно решить несколькими способами: некоторые из них стройные и четкие (но не слишком сложные), другие нестандартные, но тем не менее эффективные.
Способность решать задачи — это то, что может сделать каждый, освоив свои инструменты и процессы. Способность мыслить нестандартно, одновременно учитывая все аспекты проблемы, поможет гарантировать, что ваш продукт или услуга будут соответствовать ожидаемой производительности и порадуют заказчиков.
Сохранять простоту, заботясь о качестве
От вас не требуется написать самое сложное программное обеспечение в мире. Вам просто нужно уметь понять поставленную задачу, знать, как ее решить разумным способом и не усложнять предлагаемый продукт. С накоплением опыта работы в отрасли, вы научитесь лучше находить компромиссы между простотой и производительностью. В результате ваш код станет более эффективным без ущерба для общего качества.
Это один из тех постулатов, которые кажутся обманчиво простыми. На самом деле, забота о качестве требует от инженера постоянной бдительности, поскольку вы всегда балансируете между различными аспектами качества (например, между доступностью и производительностью). Важно знать, что имеет наиболее решающее значение, когда речь идет о вашем продукте или услуге, чтобы в случае возникновения конкурирующих приоритетов вы могли принять взвешенное решение, чему отдать предпочтение в ходе циклов разработки.
Укрепление доверия, автономность и социальный капитал
Давайте рассмотрим каждый из этих аспектов по отдельности.
- Доверие. Вы не можете заслужить доверие в одночасье, но вы можете постепенно работать над выстраиванием доверительных отношений. Для этого прежде всего вам нужно быть надежным и последовательным. Если кто-то просит вас о чем-то, постарайтесь сделать это как можно скорее. Если вы установили срок, придерживайтесь этого срока. Если вы не обманываете и на вас можно положиться, люди привыкнут работать с вами, потому что они знают, чего ожидать от ваших действий и поведения.
- Автономность. Автономные работники — счастливые работники, а счастливые работники, как правило, более продуктивны, чем их коллеги, у которых нет выбора в том, как им выполнять свою работу. Автономность не означает, что можно делать все что угодно без последствий. Скорее, эффективная автономность означает предоставление сотрудникам свободы в рамках их должностных обязанностей в структуре команды.
- Социальный капитал. Инженеры-программисты часто являются интровертами по своей природе, поэтому зачастую для них затруднительно выбираться в люди и заводить друзей. К счастью, ничто не мешает человеку присоединяться к группам по интересам или посещать семинары для изучения новых навыков.
Понимание командной стратегии
Понимание того, как команда собирается достичь своих целей и как ваши действия могут помочь или помешать команде добиться успеха, имеет решающее значение для эффективного инженера-программиста. Вы должны быть в состоянии ответить на следующие вопросы.
- Чего мы пытаемся достичь?
- Как мы планируем этого достичь?
- Какую роль я играю в достижении этих целей?
- Как мои действия повлияют на другие команды или отдельные лица при достижении поставленных целей?
Правильная расстановка приоритетов и независимое выполнение
Инженер-программист, способный правильно расставлять приоритеты и выполнять задачи самостоятельно, — это тот, кого вы хотите оставить в своей команде. Этот человек понимает направление деятельности компании и может принимать решения, согласованные с этим направлением. При возникновении проблем такие люди знают, как определить первопричину и найти решение, которое лучше всего подходит как для сведения к минимуму технических недоработок, так и для повышения скорости разработки, поддержания качества и, в конечном итоге, для удовлетворения клиентов.
Эффективный инженер-программист знает, когда уместно взять на себя ответственность за задачи и проекты, при этом его непосредственный руководитель не говорит ему, что нужно делать. Такие люди также знают, когда имеет смысл обратиться к своим коллегам за помощью, а затем эффективно взаимодействовать с другими командами.
Мыслить на перспективу
Способность мыслить в долгосрочной перспективе — важная черта эффективного инженера-программиста. Вы должны уметь видеть общую картину и понимать, как каждый отдельный компонент вашего продукта вписывается в общие цели вашей компании.
Инженеры-программисты, способные мыслить в долгосрочной перспективе, лучше подготовлены к пониманию того, как новые технологии повлияют на их продукты в будущем. Они также лучше понимают, какую динамику и культуру команды они хотят создать в долгосрочной перспективе, продолжая вкладывать свои усилия в разработку.
Эффективный инженер-программист понимает, что доверие выстраивается постепенно через взаимное уважение и открытое общение с другими членами своей команды. Такое поведение важно, если вы хотите работать самостоятельно и при этом эффективно сотрудничать в проектах, требующих как творческого подхода, так и технических навыков.
При вашем выходе из проекта по разработке программного обеспечения, он должен стать лучше, чем был в начале вашего прихода в проект (если позволяет время)
Если позволяет время, вы всегда должны стараться, чтобы проект после вас имел лучший вид, чем был в начале. Это означает, что нужно улучшить код, убедиться, что документация актуальна и точна, а также очистить среду, чтобы следующему человеку было легче продолжить с того места, где вы остановились, в долгосрочной перспективе улучшать процессы и культуру вашей команды, а также профессионально расти, узнавая больше о других языках, технологиях и платформах, которые имели отношение к данному проекту.
Вам также следует учитывать то, как ваша работа влияет не только на ваших непосредственных коллег, но и на всех членов вашей организации и сообщества. Например, если вы работаете над чем-то, что напрямую повлияет на клиентов, будьте предельно осторожными и внимательно прислушивайтесь к их отзывам и комментариям, сделанным во время разработки. Таким образом, когда продукт поступит в производство, в нем должно быть меньше ошибок или других проблем, чем обычно, потому что люди не знают того, что они еще не знают!
Уверенно приниматься за новые сложные задачи
Эффективный инженер-программист уверенно принимается за новые задачи в случае изменения требований организации.
Способность адаптироваться и изучать новое является неотъемлемой частью работы инженера-программиста. По мере развития технологий меняются и требования к вашей работе. Если вы не способны расти вместе со своей организацией, вы можете столкнуться с трудностями или, что еще хуже, остаться без работы.
Гибкость и быстрая обучаемость помогут вам адаптироваться, когда это необходимо, и быть готовыми, когда появится возможность для личного карьерного роста или продвижения по службе в организации в целом.
Эффективное общение со своей командой
Очень важно уметь эффективно общаться со своей командой, другими командами и заказчиком. Это означает, что вы должны быть в состоянии эффективно передавать техническую информацию своим коллегам и руководству. Если они не понимают, о чем вы говорите, может возникнуть недопонимание, что может привести к ошибкам или проблемам, которые потом потребуется исправлять.
Также важно эффективно общаться с другими заинтересованными сторонами, такими как отделы продаж или маркетинга. Инженер-программист должен знать, что делает его продукт, как он работает и почему он приносит пользу заказчикам и пользователям, то есть понимать то, на что часто у его руководителей нет времени.
Общаясь с заказчиком, инженеры должны говорить простым языком и избегать технического жаргона.
Распространенные антишаблоны эффективности разработки программного обеспечения
Хотя любой хороший инженер-программист может овладеть вышеперечисленными навыками, существует несколько антишаблонов, которых следует избегать, если вы хотите добиться настоящей эффективности.
- Хранение кода в секрете: то есть, когда вы хотите быть уверены, что никто другой не сможет залезть в вашу базу исходного кода и внести изменения, не понимая, как это работает. Если каждый хранит свой код в отдельном месте, другим людям в команде становится очень сложно понять, как это работает все вместе. Хотя на первый взгляд это может показаться хорошей идеей, на практике такое положение дел приводит к замедлению циклов разработки и усложняет поиск и исправление ошибок.
Это особенно проблематично, если над решением схожих задач работают несколько человек, и их работа взаимосвязана, потому что в таком случае у них могут возникнуть несколько разные представления о том, как все должно работать, что со временем снова приведет к путанице.
Это также означает, что между проектами не будет большого обмена информацией, поскольку каждый, возможно, захочет иметь собственную систему управления версиями вместо того, чтобы использовать какой-то общий инструмент, например, git или SVN, где необходимо правильно настроить права доступа, чтобы можно было извлекать наборы изменений из репозиториев других членов команды и добавлять в них свои наборы изменений.
- Чрезмерная помощь: если кто-то просит помощи в чем-то, имеющем отношение к вашей работе, но находящемся за пределами вашей непосредственной компетентности, подумайте, не отнимет ли это слишком много времени от выполняемых вами задач, таких как очистка документации, отладка существующего кода и т. д. или встраивание новых функций в существующую функциональность, и не сделает ли это их менее продуктивными.
С одной стороны, это может означать упущение возможностей, например, обучение новым навыкам может привести к большей гарантии трудовой занятости в будущем, но, опять же, это зависит от того, в какой среде вы работаете, и от частоты появления таких возможностей.
Размышления
Эффективные инженеры-программисты обладают высокой квалификацией, внимательно относятся к деталям и способны решать комплексные задачи. Они обладают высокими техническими способностями, отличными навыками общения и сотрудничества, а также способны адаптироваться к новым технологиям и задачам.
Хотя показатели эффективности в каждой организации свои, многие из описанных здесь качеств, по моему мнению, характерны для действительно эффективных инженеров-программистов.