Всем привет!
Первый значимый рубеж пройден, 100 задач решены. Поэтому можно пощупать результаты и вспомнить, как все начиналось.
Начну пожалуй с пары слов о себе.
О себе
Мне 34 года, я ученый-химик. Python стал серьезно изучать примерно год назад. До этого программированием не занимался. Конечно, в школе и институте меня чему-то учили, но Паскаль не оставил после себя никаких следов.
Периодически у меня возникало желание научиться кодить, но, наверное, как и для большинства, это желание не приводило ни к чему серьезному. Несколько лет назад под воздействием коллеги с работы я начал понемногу разбираться в Питоне, но отсутствие регулярности и слишком амбициозная задача быстро свели всё на нет.
Теперь о пути, который я прошел за этот год.
О пути
Год назад мне очень повезло, что я оказался в одном городе с другим моим коллегой, который помог мне перезапустить изучение Питона. В основном это были ответы на вопросы и помощь в решении самых простых задач. Например нарисовать смайлик с помощью библиотеки pyplot:
Попутно я смотрел лекции Тимофея Хирьянова, а заодно наткнулся на материалы к семинарам по этому курсу лекций. Я относительно регулярно занимался примерно по часу в день, решая задачки к семинарам. Я освоил библиотеку turtle, не супер профессионал, но кое-что получалось (про треугольник Серпинского можно почитать тут):
Но дальше шестого или седьмого семинара дело не пошло. Там нужно было работать с библиотекой Pygame, а вот к ней подводящих заданий было маловато. А когда нужно писать много кода, причем одному, без подсказок и советов, руки опускаются сами собой.
Примерно в тогда же я натолкнулся на LeetCode. И через некоторое время основными моими упражнениями стали задачи там.
О LeetCode
Сначала было трудно разобраться с интерфейсом и вообще подходом к решению задач. До этого я все делал в IDLE, и если мне нужно было что-то получить, то основной командой была print(). Именно так я и пытался решить свою первую задачу на LeetCode "Add two Integers". Но местный интерпретатор выдавал мне ошибку, не давая продвинуться дальше.
Конечно эта проблема была быстро решена просмотром ролика посвященного этой проблеме. Так return проник в мою повседневную жизнь.
На этом вопросы и непонимание не закончились, но был положен старт и через некоторое время я стал регулярно решать самые простые задачи. Потом я прошел Гайд для Новичков и даже взялся за Гайд по спискам.
Именно LeetCode помог мне выработать привычку ежедневных занятий Питоном.
Можно выделить несколько особенностей этой платформы, которые помогают возвращаться к занятиям снова и снова.
Об особенностях
Понятный и видимый прогресс
Каждый день количество задач и сабмитов увеличивается. Какие-бы не были простые задачи (особенно взглядом из дня сегодняшнего), решая каждую из них я учился чему-то новому или повторял пройденное. Каждые 10 решенных задач были моей маленькой гордостью.
Вознаграждение за постоянство
Это может показаться смешным, но мне было приятно, что каждый день, заходя на LeetCode, я получал какие-то монетки. У меня пока нет ни одного бейджа, но я думаю, что смогу получить бейдж "100 дней". А когда мой скил подрастет, и я смогу решать "Hard" задачи, то и ежемесячные бейджи (например, "Oct Leetcoding Challenge") тоже будут моими.
Постепенное усложнение
Все задачи разбиты на уровни сложности и тематически сгруппированы. Всегда можно найти задачу по силам. Более того, LeetCode подталкивает тебя решать задачи от простых к сложным, потихоньку добавляя в знакомые рамки новые условия.
Очень часто встречаются задачи, которые нужно решать последовательно. Обычно они помечены римскими цифрами I → II → III → IV и т.д. (Я даже нашел серию из восьми задач). Эти задачи буквально ведут тебя за ручку, знакомя, а потом углубляя в изучаемые концепты.
Так например в задаче Pascal's triangle (LeetCode 118) нужно составить список состоящий из n этажей треугольника Паскаля. А во второй версии этой задачи Pascal's triangle II (LeetCode 119) нужно вернуть только n-ный ряд треугольника. Это небольшое изменение заставляет по новому взглянуть на задачу и раскрывает аспекты динамического программирования.
Большое количество обучающих материалов
YouTube буквально забит роликами по задачам LeetCode. Если я сталкиваюсь с непонятной задачей или новым концептом, то просто набираю номер задачи и десятки роликов к моим услугам. Больше всего мне нравится канал NeetCode, но есть много других не менее достойных вариантов. В какой-то момент, я стал смотреть эти ролики до половины (там где объясняется подход к решению задачи), а сам код пишу самостоятельно.
Не менее полезным является раздел Solutions, в котором любой может поделиться своим решением задачи. Но я стараюсь смотреть туда только после решения задачи (это помогает оптимизировать код, подсмотреть всякие фишечки и т.д.) или если совсем застрял. Потому что там в основном пишут голое решение без пояснений, а развидеть работающее решение ты уже не можешь. К тому же, в большинстве случаев, если подсмотрел код до самостоятельного решения, то просто копируешь его. Это не самая лучшая практика...
Так же можно отметить гайды от LeetCode. Сначала я попробовал работать по ним, и все было не плохо. Но через шаг оказалось, что их самих не достаточно для комфортного темпа обучения, а обсуждаемые концепты достаточно сложные (Linked Lists, Hash Tables и т.д.). Плюс постоянное давление к покупке премиум аккаунта.
Все это погружает тебя в своеобразную среду, в которой медленно, но верно прогрессируют твои навыки и умения
О моем прогрессе
Спустя 100+ задач я могу точно сказать, что изучил некоторые концепции программирования, овладел синтаксисом языка Python, стал разбираться в типах данных и особенностях их применения и т.д.
Я теперь могу читать, ну или во всяком случае поверхностно просматривать чужой код. Я научился работать с Терминалом, разными редакторами кода, овладел на новом уровне программистской терминологией
При этом я не стал программистом. И даже не планирую. Ведь программист – это тот, кто зарабатывает на жизнь таким трудом. Для меня занятия с Python это способ развиваться, учиться чему-то полезному, что я могу применять в своей повседневной трудовой деятельности или в личных целях. Примерно как с английским языком. Я конечно же не переводчик, но знание английского необычайно полезно как в работе (почти все приличные научные статьи написаны на английском), так и в повседневной жизни (например, можно слушать теории по One Piece).
Конечно, всегда есть возражение, что обучаясь с помощью туториалов, единственное, что ты потом можешь, это решать туториалы. В реальной жизни совсем другие задачи, решать которые я пока не умею. Но тут мне тоже помогает аналогия с английским языком, обучение которому начинается с простых текстов и диалогов. Мне трудно представить как начать учить английский без "London is a capital of Great Britain" и "Dialog in a hotel",
и, в то же время, где данные тексты вам могут понадобиться. Именно эти тексты закладывают фундамент дальнейшего прогресса и, в конце концов, желаемого результата.
Занятия на LeetCode не являются серебряной пулей. Наверное, ничто не способно сделать человека лучше кроме долгого и методичного труда. Просто с LeetCode это делать проще.
Об итогах
Понятно, что итоги на данном этапе только промежуточные. Но мне кажется, что я твердо стою на пути, который ведет к освоению нового навыка. И основной инструмент на этом пути – LeetCode, со всеми его достоинствами и недостатками.
Сейчас для меня изучение Python это развлечение, зарядка для ума, безусловно полезная, но пока не применимая в жизни. Я надеюсь, что путь выведет к чему-то более объемному, но пока об этом речи не идет. Пока ежедневные (насколько это возможно), небольшие занятия-тренировки для наращивания нужных нейронных связей.
До встречи примерно через 100 задач