Часто в кругах разработчиков программного обеспечения я часто видел разговоры о том, что вам абсолютно необходимо выучить этот единственный язык программирования или о том, что строки кода действительно имеют значение. Даже Илон Маск, казалось, больше заботился о строках кода, решая, каких разработчиков программного обеспечения оставить или уволить из Twitter по какой-то странной причине. В этой статье я хочу обсудить то, что действительно важно с точки зрения разработки программного обеспечения, что вам нужно знать, когда дело доходит до обучения программной инженерии.



Написание эффективного, удобочитаемого и поддерживаемого кода

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



Объектно-ориентированное программирование и функциональное программирование

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

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

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

Шаблоны проектирования

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

Многопоточная/асинхронная логика

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



Алгоритмы и оптимизация

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

https://en.wikipedia.org/wiki/Big_O_notation

Архитектура и инфраструктура

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

Отладка

Если есть ошибка, как вы собираетесь воспроизвести и исправить ее? Это также понятие, независимое от языка. Он также не зависит от строк кода. Иногда проблема заключается в добавлении точки с запятой или дополнительного знака равенства. Забудьте о линиях, иногда мы говорим о персонажах. При отладке важно знать, как использовать отладчик, точки останова, операторы печати, а также старое доброе гугление. Во всех программах есть ошибки. Возможность решить проблему независимо от языка позволит достичь определенного уровня универсальности, которого можно ожидать от большинства разработчиков.

Безопасность

Как узнать, храните ли вы незашифрованные пароли или нет? Как узнать, открыты ли вы для инъекционных атак? Что ж, вряд ли углубленное изучение того или иного языка даст ответы на ваши вопросы. Если вы хотите узнать об эксплойтах нулевого дня или самых больших рисках для программного обеспечения, которое вы создаете, или если вы следуете передовым методам, вам необходимо быть в курсе самой последней литературы и быть в курсе OWASP.



Машинное обучение, наука о данных и автоматизация

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

Контроль версий

Как вы можете позволить нескольким людям совместно работать над одной кодовой базой? Что делать, если вы хотите вернуться к более старой версии вашего кода? Что делать, если вы хотите сравнить новые изменения с предыдущей версией? Это то, для чего предназначены программы контроля версий, такие как Git и Subversion. Все они не зависят от языка программирования и технически даже не зависят от программного обеспечения, поскольку вам не обязательно хранить код в репозитории Git.

Вывод: язык программирования — это инструмент для создания чего-либо. Это средство, а не цель

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