Это статья об основах программирования на Go. На канале я рассказываю об опыте перехода в IT с нуля, структурирую информацию и делюсь мнением.
Хой, джедаи и амазонки!
На базовом курсе Go от SkillBox я прошёл 20й модуль из 31. После дипломной работы будут ещё доп курсы, но даже занимаясь по пол часа в день - прогресс есть. В выходные, правда, намного больше занимаюсь :) а в будние иногда не занимаюсь вовсе.
Матрицы... - с ними познакомился в институте на таких предметах, как матанализ и математические задачи специальности. Не думал, что вернусь к ним - а вот как бывает. Более того, читал, что машинное обучение и нейросети - это работа с матрицами на 80%: их сложение, умножение и прочие действия.
Go разбираться с матрицами! Но сперва пройдёмся по теории.
1. Математика в IT
Обучение программированию тесно связано с алгоритмами на задачи математики. Пусть что угодно поют инфоцыгане, но математику для программирования знать нужно. Для IT в общем - возможно и необязательно, но для программирования - нужно.
Другое дело, что математика в разных областях программирования нужна на разном уровне освоения.
Если в общих чертах, то в backend'e нужно знать основы математики. А в машинном обучении и data scince нужны намного более глубокие знания. Подробнее о том, в каких объёмах нужна математика, можно почитать на странице GeekBrains или FB.
Немного определений для расширения инженерного кругозора:
Математика - наука об отношениях между объектами, о которых ничего не известно, кроме описывающих их некоторых свойств, — именно тех, которые в качестве аксиом положены в основание той или иной математической теории.
Существует три способа деления направлений математики: как специальности, как учебной дисциплины и как науки.
С математикой как учебной дисциплиной мы знакомились в школе - арифметика, алгебра, геометрия, начала анализа и т.д.
Аксиома (постулат) - исходное положение, не требующее доказательств в отношении конкретной теории.
Арифметика - раздел математики, изучающий числа, их отношения и свойства. Древнейший раздел математики.
Алгебра - раздел математики, посвящённый изучению операций над элементами множеств произвольной природы, обобщающий обычные операции сложения и умножения чисел.
Алгебра включает разделы:
- Элементарная алгебра;
- Общая алгебра;
- Универсальная алгебра;
- Линейная алгебра;
- Алгебраическая комбинаторика.
Почитать о разделах алгебры можно на Википедии - обычно подобные статьи там преподнесены так, что тяжело воспринимать информацию. Эта сделана на мой взгляд хорошо. Подробнее об алгебре для программиста можно почитать в этой статье на Хабре. Вот выдержка:
...упростить выражение (алгебраическое, - прим. автора), по сути, значит изменить его структуру с целью облегчить понимание, не затрагивая смысла.
Вам это ничего не напоминает?
Это практически определение рефакторинга из одноименной книги Мартина Фаулера.
1.1. Линейная алгебра
Линейная алгебра изучает векторы, системы линейных уравнений, матрицы и другие вещи.
Почему разбираю основы линейной алгебры? Потому что в неё входят матрицы, с которыми мне пришлось работать, выполняя задачи на Скиллбокс. Вот что сказал куратор обучения после того, как я завершил раздел по двумерным массивам и сдал практическую:
Вам (в бэкенде - прим. автора) может матрицы и не понадобятся никогда, а вот в геймдеве у нас матрицы, деревья и графы повсюду, просто они под капотом у Unity реализованы, либо в сторонних расширениях (библиотеках).
Позиция и ориентация объекта, в редакторе это просто несколько векторов, а под капотом матрица и кватернион
Иерархия объектов на сцене, дерево
Ещё куратор дал два материала для доп ознакомления с матрицами:
В геймдеве матрицы встречается повсеместно, а в бэкенде возможно никогда не придётся с ними работать.
1.2. Матрица
Матрица - это таблица с числами* в определённом порядке.
*В программировании - не только с числами. Помним про типы данных.
Матрицы принято обозначать большими буквами: A, B, C, Y, Z и т.д. Значения внутри матрицы - её элементы. Каждый элемент обозначен двумя цифрами: первая цифра - всегда номер строки, вторая - всегда номер столбца.
Когда я делал задачи на работу с матрицами, мне было неудобно работать, т.к. все примеры публикаций в интернете имели нумерацию строк и столбцов с 1. А в программировании принято нумеровать позиции с нулевого элемента.
Я сделал собственный пример, который может быть полезен другим ребятам, изучающих тему работы с матрицами в программировании, где строки и столбцы начинаются с нуля:
Почитать о матрицах на простом языке можно в журнале КОД.
1.3. Определитель матрицы
Определитель матрицы - число, характеризующее квадратную матрицу. Квадратная матрица - матрица, в которой количество столбцов равно количеству строк.
Например, если у нас есть матрица 3х3, то определитель найти можем. Если матрица 3х4, то определитель для неё не имеет смысла.
Напоминаю, первое число в записи 3х4 - характеризует число строк, а второе - столбцов.
Определитель с английского - determinant. Если матрице присвоем имя А, то определитель матрицы А будет записан так: det A. Или ΔА (дельта А). Иногда и по-русски определитель называют детерминант.
Определитель может понадобиться для следующих целей:
- Решения систем уравнений, например методом Крамера;
- Для нахождения объёмов различных фигур.
Подробнее об определителе можно посмотреть здесь <<<
В задаче SkillBox была матрица 3х3. Для неё можно воспользоваться правилом треугольника. Рассмотрим матрицу Z:
Определитель для неё находим следующей формулой:
Пример кода можно на GitHub'e.
А ещё есть хорошая на мой взгляд англоязычная статья на эту тему с примерами кода на Go.
1.4. Транспортирование матрицы
Транспонирование матрицы - оператор, который переворачивает матрицу по её диагонали: строки становятся столбцами, см. пример ниже.
Код функции транспонирования будет выглядеть примерно так:
func transponse(inMatrix [rows][cols]int) [cols][rows]int {
var trMatrix [cols][rows]int
for i := 0; i < len(inMatrix[2]); i++ {
for j := 0; j < len(inMatrix); j++ {
trMatrix[i][j] = inMatrix[j][i]
}
}
return trMatrix
}
1.5. Умножение матриц
Сложение матриц я не рассматривал, как не рассматривал арифметические действия матрицы и числа.
А вот умножение матриц - штука интересная и не совсем простая. Первое, что нужно знать об умножении матриц - число столбцов в первой матрице должно равняться числу строк во второй матрице:
Т.е., если мы умножаем матрицу размером 5х3 на 3х8, то их произведением матриц будет матрица 5х8.
Второе, что важно помнить: умножая матрицу АхВ и ВхА - мы получим разные итоговые матрицы.
Рассмотрим произведение матрицы 4х2 и 2х3:
Пример кода на GitHub'e для произведения матриц 3х5 и 5х4.
Кстати, проверить себя по произведению матриц, можно в этом онлайн-калькуляторе.
2. Лайфхаки
Далее поделюсь лайфхаками или просто наблюдениями, которые считаю полезными.
2.1. Return
Для себя обнаружил, что когда пишешь функцию, полезно после того, как прописываешь сигнатуру, сразу прописывать оператор return. Потому что иначе зачастую его забываешь прописать и при компиляции возникает ошибка.
На мой взгляд это будет полезной привычкой.
Сигнатура - характерная часть определения функции, где прописываются входные и выходные параметры. На скриншоте ниже показана сигнатура в строке 21:
Прописываем сигнатуру, и сразу прописываем return и что возвращаем. Далее уже пишем содержание функции.
2.2. Бесконечный цикл
В отличии от Windows, на Linux, когда программа в IDE уходит в бесконечный цикл, ноутбук просто может зависнуть. Об этом подробнее я рассказывал в этой статье.
Если кто-то знает, как с этим бороться кроме закрытия терминала - поделитесь лайфхаком, хорошо?
2.3. Научные вычисления в Golang
Для обучения алгоритмам может быть полезно продумывать и писать код по линейной алгебре и другим видам математики. Но как сказал один человек:
"Геолог - не турист. Не будет жить в палатке, если можно жить в хижине. Геолог не создаёт себе искусственные трудности".
Программист - не изобретатель, а специалист. Не каждый специалист становится изобретателем, но каждый изобретатель должен знать, что очень много кода уже написано и уметь им пользоваться.
Так вот, есть пакеты Go, где прописаны различные научные вычисления. Т.е. вместо кода перемножения матриц или что-то в этом духе, можно подключить внешний пакет и одной строкой выполнить всё что нам нужно.
В частности, есть пакет Gonum. Почитать о нём публикацию можно здесь на английском языке, а документация на GitHub'e о почитать о нём здесь.
3. Выводы
Познакомились с основами линейной алгебры, узнали, что работа с матрицами - распространённая задача в программировании: в частности, в нейросетях и геймдеве. А бэкенде возможно никогда с ними и не встретимся, кроме как на учебных занятиях.
Также посмотрели примеры решения задач с матрицами. Нейросети - это интересно, будет полезно освоиться в них - и как инструмент в работе, и как сферу деятельности.
Вот один мой друг (кста, тоже в SkillBox обучается), со своей командой подготовили дипломную работу, а иллюстрации им рисовала нейросеть Midjourney:
Успехов, Бро. В математике и личной жизни.
--//--//--
Если захочешь купить курс от SkillBox, воспользуйся моей реферальной ссылкой. Ты получишь огромную скидку на курс и плюс в карму за помощь каналу.
Бро, ты уже здесь? 👉 Подпишись на канал для новичков «Войти в IT» в Telegram, будем изучать IT вместе 👨💻👩💻👨💻