Human: Как стать программистом?

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

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

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

Со временем и практикой Вы точно станете отличным специалистом!

Human: Что такое пет-проект? Я никогда не слышал такого слова.
И ещё, не мог бы ты, пожалуйста, привести список полезной литературы по темам, которые ты перечислил (математика, структуры данных и т.д.)?

Assistant: Пет-проект (pet — англ. «домашний питомец, любимец») – это собственный проект разработчика, над которым он трудится в свободное от работы или учебы время. Пет проект необходим в первую очередь для самостоятельного развития новых или уже имеющихся навыков. Он не ограничен ни сроками, ни определенным форматом, ни используемыми технологиями. 

Вот список литературы по теории программирования и математики:
- Иосиф Владимирович Романовский. Дискретный анализ.
- Григорий Михайлович Фихтенгольц. Основы математического анализа.
- Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Алгоритмы: построение и анализ 
- Эрих Гамма, Джон Влисидис, Ральф Джонсон, Ричард Хелм. Приемы объектно-ориентированного проектирования.

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

Human: А какие есть структуры данных?

Assistant: Существуют следующие основные структуры данных:
1. **Массив** (он же вектор, он же список, он же динамический массив, он же последовательность) - структура данных, при которой в памяти последовательно записываются данные одного типа и, следовательно, одного размера. Получить элемент из массива можно с помощью индекса, сместившись на данное количество элементов от начала массива. Для добавления элемента в массив его необходимо создать заного (если в выделенном под массив блоке памяти не осталось свободного места).
2. **Объект** (он же кортеж, он же структура) - структура данных, при которой хранится фиксированное число элементов различных типов, последовально записанных и выравненных в памяти. Получить элемент из объекта можно обратившись к его идентификатору, при этом компилятор должен знать его смещение он начала объекта. Добавить элемент в объект нельзя.
3. **Связный список** - структура данных, при которой хранится несколько хаотично разбросанных по памяти блоков, содержащих элемент и ссылку (указатель) на следующий (и, возможно, предыдущий) элемент. Получить элемент из кортеж пожно с помощью его индекса, последовательно идя по цепочке элементов. Дла добавления элемента в связный список нужно изменить ссылки ближайших (по индексам) к нему элементам.
4. **Хэш таблица** (она же словарь, она же map, она же таблица) - структура данных, при которой хранятся пары элементов в "дырявом" массиве таким образом, чтобы найти значение по ключу занимало в среднем фиксированное время. Сложные ключи (напимер, строки) обычно хешируются.
5. **Дерево** (илм, если ребёнок может иметь несколько родителей - граф) - структура данных, при которой каждый элемент хранит массив или объект ссылок (указателей) на своих "детей", при этом элементы разбросаны в памяти хаотично.
6. **Бинарное дерево поиска** - дерево, в в каждом элементе которого хранятся две ссылки - на элемент, который меньше, и на элемент, который больше. Поиск в таком дереве в среднем занимает логарифмическое время, вместо линейного в массиве.