andresol: (Default)
[personal profile] andresol
В прошлом году я решил начать по-серьезному учить программирование, чтобы самому делать мобильные приложения. До этой цели я пока так и не дошел, поэтому пока расскажу о двух сайтах с программистскими задачками, которые мне сильно помогли прокачать навыки в этой сфере: Codewars и LeetCode. Таких сайтов сейчас развелось множество, но я решал задачи только на этих двух, поэтому буду делиться личным опытом и успехами.

Исторически первым я пришел на Codewars (мой аккаунт там). И он мне чем-то напомнил изучение иностранных языков на Duolingo: можно точно так же с полного нуля начать с самых простых задач, где требуется определить четное ли число или написать простейший for loop, минимум теории – максимум практики:


Конечно, тем, кто вообще никогда не программировал (вот у нас в школе, которую я закончил в 2002 году, программирования не было; на химфаке тоже; брат все учил по книжкам, но комп у нас был, поэтому что такое for loop, я смутно представлял), придется даже с простыми задачами лезть в гугл, на StackOverflow, но это будет не чтение теории, которую непонятно, куда применить, а поиски ответа на конкретный вопрос. Зато потом, после своего кривого алгоритма, можно будет посмотреть решение других людей и выучить из них еще больше. Я вот прямо скажу, что решив на Codewars 50 простейших задач по питону, я узнал о нем больше, чем от чтения 350-страничного учебника по Python для начинающих.

Задачи на codewars придумывают другие юзеры, и за несколько лет их накопилось несколько тысяч, самого разного уровня сложности (они обозначаются цифрами от 8 до 1: “восьмерки” – самые простые). На каких-то языках больше, на каких-то меньше. Некоторые задачи универсальны и могут быть переведены почти на любой язык. Другие – полностью зависят от фич определенного языка или группы языков. Этим Codewars очень понравился моему брату, который провел на этом сайте даже больше времени, чем я, и вышел на 21-е место в общей таблице пользователей (я где-то в районе 900-го места обитаю):


Мой брат глубоко изучил JavaScript, подтянул ассемблер, а когда в этом году на Codewars добавили языки формальных доказательств – тема, тесно связанная с его научной работой – такие как Coq, он зауважал этот сайт еще больше.

Я же начал прошлой весной с C#, потому что мы планировали переходить на кросс-платформенный движок Unity для создания приложений. Прорешал на нем несколько сотен задач, но год назад брат решил, что Unity нам не подходит и посоветовал мне учить нативную для андроида Java (на популярном нынче Kotlin там мало задач еще). Вот я так с тех пор на Java и решаю (а C# забыл). Недавно стал еще Python и JS решать – самые простые задачи 8-го и 7-го уровней. Для общего развития: на Python брат пишет скрипты по обработке файлов, на JS есть свой мобильный движок ReactNative. На Duolingo я так когда-то учил пять языков параллельно. Без практики почти все забыл, но основы в мозгу остались.

Но проблема с Codewars была и остается в том, что я не могу заставить себя решать сложные задачи (4 и сложнее). С простыми задачами я почти сразу вижу, как их решать и бросаюсь писать код. Через десять, максимум двадцать минут, моя программа проходит тесты, и я получаю моральное вознаграждение. Размышлять часами над сложными задачами, которые я, вполне возможно, и не могу решить в силу ограниченности моих познаний, мне скучно.

И вот недавно я завел аккаунт на LeetCode – еще одном сайте по решению задач, даже более известном, чем Codewars, потому что задачи оттуда часто используются компаниями для интервьюирования программистов. Там тоже есть (приблизительное) деление задач по сложности на простые, средние и трудные, но даже самая простая задача потребует уже определенных познаний. Правда, задачи при этом не привязаны к конкретному языку программирования, а тестируют абстрактные алгоритмы, которые фундаментально одинаковы и на Java, и на Python, и на C++.


Я снова рисковал завязнуть только на самых простых задачках (их там не тысячи, как на Codewars, но сотни – хватит на несколько месяцев), если бы не такая вещь как contests (соревнования). Раз в неделю, субботним вечером (по тихоокеанскому времени; в Китае утром) всем желающим предлагается решить за полтора часа 4 задачи (обычно 1 простая, 2 средние, 1 сложная).

Я никогда не участвовал в олимпиадах по программированию, но мне стало любопытно, решу ли я хотя бы одну задачу, и я записался на свой первый контест. После тренировок на Codewars я справился с простой задачей за 12 минут, у меня оставалось еще больше часа, но вот “средние” задачи для меня оказались не по зубам. Возможно, я допустил стратегическую ошибку, потратив все оставшееся время на задачу, которая объективно была сложнее другой. Но та другая была о “деревьях” – популярной структуре данных – а я решал о них всего одну задачу до этого и испугался деревьев. В итоге я больше так ничего и не решил и финишировал в районе 2000-го места.

Подобная же ситуация повторилась через неделю: я решил простую задачу за 12 минут, а потом все оставшееся время бился со средними задачами. Мне стало обидно: контест на полтора часа, а я отваливаюсь через 10 минут. И я засел за чтение теории (книги по алгоритмам, которые я считал, что мне не нужны в мобильной разработке), за разбор нерешенных мной задач и за решение задач сложнее “моей зоны комфорта”.

Уже на третьем контесте моя подготовка дала плоды: я смог решить три задачи и занять 550-е место. Возможно, они были чуть проще на этот раз, но если бы сильно проще, то другие участники обогнали бы меня как и раньше (при равенстве очков за решение задач места распределяются по времени, затраченном на решение). У меня даже оставалось 30 минут, чтобы подумать над “сложной” задачей. Но тут я уже был бессилен. Я дорешал ее через неделю с подсказкой брата (“делать двойную рекурсию”). Он сам явно мог бы решить там все задачи, все же это не “научные” проблемы, а вопросы для интервью, но он вообще не любит соревноваться на время. А меня порой захватывает азарт.

Неделю назад я поучаствовал в своем 4-м контесте, за полтора часа решил две задачи, а третью дорешал только через 25 минут после окончания (но я был на правильном пути; мой брат сказал, что она простая, и я должен был решать ее на контесте, но вот не решил). Ожидаемо оказался на 940-м месте, но все равно был доволен собой. После первых двух неудачных контестов мне было принципиально научиться решать эти задачи, а время – фактор второстепенный.


И вот я оказался с этими задачами на некоем распутье. Я не собираюсь проходить интервью в компании, я не собираюсь заниматься computer science в научном плане, для мобильных приложений умение решать алгоритмические задачи на время не пригодится. Нужно ли мне продолжать тратить время на эти сайты, или это чистая прокрастинация, которая только отвлекает меня от основной цели – научиться делать приложения?

Я уверен, что потрать я на контесты еще год-два, я буду гарантировано решать там четыре задачи и, если повезет, попадать в первую сотню. Денег или славы мне это не принесет. Я никогда не смогу обогнать лидеров, которые занимаются решением подобных задач всю жизнь (я посмотрел, что один из победителей контестов neal_wu еще в 2008-2010 годах брал золотые медали на международных олимпиадах по информатике, закончил Гарвард и работает в научном отделе Google; у него, наверно, такой отдых перед сном – зайти и решить все 4 задачи за 20 минут, напугав малышей).

Как я написал в Case Study #1, есть у меня талант решать задачи на время. В школе, универе или на интервью его очень ценят. Но в реальной работе над реальными проектами требуются другие навыки. В первую очередь не бросать работу, когда стало скучно, а доводить ее до конца. И я не знаю, какой контест смог бы меня научить такому, если даже финансовая мотивация от написания мобильных приложений не помогает мне довести хотя бы один из моих проектов до публикуемого состояния.

Все эти задачи в итоге сведутся не к изучению программирования, а к “занимательной математике”. К задачам, которые тоже раньше задавали на интервью: “Дано 12 шаров, один из них чуть тяжелее или легче остальных (неизвестно, легче или тяжелее), определите какой за три взвешивания”. Эту задачу я тоже решил, она хорошая, но никак не помогает разобраться с анимациями в андроиде.

Во многом я пишу этот пост, чтобы подвести некий итог решению задач. У меня так бывает: написал пост о фильмах и перестал их смотреть. Каждый учится по-своему, но если вы начинаете учить языки программирования я готов порекомендовать Codewars, если хотите посоревноваться в придумывании алгоритмов на время, LeetCode – неплохая платформа для этого. Мне она дала мотивацию разобраться с рекурсией. Я определенно продолжу решать там задачи время от времени, чтобы не забыть Java. Но надеюсь, что когда-нибудь напишу здесь пост и о своем собственном приложении, а не только о том, как я решаю чужие задачи.
Page 1 of 5 << [1] [2] [3] [4] [5] >>

Date: 2019-08-17 05:24 am (UTC)
From: [identity profile] -heckfy.livejournal.com

Интересно вспомнить свои ощущения. Мне сначала идея программирования очень понравилась. Но в нашей деревне компьютеров ещё не было. И я писал программку на бумаге, а потом сам ее и исполнял ;). Так обучился ассемблеру. Потом переехал в другую деревню, а там уже были агаты, и стал писать программки уже для компов. А потом поступил в МГУ и увидел Нортон и виндовс 3.1 и понял как это все далеко от моих навыков, больше не программировал никогда.

Date: 2019-08-17 05:37 am (UTC)
From: [identity profile] rollson.livejournal.com
молоток!
а я python мучаю сейчас в мои зрелые годы и при том что не айтишник ни разу..

скиньте пжст по python полезные ссылки для интервью, решения прстых задач и пр!

Date: 2019-08-17 06:04 am (UTC)
From: [identity profile] andresol.livejournal.com
У нас дома компьютер появился в 1996 году. MS-DOS, Norton, QuickBasic, Win 3.1.1. Моего брата тогда программирование заинтересовало, и он так им и занимался, а я, несмотря на его пример, только в игры играл и учил химию. И если бы не брат, так в программирование не вернулся бы. У нынешних детей возможностей на порядки больше, чем было у нас.

Date: 2019-08-17 06:10 am (UTC)
From: [identity profile] andresol.livejournal.com
У меня получается эффективнее учить язык, решая задачи. Вот поэтому эти два сайта - Codewars и LeetCode - я и рекомендую. Codewars - если решать задачи 8kyu - хорош, чтобы основы языка учить. LeetCode - готовиться к интервью. А если из теории что-то надо, то ищу в гугле. Но вот этот сайт часто попадается и статьи там весьма конкретные, с примерами:

https://www.geeksforgeeks.org/python-programming-language/

Date: 2019-08-17 06:37 am (UTC)
From: [identity profile] tatotu.livejournal.com

У нас и в школе и в универе было программирование (разумеется самый бейсик), но странно, что у тебя не было от слова совсем😳

Date: 2019-08-17 06:53 am (UTC)
From: [identity profile] rollson.livejournal.com
спасиб!

Date: 2019-08-17 07:08 am (UTC)
From: [identity profile] andresol.livejournal.com
В нашей школе, когда мы ее заканчивали, было два компьютера: у секретаря и у директора. Хотя у многих учеников уже дома компьютеры были. Не знаю, почему так отстало было. Какие компьютеры были в "компьютерном" классе на химфаке, тоже нельзя без смеха и слез вспоминать. Но зато я могу рассказывать, что видел операционную систему OS/2. И мы там какие-то основы MS Office и MatLab (без программирования) изучали.

Date: 2019-08-17 07:35 am (UTC)
From: [identity profile] sasha-severny.livejournal.com
Не решай дурацких задач. Если хочешь научиться программировать, задачи сам себе придумывай. Во всех языках логика в принципе одна и даже, только синтаксис разный. Питон прикольный. К нему еще можно QT или GTK GUI приделать. Поставь себе Линукс - Убунту или Дебиан. А на Линуксе быстро программировать научишься. Он такой.

Date: 2019-08-17 07:35 am (UTC)
From: [identity profile] tatotu.livejournal.com
Слушай, жесть какая. Ты же с Петербурга! Я ж в глухой провинции школу заканчивала в 2001 году и то у нас был компьютерный класс, правда мы сидели по двое за одним, ну так и классов у нас было 5 по 30 человек в потоке!!! Это ж был бэби-бум 80-х... а в Горном и подавно были хорошо оснащённые компьютерные классы, где можно было и после пар оставаться. Дома у нас тоже был комп, я просто не помню какой, а уж в общаге и подавно был, всё же было надо сдавать напечатанным (работы, диплом).

Date: 2019-08-17 07:41 am (UTC)
From: [identity profile] andresol.livejournal.com
Мой брат сказал, что вы написали "абсолютный бред" после первого предложения (с ним он согласен). Я ему больше доверяю в этих вещах и с ним консультируюсь, что мне дальше изучать.

Date: 2019-08-17 07:43 am (UTC)
From: [identity profile] sasha-severny.livejournal.com
Это правильно. Слушайся брата. Он научит.

Date: 2019-08-17 07:50 am (UTC)
From: [identity profile] evgeniirudnyi.livejournal.com
Программирование во много связано с использованием библиотек. В этом смысле ключевым является понимание того, как можно использовать библиотеку, созданную на одном языке, при использовании другого языка. При этом если говорить про численные методы, то многие численные библиотеки остаются на Фортране.

Date: 2019-08-17 07:53 am (UTC)
From: [identity profile] andresol.livejournal.com
У нас то ли в 10-м, то ли в 11-м классе было такое, что мы ходили классом в соседнюю школу, там стояли тоже допотопные компы, и нас там учили копировать файлы в том самом Norton Commander. Может, в физ-мат школе 239 компы были, но в нашей дворовой их не было. А химики к программированию до сих пор настороженно относятся. Уверен, что на химфаке СПбГУ его так и не учат (кроме кафедры квантовой химии).

Date: 2019-08-17 07:55 am (UTC)
From: [identity profile] andresol.livejournal.com
Программирование под Андроид - это и есть использование библиотек. Но они написаны на той же Java, за редкими исключениями (С++). У нас как раз проблема, что нынешние наши приложения написаны на C++, а было бы лучше, если бы они были на Java. С фортраном ни я, ни мой брат никак не пересекались.

Date: 2019-08-17 08:04 am (UTC)
From: [identity profile] evgeniirudnyi.livejournal.com
Фортран начинается с умножения матриц. Далее идет решение системы линейных уравнений и т.д.

Кстати, про програмирование есть классическая статья

Real Programmers Don't Use Pascal

Она хорошо передает дух настоящих програмистов.

Date: 2019-08-17 08:10 am (UTC)
From: [identity profile] andresol.livejournal.com
Я на то, чтобы стать "настоящим программистом" не претендую. Может быть, когда-нибудь у меня появится искренний интерес к этой теме и ее истории. Пока у меня сугубо практические цели - понимать код наших приложений, который пишет мой брат, и по возможности ему в этом деле помогать.

Date: 2019-08-17 08:17 am (UTC)
From: [identity profile] pusets.livejournal.com
Решение таких задач почти не меет никакого отношения к промышленному програмированию. Если потыкать в реальные задачи, то на десять тысяч одна требует какого-то нетривиального алгоритма, и в подавляющем большинстве случаев этот алгоритм уже кем-то реализован и выложен в открытый доступ.
Првда, такие задачки развивают мышление, что бесценно.

Date: 2019-08-17 08:20 am (UTC)
From: [identity profile] kirillkrm.livejournal.com
Здорово.
Я вот тоже думаю начать изучать программирование, но пока это "думаю", просто мечта.
Но навык мне бы оч. пригодился для разработки игры своей мечты.

Date: 2019-08-17 08:25 am (UTC)
From: [identity profile] evgeniirudnyi.livejournal.com
В любом случае статья крайне интересная и полезная. Если вы ее еще не читали, то рекомендую.

Date: 2019-08-17 08:26 am (UTC)
From: [identity profile] pashkovdv.livejournal.com
Эти сайты хороши для понимания основ языка и алгоритмики.
А вот где таким же образом изучать технологии?
Git, CSS, Pug, React, Webpack и т.д.?

Date: 2019-08-17 10:08 am (UTC)
From: [identity profile] ahiin.livejournal.com
Без знания алгоритмов "программист" навсегда останется бессмысленной обезьяной. Пусть не в ущерб основной деятельности, но учить их надо.

Date: 2019-08-17 10:29 am (UTC)
From: [identity profile] sakurovskiy.livejournal.com
А почему для изучения мобильной разработки вы не используете соответствующие курсы, а учитесь решать задачи? За год вроде бы вполне можно стать джуном, не?

Date: 2019-08-17 11:18 am (UTC)
From: [identity profile] tatotu.livejournal.com
Ты прав, я ж в физ-мат классе была, и инженерная специальность, наверное, поэтому такая разница. Успехов тебе в освоении программирования!

Date: 2019-08-17 12:39 pm (UTC)
From: [identity profile] kvisaz.livejournal.com
если игра хорошо пойдет в Стиме - лучше выпусти продолжение на том же движке

голое программирование игр требует очень много рутинной работы, которую конструкторы реализуют под капотом )

Date: 2019-08-17 02:51 pm (UTC)
From: [identity profile] rempi.livejournal.com
Здорово, очень познавательно написал! Прям аж самому захотелось пойти по указанным сайтам и порешать задачи. Я в основном Python'ом пользуюсь, но программированием это сложно назвать - использую его для численного решения дифуров, оптимизации функций и т.п. Ну и еще Labview конечно, там да, более-менее похоже на программирование. Причем, явно не оптимально я все это делаю, есть куда расти.
P.S. Ты не задумывался сделать учебное приложение для телефонов по программированию?
Page 1 of 5 << [1] [2] [3] [4] [5] >>

January 2026

S M T W T F S
    1 23
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 15th, 2026 07:03 am
Powered by Dreamwidth Studios