Из этой статьи вы узнаете больше о том, как формирование более широкого диапазона культуры программирования поможет вам работать еще лучше как программист.
Многие проекты и вакансии в жизни наших разработчиков следуют этому шаблону:
I - фаза возбуждения,
II - фаза обучения,
III - комфортная фаза,
IV - фаза «Пора двигаться дальше».
Все последующее адресовано вам, если вы находитесь в фазе IV и чувствуете, что пора уходить со своего проекта / должности / работы / компании.
Пару месяцев назад у меня была фаза IV на моей предыдущей работе, я сменил работу, и теперь я работаю в Doctolib. Что делает мою историю необычной, так это то, что я изменил жизни в процессе.
Я был разработчиком C ++ в течение 10 лет, очень активно участвовал в сообществе C ++, и во многих кругах по C ++ считался экспертом. В те годы я занимался только прикладной разработкой. Это означает чистую разработку программного обеспечения в отличие от веб-разработки.
Сейчас я веб-разработчик в Doctolib, а это значит, что я работаю над внешним интерфейсом, отправляющим HTTP на бэкэнд, с компонентами React и Javascript, Ruby on Rails, PostgreSQL и Redis, а также с HTML и CSS. Я ничего об этом не знал, когда был разработчиком на C ++.
С технологической точки зрения это новая жизнь.
Из этого карьерного роста я понял, что изменение технической среды было самым эффективным стимулом для развития навыков программирования, который я когда-либо видел.
Точнее, смена языка на короткое время снижает вашу продуктивность, потому что вам нужно к этому привыкнуть. Есть фаза «адаптации», на которой вы менее продуктивны, чем если бы вы придерживались своего предыдущего языка.
Фаза «адаптации» очень интенсивна в обучении. Вы узнаете что-то, просто приходя на работу, и ваши навыки очень быстро растут.
Это повышение происходит при работе в среде с другим языком программирования, а не только в новом проекте, новой компании или новых людях.
Они также заставляют разработчика расти, но выбор нового языка на работе, отличного от того, который вы освоили, дает вам уникальные преимущества.
Я подробно объясню, что дает вам смена языков, повышающая ваши навыки программирования. Но сначала давайте проясним распространенное заблуждение: когда вы получаете новую работу с другим языком, вы не возвращаетесь на круги своя.
Вы не начинаете с нуля
Будучи разработчиком C ++, когда я искал новую работу, я сначала сосредоточил свой поиск на предложениях C ++. Я подумал, что, учитывая время, которое я потратил годами на освоение C ++, было бы стыдно отбросить эти знания и начать все сначала как младший разработчик на новом языке.
Но это ошибочное мнение, и наши рекрутеры часто видят это заблуждение в сознании инженеров-программистов, особенно в Европе:
Это заблуждение, потому что существует огромное количество вещей, которые не зависят от языка при написании кода.
Например, когда вы пишете C ++, вы задаете себе те же вопросы, что и при написании Ruby или JS:
- Какие абстракции я должен определить в своем коде?
- Что идет в интерфейсе? Что входит в реализацию?
- Должен ли я извлечь этот код в функцию? В классе?
- Как я могу написать выразительное if утверждение?
- Каков разумный способ протестировать этот код?
- Какая часть кода должна получить определенную ответственность?
- Какой фрагмент кода должен зависеть от чего?
- Что такое доброе имя?
Эти темы больше относятся к разработке программного обеспечения, чем к конкретному языку. Это означает, что как только вы овладеете ими на одном языке, вам не придется изучать их снова. Единственное, что осталось изучить, - это инструменты, которые новый язык дает вам для выражения этих намерений.
Другими словами, опытный разработчик знает, что он хочет сказать в коде. Остается выучить новый язык, как его выразить. А это много новых знаний и веселья.
Еще одно интересное явление заключается в том, что языки программирования похожи на разговорные языки в том смысле, что чем больше языков вы знаете, тем быстрее вы сможете освоить новый. Это означает, что ваш первый язык программирования, возможно, было трудным для изучения, но ваши будущие будут становиться все проще и проще.
Дополнительный взгляд на программирование
Работа с новым языком не только увеличивает ваши знания. Это дает вам новый взгляд на общую схему программирования.
Это означает, что то, что вы знаете на определенном языке, улучшает ваш код на других языках.
Приведу конкретные примеры из личного опыта. Подводя итог моему языковому диапазону, я имел возможность получить:
- 10-летний опыт работы в профессиональном C ++ и сторонних проектах,
- пару месяцев Ruby on Rails и React JS в профессиональной среде,
- пару десятков часов Haskell над сторонними проектами,
- завершающая последовательность других языков, которые я опробовал.
Вот некоторые из уникальных вещей, которые я узнал на одном из этих языков и которые изменили мой способ программирования на всех других.
Упор на функции в Haskell заставил меня изучить стандартную библиотеку алгоритмов C ++ и положиться на нее.
Ruby, «оптимизированный для счастья программистов», и Rails, созданный по «принципу широкой улыбки», очень приятны в работе и показали мне, как выглядит красивый код.
Идиома бесточечного программирования Haskell заставила меня использовать `&` и `method` в Ruby.
Строгая типизация C ++ классов перечисления C ++ заставила меня избегать повторяющихся строк в Ruby и JS.
Девиз «конвенция над конфигурацией» в Rails показал мне, как выглядит отделение связующего кода от бизнес-кода.
Объекты JS позволили мне комфортно работать с JSON на всех других языках.
Тот факт, что Ruby и JS не имеют статических типов, тогда как C ++ и Haskell имеют столько статической типизации, сколько возможно, заставил меня увидеть, где типы полезны, а где никакие типы не освобождают вас.
Передача объектов из бэкэнда во внешний интерфейс выглядит как утиная типизация на стероидах по сравнению с утиной типизацией шаблонов C ++, но концепции C ++ («концепты» - это название языковой функции C ++) выглядят как утиная типизация на стероидах по сравнению с передачей объекта из внешнего интерфейса на бэкэнд.
Скомпилированные языки, такие как C ++ VS интерпретируемые языки, такие как Ruby, показали мне компромисс между скоростью разработки и скоростью выполнения.
Динамическое метапрограммирование Ruby расширило мой взгляд на статическое метапрограммирование C ++.
C ++ научил меня, как безопасность исключений может структурировать дизайн вашего кода.
Экосистема Rails для тестирования заставила меня задуматься о тестировании.
И список продолжается!
Я никогда не смог бы выучить вышеперечисленные выводы, придерживаясь одного языка, даже если бы я провел на нем 30 лет.
Открытие нового языка в профессиональной среде расширяет ваш взгляд на программирование и показывает вам то, что вы никогда не подумали бы возможным при переходе на другой язык.
Однако, чтобы максимально использовать этот опыт, лучше всего выбрать язык, максимально отличный от того, над которым вы работаете. Например, не выбирайте Java или C #, если вы работаете на C ++, не выбирайте Ruby, если вы работаете на Python, и так далее.
Большой урок также можно получить, изучая новую парадигму, например, функциональное программирование, если у вас еще не было возможности попробовать его, или переход на типизированный язык, если вы знакомы с нетипизированным.
Лучше разбирайтесь в сложных темах
В программировании есть сложные темы, которые не зависят от одного конкретного языка, и с которыми я всегда боролся.
Смена стека проливает новый свет на эти темы и открывает новые подходы к ним.
Я возьму два примера таких сложных тем: компонентность и тестирование.
Большинство компаний, которые сталкиваются с этими двумя вопросами, в какой-то момент сталкиваются с этими двумя вопросами:
- Как мы можем разбить наше программное обеспечение на компоненты, чтобы продолжать расти, но поддерживать управляемую когнитивную нагрузку?
- Как мы можем продолжать расти и иметь удобный набор тестов?
Это сложные темы программирования, так как не существует руководств, которые решали бы эти вопросы так же, как как написать оператор if или перехватить исключение.
Более того, в сообществе разработчиков программного обеспечения существует много путаницы по этим двум темам, и когда руководство просит вас как-то в них разобраться, это усугубляет путаницу. Я всегда боролся с этими двумя темами.
Как и любая компания, Doctolib хочет масштабировать свой код и набор тестов, поэтому, когда я присоединился, я снова столкнулся с этими проблемами. Но ситуация была другой. Раньше я сталкивался с ними на C ++, а теперь видел их в свете Rails и React, а также в технической среде Doctolib.
Тестирование кода C ++ или его разбиение на компоненты сильно отличается от выполнения этого в Ruby, но есть некоторые сходства. Увидев различия и сходства, вы сможете взглянуть на компоненты и тестирование с высоты 20 000 футов. И это устраняет большую путаницу.
Что именно я узнал о компонентности и тестировании, это темы целых сообщений в блоге (которые я сейчас пишу). Но дело в том, что рассмотрение сложной проблемы на двух разных языках дает неоценимое понимание.
Обучение на работе, а не обучение дома
Изучение нового языка может происходить в двух контекстах:
- На работе, если вы переходите к проекту на незнакомом языке
- В личное время, на побочных проектах дома или на встречах
Домашнее обучение дает максимальную гибкость, позволяя опробовать языки и быстро отказываться от них. Но обучение на работе - это то, как извлечь максимальную пользу из языка.
Действительно, работа с языком в профессиональной среде дает вам много часов практики, каждый рабочий день, в течение длительного периода времени, и вы можете работать над реальными проблемами. Более того, новые коллеги на работе - бесконечный источник обучения через парное программирование, наставничество и неформальные беседы.
Если вы привыкли к своему текущему языку, сейчас самое время двигаться дальше, менять проекты, возможно, сменить компанию и работать на совершенно другом языке. Это повысит ваши навыки и увеличит радость от программирования.
Мы нанимаем в Doctolib, но принимаем только разработчиков с большим опытом работы с Ruby on Rails и React JS.
Нет, шучу. Мы приветствуем инженеров-программистов, которые хотят повысить свои навыки, перейдя на новый стек. Мы ищем людей, у которых есть желание учиться. Посетите нашу страницу вакансий.
Я также рекомендую вам подписаться на нашу рассылку технических новостей. Каждый вторник вы будете получать 12 избранных ресурсов по React, Rails, рекомендациям по разработке программного обеспечения и прочим материалам для компьютерных фанатов. Это мой личный ресурс по этим темам.