- Устаревание технологий
- Логическое мышление
- Абстрактное мышление
- Качаем знания
Мир вокруг нас непрерывно меняется, и точно так же каждый день меняются технологии, причем иногда настолько сильно, что освоенное сегодня через год уже может быть не нужно. Но если посмотреть глубже, то можно увидеть, что базовые, фундаментальные знания, которые используются в большинстве современных технологий, появились очень давно и практически не изменились. В этом уроке мы поговорим о том, какие области фундаментальных знаний нужно прокачивать, чтобы стать хорошим программистом, а в конце перечислим и некоторые инструменты, знание которых необходимо каждому профессиональному разработчику.
Устаревание технологий
Важно помнить, что фундамент не устаревает, а остальное быстро добирается в процессе. Любой новый фреймворк, подход в разработке, какая-либо новая методология или язык программирования учатся достаточно быстро, если вы в принципе владеете базой. Но кроме каких-то точных наук, кроме того, чтобы заниматься непосредственно программированием, нужно поработать над своим мозгом. И этот процесс включает в себя несколько направлений.
Логическое мышление
Первое — это логическое мышление, мыслительный процесс, при котором человек использует логические понятия и конструкции. Этому процессу свойственна доказательность, рассудительность, и его целью является получение обоснованного вывода из имеющихся предпосылок. Логическое мышление является крайне важным для любого программиста, и существует множество способов его прокачивать.
Математика
Первый способ развития логического мышления — это математика. Просто изучение математики в любом её представлении, в любом направлении отлично развивает способность правильно мыслить. Те, кто раньше начинают заниматься математикой, имеют преимущество перед остальными. Можно изучать её и спустя 20 лет после окончания института, пусть это действительно может быть сложнее, потому что становится трудно найти время усвоить тот объём знаний, который даётся в учебном заведении. Но в целом это возможно, и на базовом уровне все необходимые разделы математики, полезные для развития мозга, доступны для изучения в виде бесплатных курсов на огромном количестве ресурсов, в том числе на русском языке. Можно легко найти информацию, что непосредственно стоит учить, какие книги читать — и это нужно делать, независимо от изучения программирования.
Логические задачи
Второй способ развития логического мышления — это решение логических задач. Есть отличный сайт с огромным количеством задач разного уровня: www.braingames.ru. На нём сидит много людей, есть рейтинги, и это — отличный способ поломать мозг. При этом, нужно понимать, что есть люди, которые очень круты в решении логических задачах, но при этом у них не очень получается быть программистами, поэтому развитие должно быть многостороннее.
Алгоритмы
Третий способ — это изучение алгоритмов. Речь именно о тех алгоритмах, которые рекомендуется изучать при обучении программированию или чтобы войти в эту профессию. Они бывают разные, некоторые очень сложные, и бывает так, что без очень сильной математики не разобраться, но в целом на базовом уровне в различных направлениях алгоритмы достаточно простые. Знание и понимание принципов работы алгоритмов действительно очень сильно помогает. В рекомендуемых книгах Хекслета есть отличная книга по алгоритмам
Абстрактное мышление
Следующий важный аспект базовых знаний — это абстрактное мышление, мыслительный процесс, при котором человек умеет абстрагировать ситуацию от незначительных деталей и взглянуть на неё в целом. Абстрактное мышление включает в себя три формы: понятие, суждение, умозаключение.
Абстрактное мышление обладает следующими признаками:
способность понять окружающий мир без воздействия на органы чувств
Просто опираясь на предыдущие знания, можно получать новую информацию и делать выводы о каких-то новых процессах, которые не видны и не осязаемы. Именно так решаются задачи по математике, физике, химии в школе и институте.
обобщение для выявления закономерностей
Обобщение, фактически являющееся сутью программирования, когда мы говорим про создание каких-то больших программных комплексов — это возможность абстрагироваться, создавать максимально изолированные системы и строить правильные интерфейсы между их частями для обеспечения взаимодействия между ними. Существует понятие "барьеры абстракции" — когда слой за слоем строятся уровни абстракции, и на каждом более высоком уровне не видно деталей нижнего уровня — это важнейший принцип, который позволяет удерживать в голове систему и работать с ней. Человек может удерживать в голове 7 плюс-минус 2 вещи, поэтому оперирование большим количеством понятий одновременно — это взрыв мозга.
Абстрактное мышление развивается примерно так же, как и логическое, и часто они взаимосвязаны, но есть и небольшие отличия.
Точные науки
Точные науки — это не только математика, но и физика, химия и даже некоторые разделы биологии.
Логические и интеллектуальные игры
Сюда входит тот же самый braingames, при этом для развития абстрактного мышления очень здорово подходит и игра в шахматы, шашки или даже в преферанс.
Программирование :)
Ну и само программирование способствует развитию абстрактного мышления. Однако нужно не забывать про другие способы и использовать их в комплексе.
Качаем знания
Теперь разберёмся в том, какими знаниями нужно обладать разработчику. Сейчас будет много новых концепций — совсем не обязательно знать их заранее, до начала карьеры. То, что здесь будет описано — это тот фундамент, который либо приобретается в университете, если с ним повезло и уже учась там, человек понимал, что будет программистом и пытался по максимуму выхватывать эти знания. Во всех остальных случаях нужно добирать в процессе в той или иной мере. Знать всё идеально невозможно, но чем больше направлений из перечисленных ниже будет освоено — тем более профессиональным разработчиком можно стать и тем более сложные задачи решать.
Фундамент: математическая подготовка
Теория множеств
Особенно важная дисциплина в работе с базами данных. SQL построен на реляционной алгебре, и в базах активно используются понятия теории множеств. Таблицы, выборки — всё это берёт начало в теории множеств.
Логика
Логика — это то, с чем сталкивается каждый программист каждый день в своей работе. Логика является важнейшей основой программирования — свой путь в профессии нужно начинать с её изучения.
Дискретная математика
Дискретная математика включает в себя достаточно много разделов: начиная от графов и заканчивая автоматами. Большинство разделов дискретной математики так или иначе воплощено в информатике.
Лямбда-исчисление
И последнее — это лямбда-исчисление, которое отлично помогает в развитии абстрактного мышления. Представьте себе систему, в которой числа и операции над ними (арифметика) это функции. Благодаря лямбда-исчислению такую систему можно создать и она будет вести себя абсолютно так, как ведут себя обычные числа.
Кроме того, с понятием лямбда-функций вы столкнетесь практически во всех языках.
Фундамент: информатика
Ближайшая к компьютерам область знаний — это информатика. И нас интересуют следующие ниже разделы информатики.
Системы счисления
Самое базовое понятие — системы счисления — это системы записи чисел с помощью определенного набора цифр. Почему они так важны? В основе программ и компьютеров лежит двоичная система счисления, но в повседневной жизни мы используем десятеричную систему счисления. Обязательно нужно знать и понимать, как устроены системы счисления и уметь переводить числа из одной системы счисления в другую.
Структуры данных
Структуры данных в информатике — это способ представления информации, с помощью которого её отдельно взятые элементы образуют нечто единое. В языках программирования реализовано несколько распространенных структур данных, таких как массивы, числа, строки, файлы. Но и кроме них существует множество абстрактных структур данных, которые могут создаваться самими разработчиками с использованием средств языка.
Алгоритмы
Наряду с системами счисления и структурами данных алгоритмы — основа основ информатики. Для того, чтобы быть экспертом в алгоритмах, нужно не только вдоль и поперёк изучить сами алгоритмы, но и очень хорошо знать математику — а на это уйдёт приличное количество времени. Хорошая новость — для начала этого и не требуется. Главное — понимать базовые алгоритмы на базовых структурах данных и вообще просто иметь понятие о том, что они из себя представляют и как работают. Какие-то конкретные алгоритмы приходят уже в процессе работы или обучения. Не бывает такого, что программист заранее знает все возможные алгоритмы и может запросто выдать нужный алгоритм, подходящий для конкретной ситуации.
Фундамент: парадигмы
Теперь поговорим о языках программирования и о том, какие подходы к программированию в них реализованы. Такие подходы называются парадигмами программирования. Парадигма программирования влияет на всё, что происходит в вашем коде: то, как строится программа, на каких принципах она работает. Изучение парадигм помогает стать намного более сильным разработчиком, чем изучение конкретных особенностей конкретного языка или просто переход из одного языка в другой язык той же парадигмы.
Существует множество различных парадигм, но на самом верхнем уровне — 3 базовых: императивная, функциональная, логическая.
Императивное программирование
Императивное программирование описывает, как решить задачу и представить результат, используя инструкции (команды). Большинство мейнстримовых языков являются императивными языками программирования: это Java, это C#, это все скриптовые языки, Ruby, PHP, Python и многие другие.
Функциональное (декларативное) программирование
Есть очень мощная парадигма, которая является противоположностью императивного программирования — это функциональное (или декларативное) программирование. Эта парадигма описывает, что представляет собой задача и ожидаемый результат её решения. В неё входят такие языки как Clojure, Erlang, Haskell, Scala и многие другие.
Логическое программирование
Язык логического программирования, с которым многие сталкивались в институте, называется Prolog — тоже очень хороший пример того, как можно по-другому смотреть на вещи.
Фундамент: железо
Архитектура компьютера
Если говорить про железо, то здесь важно понимание архитектуры компьютера, хотя, опять же, всё очень сильно зависит от области разработки. Большинству прикладных программистов, которые работают в веб-сфере, разработке десктопных, мобильных приложений нужен просто общий обзор, понимание того, что такое регистры, как работает процесс взаимодействия с оперативной памятью. Всё перечисленное можно почерпнуть из одной-единственной книги, которая называется "Код: тайный язык информатики" Чарльза Петцольда. Эта книга рекомендуется к прочтению — она читается как захватывающий роман, и действительно даст хорошее понимание того, как устроен компьютер и даже как работает Assembler.
Фундамент: софт
Перейдем уже непосредственно к тому, как устроен современный софт. Вот что вам нужно знать.
Операционные системы
Нужно очень хорошо понимать принципы работы операционных систем и какую роль они выполняют, поскольку при работе с любым языком программирования всё взаимодействие всегда происходит в рамках одной или нескольких операционных систем. У многих программистов, особенно после университета, складывается такое ощущение и мнение, что знание операционных систем важно только для системных программистов, которые пишут софт, связанный прямо с операционной системой и работающий в рамках неё. Это не так. Огромное количество вопросов, которые задают новички, чаще всего связаны с частными случаями каких-то базовых вещей, находящихся внутри операционной системы. Изучение и понимание какой-нибудь одной базовой вещи может занять всего лишь день, но в дальнейшем способно дать огромную фору перед другими, поскольку позволит понимать целый пласт проблем, с которыми в конечном итоге сталкивается разработчик. Такие проблемы каждый раз могут немного отличаться друг от друга, но быть основаны на одной и той же особенности операционной системы. Те, кто не усвоил эту особенность, не видят связи и обречены постоянно тратить время на поиск решения. Поэтому знание операционных систем — важное условие профессионализма разработчика. Существует множество книг, посвященных операционным системам, которые дают понимание их базовых принципов, не копая глубоко.
Сети и протоколы
В век интернета в своей работе разработчик часто сталкивается с сетями и различными протоколами. Нужно иметь представление об основных протоколах, зачем они нужны, и как работают.
Базы данных
Нельзя забывать и про базы данных, поскольку работать придётся с огромными объемами информации, которые организуются, хранятся и которыми оперируют именно базы данных.
Компиляторы и интерпретаторы
Помимо понимания отличия компиляторов от интерпретаторов, здесь необходимо знать, как исполняется код, как можно взаимодействовать с ним, как идёт отработка ошибок. Плюс сюда входят еще такие вещи как потоки и многое-многое другое.
Разное
Есть еще множество разных инструментов и навыков, на которые нужно обратить внимание. Вот лишь самые распространенные.
Владение командной строкой
Важно владеть командной строкой и работать с ней быстро и эффективно, знать как и какие команды в ней можно вызывать.
Системы контроля версий
Любой современный разработчик должен знать, что такое системы контроля версий и как управлять кодом — от этого никуда не деться. Стандартом считается Git, и без этого инструмента, в принципе, нельзя вести разработку.
Автоматизированное тестирование
Кроме этого, важным понятием является автоматизированное тестирование, и на определенном уровне разработки, с определенного уровня проектов без тестирования обходиться вообще нельзя. Автоматизированное тестирование — очень простая техника, которая изучается за короткое время и после этого используется всю оставшуюся жизнь.
Управление конфигурацией
Существует несколько систем управления конфигурацией, таких как Ansible. Они используются для автоматизации настройки и развертывания программного обеспечения и позволяют сэкономить кучу времени для более насущных задач.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты