СТАТЬ ПРОГРАММИСТОМ
1.38K subscribers
12 photos
59 links
ЧАТ/СООБЩЕСТВО - @tobeprog_chat

Программирование. Задача канала - полностью разобрать путь становления разработчика, проведя по нему читателя наиболее эффективно
Download Telegram
Карта computer science. Нравятся подобные видео, видно взаимодействия в cs, при этом выдержан баланс между достаточно подробным(для 10 минут, уж точно) и интересным повествованием, ну и разумеется визуалка на уровне.

Ну и самый приятный момент - есть русские субтитры.  

https://www.youtube.com/watch?v=SzJ46YA_RaA

#cs #youtube
Приветствую.

Две недели назад, я начал вести этот канал. Даже предположить не мог, что на него подпишется более 200 человек. Это внушительная цифра, спасибо)

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

У меня немного 'гудит' мозг, что бы писать, что то серьезное. Поэтому набрасал небольшую заметку, о фишке, которая в свое время помогла мне сдвинуться с мертвой точки при изучении английского.
https://pikabu.ru/story/angliyskiy_yazyik_uchitsya_ponimat_yazyik_a_ne_perevodit_dlya_izuchayushchikh_programmirovanie_7598240

Я понимаю, что не на такой контент вы подписывались, поэтому, дальше будет, снова, о программировании. Но, все же, мне кажется этот пост довольно актуальным, учитывая, как часто я ссылаюсь на материалы именно на англе. 
GPT-3 | Это стоит видеть

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

Собственно, случилось. Со вечера вчерашнего дня только и обсуждаем GPT-3. Мягко сказать - впечатляет. Наверно, нужно больше рассказать о ней, но есть проблема - даже описание может стать спойлером, потеряется этот момент удивления.

Поэтому, просто оставлю ссылку на перевод: https://habr.com/ru/company/itsumma/blog/511690

Здесь оригинал: https://maraoz.com/2020/07/18/openai-gpt3

На том же Хабре, вышел пост, где специалист по ИИ делится мнением относительно статьи выше. Очень хорошо дополняет картину: https://habr.com/ru/post/511764

На vc вышла подборка, с примерами применения GPT-3. Наверно самый впечатляющий, для меня, пример - подается словесное описание приложения, нейронка сама его создает: https://vc.ru/ml/143516

#ии #нейронки #habr #vc
Интересные проекты из скучных

Последний пост(ссылка на него в посте сверху) был о постепенном переходе к большим и сложным проектам. Сегодня, о диаметрально противоположном - маленьких, начальных проектиках, таких - из первых глав книг по вводу разные ЯПы. Обычно, они очень банальны, их главная задача показать какие то основы синтаксиса, но даже из них, можно сделать что то интересное.

В предыдущем посте, упоминалось простое, но, как мне кажется, крайне эффективное упражнение - посматривать и исправлять свой код недельной/месячной давности, особенно на начальных этапах. Этот пост, примерно о том же, только тут, доводим старый код до более менее интересного проекта.

Сама формула: добавить реализаций >> сравнить их между собой(проанализировать) >> возможный шаг - изменить масштаб. Для примера, рассмотрим "крестики-нолики", кажется, в каждой второй книге по вводу в ЯП предлагают написать эту игру. 

Добавить реализаций
В чем суть программы? В игре, в реализации алгоритма игры, самый простой вариант - рандомно ставится крестик/нолик в незанятую ячейку, и так до выполнения условия для победы. Очевидно, рандом - так себе реализация. Можно зайти в википедию и узнать про метод минимакса, комбинаторику, разные стратегии, дерево игровых ситуаций и т.д. Можно в гугле найти "как выигрывать в 'крестики-нолики'", и попробовать реализовать разные варианты самому. Да даже, просто первый ход в центр поля, дает преимущество, и улучшают метод полного рандома(кстати, в игре разные варианты реализаций, можно представить как уровни сложности).

Тут важно сказать одну вещь, она как раз относится к таким простеньким играм, если в игре реализовано взаимодействие человек vs компьютер, то ОБЯЗАТЕЛЬНО, должно быть вариант компьютер vs компьютер, кажется мелочь, но на деле архиважная штука, особенно, если взаимодействие происходит в окошке терминала. 

Сравнить их между собой(проанализировать)
Именно на этом шаге, проект становится интересным. Что в данном случае сравнивать? Очевидная метрика игры - победа/проигрыш/ничья, еще на ум приходит количество ходов. Пару счетчиков, и у нас уже есть цифры которые можно сравнивать. Самый простой пример: в позапрошлом абзаце, я написал, что 'первый ход в центр поля, дает преимущество', вроде бы логично, но нет примерной цифры, насколько это большое преимущество, нужно это проверить. Запускаем, предположим 1000 итераций игры, игрок A всегда начинает с занятия центра поля, дальше идет рандом, смотрим какой процент игр, в итоге, выиграл игрок A.

Эта программа не сильно отличается от самой простой реализации "крестиков-ноликов". Вместо хода пользователя, мы заново запускаем функцию заполняющую свободную рандомную клетку, прикручиваем счетчик, добавляющий единицу при каждом вызове этой функции, ну и при исполнении условия для победы, прибавляем к другому счетчику 1, после чего смотрим какой процент составляет это число от 1000 и считаем среднее колл-во ходов за игру. 

Но само направление программы, меняется кардинально, от безделушки мы переходим к проекту, где действительно можно исследовать и сравнивать разные алгоритмы, экспериментировать с ними и выдвигать/проверять разные теории. Понятное дело, что чем больше мы уходим в математику, к более сложным реализациям, тем сложнее будет программа и легким проектом это уже не назовешь. Тут наверно важно вовремя остановится. "крестики-нолики", не сказать, что очень глубокая по сути своей задача, но сам принцип остается тем же и на более интересных проектах.

Возможный шаг - изменить масштаб
Имеются в виду - начальные условия. В "крестиках-ноликах" - это не очень хорошая идея, изменив величину поля, заново, придется переписывать реализации, при этом сложность их будет только расти. Но к примеру, в "морском бое", это к месту, что если мы увеличим поле в 3 раза, или оставим только большим корабли. Будет ли лучше работать алгоритм когда мы ищем идя по периметру, или лучше искать через клетку? 

Эти же правила применимы к некоторым cs проектам(хотя они и так самодостаточны). К примеру, возьмем все тот же архиватор, разные варианты сжатия, разные алгоритмы.
Какие лучше работают на большом изображение, а какие на мелких, все те же? Анализ может, например, показать: алгоритм A быстро и хорошо справляется с небольшой картинкой, алгоритм B с большой. В таком случае, можно сделать вывод - стоит написать архиватор который будет в зависимости от веса файла решать какому алгоритму его скормить.
Вышла первая часть - ‘плана изучения программирования’.

Pikabu - https://pikabu.ru/story/_7790900
Reddit - https://www.reddit.com/r/Pikabu/comments/jhvuqx

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

Не всем удобно читать за пределами телеги, поэтому у больших постов будет краткое содержание(которе удобно здесь же и сохранить и использовать как список учебных материалов).

План изучения программирования| Часть 1 (кратко)

1-4: об уч. материалах
5,6: о самом процессе программирования

1. Для начала, нужен синтаксис, самые основы. Свейгарт[Автоматизация рутинных задач с помощью Python] - идеальный вариант, не перегруженный, понятный, с интересными задачами, к тому же, по пути задаваемым книгой и будет дальнейшее движение этого плана.

2.Чтобы понять процесс программирования, для начала надо его увидеть. https://www.youtube.com/watch?v=vpyWbpdk3Xs - уникальный пример, где автор показывает процесс мышления при написании программы. Можно считать видео ориентиром, когда подобный способ понят, понят и сам процесс программирования.

Почему автоматизация рутины?
Что бы как можно раньше прикоснуться к процессу программирования. Это не строгое ограничение, скорее рекомендация на какие задачи стоит обратить внимание в самом начале. Книга Свейгарта породила огромную волну материалов по "автоматизации". Если вбить на ютубе "python automation", темы роликов будут от работы в Excel до знакомств в Tinder(десяток подобных видео, и алгоритм рекомендаций избавит от нехватки новых идей).

3. https://stepik.org/course/575 - курс по автоматизации тестирования, нам интересны первые две его части. Там про selenium - инструмент, для автоматизации в браузере(это про - зайти на страницу, заполнить форму, нажать кнопочки, оставить комент и т.д. и т.п.).

4. https://stepik.org/course/4519 - курс в котором учат гуглить, искать на StackOverflow, читать документацию и юзать библиотеки. Это тот самый подход, о котором не особо пишут в книжках, однако, это именно про такую - трушную практику.

Составляющие процесса программирования
Программист постоянно выстраивает структуру будущей программы, как бы выставляет какие то чекпоинты, идет по ним, создавая и заставляя эти куски функционировать как ему надо, можно не знать, как в точности, сделать определенный кусок, но важно понимать как его сделать(или где найти, как его сделать).

Подобный способ позволяет одновременно работать в двух плоскостях, на уровне планирования - взаимодействия с целыми кусочками кода(пускай даже не готовыми), и на уровне реализации - написания этих кусочков кода.

5.Уровень реализации. Оставим термин - 'кусочек', но по хорошему, его нужно подвести под какую то завершенную единицу кода(которой мы можем манипулировать на уровне планирования), скорее всего, на этом этапе - функцию.

5.1.Самое важное: Контроль происходящего
Ищем ответ на Stackoverflow, видим - понятный, но в 10 строк или не понятный, но небольшой, сразу хочется забрать, пригреть в своем коде. Так делать не стоит. Проблема в том, что на уровне планирования, контроль, не будет потерян(код что то делает, не знаем что именно, но знаем результат), но вот на уровне реализации - теряется, мы не понимаем что происходит, и это - прямой путь к говнокоду(lkz рутинных проектов, это скорее всего будет работать, но вот дальше, создаст кучу проблем).

5.2. Кусочки кода должны быть универсальными - будет намного удобней с ними работать. Есть код, заполняющий таблицу из 10 строк, по ходу проекта, понимаем, нужно 25 строк и еще 2 столбца, потом 5 строк 5 столбцов и т.д. Все эти изменения должны решаться не переписыванием половины кода, а заменой двух переменных(в нашем случае, число строк/столбцов).

5.3.Кусок кода должен выполнять только одну задачу. Кроме прямой связи с пунктом выше, это относится и к уровню планирования. Единицы планирования должны быть единицами, так удобней с ними оперировать.
Кусок кода закрывает три задачи, понимаем, что одна из них не нужна, или наоборот, хотим перенести в начало, изменить и т.д. Придется вынимать ее оттуда, делать новый кусок кода, обращаться к нему, в местах, где до этого обращались к старому и т.д. - много лишних действий(чем меньше действий - тем лучше).

6. Уровень планирования. Какого-то строго перехода/переключения, с одного уровня на другой - нет(понимание придет на практике). Главное помнить - этап планирования происходит постоянно, он не заканчиваться блок схемой/псевдокодом, он параллелен написанию кода.(в 'большой' версии поста следующие 2 пункта основаны на примере, здесь - только вывод)

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

6.2. Постановка подзадач исходя из - "по идее, каким то образом это можно сделать" - нормальная идея. Подзадачи рассматриваем отдельно, после соединяем, это особенно уместно, когда сложность подзадачи, заставляет нас довольно сильно углубляться в механизм работы чего либо, на время отходя от самой задачи.
Вышла вторая часть - ‘плана изучения программирования’.

Pikabu - https://pikabu.ru/story/_7869855
Reddit - https://www.reddit.com/r/Pikabu/comments/k4nj7z

Это не совсем самостоятельная часть плана, скорее небольшое дополнение к предыдущему посту. Пока, что бы было меньше путаницы, пускай это будет 2 часть. Главное - ее можно пропустить, на ход плана она не влияет. Со следующей части начнется computer science, и мы на время отойдем от python(но после cs, к нему вернемся), поэтому, в каком то смысле, эта часть сглаживает этот резкий переход.(почему такой резкий переход - есть в полной версии, здесь, напомню краткая)

План изучения программирования| Часть 2 (кратко)

Жалел, что не поделился этими 2 ссылками в прошлом посту, они сложнее - выбивались подхода, о котором писал выше

1.https://stepik.org/course/512 - курс по питону, для тех кто прошел основы. Стоит посмотреть хотя бы начало - там небольшой ввод в само устройство языка.

2.https://youtu.be/g6zzZxxifAw - один из лучших каналов для изучающих python. Ссылка на видео, где разбирают исходники одной python библиотеки. Отдельно стоит отметить стримы с code review.

3. DRY [Don't repeat yourself(не повторяйся)]
Не повторяйтесь, скорее всего это не нужно. Если в коде, подряд повторяется одно и тоже - нужен цикл, если повторяется, но в разных местах - нужна функция.

4. Псевдокод/блок схемы/комментарии нужны чтобы помогать
Именно помогать, а не мешать/раздражать/напрягать. Странная тенденция в некоторых курсах - буквально под каждую задачу заставляют делать эту, зачастую не нужную подготовку. Как, то что придумано для удобства может навязываться? Это просто бессмысленно. 

Очень естественным путем становится понятно зачем нужно все вышеперечисленное(те же, комментарии - ровно в тот момент, когда сам себе впервые задаешь вопрос - "почему/как/что я здесь написал?"), и если надобности в этом нет - то стоит задать вопрос "действительно ли задача этого требует?".

5. Самый верный способ понять 'что не так/где проблема' - построчный 'проход' кода(смотрим и объясняем себе же, что конкретно происходит в каждой строке)

6. Программирование всегда про рациональный подход

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

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

7. Язык программирования это инструмент, книги/курсы по япам это инструмент для изучения инструмента

Вроде бы, очень очевидная мысль. Но, на практике, отношение к уч.материалам противоположное - будто существует один, самый правильный вариант и нужно, сначала долго его искать, потом учить именно по строго определенной книге/курсу/методу. Как будто, это не один из вариантов(инструментов), а единственно возможный.

Если инструмент работает плохо, его надо менять. Определенные инструменты подходят под определенные задачи(материал подан отлично, за исключением одной главы, это может сильно затормозить, поскольку все вводы в ЯПы по одному сценарию(рациональный подход), можно получить те же знания из другого источника, а не топтаться на месте).
https://pikabu.ru/story/_7878526
https://www.reddit.com/r/Pikabu/comments/k7zowk

Как то я уже делал пост-список учебных материалов для изучающих python, они не были в рамках какого то плана, просто разделены на 3 уровня сложности. 

Вышла новая версия того поста. Прибавились пункты из 2 последних частей "плана изучения программирования". Еще несколько книг/курсов, о которых до этого не писал.

Все в одном месте, думаю это удобно, время от времени, по ходу плана буду делать подобные посты. 
https://pikabu.ru/story/_8003435

Вышла 3 версия списка уч. материалов. На этот раз, только об основах(мне кажется, наиболее востребованная тема), добавил пару ссылок, перегруппировал прошлые,  сделал отдельный пункт о том, как все это надо изучать.

Именно в таком виде, пост мне кажется наиболее правильным, поэтому, это финальная версия, и следовательно - последняя. Думаю, что все это хорошо дополнит пост о том, как делать проекты(скоро он выйдет), и в каком то смысле, получится гайд из 2 частей, о том как учить основы питона.
Про цепи Маркова и Как делать учебные проекты.

Перед тем, как рассказывать об интересных идеях для проектов, я подумал, надо бы расписать как их вообще делать. 

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

Для примера, прогнал через нее небольшое количество(≈50-100) цитат Аристотеля(алгоритм работает до символа точки, т.е. выдает по предложению), из осмысленного она сгенерировала:

Шутка есть самый верный признак дружбы.
Свойство добродетели состоит, скорее, в досуге.
Разум - это довольство собою.
Благодарность быстро стареет.


(из 20 примерно 3 удачных(15%), но никаких условий, кроме остановки на символе точки нет, можно эту цифру значительно повысить, к примеру, исключить слишком короткие предложения(меньше 2 слов), убрать их подаваемых данных слишком отличающиеся по стилю, и т.д и т.п)

Хотя рассматриваем все на примере цепи маркова, сами шаги везде одинаковы.

1. Понять как эта штука работает.
Цепь Маркова, в данном случае, очень показательна. Она не то, чтобы сильно известна, придется проделать небольшую работу по исследованию/изучению, но при этом, она достаточно понятным образом работает.

Пока, в код не лезем(это важно!). Цель этого шага - понять как эта штука работает, и мочь воспроизвести пошагово это процесс(словами объяснить или нарисовать простенькую схемку). Разумеется идем в гугл. Знаете английский - будет сильно проще(особенно, речь о формате, когда что то сложное объясняют на пальцах, на англе. подобного в разы больше).

Мне кажется, лучшее объяснение цепей Маркова написал Alexander Dejeu
Оригинал: https://hackernoon.com/from-what-is-a-markov-model-to-here-is-how-markov-models-work-1ac5f4629b71
Перевод: https://tproger.ru/translations/markov-chains/

2. Реализация.
Вот здесь псевдокод/блоксхемы, как никогда уместны. Набрасываем шаги, от которых и будем отталкиваться. Для цепи маркова - 2 шага: 1 - делаем данные удобными для алгоритма, 2 - алгоритм идет по данным(сам алгоритм считает следующий шаг на основе настоящего,игнорируя предыдущие). Далее отталкиваемся от этих шагов.

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

Это станет понятно на практике, но все же напишу, нет никакого смысла - подавать данные, той же сложности и тем же способом, что и финальном проекте, главное репрезентативность. Т.е. понять насколько хорошо работает код, можно и без пары сотен цитат древнегреческого философа, для цепи маркова, к примеру, подойдет набор цифр 101010123456.

3. Code review
Ревью кода - архиважная вещь, наверно самая большая потеря в самостоятельном изучении. Но все равно, неплохой идеей, будет смотреть ревью чужого. Дело в том, что ошибки плюс/минус у всех похожи. И читая о чужих о чужом коде, можно узнать многое о своем. 

Хороший пример крутого code review: https://codereview.stackexchange.com/questions/193419/markov-chains-to-generate-text
Запрос в гугле: code review + markov chain + python, скорее всего выдаст первым сайт выше(этот сайт относить к той же сети, что и stackoverflow)

4. А как(и почему, именно так) сделали другите?
Я не рекомендую, при самостоятельном изучении(особенно на ранних этапах), искать реализации до того, как сделана своя. Уж очень велика вероятность, что один из вариантов покажется наиболее правильным, и весь дальнейший процесс выстроится вокруг чужого решения. 

Это имеет мало смысла в учебных проектах, поскольку одна из причин их делать - научиться переводить свои идеи в код(а чтобы они стали своими, сначала нужно понять принцип работы(п.1), а потом самостоятельно выстроить реализацию(п.2)).

Но после своей реализации, исправления в ней ошибок, на этапе, когда основа для будущего проекта уже готова, это весьма полезная штука.
Главное - анализировать разные подходы, это может показаться сложным, разумеется это вопрос опыта, но начать можно с выделения каких то особенностей, к примеру - этот код быстрее, тут можно без ооп, здесь намного понятней и т.д и т.п.


Что из этого можно сделать?
Цепи Маркова - настоящий простор для интересных идей. К тому же, они довольно эффектно работают, и скажем так, опережают ожидания.

Генерация текста без нейронок - довольно интересный челлендж, и честно сказать, увлекательное занятие. Итог похож на просмотр фокуса, понимаешь что магии нет(цепи Маркова не могут в смысл), но результат все равно восхищает.

Довольно интересный вариант: чат-бот, с анализом тональности(т.е. программа оценивает эмоциональный окрас сообщений собеседника) Обе эти темы относятся к задачам обработки естественного языка(Natural Language Processing). Крутой курс об этом: https://youtu.be/5BVebXXb2o4 [англ.] 6 уроков, как раз включая цепь маркова и тональность текста.

Разумеется, можно генерировать не только текст, программе все равно что за данные ей подаются. Один из самых примечательных вариантов - музыка. К слову, по запросу “markov chain music” гугл на первой же странице выдает ссылки на университетские статьи. 

В самом простом варианте можно подать алгоритму аккорды, в самом сложном - ноты(хотя лучше результат, будет на сгруппированных, типа триолей, а не на отдельных, там вообще может получится бесконечный перебор двух нот).

Вообщем, применение цепей Маркова - необъятная и очень интересная тема, куча возможностей для экспериментов и крайне занимательная штука. 
#идеи_для_проектов #цепь_маркова
Приветствую, недавно канал преодолел отметку в 1000 подписчиков, это что-то за пределами всех возможных ожиданий

Спасибо всем, кто подписался
Спасибо всем, кто рекомендует канал


Это невероятно мотивирует, будем дальше расти и развиваться(100% выходим на регулярный выход постов, накопилась куча интересных ссылок на уч.материалы, заметок/набросков будущих больших постов, еженедельных рубрик и прочих интересных штук)
CS50 | Введение в искусственный интеллект с python

Перевод - https://youtu.be/nDCFajF49U4
Оригинал[плейлист] - https://www.youtube.com/watch?v=WbzNRTTrX0g&list=PLhQjrBD2T382Nz7z1AEXmioc27axa19Kv&ab_channel=CS50

Ссылка выше - перевод первой лекции(на данный момент переведено 4 лекции из 7) из курса по ИИ, следующего за cs50, как говорит сам Дэвид Мэлан(тот самый профессор, легендарный лектор CS50): “этот курс начинается там, где заканчивается основной cs50”, кстати видео с приглашением на курс, где он это и говорит, тоже переведено - https://youtu.be/vKPdq0xDeXk

Даже не знаю нужно ли что-то говорить про качество, это великолепно, это гарвардский CS50. Меня всегда поражало насколько правильно, последовательно и интересно они подают сложные темы, еще больше меня поражает колл-во этих тем (просто откройте описание к ролику, там есть таймкоды).

Отдельный респект автору перевода. Это титанический труд, невероятного качества перевод, как и написано выше, таймкоды, буквально на все темы в лекции, код удобно выложен на github(ссылка там же, где и таймкоды). И к сожалению, незаслуженно малое число просмотров.

Если вы прошли основы питона, посмотрели CS50, и хотите дальше углубится в изучении computer science(не говоря уже, об изучении ИИ) и python, то этот курс подходит как нельзя лучше.

P.S. Это не первое  “ответвление” от cs50 о котором я пишу, на канале есть пост о курсе посвященном gamedev https://t.me/tobeprog/8 [он без перевода]
#CS50 #академ_подход #курс #перевод
Может сложиться впечатление, что этот канал об изучении исключительно python, но это не так, он в целом, об изучении программирования. Никакой привязки к определенному языку нет. 

Питон отличный выбор первого япа, к тому же именно о нем выходил большой пост про уч.материалы. Поэтому, по крайней мере, пока что, будет превалировать питон, но и на другие япы иногда будем посматривать. Пост ниже - первый о JS.

Не знаю как скоро, но обязательно выйдет ряд постов про уч.материалы для разных языков(по типу уже существующего поста про уч.материалы для python). 

Скорее всего, первым будет Си, знаю что для многих это странный выбор и вообще мало интересный ЯП. Именно поэтому, и хочу о нем рассказать, объяснить зачем его вообще нынче учить и почему он настолько любим программистами. 
Выразительный JavaScript

Оригинал - https://eloquentjavascript.net/ 
Перевод -  https://karmazzin.gitbook.io/eloquentjavascript_ru/

Один из самых примечательных вводов в ЯП. Отличная книга, много кода, много примеров, все хорошо объяснено, отдельно хочется отметить главы-проекты, чего только стоит проект - создание маленького языка программирования.

Важная деталь - темп повествования может быть слишком уж быстрым(что называется - 'галопом по Европам'). Это особенность многих вводов в ЯПы, в этом нет ничего страшного, но для совсем начинающих это может стать проблемой(обычно, говорят что подобные уч.материалы для продвинутых начинающих). 

Если есть какое то понимание питона, и что важнее - программирования, особых проблем быть не должно. В любом случае, решается все просто - параллельным прохождением уч.материала где разжевывают все мелочи.

#книги #JS #перевод
Для того, чтобы собрать все посты в одном месте(например, чтобы на них было удобнее ссылаться), решил перепостить сюда несколько больших постов, не выходивших ранее на этом канале.
Python, основы | что читать/смотреть | как правильно использовать уч.материалы

Учебные материалы разделены на 3 разных подхода, деление это весьма условное, но с ним будет удобнее объяснить какие то моменты.

1. Автоматизация рутины
1.1. Автоматизация рутинных задач с помощью Python, Свейгарт - сильно отличается от других вводов в Python(да и не только, в python). Дело в подходе к практике: вы сразу учитесь делать полезные штуки(как говорит книга, автоматизировать свою рутину), а не стандартные абстрактные задачи, служащие исключительно для закрепления материала.

Кроме того, что это, рациональный способ изучения python(язык позволяет быстро сделать что то интересное/полезное/работающие, почему бы не использовать эту приятную, и довольно впечатляющую возможность). Это в принципе, правильный способ изучения программирования, именно программирования, а не просто синтаксиса языка.

1.2. https://stepik.org/course/575 - курс по автоматизации тестирования, нам интересны первые две его части(в рамках изучения питона). Там про selenium - инструмент, для автоматизации в браузере(это про - зайти на страницу, заполнить форму, нажать кнопочки, оставить комент и т.д. и т.п.). О нем рассказано в книге Свейграта, но нужна практика. В этом курсе ее много и подана она отлично.

1.3 Огромное кол-во туториалов по автоматизации. Книга Свейгарта породила целую волну материалов по "автоматизации". Если вбить на ютубе "python automation", то темы роликов будут от работы в Excel до знакомств в Tinder(десяток подобных видео, и алгоритм рекомендаций избавит от нехватки новых идей).

2. Более классический подход
Большинство программистов начинало именно так - хороший толстенький томик ввода в яп.
В большинстве случаев, вам будут рекомендовать именно этот, можно сказать, проверенный годами подход.

2.1. Книги, которые мне кажутся наиболее удачными представителями 'классического' подхода:
- Лутц, Изучаем Python. Наверно самая рекомендуемая и популярная книга по питону. Может оказаться несколько перегруженной для начинающих(в этом нет ничего страшного), в таком случае стоит выбрать один из вариантов ниже.

3 замечательные книги, немного разные по стилю(можно выбрать что ближе), во всех 3 очень хорошая подача, именно для начинающих
-Изучаем Python. Программирование игр, визуализация данных, веб-приложения, Мэтиз Эрик

-Программирование на Python 3. Подробное руководство, Марк Саммерфилд

-Программируем на Python, Доусон Майкл

2.2. https://stepik.org/course/67 - тот самый курс, его рекомендуют в каждом посте про изучение python, а если его там не окажется, то о нем вспомнят в комментах. Очень популярный(430к учащихся), возможно самый популярный курс по python на русском.

Звучит несколько иррационально, но в программировании, популярность учебного материала - верный признак качества. Правда работает это тогда, когда популярность - следствие рекомендаций уже ставших программистами(именно подобные отзывы и стоит искать при подборе уч. материалов). Поэтому, на туториалы с миллионами просмотров, из разряда ‘‘выучимся кодить за 15 минут’’ - правило не распространяется.

3. Академический подход
Кроме ряда очевидных положительных сторон, есть одна особенность(тоже положительная), которая сильно влияет на процесс изучения - подразумевается предварительная подготовка студентов(даже если, курс читается с нуля). И тут речь не столько о предмете, сколько о способностях к усвоению материала. У вузов есть система отбора, у хороших - довольно жесткая, к тому же высшее образование, в принципе и не претендует быть чем то простым(например, если что то можно объяснить за 10 минут, то это не буду растягивать на 2 часа).

3.1. 
https://youtu.be/KdZ4HF1SrFs Алгоритмы на Python 3 
https://youtu.be/fgf57Sa5A-A Практика программирования на Python 3
Два замечательных курса(МФТИ) Тимофея Хирьянова. Одни из лучших лекции по Python, и скорее всего, лучшие на русском.

3.2. Если все хорошо с английским, довольно интересный вариант:
https://youtu.be/nykOeWgQcHM -1 лекция из MIT 6.
0001 Introduction to Computer Science and Programming in Python) - знаменитый МТИ(Массачусетский технологический институт), ввод в сам язык и cs одновременно.

4. Что с этим всем делать?
4.1. Все вышеперечисленный варианты, решают задачу - изучить питон с 0(неважно, что где-то больше практики/теории, где-то учебный материал сильно выйдет за рамки основ или наоборот будет исключительно в них т.д. и т.п.). К тому же, они все - топовые представители своего формата. Поэтому, можно выбрать, буквально любой(какой больше по вкусу, да даже случайный), и это должно сработать.

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

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

Начать с автоматизации, это наиболее мягкий вход для новичков. Также, он решает проблему - 'непонимания процесса программирования', когда, ученик вроде бы и изучил основы синтаксиса, но в само программирование все еще не может.

После Свейгарта, можно, как минимум, научится с помощью кода закрывать, как говорит книга, свою рутину. Мб не столь впечатляющий круг задач, но это уже настоящее программирование. К тому же, если будет принято решение дропнуть процесс(будем реалистами, это случается часто), то как минимум, останется очень полезный навык.

Вторым шагом, надо закрепить изученное и закрыть пробелы(а их будет достаточно). В качестве ориентира, с которым стоит сверятся, отмечая, что пока не ясно - Лутц(настольная книга на все время изучения). Основным учебным материалом любой вариант из п.2. - п.3. Важный момент, их можно комбинировать, к примеру смотреть цикл лекций, одновременно проходя курс на степике и читая книгу, ничего страшного в этом нет, путаницы это не создаст, более того это может упростить и улучшить процесс.

4.3. Существует куча других отличных книг/курсов, и далеко не 2 вуза выкладывают свои лекции, более того, можно выдумать, куда более сложный способ изучения, и он может быть вполне рабочим. Но нужно ли все это? Меня смущает обилие списков с кучей учебных материалов, которые забывают упомянуть одну важную штуку - для того, чтобы выучить основы программирования, и мочь что-то сделать используя определенный яп, всего пары названий из подобного списка будет достаточно.

5. После основ(не зависит от выбранного подхода)
Ряд учебных материалов, изучение которых, на раннем этапе, сильно поднимет уровень.

5.1. https://youtu.be/vpyWbpdk3Xs Уникальный пример, где автор показывает процесс мышления при написании программы. Будет позитивной практикой, время от времени пересматривать и отмечать что-то новое, трекать свой прогресс. Можно считать видео ориентиром, когда подобный способ понят, понят и сам процесс программирования.

5.2. https://stepik.org/course/4519 - курс в котором учат искать на StackOverflow, читать документацию и юзать библиотеки. Это тот самый подход, о котором не особо пишут в книжках, однако, это именно про такую - трушную практику. В каком то смысле, здесь учат делать, как в видео выше.

5.3. https://stepik.org/course/512 - курс по питону, для тех кто прошел основы. Стоит посмотреть хотя бы начало - там небольшой ввод в само устройство языка, стек вызовов, пространство имен, области видимости и прочее.

5.4. CS50
Этот Гарвардский курс ввода в computer science полезно посмотреть всем начинающим программистам.

P.S. Программирование - это не про колл-во прочитанных книг и пройденных курсов, оно про практику. Уч. материалы - это инструменты, они помогут прояснить какие то моменты, но ту самую практику за изучающего не сделают. Можно до бесконечности искать уч. материалы, проходить их, иметь кучу сертификатов, сделанных упражнений из конца главы и переписанного кода с туториалов, но так и не мочь программировать. По сути, просто отодвигать саму практику, это на самом деле, довольно бессмысленно.
Нет никакого смысла, искать правильный способ начать учить язык(тратить на это кучу времени), нужно просто подобрать самый удобный инструмент, сосредоточится на практике, если после, знаний категорически не хватает(для реализации практики), нужно снова подобрать самый удобный инструмент и получить их.

В одном из постов, я приводил пример про комментарии в коде, в некоторых курсах, буквально, заставляют их писать под каждый хеловорлд. Это вызывает, разве что, раздражение. Можно в сотый раз попытаться объяснить их важность, однако, зачем они нужны, станет понятно и без этого. Очень естественным образом, на практике - ровно в тот момент, когда сам себе впервые задашь вопрос - "почему/как/что я здесь написал?"