Чем должен владеть программист
Что должен знать и уметь хороший программист на самом старте карьеры
Программисты – это люди, которые создают программы или, как говорят на профессиональном языке, разрабатывают. Браузеры, аудио- и видеопроигрыватели, антивирус, торрент-клиент и многое другое создано программистами.
Расскажем о том, что должен уметь программист, какие навыки обязательны, а какие можно освоить дополнительно.
Базовые знания
Любая профессия начинается с изучения фундаментальных основ. Что должен знать программист на старте – дискретную математику, теорию вероятности, математическую статистику, линейную алгебру, функции и т. д.
На основе полученных знаний можно изучать любой язык программирования и совершенствовать в нем.
Второе обязательный навык – умение искать в интернете необходимую информацию. Программист не может знать все обо всем, но он знает, где можно это найти.
Также обязателен английский язык уровня Intermediate и выше. Большинство информации (книги или статьи топовых разработчиков) выходит на английском языке без перевода. В дальнейшей карьере также придется общаться с клиентами на иностранном языке.
Расширенные навыки
Начинающие студенты часто задаются вопросом – какие еще навыки нужны программисту, кроме базовых?
Где изучать
Второй вопрос, который сразу возникает у начинающих – куда пойти учиться на программиста? На самом деле вариантов много. Это может быть специализированный вуз, индивидуальные занятия или самостоятельное изучение.
Если студент выбирает путь самостоятельного изучения, то ему потребуется гораздо больше времени стать разработчиком.
В качестве вуза студент может выбрать онлайн-университет, который преподает курсы программирования с нуля. Ученику не нужно регулярно ездить на занятия и тратить время на дорогу. Он может выбрать удобную для себя форму обучения – например, в свободное время слушать лекции и сдавать практические занятия. Диплом в онлайн-университетах приравнен к обычным вузам.
Один из вариантов изучения онлайн–курсы на сайте https://checkroi.ru/. Веб-сайт предоставляет огромный список разных учебных материалов.
На какого программиста пойти учиться – выбор за студентом. Он вправе выбрать область, которая для него наиболее интересна. Программирование творческий процесс: если работа не интересна, то и результата не будет.
Сфера применения
При возникновении вопроса у начинающего программиста – какое образование выбрать, сначала стоит определиться с областью программирования.
На 2020-2021 года актуальные темы:
Существует и другие области, в которых также востребованы программисты – контейнеризация, DevOps, QA engineer и др.
Уровень зарплат
Стоимость услуг программиста варьируется в зависимости выбранной сферы и профессиональных навыков. Например, начинающий разработчик мобильных приложений в среднем получает на руки до 70-80 тысяч рублей, а опытный – 200-300 тысяч.
Поэтому на вопрос какая зарплата у программиста – нельзя дать четкий ответ. Также учитывается и компания, которая наняла сотрудника. Apple платит на порядок больше, чем небольшая компания.
Резюмируем
В статье рассмотрели, какие знания нужны для программиста, чтобы стать высококвалифицированным специалистом в своей области. Перечислили основные тренды на сегодняшний день, в которых идет высокий спрос и хороший уровень зарплат.
Навыки опытного программиста: Самые популярные советы начинающим
Быть программистом — это призвание? Возможно. Мы в 1cloud решили выяснить, как сами программисты оценивают свои достижения, какие качества считают неотъемлемыми в своей работе (вне зависимости от выбранного языка и специализации) и какие советы дают начинающим разработчикам.
1. Измерение кода в строках
Каждый опытный программист знает, что качество кода не определяется его длиной или временем, которое было затрачено на его написание, считает Джордж Майна (George Maina), сотрудник компании-разработчика ПО Kopo Koop.
Более того, в идеале следует стремиться к тому, чтобы код был написан как можно понятнее, что должно привести к его упрощению и в результате к сокращению его объема. Если две программы функционируют одинаково, то лучшей будет та, код которой содержит меньше строк.
Способность писать короткий код часто воспринимается как показатель высокого уровня работы. Так считал и Стив Возняк, который в одном из своих интервью (см. его 14-ый ответ) отметил способность команды Макинтош писать короткий и качественный код как одну из черт их высокого профессионализма. Ему также приписывается фраза о том, что он мог сделать код из 10 строк, равный по функциональности коду из 100 строк.
Мэттью Фехер (Matthew Fecher), разработчик большого количества приложений на iOS, технический редактор книжной серии «iPhone for Dummies» и «Mac for Dummies», один из основных членов команды AudioKit, также говорит, что его намного больше впечатлит максимально простое решение, а усложнение кода приводит только к увеличению затраченного времени и конечной стоимости проекта.
2. Желание учиться и умение признавать ошибки
Одно из главных качеств, необходимых в программировании — стремление узнавать что-то новое. Речь идет не только о начальной стадии, когда необходимо учиться на своих ошибках и задавать как можно больше вопросов.
Потребность в развитии должна быть свойственна программисту на протяжении всей деятельности, говорит основатель сервиса по подбору разработчиков Scalable Path Дэмьен Филиатро (Damien Filiatrault).
Но в обучении можно использовать не только стандартные техники. Например, в чешском Университете Градец-Кралове для повышения и развития навыка программирования в обязательную программу был введен предмет компьютерной графики (разработчики учебной программы считают, что обучение компьютерной графике позволяет серьезно углубить знания программирования и тем, кто впоследствии не будет связывать карьеру с этим направлением).
Мэтт Милз (Matt Mills), художник, дизайнер и веб-разработчик, подтверждает на собственном опыте, что комбинирование графического дизайна и программирования может здорово расширить область профессиональной деятельности. При этом, по его словам, развитие творческого мышления через изобразительное искусство подталкивает на поиск креативных решений в программировании. А самым юным кодерам доступно даже офлайн-обучение программированию через танец. Малыши познают основные концепции новой для них науки, сравнивая их с последовательностью движений.
Программирование не зря преподается через искусство, еще Дональд Кнут в предисловии к своей книге «Искусство программирования» писал: «Наша дискуссия показывает, что программирование является сейчас и наукой, и искусством, и что обе эти стороны прекрасно дополняют друг друга… Программирование это искусство, потому что в нем применяются накопленные в мире знания, потому что оно требует умения и изобретательности, и особенно потому, что оно создает прекрасное. Программист, который подсознательно чувствует себя художником, будет наслаждаться тем, что он делает и будет делать это всё лучше».
Постоянное расширение горизонтов помогает специалистам легче признавать свои ошибки. Разработчик, работавший на ВМФ США, Мэтт Пикеринг (Matt Pickering), уверен, что растущее количество краткосрочных курсов, обещающих быстро научить человека кодить с нуля, не всегда идет на пользу начинающим специалистам. У них возникает ощущение, что после такого «введения в тему» они знают все, и углублять свои навыки им больше не требуется — налицо эффект Даннинга Крюгера, когда недостаток квалификации приводит к завышенной оценке своих профессиональных качеств.
3. Упор на результат, а не затраченное время
Быстро написать код — далеко не всегда значит успешно справиться с поставленной задачей, учитывая, что эта работа состоит из многих этапов: начиная от изучения требований и заканчивая исправлением багов. Поэтому главным все же остается качество окончательного продукта.
Петер Нироп (Peter Nierop), сотрудник студии разработки Compudivision, считает, что если уж говорить о времени, то гораздо важнее то, сколько времени вы сможете сэкономить пользователям со всего мира. И если благодаря вам они будут делать на три клика меньше, то это вполне стоит трех дней вашей работы (разумеется, ваше время важно, но перенос фокуса со своих усилий на конечный результат здорово помогает начинающим специалистам легче справляться со сложными и комплексными задачами).
Разработчик архитектуры приложений в компании Imagine Communications Скотт Палмер (Scott Palmer) объясняет, что популярные сегодня онлайн-тесты не могут адекватно оценивать качество кода и профессионализм программиста. Конечно, существуют временные рамки и дедлайны проектов, но задаваться целью тратить на создание кода как можно меньше времени — не самая хорошая и совершенно не оправданная (с точки зрения результата) идея.
Этот принцип лучше всего иллюстрирует индустрия видеоигр (разумеется, создание игры не сводится к работе программистов и гейм-дизайнеров, однако их труд в данном случае — ключевой). Например, выпуск Team Fortress 2 был анонсирован еще в 1998 году, а на прилавках игра появилась лишь 9 лет спустя. Ожидание явно стоило этого, учитывая тот факт, что в нее продолжают играть даже в 2016 году. Разработка Diablo III заняла еще больше, целых 11 лет. При этом в год выпуска (2012) игра побила все рекорды по предзаказу. А в 2015 году игра оказалась на 10 месте в рейтинге самых продаваемых игр (30 млн копий).
4. Необходимость предварительной работы
Разработчик интернет-провайдера EarthLink Telecommunication Ашиш Чандра (Ashish Chandra), описывая свой опыт, говорит, что большую часть рабочего времени и даже часть личного тратит на обдумывание кода и поиск оптимальных решений, которые можно внедрить. И даже 50 строк кода в день приобретают совсем другую ценность, когда к их написанию подошли очень вдумчиво.
Джо Армстронг (Joe Armstrong), создавший язык Erlang, при разработке ПО, например, предпочитал очень тщательно документировать все, что только возможно, перед тем, как приступать к непосредственному написанию кода. Очень часто предварительная подготовка играет достаточно большую роль и облегчает работу: Рави Шанкар (Ravi Sankar), инженер-программист в Microsoft, уверен, что так можно сократить или вовсе избежать последующих преобразований и исправлений.
Согласно опросу на Hacker News, многие программисты до сих пор делают записи в блокнотах и даже используют карточки, чтобы привести мысли в порядок и продумать код до начала самой работы. У некоторых заведен отдельный блокнот для каждого проекта, другие пишут или зарисовывают идеи в одном месте, а затем переводят записи в печатный вид. Но все они уверены, что это сокращает время, затраченное на сам процесс написания кода и помогает избежать большого количества ошибок.
5. Коммуникабельность
У коммуникабельности есть две важных стороны — умение работать в команде и понимать клиентов. Но для Криса Кемпа (Chris Kemp), генерального директора консалтинговой компании в сфере информационных технологий и бизнес-систем Paladin Consultants, клиент тоже является частью команды, поэтому услышать его и понять, согласовать план и цели проекта — залог создания успешного продукта (хотя, конечно, далеко не во всех компаниях эта задача лежит на плечах самих разработчиков).
Уже известный нам Мэтт Пикеринг считает, что для развития профессионализма поможет и более активное общение с коллегами-непрограммистами (про то, как объяснять им некоторые концепции, популярные в программировании, мы рассказывали здесь).
Поэтому Дамьен Филиатро включает (под пунктом 2) хорошие коммуникативные навыки в список отличительных черт высококлассного специалиста. Стивен Уайатт Буш (Stephen Wyatt Bush) поделился в своем блоге 10 заповедями программиста, которым его научил отец, работающий в Технологическом университете Тенесси. Согласно 5 заповеди, особое терпение следует проявлять в общении с людьми нетехнических специальностей, чтобы не поддерживать сложившийся у них стереотип о программистах.
Майкл Лайонс (Michael Lyons) и Роб Томсетт (Rob Thomsett) провели психологическое исследование на основе системы типологии личности Майерс — Бриггс (созданной на базе идей Карла Юнга). Они пришли к выводу, что половина или две трети всех программистов по ориентации сознания является интровертами, то есть нам больше интересен внутренний мир идей и ментальных процессов, чем внешний мир людей и предметов.
Две трети больше ориентированы на результат, чем на процесс, поэтому предпочитают иметь четкий план действий. 80% программистов более рациональны, нежели эмоциональны (в стандартной выборке из разных профессий эти качества распределяются 50 на 50), что помогает нам принимать решения, руководствуясь логикой, и писать хороший код.
Кевин О’Шоннесси (Kevin O’Shaughnessy), веб-разработчик из Британии, уверен, что определение своего типа личности способствует пониманию себя и даже анализу своих ошибок в работе. Поэтому он предлагает программистам пройти сам тест и ознакомиться с описанием всех типов личности – иногда это может помочь в споре или общении с коллегами и клиентами.
Джон Олспоу (John Allspaw), технический директор торговой площадки Etsy, пишет в своей статье о том, что чем выше вы поднимаетесь по карьерной лестнице, тем больше к вам предъявляется требований – поэтому универсальные практики для начинающих порой могут пригодиться и опытным разработчикам.
Личность программиста
«Чтобы стать экспертом в практической или научной области, нужны огромный труд и долгое время. Если человек добросовестно трудится каждый час рабочего дня, когда-нибудь он проснется одним из самых компетенткых специалистов своего поколения.»
Ульям Джеймс
Мы с вами много говорим о том, как нужно строить архитектуру ПО, как следует выбирать имена для переменных, каким образом лучше документировать код и почему, и т.д.
Но ведь программы пишут люди, такие же, как мы с вами. Одни становятся выдающимися программистами и достигают больших успехов, другие же забрасывают профессию. Перефразируя классика, можно сказать: «покажи мне свой код, и я скажу, кто ты». Исследования показывают, что лучшие программисты создают программы в 10 раз быстрее, чем их менее квалифицированные коллеги. Время, уходящее на отладку кода, а также объем и быстродействие итоговой программы, уровень ошибок и число обнаруженных ошибок также различаются примерно в 10 раз.
В этой статье попытаемся ответить на вопрос, какими же качествами должен обладать человек для того, чтобы писать совершенный код.
Интеллект и скромность
Интеллект не кажется чертой характера и на самом деле не является им. Высочайший уровень интеллекта — далеко не главное условие для человека, желающего стать хорошим программистом.
Cамые лучшие программисты — те, кто понимают, насколько ограничены их возможности. Они скромны. Худшие программисты отказываются признать, что их способности не соответствуют задаче. Характер не позволяет им стать отличными программистами. Чем усерднее вы работаете над компенсацией ограниченных возможностей своего разума, тем лучше будете программировать. Быстрота вашего развития напрямую зависит от вашей скромности.
Любопытство
Профессиональная честность
«Любой дурак способен отстаивать свои ошибки — большинство дураков именно так и делают.»
Дейл Карнеги
Общение и сотрудничество
По-настоящему отличные программисты учатся эффективно сотрудничать, что всегда подразумевает написание удобочитаемого кода. Вероятно, компьютер читает вашу программу так же часто, как другие люди, но он читает плохой код гораздо лучше, чем люди. Работая над кодом, не забывайте про людей, которым придется изменять его в будущем. Программирование — это в первую очередь общение с другим программистом и только во вторую — с компьютером.
Творчество и дисциплина
Некоторые программисты считают, что стандарты и конвенции подавляют свободу творчества, но с этим трудно согласиться. Можете ли вы представить Web-сайт, на каждой странице которого использовались бы разные шрифты, цвета, способы выравнивания текста, графические стили и способы навигации? Какое уж тут творчество — это хаос. Если стандарты и конвенции не используются в крупном проекте, завершить его становится невозможно. Не тратьте свою творческую энергию на то, что не играет никакой роли. Установите конвенции для второстепенных областей и сосредоточьтесь на действительно важных аспектах.
Однако лень имеет и обратную сторону. «Спешка» и «усилия» ценятся в программировании совсем не так высоко, как на уроках физкультуры. Спешка — это дополнительные, ненужные усилия. Она указывает на активность, но не на выполнение работы. Движение нетрудно спутать с прогрессом, а занятость с продуктивностью. Главную роль в эффективном программировании играет мышление, а размышляющие люди обычно не кажутся занятыми.
Свойства, которые менее важны, чем кажется
Привычки
Выработать хорошие привычки крайне важно, потому что очень многое из того, что вы делаете как программист, вы делаете не задумываясь. Например, когда-то вы могли думать о форматировании циклов, но вы не думаете об этом при написании каждого нового цикла. Вы пишете их как привыкли. Это относится почти ко всем аспектам создания кода.
Билл Гейтс говорит, что любой программист, который впоследствии станет хорошим, хорош уже в первые несколько лет. После этого измениться практически невозможно.
Обучаясь делать что-то, сразу учитесь делать это правильно. В первый раз вы активно обдумываете свои действия и все еще можете с легкостью изменить свой подход. Выполнив что-то несколько раз, вы начинаете уделять меньше внимания своим действиям, и «сила привычки» берет свое. Проверяйте, что вы приобретаете именно те привычки, какие хотите.
Что, если вы еще не выработали самые эффективные привычки? Как изменить плохую привычку? Вы не можете заменить плохую привычку на отсутствие привычки. Вы можете заменить плохую привычку на хорошую. Попробуйте выработать новые, эффективные привычки. Например, выработайте привычку писать класс на псевдокоде перед кодированием или тщательно читать код перед его компиляцией. Тогда вам не придется беспокоиться об избавлении от плохих привычек — они естественным путем будут вытеснены новыми привычками.
Правила «идеального программиста»
1. Старайся стремиться к профессионализму
Сначала стоило бы разобраться с термином «профессионализм». Обычно под профессионалом принято считать человека, который знает свою предметную область намного лучше, чем его окружение. Но это не единственный критерий по которому надо определять профессионализм. Наравне с этим качеством идет и тот факт, что настоящий профессионал не боится брать на себя ответственность за проделанную работу и отвечать за нее на протяжении всего процесса эксплуатации, будь-то куска кода, модуль, проект или иной результат его работы. Так что термин профессионал, для вас должен раскрываться как «ответственный знаток конкретной предметной области». Все хорошо, но под предметной областью можно подразумевать в принципе что угодно, не вдаваясь подробности. Мы же ударимся в конкретику и перечислим необходимый минимум для разработчика:
Алгоритмы и структуры данных. В подавляющем большинстве случаев, рядовой разработчик не сталкивается с прямой надобностью использовать алгоритмы их в том виде, в котором они изложены в учебных пособиях, но их присутствие практически в каждой строчке кода в том или ином виде — бесспорна. Банальное грамотное оперирование командами if и else закладывает в Ваш фундамент профессионализма кирпичик базового познания.
Паттерны проектирования. Зачем разрабатывать «Велосиный костыльпед» для решения уже решенных задач? Знание данной области чем-то схожи с алгоритмами, за исключением принципов и уровня их использования.
Принципы проектирования. Под этими словами я подразумеваю совокупность методологий разработки, способов ее ведения и умение описать свой кода в виде диаграмм, блок-схем и документации.
По моему личному мнению, сформированному благодаря различным источникам, этот минимум идет на протяжении нескольких десятилетий, практически без изменений.
2. Научись говорить НЕТ
Этот совет кажется незначительным, на пути к становлению теми кем мы хотим казаться для большинства рекрутеров, но это в корень неверно. Яркий пример, который, как кажется, знаком каждому. Середина недели, к Вам подходит ваш начальник и неоднозначно намекает на то, что такой-то функционал должен появиться в Вашем приложении уже к концу недели. По неопытности, в начале пути, многие из нас безукоризненно ответили бы «Будет готово», параллельно планируя на какое время перенести поход в стоматологию и каким кофе запастись. Данный ответ является ошибочным по ряду причин:
У вас общие цели, но разные обязанности. Руководители, как и программисты — люди у которых есть свои обязанности с которыми (надеюсь) они умеют справляться. И также у них есть общие цели, в данном случае — добавление нового функционала, хотя порой они могут различаться в реализации, поэтому необходимо уметь приходить к оптимальному результату. Но это же «имя высокопоставленного начальника», как мне вступать с ним в полемику? Повторюсь, у вас общая цели, а для этого жизненно необходимы переговоры, а не слепо катить камень в гору. Увлекаться тоже не надо и вопросы «А зачем?», «А это точно?» будут довольно излишними для достижения общей цели. Эти вопросы должны всегда быть вне зоны вашей компетенции. Исключением будет являться, только тот случай, когда вы вплотную общаетесь с заказчиками и уверены в необходимости этих вопросов.
Вы не успели взвесить все нюансы. Этот момент касается в большинстве случаев — импульсивных людей, которые соглашаются на любой «кипишь». Это роковая ошибка, может стать для вас клеймом с надписью «А помнишь ты не …?», которое является результатом согласия, которое вы дали без задней мысли, которое более того будет обоснованным.
Как по мне, выходом из данной ситуации будет разговор с «торгами», в процессе которого, вы должны объяснить нюансы своей работы и возможные последствия такого указания (обычно это грязь в коде, что в будущем очень сильно скажется на сроках добавления нового функционала, не полная реализация всего, что было запрошено) и дать время на более детальное рассмотрение задания, чтобы вынести свой вердикт по времени его исполнения. Эта цифра навряд ли останется такой, какой вы ее озвучили, но точно даст руководителю более детальную картину происходящего, после чего и начнутся сами «торги».
3. Научись говорить ДА
Во-первых, это большая ответственность, сказать да. Во-вторых, как и в предыдущем примере, при принятии решения необходимо время. Обычно перед выбором ответа, я задаю себе следующие вопросы:
Это зависит от другого человека?
Первые 2 вопроса нужны для определения важности дела по матрице Эйзенхауэра, что позволяет разбить положительный ответ разные временные рамки, в противном случае пробрести аргументы для отрицательного ответа и определения новых рамок посредством переговоров. Третий вопрос позволяет мне добавить в конечный ответ обещание либо с конечной целью (в случае с отсутствием зависимости), либо с обещанием действия для достижения этой цели. В любом случае говорить да легче, чем нет, но этот ответ должен быть с чётким пониманием и готовностью взять на себя ответственность, чтобы при следующем общении у собеседника не возникло сомнений в надежности этих обещаний.
4. Умей справляться с давлением
Данный навык можно было бы покрыть одной фразой, которая является фундаментом — не допускайте ситуаций, создающих давление. Но, к сожалению, мы живем в реальном мире с реальными людьми и их проблемами. В подавляющем большинстве случаев давление будет оказываться, в форме времени исполнения и взятия обещаний. Пример: по непредвиденным обстоятельствам, несколько человек, с которыми вы работали, перевели на другой проект, но при этом «темп Вашей работы упасть не должен». Конечно, в данном случае, о профессионализме человека, поставившего вас перед этим малоприятным фактом, речи идти не может, но как у профессионала, у вас есть следующие навыки:
Дисциплинированность и неизменность своего поведения в напряженных ситуациях. Слезами горю не поможешь и вы должны это понимать как никто другой. В лучшем случае, на проект придется выделять чуть больше времени, чем планировалось, в худшем — полностью менять исходные инструменты, архитектуру и т.д. В любом случае сохраняем спокойствие и трезвость ума.
Умение контролировать свои обязательства. Помимо текущей задачи, скорее всего, у вас имеются и ряд других. Конечно, в критических ситуациях стоило бы пересмотреть приоритеты и сообщить об этом всем причастным, но для этого должна быть очень веская причина. Также стоит довериться своим собственным правилам, которые определяются индивидуально. Это может быть как и обычная физическая активность (подтягивания, бег), так и специфические методики по типу ведения документации проекта через PHPdocumentor. В любом случае у вас есть хорошая предметная база с фаворитами, которые помогут в таких ситуациях.
5. Цени время
Время — то, чего всегда не хватает в нашей профессии. Мы привыкли работать с раннего утра, до поздней ночи, с середины дня, до вечера и еще множество комбинаций из различных временных диапазонов. Проблема этого факта в то, что она напрочь убивает все вышеперечисленные советы, если вы не имеете четко спланированного распорядка дня, то будет сложно соблюдать обещания. Если нет распорядка дня или хотя бы наметки на него, то вы постоянно будете находиться под давлением от выработанного стресса или других проблем, в подавляющем большинстве вызванных от отсутствия тайм-менеджмента. И последнее, вы банально будете ценить не только свое время, но и время своих коллег, если они будут знать, когда можно обратиться к Вам за советом или собрать пятиминутку.
Данные рекомендации явным образом не являются «правдой в первой инстанции», но являются результатом собственных наблюдений и опыта, которые были испробованы на практике. Этот список стоило бы расширить и конкретизировать, но за этим я предлагаю обратиться к вышеупомянутой книге «Идеальный программист», в которой каждый из нас сможет почерпнуть для себя много нового или давно забытого старого.