Попробую сформулировать основные направления в подготовке по специальности «Компьютерное программирование»
Я заметил, что часто ошибочно полагают, что для того, чтобы стать программистом, достаточно выучить конструкции того или иного языка программирования.
Да, действительно, чтобы написать простую программу, достаточно знать следующие разделы языка программирования:
Встроенные типы данных
Операторы управления потоком
типы, определяемые программистом
Массивы
Типы строк, операции над строками
Ввод, вывод
Функции
Работа с файлами
Необязательно: библиотечные (или встроенные) структуры данных: ассоциативные массивы, списки, динамические массивы и т.д.
И этот раздел знаний будет называться «базовые языковые конструкции».
Для проверки усвоенного материала, как правило, в учебниках используются тривиальные задания:
- получить от пользователя количество элементов в массиве, сохранить данные — элементы массива, введенные пользователем с клавиатуры, вывести среднее значение, максимум, минимум…
- Узнать, является ли данное значение подстрокой заданного текста, если да, удалить или заменить;
- Подсчитать количество определенного символа в тексте
Ну и игры, куда же без них: программирование должно приносить удовольствие!
- Игра «Больше или меньше» (программа генерирует число, допустим от 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.
Заданиями для самопроверки будут:
- Напишите проверку орфографии. На вход программа получает словарь (список слов) и текст, который необходимо проверить. Программа выводит в текст те слова, которых нет в словаре. Подумайте об эффективности алгоритма.
- На вход программа получает текст (список слов, разделенных пробелами). В словах с повторяющимся символом, встречающимся более 4 раз, удалить первые 3 встречающихся символа, а в словах, в которых один и тот же символ встречается более 8 раз, удалить последние 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 и т. д.
И вот, уже освоив специализацию, становится возможным реализовать полноценное приложение, каким бы оно ни было: веб- или десктопным или серверным модулем, плагином или чем-то еще.
И только тут можно себя поздравить: я программист!!
Надеюсь, это поможет принять правильное решение!