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

Аббревиатуры

"СУХОЙ"

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

Используйте вашу IDE и инструменты качества кода для обнаружения дубликатов в вашей кодовой базе. Научитесь замечать дубликаты. Используйте свой конвейер CI, чтобы выполнять эти проверки для вас при каждой фиксации.

"ЦЕЛОВАТЬ"

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

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

"ТВЕРДЫЙ"

Для всех ваших объектно-ориентированных потребностей используйте это как основу для дизайна ваших объектов:

  • Принцип единственной ответственности: у каждого класса должна быть только одна ответственность. У класса никогда не должно быть более одной причины для изменения. «Соберите воедино вещи, которые меняются по одним и тем же причинам. Разделяйте те вещи, которые меняются по разным причинам. »
  • Принцип открытости-закрытости: программные объекты (классы, модули и т. д.) должны быть открыты для расширения, но закрыты для модификации. Подумайте о зеркальной камере: вы можете поменять линзы, чтобы расширить ее, но вы не можете изменить способ ее работы.
  • Принцип подстановки Лискова: производные классы должны расширяться без замены функциональности старых классов. Дочерний класс можно использовать так же, как и его родительский, с предсказуемыми результатами. Windows расширяет свою предыдущую ОС новыми функциями и выпускает ее как новую версию ОС, но вы все равно можете использовать ее точно так же, как старую.
  • Принцип разделения интерфейсов. Многие клиентские интерфейсы лучше, чем один интерфейс общего назначения. Ни один клиент не должен зависеть от методов, которые он не использует. Рассмотрим системы автопилота для самолетов, автомобилей и лодок.
  • Принцип инверсии зависимостей: модули более высокого уровня не должны зависеть от модулей более низкого уровня. Конструкция экскаватора не зависит от навесного оборудования.

Методологии

"Худой"

Оптимизируйте людей, ресурсы, усилия и энергию организации для создания ценности для клиента. Вот его принципы:

Избавьтесь от ненужных затрат: пропустите функции или действия, которые сейчас не приносят пользы.

Повышение эффективности обучения: ускорение процесса сбора знаний. Получайте обратную связь быстрее. Попробуйте разные идеи с кодом и сборкой. Используйте короткие итерационные циклы. Часто синхронизируйтесь с клиентами.

Примите решение как можно позже: сначала помогите клиентам лучше понять их потребности. Откладывать важные обязательства. Решения, основанные на фактах, а не на предположениях.

Доставьте как можно быстрее: высоко ценится клиентами. Более быстрая доставка = более быстрая обратная связь. Более короткие итерации = лучшее обучение и общение.

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

Обеспечение целостности. Обеспечьте баланс между гибкостью, ремонтопригодностью, эффективностью и быстродействием системы. При необходимости отредактируйте код. Обеспечьте автоматическое тестирование.

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

12-факторное приложение

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

Он основан на 12 «факторах»:

  1. База кода: должна быть ровно одна база кода для развернутой службы, причем база кода используется для многих развертываний. 12-факторное приложение хранит свой код в одной VCS и может быть развернуто в нескольких средах.
  2. Зависимости: должны быть объявлены все зависимости без явной зависимости от системных инструментов или библиотек. Новый разработчик должен иметь возможность клонировать репозиторий, запустить команду детерминированной сборки и немедленно начать разработку, для чего требуется только локальная установка среды выполнения языка программирования. Одним из примеров этого может быть использование команды curl.
  3. Конфигурация: конфигурация, которая различается в зависимости от развертывания, должна храниться в среде. Если код станет общедоступным прямо сейчас, он не должен подвергать риску никакие учетные данные. Код не должен знать, в какой среде он работает, или заботиться о ней.
  4. Вспомогательные службы. Все вспомогательные службы обрабатываются как подключенные ресурсы и подключаются и отключаются средой выполнения. База данных, шина сообщений, сторонний API - все обрабатываются через URL-адреса. Не делается различия, является ли ресурс локальным или удаленным. Развертывание с локального на производственное просто означало бы замену URL-адресов.
  5. Сборка, выпуск, запуск: конвейер доставки должен строго состоять из сборки, выпуска и запуска. Сборка - объедините код в развертываемый артефакт. Выпуск - комбинация артефакта сборки и конфигурации среды, готовая к немедленному выполнению в целевой среде. Выполнить - запускает выбранный выпуск в среде исполнения. Всегда должен генерироваться идентификатор выпуска, и должна быть возможность откатить развернутый выпуск назад.
  6. Процессы: приложения должны быть развернуты как один или несколько процессов без сохранения состояния с постоянными данными, хранящимися в резервной службе.
  7. Привязка порта: автономные службы должны становиться доступными для других служб через указанные порты.
  8. Параллелизм. Параллелизм обеспечивается за счет масштабирования отдельных процессов. Приложение никогда не должно демонизировать или записывать файлы PID, а должно полагаться на диспетчер процессов ОС. Горизонтально разделяемая природа 12-факторных процессов приложения без совместного использования ресурсов означает, что добавление большего количества параллелизма является простым и надежным.
  9. Возможность использования. Быстрый запуск и завершение работы рекомендуются для создания более надежной и отказоустойчивой системы. Минимизируйте время запуска. Завершение работы изящно.
  10. Соотношение разработчиков и продуктов: все среды должны быть как можно более похожими. Сопротивляется желанию использовать разные сервисы поддержки между разными разработками и производством. Стремитесь использовать одни и те же инструменты, запускайте приложение везде одинаково. Примером этого может быть запуск веб-сервера dev для локальной разработки, но запуск экземпляра веб-сервера nginx в производственной среде.
  11. Журналы: приложения должны создавать журналы в виде потоков событий и оставлять среду выполнения для агрегирования. Приложения никогда не должны пытаться записывать файлы журналов или управлять ими. Просто эхо регистрируется в потоке вывода.
  12. Процессы администрирования: любые необходимые административные задачи (например, миграция базы данных) должны храниться в системе контроля версий, упаковываться вместе с приложением и выполняться вместе с приложением.

Практики

Непрерывная интеграция: эта практика предполагает, что вы фиксируете код в общей основной ветке (главная / основная / магистральная, а не функциональная ветка) репозитория вашего проекта не реже одного раза в день. Каждая фиксация проверяется (стиль кода, модульное тестирование и т. Д.) Автоматизированным конвейером CI для максимально быстрого обнаружения проблем. Практика значительно снижает проблемы интеграции и позволяет команде быстрее разрабатывать связное программное обеспечение.

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

Будьте в курсе

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

  • Thoughtworks Insights - По моему скромному мнению, это лучшее место, на которое стоит обратить внимание как разработчик.
  • Hacker news - новостная лента основных технологий, стартапов и программирования.
  • Meetup - (Если только не корона) Лучший способ потереть локти и посмотреть, что происходит в непосредственной близости.
  • Суть - поиск фрагментов кода других разработчиков и / или их решений общих проблем.
  • Прочтите книги - учитесь у лучших.
  • Работайте над побочными проектами - иметь дневную работу по программированию - это здорово. Но вы можете дать себе преимущество, начав собственный проект.

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