Попробую сформулировать основные направления в подготовке по специальности «Компьютерное программирование»

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

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

Встроенные типы данных

Операторы управления потоком

типы, определяемые программистом

Массивы

Типы строк, операции над строками

Ввод, вывод

Функции

Работа с файлами

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

И этот раздел знаний будет называться «базовые языковые конструкции».

Для проверки усвоенного материала, как правило, в учебниках используются тривиальные задания:

  1. получить от пользователя количество элементов в массиве, сохранить данные — элементы массива, введенные пользователем с клавиатуры, вывести среднее значение, максимум, минимум…
  2. Узнать, является ли данное значение подстрокой заданного текста, если да, удалить или заменить;
  3. Подсчитать количество определенного символа в тексте

Ну и игры, куда же без них: программирование должно приносить удовольствие!

  • Игра «Больше или меньше» (программа генерирует число, допустим от 1 до 100, предлагает угадать число, на ввод пользователя отвечает: больше, меньше, если не угадали иначе, поздравляет с выигрышем и сообщает количество попытки.
  • Игра «Быки-Корова» (программа генерирует 4-значное число, каждая цифра может встречаться только 1 раз, при вводе пользователем числа программа отвечает на количество угаданных цифр в номере на своих позициях (Быки), а количество угаданных цифр в числе не на своих позициях (Коровы).Например: программа сгенерировала 4065 на ответ пользователя 5168 на ввод: 1:1 (1 цифра на своем месте: «6», 1 цифра угадана, но не на его место: «5»), для ввода ответа 5406: 0:4).
  • Шифровать и расшифровывать текст Цезарем (переход на указанный ключ справа от каждой буквы, см. http://crypto.it-days.ru/docs/alg.htm).

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

Следующий раздел знаний, который вы не можете пропустить: алгоритмы и структуры данных.

Программа-минимум по этой теме:

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

Также особое внимание следует уделить алгоритмам сортировки, бинарному поиску элементов в отсортированном массиве, понятию графа, алгоритмам поиска в глубину: поиск в глубину, DFS и поиск в ширину, BFS.

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

  1. Напишите проверку орфографии. На вход программа получает словарь (список слов) и текст, который необходимо проверить. Программа выводит в текст те слова, которых нет в словаре. Подумайте об эффективности алгоритма.
  2. На вход программа получает текст (список слов, разделенных пробелами). В словах с повторяющимся символом, встречающимся более 4 раз, удалить первые 3 встречающихся символа, а в словах, в которых один и тот же символ встречается более 8 раз, удалить последние 3 встречающихся символа. Вывод программы: исправлен текст.
  3. Программа-фильтр: на входе поток текста. Выдавать сообщение немедленно, как только указанное слово встречается в потоке.

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

Вот, пожалуй, только пройдя описанные выше шаги и наловчившись с достаточно сложными задачами, вы сможете ответить для себя на вопрос: действительно ли мне нравится программирование? Это весело для меня? :)

Однако этого недостаточно, чтобы программирование стало профессией!

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

Как минимум, вам потребуется опыт и знание объектно-ориентированного программирования (ООП) и шаблонов проектирования.

Да, все приведенные выше примеры легко реализовать с помощью процедурного программирования.

В процессе изучения и работы над разделами выше вам еще предстоит освоить сопутствующие инструменты:

Среда разработки (IDE): например, Microsoft Visual Code (Python, JavaScript), Visual Studio (C++, C#), Eclipse (Java), SQLDeveloper

Система управления исходным кодом (git, svn, TFS)

Система сборки (сборочные файлы UNIX, ant, maven, nant, …)

Фреймворки, библиотеки

И к этому моменту вам нужно подумать о специализации. Какие приложения вам нравится разрабатывать? За что?

Вот примерный список вопросов (но далеко не исчерпывающий):

Пишите мобильные приложения для Android, iOS?

Разработка графических приложений?

Разработка игры?

Разрабатывать бизнес-приложения? Если да, то это клиент-сервер или веб?

Если веб, то фронтенд или бэкенд?

Разрабатываете настольные приложения для Windows?

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

Например, для работы фронтенд-разработчиком нужны знания HTML5, CSS для верстки, а также понимание, зачем нужен bootstrap, язык программирования JavaScript и хотя бы один из 3-х популярных фреймворков: React/Redux, Vue.js или УгловойJS.

Для серверной логики веб-программирования возможны варианты: если Python, то Django или Flask или FastAPI, если Java, то JSP (Java Server Pages), или PHP, Ruby on Rails и т. д.

Разработчик C# для рабочего стола Windows будет использовать библиотеку .NET Framework в Windows Form.

Разработчик Java в серверных приложениях может использовать JDBC (подключение к базе данных Java), синтаксический анализ DOM/SAX xml и т. д.

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

И только тут можно себя поздравить: я программист!!

Надеюсь, это поможет принять правильное решение!