0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Код без тестов — легаси

Код без тестов — легаси

Если вы работаете в 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». Показалось логичным рассказать о том, что такое легаси, а потом — как с ним работать.

Патч 7.28 Mistwoods

Описание у патча гигантское. Масса изменений на опубликованном рулоне пугает размером, смущает и вызывает недоумение. Что вообще произошло в Dota 2? Если рассуждать здраво, то изменений не так много.

  • Введен новый герой-белка, похожий на смесь персонажа-белки из Heroes of Newerth, Sniper и Windranger.
  • Добавлены новые предметы, удалены некоторые старые, изменен баланс ВСЕХ героев по лекалам старых патчей, выпущено давно требуемое игроками улучшение Blink Dagger.
  • Все герои получили возможность получить новую способность или улучшить имеющуюся с помощью расходуемого осколка Аганима.
  • Слегка исправлен интерфейс, а игра отныне начинается в ночное время.
  • Outworld Devourer выплюнул кашу изо рта и стал Outworld Destroyer.
Статья в тему:  Что нужно собирать тролю в доте

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

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

  • Блог
  • Facebook
  • Твиттер
  • LinkedIn
  • Instagram

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.9.28.40331

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как работать с Legacy кодом. 8 принципов-советов для упрощения жизни

На бумаге и в теории просто “покумекать” над тем какой код плохой, и как это непрактично. Но на деле часто разработчики сталкиваются с необходимостью (необходимостью!) поддерживать и развивать код совершенно разного качества.

На таком фоне имеет смысл заручиться некоторыми принципами-правилами, которые упростят работу с Legacy кодом и сделают жизнь рядовому разработчику проще:

Совет #1. Тестируйте код

Один из способов понять код – создать characterization tests и модульные тесты. Вы также можете запустить статический анализатор над своим кодом для выявления потенциальных проблем.

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

Совет #2. Пересматривайте документацию

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

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

Статья в тему:  Что такое пабы в доте

Совет #3. Не переписывайте код без реальной надобности

Переписывание устаревшей кодовой базы может быть заманчивым. Но обычно это ошибка.

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

Совет #4. Пробуйте рефакторить код

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

Рефакторинг – это процесс изменения структуры кода – без изменения его функциональности.

Это делает код чище и облегчает понимание. Это также устраняет потенциальные ошибки. При рефакторинге унаследованного кода лучше всего:

  • Рефакторинг кода, в котором уже есть модульные тесты – чтобы вы знали, что к чему;
  • Начните код из “самой ямы”, самое узкое звено — его будет легче всего рефакторить (Start with the deepest point of your code — it will be easiest to refactor) ;
  • Тесты после рефакторинга — чтобы знать наверняка, что ничего не поломано;
  • Имейте запас прочности, готовность к непредвиденным ситуациям. Действуйте по принципам CI — чтобы вы могли условно безболезненно откатить build.

Совет #5. Вносите правки последовательно

Не делайте слишком много изменений одновременно. Плохо проводить рефакторинг параллельно с функциональными изменениями.

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

Совет #6. Сотрудничайте с другими разработчиками

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

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

Статья в тему:  Почему в доту играют дебилы

Совет #7. Пишите новый код чисто

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

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

Совет #8. Не стойте на месте

Работа с устаревшей кодовой базой становится легче со временем. Младший разработчик может не понимать, почему кодовая база не подверглась рефакторингу (и может быть заинтересован в ее рефакторинге). Но “твердый” разработчик будет знать, когда лучше все оставить как есть.

Разобравшись детально в Codebase, вы сможете улучшить ее.

Для заминки добавим две книги рекомендации по работе в Legacy кодом: “Working Effectively With Legacy Code” by Michael C. Feathers и “Refactoring: Improving the Design of Existing Code” by Martin Fowler.

Хроники Legacy

На сегодняшний день известно всего несколько подобных игр.

Risk Legacy (2011) была первой. Эта настолка представила концепцию Legacy различными коробочками различных размеров с секретным наполнением, которое добавлялось в игру с течением времени, от партии к партии — и даже была супер-секретная коробочка, которую игроки не должны были никогда открывать (но каждый сделал это). Одной из интереснейших вещей в Risk Legacy было то, что различные коробки с игрой на самом деле имели разное содержание. Давио описывает Risk Legacy, как «простенькую «песочницу», и признаёт, что это была «безумная мешанина идей».

Pandemic Legacy: Season One (2015) стала игрой, которая по-настоящему обратила внимание зрителей на концепт Legacy. Большим шагом, очевидно, был переход от конкурентной игры к кооперативной; Давио (и соавтор Мэтт Ликок) смогли развить идею посредством системы «финансирования», которая делала все игровые аспекты более сложными в будущих партиях, если игроки побеждали, и более простыми, когда они проигрывали, предотвратив таким образом эффект «снежного кома» по ходу кампании. Season One также ввела концепцию игроков, решающих, какие улучшения им нужно покупать от партии к партии. Наконец, игроки просто получали гораздо более сильный нарратив, чем в Risk Legacy. Базовая игровая система также является наиболее элегантной и отполированной из всех Legacy-игр. Как конечный результат — топ по продажам и топ в рейтинге BGG.

Статья в тему:  Игра кто хочет стать миллионером играть онлайн бесплатно со звуком

SeaFall (2016) наименее известная из четырёх Legacy-игр Давио, несмотря на тот факт, что он потратил более трёх лет на её разработку, поскольку создал совершенно новую игровую систему с нуля (вместо того, чтобы адаптировать классику под Legacy-концепт). Как ни странно, после всей этой огромной работы, Давио признал, что для развития идеи игре «нужен ещё один виток разработки». Базовая игра SeaFall родилась из осознания автором того, что в Risk Legacy «люди любят открывать всякие штуки и находит вещи». Так он создал игру, которая основывается на исследовании, вплоть до того, что игра начинается с почти пустой карты мира. Это дополняется «Книгой Капитана», которая предлагает уникальные истории для каждого из различных исследуемых мест. Это интересная фишка для Legacy-игры, но плотно связана с довольно тяжёлой игровой системой, являющейся гибридом между америтрешем и евро. Поэтому игра не взлетела.

Pandemic Legacy: Season Two (2017) сочетает в себе мощный дизайн и нарратив из первого сезона с небольшим вкраплением разведки из SeaFall.

Ogre Magi

Уникальный герой поддержки, которого можно взять на разные роли (3, 4 и 5 позиция). Главная особенность Огра заключается в наличии ульты, которая с определенным шансом дает возможность применить скиллы или предметы сразу несколько раз подряд (от 2 до 4 применений). Благодаря этому герой способен вносить большое количество урона по целям. Также, к преимуществам Ogre Magi можно отнести:

  • Наличие сразу двух станов (второе оглушение появляется после покупки Аганима);
  • Сильные бафы (3 скилл значительно увеличивает скорость атаки, а баф с Аганим Шарда поглощает 85% урона от 3 атак и наносит магический урон);
  • Быстрый фарм (можно купить Мидас и за счет ульты кидать его сразу несколько раз подряд, получая до 640 золота с одного применения);
  • Выживаемость (Огр имеет большой запас ХП и за счет этого его крайне сложно убить).
Статья в тему:  Крутые онлайн игры которые не надо скачивать

К недостаткам Огра можно отнести то, что он бьет только вблизи и за него довольно сложно отогнать сильных вражеских хардлайнеров. В остальном же он является одним из лучших саппортов в Dota 2 и поэтому прямо сейчас занимает 5 место по количеству сыгранных матчей за месяц среди всех героев.

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

Также, отметим, что Lich может помогать своим тимейтам, вешая на них свой 2 скилл. Он сокращает весь получаемый урон на 70%, а также значительно замедляет всех ближайших противников. В итоге, за счет этого бафа Лич может делать фраги на линиях, усиливать своих тимейтов, а также спасать союзников от гангов.

Что такое «легаси»?

Возможно, если вы задавались этим вопросом, то встречали определение от Майкла Физерса. Майкл выпустил книгу «Working Effectively with Legacy Code» в 2004 году, но она до сих пор актуальна. Комикс это отлично иллюстрирует.

В своей книге Майкл пишет своё определение:

«Для меня легаси — это просто код без тестов».

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

Это хорошее определение: чаще всего тесты отсутствуют, так что это хорошее начало. Но это ещё не всё — есть нюансы.

Статья в тему:  Что такое крипы в доте

Код с тестами также может быть легаси. Если вы читаете тесты, но не можете понять, что должен делать код — они отстой. Плохие тесты только мешают: тестируемый код так же трудно отрефакторить, как если бы у него не было тестов, а может даже и сложнее!

Тестов может и не быть, но код всё ещё легко можно отрефакторить. Возможно, вы поддерживаете небольшую кодовую базу без тестов, которую легко понять и рефакторить. Хотя, по моему опыту, это аномалия. Эту кодовую базу можно было бы проверить, но отсутствие автоматизированных тестов всё же не позволяет квалифицировать его как легаси.

Перейдём к моему определению легаси.

Легаси — это ценный код, который вы боитесь менять.

Например, мы ищем первопричину ошибки или выясняете, куда вставить свою функцию. Мы хотим поменять код, но это трудно, потому что непонятно как не нарушить существующее поведение. Готово — у нас легаси!

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

Хорошие тесты помогают легко менять незнакомый код. А плохие тесты не помогают. Отсюда и определение Физерса.

С легаси помогает время. Парадоксально: обычно время превращает любой код в легаси, но чтобы его понять нам также помогает время. Если вы начали работать над легаси и это трудно — подождите. Да, большая часть кода ужасна, но вы привыкнете и лучше поймете его причуды и особенности.

Легаси не виновато в том, что оно такое. Большая часть кода ужасна, потому что это результат работы многих людей в течение долгого времени с противоречивыми требованиями и под давлением дедлайнов. Это Рецепт Устаревшего Кода™. Когда мало времени и недостаточно знаний — рождаются костыли (ну вы знаете). В конце концов, мы достигнем состояния, когда каждое движение приводит к ошибке, а реализация любой функции занимает целую вечность.

Статья в тему:  Как быстро прокачать корабль в world of warships

А теперь один из важнейших нюансов.

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

Легаси — это личная точка зрения. Устаревший код может стать проблемой для каждого разработчика команды. Какой-то код может показаться сложным, потому что мы его ещё не поняли, а какой-то понимаем, но всё равно чувствуем себя некомфортно, когда рефакторим. Но субъективное ощущение «легаси» зависит от нашего понимания кода, и наших чувств по поводу его изменения. Часто люди этого не понимают.

В итоге мы получаем, что легаси это:

который мы пытаемся понять, чтобы отрефакторить;

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

Новейшие варианты БИОС, известные как UEFI, поддерживают графический интерфейс для облегчения работы с микропрограммой. В этом интерфейсе активно используется мышь, в отличие от чисто клавиатурного управления в «обычном» BIOS. У протокола USB есть известные ограничения на низкоуровневый доступ, поэтому без активации параметра USB Legacy мыши, которые подключаются в этот разъём, работать в UEFI не будут. Это же касается и USB-клавиатур.

Похожим образом обстоят дела с флешками, однако есть один важный нюанс. Загрузочные накопители с Windows 8 и новее обычно работают и без включения Legacy-режима, тогда как носители с записанной Windows 7 или некоторыми дистрибутивами на ядре Линукс могут не распознаваться. Дело в том, что для записи «семёрки» (или более старых систем Microsoft) либо Linux-based дистрибутивов используется таблица разделов, которая современными UEFI не поддерживается «из коробки», отчего и требуется активировать параметр USB Legacy.

Статья в тему:  Кто выиграл турнир по доте 2 2016

Включение USB Legacy

Активировать в БИОСе режим работы USB для устаревших систем не представляет собой проблемы, и далее мы опишем процедуру для основных вариантов микропрограмм. Само собой разумеется, что первым делом понадобится войти в интерфейс BIOS – для этого потребуется сделать рестарт компьютера и нажать определённую клавишу в процессе загрузки машины.

Phoenix Award BIOS

    После появления интерфейса микропрограммы переходите ко вкладке «Advanced». Найдите опцию «USB Legacy Support» и перейдите к ней. Обычно доступно три режима: «Auto», «Enable» и «Disable». Первый вариант включён по умолчанию и обеспечивает максимальную совместимость, а названия двух оставшихся включают либо выключают Legacy-режим. Соответственно, для включения поддержки USB Legacy следует выбрать «Auto» либо «Enable».

  • Перейдите на вкладку «Exit», где воспользуйтесь пунктами сохранения изменений либо же просто нажмите на клавишу F10.
  • AMI BIOS

    1. Для включения Legacy-режима для мыши и/или клавиатуры перейдите на вкладку «Advanced».

    На этой закладке воспользуйтесь пунктом «USB Ports». Выберите опцию «All USB Devices», которую переключите в положение «Enabled».

  • Если поддержка Legacy нужна для USB-накопителей, воспользуйтесь вкладкой «Boot».

    Нужная опция называется «UEFI/BIOS Boot Mode» – ей надо задать значение «Legacy».
  • Обратите внимание! Режимы взаимоисключающие: UEFI-флешки не будут работать при активном Legacy!

    Другие варианты BIOS
    В менее распространённых вариантах интерфейсов микропрограммы следует ориентироваться на возможное местоположение описываемой опции – раздел «Advanced» либо «USB Ports».

    Также стоит иметь в виду, что в некоторых случаях поддержки USB Legacy в БИОСе настольного компьютера или ноутбука может попросту не быть – обычно подобное можно встретить в некоторых серверных решениях, OEM-платах или продуктах вендоров второго эшелона.

    Заключение

    Мы выяснили, что собой представляет USB Legacy Support, определили задачи этой опции и рассмотрели методы её включения в распространённых вариантах BIOS или UEFI.

    Статья в тему:  Как включить отображение фпс в доте 2

    Помимо этой статьи, на сайте еще 12280 инструкций.
    Добавьте сайт Lumpics.ru в закладки (CTRL+D) и мы точно еще пригодимся вам.

    Отблагодарите автора, поделитесь статьей в социальных сетях.

    UEFI или Legacy – что выбрать

    Иногда понятие Legacy применяют к устаревшей версии БИОСа, т.е. называют BIOS Legacy. На его замену пришла более современная модель – UEFI.

    UEFI – это технология, реализующая те же функции, что и BIOS Legacy. По сути UEFI – просто современная версия базовой системы ввода-вывода, которая лучше всего подходит для Windows 10 последних версий. В Windows 7 и 8 также можно использовать режим УЕФИ, но тут это не так принципиально, хотя во многом это зависит от установленных компонентов. Если кроме материнской платы все компоненты компьютера достаточно старые, то UEFI не принесет каких-либо заметных улучшений в работу ПК.

    UEFI работает с современными системами и не имеет многих ограничений БИОСа. Некоторые модели материнских плат позволяют изменять режим между UEFI и Legacy в пункте boot mode. Более детально об отличиях можно узнать в нашей статье.

    Так как UEFI изначально задумывалась как окончательная замена БИОСу со временем, советуется выбирать ее как наиболее перспективную. В отличие от традиционного BIOS-Legacy, UEFI обладает рядом преимуществ, к котором стоит отнести:

    1. Снятие ограничения на объем разделов и их число.
    2. Повышенная скорость.
    3. Улучшенная производительность.
    4. Усиленная безопасность.
    5. Поддержка загрузки при помощи сети.
    6. Совместимость с предыдущими версиями BIOS.
    7. Наличие менеджера загрузки.

    Каждый пользователь ПК сам выбирает для себя, что ему выбирать – повышенную функциональность устройств или возможность работы с ним до загрузки операционной системы. То же можно сказать и про UEFI и BIOS – первый более современен, второй более привычен. Делать выбор надо исходя из собственных предпочтений, но при этом руководствоваться вышеизложенной информацией.

    Ссылка на основную публикацию
    Статьи c упоминанием слов:
    Adblock
    detector