.NET应用迁移到.NET Core(二)风险评估

2016年12月1日下午微软技术大会Microsoft Ignite China,有幸和大家分享一门课程,课程信息如下,欢迎大家到时来捧场。本文介绍下应用迁移的风险评估。


很多移植项目超出预算或未能按时完成,主要是因为没有很好地管理移植过程中可能遇到的风险。风险是在估计进度和资源时要考虑的一个重要因素。在应用程序移植项目中,这些风险来自与移植相关的不同方面,主要包括下面几种:

  • 移植工程师的技能水平和移植经验。

  • 使用的编译器。

  • 使用的编程语言。

  • 第三方软件和中间件的可用性。

  • 编译环境和工具。

  • 平台依赖的结构。

  • 平台和硬件依赖的代码。

  • 需要搭建的测试环境。

  • 用户界面需求。

依赖于要移植的具体应用程序,以上各个方面的每一个都可能给移植项目带来不同的复杂度和风险。评估这些复杂度和风险的级别,可以帮助你确定它们是不是可管理的。

技能水平和移植经验

         应用程序移植和软件开发最明显的区别就是编程人员所掌握的技能。虽然软件开发人员往往是某一领域内比较专业的人员,但是要做软件移植的开发人员却需要更宽广的知识和技能。一个应用程序开发人员可以是Windows开发环境上的.NET专家,或者是Windows操作系统上SQL Server的数据库专业开发人员;但是,从事代码移植工作的工程师却通常需要时两个或者更多操作系统、编程语言、编译器、调试器、数据库、中间件或最新的基于网页的技术方面的专家。他们还需要知道怎样安装和配置第三方数据库或中间件。

         应用程序开发人员需要的往往是专才,而移植工程师则多是通才。应用程序开发人员可以为一个软件工作18个月,但是移植工程师在一个项目上往往只需要工作3~6个月,并且在上一个项目完成以后,即可投入下一个新的移植项目中。为一个移植项目找到完全适合的移植工程师有时候是很困难的,从老的技术移植到新的技术上时尤其如此。

编译器

         Windows平台上使用的编译器和编译器框架,与Linux平台上使用的有很大不同。如果在Windows平台和Linux平台上使用的是相同的编译器,移植工作将会变得容易一些,例如在两个平台上都是用的是GNU编译器,除了-g-c标志外,不同的编译器使用的编译器标志可能大不相同,尤其是应用程序使用C++语言的时候。

         另外一个需要考虑的事情是编译器的版本。要移植的代码可能是几年前使用老版本的编译器编译的,这些代码可能使用了与新的编译器不同的语法,这就使得在不同的编译器上移植程序比较困难,因为这些编译器可能支持也可能不支持老的标准,即使新的编译器支持老的标准,不同编译器对这些标准的支持方式也可能不太相同。

.NET Core项目的C# 编译器的实现非常完整,和.NET编译器实现遵循同样的ECMA标准的“Roslyn”新编译器,大大降低了移植.NET项目的难度。

第三方软件和中间件的可用性

         当待移植的应用程序使用了第三方软件或中间件时,移植的复杂度会随之增加,尤其是在目标平台上没有这些第三方产品时,移植的难度会更大。可能会出现在Linux 平台上没有可用的第三方产品。在过去的几年中,一些中间件厂商,例如IBMOracle等都把他们的中间件产品移植到了Linux上。他们花了一些功夫,使那些已经使用或者准备使用Linux作为企业平台的公司在Linux上可以使用它们的中间件产品。这也是为什么越来越多的公司愿意把应用程序从Windows移植到Linux上的部分原因。

编译环境和工具

         编译环境越简单,理解如何编译源代码所需的时间也就越少。需要多遍编译的编译环境往往都很复杂。在这些多遍编译中,使用不同的编译器标志来编译目标文件,以便解决模块间的互相依赖。第一遍编译一些模块,第二遍可能会编译更多的模块,但是第二次编译使用了前面的编译的结果,以此类推,直到整个编译过程结束。有时候,根据一些非标准的配置文件,编译脚本会调用其他脚本来自动生成一些文件。这些文件的大部分可以和待移植的文件一样看待,但是事实上,这些脚本工具和配置文件才是要移植到目标平台上的内容、这种类型的工具往往会在评估和分析时漏掉了,进而可能会破坏已经制定的进度计划。

         源代码控制是另一个必须考虑的。在Linux环境下,SubversionGit是应用最广泛的源代码控制工具,在一个移植项目中,如果有多个工程师同时来移植相同的模块,那么就需要进行源代码控制。

平台依赖的结构

         当从基于x86Windows平台移植到基于RISC/ARM结构的Linux平台上时,需要检查应用程序对字节序的依赖和字母大小写敏感,例如,为了计算或数据操作而是用了字节交换的应用程序。在没有正确修改字节交换逻辑的情况下,调试问题将变得非常麻烦,因为很难找到数据在哪里出了问题,这主要是因为问题的根源通常是在发生问题的代码之前很远的地方。在调查和分析阶段,一定要找出平台依赖的结构。

平台/硬件依赖的代码

         需要内核扩展和设备驱动程序支持的应用程序时最难移植的。所有平台的内核API都不遵循任何标准。因此,API调用、参数个数,甚至是怎样把这些扩展装载到内核,在各个平台上都是不同的。多数情况下,都需要在Linux上开发新的代码。不过有一件事可以肯定,内核代码通常是使用C语言或者平台相关的汇编语言编写的。

搭建测试环境

         移植工作完成以后,如果项目的范围还包括系统测试和验证,测试代码所需要的设备可能也会增加移植的复杂度。如果应用程序需要在复杂的集群或网络环境中测试,设置环境和调配资源也会增加项目的时间。

         测试也可能包括性能测试。通常,性能测试都需要运行最大配置,以便检测应用程序在满负载下的运行情况。

         移植应用程序测试工具的工作也需要包含在移植进度计划中。需要对包括软件测试和专用硬件配置的测试工具进行评估,以确定其需要多长时间进行移植和配置。

用户界面需求

         移植用户界面可能很简单,也可能很复杂。基于ASP.NET的用户界面比较容易移植,基于WPF/WinForm技术的用户界面就难以移植了,.NET Core不支持WPF/WinForm

 

下面的表总结了需要考虑的各个方面,各个方面都根据其使用的技术列出了难、中、易。

 

内容

容易

中等复杂度

高复杂度

编译器/编程语言

C#F#

使用的语言在.NET Core上支持有限

待移植代码的是C++/CLI

使用第三方产品或中间件

None

.NET Core上支持的和可用的

Linux上不支持的;

使用了C++编写的第三方工具

编译环境和工具

Msbuild 脚本

Msbuild 脚本和编译脚本组合在一起


平台/硬件依赖的代码

非平台/硬件依赖的代码

平台/硬件依赖的代码来自第三方产品,而且已经移植到了.NET Core

使用了内核扩展及设备驱动代码

测试环境及其搭建

独立的

客户端/服务器设置

网络、高可用行,集群;需要外部设备来测试,如打印机、光纤连接通道磁盘等

用户界面

ASP.NET MVC

ASP.NET WebForm

不可移植的用户界面,例如WPF

         经验表明,整个移植项目所需的实际工作量,在移植项目开始的前两三周,就可以评估出来。这段时间是待移植代码刚交付给移植项目组,而且移植工程师刚开始熟悉该软件程序,也可能是移植工程师刚开始移植该软件程序。他们开始分解应用程序组件,并搭建最初的编译环境。在最初的两三周内,移植工程师会完成编译环境的配置,并开始编译一些模块。

         过了最初的两三周后,最好重新检查原先评估的进度计划,并根据刚得到的实际经验决定是否对计划进行调整。



.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java IO: PipedInputStream

转载自 Java IO: PipedInputStream译文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com) PipedInputStream可以从管道中读取字节流数据,代码如下: InputStream input new PipedInputStream(pipedOutputStream); int data input.read(); …

java阿里数据库连接池_Java学习:数据库连接池技术

本节内容数据库连接池Spring JDBC : JDBC Template数据库连接池1.概念:其实就是一个容器(集合),存放数据库连接的容器当系统初始化好后,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对…

/ vs /*

/ 匹配所有的请求&#xff1b;&#xff08;不包括.jsp&#xff09; /* 匹配所有的请求&#xff1b;&#xff08;包括.jsp&#xff09; <servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mappi…

.NET应用迁移到.NET Core(一)

2016年12月1日下午微软技术大会Microsoft Ignite China&#xff0c;有幸和大家分享一门课程&#xff0c;课程信息如下&#xff0c;欢迎大家到时来捧场。本文介绍下应用迁移的一个过程。 把一个运行在某个操作系统和硬件结构上的软件&#xff0c;在另一个操作系统和硬件结构上重…

mybatis关联配置(一对多配置)

mybatis框架的关联配置&#xff1a; 首先假设我们数据库中有两个表&#xff0c;一个表示move&#xff0c;另一个是moveType,move里面有一个字段typeid,与moveType表里面的id相对应。相信大家已经看出来了&#xff0c;一个moveType对应多个move,我们查询move字段的时候&#xff…

js模块化历程

转载自 js模块化历程这是一篇关于js模块化历程的长长的流水账&#xff0c;记录js模块化思想的诞生与变迁&#xff0c;展望ES6模块化标准的未来。经历过这段历史的人或许会感到沧桑&#xff0c;没经历过的人也应该知道这段历史。无模块时代在ajax还未提出之前&#xff0c;js还只…

WIN10的IE错误代码inet_e_resource_not_found解决办法

WIN10的IE错误代码inet_e_resource_not_found解决办法 原创 候鸟307183846 最后发布于2019-08-27 13:31:54 阅读数 2413 收藏 展开 解决方案&#xff1a; 1、在Internet选项里&#xff0c;点《连接》标签&#xff0c;按下《局域网设置》按钮&#xff0c;在对话框里&#…

java schema名_关于Schema的名字空间

基本的XML Schema的使用就是这样&#xff0c;下面我们要介绍XML Schema的另外一个核心的部分也是Schema最关键的一个部分&#xff0c;就是关于Schema的名字空间(namespace)的问题。在上面关于XML Schema的介绍中&#xff0c;为了把读者集中到对XML Schema的语法理解上&#xff…

404问题

、配置Tomcat 启动测试&#xff01; 可能遇到的问题&#xff1a;访问出现404&#xff0c;排查步骤&#xff1a; 查看控制台输出&#xff0c;看一下是不是缺少了什么jar包。如果jar包存在&#xff0c;显示无法输出&#xff0c;就在IDEA的项目发布中&#xff0c;添加lib依赖&…

@Valid注解的使用---SpringMvc中的校验框架@valid和@validation的概念及相关使用

https://www.cnblogs.com/charlypage/p/9385146.html 第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析 关于spring中的validate注解后台校验的解析 在后台开发过程中&#xff0c;对参数的校验成为开发环境不可缺少的一个环节。比如参数不能为null&…

如何设计java线程安全类_如何设计线程安全的Java程序

什么是线程安全的(thread-safe)&#xff1f;在java中&#xff0c;线程安全的指的是代码可以在并发的或者多线程的环境下安全的使用或者共享&#xff0c;并且它们都将按照期望的方式运行。任何代码&#xff0c;类或者对象&#xff0c;如果它们在并发的环境中运行表现出的行为与在…

java中的AIO

转载自 java中的AIO简介jdk7中新增了一些与文件(网络)I/O相关的一些api。这些API被称为NIO.2&#xff0c;或称为AIO(Asynchronous I/O)。AIO最大的一个特性就是异步能力&#xff0c;这种能力对socket与文件I/O都起作用。AIO其实是一种在读写操作结束之前允许进行其他操作的I/O…

Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)

最近在用Mybatis做项目的时候遇到了不少问题&#xff0c;今天我就在这和大家分享一下&#xff0c;稀稀拉拉的研究了两天&#xff0c;终于搞好了&#xff01; 开发人员&#xff1a;1111 开发软件&#xff1a;Myeclipse 用到的框架技术&#xff1a;Mybatis 数据库&#xff1a;MyS…

细说ASP.NET Core静态文件的缓存方式

一、前言 我们在优化Web服务的时候&#xff0c;对于静态的资源文件&#xff0c;通常都是通过客户端缓存、服务器缓存、CDN缓存&#xff0c;这三种方式来缓解客户端对于Web服务器的连接请求压力的。 本文指在这三个方面&#xff0c;在ASP.NET Core中静态文件的实现过程和使用方法…

金田项目的总结

一个搜索框对手机、姓名、内容进行搜索 <select id"list" parameterType"java.lang.String" resultMap"BaseResultMap">select<include refid"Base_Column_List"/>from user_backstagewhere 11 and is_deletedN<if te…

18000 6c java_面向ISO18000-6C协议的无源超高频射频识别标签芯片设计

摘要&#xff1a;This paper presents a new fully integrated wide-range UHF passive RFID tag chip design that is compatible with the ISO18000-6C protocol. In order to reduce the die area, an ultra-low power CMOS voltage regulator without resistors and an are…

Vue异步组件

转载自 Vue异步组件 在大型应用中&#xff0c;我们可能需要将应用分割成小一些的代码块&#xff0c;并且只在需要的时候才从服务器加载一个模块。为了简化&#xff0c;Vue 允许你以一个工厂函数的方式定义你的组件&#xff0c;这个工厂函数会异步解析你的组件定义。Vue 只有在…

文章中文字乱码问题解决办法集合

乱码问题 测试步骤&#xff1a; 1、我们可以在首页编写一个提交的表单 <form action"/e/t" method"post"><input type"text" name"name"><input type"submit"> </form>2、后台编写对应的处理类 …

.NET开源两年之后社区贡献如何

微软在 2014 年开源了 .NET 核心框架&#xff0c;欢迎社区贡献代码。2015 年&#xff0c;一位 .NET 开发者分析了开源一年之后的社区贡献。2016 年年底又到了&#xff0c;这位开发者再次发表文章&#xff0c;分析了 .NET 开源两年之后的情况。 这一次他分析了 15 个 .NET 开源项…

java把控件跑挂了_Java代码动态修改 ConstraintLayout 内控件布局的辅助类

##上图ConstraintUtil.javaimport android.support.annotation.IdRes;import android.support.constraint.ConstraintLayout;import android.support.constraint.ConstraintSet;import android.transition.TransitionManager;/*** Created by xiaolei on 2017/9/8.*/public cla…