{"id":14293,"url":"\/distributions\/14293\/click?bit=1&hash=05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","hash":"05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043d\u0438 \u043a\u043e\u043f\u0435\u0439\u043a\u0438","buttonText":"","imageUuid":""}

Алгоритм изучения ЯП

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

Хоть вся информация доступна для изучения в открытых источниках, но нет предложенного единого подхода к каждому языку программирования. Я решился это исправить, создав некий “Алгоритм” для изучения самых популярных языков программирования (На момент написания статьи – Python, Java, C++).

P.S.: Как было подсказано в комментариях - для начала лучше научиться решать задачи, которые вы хотите заставить делать компьютер, самому. Научитесь представлять себе алгоритм решения задач, и только после этого переходите к изучения синтаксиса языков.

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

Алгоритм изучения языков программирования

1. Определение, какой ЯП тебе нужен.

Наиболее легкие и простые ЯП для новичка – C, Java, Python. Если вы только познаете мир IT, то рекомендую начинать с них. Так же выбирать язык надо в зависимости от конечных целей изучения ЯП, поскольку каждый из них необходим для разных областей.

Содержание скрыто
Показать

Статья для помощи - https://habr.com/ru/company/ruvds/blog/315572/

2. Поверхностное изучение выбранного языка

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

(Здесь и далее – все статьи будут приведены только для ЯП Python в связи с личными предпочтениями автора статьи) Неплохая статья для получения первичных знаний - https://techrocks.ru/2019/01/21/about-python-briefly/

3. Изучение базового синтаксиса:

a. Типы данных

У каждого ЯП типы данных обозначаются по-разному, но всегда имеют одинаковое или схожее значение

Содержание скрыто
Показать

Статья(Возьмите из нее лишь числа и строки, больше не надо) - https://tproger.ru/translations/python-data-types/

b. Функции ввода/вывода

Вывод данных на экран/консоль и ввод данных с клавиатуры

c. Операции с числами

Сложение, вычитание, деление

d. Операции со строками

Проще увидеть, чем объяснить (Сложение двух строк, счёт символов в строке и т.п.)

Содержание скрыто
Показать

На этом сайте есть крайне полезная шпаргалка по работе со строками - https://pythonworld.ru/tipy-dannyx-v-python/stroki-funkcii-i-metody-strok.html?ysclid=ldk9u1zgh5450682725

Содержание скрыто
Показать

На 3 вышеперечисленных пункта одна статья - https://academy.yandex.ru/handbook/python/article/vvod-i-vyvod-dannykh-operatsii-s-chislami-strokami-formatirovaniye

e. Операторы сравнения

Одно число больше/меньше/равно другому

f. Условные инструкции и их подвиды

Если а > b, то…

Содержание скрыто
Показать

g. Циклы

Содержание скрыто
Показать

4. Усложненный синтаксис:

a. Списки

Некоторые сгруппированные объекты, хранящиеся в одной переменной

b. Массивы

Как таковых массивов в питоне нет, но они есть в других ЯП

Примеры статей для C, C++, Java, JavaScript

Содержание скрыто
Показать
Содержание скрыто
Показать
Содержание скрыто
Показать
Содержание скрыто
Показать

5. Оставшиеся данные:

a. Функции

b. Классы

Содержание скрыто
Показать

c. Библиотеки

Содержание скрыто
Показать

d. Правила оформления кода

После изучения всего вышесказанного - можно считать себя полу-джуном. И на этом этапе важно усвоить такую вещь. Каждый язык требует своего оформления, и должен быть по своему красив в коде, что бы это можно было разобрать. Вы же не будете читать книгу, если она написана справа-налево (Мангаридеров не касается)снизу-вверх да еще и перевернутыми буквами? Ваш код, скорее всего, читать будут, но этому человеку будет крайне неприятно, если вы написали его криво. Статья по оформлению кода на Python'e -

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

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

0
36 комментариев
Написать комментарий...
Urban nomad

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

Ответить
Развернуть ветку
Jakob K

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

Ответить
Развернуть ветку
Victor Pomortseff

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

Ответить
Развернуть ветку
Ivan Priorov

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

Ответить
Развернуть ветку
Jakob K

это как-то противоречит словам Urban Nomad?

Ответить
Развернуть ветку
Ivan Priorov

Мне кажется да. Потому что очевидные вещи для одного человека не очевидны для другого.
Синтаксис в изучении сложен. Например в Go много способов объявления и определения переменных - как объяснить для чего так сделано и зачем вообще оно надо? - риторический вопрос

Ответить
Развернуть ветку
Victor Pomortseff

Синтаксис - это всего лишь способ выражения мысли. Если нет мысли - никакой синтаксис не поможет.

С чего вообще разработка начинается?
Вот есть задача - обработать 40млн записей (отобранных по ряду условий). Ок. Сразу думаем - "40млн в один поток многовато - долго будет, раскидаем на 10 заданий". Это значит что делаем головное задание, которое запускать 10 фоновых заданий-обработчиков. Затем делает выборку того, что подлежит обработке, упаковывает в пакеты (ну, скажем, по 100 элементов) и выкладывает на конвейер. Обработчики берут пакет с конвейера и обрабатывают.
Дальше смотрим - ага, конвейер на это платформе можно реализовать на очереди, пайпе, юникссокете. Дальше смотрим как проще/удобнее.
Затем думаем - ага, пайпы это низкоуровневое, его проще на С/С++ сделать (или готовое что-то подцепить). А вот для бизнес-логики лучше другой язык, более подходящий, использовать.
Дальше больше. Процедуру отбора в головной задаче лучше на скуле сделать (встроенном) - запрос будет готовиться один раз, потом пойдет массовая выборка. А вот внутри обработчика нам нужно какие-то записи из таблицы дергать. Там уже одна таблица - одна запись по уникальному ключу. Тут скуль излишне использовать - он ресурсов много жрет и требует времени на подготовку запроса, это проще и быстрее делать прямым доступом к таблице.
Вот примерно так должен думать разработчик...
Язык тут достаточно фрагментарно присутствует. Больше алгоритмизация.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Ivan Priorov

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

Ответить
Развернуть ветку
Victor Pomortseff

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

Ответить
Развернуть ветку
Ivan Priorov

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

Ответить
Развернуть ветку
Victor Pomortseff

В целом - да. Просто рисовать алгоритмы, не доводя их до конкретной реализации (хотя бы чтобы посмотреть а как оно реально работает) такое себе занятие :-)
И может быть на этом этапе (формирования алгоритмического мышления) стоит взять какой-то язык попроще (в мои времена - конец 80-х - начало 90-х) это был Basic. Почти все начинали с него так или иначе. Сначала с интерпретатора, потом появился "псевдокомпилятор" который собирал в одну программу ядро интерпретатора и код, потом уже нормальные компиляторы типа Turbo Basic.
Там был очень простой и понятный синтаксис и не было всех этих заморочек с памятью и прочим.
А вот потом уже возникает неудовлетворенность синтаксисом, хочется новых возможностей и тогда ищем другие языки (кстати, каждый следующий язык дается все проще, за исключением ситуаций со сменой парадигмы, например, перехода от процедурного к функциональному программированию).

Ответить
Развернуть ветку
Ivan Priorov

Я краем застал только куБайсик)) посему сразу начал с изучения Си.
Потом был Перл, потом пхп и поехало оно всё - согласен, после Си остальные языки изучать проще, потому что они становятся легче.

Ответить
Развернуть ветку
Victor Pomortseff

Я начинал с классического Basic (правда, до этого еще немножко фортрана было, но совсем мало), потом BasCom, TurboBasic. Потом TurboC (еще 1.0, где даже графики не было - писали сами на ассемблере), потом уже С++ появился... Попутно под разные задачи - Clarion, Clipper...
Ну а на старости лет занесло в банк где боевые сервера работают на платформе IBM i, а там вся бизнес-логика на RPG. С/С++ тоже есть, но мы его используем для всяких низкоуровневых вещей. Например, фреймворк для многопоточной обработки больших объемов данных. Сейчас вот параллельно с "проектными" задачами делаю API для работы с UserQueue (есть на IBM i такой системный объект - "очередь") ядро API на С++ (поскольку там все очень низкоуровневое - работа с системными указателями, машинные инструкции и т.п.), поверх него набор программ на RPG для реализации CL команд (CL - командный язык на IBM i, позволяющий в том числе создавать свои команды) плюс набор UDTF и хранимых процедур для возможности работы с очередью посредством SQL - это тоже удобнее на RPG делать...
Проектные задачи, конечно, 99% - RPG. Хотя некоторые вещи удобнее на С/С++. Например, "нормализация строки" - удаление лишних пробелов + приведение к одному регистру + удаление/замена некоторых символов (по списку). Все это можно делать отдельными операциями на RPG, но на С/С++ все это можно реализовать за один проход строки (что быстрее и эффективнее) - на RPG такая реализация будет достаточно корявой.
Плюсом - в IBM i есть "интегрированное языковое окружение", которое позволяет писать один модуль на RPG, другой на С и все это собирать в одну программу. Главное тут правильно интерпретировать типа параметров (что требует некоторого понимания процесса на уровне где передача по ссылке, где по значению, как внутри устроен тот же varchar в RPG которого нет в С/С++ и т.п.).
В общем, с таким анамнезом вопросы синтаксиса конкретного языка как-то на второй план отходят - просто набор правил которые надо запомнить. А на первом плане остается извечное "что делать", а не "как делать".

Ответить
Развернуть ветку
Ivan Priorov

Да вы, батенька, монстр! =) а говорят в банках всё на Java...
Вообще впервые узнал про RPG... Весьма любопытно.

Ответить
Развернуть ветку
Victor Pomortseff

Банки разные и структур разные. У нас основные сервера (где крутится АБС) на IBM i (IBM PowerS9).
Ну это такая очень специфическая, ни на что не похожая платформа. Объектная ОС, интегрированная БД (DB2), ILE (Integrated Language Environment) с поддержкой языков CL (Command Language - язык команд ОС, но при этом на нем можно писать программы, которые компилируются в "программный объект"), С/С++, RPG, COBOL (у нас не используется).
Но вокруг еще очень много "внешних систем", а там все что угодно может быть - RHEL, SLES, HP-UX, Windows Server...
И да, Java тоже есть, но не на наших серверах. Есть команды разработки и на Java и на C# и мобильная разработка и сайты и SAP и Pega и WBI, но мы работаем на RPG в основном (кроме всего прочего, он еще и SQL позволяет встраивать непосредственно в RPG код, это помимо возможности прямой работы с таблицами - чтение/запись/удаление/изменение/поиск по ключу).
Сервера изолированы от внешнего мира - связь или через IBM MQ или через WebService на отдельной шине.

Ответить
Развернуть ветку
Роман Анисимов

Что за чушь)

Ответить
Развернуть ветку
Pedal Horse Mashineries Inc

Где то читал что мудрые олдовые разрабы рекомендуют начинать сразу с "тяжелого" например С++, так как "легкие" специфично формируют мышление, которое потом трудно восстанавливать.

Ответить
Развернуть ветку
Роман Анисимов

А сложные напрочь отбивают желание заниматься программированием

Ответить
Развернуть ветку
Pedal Horse Mashineries Inc

Тогда яркий квадратный рюкзак.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Ivan Priorov

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

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Victor Pomortseff

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

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Victor Pomortseff

Ну для сортировки пузырьком malloc не нужен - там могут быть и статические массивы

А строки - они разные бывают. Я вот сейчас пишу на С/С++ (меньше, только низкоуровневые вещи) и RPG (бизнес-логика).

Так вот в С строки null-terminated, а в RPG их два типа - обычный char заданной длины ("пустая" строка забивается пробелами, если размер содержимого меньше объявленного размера строки, "хвост" забивается пробелами) и varchar который по факту есть структура - первый элемент - 2 (или 4 в зависимости от того как объявишь) байта длины, затем собственно строка (массив байт)...

И вот это все сразу учить? А еще учить что у строки опционально может быть объявлен CCSID? И что если вы для строки объявили CCSID(*utf8), то при присвоении ей чего-либо оно автоматически конвертируется в UTF8 (это еще ладно - может быть CCSID(*hex) - там вообще оно превращается в 16-чное представление).

Такие вещи только запутают окончательно неокрепший мозг...
Не говоря уже о более тонких вещах типа разницы между clear и reset для переменной... Или вот таких фишках:

dcl-s str1 char(10) inz('0123456789');
dcl-s str2 char(5);
dcl-s str3 char(5);

str2 = str1;
eval-r str3 = str1;

после чего str2 = '01234', а str3 = '56789' :)

Кстати, после clear str1 она будет пустой (забита пробелами), а после reset str1 вернется к значению инициализации - 0123456789

Все это уже потом, когда человек начинает думать алгоритмами и каждую задачу сразу представляет как алгоритм.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Victor Pomortseff

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

Потому что, например, есть некая UDTF, которая возвращает строку с трех представлениях - as is, в кодировке utf8 и в виде hex строки. На С там придется писать всю эту конвертацию руками (ну или библиотеку какую подтягивать), а в RPG все есть:

dcl-s Data char(64000);
dcl-s DataUTF8 char(64000) ccsid(1208);
dcl-s DataHEX char(64000) ccsid(*hex);

DataUTF8 = Data;
DataHEX = Data;

и все!

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

Но проработка задачи всегда начинается с представления в голове как это все будет выглядеть. А потом уже раскидывается - это проще на С писать, это на RPG...

Причем, на С (а потом С++) я пишу с 90-го года примерно. А с 17-го, со сменой работы, еще RPG освоил. И не могу сказать какой из них мне нравится больше - и там и там есть свои плюсы и минусы. С лаконичнее, зато в RPG намного мощнее описание структур данных - явное позиционирование полей внутри структуры, возможность частичного или полного перекрытия полей, инициализация полей в описании...
Зато в С намного проще с указателями работать... Ну и так далее...

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

А вот когда дело до языка и всяких фреймворков доходит... Тут уже да. Очень желательно чтобы человек реально понимал что стоит за той или иной функцией, как оно внутри устроена, во что выльется ее использование. потому что без такого понимания часто получается работающий, но крайне неэффективный код.

Ответить
Развернуть ветку
Ivan Priorov

Что-то я не пойму проблему с utf8 на Си... UTF8 это же просто 8ми битное число.
Разъясни пожалуйста)
20 лет на Си не писал, да и не видел его. Очень любопытно)

Ответить
Развернуть ветку
Victor Pomortseff

Никаких проблем нет. Но. Внутри той системы, на которой я работаю, по умолчанию используется кодовая таблица EBCDIC 1025. А если надо что-то отправить во внешнюю систему, там эту кодировку не поймут - будут сплошные кракозябры. Поэтому нужна перекодировка.
На С это делается вызовом специальной функции. На RPG ничего вызывать не надо - просто объявляем строковую переменную с указанием нужного ccsid и перекодировка происходит автоматически при присвоении ей значения.
Более того,

dcl-s str char(10) inz('0123456789');
dcl-s strhex char(20) ccsid(*hex);

strhex = str;

даст нам strhex = 'F0F1F2F3F4F5F6F7F8F9' - код для 0 в 1025 есть 0xF0, для 1 - 0xF1 и так далее.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
DuDiDe
Автор

Большое спасибо за замечание, даже не заметил)

Ответить
Развернуть ветку
Роман Анисимов

Ваша схема уже на пункте 3.a ломается, если взять для изучения питон. А вообще, это стандартная схема изучения синтаксиса – к программированию не имеет никакого отношения

Ответить
Развернуть ветку
DuDiDe
Автор

Не вижу никакого обрыва, если честно. То, что это схема изучения синтаксиса - верно. Если человек решил изучать ЯП и умеет думать - ему синтаксис только и нужен. Если человек не умеет выстраивать логику - он должен сначала научиться этому. Никто не напишет 2+2, не зная, что значит "два" и что значит "плюс".
UPD: Понял, в статье указаны массивы, кортежи, множества и т.п. Сейчас попробую найти другую)

Ответить
Развернуть ветку
Евгений Бакулин

А где же объекты/классы?

Ответить
Развернуть ветку
Ivan Priorov

В Java их нет 😂

Ответить
Развернуть ветку
33 комментария
Раскрывать всегда