Подтвердить что ты не робот

Вы когда-либо делали полный переписывание большого С++-приложения на С#?

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

У нас есть большое приложение на С++ (около 250 000 строк кода), в котором используется основной интерфейс MFC и служба Windows в качестве основных компонентов. Мы думаем о переносе проекта на С#.

Причины, по которым мы думаем о переписывании, следующие:

  • Более быстрое время разработки
  • Использование WCF и других встроенных функций .NET
  • Более последовательная работа на различных системы
  • Простая поддержка 64-битных файлов.
  • Много хороших библиотек .NET и компоненты там

Кто-нибудь сделал переписать вот так? Было ли это успешным?


EDIT:

Сейчас проект почти 10 лет, и мы догадались, что добавление новых функций, которые мы хотим, будет писать значительные функциональные возможности, которые .NET уже имеет встроенный.

4b9b3361

Ответ 1

Считаете ли вы, что вместо того, чтобы писать с нуля, вы должны начать выделять GUI и back end layer, если это еще не так, тогда вы можете начать писать их части на С#.

250 000 строк не были написаны в одночасье, они содержат сотни тысяч человеко-лет усилий, поэтому никто, как правило, не предложил бы полностью переписать все с нуля.

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

Ответ 2

Его пытались раньше, а не только С++ = > С#, но VB6 = > VB.NET, С++ = > Java и любые другие старые = > новые, о которых вы можете думать. он никогда не работал. Я думаю, что, поскольку ppl не считает, что преобразование для того, что это на самом деле (полная переписывание), они склонны воспринимать это легко.

История миграции из С++ = > .NET должна проходить через CLI, тщательно определяя, что управляется и что остается неуправляемым, и s-l-o-w-l-y "исправление" по частям.

Ответ 3

Моя компания действительно сделала это. У нас была база кода С++ примерно такого размера, и все (программисты, менеджеры, клиенты) более или менее соглашались с тем, что это не лучшая часть программного обеспечения. Нам потребовались некоторые функции, которые было бы чрезвычайно сложно реализовать на старой базе кода, поэтому мы решили (после многих обсуждений и тестовых проектов) переписать его в .NET. Мы повторно использовали код, который был достаточно модульным, используя С++/CLI (около 20% из них - в основном критически важные для критического числа вещи, которые должны были быть написаны на С++ в любом случае), но остальное было переписано с нуля. Это заняло около двух человеко-лет, но это число действительно сильно зависит от типа приложения, размера вашей команды и от ваших программистов, конечно. Я бы счел все это успешным: мы смогли перепроектировать всю систему, чтобы новые возможности, которые были бы почти невозможны со старой базой кода. Мы также могли избежать проблем, которые мы часто испытывали в старом программном обеспечении, путем повторного проектирования вокруг них. Кроме того, новая система намного более гибкая и модульная в тех местах, где мы узнали, что необходима гибкость. (На самом деле я иногда удивляюсь, как легко новые функции могут быть включены в новую систему, хотя мы никогда не относились к ним, когда мы ее разрабатывали.)

Итак, в двух словах: для проекта среднего размера (100k-500kloc) переписать вариант, но вы должны определенно знать цену и риск вашего принятия. Я бы сделал это, только если старая кодовая база действительно некачественна и сопротивляется рефакторингу.

Также есть две ошибки, которые вы не должны делать:

  • Возьмите нового .NET-программиста и позвольте ему/ей сделать переписку - кто-то новый может помочь, но большую часть работы и особенно дизайн нужно сделать разработчикам, у которых достаточно опыта работы со старым кодом, поэтому они твердое понимание требований. В противном случае вы просто повторите свои старые ошибки (плюс несколько новых) на другом языке.
  • Пусть программист на С++ делает переписывание в качестве своего первого проекта С#. Это рецепт катастрофы, по понятным причинам. Когда вы решаете проект такого размера, вы должны иметь четкое представление о структуре, которую используете.

(Я думаю, что эти две ошибки могут привести к тому, что так много перезаписи терпят неудачу.)

Ответ 4

Expression Blend изначально было MFC-приложением. Текущая версия использует WPF для пользовательского интерфейса, но двигатель все еще является родным. Я видел замечательную беседу главного архитектора Генри Совизрала около года назад, где описал процесс миграции. Сделать агротехнику UI для двигателя, и вы сможете поддерживать любую новейшую технологию пользовательского интерфейса. Команда экспрессии в какой-то момент имела то, что он называл гидрагольной версией. Два интерфейсных интерфейса, работающие одновременно с одним базовым движком, таким образом, они могли видеть, где поведение непреднамеренно отклонилось от предыдущей версии. Поскольку пользовательский интерфейс был подписан на события и уведомления, изменения, сделанные в окне инструмента WPF, были отражены в старой панели инструментов MFC.

РЕДАКТИРОВАТЬ. Похоже, что некоторые powerpoints доступны здесь или как html здесь.

Ответ 5

Я прошел через проект, который сделал именно то, что вы описываете, с примерно одинаковой кодовой базой. Первоначально я был полностью на борту с переписыванием. Это закончилось тем, что заняло 3 года и почти превратилось в марш смерти. В общем, теперь я согласен гораздо больше с инкременталистами.

Однако, исходя из нашего опыта, я скажу, что такой переписывать (особенно если вы можете повторно использовать некоторый код бизнес-логики С++ в .NET) не так технически опасен, как может показаться. Однако, это может быть очень социально опасно!

Во-первых, вы должны убедиться, что все полностью понимают, что то, что вы начинаете первоначально, это "переписать" (или "переделать" ), а не обновление или "переосмысление". 1998 Psycho был римейком для выстрела за оригинал 1960 года. 2003 Battlestar Galactica была переизданием оригинала 1978 года. См. Разницу?

В нашем случае первоначальный план состоял в том, чтобы воссоздать существующий продукт в .NET. Это не было бы технически сложным, так как мы поняли оригинальную колодезь. Однако на практике стремление добавить, исправить и улучшить лишь несколько вещей оказалось непреодолимым и в конечном итоге прибавило 2-3 года к сроку.

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

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

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

Ответ 6

С++ не будет автоматически переводить на С# (не так, вы бы хотели его поддерживать, так или иначе), и вы говорите об использовании разных фреймворков.

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

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

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

Ответ 7

Я сделал что-то подобное. Частью моей работы является разработка и поддержка программного обеспечения, называемого ContractEdge. Первоначально он был разработан в Visual C++ 6 группой из Индии. Затем я взял на себя роль разработчика после того, как в основном это было сделано в 2004 году. Позже, когда Windows Vista стала доступной как бета-версия, я обнаружил, что ContractEdge зависнет в Vista. То же самое произошло в выпуске кандидата.

Поэтому я столкнулся с решением. Либо выискивайте проблему в десятках тысяч строк в основном незнакомого кода, либо воспользуйтесь возможностью переписать ее в .NET. Ну, я переписал его в VB.NET 2.0 примерно через 2 месяца. Я подошел к этому как к полной переписке, по сути, отказавшись от всего, и я просто сосредоточился на дублировании функциональности на другом языке. Как оказалось, мне нужно было написать примерно 1/10 числа строк кода, как в оригинале. Затем мы провели месячную бета-программу, чтобы устранить оставшиеся ошибки. Сразу после этого мы запустили его, и с тех пор он пользовался большим успехом, с меньшим количеством проблем, чем версия C++, которую он заменил.

В нашем конкретном сценарии я думаю, что перезапись прошла хорошо. Решение было принято проще, потому что никто из нашей команды не был так знаком с C++, как они были с .NET. Так что с этой точки зрения ремонтопригодность теперь намного проще. В настоящее время я считаю, что C++ является слишком низким уровнем языка для большинства программ для бизнеса. Вы действительно можете сделать намного больше в .NET с меньшим количеством кода. Я написал об этой теме в своем блоге.

Ответ 8

Всего переписать для перезаписи? Я бы не рекомендовал его.

Ответ 9

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

Ответ 10

Мы переместили большую С++ → С# при переходе на .NET. Это довольно сложный проект. Менеджмент вряд ли укусит финансирование для этого, поэтому вам нужно пойти на компромисс. Лучший подход заключается в том, чтобы оставить самые внутренние (или самые низкие) слои на С++ и покрыть верхнюю часть с помощью С#, с улучшенными API-интерфейсами, разработанными с учетом новых понятий, таких как читаемость и удобство использования API, с безопасным контролем с модульными тестами и расширенными инструментами, такими как FxCop. Это, очевидно, большие победы.

Это также помогает вам сложить ваши компоненты немного лучше, поскольку это заставляет определенные сокращения. Конечный продукт не очень приятен, так как вы можете скопировать много кода на С++, потому что годы и годы кодирования содержат множество исправлений ошибок и многих недокументированных и трудно понятных оптимизаций. Добавьте к этому все трюки указателя, которые вы могли бы сделать в C (наш код с течением времени эволюционировал с C на С++). По мере стабилизации вы все больше и больше читаете код С++ и перемещаете его в С# - в отличие от целей "чистого дизайна", которые вы имели в виду в начале.

Затем вы узнаете, что производительность в interop отстой. Это может потребовать второй переписать - возможно, теперь используйте небезопасный код С#. Grrr!

Если все члены команды приходят из С++, новый код также выглядит как С++. Попытайтесь использовать сочетание разработчиков С# и С++ в команде, чтобы в конце вы могли получить больше .NET-API.

Через некоторое время проект может потерять интерес, и mgmt может не финансировать всю переписывание, поэтому вы получаете С++-код на С# -sugarcoated, и вы все еще можете решить проблемы с unicode/64-bit. Это действительно требует очень тщательного планирования.

Ответ 11

Я был вовлечен в проект с очень похожим размером. Необходимо было переписать интерфейс GUI из-за нового оборудования и новых требований. Мы решили перенести это на .NET с помощью С++/CLI. Мы смогли повторно использовать более половины кода и портировать ее работу достаточно хорошо.

Мы смогли воспользоваться преимуществами .NET, где это имело наибольший смысл. Это сделало большую часть кода намного чище. Мы нашли книгу "Pro Visual С++/CLI и платформа .NET 2.0" Стивена Р. Г. Фрейзера очень полезны.

Ответ 12

Вы считаете порт С++.NET? Это может быть менее болезненно.

Ответ 13

В настоящее время я переписываю довольно большое веб-приложение.

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

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

Ответ 14

Некоторые дополнительные комментарии.

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

Простое перемещение приложения на новый язык не принесет больших выигрышей. Вы, вероятно, захотите также сделать редизайн приложения! Не стоит недооценивать усилия, необходимые для этого. Я бы предположил, что усилия по редизайну + переписать могут составлять до 50% усилий для первоначальной реализации. (Конечно, 50% - это совершенно ненаучная догадка).

Это способ легко обмануть себя в мышление "Ну, С# и WPF настолько эффективнее, что переписать этот беспорядок будет кусок пирога!"

Ответ 15

Интересно, что большинство ответов от людей, сделавших это, кажется положительным. Самое важное, что ИМО должен иметь хорошие модульные тесты, чтобы вы могли быть уверены, что ваш переписывающий делает то, что вы хотите сделать (что может быть не совсем таким же, как то, что сделал старый код).