[Перевод] Почему некоторые проекты угасают после ухода программиста из компании

Зачастую судьба цифрового продукта заботит не только компанию, которой он принадлежит, но и специалистов, непосредственно участвовавших в его разработке. Для многих программистов (и команда beeline cloud — не исключение) проект, к которому они приложили руку, — это не просто набор кода, а настоящее детище, чья судьба не перестает волновать даже после ухода из компании. Перевели для вас статью, которая поможет обеспечить своему начинанию долгую жизнь.

В статье речь пойдет об одной из основных причин гибели проекта после ухода программиста. Несколько практических примеров из реальной жизни помогут вам избежать подобной ситуации.

Фото Джузеппе Патриарчи on Unsplash

Предисловие

Вам никогда не приходилось задумываться о судьбе проекта, над которым вы работали в какой-нибудь компании?

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

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

Недавно мне довелось участвовать в рефакторинге кода. Хочу рассказать о причинах его проведения.

Таким образом, тему статьи так и обозначу: причины рефакторинга.

Безусловно, моё личное мнение должно соотноситься с вашим опытом и тем, как ваша компания работает над структурированием и сопровождением проектов.

Долг программиста в написании кода — максимально использовать в нем все свои способности. И делать упор не только на функционал, но и на удобство последующего сопровождения, ориентируясь на долгосрочную перспективу.

Что приводит к решению «проект подлежит рефакторингу»

Ответ не начертан на скрижалях. Существует множество причин для вынесения подобного вердикта.

Основываясь на собственном опыте, постараюсь рассказать о некоторых из них.

Вы концентрируетесь лишь на том, чтобы ваш код работал

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

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

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

Неорганизованный проект с запутанными именами

Чтение кода не должно быть пыткой. Однако навигация по пакетам и папкам в некоторых проектах вовсе не способствует пониманию, а лишь ужасает.

Проект, в котором зависимости перемешаны или плохо структурированы, со стопроцентной уверенностью можно пометить как «требующий рефакторинга».

При организации кода я стараюсь поставить себя на место другого человека. Легко ли следовать структуре моих модулей и пакетов? И если я уйду в отпуск, сможет ли мой коллега легко разобраться во всём и заменить меня?

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

Отсутствие документации или ее низкое качество 

Это как раз про меня.

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

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

Чтобы над проектом мог работать другой программист (после вашего ухода из компании или просто ваш коллега), не ленитесь снабжать код комментариями — это правило хорошего тона.

Некоторые инструменты позволяют создавать документацию на основе комментариев в коде.

Жестко прописанные значения и отсутствие структуры данных

Иногда вполне допустимо жестко прописывать некоторые значения.

Но когда проект напичкан ими, его чертовски сложно масштабировать без страха что-то сломать.

Если вы не знаете, о чём идёт речь, постараюсь объяснить.

Хардкод — принудительное присвоение переменной определенного значения вместо того, чтобы присваивать его динамически. 

username = "yanick_user" # hardcode value for username
role = "admin" # hardcode value for role

Это неправильно! А если имя пользователя изменится? Или после ухода пользователя из компании его просто отключат? Что делать, если понадобится сменить тип учётной записи?

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

Всё может сразу пойти наперекосяк.

import os
username = os.getenv("USERNAME")
role = os.getenv("ADMIN_ROLE")

Еще один очень важный момент — хорошо продуманная структура данных. Понимание важности структуры данных может существенно помочь в написании кода.

Чётко представляя, какие данные будет обрабатывать ваша система, вы облегчите задачу для себя, интерпретатора и тех, кто будет работать над вашим проектом.

def do_something(args):
   if args.get("some_key") == "admin":
       user = args.get("user_key")
       ...

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

В Python, используя класс данных (dataclass), очень легко описать объект, если вы знаете его структуру:

from dataclasses import dataclass
class Myclass:
   user_key: str
   some_key: str

Теперь вы можете реорганизовать предыдущую функцию do_something и упростить ее выполнение:

import os
ADMIN_ROLE = os.getenv("ADMIN_ROLE")
def do_something(args: Myclass):
   if args.some_key == ADMIN_ROLE:
       user = args.user_key
       ...

Пренебрежительное отношение к тестам или полное отсутствие таковых

И еще попадание в цель. Опять про меня.

Сказать по правде, добросовестно писать тесты я начал только после перехода к нынешнему работодателю.

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

Итак, как же уберечь свой проект от угасания?

Вопрос сложный, и, может, кто-нибудь сумеет на него ответить лучше меня со 100% уверенностью.

Несомненно одно — если вы примите к сведению мои рекомендации с учетом своего личного опыта, то окажетесь на правильном пути.

Да, я не безгрешен, но всегда стараюсь следовать лучшим практикам проектирования систем.

Периодически заглядываю в PEP (Python Enhancement Proposals) и читаю предложения по улучшению Python. Здесь всегда есть возможность узнать что-то новое и интересное. Python — быстро развивающийся язык программирования, и я стараюсь идти в ногу со временем.

Может и вы вспомните что-то из личного опыта? Возможно, кому-нибудь это поможет избежать чёрной метки «Требует рефакторинга».

Больше практических историй про решение ИТ-задач:

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

Делимся статьей-сравнением с наглядными графиками, которые помогут решить, какой инструмент подойдет именно вам: SCA, SAST, DAST или IAST?

Читать 

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

Читать 

Как развернуть CRM за 7 шагов?

CRM помогает компании провести клиентов от знакомства до формирования лояльности, не теряя по пути информацию и автоматизируя часть процесса. Рассказываем, как за 7 шагов внедрить CRM-платформу так, чтобы сотрудники не перестали ей пользоваться. 

Читать

© Habrahabr.ru