Transcription
Изучение программирования — это не зубрежка учебников и решение задач на LeetCode. Это знание того, как поступали топовые инженеры, когда только начинали учиться кодить. Это секретная стратегия, о которой никто не говорит вслух. Я работаю инженером-программистом более 8 лет, работал в таких компаниях, как Microsoft, и прошел более 30 собеседований в крупных технологических компаниях. И если бы мне пришлось начинать заново сегодня, я бы сделал все совершенно иначе. Тогда я потратил месяцы, перепрыгивая по курсам, веткам Stack Overflow и даже учебникам на YouTube. Я пытался понять, что на самом деле работает. Но тогда я не осознавал, что мне не хватает ключевого ингредиента, и это действительно замедлило мое обучение. Поэтому в этом видео я покажу вам самый практичный способ научиться программировать, получить глубокое понимание концепций информатики шаг за шагом и реально получить работу разработчика. Итак, приступим.
Вы, вероятно, видели эту T-образную модель обучения, где верхняя часть буквы "Т" означает изучение всего понемногу, как широту, а вертикальная часть — углубление в один навык. Большинство людей говорят: "Узнай немного обо всем, а затем выбери что-то одно, чтобы освоить". Но я хочу бросить вызов этому. Что, если вместо того, чтобы изучать один навык в глубину, вы сможете изучить все навыки в глубину? И именно так учатся топовые инженеры. Они не просто понимают, как писать код, они понимают, как код сочетается друг с другом, вместе с определенными правилами и шаблонами.
Хорошо. Как нам это сделать? Мы начинаем с картирования всего, что вам нужно изучить, от микро до макро. На самом микроуровне вы изучаете правила языка. Итак, как работает синтаксис, циклы, функции — это то, что вы можете изучить, проходя курсы. И я действительно добавил ссылки на кучу курсов в описании ниже, которые вы можете посмотреть. Например, в Python отступы — это не просто стиль. Они определяют структуру. Так что, если вы нарушите отступы, ваш код не скомпилируется. И если вы не используете базовый случай в цикле, то ваш код просто рухнет во время выполнения.
Итак, как только у вас появится достойное понимание правил языка, мы немного отдалимся и начнем видеть больше шаблонов, как в реальных приложениях, например, как моделировать реальные вещи в коде. Итак, скажем, вы хотите представить игрока в баскетбол. У игрока есть имя, возраст, рост, статистика, и вот как это может выглядеть в коде. Теперь, если мы хотим представить целую команду игроков, мы не будем писать сотни строк кода, представляющих одно и то же, снова и снова. Вместо этого мы создадим шаблон. Это объектно-ориентированное программирование. Один объект игрока в баскетбол, а затем мы можем создать множество его версий с разными данными. Это похоже на передачу разных параметров в функцию.
Итак, здесь мы создали класс игрока в баскетбол, который можно просто перерабатывать и повторно использовать. И у нас есть переменные, такие как имя, возраст, рост, очки, передачи, подборы. А затем у нас также есть функции. Так что, если мы хотим отобразить информацию обо всех этих значениях, мы можем просто вызвать функцию `display_info`. И она отображает имя, рост, очки. А затем у нас также есть `average_stat`, которая берет очки, передачи и подборы и делит их на три. И тогда все, что мы делаем, это вызываем `player_one` и присваиваем ему наш объект игрока в баскетбол. Так что вместо того, чтобы, если вы помните, возвращаться к этим сотням строк кода, чтобы добавить статистику для игроков в баскетбол, теперь это очень чисто и просто. Мы просто добавляем любые параметры, которые хотим, а затем присваиваем значение этим переменным в классе игрока в баскетбол.
Теперь я сказал, что топовые инженеры имеют стратегию кодировать быстрее и эффективнее. И это заключается в том, чтобы заглянуть под капот и глубже погрузиться в эту "Т". Это означает фактическое понимание того, как ваш код работает в компьютере. Это делает вас более внимательным, когда вы фактически пишете код. Итак, когда вы пишете что-то на высокоуровневом языке, таком как Java или Python, этот код в конечном итоге преобразуется в ассемблерные инструкции. Это пошаговые команды, которые понимает процессор вашего компьютера. И под всем этим он превращается в единицы и нули.
Вот, например, если бы вы хотели сложить два числа в Python, вот как бы вы это сделали. Вот как это выглядело бы при преобразовании в байт-код. А затем, в конечном итоге, на уровне ассемблера, вы бы поместили это число в регистр, а затем добавили три к регистру. А затем вы бы сохранили этот результат в переменную x. И под всем этим он превращается в единицы и нули, двоичный код, маленькие электрические сигналы, которые говорят оборудованию, что делать. Так что каждая строка, которую вы пишете, каждый цикл `for`, каждая функция, каждая переменная в конечном итоге становится серией переключателей включено/выключено в вашем процессоре. Это самая глубокая часть "Т". Понимание того, как ваш код превращается в фактические вычисления. И понимание этих теоретических концепций, на мой взгляд, очень важно. И опять же, вы всегда можете узнать много этой информации на курсах, которые я добавил в описании ниже. Есть множество из них, которые я упоминал в предыдущих видео на YouTube, и я даже покажу некоторые из них на экране.
Теперь, как только вы освоите основы объектно-ориентированного программирования, придет время изучить структуры данных и алгоритмы, по сути, как эффективно хранить и получать доступ к данным. Но вот в чем дело: дело не в том, чтобы запоминать, что такое хэш-карта или бинарное дерево поиска. Важно знать, как и когда их использовать. Возьмем, к примеру, хэш-карты. Их крутость — это скорость. Вместо того, чтобы хранить данные в списке и проверять каждый элемент по одному, хэш-карта может найти то, что вам нужно, почти мгновенно, используя ключ. Это похоже на наличие маркированных ящиков вместо того, чтобы копаться в одной гигантской коробке вещей. Но вот компромисс. Хэш-карты используют больше памяти, потому что они предварительно выделяют место для возможных ключей. Это похоже на создание ящиков для каждой буквы алфавита, даже если вы в конечном итоге используете только несколько из них. Так что это всегда баланс. Время против пространства и скорость против памяти. И знание того, когда этот компромисс стоит того.
Хорошо, вернемся к этой T-образной форме. Давайте посмотрим, что бы сделали топовые инженеры, чтобы глубже изучить эту концепцию. Например, вы когда-нибудь задумывались, почему хэш-карта быстрее? Это связано с тем, как работает память. В оперативной памяти вашего компьютера данные находятся в крошечных отсеках, называемых адресами памяти. Думайте о них как о пронумерованных почтовых ящиках. Так что, когда вы что-то храните в хэш-карте, хэш-функция берет ваш ключ, скажем, слово "кот", и преобразует его в число, и это число напрямую указывает на один из этих почтовых ящиков в памяти. Так что вместо поиска по списку компьютер просто переходит прямо к нужному почтовому ящику. Вот почему это быстро. Но поскольку мы предварительно резервируем много почтовых ящиков, это занимает больше места. Та же идея применима к тому, как функции и переменные используют память.
Итак, когда одна функция вызывает другую, первая сохраняется в разделе памяти, называемом стеком. Если у вас слишком много вложенных вызовов функций, этот стек может переполниться, буквально исчерпать место или взять строки. Во многих языках строки неизменяемы, что означает, что когда вы меняете одну, компьютер создает новую в памяти вместо редактирования или замены уже существующей. Вот почему такие операции, как повторяющаяся конкатенация строк, могут занять очень много времени. Каждый раз он копирует новые данные в память, это довольно круто, не так ли? Таким образом, вы не только понимаете, как использовать структуры данных, но и когда их важно использовать и что они на самом деле делают за кулисами. И если вы хотите углубиться еще больше, я добавил больше ресурсов для DSA в описании ниже. Так что обязательно ознакомьтесь со всеми ресурсами, о которых я говорил.
Хорошо, наконец, давайте поговорим о современном разработчике. Сегодняшние разработчики не просто изучают концепции самостоятельно. Они учатся с помощью. И эта помощь приходит от инструментов для кодирования с использованием ИИ. Теперь я хочу сначала бросить вам вызов изучить основы, прежде чем использовать редакторы кода с ИИ, но в конечном итоге вам нужно будет понять, как интегрировать их в свой рабочий процесс, особенно если вы хотите работать в корпоративной среде. Итак, я сделал полное видео, в котором разбираю различные инструменты ИИ для разработчиков. Но ключевая идея такова: знайте, какой инструмент куда подходит, потому что это не универсальное решение. Нет одного инструмента ИИ, который был бы лучше других. Это действительно зависит от того, для чего вы хотите его использовать.
Например, некоторые инструменты встроены в вашу IDE, такие как Cursor или Augment. Они помогают вам рефакторить, добавлять тесты и даже создавать совершенно новые функции с помощью агентских рабочих процессов. Другие лучше подходят для веб-сайтов или суммирования, такие как Claude или Gemini. Это когда вам нужно быстро проверить свой код. Но самое важное правило: не пропускайте обучение. Инструменты, такие как Augment и Cursor, мощные, но они слишком громоздкие, если вы только начинаете учиться программировать. И они в конечном итоге пишут слишком много за вас, подавляя ваше обучение. Если вы используете их слишком рано, вы упустите то, что на самом деле происходит за кулисами. И это неправильный путь. Это не тот, которым идут топовые инженеры.
Поэтому вместо этого начните с простого. Используйте такие инструменты, как Claude или Gemini, чтобы суммировать код, дважды проверять свою логику или просто чтобы выбраться из тупика. Затем, как только вы освоите основы, вы сможете начать интегрировать эти продвинутые инструменты IDE в свой рабочий процесс. Вы также захотите начать практиковаться с проектами корпоративного уровня. Вы можете клонировать репозитории с открытым исходным кодом, создать свою собственную ветку и начать кодировать по-настоящему. Узнайте, как устанавливать зависимости, запускать сборки и делать коммиты. Потому что именно в этом и заключается современный разработчик. Это не просто написание кода, а понимание того, как все связано: от языков, инструментов до систем, которые запускают ваш код в продакшене. Тогда вы перестанете быть просто учеником и начнете становиться настоящим инженером.
И я даже не коснулся аспекта проектирования систем, который я помещу в более позднее видео, если вы захотите его увидеть. Так что, напишите в комментариях ниже, если вы хотите увидеть вторую часть, где я расскажу о проектировании систем. Ладно, удачи в обучении, и увидимся в следующем видео.