Лекция
Это продолжение увлекательной статьи про профессии для создания и обслуживания веб сайтов.
...
кандидаты, подававшие резюме на вакансию «Senior developer» тратили на эту программу больше 15 минут.»
Варианты решения задачи FizzBuzz
Основное допущение, которое мы сделали, состоит в том, что действительно профессиональный разработчик в состоянии не только адекватно писать и читать код, но и грамотно производить его рефакторинг. В задачах по рефакторингу сочетаются навыки написания и понимания кода, а для их выполнения совсем недостаточно прочитать книгу или пройти обычный институтский курс по программированию. По таким задачам относительно легко понять, готов ли человек к работе в команде. Ниже представлены три примера таких задач. Задание всегда выглядело одинаково: «Взгляните на следующий код. Есть ли в нем какие-то проблемы? Если да, перепишите его».
Пример кода на JavaScript (проверка опыта работы с jQuery)
Пример кода на PHP (проверка знания основ объектно-ориентированного программирования)
Пример кода на Java (проверка базового знания паттернов проектирования)
Часто проблема заключается не только в некачественном коде, который пишут разработчики, и не только в уровне профессионализма тех, кто называет себя профессионалами. Если человек адекватно себя оценивает и честно говорит, что он джуниор, — это очень хорошо и проблемы в этом нет. Проблемой это становится тогда, когда у человека шикарное резюме, он хочет устроиться к вам на работу ведущим frontend-разработчиком за очень высокую зарплату, пишет, что отлично знает нативный JavaScript, а сам при этом вообще не понимает, как работают контексты, как устроено прототипное наследование или как работать с событиями в DOM-модели.
Здесь имеет место либо абсолютно искренняя неадекватная оценка себя, либо попытка обмануть работодателя. Часто оба этих фактора сливаются, и кандидат начинает верить в то, каким он себя показывает. На наш взгляд, это связано с отсутствием у таких людей желания развиваться в области, в которой они уже чего-то достигли. Им проще сказать, что они знают ту или иную технологию, чем реально ее изучить. Эта проблема присутствует не только в программировании и в ИТ-сфере, но и во всех других областях человеческой деятельности. А ведь желание развиваться в том, что ты делаешь, — важнейший компонент профессионализма.
Чем, на ваш взгляд, профессиональный разработчик отличается от любителя? Мы и раньше задавали этот вопрос тимлидам на собеседованиях, но сейчас решили внимательно проанализировать ответы и собрать статистику. Уникальных ответов получилось около пятидесяти. Мы сгруппировали часть ответов, которые посчитали похожими, и получилась очень интересная картина:
***Результат опроса 500 ведущих разработчиков и тимлидов — 10 самых часто встречающихся ответов.
Обратите внимание: почти 40% опрошенных назвали в качестве основного фактора профессионализма постоянное саморазвитие. При этом высокое качество работы, к которому мы отнесли «чистоту» программного кода, стоит на втором месте.
Стив Макконнелл, автор бестселлера «Совершенный код», приводит несколько таких факторов и не выделяет среди них основного:
Джоэл Спольски (автор «Руководства по подбору программистов и управлению ими»), который давно занимается наймом профессиональных разработчиков, считает, что основных составляющих профессионализма всего четыре:
Автор книг «Чистый код» и «Как стать профессионалом разработки ПО» Роберт Мартин утверждает, что основным фактором профессионализма разработчика является его способность писать «чистый» поддерживаемый код, но приводит также несколько сопутствующих факторов:
Мы составили свой перечень таких критериев и назвали его «Матрица профессионализма программиста». Это всего четыре параметра — по два для программиста и разрабатываемого им программного обеспечения:
***
Рассмотрим каждый из четырех факторов.
1. Программное обеспечение должно выполнять задачу. Это очевидное утверждение. Если нужно написать программу, которая что-то делает, то хорошей программой будет считаться та, которая действительно это делает. Сюда мы включаем все, что касается требований к разрабатываемому программному обеспечению, в том числе скорость его работы, безопасность, устойчивость к заявленным в требованиях нагрузкам и общая отказоустойчивость.
2. Программное обеспечение должно быть поддерживаемым. Тоже очевидное утверждение. Сюда относится не только качественно написанный код, но и грамотно продуманная, легкая в понимании архитектура, а также, в ряде случаев, корректно составленная документация — начиная от комментариев в программном коде и заканчивая набором UML-диаграмм, в зависимости от необходимости и масштабов проекта.
3. Программист должен быть работоспособным и выполнять задачи. Этот критерий можно усложнять, но на самом деле он очень прост: программисту поставили задачу — если он эту задачу выполнил в указанный или разумный с точки зрения его руководства срок, значит, все хорошо. Если заказчик доволен результатом и разработанный продукт или новая функциональность выполняют поставленные перед ним задачи — можно считать, что программист свою задачу тоже выполнил.
4. Программист должен быть «поддерживаемым». Этот фактор включает в себя прежде всего умение работать в команде. Но на самом деле он несколько шире: это может быть и самостоятельность, и нормальное взаимодействие с руководством или другими отделами, и адекватность при передаче проекта другому разработчику, если возникла такая необходимость.
Большинство перечисленных выше факторов можно объединить в эту матрицу, причем все параметры, имеющиеся в матрице, тесно связаны и взаимозависимы. Тем не менее есть кое-что, что в эту матрицу не укладывается. Мы пришли к выводу, что у профессионализма есть какая-то основа, движущая сила. И есть люди, которые еще не соответствуют всем критериям профессионализма, но уже адекватно себя оценивают, очень быстро растут и вполне могут быть наняты на работу как перспективные сотрудники.
Этими людьми движет сила, которая заставляет их не только развиваться как профессионалов, но и выполнять задачи, которые перед ними стоят: и выполнять самим, и делать так, чтобы результаты их работы тоже функционировали и выполняли какие-то свои задачи. Более того, эта сила объединяет все четыре фактора «Матрицы профессионализма» и выступает их причиной. Имя этой силы — интерес.
Теоретическая подготовка | ||||
---|---|---|---|---|
2n (Уровень 0) | n2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | |
Структуры данных |
Не может объяснить разницы между Array (массивом) и LinkedList (связным списком) | Способен объяснить принцип работы массивов, списков, словарей и использовать их для решения практических задач | Осознает, какие компромиссы между объемом занимаемой памяти и быстродействием имеют место в базовых структурах данных, какие операции и почему легче выполнять для массивов, а какие — для списков. Может привести и объяснить способы реализации хеш-таблиц и разрешений коллизий в них. Приоритетные очереди и способы их реализации. |
Знает и понимает продвинутые структуры данных: B-деревья, биномиальные и фибоначчи-кучи, красно-черных деревья, «выворачивающиеся» (Splay) деревья, слоеные списки (skip lists), префиксные и суффиксные деревья и т.п. |
Алгоритмы |
Не способен найти среднее значение чисел в массиве (сложно поверить, но случаются и такие кандидаты) | Знает основные алгоритмы сортировки, поиска, обхода и выборки даннных. | Деревья и Графы. Простые «жадные » алгоритмы и алгоритмы вида «разделяй-и-властвуй» (вроде QuickSort). Способен понять смысл обозначения уровней в этой матрице. |
Способен распознать и программно решить задачи динамического программирования, хорошо знает алгоритмы работы с графами, вычислительные алгоритмы. Способен распознать класс сложности задачи и т.п. |
Системное программирование |
Не знает, что такое компилятор, сборщик или интерпретатор. | Базовое понимание компиляторов, сборщиков и интерпретаторов. Понимает, что такое машинный код, и как все работает на аппаратном уровне. Некоторые знания в сфере виртуальной памяти. |
Понимает отличия пользовательского режима от режима ядра, многопоточность, примитивы синхронизации и то, как они реализованы. Способен читать машинный код. Понимает работу сетей, сетевые протоколы и программирование уровня сокетов. |
Понимает весь программный стек, детали аппаратной реализации (ЦПУ + Память + Кэш + Прерывания + Микрокоманды), сборки, статическое и динамическое связывание, компиляция, интерпретация, компиляция времени выполнения, сбор мусора, стек, куча, адресация в памяти… |
Инфраструктура разработки | ||||
2n (Уровень 0) | n2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | |
Системы контроля версий |
Архивные папки по датам | VSS и начинающий пользователь CVS/SVN | Имеет опыт в использовании возможностей CVS или SVN, умеет создавать ветки и сливать, настраивать свойства репозитория и т.п. | Знаком с распределенными системами контроля версий. Пробовал Bzr/Mercurial/Darcs/Git |
Автоматизация сборки |
Умеет собирать из ИСР (Интегрированная среда разработки — IDE) | Умеет собирать из командной строки | Может настроить скрипт для сборки системы | Может настроить скрипт для сборки системы, а также генерации документации, установочных пакетов, заметок о выпуске и для установки соответствующих меток в системе контроля версий. |
Знание средств разработки |
Ограничено «родной» ИСР (IDE) (VS.Net, Eclipse и т.п.) | Знает о некоторых альтернативных средствах, представляет возможности других ИСР. | Хорошее знание редакторов, отладчиков, ИСР, свободных альтернатив и т.п. Приветствуется знание, например, программ из из списка Скотта Хансельмана | Сам автор утилит и скриптов, желательно опубликованных. |
Работа со средой |
Использует ИСР для правки текстов. | Детальнее знаком с интерфейсом, способен эффективно пользоваться средой посредством меню. | Знаком с горячими клавишами для часто используемых операций. | Создает собственные макросы и расширения. |
Написание |
Не приходилось писать сценариев | Командные скрипты ОС, JS for scripting | Perl/Python/Ruby/VBScript/Powershell | Создал и опубликовал повторно используемые сценарии. |
Программирование | ||||
2n (Уровень 0) | n2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | |
Декомпозиция задачи |
«Линейное» кодирование; повторное использование путем копирования-вставки. | Способен разбить задачу на несколько функций | Способен создать повторно используемые функции/объекты, которые решают общую задачу | Используя соответствующие структуры данных и алгоритмы получает обобщенный/объектно-ориентированный код, в котором инкапсулированы и нужным образом выделены те аспекты задачи, которые могут измениться. |
Декомпозиция системы |
Не мыслит шире уровня отдельного класса/файла | Способен декомпозировать задачу и спроектировать решение, но оставаясь в рамках той же технологии/платформы. | Способен проектировать системы, простирающиеся на несколько технологий/платформ. | Способен представлять и проектировать сложные системы из множества продуктов с интеграцией с внешними системами. |
Организация кода |
Никаких признаков организации кода | Методы сгруппированы логически или по уровням видимости | Код оформлен в регионы и достаточно прокомментирован | Файл четко структурирован, документирован, все пробелы и новые строки расставлены в соответствии со стандартом кодирования. Файл выглядит идеальным. |
Организация кода |
Не принимает во внимание организацию файлов в папки. | Связанные файлы сгруппированы в папки. | Каждый файл имеет четкую единственную цель, например, определение одного класса, реализация одной возможности и т.п. | Организация кода на физическом уровне соответствует дизайну. Просмотр имен файлов и папок дает представление об архитектуре данного фрагмента системы. |
Организация проектов в решении |
Разделение на проекты практически отсутствует (например, и слой UI, и логика, и данные — в одном проекте) | Базовое разделение проектов по уровням. | Бинарные внешние сборки, документация, внешний код, результаты сборки — все логично организовано в соответствующие папки. Контролирует зависимости между проектами. | Физическое расположение исходников в дереве соответствуюет логической структуре и организации системы. Просмотр имен файлов и папок дает представление об архитектуре системы. |
Читаемость кода |
Однобуквенные имена | Смысловые имена для файлов, переменных, методов, классов и т.п. | Нет длинных функций; необычный код, исправления ошибок, предположения — прокомментированы | Допущения верифицируются с помощью Assert или контрактов кода. Поток выполнения выглядит естественно, нет слишком глубокой вложенности условий или вызовов. |
Навыки общения |
Не может донести мысли/идеи коллегам. Орфографические и грамматические ошибки. | Может донести мысли/идеи коллегам. Грамотная речь и письмо. | Способен эффективно обсуждать архитектурные и прочие детали с коллегами. | Способен понимать и сообщать мысли/архитектурные идеи/спецификации в непротиворечивой форме и в общении ориентируется на контекст (на понимание собеседниками друг друга). Может обучать других. |
Автоматизированное |
Считает, что все тестирование — работа тестировщика | Пишет автоматические тесты, приходит к созданию хороших тестов для уже написанного кода | Пишет код в манере РЧТ (разработка через тестирование, TDD) | Способен настроить автоматизированные функциональные, нагрузочные и тесты интерфейса. |
Защитное |
Не понимает, что это такое | Проверяет все переданные параметры, декларативно проверяет допущения в коде. | Проверяет возвращаемые значения и проверяет на исключения код, который может их выбросить. | Имеет собственную библиотеку для защитного кодирования; пишет модульные тесты для проверки работы в случае некорректных условий. |
Обработка ошибок |
Кодирует в расчете на отсутствие ошибок. | Базовая обработка кода, который может выбросить исключение/сгенерировать ошибку. | Убеждается, что ошибки/исключения оставляют программу в корректном состоянии, освобождаются все ресурсы, требующие освобождения: память, подключения и др. | Старается не допустить возникновения исключений путем упреждающих проверок, поддерживает общую стратегию обработки исключений во всех слоях приложения. Предлагает набор общий правил для обработки исключений во всей системе. |
Отношение |
Берет требования и реализует их формально | Ставит вопросы по упущеным ньюансам в требованиях | Понимает общую картину и указывает на целые сферы, которые нужно уточнить/доописать | Способен предложить лучшие альтернативы предлагаемым решениям исходя из личного опыта |
Базы данных |
Считает базой данных Excel | Знаком с основными концепциями, нормализаций, ACID, транзакциями, и способен писать простые запросы. | Способен проектировать хорошие нормализованные схемы, учитывая при этом типичные запросы, которые будут производится. Профессионально использует отображения (View), хранимые процедуры, триггеры и типы, определяемые пользователем. Понимает отличие кластерных индексов от некластерных. Профессионально использует средства объектно-реляционного отображения. |
Способен осуществлять базовое администрирование БД, настройку производительности и оптимизацию индексов. Создавать сложные запросы, заменять использование курсоров на выражения SQL. Представляет, как данные и индексы физически организованы. Понимает, как база может быть зеркалирована, реплицируема. Понимает, как работает двухфазная фиксация (commit). |
Опыт | ||||
2n (Уровень 0) | n2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | |
Профессионально используемые языки |
Императивные или объектно-ориентированные | Императивные, объектно-ориентированные и декларативные (SQL). Понимает отличия статической и динамической, сильной и слабой типизации. Статический вывод типов. |
Функциональные. Ленивые вычисления, каррирование, продолжения (континуации, continuations) | Параллельные (Erlang, Oz) и логические (Prolog) |
Самообразование и развитие |
||||
2n (Уровень 0) | n2 (Уровень 1) | n (Уровень 2) | log(n) (Уровень 3) | |
Изучаемые языки/сфера интересов |
Императивные или объектно-ориентированные | Императивные, объектно-ориентированные и декларативные (SQL). Понимает отличия статической и динамической, сильной и слабой типизации. Статический вывод типов. | Функциональные. Ленивые вычисления, каррирование, продолжения (континуации, continuations) | Параллельные (Erlang, Oz) и логические (Prolog) |
Знакомство с технологиями |
Не следит за новыми выпусками платформ, сред разработки и т.п. | Ознакамливается с планами выпусков, представляет, о каких продуктах идет речь | Загружает предварительные версии продуктов, читает статьи, руководства. | Экспериментирует с предварительными версиями, создает пробные решения. Опубликовывает интересные результаты для сообщетва. |
Интерес — это эмоция, которая заставляет индивида в течение продолжительного времени заниматься определенным видом деятельности. Интерес играет ключевую роль для приобретения навыков и развития интеллекта. Это единственная эмоция, которая позволяет выполнять повседневную работу должным образом.
Известно, что есть несколько видов мотивации — как положительной, так и отрицательной. Интерес можно считать наиболее естественным и глубоким из них. Достигая успехов, пусть даже совсем небольших, человек чувствует наиболее полное удовлетворение, если основной его движущей силой была эмоция интереса, а не какой-то другой фактор.
Я убежден, что единственной вещью, которая помогла мне продолжать работу, было то, что я любил свое дело. Вам надо найти то, что вы любите.
Стив Джобс
Интерес обладает колоссальной мотивирующей силой и не только помогает начать какую-то работу, но и дает энергию для ее завершения. Чтобы специалист мог приобрести навыки или справиться с какой-то серьезной задачей, его интерес должен быть сильным, глубоким и устойчивым. Это не должно быть просто поверхностное любопытство.
Я выделяю три взаимозависимых составляющих так называемого профессионального интереса, по которым можно проверить, достаточен ли интерес для плодотворной и эффективной работы или это простое любопытство:
Состояние, при котором человек испытывает интерес, давно известно человечеству. Разные люди называют его по-разному: кто-то говорит, что это интеллектуальный транс. Действительно, увлеченность своим делом очень похоже на состояние транса. Но наиболее частое название этого состояния — поток. У психолога Михая Чихсентмихайи есть книга «Поток: психология оптимального переживания», в которой изложена вся исчерпывающая информация по этой теме. Хотелось бы отметить лишь то, что способность испытывать состояние потока может отличаться у разных людей в зависимости от психологических особенностей и контекста.
Очень часто находятся «в потоке» дети. Это видно, когда ребенок чем-то занят: у него приоткрыт рот и широко открыты глаза. Это типичные проявления эмоции интереса. При этом дети очень злятся, если их «вырываешь» из потока, поскольку в этом состоянии личность растет и развивается. У некоторых людей способность входить в состояние потока и удерживаться в нем хорошо сохраняется на протяжении всей жизни.
Главное — не прекращать задавать вопросы. Никогда не теряйте священной любознательности!
Альберт Эйнштейн
Активный интерес мотивирует человека к спонтанной деятельности и к экспериментам. Мой отец, купив мне первый компьютер, сказал: «Делай с ним, что захочешь, нажимай любые кнопки, но только чтобы из него не пошел дым». Помню, как первое время к нам приходил сосед, чтобы переустановить мне на компьютере Windows 95. Потом, методом проб и ошибок, постоянно интересуясь у соседа, как решать разные проблемы и устанавливать драйвера, я научился переустанавливать Windows самостоятельно. На первом курсе университета я стал зарабатывать установкой Windows и дополнительного ПО на компьютеры однокурсников и преподавателей.
Мне кажется, эта история хорошо показывает, как интерес и эксперименты помогают развивать навыки и умения. Но есть и обратный пример. Наверняка многие из вас сталкивались с людьми старшего возраста, которые боятся подходить к компьютеру, боятся «нажать что-то не то». Этот страх ошибки и, следовательно, страх эксперимента — одно из самых распространенных препятствий к обретению опыта и развитию личности.
Если человек не испытывает эмоции интереса или мешает его реализации, его интеллектуальные способности угасают. Если же ему интересно, он будет молодо себя чувствовать и молодо выглядеть, даже если ему уже за 80 лет.
Отличный пример — мой учитель, директор НИИ физико-химической биологии А.Н. Белозерского, академик РАН Владимир Петрович Скулачев. Он уже много десятилетий занимается изучением митохондрий, а последние 20 лет — разработкой средства, которое «выключает» один из механизмов старения. Ему уже больше 80 лет, он прекрасно себя чувствует, руководит большим институтом и является самым цитируемым биологом России.
Я проработал с ним много лет и видел, что ему по-настоящему интересно заниматься тем, чем он занимается. Он может позвонить коллеге в ночь с воскресенья на понедельник, чтобы проконсультироваться, или часами выяснять суть какой-то научной проблемы. Это настоящий, истинный профессионализм.
Михай Чихсентмихайи выделяет ряд психологических особенностей личности и социальных препятствий, которые могут мешать достижению состояния потока, то есть проявлению эмоции интереса. «Внутренние» препятствия он объединяет в две категории:
Социальные препятствия, мешающие достижению состояния потока и проявлению эмоции интереса, также представлены двумя видами: аномией и отчуждением. Аномия в обществе — это дезориентированность, неясность целей и правил, при которой личность не понимает, что ей нужно делать, как ей жить, самореализовываться и добиваться успехов. В противоположной ситуации — при отчуждении — личность испытывает отвращение к обществу, поскольку в целях выживания вынуждена заниматься тем, что ей не только неинтересно, но и бесполезно.
Все эти препятствия создают дисбаланс и мешают человеку управлять своим вниманием. Они не позволяют человеку заниматься тем, что ему по-настоящему интересно, не позволяют интересу проявляться в полной мере, а, следовательно, приобретать знания, умения и навыки в той области, в которой человек мог бы стать профессионалом высочайшего уровня.
Как уже было сказано, активный, глубокий и постоянный интерес самым естественным образом приводит к развитию умений и навыков, то есть к приобретению опыта. Из семени интереса, если не мешать и не создавать препятствий, вырастает большое и пышное дерево опытной и взрослой личности с крепкими корнями — здоровой уверенностью в том, что делаешь, в своих силах и возможностях. Мы измеряем профессионализм по двум шкалам:
Первая шкала — это шкала профессионального интереса. По ней мы можем определить наличие профессионализма. Для простоты мы используем бинарную шкалу: профессионал или непрофессионал. Если мы измеряем профессионала только по этой шкале, мы должны понимать, что профессионал может быть не только очень опытным мастером своего дела, но и начинающим или даже потенциальным.
Для наглядности приведу пример: вы приходите в гости к знакомым и видите, как их семилетний сын виртуозно играет на скрипке. Можно ли его считать полноценным профессионалом экстра-класса и мастером своего дела? Скорее всего, таким его считать еще рано. Мы не знаем, укрепится ли его профессионализм, станет ли он музыкантом, обычным или великим. Но в данный момент по бинарной шкале он, конечно же, профессионал. Да, еще совсем неопытный, начинающий — но уже профессионал.
Вторая шкала — это уже, собственно, шкала уровня профессионализма, уровня развития личности, ее умений и навыков. Сюда мы включаем не только так называемые hard skills — конкретные компетенции в конкретной профессиональной сфере, — но и личностные особенности человека. Мы глубоко убеждены: если личность развивается гармонично и беспрепятственно, то она вырастает здоровой и полноценной. Если развитие шло от интереса, то личностные качества дополняют узкие компетенции, которые особенно нужны в работе.
Хотелось бы чуть глубже рассмотреть некоторые важные личностные характеристики, которыми в той или иной степени должен обладать настоящий профессионал. Если мы говорим о программистах, то эти характеристики относятся к «поддерживаемости» самого программиста как личности — к его
продолжение следует...
Часть 1 1.7. Профессии для создания и обслуживания веб сайтов
Часть 2 Образование - 1.7. Профессии для создания и обслуживания веб сайтов
Часть 3 Составляющие профессионализма - 1.7. Профессии для создания и обслуживания веб
Часть 4 Тесты с ответами для самопроверки онлайн - 1.7. Профессии для
А как ты думаешь, при улучшении профессии для создания и обслуживания веб сайтов, будет лучше нам? Надеюсь, что теперь ты понял что такое профессии для создания и обслуживания веб сайтов, верстальщик, тестировщик, бекэнд, фронтэнд, фуллстек, программист, devops и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Основы интернет и веб технологий
Ответы на вопросы для самопроверки пишите в комментариях, мы проверим, или же задавайте свой вопрос по данной теме.
Комментарии
Оставить комментарий
Основы интернет и веб технологий
Термины: Основы интернет и веб технологий