← Назад к вопросам

Трудно ли перестроиться на то что плохой код не будет исправлен

1.7 Middle🔥 111 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

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

Почему это трудно: корни проблемы

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

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

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

Как перестроиться: стратегии принятия и адаптации

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

  1. Смена фокуса с идеального на достаточное:
    *   Вместо стремления к абсолютной чистоте кода, оценивайте его через призму **бизнес-ценности**. Задайте себе вопросы: "Мешает ли этот код сейчас выполнять задачи?" или "Сколько времени сэкономит рефакторинг в долгосрочной перспективе?".
    *   Иногда **"достаточно хороший" код**, который работает и покрыт базовыми тестами, является оптимальным решением.

  1. Аргументация на языке бизнеса:
    *   Чтобы добиться ресурсов на рефакторинг, нужно говорить не о "красивом коде", а о **рисках и издержках**. Приведите конкретные примеры:
        *   "Из-за высокой связанности этого модуля (**coupling**) добавление новой кнопки в интерфейс сейчас занимает 3 дня вместо 3 часов".
        *   "Отсутствие **юнит-тестов** для этого компонента приводит к 2-3 критическим багам в продакшене каждый квартал, что вредит репутации".
    *   Предлагайте **инкрементальные улучшения**. Вместо глобального переписывания, можно улучшать код по касательной при работе над соседними фичами.

  1. Контроль над своим пространством:
    *   Примите, что вы не можете исправить весь legacy-код. Но вы можете писать **качественный новый код** вокруг него и в новых модулях. Станьте примером для коллег.
    *   Внедряйте и соблюдайте **code style guides**, используйте линтеры (например, **ESLint** для JavaScript) и форматеры (**Prettier**), которые автоматически поддерживают базовый уровень качества.
    *   Пишите **тесты** (юнит-тесты с **Jest/Vitest**, интеграционные с **Cypress/Playwright**) для новой функциональности. Это создает "защитный слой" и делает код более устойчивым.

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

Пример: Практический подход к legacy-коду

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

// ПЛОХОЙ КОД (Legacy): Все в одном компоненте
class OldUserProfile extends React.Component {
  constructor(props) {
    super(props);
    this.state = { user: null, loading: true, error: null };
  }

  componentDidMount() {
    fetch('/api/user')
      .then(res => res.json())
      .then(data => this.setState({ user: data, loading: false }))
      .catch(err => this.setState({ error: err, loading: false }));
  }

  render() {
    const { user, loading, error } = this.state;
    if (loading) return <div>Loading...</div>;
    if (error) return <div>Error!</div>;
    return (
      <div>
        <h1>{user.name}</h1>
        <p>Email: {user.email}</p>
        <button onClick={() => alert(`Hello ${user.name}!`)}>Greet</button>
        {/* Еще 100 строк сложной логики отображения */}
      </div>
    );
  }
}

Вместо того чтобы требовать немедленного переписывания всего компонента, можно применить стратегию малых шагов:

// ШАГ 1: Выносим логику запроса данных в кастомный хук (при следующем касательном изменении)
function useUserData(userId) {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    fetch(`/api/user/${userId}`)
      .then(res => res.json())
      .then(data => setUser(data))
      .catch(err => setError(err))
      .finally(() => setLoading(false));
  }, [userId]);

  return { user, loading, error };
}

// ШАГ 2: Постепенно рефакторим сам компонент, разбивая его на мелкие, отвественные части
function UserAvatar({ user }) {
  return <img src={user.avatarUrl} alt={user.name} />;
}

function UserGreetingButton({ user }) {
  const handleClick = useCallback(() => {
    alert(`Hello ${user.name}!`);
  }, [user.name]);
  return <button onClick={handleClick}>Greet</button>;
}

// Новый код вокруг старого становится чище, а legacy-часть изолируется.

Заключение

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

Трудно ли перестроиться на то что плохой код не будет исправлен | PrepBro