31.03.2023
Как методист «Девмана» учился программировать и написал бота, которым пользовались 4 тысячи человек
Выпускники курса программирования на Python «Девман» работают в крупных российских и международных компаниях — «Самолёт», Wargaming, Сбер и других. Методисты
и преподаватели — опытные программисты, которые придумывают для студентов интересные проекты из личного опыта и сопровождают их на пути из стажёров
в востребованные специалисты.


Эту статью написал Илья Осипов, методист курса программирования
на Python «Девман», который больше пяти лет пишет код на этом языке.

Он рассказывает, как учился программировать и во время учёбы случайно сделал популярного бота.


Для первого проекта достаточно минимального опыта программирования
Может показаться, что проекты — это что-то сложное, и за такое могут браться только опытные крутаны. На самом деле нет. Если вы знаете, как создать цикл, условие или функцию на вашем языке программирования — вы готовы писать первый проект.

Мне никогда не нравилось учиться по видео на YouTube или лекциям. Я и сейчас считаю такой подход бесполезным. Чтобы чему-то научиться, нужно этим заниматься.

Мои первые проекты предполагали работу с другими сайтами. Почти у любого популярного сайта есть API: это специальный интерфейс, через который вы можете сделать что-нибудь на этом сайте. Например, в VK через API можно отправить сообщение другому человеку, запостить картинку на стену или забанить пользователя в группе. Достаточно установить библиотеку для запросов в интернет и можно что-то придумывать: написать штуку, которая выводит в консоль всех ваших друзей онлайн. Или скачать базу фильмов от TMDB и написать свою рекомендательную систему.

Самое сложное в обучении на проектах — это найти пересечение между «хочу» и «могу». Можно придумать довольно много проектов, которые хочется сделать, но >90% из них окажутся невыполнимыми на текущем уровне. И наоборот, если смотреть на проекты, которые вы можете сделать, то >90% из них окажутся неинтересными.

Мне повезло, в вузе мне дали задачку, которую хотелось решить, и при этом было по силам.

Постановка проблемы
Во время занятий в вузе студентам нужно знать расписание занятий. С этим была проблема: чтобы узнать расписание, нужно было заполнить онлайн-форму:

Заполнять форму из 4 полей каждый раз не хотелось, тем более с телефона, и когда до пары осталось 3 минуты, а ты в коридоре вуза пытаешься понять, в какую аудиторию нужно попасть.

Студенты находили свои обходные пути: кто-то скриншотил расписание и смотрел его на картинке в галерее. Кто-то копировал его в чатик с одногруппниками. Но общий дискомфорт и напряжение оставались.

Я заметил эту проблему и решил избавить себя и одногруппников от боли, а заодно потренироваться программировать. Нехитрой магией удалось собрать расписание с сайта, а затем и обернуть его в виде Telegram-бота.

Студент объяснял боту где он учится только один раз, а после этого получал кнопочный интерфейс:

Я показал бота одногруппникам, и ссылка на него начала расползаться по сарафанному радио. Мне стало интересно, кто пользуется ботом. А вдруг он понадобился кому-нибудь и из других групп?
Кодить интереснее, когда это кому-то нужно
Пришлось разбираться, потратить время, чтобы запилить дашборд, на котором можно посмотреть, кто и как пользуется ботом.

Вскоре появились и первые отзывы от одногруппников:

> У меня не работает расписание по воскресеньям!
> А сделай вот такую штуку?
> Я что-то нажал и всё пропало. Почему бот не показывает расписание?
> В боте почему-то не показывается третья пара!

Сразу дал о себе знать недостаток тестирования. Я тестировал бота на одной неделе расписания, но чем больше ботом пользовались — тем больше нюансов всплывало. Например, оказалось, что занятие английского проводится сразу в двух кабинетах (а иногда и в трёх), потому что группа разделялась на подгруппы. Или, что неожиданно, данные на сайте вуза были «грязноватыми», из-за чего бот иногда не мог понять, что сообщает сайт.

Следующие 2 месяца я кодил всё больше и больше: каждый день всплывали новые хотелки и новые баги.

Например, стало понятно, что интерфейс бота ужасен. Частью кнопок никто и никогда не пользовался. Вот улучшенная версия:
Ещё одна находка: оказывается, пользователи не всегда рады, когда я что-то добавляю. Новичку наивно кажется, что улучшить продукт можно, если добавить в него как можно больше функционала. Например, я хотел выводить погоду возле вуза, чтобы студенты знали, что будет дождь и стоит взять зонт.

Но довольно быстро я понял, что мир так не работает. Вариации этой цитаты приписывают всем, от Линуса Торвальдса до Стива Джобса:

> Хороший продукт – это не когда ты добавляешь фичи в продукт, а когда из продукта нечего убрать.
(с) Много умных людей

Я тоже пришёл к этому, своей дорогой. Хорошие идеи приходят многим людям :)
Взрыв популярности: переход на ВК
Студенты объединяются в группы не по соцсети, к которой привыкли сами, а по соцсети, которой принято пользоваться в выбранном вузе. Так что среди студентов ВКонтакте — это до сих пор вполне валидный вариант. А ещё это огромная платформа с множеством пользователей.

Бот для Telegram — это удобно, но многие студенты пользовались другими мессенджерами.
Мне повезло: со мной связался другой студент-программист. Он рассказал, что тоже писал бота —
на языке C#. У него уже есть группа с несколькими сотнями пользователей. Но он устал поддерживать бота, и после последней поломки уже не хочет чинить. Он хотел сохранить наследие и передал группу с ботом мне.
Новая прорва работы: теперь нужно было научиться работать с ВК, интегрировать свой код на новую платформу. На чтение документации библиотек и самого ВК потратил несколько дней и наконец запустил бота.

Я написал код и сообщил всем пользователям, что ботом можно пользоваться. Вскоре графики с охватом аудитории серьёзно подросли. К сожалению, не знаю, как выгрузить графики получше. Прошло много времени, поэтому делюсь тем, что уцелело :)


Это график активности, не подписчиков. А спад между пиками — летние каникулы.

Первая крупная поломка
Как-то раз в пятницу, ближе к полуночи, я решил выложить на сервер новую версию кода. И… он не запустился. Попытался откатить код обратно, но не получилось, с базой данных что-то случилось.

Пульс участился: что делать? Может, просто код и раньше был поломан? Попробую откатить код ещё раньше. Лишь к двум ночи я понял, в чём проблема. Пришлось основательно покопаться, прочесть пару «умных» статей и так далее. Но бота надо было писать срочно. Появилась идея: «Выключить и включить обратно» :D

Я скачал БД, достал из неё данные, удалил старую БД, создал новую и написал несколько скриптов, которые залили старые данные в новую БД.

К шести утра субботы я наконец всё починил и лёг спать. А в 8 сработал будильник: было пора собираться на пары.

Так я узнал сразу о двух программистских мемах в одну ночь: пятничный деплой и бэкапы.

1) Не стоит вносить крупные изменения в свой код вечером в пятницу, потому что у тебя не будет времени на реакцию и починку перед выходными.

2) Существует только два типа программистов:
  • те, кто делают бэкапы
  • те, кто теперь делают бэкапы

Все выходные ушли на бэкапы, чтобы ситуация больше никогда не повторилась…

Потеря интереса
Через какое-то время я нашёл работу. Изменения в боте остановились: им больше некогда было заниматься. Да и в общем-то ничего менять было и не нужно, он работал и без моего вмешательства.

Ещё через какое-то время я окончил вуз. Появились вопросы: зачем я плачу по 6$ за сервер ради бота? Но всё же терять его не хотелось: было приятно, что моя работа кому-то нужна.

А ещё через какое-то время сотрудники вуза поменяли сайт. Бот больше не смог получать расписание от сайта. Я мог это починить, но по оптимистичным прогнозам нужно было поработать около недели по 5-8 часов.

И я просто не стал. Написал пользователям, что в связи со сменой дизайна бот будет сломан, и чинить его снова я уже не буду. Предложил также доступ к коду, если найдётся энтузиаст, который подхватит эстафету и воскресит бота снова.

Энтузиасты нашлись, но их энтузиазм мгновенно закончился, как только они получили на руки код. Бот так и угас, больше им никто не занимался.
Важные уроки
Пусть всё и закончилось провалом, но в процессе я получил крутой опыт. Я был ответственен за данные тысяч пользователей и понимал, что если их потеряю — не каждый захочет разбираться и большая часть аудитории просто перестанет пользоваться ботом.

А ещё я узнал многое о коде. Например, благодаря одной архитектурной идее однажды мне удалось выбросить около двух тысяч строк кода из проекта всего за один вечер, ничего не потеряв. Бот работал как и прежде. А ещё позже я понял, что сделал это зря :D Я получил более «сухую» кодовую базу, но вместе с этим потерял в гибкости: код стало очень сложно менять и поддерживать. Для маленького проекта гибкость изменений куда важнее «сухости» кодовой базы. О том, как и зачем я нарушаю принцип DRY, читайте другой мой материал в блоге «Девмана».

Будучи новичком, я пытался писать как можно более «сложный» код. Он будто кричал: «Мой создатель столько всего умеет! Возьмите его на работу!». Но со временем понял, что простой код лучше, чем сложный. Со сложным кодом тяжело работать, его тяжелее поддерживать и в нём выплывают неожиданные ошибки. И к чему сложность, если от неё только хуже? Оказывается, к этому заключению пришёл не только я, но и многие другие опытные разработчики, о чём я узнал уже позже — в своих первых рабочих командах.

Бот дал крутой буст моему резюме. Разработчик, который уже делал продукты и на вопросы об архитектуре отвечал не выученными формулировками из гугла, а выстраданными часами личного опыта, выглядел сильнее других кандидатов. Опыт чистоты кода, набитый на своих ошибках, а не на книге Роберта Мартина «Чистый код», выглядел убедительнее.

А ещё это было интересно. Я получал удовольствие от развития своего продукта, какое не получишь ни на какой лекции или вебинаре.

Спустя время я работаю на онлайн-курсе по Python, который учит начинающих программистов на практике. Мы решаем ту самую проблему, о которой я говорил в начале: предлагаем ученикам интересные, но при этом посильные проекты. А чтобы ученик не упустил «шишки», которые должен был набить, в конце его код смотрит опытный программист. Понятно, что, если ученик прислал задачу на проверку, код уже должен работать. Ревьюер смотрит на качество кода и указывает ученику на ошибки, подобные тем, что я описал в этой статье.

Хотите попробовать курсы бесплатно?
У нас есть курсы Python и программы для учеников с разным опытом — от нуля до сильного джуна.

С нами можно:
— впервые начать изучать язык,
— подтянуть конкретные темы,
— вырасти до мидла,
— трудоустроиться в ближайшие пару месяцев.

Если хотите выбрать тот трек, который поможет вам сейчас в вашей конкретной точке роста, свяжитесь с менеджером.
+7
Afghanistan (افغانستان)
+93
Albania (Shqipëri)
+355
Algeria (الجزائر)
+213
Andorra
+376
Angola
+244
Armenia (Հայաստան)
+374
Antigua and Barbuda
+1 (268)
Argentina
+54
Australia
+61
Austria (Österreich)
+43
Azerbaijan (Azərbaycan)
+994
Bahamas
+1 (242)
Bahrain (البحرين)
+973
Bangladesh (বাংলাদেশ)
+880
Barbados
+1 (246)
Belarus (Беларусь)
+375
Belgium (België)
+32
Belize
+501
Benin (Bénin)
+229
Bhutan (འབྲུག)
+975
Bolivia
+591
Bosnia and Herzegovina
+387
Botswana
+267
Brazil (Brasil)
+55
Brunei
+673
Bulgaria (България)
+359
Burkina Faso
+226
Burundi (Uburundi)
+257
Cambodia (កម្ពុជា)
+855
Cameroon (Cameroun)
+237
Canada
+1
Cape Verde (Kabu Verdi)
+238
Central African Republic (République centrafricaine)
+236
Chad (Tchad)
+235
Chile
+56
China (中国)
+86
Colombia
+57
Comoros (جزر القمر)
+269
Congo (DRC) (Jamhuri ya Kidemokrasia ya Kongo)
+243
Congo (Republic) (Congo-Brazzaville)
+242
Cook Islands
+682
Costa Rica
+506
Cote d’Ivoire
+225
Croatia (Hrvatska)
+385
Cuba
+53
Cyprus (Κύπρος)
+357
Czech Republic (Česká republika)
+420
Denmark (Danmark)
+45
Djibouti
+253
Dominica
+1 (767)
Dominican Republic (República Dominicana)
+1
Ecuador
+593
Egypt (مصر)
+20
El Salvador
+503
Equatorial Guinea (Guinea Ecuatorial)
+240
Eritrea
+291
Estonia (Eesti)
+372
Ethiopia
+251
Fiji
+679
Finland (Suomi)
+358
France
+33
Gabon
+241
Gambia
+220
Georgia (საქართველო)
+995
Germany (Deutschland)
+49
Ghana (Gaana)
+233
Greece (Ελλάδα)
+30
Grenada
+1 (473)
Guatemala
+502
Guinea (Guinée)
+224
Guinea-Bissau (Guiné Bissau)
+245
Guyana
+592
Haiti
+509
Honduras
+504
Hong Kong (香港)
+852
Hungary (Magyarország)
+36
Iceland (Ísland)
+354
India (भारत)
+91
Indonesia
+62
Iran (ایران)
+98
Iraq (العراق)
+964
Ireland
+353
Israel (ישראל)
+972
Italy (Italia)
+39
Jamaica
+1
Japan (日本)
+81
Jordan (الأردن)
+962
Kazakhstan (Казахстан)
+7
Kenya
+254
Kiribati
+686
Kosovo (Republic)
+383
Kuwait (الكويت)
+965
Kyrgyzstan (Кыргызстан)
+996
Laos (ລາວ)
+856
Latvia (Latvija)
+371
Lebanon (لبنان)
+961
Lesotho
+266
Liberia
+231
Libya (ليبيا)
+218
Liechtenstein
+423
Lithuania (Lietuva)
+370
Luxembourg
+352
Macao
+853
Macedonia (FYROM) (Македонија)
+389
Madagascar (Madagasikara)
+261
Malawi
+265
Malaysia
+60
Maldives
+960
Mali
+223
Malta
+356
Marshall Islands
+692
Mauritania (موريتانيا)
+222
Mauritius (Moris)
+230
Mexico (México)
+52
Mexico (México)
+521
Micronesia
+691
Moldova (Republica Moldova)
+373
Monaco
+377
Mongolia (Монгол)
+976
Montenegro (Crna Gora)
+382
Morocco (المغرب)
+212
Mozambique (Moçambique)
+258
Myanmar (Burma) (မြန်မာ)
+95
Namibia (Namibië)
+264
Nauru
+674
Nepal (नेपाल)
+977
Netherlands (Nederland)
+31
New Zealand
+64
Nicaragua
+505
Niger (Nijar)
+227
Nigeria
+234
Niue
+683
North Korea (조선 민주주의 인민 공화국)
+850
Norway (Norge)
+47
Oman (عُمان)
+968
Panama
+507
Pakistan (پاکستان)
+92
Palau
+680
Palestinian Territory
+970
Papua New Guinea
+675
Paraguay
+595
Peru (Perú)
+51
Philippines
+63
Poland (Polska)
+48
Portugal
+351
Qatar (قطر)
+974
Romania (România)
+40
Russian Federation (Российская Федерация)
+7
Rwanda
+250
Saint Kitts and Nevis
+1 (869)
Saint Lucia
+1 (758)
Saint Vincent and the Grenadines
+1 (784)
Samoa
+685
San Marino
+378
Sao Tome and Principe (São Tomé e Príncipe)
+239
Saudi Arabia (المملكة العربية السعودية)
+966
Senegal (Sénégal)
+221
Serbia (Србија)
+381
Seychelles
+248
Sierra Leone
+232
Singapore
+65
Slovakia (Slovensko)
+421
Slovenia (Slovenija)
+386
Solomon Islands
+677
Somalia (Soomaaliya)
+252
South Africa
+27
South Korea (대한민국)
+82
South Sudan (جنوب السودان)
+211
Spain (España)
+34
Sri Lanka (ශ්‍රී ලංකාව)
+94
Sudan (السودان)
+249
Suriname
+597
Swaziland
+268
Sweden (Sverige)
+46
Switzerland (Schweiz)
+41
Syria (سوريا)
+963
Taiwan (台灣)
+886
Tajikistan
+992
Tanzania
+255
Thailand (ไทย)
+66
Togo
+228
Tonga
+676
Trinidad and Tobago
+1 (868)
Tunisia (تونس)
+216
Turkey (Türkiye)
+90
Turkmenistan
+993
Tuvalu
+688
Uganda
+256
Ukraine (Україна)
+380
United Arab Emirates (الإمارات العربية المتحدة)
+971
United Kingdom
+44
USA
+1
Uruguay
+598
Uzbekistan (Oʻzbekiston)
+998
Vanuatu
+678
Vatican City (Città del Vaticano)
+39
Venezuela
+58
Vietnam (Việt Nam)
+84
Yemen (اليمن)
+967
Zambia
+260
Zimbabwe
+263
Даю согласие на обработку персональных данных