Transcription
Думай как программист. Разработка в вакууме никому не нужна. Софт пишется, чтобы он решал какую-то проблему, что-то автоматизировал либо же устранял какие-то боли.
Поэтому, когда вы смотрите ролики на Ютубе или решаете свои задачи с помощью нейронной сети, либо же бездумно списываете со Stack Overflow, вы не решаете проблему. Вы не учитесь, вы просто копируете чьё-то решение. Досмотри до конца, и тебе станет понятно, что и как делать.
Для начала думайте об этом как о переписывании конспекта в университете. У вашего сокурсника вы внаглую переписываетесь, не стоит цели его понять. Вам это не надо, вы бездумно переписываетесь. Вы просто повторяете. Чтобы же эффективно учиться, вам надо решать свои проблемы, устранять свои боли.
Потому что только когда вы решаете свои проблемы, вы будете думать об их эффективном решении. Потому что кое-как вам не подойдёт. В этот момент и будет происходить обучение и развитие.
Но допустим, вы очень счастливый человек, у вас нет своих проблем, либо же своих болей, или же вы не знаете, как решить свои проблемы в программировании. Тогда вам надо взять чужие проблемы, понять чужую боль.
Задумайтесь над тем, что должно делать ваше приложение, зачем вы его разрабатываете, как оно поможет людям. Если вы не можете ответить на эти вопросы, тогда вам не надо писать код. Это бессмысленно.
Всё, что я сейчас описал, помогает для обычного человека с обычными проблемами, как к ним вообще надо подходить. Но мы с вами программисты. Программирование для нас — инструмент.
И как же пользоваться нашим инструментом лучше? Надо начать думать по-другому. Вы всё ещё должны исходить из проблемы и того, что она должна быть решена. Но наши проблемы решаются программированием, либо же разработкой софта.
Если более конкретно и утрированно, то мы обрабатываем информацию. Мы записываем данные, собираем данные, изменяем и удаляем. Вся наша работа крутится вокруг информации, которую мы считаем значимой.
Любое приложение, утилита, сайт и всё остальное призваны сделать только одно — обработать информацию. То есть вам надо обработать данные. Это осознание вам поможет.
Ну всё, есть данные, и что? А то, что это и отличает программиста от обывателя. Обыватель не оперирует понятием данных, у него нет такого. Обыватель привязывается к физическому миру и всё проецирует через призму физики.
Нам всем в школе преподавали физику. Мы все знаем про агрегатные состояния, волны, частицы, корпускулярно-волновой дуализм, который всё ломает. Всю жизнь показывали, как смотреть на мир через призму физики.
И тут у нас с вами проблема: в компьютере нет физики. Мы находимся в пространстве, в котором физические законы для нас никак не применимы. И мы не можем смотреть на мир через призму физики. Нам нужна другая призма и другой взгляд на проблему.
В реальном мире у нас уже всё есть. У нас есть солнце, гравитация, законы мироздания и всё-всё-всё материалы, которые находятся в недрах земли. Мы их обрабатываем и получаем какой-то товар на выходе. Но всё это уже было создано до нас.
Мы лишь часть мира, в котором всё уже есть, и нового мы не производим. Из ниоткуда ничего не появляется. Мы берём что-то и преобразуем это что-то в другое. В нашем реальном мире уже есть контекст.
Контекстом я называю всё, что нас окружает и всё, что нам было дано. Когда же мы попадаем в цифровой мир, у нас ничего этого нет. И нам надо создать всё самим.
Мы должны создать себе контекст, в котором мы будем решать наши проблемы. Вот это и есть ключевой подход к тому, как решать проблемы программированием. Нам надо свести их до обработки данных.
Нам надо превратить нашу проблему в набор данных, которые мы будем потом обрабатывать. Нам надо всё как-то записать, добавить того, чего у нас нет. Мы сами определяем мир, с которым мы будем работать.
Поэтому и существует шутка, что Бог от программиста отличается только тем, что Бог не мнит себя программистом. Давайте разберёмся, что и как создавать в нашем цифровом мире.
Если в физическом у нас есть законы мироздания, которые кем-то созданы, в нашем мире ничего нету. Либо же, может быть, есть что-то, чтобы не прямо с нуля создавать.
Да, есть. Если не уходить далеко вперёд, то у нас есть алгоритмы и структуры данных, а также правила их взаимодействия. Они находятся за пределами любого из языков программирования, и любой язык их просто реализует, как ему захочется.
Дальше мы берём с вами конкретный язык и добавляем его законы в наш цифровой мир. Теперь мы будем жить и писать по законам нашего языка. Он по-своему реализует структуры данных и добавляет какие-то штуки от себя.
Теперь в нашем цифровом мире не так пусто. У нас есть контекст нашего языка. В нашем мире уже не полностью пусто, но всё ещё не хватает для того, чтобы начать творить.
Структуры данных — лишь удобный инструмент, чтобы как-то обрабатывать нашу информацию. Но нам надо создать что-то, олицетворяющее нашу информацию.
Что-то, что является минимальной крупицей, либо минимальным набором наших данных. Либо то, как мы физический мир будем переносить в цифровой. Наш язык даст нам типы данных — это минимальные блоки, из которых мы будем складывать полноценное представление чего угодно.
Благодаря типам данных мы можем более точно описывать, что нам требуется, либо же что мы хотим воспроизвести. Каждый язык реализует типы данных по-своему. Они могут одинаково называться, но иметь разную реализацию, либо же разное понимание в каждом языке.
То есть int в Java и int в JavaScript. Если его можете назвать int, там он называется Number. Они разные, хоть и олицетворяют для нас одно и то же. Это всё ещё представление числа.
Также язык предоставляет нам базовые возможности, чтобы с нашими данными работать. То есть не просто же данные в вакууме записывать. Он предоставляет нам цикл, логический оператор, условия и всё остальное, чтобы мы как-то с этими данными работали.
И это всё, что язык нам даёт, чтобы определить наш первый контекст, в котором мы и будем решать наши проблемы.
Ну а теперь давайте взглянем на задачку в вакууме и решим её. Допустим, у нас есть набор чисел, и мы хотим знать, есть ли в нашем наборе чисел число пять.
Решим мы эту задачку на трёх языках: а именно на JavaScript, на Python и на Ruby. Сейчас у нас с вами есть три языка, значит, три контекста, в которых мы можем решить нашу задачу.
Либо же три представления нашей задачи в цифровом мире. Каждый из языков реализует типы данных по-разному, у него разные условные операторы и разные конструкции. Но суть от этого не меняется: они все решают одну задачу.
Давайте сначала начнём с того, что нам надо количество наших чисел как-то записать, а именно же представить наши числа в наших языках. В каждом языке это происходит по-разному, но суть опять же не изменилась — это всё представление числа.
Для начала нам надо свести нашу проблему до цифровой плоскости. И первое, что мы сделаем, это введём тип число. Как вы можете видеть, во всех трёх языках есть числа, и эти числа мы поместим в массивы.
Опять же, суть не меняется. Во всех трёх вариантах у нас есть массив. Просто написан он везде по-разному. Массив и числа у нас есть. Теперь нам надо как-то понять, что значит "есть ли число пять в нашем массиве чисел".
И для этого у нас есть логические операторы: True или False. True — число есть, False — числа нет. Всё просто и понятно. Наша задача сводится к тому, что нам надо найти в массиве чисел пять. Если оно есть, то соответственно вывести True, если его нет, то вывести False.
Задача решена. Вот её решение на всех трёх языках. Вы можете видеть, что записано оно приблизительно одинаково, но отличается какими-то мелкими деталями, которые в целом ни на что не влияют, но описывают контекст, в котором мы находимся.
Теперь давайте возьмём задачку посложнее. У нас есть склад с товарами: столы и стулья. И нам эти стулья и столы надо как-то продать. Мы решаем, что будем продавать их через интернет-магазин.
То есть утрируя всё до того, что если у нас есть интернет-магазин, значит, наши стулья со столами будут покупать. Почему я сказал, что задача чуть сложнее?
Звучит как капец разрыв между тем, как нам надо найти число во множестве чисел и создать целый интернет-магазин. Звучит очень большая разница. В действительности отличаться они будут только временем на решение, потому что обработать массив чисел — это очень быстро, а создать интернет-магазин — дольше.
Но суть концептуально вообще не поменялась. Нам надо взять проблему, перекинуть её в цифровую плоскость и обработать данные, которые появились в этой цифровой плоскости.
Но давайте по шагам. Первое, что нам надо будет сделать, — это поместить наши данные в какое-то хранилище. Потому что у нас есть данные, и они физически на складе. В цифре или же в Интернете у нас нет никакого склада, но у нас есть база данных.
И именно там мы будем хранить наши столы и стулья. Перед тем, как их хранить, нам надо определить их структуру. Что для нас представляет стул в цифровом мире? А именно же его физический и не только атрибут: цвет, размер, материал, цена и другая информация, которая нам понадобится.
И мы определяем это всё для базы данных. Потом нам надо эту информацию затолкать в язык программирования, чтобы наш язык мог с этими данными работать. Он получает от базы данных нашу информацию и должен её как-то записать себе для понимания.
Он не знает, что такое база данных и что в ней вообще что-то есть. Мы должны создать структуры данных для нашего языка. Мы можем создавать свои кастомные, но давайте представим, что мы можем всё через HashMap.
Ключом у HashMap будет физический какой-то атрибут нашего стула: цвет, размер, наименование, всё остальное, а также цена и прочие атрибуты. А значением будет являться, соответственно, значение этого стула или стола.
Без разницы. Опять же, на экране вы можете видеть представление нашего абстрактного стула или стола на трёх языках программирования. Концептуально ничего не изменилось. Это всё три структуры, которые показывают нам мой стул или стол, но реализация отличается.
Дальше нам надо как-то дать доступ до этих товаров людям извне, чтобы они могли как-то взаимодействовать с этим. Тут у нас есть несколько вариантов, но для обоих нам понадобится поднять сервер.
Нам надо поднять какое-то приложение, которое будет работать с нашей базой данных и отдавать на клиент, нашему конечному пользователю, какие-то данные. Дабы отдать эти данные, нам потребуется создать API для наших данных.
Также нам потребуется какой-то графический интерфейс, либо же мы ограничимся одним. Это вопрос дискуссионный, но мы опустим его как-нибудь на потом.
И тут я загнал себя в ловушку, взяв пример с интернет-магазина. В случае с простой задачкой решением нашего вопроса является простое написание кода, и нам хватает контекста одного лишь языка.
В реальности же проблемы лежат далеко за пределами одного лишь языка, и мы не можем так просто их решить. Либо же нам требуется больший контекст для решения наших задач.
Концептуально для нас ничего не поменялось. Нам надо брать проблему, переносить её на цифровую плоскость. Но контекст, в котором лежат наши решения, или область наших решений увеличился. Чем ближе задача к реальному миру физическому, тем больше требуется контекст, чтобы мы могли эту задачу решить.
Для глупых задачек на алгоритмы, которые задают на собеседованиях, нам хватает одного лишь контекста нашего языка. Нам свели задачи до данных в нужных форматах и попросили другой формат данных.
Всё в этом, вся задача легко и понятно. Мы преобразуем в нужный нам формат, выбрасываем решение — ура, всё готово, шикарно, великолепно. Не понимаю, почему Яндекс по 20 собеседований на эту тему проводит, если всё так просто.
А вот для нашего интернет-магазина нам не хватит простых структур данных и как-то это обрабатывать. Чтобы решить эту проблему, нам потребуется увеличить контекст. Нам требуется ввести понятие базы данных, сервера, API и всего остального.
Все эти протоколы — это всё лежит там, в большем контексте, который нам потребуется, чтобы всё это перенести. Суть-то не изменилась: мы всё сводим до данных и обрабатываем их. Но увеличился контекст, в котором нам надо находиться, чтобы мочь это всё перенести и решить.
И вот ширина и глубина этого контекста и определяют программиста, а также его уровень. Чем шире контекст, тем большее количество проблем вы можете решить. А чем он глубже, тем изящнее ваше решение.
Здесь как раз-таки и кроется вселенский срач всех программистов со всеми другими программистами: что считать сеньором и кто же лучший программист. Потому что кто-то выделяет ширину контекста как основной показатель.
Потому что чем больше задач ты можешь решить, и неважно какими способами, тем лучше. Кто-то выделяет глубину контекста и говорит, что если ты не знаешь всего компьютер-сайенса, почему ты вообще называешь себя программистом.
И вот то, как вы крутите ширину и глубину, и определяет ваш уровень. Но на мой взгляд, это всё не имеет никакого значения, потому что всё сводится к проблеме и тому, что её надо решить.
А чтобы мочь решить проблему, вам надо эту проблему переложить на цифровую плоскость. Чтобы мочь переложить её на цифровую плоскость, вам надо контекст как можно шире.
Но чтобы ваша задача была решена самым оптимальным образом, вам нужно глубинно увеличить своё понимание или же свой контекст. И только тогда вы сможете решить задачу оптимальным образом.
Ловушка же здесь в том, что мы не знаем, насколько широко и насколько глубоко надо что-то знать, чтобы вы были универсальным программистом и могли решить большую часть задач. Пространство проблем при этом невероятно велико.
При всём том, что всё IT базируется на каких-то базовых законах, алгоритмах, структурах данных, мы не можем с вами выделить чётко, что и в какой момент времени нам понадобится.
И это всё делает нас заложниками вечного обучения. Нам постоянно приходится либо обновлять контекст, либо повторять его, чтобы продолжать мочь решать проблему.
Поэтому, пока вы можете решать проблему, вы хороший программист. Как только не можете, вам надо понять, что вы не понимаете. Вам не хватает ширины контекста либо глубины контекста.
Как только вам всего хватает, сводите проблему до данных. Подписывайтесь на канал, ставьте лайки, заходите на Boosty. Такие дела.