Структуры данных и алгоритмы

Определяющая грань между кодерами и инженерами

Инженеры-компьютерщики сегодня очень востребованы! Имейте в виду, я сказал «инженеры по информатике», а не «программисты»! Дело в том, что с изобилием инструментов, доступных в вашем распоряжении, каждый может взять ноутбук, ПК, MacBook и даже смартфон, чтобы написать программное обеспечение, которое ему нужно! Но действительно ли это сокращает его?

Индийцы с населением более 1,3 миллиарда человек уже жаждут лучшего. Индия занимает второе место в мире по количеству пользователей Интернета: более 455 миллионов человек регулярно получают доступ, используют и меняют Интернет! Представьте себе масштабы приложений, программного обеспечения и услуг, необходимых для обслуживания такого огромного количества людей. Даже не думайте о мире прямо сейчас, Индия и Китай вместе взятые могут значительно превзойти любые мыслимые масштабы для любого приложения!

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

Так как же современный мир стоит на подходе к достижению такого масштаба! Огромные ИТ-фирмы, организации, компании и сообщества объединились в единодушном реве, заявив, что кодеры — это те, кто будет трудиться и помогать технологиям выживать и жить для всех нас, но это инженеры, ученые и провидцы. кто создаст и проложит путь к новаторскому революционному будущему технологий, которое соответствует масштабу, необходимому человечеству; И инженеры не приходят в комплекте.

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

Здесь я начинаю говорить о структурах данных и алгоритмах. Практически во время выпуска CSE во время учебы в колледже я думал, что структуры данных и размышления обо всех доступных алгоритмах замедляют мою работу. Я верил в создание решений как можно быстрее. Я завершил более 50 проектов в течение 4 лет, разрабатывая все, что я считал проблемой для себя, даже не удосужившись подумать о типе структуры данных или алгоритма, который я использовал или должен был использовать.

Когда я сел 4 года спустя после того, как закончил колледж, после того, как начал обучать молодых амбициозных «программистов», после того, как я присоединился к ТНК и начал решать проблемы в невообразимых масштабах, где каждое решение затрагивало около 27 миллионов человек, я взял каждую строчку кода, который я написал; именно тогда я понял, что я не должен просто кодировать, я должен разработать свое решение наиболее оптимальным, гибким и смехотворно эффективным способом.

Однажды мой студент спросил меня, все ли могут использовать программное обеспечение, которое вы создаете? Этот вопрос заставил меня о многом задуматься, я, безусловно, мог бы использовать его. Я создал его для себя, я решил свою проблему, но я не думал, что другие могут столкнуться с той же проблемой! В тот вечер я сел с пивом, пиццей и чипсами и начал модифицировать то же самое приложение. Это был инструмент отслеживания сетевых уязвимостей, который работал путем перебора всех возможных параметров и проверки каждой возможной ситуации, чтобы найти то, что беспокоит сеть. У меня было время, терпение и аппаратные возможности, чтобы поддерживать это. Но это было неэффективно. Конечно, это было неэффективно и совсем не гибко. Это должна была быть моя система, мое оборудование и мое окружение. Это была проблема.

Итак, я начал свое мучительное испытание по деконструкции моего кода и решению, как его реструктурировать, чтобы он подходил для любого оборудования и возможных ситуаций. Я решил впервые использовать лучшие алгоритмы, разработать некоторые из них самостоятельно и построить структуру данных для работы со значительными масштабами. Я реализовал хэш-карту, чтобы создать карту всех возможных претендентов, которых нужно было найти. Затем я создал алгоритм для поиска уязвимостей с использованием хеш-значений. Моя сложность? Получилось O(1). Тем, кто не знает, что это такое, я могу объяснить вам это просто: то, что раньше я достигал, возможно, за сотню итераций угадывания, теперь я мог сделать всего за 1, всегда, независимо от ситуации. Это резко снизило нагрузку на мое оборудование, а также позволило системе стать более эффективной, сократив ее использование всего одной программной части. Он также был очень гибким, я всегда мог добавить или удалить то, что мне не нужно. В довершение всего, я сделал его удобным для пользователя. Его сможет использовать даже новичок, совершенно не знающий, что такое программирование. Все это стало возможным благодаря разработке масштабируемого решения.

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

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

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

Я все еще использую грубую силу и прямые методы, когда пишу код. Я по-прежнему полагаюсь на инструменты и архитектуры, чтобы достигать своих целей быстро и как можно чаще, но теперь я начал задавать себе вопрос: а что, если? Простой вопрос, на который так много разных ответов. Это когда я начинаю наблюдать за масштабом проблем, когда я вижу решения, затрагивающие очень многих людей с той же самой проблемой, которую решаю я! Структуры данных и алгоритмы стали аналогичны кирпичам, строящим стену. Мы могли бы просто сложить кирпичи друг на друга и построить стену, но ни одна из этих стен не была бы ни прочной, ни надежной. Но если вы спланируете, где разместить каждый кирпич, выстроите шаблон, чтобы стены могли поглощать удары, чтобы стены могли служить дольше, поддерживать другие конструкции, эта стена действительно будет той, которую вы хотите. То же самое и со структурами данных. Вы используете наиболее оптимальные структуры данных, алгоритмы, планирование и видение, и в конечном итоге вы создадите программное обеспечение, которое будет соответствовать необходимому масштабу.

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

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

Так что надеемся скоро увидеть вас! А пока продолжайте кодить!

Об авторе —

Я инженер по компьютерным наукам и разработчик программного обеспечения в LTI (Larsen and Toubro Infotech), специализируюсь на программном обеспечении с открытым исходным кодом и открытых стандартах. Я начал свою карьеру в качестве разработчика полного стека и горячо верю во внедрение безопасных цифровых методов в современную систему образования. Я баловался Android, Tickstack, Unity и Cloud. Я также являюсь энтузиастом кибербезопасности и прошел обширный курс по сетевой безопасности и этичному взлому. Я играл ключевую роль в инкубации нескольких стартапов в Entrepreneurship Cell, Дехрадун.

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

Мой опыт заключается в кибербезопасности, пройдя тщательное обучение и сертификацию в области цифровой безопасности, шифрования и этического взлома, а также разработки Java. Я сертифицированный Spring-разработчик и также работаю над получением сертификата в Redhat Openshift.

Я являюсь основателем AINC, create codeорганизации,направленной на разработку программного обеспечения и обучение всем различным языкам программирования, программному обеспечению и используемым инструментам. У меня около двух лет опыта преподавания по таким предметам, как разработка Android, структуры данных и веб-дизайн, в качестве студента-волонтера в UPES, Дехрадун. Кроме того, я успешно выполнил 10 масштабных и более 40 коротких проектов за 4 года во время учебы в колледже и работаю с платежными решениями Nets, чтобы создавать платежные решения для облегчения завтрашнего дня.

Чтобы связаться со мной, свяжитесь со мной по адресу [email protected] или позвоните по телефону 9990614406.

Найдите меня на Linkedin здесь.

Посетите мой Instagram здесь.