Рефакторинг неприятных устаревших систем с помощью АОП или других автоматизированных средств?

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

В то время я пытался использовать какой-то механизм абстракции, чтобы позволить мне перехватывать все обращения к статическому ресурсу и перенаправлять их на компонент, который правильно управлял бы данными состояния. Проблема заключалась в том, что нужно было перенаправить около 1000 сложных ссылок (и у меня не было много времени, чтобы сделать это). Ручное кодирование (даже с помощью R#) оказалось слишком трудоемким — мы выбросили кодовую базу и правильно переписал. на переписывание ушло больше года.

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

Кто-нибудь использовал PostSharp или аналогичные системы для реабилитации патологических устаревших систем? Насколько успешными были проекты? Вы нашли после факта, что усилия того стоили? Вы бы сделали это снова?

ОБНОВЛЕНИЕ: см. этот пост в блоге для дальнейшего обсуждения.


person Andrew Matthews    schedule 09.10.2009    source источник
comment
Я мог бы сделать это с AspectJ, но PostSharp, кажется, ограничен, чтобы иметь возможность делать с ним слишком много, IMO.   -  person James Black    schedule 09.10.2009
comment
@aabs: Renewtek в Мельбурне использует DMS в программном обеспечении для мейнфреймов.   -  person Ira Baxter    schedule 09.10.2009
comment
Привет, Ира, как я объяснил, мы обнаружили, что в этом случае было проще отказаться от старого кода, поэтому мне сейчас не нужны никакие услуги. Меня больше интересует идея о том, что переписчик IL или декомпилятор и перекомпилятор программ (которые, кстати, PostSharp может сделать) способны решать более фундаментальные проблемы архитектуры. Не просто идиоматические преобразования. похоже, что DMS более чем способен. Способен ли АОП, и если нет, то почему?   -  person Andrew Matthews    schedule 09.10.2009
comment
Перечитывая свой вопрос, я понимаю, что он может быть неясным: я хочу иметь возможность использовать безумно разработанный, тесно связанный P.O.S. и применять методы АОП, SOA или преобразования программы, чтобы, по крайней мере, позволить мне решить проблемы связи, зависимости от местоположения, изменчивости, недостаточной абстракции и т. д. Я хочу задним числом перепроектировать приложение без переписывания кода. Затем они могут почистить код на досуге, сохраняя при этом возможность масштабирования и т. д. О многом нужно спросить?   -  person Andrew Matthews    schedule 09.10.2009
comment
@aabs: не предлагал услуги (вы уже сказали, что выбросили их :)), просто эти инструменты используются шире, чем могут ожидать читатели, и указывают вам на локальное приложение. Можете ли вы произвольно провести рефакторинг? Вероятно, нет, потому что теоретически вы не можете рассуждать о машинах Тьюринга. Однако наш опыт показывает, что системы, которые не являются «мозговыми мертвецами», можно спасти, а бизнес-правила в существующем коде не нужно заново открывать, как это происходит при ручном переписывании. Практически невозможно заменить работающую систему из-за ее скрытых знаний. Мораль: не пропадай.   -  person Ira Baxter    schedule 09.10.2009


Ответы (1)


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

Я не могу говорить за ваше веб-приложение, но у меня есть два конкретных примера, где я успешно применил это.

1) Boeing необходимо было радикально реструктурировать до 6000 компонентов, каждый из которых закодирован как набор взаимодействующих классов C++ (часто в сумме 3-10 тыс. SLOC) от устаревшей распределенной архитектуры к архитектуре, в которой каждый взаимодействующий элемент стал функцией в аспекте CORBA. Используя DMS Software Reengineering Toolkit моей компании, систему преобразования программ, способную точно преобразовать C++ мы реализовали инструмент для внесения этих изменений. Инструмент изменил в среднем одну строку из трех, но мог преобразовать компонент примерно за 5 минут. В результате преобразование было выполнено на 98% и потребовало некоторых скромных доработок, но было намного эффективнее, чем расчетный 1 человеко-месяц на ручную модификацию каждого компонента. Это лучше всего рассматривать как масштабную перестройку структуры программного обеспечения, реализованную с помощью инструментов. Вы можете прочитать об этом в технической статье:

Акерс, Р., Бакстер, И., Мелих, М., Эллис, Б., Люке, К., Практический пример: Реинжиниринг моделей компонентов C++ с помощью автоматического преобразования программ, информационных и программных технологий 49(3):275- 291 2007 г. Доступно у издателя.

2) У ВВС США есть устаревшие летающие системы. Одним из таких является бомбардировщик В-2, в котором полно лучших в мире микропроцессоров 1975 года. Код, работающий в них, является / был JOVIAL, излюбленным языком ВВС до того, как Ада стала излюбленным языком (до того, как все вымерли, и теперь военные используют только ужасные языки для разработки программного обеспечения). Код запускает самолет. OTOH, им нужно было выйти из JOVIAL, потому что поддержка микропроцессоров (например, физическая доступность процессоров, средств разработки и даже людей, желающих изучать JOVIAL) быстро уменьшалась. Мы создали им транслятор JOVIAL-to-C, используя ту же DMS, и выполнили 100% преобразование, даже не имея возможности увидеть исходный код (черная программа...). См. Конверсия бомбардировщика B-2 для получения дополнительной информации. Пока мы говорим, B-2 модернизируют с помощью переделанного программного обеспечения.

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

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

person Ira Baxter    schedule 09.10.2009
comment
Полностью согласен с этим. АОП здесь не поможет, он решает другие (и гораздо более простые и понятные) задачи. - person Alex Yakunin; 09.10.2009
comment
Эээ... Я имею в виду, что АОП здесь тоже не поможет. Но автоматический рефакторинг программного обеспечения — это тоже мечта. Межъязыковая конвертация — это нормально, но я знаю, что качество такой конвертации пока далеко от хорошего. Особенно, если вы конвертируете в язык, предлагающий абстракции более высокого уровня (преобразование в языки низкого уровня довольно просто - обычно это называется компиляцией;)). Хорошим примером является преобразование Java в C#: преобразованная программа не будет использовать делегаты, события, лямбда-выражения, LINQ и так далее. Но да, это сработает. - person Alex Yakunin; 09.10.2009
comment
Наивные, однозначные переводчики производят посредственные переводы на том же уровне абстракции. Однако можно проанализировать контекст кода и найти лучшие сопоставления с целью; это не перевод один в один. Ни то, ни другое не делает действительно хороший компилятор; он генерирует код для этого действия в контексте окружающего кода и часто может превзойти код людей, которые действительно знакомы с целевой архитектурой. Точно так же можно кодировать преобразования, учитывающие особые случаи и контекст. Это проще, если заранее решить сделать это для некоторых частных случаев. - person Ira Baxter; 09.10.2009
comment
В качестве интересного примера: в одном случае я работал с программным обеспечением, которое, по-видимому, было необходимо для отправки сообщения, получения ответа и отправки другого сообщения. Проверив, что полученный ответ не контролировал, было ли отправлено второе сообщение, я смог закодировать преобразования, которые создают один пакет, содержащий оба сообщения, с соответствующим преобразованием на принимающей стороне для распаковки. Полученный код явно имеет гораздо лучшую производительность. Специальные операции на целевых языках требуют некоторого предварительного планирования для использования, но они находятся в пределах возможностей этих инструментов. - person Ira Baxter; 09.10.2009
comment
@Alex: ... автоматический рефакторинг - это тоже мечта ... Прочтите статью. - person Ira Baxter; 09.10.2009
comment
Ух ты. спасибо за такие подробные и содержательные ответы. PostSharp, помимо Laos, части AOP, также является переписчиком IL, и именно в этом качестве я задавался вопросом, может ли он или что-то подобное исправить плохую архитектуру. Меня меньше беспокоит уход от устаревших языков и платформ... - person Andrew Matthews; 09.10.2009
comment
Проверьте ссылки. DMS не переписывает IL; скорее это система преобразования исходного кода, которая использует внутренние структуры данных компилятора для чрезвычайно точного моделирования исходного кода. (Переписывание IL не может вернуть вам исходный код, не говоря уже об исходных комментариях :) - person Ira Baxter; 09.10.2009
comment
Я знал о DMS, но это просто потрясающе! - person akuhn; 15.12.2009