Привет, друзья! Решил завести свой блог про Питон, ИИ, карьеру в IT и всё, что с этим связано. Надеюсь, здесь будет дружелюбная атмосфера и каждый интересующийся сможет найти для себя что-то полезное.
Обо мне: программирую на Питоне примерно с 2012 года, с 2014 стал заниматься такой областью искусственного интеллекта как автоматическая обработка текстов. Сейчас я NLP-техлид в одной российской IT-компании. Наша команда применяет современные технологии глубокого обучения для обработки текстов на разных языках. До этого я успел поработать в нескольких зарубежных компаниях в бэкенд-разработке, анализе данных и машинном обучении. До перехода в IT долго работал преподавателем в вузе. Изначально моё образование гуманитарное, педагогическое; как ни странно, оно порой здорово помогает в моей IT-карьере.
В этом блоге я буду делиться знаниями и личным опытом в тех областях, где что-то понимаю. Для меня важно помогать людям, как и мне когда-то помогали мои учителя и более опытные коллеги.
Обо мне: программирую на Питоне примерно с 2012 года, с 2014 стал заниматься такой областью искусственного интеллекта как автоматическая обработка текстов. Сейчас я NLP-техлид в одной российской IT-компании. Наша команда применяет современные технологии глубокого обучения для обработки текстов на разных языках. До этого я успел поработать в нескольких зарубежных компаниях в бэкенд-разработке, анализе данных и машинном обучении. До перехода в IT долго работал преподавателем в вузе. Изначально моё образование гуманитарное, педагогическое; как ни странно, оно порой здорово помогает в моей IT-карьере.
В этом блоге я буду делиться знаниями и личным опытом в тех областях, где что-то понимаю. Для меня важно помогать людям, как и мне когда-то помогали мои учителя и более опытные коллеги.
Какие темы наиболее интересны? Также можете писать свои варианты в комментариях.
Anonymous Poll
36%
Базовый Питон
61%
Продвинутый Питон
78%
Машинное обучение и искусственный интеллект
64%
Поиск работы, собеседования, карьера
44%
Работа с людьми, гибкие навыки (soft skills)
Навигация
Хэштеги внутри блога, по которым можно найти посты на интересующие вас темы:
#py_basic - инсайты и лайфхаки для начинающих в Питоне, а также разборы несложных задач. Основано на большом опыте преподавания Питона с нуля.
#py_advanced - более продвинутые и специфические трюки и инструменты, разборы сложных задач.
#ml - про машинное обучение, интеллектуальный анализ данных, особенно в сфере обработки текстов. Истории из опыта (правда, не обо всём можно рассказывать из-за NDA).
#career - советы по продвижению карьеры в IT, прохождение собеседований, как найти первую работу и т.д.
#soft_skills - как эффективно общаться с коллегами, управлять временем, эмоциями, своим развитием.
Голосование:
https://news.1rj.ru/str/plush_python/5
Об авторе:
https://news.1rj.ru/str/plush_python/4
Хэштеги внутри блога, по которым можно найти посты на интересующие вас темы:
#py_basic - инсайты и лайфхаки для начинающих в Питоне, а также разборы несложных задач. Основано на большом опыте преподавания Питона с нуля.
#py_advanced - более продвинутые и специфические трюки и инструменты, разборы сложных задач.
#ml - про машинное обучение, интеллектуальный анализ данных, особенно в сфере обработки текстов. Истории из опыта (правда, не обо всём можно рассказывать из-за NDA).
#career - советы по продвижению карьеры в IT, прохождение собеседований, как найти первую работу и т.д.
#soft_skills - как эффективно общаться с коллегами, управлять временем, эмоциями, своим развитием.
Голосование:
https://news.1rj.ru/str/plush_python/5
Об авторе:
https://news.1rj.ru/str/plush_python/4
Telegram
Плюшевый Питон
Какие темы наиболее интересны? Также можете писать свои варианты в комментариях.
Базовый Питон / Продвинутый Питон / Машинное обучение и искусственный интеллект / Поиск работы, собеседования, карьера / Работа с людьми, гибкие навыки (soft skills)
Базовый Питон / Продвинутый Питон / Машинное обучение и искусственный интеллект / Поиск работы, собеседования, карьера / Работа с людьми, гибкие навыки (soft skills)
Плюшевый Питон pinned «Навигация Хэштеги внутри блога, по которым можно найти посты на интересующие вас темы: #py_basic - инсайты и лайфхаки для начинающих в Питоне, а также разборы несложных задач. Основано на большом опыте преподавания Питона с нуля. #py_advanced - более продвинутые…»
4 ключевые идеи программирования
#py_basic
Мой путь к написанию кода за деньги, а не просто как хобби, был долог и тернист. К настоящему моменту я пробовал программировать на 10 разных языках, включая Python, Java, C++. Когда я (несколько лет) преподавал Питон с нуля, я обычно начинал с того, что знакомил студентов с четырьмя "ключевыми идеями программирования". Если хорошо усвоить эти идеи, то можно научиться писать код любой сложности, так как всё остальное, что есть в программировании, - лишь надстройка над этими четырьмя идеями.
1. Функции - это действия, которые умеет выполнять ваша программа. Программу можно представить в виде робота, который умеет, например, танцевать, делать уборку, ходить в магазин за хлебом и т.д. Все эти "умения" робота - это функции. Отдельно взятая сложная функция может состоять из более простых функций (действий). Например, функция "сходить за хлебом" может состоять из действий: "взять деньги", "построить маршрут до магазина", "дойти до магазина", "найти в магазине хлеб" и так далее.
2. Переменные - это то, как программа хранит знания о мире. Говоря образно, это такие коробочки с этикетками, на каждой из которых написано название. То, что написано на коробке, - это название переменной, а то, что внутри коробки, - это содержимое, которое переменная хранит (числа, текст, или более сложные объекты). В почти любой программе есть свой "склад коробок" - это все переменные, в которых хранятся знания о мире, заложенные в программе. Следуя нашему примеру про поход за хлебом, можно представить себе переменную-коробку с этикеткой money. Тогда внутри этой коробки должно лежать число, которое обозначает, сколько у нас есть денег.
3. Ветвления - это логика принятия решений внутри нашей программы. Её можно представить в виде простых правил, на которые наша программа-"робот" ориентируется при совершении действий. Например, наш робот решает, покупать ему французский багет или нет. Он может сравнить стоимость багета (которая, допустим, "лежит" в коробке-переменной baguette_price) с количеством денег, которое у него осталось (переменная money). Если стоимость хлеба ниже, чем количество оставшихся денег, то нужно покупать. Конечно, логика робота может быть сколь угодно более сложной. :)
4. Циклы - это просто многократное повторение одних и тех же действий. Например, пока робот не нашёл подходящее хлебо-булочное изделие, он должен идти вдоль витрины и оценивать каждый товар в ассортименте. Когда хлеб найден, нужно прервать цикл (ведь дальше искать нет смысла) и идти к кассе оплачивать товар. Ещё может быть "маленький" цикл (оценить сегодняшний ассортимент в магазине) внутри "большого" цикла (каждый день ходить в магазин). В заключение можно вспомнить фильм "День сурка", где герой, по сути, застрял в бесконечном цикле, но в результате выполнения определённых действий ему всё-таки удаётся "вырваться".
#py_basic
Мой путь к написанию кода за деньги, а не просто как хобби, был долог и тернист. К настоящему моменту я пробовал программировать на 10 разных языках, включая Python, Java, C++. Когда я (несколько лет) преподавал Питон с нуля, я обычно начинал с того, что знакомил студентов с четырьмя "ключевыми идеями программирования". Если хорошо усвоить эти идеи, то можно научиться писать код любой сложности, так как всё остальное, что есть в программировании, - лишь надстройка над этими четырьмя идеями.
1. Функции - это действия, которые умеет выполнять ваша программа. Программу можно представить в виде робота, который умеет, например, танцевать, делать уборку, ходить в магазин за хлебом и т.д. Все эти "умения" робота - это функции. Отдельно взятая сложная функция может состоять из более простых функций (действий). Например, функция "сходить за хлебом" может состоять из действий: "взять деньги", "построить маршрут до магазина", "дойти до магазина", "найти в магазине хлеб" и так далее.
2. Переменные - это то, как программа хранит знания о мире. Говоря образно, это такие коробочки с этикетками, на каждой из которых написано название. То, что написано на коробке, - это название переменной, а то, что внутри коробки, - это содержимое, которое переменная хранит (числа, текст, или более сложные объекты). В почти любой программе есть свой "склад коробок" - это все переменные, в которых хранятся знания о мире, заложенные в программе. Следуя нашему примеру про поход за хлебом, можно представить себе переменную-коробку с этикеткой money. Тогда внутри этой коробки должно лежать число, которое обозначает, сколько у нас есть денег.
3. Ветвления - это логика принятия решений внутри нашей программы. Её можно представить в виде простых правил, на которые наша программа-"робот" ориентируется при совершении действий. Например, наш робот решает, покупать ему французский багет или нет. Он может сравнить стоимость багета (которая, допустим, "лежит" в коробке-переменной baguette_price) с количеством денег, которое у него осталось (переменная money). Если стоимость хлеба ниже, чем количество оставшихся денег, то нужно покупать. Конечно, логика робота может быть сколь угодно более сложной. :)
4. Циклы - это просто многократное повторение одних и тех же действий. Например, пока робот не нашёл подходящее хлебо-булочное изделие, он должен идти вдоль витрины и оценивать каждый товар в ассортименте. Когда хлеб найден, нужно прервать цикл (ведь дальше искать нет смысла) и идти к кассе оплачивать товар. Ещё может быть "маленький" цикл (оценить сегодняшний ассортимент в магазине) внутри "большого" цикла (каждый день ходить в магазин). В заключение можно вспомнить фильм "День сурка", где герой, по сути, застрял в бесконечном цикле, но в результате выполнения определённых действий ему всё-таки удаётся "вырваться".
Как найти первую работу программистом
#career
Несмотря на большую нехватку разработчиков / специалистов по машинному обучению на рынке труда, найти первую работу даже с хорошими знаниями и навыками, но без опыта, бывает очень сложно. Зато с опытом - почти без проблем. Поэтому найти свою самую первую работу программистом - это как будто бы самый сложный квест в этой игре, после которого всё становится гораздо легче. Как же преодолеть этот порог? На мой взгляд, есть четыре основные "точки входа" в профессию, связанную с написанием кода (то есть это не абстрактное "войти в IT", я не говорю про HR-специалистов, менеджеров по управлению проектами, дизайнеров и так далее).
1. Стажировки в крупных компаниях. Здесь обычно бывает жёсткий отбор, плюс на рынке не так уж много компаний, готовых растить стажёров. Однако на мой взгляд, это самая классная и престижная точка входа. Даже если стажировка неоплачиваемая, но компания хорошая, а у вас нет опыта работы по специальности, - стоит попробовать.
2. Работа в стартапах. Вы удивитесь, насколько ниже порог входа в стартапах и маленьких компаниях, чем в больших корпорациях (даже на позицию стажёра). Дело в том, что у молодых стартапов зачастую нет возможности платить адекватную рынку зарплату, и тогда они готовы нанимать и без опыта (но знания и навыки, конечно же, всё равно нужны).
3. Опен-сорс. Многие проекты с открытым исходным кодом страдают от нехватки людей, готовых бесплатно их улучшать и исправлять баги. Если вы станете контрибьютером в таком проекте (а там не обязательно очень сложные задачи, бывают и относительно простые), то вам точно будет о чём рассказать на собеседовании. Также это может быть довольно престижно, если проект/библиотека/фреймворк пользуется известностью.
4. Собственные проекты. Если вы никогда не писали код за деньги, это вовсе не значит, что у вас не должно быть классных пет-проектов. Нужно постепенно накапливать сильное портфолио, при этом важно уметь интересно рассказать о том, какие возникали сложности и что в итоге получилось круто. Знаю студентов, которые на собеседованиях так здорово рассказывали о своих курсовых работах, что их нанимали даже без опыта.
#career
Несмотря на большую нехватку разработчиков / специалистов по машинному обучению на рынке труда, найти первую работу даже с хорошими знаниями и навыками, но без опыта, бывает очень сложно. Зато с опытом - почти без проблем. Поэтому найти свою самую первую работу программистом - это как будто бы самый сложный квест в этой игре, после которого всё становится гораздо легче. Как же преодолеть этот порог? На мой взгляд, есть четыре основные "точки входа" в профессию, связанную с написанием кода (то есть это не абстрактное "войти в IT", я не говорю про HR-специалистов, менеджеров по управлению проектами, дизайнеров и так далее).
1. Стажировки в крупных компаниях. Здесь обычно бывает жёсткий отбор, плюс на рынке не так уж много компаний, готовых растить стажёров. Однако на мой взгляд, это самая классная и престижная точка входа. Даже если стажировка неоплачиваемая, но компания хорошая, а у вас нет опыта работы по специальности, - стоит попробовать.
2. Работа в стартапах. Вы удивитесь, насколько ниже порог входа в стартапах и маленьких компаниях, чем в больших корпорациях (даже на позицию стажёра). Дело в том, что у молодых стартапов зачастую нет возможности платить адекватную рынку зарплату, и тогда они готовы нанимать и без опыта (но знания и навыки, конечно же, всё равно нужны).
3. Опен-сорс. Многие проекты с открытым исходным кодом страдают от нехватки людей, готовых бесплатно их улучшать и исправлять баги. Если вы станете контрибьютером в таком проекте (а там не обязательно очень сложные задачи, бывают и относительно простые), то вам точно будет о чём рассказать на собеседовании. Также это может быть довольно престижно, если проект/библиотека/фреймворк пользуется известностью.
4. Собственные проекты. Если вы никогда не писали код за деньги, это вовсе не значит, что у вас не должно быть классных пет-проектов. Нужно постепенно накапливать сильное портфолио, при этом важно уметь интересно рассказать о том, какие возникали сложности и что в итоге получилось круто. Знаю студентов, которые на собеседованиях так здорово рассказывали о своих курсовых работах, что их нанимали даже без опыта.
Зачем учиться решать алгоритмические задачки?
#career
Ответ на этот вопрос, наверное, очевиден: чтобы прокачать своё алгоритмическое мышление и (как побочный эффект) легче устраиваться на работу.
История из жизни. Я работаю в своей уже четвёртой по счёту IT-компании. В двух из них при прохождении отбора мне приходилось решать алгоритмические задачи. Часто задачи используют как скрининг, особенно (в моём опыте) в зарубежных компаниях. То есть сначала решаешь за ограниченное время пару задач на специальной платформе, а потом, после проверки решений, тебя приглашают на технические собеседования. (Кстати, в одной компании у меня собеседований было целых шесть, но вообще-то такое бывает редко. Во многих компаниях делают оффер после 1-2 собеседований.)
Иногда задачи приходится решать прямо на собеседовании. На самом деле, это не так уж и страшно, потому что у интервьюера можно уточнить непонятные моменты, а иногда и получить подсказку, когда идёшь в явно неверном направлении.
Если вам тяжело даётся решение задач, особенно на время или в присутствии других людей, не переживайте, это вопрос практики. К тому же многие задачи однотипны и решаются похожими приёмами. Хорошо, что есть платформы наподобие LeetCode, на которых есть много задач разных уровней сложности и автопроверка, там каждый может постепенно повысить свой уровень.
Давайте в следующий раз попробуем решить какую-нибудь не самую простую задачу и вместе разобрать решение!
Кстати, не стесняйтесь задавать вопросы в комментариях. На всякий случай скажу, что я придерживаюсь принципа "глупых вопросов не бывает".
#career
Ответ на этот вопрос, наверное, очевиден: чтобы прокачать своё алгоритмическое мышление и (как побочный эффект) легче устраиваться на работу.
История из жизни. Я работаю в своей уже четвёртой по счёту IT-компании. В двух из них при прохождении отбора мне приходилось решать алгоритмические задачи. Часто задачи используют как скрининг, особенно (в моём опыте) в зарубежных компаниях. То есть сначала решаешь за ограниченное время пару задач на специальной платформе, а потом, после проверки решений, тебя приглашают на технические собеседования. (Кстати, в одной компании у меня собеседований было целых шесть, но вообще-то такое бывает редко. Во многих компаниях делают оффер после 1-2 собеседований.)
Иногда задачи приходится решать прямо на собеседовании. На самом деле, это не так уж и страшно, потому что у интервьюера можно уточнить непонятные моменты, а иногда и получить подсказку, когда идёшь в явно неверном направлении.
Если вам тяжело даётся решение задач, особенно на время или в присутствии других людей, не переживайте, это вопрос практики. К тому же многие задачи однотипны и решаются похожими приёмами. Хорошо, что есть платформы наподобие LeetCode, на которых есть много задач разных уровней сложности и автопроверка, там каждый может постепенно повысить свой уровень.
Давайте в следующий раз попробуем решить какую-нибудь не самую простую задачу и вместе разобрать решение!
Кстати, не стесняйтесь задавать вопросы в комментариях. На всякий случай скажу, что я придерживаюсь принципа "глупых вопросов не бывает".
Задача от Google про разложение на полные квадраты
#py_basic
У этой задачи есть история. Моя знакомая (она NLP / бэкенд-разработчик) много гуглила по работе, и поисковик однажды предложил ей решить несколько задач на программирование. Оказывается, Google следит за вашими поисковыми запросами не только для того, чтобы показывать вам более релевантную контекстную рекламу. Если вы много гуглите про бэкенд-разработку, то Google может предложить вам такой челлендж. Если его успешно пройти, то дальше зовут на собеседование. Там было несколько задач, я покажу вам самую первую из них. Она не сложная, но сможете ли вы решить её эффективно?
На входе положительное целое число, нужно разложить его на сумму квадратных чисел так, чтобы слагаемых было наименьшее количество. Слагаемые-точные квадраты нужно расположить в списке в порядке убывания. Например, если нам пришло число 7, то нужно разложить его на [4, 1, 1, 1], но не на [1, 1, 1, 1, 1, 1, 1] (не наименьшее количество слагаемых), не на [5, 1, 1] (первое число не является квадратом целого числа), не на [1, 4, 1, 1] (неправильный порядок) и так далее. Ещё несколько примеров:
12 -> [9, 1, 1, 1]
16 -> [16]
1 -> [1]
Завтра покажу решение и сделаю разбор.
#py_basic
У этой задачи есть история. Моя знакомая (она NLP / бэкенд-разработчик) много гуглила по работе, и поисковик однажды предложил ей решить несколько задач на программирование. Оказывается, Google следит за вашими поисковыми запросами не только для того, чтобы показывать вам более релевантную контекстную рекламу. Если вы много гуглите про бэкенд-разработку, то Google может предложить вам такой челлендж. Если его успешно пройти, то дальше зовут на собеседование. Там было несколько задач, я покажу вам самую первую из них. Она не сложная, но сможете ли вы решить её эффективно?
На входе положительное целое число, нужно разложить его на сумму квадратных чисел так, чтобы слагаемых было наименьшее количество. Слагаемые-точные квадраты нужно расположить в списке в порядке убывания. Например, если нам пришло число 7, то нужно разложить его на [4, 1, 1, 1], но не на [1, 1, 1, 1, 1, 1, 1] (не наименьшее количество слагаемых), не на [5, 1, 1] (первое число не является квадратом целого числа), не на [1, 4, 1, 1] (неправильный порядок) и так далее. Ещё несколько примеров:
12 -> [9, 1, 1, 1]
16 -> [16]
1 -> [1]
Завтра покажу решение и сделаю разбор.
Задача на разбивку слитной строки на слова
#py_advanced
Специально для тех, кому предыдущая задача показалась простой, взял более хитрую с LeetCode: https://leetcode.com/problems/word-break/
Она отмечена как задача средней сложности. Такую вполне реально получить на собеседовании на джуновскую или даже мидл-позицию (как скрининг).
На входе слитная строка наподобие "мамамылараму" и список слов, например, ["раму", "мама", "мыла"]. Нужно вернуть True, если строку можно разделить на заданные слова так, чтобы не было пересечений и не оставалось неиспользованных символов. Слова можно использовать сколько угодно раз. В противном случае нужно вернуть False. Примеры:
"мамамылараму", ["раму", "мама", "мыла"] -> True
"мамамылараму", ["раму", "мама", "мыла", "дома"] -> True
"мамамылараму", ["мама", "мыла", "дома"] -> False
"мамамылараму", ["лараму", "мама", "мыла"] -> False
"мамамылараму", ["раму", "мама", "мыл"] -> False
"мамамамамама", ["ма", "му"] -> True
Решение и разбор - завтра.
#py_advanced
Специально для тех, кому предыдущая задача показалась простой, взял более хитрую с LeetCode: https://leetcode.com/problems/word-break/
Она отмечена как задача средней сложности. Такую вполне реально получить на собеседовании на джуновскую или даже мидл-позицию (как скрининг).
На входе слитная строка наподобие "мамамылараму" и список слов, например, ["раму", "мама", "мыла"]. Нужно вернуть True, если строку можно разделить на заданные слова так, чтобы не было пересечений и не оставалось неиспользованных символов. Слова можно использовать сколько угодно раз. В противном случае нужно вернуть False. Примеры:
"мамамылараму", ["раму", "мама", "мыла"] -> True
"мамамылараму", ["раму", "мама", "мыла", "дома"] -> True
"мамамылараму", ["мама", "мыла", "дома"] -> False
"мамамылараму", ["лараму", "мама", "мыла"] -> False
"мамамылараму", ["раму", "мама", "мыл"] -> False
"мамамамамама", ["ма", "му"] -> True
Решение и разбор - завтра.
LeetCode
Word Break - LeetCode
Can you solve this real interview question? Word Break - Given a string s and a dictionary of strings wordDict, return true if s can be segmented into a space-separated sequence of one or more dictionary words.
Note that the same word in the dictionary may…
Note that the same word in the dictionary may…
Dive into Deep Learning
#ml
И напоследок на сегодня хочу поделиться, недавно наткнулся на полезнейшую книжку по машинному / глубокому обучению:
https://d2l.ai/
Почему рекомендую:
* Написал крутой коллектив учёных из Amazon
* Книга бесплатная (но на английском)
* Отлично подходит для начинающих, будет интересна и продвинутым
* Актуальные примеры кода на современных фреймворках
* Книгу постоянно обновляют, она не должна быстро устареть
* Пишут, что её уже используют в 400 университетах в 60 странах мира
Прочитал несколько глав для ознакомления, мне понравилось.
#ml
И напоследок на сегодня хочу поделиться, недавно наткнулся на полезнейшую книжку по машинному / глубокому обучению:
https://d2l.ai/
Почему рекомендую:
* Написал крутой коллектив учёных из Amazon
* Книга бесплатная (но на английском)
* Отлично подходит для начинающих, будет интересна и продвинутым
* Актуальные примеры кода на современных фреймворках
* Книгу постоянно обновляют, она не должна быстро устареть
* Пишут, что её уже используют в 400 университетах в 60 странах мира
Прочитал несколько глав для ознакомления, мне понравилось.