Старый (legacy) код — это конец карьере?
Рассказывал знакомый, который до этого рассказал про черный список HR.
— Наша компания работает уже давно. Держится в основном на старых проектах. Программистов мало, поэтому о переписывании и речи не идет, тем более, их еще нужно постоянно дорабатывать. ЗП одна из самых высоких в городе, плюс ежеквартальные премии, премии на праздник и тринадцатая зарплата. Помимо всего этого компания оплачивает абонементы на бассейн, спортзал и курсы английского языка.
А работать здесь никто не хочет. Стоит на собеседовании кому-то услышать про webforms или, о ужас, классическом asp, тут же делает ноги и не хочет работать, хотя ЗП и всё остальное устраивает.
Недавно приходил джуниор, предложили ему зп чуть ли не миддла, он на радостях соглашается, а через некоторое время звонит и говорит, что пообщался со знакомыми программистами, и они посоветовали бежать оттуда, так как он там ничему не научится и завтра никому не будет нужен, как работник.
Код без тестов — легаси
Если вы работаете в IT, то о легаси вы слышите часто — обычно с множеством негативных коннотаций. Понятно, что это не «хороший код», но какой? Может старый, может не поддерживаемый или не обновляемый, а может просто чужой? Есть ли «полноценное» определение «легаси», на которое можно ссылаться? А когда разберемся — что нам делать с легаси? Попробуем разобраться. Спойлер: выводы неочевидны.
Автор — Николас Карло, веб-разработчик в Busbud (Монреаль, Канада). Специализируется на легаси. В свободное время организует митап Software Crafters и помогает с конференциями SoCraTes Canada и The Legacy of SoCraTes.
Данная статья была скомпилирована (и отредактирована) из двух статей Николаса: «What is Legacy Code? Is it code without tests?» и «The key points of Working Effectively with Legacy Code». Показалось логичным рассказать о том, что такое легаси, а потом — как с ним работать.
Что такое «легаси»?
Возможно, если вы задавались этим вопросом, то встречали определение от Майкла Физерса. Майкл выпустил книгу «Working Effectively with Legacy Code» в 2004 году, но она до сих пор актуальна. Комикс это отлично иллюстрирует.

В своей книге Майкл пишет своё определение:
«Для меня легаси — это просто код без тестов».
Почему Физерс так считает? Потому что по его многолетнему опыту без тестов обычно трудно узнать всё, что код умеет. Если тестов нет, то для понимания, что код делает, вам нужно внимательно его прочитать, воспроизвести программу в своей голове и представить все возможные сценарии. Потом вы поменяете код и нужно снова представить все сценарии. Или проверить их вручную, но всегда есть шанс что-то сломать.
Это хорошее определение: чаще всего тесты отсутствуют, так что это хорошее начало. Но это ещё не всё — есть нюансы.
Код с тестами также может быть легаси. Если вы читаете тесты, но не можете понять, что должен делать код — они отстой. Плохие тесты только мешают: тестируемый код так же трудно отрефакторить, как если бы у него не было тестов, а может даже и сложнее!
Тестов может и не быть, но код всё ещё легко можно отрефакторить. Возможно, вы поддерживаете небольшую кодовую базу без тестов, которую легко понять и рефакторить. Хотя, по моему опыту, это аномалия. Эту кодовую базу можно было бы проверить, но отсутствие автоматизированных тестов всё же не позволяет квалифицировать его как легаси.
Перейдём к моему определению легаси.
Легаси — это ценный код, который вы боитесь менять.
Например, мы ищем первопричину ошибки или выясняете, куда вставить свою функцию. Мы хотим поменять код, но это трудно, потому что непонятно как не нарушить существующее поведение. Готово — у нас легаси!
Мы переоцениваем сложность незнакомого кода. Поэтому мы думаем, что код, который писали не мы — устаревший. Это работает и с нашими прошлыми проектами, когда мы не можем понять, что закладывали и имели в виду, когда писали эту мешанину на экране.
Хорошие тесты помогают легко менять незнакомый код. А плохие тесты не помогают. Отсюда и определение Физерса.
С легаси помогает время. Парадоксально: обычно время превращает любой код в легаси, но чтобы его понять нам также помогает время. Если вы начали работать над легаси и это трудно — подождите. Да, большая часть кода ужасна, но вы привыкнете и лучше поймете его причуды и особенности.
Легаси не виновато в том, что оно такое. Большая часть кода ужасна, потому что это результат работы многих людей в течение долгого времени с противоречивыми требованиями и под давлением дедлайнов. Это Рецепт Устаревшего Кода™. Когда мало времени и недостаточно знаний — рождаются костыли (ну вы знаете). В конце концов, мы достигнем состояния, когда каждое движение приводит к ошибке, а реализация любой функции занимает целую вечность.
А теперь один из важнейших нюансов.
Легаси — это код, который мы изо всех сил пытаемся понять, чтобы поменять.
Легаси — это личная точка зрения. Устаревший код может стать проблемой для каждого разработчика команды. Какой-то код может показаться сложным, потому что мы его ещё не поняли, а какой-то понимаем, но всё равно чувствуем себя некомфортно, когда рефакторим. Но субъективное ощущение «легаси» зависит от нашего понимания кода, и наших чувств по поводу его изменения. Часто люди этого не понимают.
В итоге мы получаем, что легаси это:
который мы пытаемся понять, чтобы отрефакторить;
Как же эффективно работать с легаси?
Легаси — код, который мы пытаемся понять, чтобы отрефакторить. Задача рефакторинга в том, чтобы сохранить существующее поведение кода. Как без тестов мы будем уверены, что ничего не сломали? Нам нужна обратная связь. Автоматизированная обратная связь — ещё лучше.
Добавить тесты, а затем внести изменения
Логично, что если добавить тесты, они помогут его «прощупать» и он перестанет быть устаревшим. Поэтому первое, что нужно сделать — написать тесты. Только тогда мы будем в безопасности, чтобы рефакторить код.
Но чтобы запустить тесты, мы должны поменять код. Возникает парадокс легаси. Мы обречены? Нет. Поменяем как можно меньше кода для тестов:
Определим точки изменения — «швы».
Первые два пункта самые сложные, а как только доберёмся до тестов, мы знаем, что делать.
Найти «швы» для разрыва зависимостей
Обычно когда мы добавляем тесты к легаси возникает «проблема зависимостей»: код, который мы хотим протестировать, не может работать, потому что ему нужно что-то сложное для тестирования. Иногда это соединение с базой данных, иногда вызов на сторонний сервер, а иногда — параметр, который сложно создать. А чаще всё и сразу.
Чтобы протестировать код, нужно разбить эти зависимости в тестах. Для этого необходимо выявить «швы».
«Шов» — место, где можно изменить поведение программы, не меняя код.
«Швы» бывают разные. Если это объектно-ориентированный ЯП, то обычно это объект, например, в JavaScript.
Допустим, метод connect() вызывает проблемы, когда мы пытаемся поместить код в тесты. Получается, что весь класс — это «шов», который можно поменять. Можно расширить этот класс в тестах, чтобы предотвратить его подключение к реальной БД.
Есть и другие виды швов. Если язык позволяет изменять поведение кода без изменения исходного кода, у нас есть точка входа в написание тестов. Кстати о тестах…
Напишем unit-тесты
Дискуссии о лучших практиках тестирования обычно перерастают в холивары. Применять принцип пирамиды тестов, и писать максимум unit-тестов? Или использовать «Кубок тестирования» и писать в основном интеграционные?
Почему советы такие противоречивые? Потому что у них нет единого определения того, что такое «unit». Одни люди говорят об «интеграционных тестах» и тестируют всю библиотеку, а другие тестируют каждый класс по отдельности.
Чтобы избежать путаницы, Майкл даёт четкое определение того, что такое НЕ unit-тест:
он не работает быстро (< 100ms / test);
он взаимодействует с инфраструктурой, например, базой данных, сетью, файловой системой, переменными;
Напишите максимум тестов, которые обладают этими 2 качествами, при этом неважно, как вы их назовёте.
Иногда трудно написать такие тесты, потому что не понятно, что код должен делать. Тогда используйте специальную технику.
Тесты для определения характеристик
Это тесты, которые формализуют фактическое поведение части кода.
Вместо того чтобы писать комплексные модульные тесты, мы фиксируем текущее поведение кода — делаем снимок того, что он делает. Тест гарантирует, что это поведение не изменится!
Это мощная техника, потому что:
В большинстве систем то, что код делает важнее того, что он должен делать.
Мы можем быстро покрыть легаси с помощью этих тестов. Так мы подстрахуемся для рефакторинга.
Этот метод также называют «Approval Testing» («тестированием одобрения»), «Snapshot Testing» или «Golden Master».
Но обычно на всё это очень мало времени.
Когда совсем нет времени на рефакторинг
Несколько советов, если предыдущие не подходят.
Большие куски кода обладают «гравитацией» и привлекают ещё больше кода. «Теория разбитых окон» в действии: небольшой беспорядок влечёт за собой беспорядок серьёзнее. Если класс уже содержит 2000 строк, то какая разница, что вы добавите еще 3 if оператора и будете поддерживать класс длиной в 2010 строк?
Это всего лишь 3 if: тяжело себя убедить, что нужно потратить на них 2 дня, хотя и должны. Что делать, если действительно нет времени писать тесты для этого класса? Используйте техники Sprout (прорастание), Wrap (обёртывание) и скретч-рефакторинг.
Sprout
Напишите код в другом месте, сделайте один тест, определите, где вы должны вызвать этот код из существующего кода (точка вставки), и вызовите свой код из легаси.
Рассмотрим на примере:
Допустим, нам нужно убрать дубли файла entries, но postEntries() трудно проверить — нет на это времени. Мы можем «прорастить» код где-то ещё, например, в новом методе uniqueEntries(). Этот новый метод легко протестировать, потому что он изолирован. Затем вставим вызов этого метода в существующий, не проверенный код.
Минимальные изменения, минимальный риск. Можете «вырастить» один метод, целый класс или что-то ещё, что изолирует новый код.
Можно «обернуть» изменение, если оно должно произойти до или после существующего кода.
Переименуем старый метод, который хотим обернуть.
Создадим новый с тем же именем и подписью, что и старый.
Вызовем старый метод из нового.
Поместим новую логику до/после вызова другого метода.
Эту новую логику можно проверить, потому что старый метод — это «шов», который можно изменить в тестах. Помните предыдущий код?
Ещё один способ решить эту проблему — это обернуть её, поэтому мы переходим к postEntries(), списку записей, из которых мы удалили дубли.
В тестах мы бы изменили проблему postEntriesThatAreUnique(), чтобы проверить, работает ли логика удаления дубликатов. Разница может быть ещё больше.
Эти методы не идеальны, и у них есть недостатки. Но это полезные инструменты при работе с легаси. А при необходимости можно даже немного нарушить правила.
Скретч-рефакторинг
Сложно работать с кодом, который мы не писали, без тестов и с плохой документацией. Чтобы «выбраться» нам нужно разбить зависимости, написать тесты. Но с чего вообще начинать, когда код непонятен? Хорошая техника — скретч-рефакторинг.
Его цель в том, чтобы ознакомиться с кодом, а не менять. Мы «играем» с кодом столько, сколько захотим: извлекаем функции, упрощаем, переименовываем переменные. Как только сделаем, всё, что нам нужно — откатим всё обратно и начнём с правильных тестов.
Выводы
Легаси будет везде, где бы вы ни работали, в каждой кодовой базе. Можно сопротивляться и чувствовать себя плохо, когда вы застряли в нём. А можно рассматривать это как возможность. Работа со старым кодом это очень ценный навык, его надо изучать теоретически (почитайте книгу «Working Effectively with Legacy Code») и практиковать в ежедневных задачах.
Похожие и интересные статьи:
О том, над чем в целом мы тут работаем: монолит, монолит, опять монолит.
Кратко об истории Open Source — просто развлечься (да и статья хорошая).
Больше новостей про разработку в Додо Пицце я пишу в канале Dodo Pizza Mobile. Также подписывайтесь на чат Dodo Engineering, если хотите обсудить эту и другие наши статьи и подходы, а также на канал Dodo Engineering, где мы постим всё, что с нами интересного происходит.
А если хочешь присоединиться к нам в Dodo Engineering, то будем рады — сейчас у нас открыты вакансии iOS-разработчиков (а ещё для Android, frontend, SRE и других).
Чем так хороша gOS — «Хорошая операционная система»?
Вообще, информации о gOS на сайте проекта http://thinkgos.com (зеркало — http://www.g-os.org ) крайне мало. Подборка рекламных агиток, снимков и реплик о том, как это хорошо, красиво и удобно. В некоторых обзорах, что уже появились в Сети, gOS за его интерфейс и использование сервисов от Google напрямую связывают с Google. И называют не иначе как неофициальной Google OS. Нужно сказать, что в Интернет уже давно ходили слухи о том, что Гугл использует серверы и рабочие станции со своей версией ОС. Но делиться своими разработками они не спешат. Спешу вас сразу же разочаровать: gOS не имеет никакого отношения к этому сервису. В самом низу каждой страницы сайта красуется надпись: «gOS is not affiliated with Google or their partners». Это хотя и сильно расстраивает, но ничего не меняет. Cкриншоты новой ОС просто притягивают, а Google и так в нем будет предостаточно. В пункте Company на сайте проекта находим расшифровку аббревиатуры: «Good Operating System», хотя в первое время говорилось о GreenOS. Кстати, в Сети проскочило сообщение, что в Google уже познакомились с этой ОС и ничего не имеют против включения своего тулбара и прочих компонентов.
Что is gOS
Good так good. Качаем, а пока бежит индикатор — пару слов о самой gOS.
Дистрибутив возник словно ниоткуда. Первой зарегистрированной на сайте http://Distrowatch.com версией является 1.0.1 от 5 ноября прошлого года. Хотя уже сейчас доступна и 2.0.0-beta1. Получить gOS с официального сайта можно только через сеть Bittorrent. Если вас это не устраивает, не страшно: сейчас уже появились и FTP-зеркала. Альтернативным вариантом предлагается образ для виртуальной машины. Поддерживается только i386-платформа, ни о каких системных требованиях на сайте не сказано. В будущем ожидается появление DVD и CD в варианте Standart — что это будет, пока неизвестно. Прибыль проект получает с продажи персональных компьютеров с предустановленной ОС и комплектов для их сборки.
Разработчики утверждают, что они хотят создать простую, дружественную и красивую систему, в которой может без проблем работать обычный пользователь. В качестве рабочей среды использован оконный менеджер Enlightenment E17 (http://www.enlightenment.org), непопулярный сегодня, но невероятно красивый и интересный, хотя за несколько лет своего развития дошел только до версии 0.5.2. И главное, очень легкий — поэтому по части системных требований дистрибутив чуть скромнее, чем родственный ему KUbuntu. На компьютере с 633-Мб целероном, 256 Мб ОЗУ и видеокартой ATI 7000 gOS работает довольно быстро. Вместо привычных нам настольных приложений использованы все популярные сервисы Google, позволяющие обмениваться почтой и сообщениями, просматривать видео и слушать музыку, создавать и редактировать документы.
Распространяется gOS по лицензии Creative Common Attribution Noncommertial Share Alike 3.0 Unported license (http://creativecommons.org/licenses/by-nc-sa/3.0/us), которая разрешает свободно использовать, распространять, копировать и изменять дистрибутив под свои нужды, но при условии соблюдения трех моментов: Attribution, Noncommercial и Share Alike, то есть соблюдения авторства, некоммерческого использования и распространения своего продукта, построенного на основе gOS, под этой же лицензией. Впрочем, при получении разрешения автора условия лицензии могут быть пересмотрены персонально.
Знакомимся поближе
И так образ докачался, записываем его на болванку или подключаем к виртуальной машине. Запускаем. Оформление дистрибутива выполнено в едином и, нужно сказать, весьма приятном для глаз стиле. Загрузочное меню в принципе не отличается от убунтовского.
По умолчанию предлагается загрузить или установить gOS. Есть пункт OEM install, подписанный как «for manufactured» (для сборщиков). Назначение меню, вызываемых по нажатии F1–F6, все то же. При выборе русского или украинского языка по F2 названия меню частично локализовались. Как и в (K)Ubuntu, доступен текстовый вариант загрузки. Для этого нужно нажать Esc и подтвердить выход из графического режима. Он может быть полезен, если видеокарта не хочет определяться при загрузке, а установить систему очень хочется. Правда, в этом случае для дальнейших действий понадобятся некоторые знания.
Но я немножко отвлекся. Выбираем параметры и загружаемся. На слабом компьютере система загружается несколько быстрее, чем родственные Ubuntu/KUbuntu. Буквально через несколько секунд перед вами появится зеленоватый Рабочий стол, выполненный в стиле Mac.
Сверху расположены ярлыки найденных разделов жесткого диска, внизу список ярлыков для доступа к сервисам Google — GMail, Google News, Google Maps, Google Calendar и YouTube. Здесь есть все, что ассоциируется с Google и его сервисами; щелчок мышкой по любому значку вызывает web-браузер Firefox со ссылкой на нужный сервис. Кроме того, есть и Skype, Facebook.com, ссылка на Википедию, meebo.com (web-сервис, позволяющий получить доступ к AIM, ICQ, GTalk, Yahoo!, MSN, любым Jabber-серверам, в т.ч. к собственному) и некоторые другие.
При наведении мышки на ярлык он начинает нетерпеливо пульсировать, ожидая нажатия. При небольшом разрешении экрана все ярлыки не помещаются в ряд, но кнопки прокрутки не предусмотрено. Просто ведем мышкой вдоль ряда, когда подводим к левому или правому краю, список начинает самостоятельно перемещаться. Честно говоря, раньше был знаком с Enlightenment, но сейчас даже не узнал старого знакомого. На Рабочем столе помещены панели, называемые shelves, которые содержат ярлыки, или gadgets. Изменить внешний вид и расположение любой панели можно, вызвав Shelf Configuration, в котором также изменяется состав gadgets, размер и некоторые другие характеристики.
Юзабилити
После запуска сразу же бросается в глаза большая панель поиска Google. Практически все действия производятся при помощи мышки. Щелчок левой кнопкой запускает приложение или вызывает меню системы, правой вызывается контекстное меню при щелчке на приложении или список сервисов Google, если щелкнуть на Рабочем столе. Новичок, думаю, разберется без проблем. Пользователю со стажем некоторое время придется побороться с привычками. Кнопки сворачивания окна расположены слева, причем порядок их тоже изменен. Так, нажатие на крайнюю левую приведет к закрытию окна, а не сворачиванию. Чтобы свернуть окно, нужно нажимать на среднюю кнопку, правая разворачивает его на весь экран.
Щелчок по ярлыку раздела жесткого диска привел к открытию окна, подписанного как favorites, под которым угадывается файловый менеджер Enlightenment — Fileman. Но раздел попросту не монтировался. Только подключенная флэшка монтировалась по щелчку и работала без проблем. Несколько спутало ситуацию размонтирование устройства. В меню нужного пункта нет, но когда я закрыл окно и обратился к терминалу, чтобы это сделать вручную, оказалось, что его в списке вывода mount нет. После закрытия окна устройство размонтируется автоматически (вспомните, как это делается в Windows).
В обзорах я встречал, что gOS не работает только с NTFS. На деле у меня были проблемы как с FAT, с которым Linux дружит уже давно, так и с родными ReiserFS и ext3. Почему, не знаю — не работало, и все. Хотя на другом компьютере проблем было меньше. Анализ вывода dmesg показал, что в gOS используется libsata, поэтому при ручном монтировании следует искать /dev/sdX-диски.
Еще одно из явных неудобств: вместо /dev/hda#, понятных линуксоиду, или букв разделов, привычных пользователю Windows, в gOS решили почему-то, что в ярлык нужно выводить производителя и размер диска, а название точки монтирования выбирается неким цифрово-буквенным кодом. Определить, какой именно это раздел, можно лишь зайдя внутрь и просмотрев его содержимое. Вероятно, простой пользователь это и не заметит и подумает, что так и нужно, но человек со стажем явно сочтет это недостатком.
Кнопка My gPC является неким аналогом ярлыку Мой Компьютер в Windows: здесь собраны ярлыки на дисковые разделы, корневой и домашний каталог пользователя и рабочий стол. Названия подкаталогов в /home/ubuntu устанавливаются в зависимости от выбранной локализации, то есть Documents — для английской, Документы — для русской. Самое интересное, что нигде не видно значка второго DVD-привода, хотя внешний осмотр показывает, что в компьютере он все-таки есть, да и присутствует в выводе dmesg.
Сетевые интерфейсы автоматически настраиваются при помощи DHCP и Avahi и выводятся в отдельной панели. Адаптер Bluetooth также был подхвачен системой, но, в отличие от KUbuntu, здесь приходится все дальнейшие процедуры настройки выполнять из консоли. В качестве эмулятора терминала в gOS используется UXTerm, заботливо спрятанный в меню System Tools. Можно использовать и консоль, переходя по Ctrl+Alt+F1.
Для интереса попытался вызвать в консоли свой любимый файловый менеджер Midnight Commander:
The program ‘mc’ is currently not installed. You can install it by typing:
sudo apt-get install mc
-bash: mc: command not found
Система сама подсказывает, что нужно сделать для установки. Попытаемся ее обмануть.
-bash: nomc: command not found
То есть, не просто команда подставляется в вывод, а действительно производится поиск нужной программы.
Вкладка Плагины в web-браузере Firefox пуста. Учитывая направленность на Интернет, можно было бы установить несколько плагинов: Flash и прочие. Кроме того, в составе gOS есть видеопроигрыватель Xine, Rhythmbox, программа записи дисков GnomeBaker, OpenOffice.org, GIMP, Mozilla Thunderbird, Pidgin, Gnome Partition Editor, несколько игр и другие. Все это можно найти в меню, вызываемом по щелчку на зеленом листике мяты — аналог меню K в KDE. Причем, в отличие от родительского дистрибутива, «gOS из коробки» проигрывает MP3 и AVI, MPEG-файлы. Установки дополнительных кодеков не потребуется. В списке Rhythmbox есть несколько онлайн-станций. Хотя зашифрованные DVD не воспроизводятся и проприетарных драйверов для видеокарт тоже нет. Но все, что нужно, очень просто установить.
Установка и удаление приложений производится одним щелчком в Add/Remove Application, вместо которого можно вызвать и привычный Synaptic или GDebi. Доступны и Update Manager, и Notifier из Ubuntu. Обновление системы выполняется нажатием одной кнопки в меню. Управление репозитарием, кроме Synaptic, возложено еще на одну утилиту, названную Software Sources. Кстати, пакеты берутся не иначе как с http://packages.googlepc.com/gos. На Рабочем столе расположена кнопка установки дистрибутива на жесткий диск. Устанавливать я не стал, но, судя по пунктам, инсталлятор взят с Ubuntu.
Осталось добавить, что сердцем системы является ядро 2.6.22 с поддержкой мультипроцессорных систем, в котором по умолчанию активирован I/O Sheduler CFQ.
Несмотря на недостатки, которые не позволяют пока рекомендовать его в качестве повседневной системы, gOS интересен сам по себе. Доступность Интернета и наличие всех необходимых сервисов позволяет вместо настольных приложений, за которые нужно платить, использовать доступные с любого места планеты он-лайн сервисы. Об этом сегодня много говорят. Поэтому gOS — это некая первая ласточка, показывающая то, что нас, возможно, ждет в будущем. И если так дальше пойдет, в скором времени вместо Microsoft будут говорить о Google, вместо Билла Гейтса вспоминать Лэрри Пейджа и Сергея Брина.
Вероятно, после доводки gOS и полной победы Google этот дистрибутив будет гармонично смотреться, например, в интернет-кафе. Выглядит все красиво, вероятность атаки на Linux сегодня на несколько порядков ниже, чем для Windows. Использовать его можно совершенно свободно. Посмотрим.
5 причин сыграть в Hogwarts Legacy и 5 причин этого не делать

Hogwarts Legacy — это экшен от третьего лица с ролевыми элементами. Действие разворачивается в конце XIX века в школе чародейства и волшебства Хогвартс. Игроку также предстоит посетить и другие места в процессе прохождения основной сюжетной линии.
В качестве главного героя игры выступает ученик или ученица пятого курса школы. Персонаж способен применять древнюю магию, которая недоступна для большинства волшебников во вселенной «Гарри Поттера». Эта особенность становится ключом к началу сюжета и ядром общей истории игры.
Почему все без ума от Hogwarts Legacy
1. Знакомая вселенная
Hogwarts Legacy разрабатывали поклонники франшизы, превратив её в фансервис с огромным количеством знакомых элементов. Игра затягивает людей, которым нравится эта фэнтезийная вселенная. В виртуальном Хогвартсе можно провести десятки часов, изучая окружение и выполняя различные задания.
По школе интересно ходить, здесь можно знакомиться с учениками, наблюдать за происходящим вокруг и впитывать атмосферу волшебного места, куда многие хотели бы отправиться с детства. Hogwarts Legacy частично исполняет роль виртуального музея для тех, кто так и не дождался заветного письма с приглашением.
Территория замка и его ближайшие окрестности детально проработаны, а все знаковые места бережно перенесены в игру. Здесь есть узнаваемый внутренний двор, большой зал, библиотека, больничное крыло, кабинеты, классы и много других локаций. Также игрок обязательно побывает в банке «Гринготтс», деревне Хогсмид и Запретном лесу.
На раскрытие всех секретов уйдёт много времени, ведь в Хогвартсе большое количество потайных ходов, ведущих в подземелья с побочными заданиями.
2. Отсылки к книгам и фильмам
Разработчики перенесли основные детали из книг и фильмов, практически не добавляя ничего от себя. При этом Hogwarts Legacy не копирует решения из кинематографической серии. Здесь другой временной период, поэтому логично было предположить, что многие места тогда выглядели немного иначе.
В игре почти нет тех самых персонажей из франшизы, но без знакомых фамилий, конечно, не обошлись. Например, Уизли и Блэк здесь фигурируют в качестве важных лиц второго плана.
Фильмы о Гарри Поттере запомнились не только визуальной частью, но и музыкой. Саундтрек в Hogwarts Legacy создала команда композиторов, ориентируясь на работы Джона Уильямса. Авторы выбрали похожие аранжировки, интерполировали знакомые мотивы и довольно успешно справились с формированием сказочной атмосферы. Но приступы детского восторга наверняка будут в моменты, когда раздаётся та самая Hedwig’s Theme Уильямса. Например, во время пролёта совы над «Хогвартс‑экспрессом».
3. Возможность создать своего персонажа и развивать его
На старте игры необходимо выбрать внешность главного героя. Можно ограничиться одним из заранее подготовленных шаблонов или подойти к кастомизации более внимательно. Хотя досконально отредактировать персонажа как в The Sims или The Elder Scrolls здесь не получится.
В процессе прохождения открывается большое количество разной одежды и аксессуаров. Это косметические элементы, но в стиле главного персонажа проявляется вкус игрока. Кроме того, настраиваемый внешний вид помогает в отыгрыше ролевой составляющей.
Система прокачки в игре не самая сложная, но достаточно интересно развивать «таланты» своего волшебника. Например, можно углубиться в запретную магию, встать на опасный путь с непростительными заклятиями и превратиться в мастера Тёмных искусств. Но и на стороне света отыгрывать роль честного гриффиндорца тоже увлекательно. По крайней мере, во время первого прохождения.
Выбор игрока в той или иной степени влияет на игровой процесс и сюжет. Новые заклинания открываются во время выполнения основных и дополнительных заданий, а большую часть непростительной магии можно вообще пропустить.
4. Удачные игровые механики
Боевая система в игре реализована неплохо. Сражения не превращаются в обмен одними заклятиями «Остолбеней!», для разных видов врагов нужно искать свой подход к атакам и защите.
Бои становятся интереснее примерно с середины игры. Персонаж может уклоняться и парировать атаки, отвечая при этом впечатляющими комбинациями заклинаний. Можно притягивать противников, откидывать, взрывать, поджигать и даже совершать над ними «непростительные действия». При этом зона поражения увеличивается с добавлением перков — получится разбираться сразу с несколькими врагами одновременно.
Собирать большое количество лута можно, но геймдизайнеры спланировали механику так, чтобы игрокам не пришлось бесконечно заниматься скучными делами ради прокачки. В Hogwarts Legacy есть несколько десятков заклинаний, от которых действительно есть польза. Награды за выполненные задания почти всегда ценны — нет ощущения, что время было потрачено впустую.
Перемещаться по миру игры можно на метле, а примерно на середине прохождения появляется возможность пересесть на гиппогрифа и фестрала. Приятно осматривать окрестности с высоты птичьего полёта. Жаль, что квиддич разработчики решили пока вырезать.
Ещё одна приятная особенность игры — возможность обустраивать своё пространство в Выручай‑комнате. Там можно возводить постройки, заниматься ремёслами и посадкой растений, разводить милых фантастических зверей.
Также в Hogwarts Legacy получится углубиться в зельеварение и даже поучаствовать в дуэльном турнире на звание чемпиона среди однокурсников. А для медитативных прогулок подойдёт Хогсмид.
5. Сюжет с дополнительными квестами
История в Hogwarts Legacy достаточно простая, в сюжете нет неожиданных поворотов и глубоких философских идей. Диалоги и актёрская игра здесь также не впечатляют. Как и в других играх с открытым миром, основная линия отходит на второй план, а значительную часть времени занимают дополнительные задания. Над частью этих квестов авторы хорошо потрудились.
Игрок знакомится с тремя учениками, у каждого из которых есть своя предыстория и потребность в помощи. В процессе раскрытия этих сюжетных ответвлений вы узнаёте о судьбах своих компаньонов и проникаетесь их личными трагедиями. Как уже упоминали выше, в игре можно выбрать и роль тёмного мага. Во время выполнения второстепенных квестов получится отыгрывать неприятную сторону для окружающих.
Hogwarts Legacy хорошо справляется со своей задачей — погрузить игрока в фэнтезийный мир и развлекать несколько десятков часов без гринда. При этом побочных заданий здесь больше сотни.
Почему Hogwarts Legacy может разочаровать
1. Скучный игровой процесс
Механика боевой системы в игре в полной мере начинает работать только со второй половины истории. На первых этапах стычки с врагами могут и утомить однотипностью действий. Но основную проблему составляет не процесс сражения, а часто повторяющиеся противники. Приходится долбить знакомых тёмных магов, гоблинов и пауков. Периодически на вечеринку заглядывают тролли, анимаги и заколдованные гигантские доспехи.
Вообще, в Hogwarts Legacy разработчики собрали довольно много разновидностей врагов, но на уровнях они задействуются таким образом, что создаётся впечатление атаки клонов.
Замечательные дополнительные задания с второстепенными персонажами разбавлены большим количеством активностей вроде «сходи туда и принеси это» или «разыщи и уничтожь». В сумме с повторяющимися персонажами такой подход разочаровывает. Затягивание сюжета, конечно, не уникальный случай, но относится скорее к негативным моментам игры.
Кроме того, открытый мир за пределами Хогвартса не всех удовлетворит качеством своей проработки. Здесь есть протяжённые области с одинаковыми элементами, лишённые индивидуальности. При этом такие пространства визуально сливаются в единую массу, возвращаться туда вряд ли захочется. Возможно, разработчики и создатели модификаций постепенно решат эту проблему.
2. Раздражающие особенности геймплея
В игре есть несколько привычных элементов из игр с открытым миром. Постоянное использование детективного зрения в замке выглядит странно и не дополняет атмосферу. Над системой стелса для скрытного прохождения разработчики долго не размышляли — и результат соответствующий.
Система снаряжения с ограниченным количеством слотов неорганична для мира волшебников. Например, одновременно активными могут быть только несколько заклинаний. И к концу сюжетной кампании придётся разбираться с большим количеством магии. Переключать все эти атаки во время боя не очень удобно — нужно привыкать.
Также иногда кастомизация персонажа приводит к нелепым моментам. Главный герой в катсценах может выглядеть так, будто только вернулся с маскарада, но при этом все вокруг одеты в школьную форму. Вряд ли такое яркое проявление креативности и безвкусия прошло бы в Хогвартсе.
3. Вторичность
Вышеупомянутая боевая система собрана из знакомых механик серий игр Batman Arkham и Middle‑Earth. Атаки, уклонения и контратаки в таком виде встречались в огромном количестве проектов. Если вы не поклонник именно вселенной «Гарри Поттера», то игровой процесс может вам быстро наскучить. Вам просто не захочется дойти до момента, когда в вашем распоряжении будет большое количество комбинаций из заклинаний.
В Hogwarts Legacy нет своих геймплейных находок. Основной интерес здесь заключается в элементах знаменитой вселенной. Лагеря с врагами, деревья навыков, дополнительные задания и ремёсла передают привет из Assassin’s Creed.
Заклинания здесь также связаны с идеями из других игр. Например, Revelio — это аналог «чутья» или детективного зрения для сканирования окружения в поисках интересных объектов. А Alohomora здесь превратили в мини‑игру, напоминающую взлом дверей отмычкой. Кажется, в первоисточнике магия работает не так.
4. Посредственная графика
С точки зрения дизайна разработчиков игры можно похвалить. На локациях, которым действительно уделили много внимания, интересно находиться. Но именно графика вызывает смешанные чувства.
Hogwarts Legacy использует движок Unreal Engine 4, из него можно выжать много красот до сих пор. Но, скорее всего, авторам не удалось оптимизировать игру с открытым миром при высокой детализации.
Проект мультиплатформенный, к тому же выйдет ещё и на предыдущем поколении консолей. Поэтому никакого прорыва от Hogwarts Legacy ожидать не стоит. Ситуацию частично спасает красивое освещение, но проработка моделей, анимация и уровень текстур отсылают нас к играм прошлого.
5. Технические проблемы
На консолях периодически случаются зависания и снижение частоты кадров, в ПК‑версии ситуация с этим похуже. Кроме проблем с производительностью, в Hogwarts Legacy встречаются баги и глитчи. Персонаж может провалиться сквозь карту, кто‑то из NPC застрянет в стене или на экране возникнут странные объекты, которым там точно не место. Во время разговора ваш собеседник вдруг осмелится встать и неуважительно уйти — придётся общаться с пустым местом.
Все эти ошибки не разрушают игровой процесс катастрофически, не влияют настолько, чтобы игру хотелось бросить и никогда к ней не возвращаться. Но просто раздражают. Правда, пока разработчики не забрасывают проект и выпускают патчи с исправлениями.