Мы инженеры-программисты или программисты? Используем ли мы оба, как если бы они были одинаковыми? Если мы посмотрим на первую главу в книге Разработка программного обеспечения в Google и увидим, что они посвящают этому целую главу, мы можем предположить, что это не одно и то же. Эту главу стоит прочитать, и в ней собраны все детали, которые они раскрывают. Сегодня я хочу показать вам свое видение через небольшое описание и реальный пример каждого из них.
Программист-программист
Программирование — это то, как мы создаем больше программного обеспечения, поэтому программист — это просто человек, который может создавать программное обеспечение, просто кусок кода, который что-то делает.
Кроме того, программирование является частью разработки программного обеспечения.
Инженер-программист
Инженер-программист — это человек, который должен заботиться о гораздо большем, чем просто создавать программное обеспечение. Программная инженерия должна думать о:
- время: как долго будет действовать решение. Это краткосрочное решение? Это надолго? Может быть, мы не знаем…
- масштаб: насколько большим он может стать?
- компромиссы: преимущества и недостатки каждого решения
Теперь я хочу представить несколько реальных примеров моей повседневной работы, которые можно отнести к каждой из этих категорий (инженерия и программирование).
Случай программирования
Был обнаружен угловой случай, и некоторые статусы элементов не были обновлены правильно. После просмотра кода и понимания проблемы было сделано исправление.
Теперь нам нужно исправить те статусы, которые остались с неправильными значениями. Создайте небольшую программу, которая:
- Найдены неправильные элементы
- Ищите правильное значение
- Обновите статус в каждом неправильном элементе
Нам просто нужно создать программу, которая выполняет эти инструкции, и определить, как ее запускать.
То есть нет необходимости думать о чем-то другом, кроме правильных указаний для решения конкретной задачи.
Инженерный случай
Нам нужно помочь нашим пользователям пройти самый сложный этап в нашем процессе заключения контрактов, это ключевой процесс, он зависит от внешних служб и может когда-нибудь дать сбой. В случае сбоя это замедляет процесс для наших пользователей и увеличивает нагрузку на нашу службу поддержки.
Мы оценили несколько вариантов:
- Вариант первый: добавьте дополнительные шаги для клиента в процесс, чтобы помочь ему запустить альтернативный процесс
- Второй вариант: создать запланированное задание для запуска процесса, который кэширует информацию, которая будет использоваться во время процесса.
Первое, что мы приняли во внимание: усилия для каждого решения.
- Первый вариант потребует работы с серверной частью вместе с работой приложений (IOS и Android). Процесс, который необходимо реализовать, довольно сложен и имеет несколько новых шагов и изменений. Любой, кто работает с нативными приложениями, знает о процессе выпуска для каждой платформы и проблеме, когда обнаруживается новая ошибка. Таким образом, будучи сложным процессом и бизнес-проблемой, не очень хорошо известной нативным приложениям, это может привести к увеличению времени выпуска, возможной ошибке, плохому решению и необходимости удалить его из процесса и т. д.… Запоминание: нативное приложение, когда оно выпущено, готово, вы не должны гарантировать, что у пользователя будет последняя версия (по крайней мере, простым способом).
- Второй вариант требует работы только для бэкэнд-команды, он снижает сложность процесса, избегая синхронизации между командами, участвует только команда со знанием бизнес-проблем, возможная ошибка может быть решена без взаимодействия с пользователем (только обновление бэкэнда). В то же время это решение могло не работать для некоторых пользователей. Но именно здесь вступают в игру дополнительные изменения, и для решения этих случаев будет запланирована другая задача (также сокращение изменений и повторное использование уже существующих функций).
Как только у нас появился лучший вариант, пришло время подумать о процессе и спроектировать его с учетом различных деталей:
- Объем обрабатываемых данных: используйте правильный параллелизм, алгоритмы, структуры данных и шаблоны проектирования.
- Наличие внешних сервисов: параллелизм вызовов, сроки выполнения задачи.
- Абстракция задачи, возможности конфигурации: сделайте процесс независимым и позвольте настроить задачу в соответствии с потребностями.
- Результаты задачи: писать журналы, создавать мониторинг и панель мониторинга, сохранять данные результатов для процесса исторификации и иметь возможность анализировать результаты.
Как вы могли заметить, я использовал слово «мы» для обозначения действий в этом примере, и это «мы» — одно из самых важных различий между программированием и проектированием. Инжиниринг — это командная работа!
Итак, как мы видим, для «инженерного» процесса требуется программное обеспечение, но это всего лишь один шаг процесса. В этом процессе гораздо больше, и большую часть времени мы должны стараться быть «инженерами-программистами» и быть «программистами-программистами», когда это необходимо (когда мы просто пишем простой код).
Что мы можем сделать, чтобы стать лучше в каждом из них?
Программист-программист
- Освойте свой основной язык программирования и изучите другие.
- Овладейте своим редактором, привязками клавиш, инструментами отладки и т. д.
- Улучшение структур данных и алгоритмов.
- Изучите наиболее часто используемые структурные и поведенческие модели.
- Совершенствуйте свои навыки тестирования.
Инженер-программист
- Улучшить коммуникативные навыки (аудирование, письмо, говорение).
- Изучите архитектурные шаблоны.
- Увеличьте свои возможности абстракции.
- Узнайте о проектировании систем.
Это некоторые из моих примеров и рекомендаций, и я надеюсь, что это кому-то поможет. Если вам это нравится, следите за мной на Medium для других статей!.
Есть ли у вас другие определения или примеры для этих двух понятий?