Мои размышления о программировании. Часть 2.
Мне 24 года и я так или иначе знаю 8 различных языков программирования. На данный момент я могу создавать вещи которые не могут 90% всех программистов.
Я не какая-то особенная ЧСВшная девочка или у меня есть врождённый талант. Нет, я не умнее чем каждый из вас, у меня нет столько практического опыта, чтобы иметь право стоять на ступеньке выше, чем все остальные. Даже количество языков программирования здесь вообще не при чём. Просто я изучаю программирование последние 10 лет и за это время я скопила некоторый опыт которым я делюсь с вами.
Думаю на этом моменте, вы были бы уже не прочь послушать мою историю вливания во всё это. Ведь наверняка вам интересно пронаблюдать чужой путь, чтобы на основе него, точно сделать всё идеально и ни в коем случае не повторить моих ошибок.
Для начала перестаньте тешить себя очередными илюзиями. Всё, что вам говорят блогеры по программированию, по большей степени для вас пройдёт мимо. В среднем, подобные посты и ролики как у них максимум "на послушать" или "на почитать", скоротав время с чашечкой чая.
Да, вы немного позавидуете, замотивируетесь их историей, испытаете тот самый прилив сил, который, правда обрушится, как только вы отправитесь что-то сделать для достижения вашей цели, но тут же упрётесь в вопрос:
Почему я озвучиваю такой пессимечтичный расклад? Потому, что все действия приводящие к результату, вы уже и так знаете без всяких постов. Они абсолютно одинаковы для каждой области. Хочешь чему-то научиться? Бери и учись.
Всего лишь два действия, которые нужно повторить 90 раз, и спустя 3 месяца ежедневных усилий, вы хотя бы сможете выработать какую-никакую привычку.
Хм... Конкретные шаги — вот что вы ожидаете. Действия от А до Я, которые дадут вам то, что вы хотите. НО! Что вы хотите сами? Прямо сейчас спросите себя об этом, и как минимум на пару минут вы залипнете, потому что дать конкретный, неабстрактный и неразмазанный ответ самим себе будет не так уж и просто. Окей, сегодня я сделаю эту работу за вас. Неважно как изучала программирование я, неважно с какими проблемами на пути я сталкивалась, важна сама выжимка опыта которую я через это приобрела.
Шаги, которые я вам предложу, дадут вам всю базу, на которой вы будете сами выбирать как вам строить своё дальнейшее обучение и в какую сторону двигаться. Это всего лишь одна из миллионов дорог по которой можно пройти. Конкретно эта дорога, хотя бы не позволит вам спустить годы на эллементарный поиск себя.
В какой точке бесконечного развития можно поставить себя на пьедестал и дать грамоту о приобретении программистских навыков?
Написание калькулятора это программирование? Так то, да.
А написание своего вируса? Тоже.
Написание операционной системы — это тоже программирование.
С такой логикой написав "Hello world", вы уже к вечеру можете считаться программистом.
В данный момент, программистов в официальной белой работе принято делить по уровню знаний на три категории:
Но это разделение актуально только в рамках той легальной официальной белой работы на которую вы претендуете. Мы же говорим не об этом, акцент будет на комплексное развитие своих навыков с последовательным обучением смежных областей. Поэтому давайте на время забудем про все эти категории и сконцентрируемся на самих знаниях, которые по итогу дадут вам неплохое понимание как устроена вообще любая программа в компьютере начиная от банального сайта заканчивая работой браузеров и операционных систем.
Берём ситуацию, где вы абсолютный ноль и компьютер для вас — это включить его, выключить, зайти в браузер, включить ютуб и запустить пару игр, пока они случайно не сломают ваш Windows показав экран смерти, после чего вы попросите кого-нибудь ваш Windows переустановить, а далее будете думать, что люди, которые умеют это делать — почти что боги программирования, и научиться этому можно только лишь отучившись в самом лучшем институте 6 лет. Если вы действительно узнали в этом описании себя — то не парьтесь.
Я сама точно также думала 10 лет назад. Я не буду грузить вас сложными терминами, хотя в технической сфере без них, сами понимаете, не обойтись. Ваша задача — составить конкретный ROADMAP:
Понятный путь, по которому сможет пройтись абсолютно каждый новичёк без всякой подготовки. Разве такое возможно? Возможно. Программирование легче чем вы думаете.
Компьютер. Всё что вы на нём используете — это программы. Как её исполняет компьютер физически вас на данном этапе волновать не должно. Программа — это абстракция. Всё что вы будете изучать это абстрактные вещи. Их не существует. Не воспринимайте это как что-то реальное. Виртуальный мир на то и виртуальный, чтобы оставаться нереальным.
Итак. Поехали.
Потому что это база, с которой начинает знакомиться с миром IT любой новичок. Для многих сфер деятельности кажется странным начинать изучение профессии сразу с готового продукта, но в программировании всё сделано через слои абстракции, которые отделяют вас (программиста) от уровня машины.
На первых этапах они позволяют вам вообще ничего не знать о работе компьютера, пользуйтесь этим. Просто пишите программу и она выполнится. Всё может показаться вам какой-то магией, но сейчас я скажу одно слово которое опустит всех вас с небес на землю. Компиляторы. Это программы которые берут вашу программу на выбранном вами языке и преобразуют её в набор инструкций процессора, которые её в конечном итоге и выполнят.
Почему мы сразу не пишем программы в машинных кодах? Потому что это долго, сложно, неэффективно, примитивно и этот список можно продолжать ещё долго. Пока что этой информации вам вполне хватит.
Один из этих шести языков программирования я предлагаю взять вам в качестве первого:
Все они популярные, широко используемые, по ним есть море обучающей информации и по любому из них вы без проблем сможете найти белую работу.
По поводу конкретного выбора, скажу так, первая группа языков лучше подходит для обучения, но если вы собираетесь работать в web, то есть писать сайты и веб приложения, то лучше выбирать вторую группу.
С особенностями каждого языка вы познакомитесь, уже непосредственно, при его изучении. Единственное, что сейчас стоит понять — это то, что вообще позволяют нам языки программирования делать. Они позволяют манипулировать данными с помощью логики и позволяют взаимодействовать с той платформой на которой они работают. К примеру — взаимодействие с фаловой системой компьютера, вызов функций операционной системы или взаимодействие с функциями браузера, если язык позволяет это делать. Все они позволяют принимать данные от пользователя, обрабатывать их, выводить ответ на экран, создавать приложения с пользовательским интерфейсом и так далее. Всё это делается максимально просто путём вызова предоставленных вам методов, но суть сейчас не в этом. Данные, с которыми вы по началу столкнётесь, знакомы вам уже изначально. Это:
С ними не всё так просто как кажется по началу, но всему своё время.
Для организации логики в языках предоставлены:
- Переменные. В переменных мы храним данные.
- Условия. Условные конструкции позволяют организовать ветвления, то есть если условия истино, то мы выполняем один кусок кода, если условие ложно, то выполняем другой.
- Циклы. Они позволяют выполнять код циклично до тех пор, пока условия, которые мы задавали циклу истинно.
Всё это вы спокойно изучите за пару часов немного потыкавшись и поняв как это работает.
Выведете приветственную надпись на экран:
Порадуетесь какой вы хороший программист, и вам на мгновение даже покажется, что программирование это слишком просто. Далее вы доучите оставшийся функционал языка в виде функций, которые позволяют выполнять один и тот же участок кода много раз, массивов, которые позволяют хранить в себе сразу целый набор данных и объектов, которые выступают в роли контейнеров хранящих в себе свойства и методы.
Предвижу следующий вопрос: откуда мне брать информацию. Смотрите, открываете ютуб и вводите: курс по (нужному языку программированию). Получаешь миллион роликов на любой вкус и цвет от самых разных авторов. Сейчас не 2010 год и информации по всем этим языкам в открытом доступе просто навалом, поверьте, она не менее качественная чем на платных обучающих курсах.
Окей, вы освоили базу, подтянули знания по работе с командной строкой и познакомились с базами данных и языком SQL, который позволяет с базами данных взаимодействовать. Язык этот очень простой и осваивается буквально за неделю. Первый этап пожалуй самый длинный, в нём больше всего информации которую вам предстоит изучить, но изучив её, вы всё ещё чувствуете себя не очень уверенно. Вроде как вы можете что-то создавать самостоятельно, а вроде как и нет.
Что же вам этакое придумать? А думать ничего не надо. Всё уже давно придумано за вас. Чтобы довести дело до конца, вам, первое, должно быть понятно, что вы делаете, а второе вам должно быть интересно. Поэтому берёте любой малварь из сети, ботнет, стиллер, клиппер, шифровальщик, и смотрите его исходный код. А далее полностью переписываете код повторяя за автором.
Либо же, если вы хотите создавать компьютерные игры, то находите 2D игру по которой есть обучение и делаете тоже самое. Змейка, сапёр, морской бой, бильярд и подобные игры знакомые каждому. Это всё то, что новичёк спокойно напишет уделив этому несколько дней. И снова этот вопрос, где всё это найти? Неповерите... В google и youtube, при этом неважно на каком языке будет писать автор, вам нужно будет лишь понять сам алгоритм. Поэтому смотреть код на одном языке, а писать его на другом вполне нормальная практика.
Что же это за загадочное слово? Говоря самым простым языком, если бы каждый сам писал программы так как хотел, то человек работающий в одной компании и привыкший писать код по их правилам в другой компании каждый раз очень бы долго вникал как у них там всё сделано. Нужна стандартизация. Фреймворки это уже набор готового кода на вашем языке, предоставляющий вам весь базовый функционал, одинаковый для любого проекта. Например для создания сайта нужна:
- Возможность постраничной навигации.
- Обработка URL запросов.
- Методы для работы с базами данных.
- Единая архитектура, на которой всё это будет работать от проекта к проекту.
Изучаются подобные вещи быстро, просто и хватит всего одной недели чтобы ознакомиться со всеми возможностями отдельного фреймворка.
На этом этапе вам предстоит начать писать уже реальные рабочие проекты, которые можно будет заносить в портфолио и использовать в качестве отправной точки. В первую очередь это приложения взаимодействующие с сервером. Вообще, создание собственных проектов, это очень хороший способ прокачки своих навыков. Это может быть вирус, сайт, чат бот или простая сетевая игра.
Хорошо. Теперь вы в состоянии писать стандартные программы и даже в состоянии устроиться на белую работу. Всё что будет дальше, по большей степени саморазвитие и прокачка навыков для более серьёзных дел, которыми вы наверняка были бы непрочь заняться.
Что вы вообще теперь знаете о программировании к этому моменту?
Всё чему вы научились за это время — это использовать уже готовые алгоритмы и структуры данных в языках, а также использовать данные, которые как-то сами по себе хранятся в памяти.
На этом моменте вы по прежнему не понимаете как работает большинство программного обеспечения на вашем компьютере, включая банальный редактор кода, торрент, интернет, операционную систему, изображения, программы видеосвязи и так далее. Поэтому всё дальнейшее изучение будет точечное, сконцентрированное на изучении отдельно взятых деталей программирования, названия которых вам мало что дадут пока вы сам не дойдёте до этой темы. Поэтому максимально кратко и по делу.
Знакомство с нотацией BIG O сильно поможет вам понимать сложность всех дальнейших алгоритмов с которыми вы будете сталкиваться. Быстрый он или медленный, какой в данный момент лучше, а какой хуже и так далее.
Базовые структуры данных которыми вы уже умеете пользоваться к этому моменту:
Здесь вы научитесь с нуля реализовывать эти структуры самостоятельно, включая поиск, вставку и удаление эллементов, наконец вы поймёте какая структура данных в какой ситуации лучше подходит. Здесь вы в первые столкнётесь с проблемой коллизии и поймёте, что вся простота хранения данных в хэш-таблице не такая уж и простая внутри. С открытой информацией в youtube и google на этом моменте уже не всё так просто, поэтому делайте акцент на книги и статьи.
Странно, да? Столько всего изучили, а про тему которую обычно изучают в школе ничего не знаем. Просто было позволено не знать, поэтому и не знали. Дальнейшие темы всё равно заставят вас их освоить. Все примеры, с которыми вы будете сталкиваться, часто будут представлены в шестнадцатиричном виде, потому что окажется очень удобным, что любой байт всегда можно представить двумя шестнадцатеричными числами. При работе с более низкими уровнем в ход пойдут уже и двоичные числа.
На этом шаге мы спускаемся на самый нижний уровень наших абстракций, смотрим где же там покоятся наши данные. Модельные устройства памяти дают прекрасные представления об этом. Числа, строки, массивы, объекты, булеан. Вы поймёте как все эти типы хранятся в памяти, зачем нужны сборщики мусора, почему размер памяти такой какой есть и так далее.
Разрядность процессора и его регистр окончательно закроют вопросы о взаимодействии с памятью и дадут понимание как процессор выполняет команды и почему размер данных может оказывать такое влияние на скорость выполнения кода.
К этому моменту вы уже начнёте привыкать, что всё в компьютере есть число, а любые данные это набор битов. Чтобы закрепить навыки по работе с битами вы познакомитесь с битовыми операциями. Узнаете как получить нужный бит, изменить нужный бит, как совершать битовые сдвиги и как при помощи битовых структур экономить память.
На этом шаге вы узнаете о несовершенстве компьютера, который окажется не способен хранить дробное число без искажений, хотя это и логично, ведь дроби бывают бесконечными. Здесь вы познакомитесь с форматами записи подобных чисел и узнаете ответ: почему числа с плавающей точкой нужно так осторожно сравнивать между собой и почему некоторые, казалось бы, очевидные результаты, таковыми не являются.
Хорошо. К этому моменту вы закончили разбираться с числовыми типами данных и вам осталось разобраться со строками. Вы уже готовы принять тот факт, что все строковые символы, с которыми вы работали всё это время — это тоже числа взятые из какого-то стандарта. Вы познакомитесь со стандартами ASCII и UNICODE и поймёте какие исторические проблемы тянутся ещё с конца прошлого века. Вы наконец-то в полной мере осознаете всю важность порядка хранения данных в компьютере и познакомитесь с таким понятием как кодировки, которые вроде как должны решить многие проблемы. Ок, вопрос с данными пока что закрыт и вы можете двигаться дальше.
Язык ассемблера — это ключ к понимаю вообще всего, что происходит внутри программ на уровне процессора. Данный язык представляет собой команды процессора в символьном виде, то есть, вы по прежнему используете слова, а не нули и единицы, но зато вам полностью открываются все конструкции высокоуровневых языков, которые были скрыты ранее. Вам открываются условия, функции, циклы и массивы изнутри. Вы напрямую работаете с регистрами и кажется, начинаете понимать как вообще может быть с нуля написана операционная система, драйверы, вирусы и так далее. Это же даёт вам завершить полное представление о модальном устройстве памяти, показывая как работает стек.
Вы поймёте для чего вообще нужно временное хранилище данных и к чему приводит его переполнение, а самое главное вы увидите, как, почему и за счёт чего работают функции. Что означают передачи параметров, что такое кадры функции и как осуществляется возврат.
Это базовый алгоритм с которым вы к этому времени 100% уже будете сталкиваться. Минус рекурсивных алгоритмов и их работу сложно представить в голове, потому что человеческое мышление не рекурсивное. Поэтому чтобы со стороны увидеть всю её работу, на что она способна и как может ронять код, нужно увидеть её работу со стороны, поняв как она взаимодействует со стеком.
Продолжая тему алгоритмов мы подбираемся к сортировкам. Это точно такая же базовая вещь как поиск эллементов, их добавление и их удаление. Для сортировки данных, которую нам приходилось делать до этого момента, мы использовали встроенные в язык функции и методы. Сейчас же вам снова придётся заглянуть внутрь и разобрать хотя бы базовые алгоритмы, начиная от сортировки пузырьком, ставками и кучей, заканчивая сортировками Хоара, Ломуто и подобными им.
Здесь нас поджидают деревья и графы. Тема не самая простая, но с должным уровнем визуализации осилите и её. Для начала ваша задача научиться с нуля писать бинарные деревья поисков, включая реализацию вставки, поиска и удаления узлов. Это будет отличным подспорьем к следующим, более сложным деревьям вроде AWL, красно-чёрному дереву и так далее. К слову, от последнего вы на небольшой промежуток времени сломаете свой мозг и практически возненавидите программирование. Все эти навыки по работе с деревьями позволят вам разобрать последнюю структуру данных на нашем пути — графы. Вы разберётесь с поиском в глубину и в ширину. На этом моменте классическое программирование зананчивается. Всё что будет дальше касается смежных, но точно не менее важных областей программирования.
Конечно же вы для начала побежите в youtube для быстрого ознакомления и узнаете что всё построено на модели OSI. Стек протоколы TCP/IP - это те правила, по которым интернет работает. Все web приложения которые вы писали ещё в самом начале своего обучения оказались лишь поверхностью айсберга в этой цепи называемым прикладным уровнем, ниже которого идут транспортный, сетевой, канальный, и на каждом из которых находятся ещё множество других протоколов, которые оборачивают передаваемые данные своими заголовками, которые обеспечивают ту самую передачу пакетов от вашего компьютера до провайдера и до конечного компьютера. Тема на самом деле эта громадная, она может занимать не один месяц.
С этим вам будет уже не так просто ознакомиться как с предыдущими темами в силу закрытости этой информации. Задача здесь, хотя бы на теоритическом уровне ознакомиться с организацией памяти в операционных системах и понять такие определения как процесс и поток.
Теперь вам нужно будет разобраться с устройством файловых систем Windows и Linux. Начиная от самых примитивных под управление MSDOS, заканчивая FAT32, NTFS, EXT3 и так далее.
То, что мы умеем создавать программы это хорошо, но запускать их будет всё равно операционная система, для неё нужно будет уметь собирать исполняемые файлы. Каждая операционная система ожидает получить свой формат. Как минимум разбор PE и ELF форматов даст отличное понимание как вообще программа запускается и что ей для этого нужно.
Сжатие откроет вам глаза на то, как вообще хранятся в памяти изображение, звук и видео и из чего они состоят. В ходе разбора придётся ознакомиться с форматами файлов и их алгоритмами сжатия с потерями и без. В этом разделе появляется довольно много математики, а её точно поймёт далеко не каждый. Поэтому я не предлагаю разбирать каждый формат всех файлов, но хотя бы с базовыми алгоритмами сжатия текста вам ознакомиться точно придётся.
Шифрование — это то, на чём основана вся безопасность. Без него любые взаимодействия между устройствами, включая весь интернет, были бы под большим вопросом. Примером знакомым каждому является HTTPS протокол, который передаёт данные в зашифрованном виде. Понимать хотя бы на базовом уровне за счёт чего достигается безопасность, что такое закрытый и открытый ключ, а также иметь представление о некоторых алгоритмов вроде RSA лишним точно не будет.
Создать свою 3D игру мечтал каждый второй ребёнок. Конечно же без готовых движков ничего полноценного вы не сделаете, а для написания своего движка с нуля потребуются годы подготовки. Зато можно быстро ознакомиться как вообще 3D графика создаётся, как пишутся шейдеры, на чём основано освещение объектов, как реализуется камера, нужно будет ознакомиться с линейной алгеброй и понять на основе каких примитивов вообще строятся 3D объекты. А библиотеками OPENGL, WEBGL и подобные им помогут создать вам первый 3D объект.
На данном этапе у вас уже сполна знаний, чтобы разобраться в теме компиляторов и реализовать свой собственный язык программирования. Лексический, синтаксический, семантический анализ, абстрактно синтаксические деревья, генерация машинного кода. Это всё — те термины, с которыми вам придётся работать непосредственно и изучать на достаточно глубоком уровне, чтобы по итогу написать что-то стоящее.
Теперь вы стали профессональным программистом. Впереди только математика и алгоритмы, а книги Кнута и Кормана становятся вашими настольными книгами, которые можно читать вечно. Все темы которые вы изучили до этого познавались вами на базовом уровне. И сейчас, получив столько опыта, вы наконец-то выбираете тот истинный, свой путь, по которому вы готовы идти дальше. Пазл сложен, пелена пала.
Я прекрасно понимаю, что если вы всё это слышите впервые, то термины из моего поста не несут для вас никакого представления, да и не должны нести. Это путь который вы проходите по шагам и предыдущий шаг даёт ключ к следующему. Весь материал о котором я говорила, разумеется можно спокойно найти и изучить в свободном доступе, в виде статей, видео, книг, документации, курсов. Возложите пожалуйста ответственность за ввод ключевых слов в поисковике на себя и вы без проблем найдёте всю необходимую вам информацию. И помните, ежедневное обучение по 1 часу в день намного лучше отсутствие этого обучения. Удачи.