Программирование, машинное обучение, и жизнь
Я был свидетелем многих революционных технологий. Объектно-ориентированное программирование, новые языки программирования, Веб, распределенные приложения, server-side и client-side frameworks, мобильные приложения, геолокация, машинное обучение. Было и немало нишевых технологий, например от Microsoft, которые создавались как будто только для того, чтобы разработчики тратили все свое время на обновление прошлогодних программ.
Иногда рано оседлав быстро растущий тренд можно было сделать на нем карьеру или состояние. А порой, потратив кучу времени на новый крутой язык программирования с лучезарным гуру-изобретателем, в лучшем случае получаешь лишь новый интересный опыт и может быть некоторую долю сожаления, что не лучшим образом инвестировал свое время.
В вопросе пробовать новое или нет, я зачастую склоняюсь к пробовать, даже если прямо сейчас практическая польза пока не очевидна. Может быть новая тема принесет энергию. Многие из нас стали программистами потому что было очень интересно разбираться как устроены компьютеры и что интересного можно с ними сделать. Может быть получится связать ее с другими областями, в которых я хорошо разбираюсь, и сделать что-то новое, чего не было до меня. Может быть просто внедрение новой темы в моем окружении будет полезным для команды, а мне даст научиться многим лидерским фишкам и вырастит мой социальный статус.
Найти время для того, чтобы хорошенько вникнуть в новые штуки, удается далеко не всегда. Жизнь и без того заполнена текущими проектами на работе и различной нетехнической активностью, которой было намного меньше в студенческие годы (семья, дети, финансы, быт, забота о теле). Да и вообще в свободное от работы время не очень хочется снова садиться за компьютер, на котором всегда есть риск открыть рабочую почту, что-то “быстро починить” и вечер потерян.
Я стал замечать, что про некоторые новые направления я пишу в свой личный дневник, читаю какие-то вводные материалы, понимаю что они очень важны, но тем не менее долгое время лишь плаваю в них на поверхности, упуская кучу возможностей. Это становится особенно заметно, когда коллеги, разобравшиеся в новых темах, начинают жечь по полной.
С другой стороны есть большие стабильные направления, которые объединяясь и перемешиваясь рождают все эти новые горячие темы. Современное машинное обучение, например, опирается на линейную алгебру, анализ (производные), быстрое специализированное железо и распределенные вычисления.
Если хорошо освоить несколько таких направлений (не только по книжкам и курсам, но и в реальной практической деятельности), то есть все шансы со временем самому генерировать новые идеи, или как минимум намного быстрее разбираться в новых модных веяниях, понимая из каких знакомых кубиков они сложены.
ETH - цюрихский политех
Я учился программированию самостоятельно, поэтому в процессе налетал на скалы из-за пробелов в Computer Science. Порой я наскоком осваивал новый язык программирования, фреймворк, новую область разработки, начинал делать проекты, постепенно нарабатывал достаточный уровень экспертизы. Так было, например, когда я решил вернуться в разработчики после ролей тимлида в банке и CEO маленького стартапа. До этого я много писал на С++, а один мой друг фанател от Python + Django и с горящими глазами рассказывал всем, что это самая клевая связка для создания веб-приложений. Веб вдохновлял меня тогда меня тем, насколько просто и элегантно разные системы общались с друг другом. Это был 2009 год, тогда все говорили об открытых веб-стандартах, я делал для своего блога логин через Open ID, добавлял поддержку pingback и trackback. Восхищался насколько Rest + JSON проще замороченных систем, используемых в корпоративной среде. Код на Python занимал намного меньше места, чем на C++, было много удобных библиотек на все случаи жизни. У Django был красивый зелененький сайт и прикольная тусовка core developers.
Иногда с таким же ковбойским воодушевлением я залезал в новую для меня тему и через несколько дней застревал там, неспособный двинуться дальше. Так было давным давно, когда я пытался самостоятельно разобраться с веб-программированием в 90-е, когда на моем компьютере еще стояла Windows. Когда пытался изучить дискретную математику по чрезвычайно лаконичной книге Новикова. Когда не смог портировать систему парсинга на ANTLR. Когда не смог быстро разобраться как сделать цифровые аудио-фильтры, имитирующие их аналоговых собратов.
Где-то мне не хватало важных строительных блоков. Теории языков программирования для эффективного использования ANTLR. Теории цифровой обработки сигналов для аудио-фильтров. Иногда мне скорее не хватало приятеля с Linux или хорошего учебника, пригодного для самостоятельной работы. Иногда я вкладывал кучу времени в изучение базовых наук в ущерб реальным практическим задачам. Базовые науки - это хорошо, но если так и не дойти до практических задач, то их не удастся освоить достаточно глубоку и со временем они просто забудутся.
Идти в глубину в новых трендах и глубоко изучать фундаментальные области - довольно разные по характеру активности.
По новым вещам еще не написаны книги и не созданы онлайн-курсы. Они сильно меняются в процессе и сегодня кажется что это будет большой успешной темой, а завтра ты уже не так в этом уверен, послезавтра снова появляется надежда. Ничего еще толком не работает, все нужно обрабатывать напильником. Зато можно написать авторам статей и они будут рады помочь. Помогает найти тусовку людей, увлеченных этой темой, развивающих ее. Читать их статьи, посты, обмениваться новинками, предлагать новые идеи. Если повезет - пить вместе кофе, участвовать в хакатонах и конкурсах. Пока тема еще нова и академические зубры обходят ее стороной, смелость и активность значат больше тут больше, чем послужной список или профильный PhD.
Большие фундаментальные темы - другие. Они включают в себя десятилетия опыта тысяч умнейших людей. Входить в них нужно аккуратно и основательно. Нужны подходящие уровню и задачам книги, если повезет - курсы. Много читать, решать задачки. Нужен механический карандаш или очень легкая роликовая ручка и много-много блокнотов. Очень помогает концепция reading group - группа единомышленников, изучающих эту же тему, собирающиеся чтобы обсуждать непонятные моменты и вместе работать над сложными задачками. Эти сложные темы обходят стороной ковбои предпочитающие быстрые результаты, поэтому хорошо освоеные сложные темы могут стать большим конкурентным преимуществом.
Компьютерные нейронные сети выглядят совсем не так
Чтобы часть мозга, где прорастает изучаемая область, соединилась с другими активными его частями, очень важна практическая деятельность. Написать первую небольшую программу на новом языке. Портировать какой-то вспомогательный инструмент на новую технологию. Сделать проект just for fun. В процессе бнаружишь подводные камни, может быть поможешь другим их обойти. Напишешь статью или сделаешьдоклад, чтобы в процессе разобраться в новом вопросе намного глубже.
Когда результаты становятся полезны другим людям, то возможностей для дальнейшего практического изучения новой технологии становится больше - просят помочь что-то сделать в соседнем проекте, приглашают в качестве эксперта, зовут создавать команду по этому направлению в новый интересный проект.
Теперь эта новая область хорошо переплелась и усилила все уже наработанные навыки и можно снимать сливки - делать новые прорывные продукты, выступать на конференциях, писать книги.
comments powered by Disqus