Маааааан, к черту алгоритмы и структуры данных! Да кому они вообще нужны?!

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

Так почему же внезапная перемена взглядов? Что заставило меня превратиться из настоящего, полного ненавистника algo&DS в восторженного фаната?
Что ж, пристегнитесь, потому что ответы на эти вопросы — настоящая дикая поездка!

Если вы, как и я, ненавидите алгоритмы и DS, цель этой статьи — познакомить вас с точкой зрения, которая может просто убедить вас в том, что алгоритмы и DS по-прежнему занимают свое место в инструментарии современных разработчиков программного обеспечения, и если вы любитель алгоритмов и DS, которые считают, что они абсолютно обязательны для всех и всех разработчиков программного обеспечения, то цель этой статьи — приблизить вас к «другой стороне» и убедить вас, что есть разработчики, которые очень продуктивны и ценны, и в то же время практически ничего не зная об алгоритмах и структурах данных (и о том, как помочь им научиться)!

Проблемы)

Когда я говорил о algo&DS и о том, почему я не заинтересован в их изучении, у меня были две основные жалобы — они могут показаться знакомыми:

  1. "Я опытный разработчик! Так почему же я за годы своей профессиональной деятельности не овладел алгоритмами и структурами данных естественным образом?
    Очевидно, что они не нужны, так какой смысл их учить?»
  2. «Язык программирования/фреймворк/библиотека позаботится об этом за меня!
    Зачем изучать что-то настолько низкоуровневое и «примитивное», когда сам язык программирования/фреймворк/библиотека справляется с этим намного лучше, чем я можно?»

Финансы!

Я буду честен с вами, финансы важны для меня, я хочу постоянно совершенствоваться, и я хочу, чтобы это улучшение отражалось в сумме $$$, которую я зарабатываю, я воочию убедился, что знание алгоритмов = холоднее твердые деньги!

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

Вы не можете внедрить решение, которого не знаете

Когда у тебя есть молоток, все выглядит как гвоздь

Несколько лет назад я действительно увлекся функциональным программированием, когда работал над проектом веб-приложения Angular 2+, который, как вы, возможно, знаете, в значительной степени опирается на сторону ООП, и все мои товарищи по команде пришли из ООП. реализовать 2 боковые панели на определенных экранах, и это изначально было сделано с использованием чистого императивного подхода, и какое-то время все было хорошо и хорошо… вдруг клиент начал давать нам условия, когда эти боковые панели должны быть видны, и в некоторых случаях содержимое боковые панели необходимо было изменить в зависимости от определенного ввода, из-за первоначального императивного ООП-подхода это означало множество if , сложность этого действительно не стоила результатов! Ура! 😬

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

Оказалось именно то, что нам нужно!

Все if были удалены, и этот огромный кусок кода был заменен двумя переменными isLeftSidebarVisible и isRightSidebarVisible, которые контролировали (это может стать большим сюрпризом…) видимость левой боковой панели и видимой правой боковой панели (сказал вам, что это большой сюрприз! )
Это оказалось настолько эффективно, что стало стандартом обработки состояния боковой панели во всем приложении и шаблоном решения подобных проблем в будущем.

«Есть ли место где-то в этой стене текста, которое вы называете историей?» — слышу я, вы говорите

«Есть», — вы слышите, как я говорю (в своем мозгу 🧠), и дело не в том, что я какой-то герой-разработчик, который налетел, чтобы спасти положение, а в том, что, хотя я работал с очень хорошими разработчиками, они не могли реализовать решение, о котором они не знали!

Видишь, к чему я клоню?

Алго и DS являются строительными блоками (всего?) современного программного обеспечения, и трудно представить, что существует современный язык программирования, который не реализует их под капотом, а затем предоставляет разработчикам функцию для использования, пока вы вызываете Array.sort() и не задумываясь об этом, в фоновом режиме выполняются некоторые суперумные алгоритмы и DS, чтобы сделать вызов этой функции максимально быстрым и эффективным с точки зрения использования памяти. Потрясающий!

Я пытаюсь подчеркнуть, что вы, вероятно, использовали algo&DS в той или иной форме, даже не осознавая этого и не называя его другим именем, так что пункт 1 проблемы на самом деле не соответствует действительности, вы Явсе это время использовал algo&DS!

Самое замечательное в этом то, что вам не нужно знать ТОЧНОчто происходит под капотом, но иметь представление о том, как подобные вещи реализуются языком программирования, поможет вы в большей степени «носитель языка», что приведет к более правильным решениям при выборе API для использования, и это приведет к тому, что вы станете лучшим разработчиком программного обеспечения.

К проблемному пункту номер 2!

Язык программирования позаботится об этом за меня!

Не совсем так 🤷‍♂️ понимаете, языки программирования предназначены для общего и обобщенного решения проблем, поскольку программные продукты могут иметь совершенно разные требования, а разные алгоритмы и DS используются в разных ситуациях, нет серебряной пули, которая была бы идеальным решением для любой ситуации. так какие языки программирования они предоставляют разработчикам все необходимые API для реализации наилучшего решения для их варианта использования, поэтому ВЫкак разработчик должны реализовать лучшее решение и Молиться о том, чтобы язык программирования/фреймворк/библиотека вас спасли, просто… ну… лень.

Может быть трудно представить, о чем именно я здесь говорю, поэтому позвольте мне дать вам

пример!

Когда я начал работать с JS, я влюбился в его Array и весь функционал, который с ним был, я пытался делать все с его помощью.
Очень часто всплывал один конкретный вариант использования — необходимость хранить некоторые данные, связанные с некоторым ключом, и я решил бы это, создав массив и добавив элементы с (обычно) реквизитом id, чтобы в JS это выглядело примерно так [{ id: 1, name: 'Bojan' }], и когда мне нужно было взаимодействовать с определенным элементом внутри этого массива, я 'просмотрел бы весь массив, чтобы найти его.
Если вы знакомы с основами algo&DS, вы уже знаете, почему это проблема, а если вы не знаете, и вам интересно, в чем проблема, это может убедить вас заинтересоваться algo&DS

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

А теперь перейдем к сути дела — я думал, что все делаю правильно! Я думал, что мой подход был хорош, но это не так, он действительно плох по сравнению с правильным способом, и единственная причина, по которой он не взорвался в моем лице, заключается в том, что современное оборудование и языки программирования ТАКхорошо, что они компенсируют плохим разработчикам 😬

Реальность ситуации поразила меня

Я был плохим разработчиком, думая, что я великий!

Это действительно вбило мне в голову мысль, что мне будет очень полезно узнать больше об алгоритмах и структурах данных, и если вы еще не знаете их сами, их изучение определенно принесет пользу вашей карьере разработчика программного обеспечения! Я гарантирую это.

Другая сторона

Я не собираюсь тратить много времени на защиту разработчиков, которые не разбираются в algo&DS, главным образом потому, что я не могу в здравом уме выступать за НЕзнание чего-то, но что-то существует группу разработчиков (я знаю, потому что я был в этой группе раньше), которые путем проб и ошибок выяснили, что работает, а что нет, и им можно доверять разработку функций и быть продуктивным, поэтому, если вы знаете algo&DS и работаете с кем-то, кто нет.

Не становитесь сразу же элитарным и не начинайте стыдить — то, что я очень часто вижу в Интернете, поговорите с этим разработчиком и представите концепции по частям, не просто бросайте каждый алгоритм и структуру данных им на голову и думайте, что ваша работа сделана, что тема ОГРОМНАЯлегко чувствовать себя перегруженной.
Ваша цель должна состоять в том, чтобы постепенно улучшать своего коллегу, пока он не освоит все наиболее популярные алгоритмы. и структуры данных, я гарантирую, что вы увидите их уверенность в себе, и работать с ними будет намного приятнее!

Наконец, стоит подвести итог и еще раз сказать, что вы можете создавать программное обеспечение и даже иметь его приличного качества, не зная ни единого алгоритма или DS, главным образом потому, что инструменты, которые мы, как разработчики, используем, настолько продвинулись вперед, что они могут компенсировать этот факт, но вы вы стремитесь стать профессиональным разработчиком, вы никоим образом не выиграете от хотя бы поверхностного знания алгоритмов и DS, и если вы возьметесь за это и начнете углубляться, я уверен, что вы увидите, как ваши навыки решения проблем улучшатся через крышу!