首页 > 学院 > 开发设计 > 正文

“不完美”的VS 2005 Team System

2019-11-17 04:38:29
字体:
来源:转载
供稿:网友

  Visual Studio Team System中新增的生命期治理,无疑是Microsoft在这个竞争已白热化的市场中的又一个重要筹码。

  Visual Studio与它的竞争对手Eclipse,都日益吸引着越来越多的开发者投入到它们中来,作为一个源代码编辑器,Eclipse已慢慢成长为一个功能齐全、反应迅速的工具了,但除了重构之外(这也是java领先多年之处),其他方面已对微软构不成什么威胁了,要对这两种开发工具进行量化比较是不可能的,但微软似乎总能在代码输入感受及界面效果上技高一筹。

  Visual Studio Team System(VSTS)是首个交付了软件生命周期治理工具的Visual Studio版本,而VSTS Team Server中主要的生命周期治理工具是源代码控制服务器(source control server)及集成的工作项目跟踪系统(work-item tracking system),这些产品构建于SQL Server 2005之上,因此,能有一系统企业级的强大功能,如:备份、复制及具有可伸缩性。不过,源代码数据库仍是一个不成熟的"数字资源"样品,它的崩溃仍会带来整体上的灾难,在采用其他的源代码控制系统时,这也是需重点考虑的一个因素。

  除去SQL Server 2005的核心健壮性之外,VSTS源代码控制服务器也具有某几项使之区别于Visual SourceSafe的特性:它工作于HTTP协议,并对时区敏感,还可把签出的项目存储在一个"架子"上,以便可从多个地理位置进行访问。这个"架子"功能非常方便实用,它可让你从多部电脑或多个位置访问源代码,而无须签入目前进度中的工作。另一个相关的特性是赋予了签入更严谨的策略,例如,所有签入必须写明一个已指派的工作项目、运行无误的单元测试、或者已完成FxCop代码分析。同样,也可以特定的角色(如代码审阅员、安全审计员等等),请求批准签入。

  VSTS中的工程项目治理围绕于"工作项目"的概念,微软使用它来查阅软件缺陷及功能的完成进度。VSTS中的工作项目在Microsoft PRoject、Team Server、Exchange、Outlook、SsharePoint,甚至ExcelWord这样的工具之间流动,这样的整合集成也是一把双刃剑,意味着为了达到协作的目的,要付出的价格可是固定不变的,恐怕买齐所有这些产品的开发团队,还是少之又少的。

  除去服务端的特性及它们客户端的表现,VSTS还为IDE自身引入了一些新工具,其中最独特之外,是它们构建于测试及建模的新基础架构之上;而VSTS最具争议的方面,是微软已创建了单独的SKU以加强这些不同的基础架构。大多数人是从MSDN的订阅获得Visual Studio安装版本的,对专业开发人员来说,一份MSDN宇宙版早已是事实中的标准。可由于VSTS,订阅者就必须从三个SKU中(架构师、开发者、测试员)选择一个,或为了得到完整的功能而付出更高的价格。

  架构师版本

  基础架构的建模是其中颇具争议的部分,在这里,当你提到"建模"时,人们会自然地想到"UML",统一建模语言(UML)在建模领域已有超过十年的中心地位,其规范已由ISO组织标准化。微软对其的态度是,UML存在两个主要的问题:它以描述程序行为为中心,因此会与源代码相冲突;而这些年来表现出的冲突已说明UML太笨拙,难以再扩展。以上两点,事实上的确也存在,但来自竞争对手IBM的Rational才是真正的问题所在。

  微软一直在辩驳其在基于Visio的工具中支持UML,并且表示使用新的建模架构,任意第三方也能开发出一种UML建模工具,但实际上却不完全正确。尽管Visio是一个非常不错的工具,但微软的UML工具太简单,完全与那些真正的UML建模工具,如Rational Software Architect、Borland Together、Visual Paradigm等齐名的产品不在同一水平上。另外,与第三方建模工具相比,如Visual Object Modeler的Visual UML,在这一点上,微软自身基础架构之上的建模工具还不是很成熟。

  除去UML,VSTS中为软件架构师预备的可视化建模工具,已为微软摆出了一个强制性的姿态,那就是UML并不是它声称般那样有效。但在此发行版本中,也有一些值得关注的地方,如逻辑数据中心、系统配置及部署的可视化设计器,即使对大公司来说,这些也是非常值得关注的产品。这些可视化设计器可让你在面向服务的部署中,指定软件、硬件及网络环境。那些服务器刚好装满一个机架的小型或中型企业,可能不会把它们当作重要的工具,但在中型及大型的数据中心部署上,它们的价值就马上显露出来了。其实还真想知道,这样的部署设计是否真的是在架构师的领域范畴之内呢。

  别的事不好说,可软件具体设计中唯一清楚的一件事,就是要编写代码,这通常意味着要编写单元测试代码。在过去五年中,软件开发主流最重要的变化之处,是在托管代码解决方案的开发中,集成单元测试。但在软件架构产品中,VSTS并没有使测试工作更轻松,假如无法负担10939美元的Team Suite SKU,就必须在可视化建模工具及其他测试工具之间做出选择,在这一点上,其他测试工具更具有优势。进入讨论组讨论。
测试员版本

  并不是说,测试工具是完美的,NUint的"绿色化、干净化"的理念使它有一种精炼的纯度,使之非常易于集成进你的开发过程中。另一方面,VSTS答应以多种方法进行测试,测试用例能在调试器下运行或单独运行,也能选择多个不同的测试等等。
悲哀的是,就测试函数的可伸缩性及多样性来说,FIT(测试用例输入输出的表格描述)还未获得支持。

  开发人员版本

  对开发人员来说,VSTS在基于Visio建模的基础上,整合了单元测试。它没有了架构师版本中的,以部署为中心的建模器,并加载了测试员版本中的测试用例治理工具。这种平衡真有点难以取舍:假如你能放弃建模器,测试员版本的VSTS将是更好的SKU。

  包装盒中的秘密

  在Visual Studio 2005中,微软支持以下四种语言:C#、Visual Basic、C++、J#,C#与Visual Basic可是 .NET中的重量级选手。在 .NET 2.0中,最主要变化的是演变为通用语言运行时库(CLR),而C# 2.0则在其中加入了对泛型的支持,最常见的是集合类库、混合了特定类中类型安全的泛型。

  泛型存在的必要性已争论了很久,支持"动态语言"中隐式类型转换的爱好者,对类型的安全声明并不感爱好,其他的,如Java领域,也表示与它们引入的复杂性相比,所提供的价值并不明显。但就个人来说,还是倾向于显式类型转换,实际上,在Visual Basic的世界中,尽管支持泛型,但它们似乎总不是讨论的焦点。(所有的 .NET语言至少必须能使用泛型,所有微软公司的语言都能使用及生成泛型。)

  CLR中泛型的实现,还是有点意思的。在C++中,泛型的实例化是在编译时完成的--编译器为每个实例化的泛型,都生成了一个不相同的二进制类型。在Java 5中,类型安全的语法,由一个单一的存储了Object引用的运行时泛型提供支持,远比C++所使用的模型简洁得多,但却需要对值类型进行装箱及解箱(转换为及转换自基于Object的引用类型)。在CLR中,假如泛型的类型参数为一个值类型,在加载时,一个确切的泛型会被实例化,这让CLR泛型有了Java泛型中的可伸缩性及简洁性,且对值类型来说,也提高了执行效率。

  例1是C#及Java的对比程序,程序用于显示装箱带来的性能损失。编译并运行在一个2.66G,32位Intel处理器上,系统为VMWare中的Windows Server 2003,并为其分配了1G的内存。对比开发工具为C# 2.0及Java JDK 5.0 Update 6,C#程序在3.01秒内运行完毕,而Java程序在10.109秒内运行完毕。虽然这可能代表了最坏情况下的Java表现,但也表明装箱的性能损失真的是非常大。

  例1:C#及Java的对比程序

//Program.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace Consoleapplication1
{
 class Program
 {
  static void Main(string[] args)
  {
   RunIt();
   DateTime start = DateTime.Now;
   for (int i = 0; i < 5; i++)
   {
    RunIt();
   }
   TimeSpan elapsed = DateTime.Now - start;
   Console.WriteLine("Elapsed time: {0} ms", elapsed);
   Console.ReadLine();
  }
  static void RunIt()
  {
   List<int>[] n = new List<int>[5];
   for (int i = 0; i < n.Length; i++)
   {
    n[i] = new List<int>();
   }
   for (int i = 0; i < 1000000; i++)
   {
    n[0].Add(1);
   }
   for (int i = 1; i < n.Length; i++)
   {
    List<int> newArray = n[i];
    List<int> oldArray = n[i - 1];
    foreach (int j in oldArray)
    {
     newArray.Add(oldArray[j] * 2);
   }
  }
  for (int i = 0; i < n.Length; i++)
  {
   List<int> array = n[i];
   foreach (int j in array)
   {
    int number = j;
   }
  }
 }
 }
}

//GenericValueArrayListTest.java
import java.util.*;

public class GenericValueArrayListTest {
 public static void main(String[] args) {
  RunIt();
  Date start = new Date();
  for(int i = 0; i < 5; i++){
   RunIt();
  }

  Date finish = new Date();
  System.out.printf("Elapsed time: %d ms", finish.getTime() -
   start.getTime());
 }

 static void RunIt()
 {
  ArrayList<Integer>[] n = new ArrayList[5];
  for(int i = 0; i < n.length; i++){
   n[i] = new ArrayList<Integer>();
  }
  for (int i = 0; i < 1000000; i++) {
   n[0].add(1);
  }
  for(int i = 1; i < n.length; i++){
   ArrayList<Integer> newArray = n[i];
   ArrayList<Integer> oldArray = n[i - 1];
   for(int j : oldArray){
    newArray.add(j * 2);
   }
  }
  for (int i = 0; i < n.length; i++) {
   ArrayList<Integer> array = n[i];

   for(int j : array){
    int number = j;
   }
  }
 }
}
  除了泛型,C# 2.0主要是通达LINQ(Language Integrated Query 语言集成查询)的一块踏脚石。这又是一种横跨微软公司语言产品的功能,但这次是由C#充当开路先锋。LINQ整合lambda函数、类型推论及智能库,设计的目的是为了使查询--不只是数据库而是任意集合--能成为主流编程语言中的第一类要素。

  回过头来看Visual Basic.NET,这个版本试图在抗拒转向完全面向对象语言的社区中,重拾对VB的激情。诚然,比较以前的版本,这次的VB.NET无疑是一次巨大的进步,但社区中的很多人也感到,即使不能带来任何好处,也必须重写以往工作正常的程序,所以我们看到,一些人继续使用VB.NET,而更多的人转向了C#,还有一些人则全然抗拒 .NET。另外,Visual Basic引入了"My"命名空间,其目的是为了降低基类库(Base Class Library)的复杂性及提供对对象的即时访问,还加强了"编辑并继续"这个深受大家喜爱的功能。

  在2005年秋天的专业开发者大会上,微软展示了代号为"Visual Basic Orcas"的部分功能,包括了LINQ及在语言字面上直接整合xml。如同C#一样,这个版本的VB看起来会有重大的改变了。

  最后来看一下C++,此次Visual Studio中最重要的变化无疑是C++/CLI了,这是一个对C++语言的扩展,并为托管对象添加了"句柄"作为第一类语言实体,在某种意义上来说,其与指针的语法非常相似。并且,使用gcnew要害字来实例化可垃圾回收的托管对象,另外,确定性最终清理也是一大亮点。相比Visual Studio 2003通过双下划线来访问托管对象,句柄的语法似乎更轻易使用一些。

  另一方面,Visual C++ 2005在编写桥接或混合托管与非托管代码的程序上,显示出了无与伦比的可伸缩性:你可编写完全控制进入点的DLL、在各种字符串表示法之间进行转换、还可充分挖掘Win32的性能,并且,在托管领域,微软可能会说:"对CLR而言,没有比C++更低级的语言了,包括CLR自身。"(虽然有点夸大,但也可看出微软在重心在何处。)

  对本地程序(native program)开发者来说,Visual C++ 2005也有几项让人感爱好的特性,比如:标准库中增强了安全的函数实现--strcpy_s()以及其他;OpenMP的实现--其答应对特定类型的操作,以共享内存的方式并行处理(一般运用于数组算法上);可支持更多的设备等等;最后,要提一下,对基于Windows的SmartPhone本地程序开发,现在可在Visual Studio中完成了。

  既然说到设备,就讲得再开一点,Visual Studio 2005扩大了语言可支持设备的范围,.NET Compact Framework也有了P/Invoke功能,假如缺少它,那将是开发中的一个重大障碍。现在,.NET Framework已有了32位及64位版本,在64位Windows上将会并行运行,以避免"DLL Hell"。当然了,Visual C++ 2005也能进行本地64位程序开发。进入讨论组讨论。
IDE

  唯一能与Visual Studio 2005中窗体构建器相抗衡的,也就是同一阵营中Visual Studio 2003的了。
Windows Form是生成基于窗体的本地应用程序的最好的"高产出"库,而asp.net 2.0也是一名不容小觑的选手,假如功力不深,恐怕如今也不会在动态网站方面得到广泛的应用。虽然有点主观,但微软的设计时体验,似乎反应越来越快,也越贴近用户,基类库(Base Class Library)的广泛应用,价值无法估量,其庞大的体积,在很大程度上,也因为有了代码智能感知(Intellisense),已不再是什么问题了。

  另一个不得不提的地方就是重构,不幸的是,微软在这个领域的第一次努力,并不怎么让人满足,C#只有一小撮的重构功能,与IDEA或Eclipse相比,无疑显得有点苍白,而此时选择JetBrain的ReSharper或Refactor! Pro作为Visual Studio的外接程序(add-ins)时,仍是物超所值。

  微软把更多的心思,放在了"代码段"(snippets)上面,其实质上是模板化的代码块以用于自动化普通(或复杂)任务。这看上去是一个好想法,但在日常的开发中,仍需要亲自把它们合并进源代码,也许再过一段时间,它所带来的方便才会日益浮现出来,因为把实质上一样的属性(property)代码编写上一百万遍,并不是一个什么值得鼓励的好方法。

  尽管Visual Studio 2005最大的问题似乎存在于重构及代码智能感知(Intellisense)方面,但有关于稳定性,仍存在着不少抱怨--虽然我们对它的稳定性也缺乏比较。就个人所知已有三个严重的缺陷,它们几乎都与重构或智能感知有关:在C#中,传递一个继续类型作为类型参数给一个泛型超类(super-class)--这是一个合法但很少会碰到的情况,能导致CPU自旋锁(spinlock);在VB中,在ToString方法中结合使用移位操作,会让IDE崩溃;在ASP.Net中,随着网站内页面的增多,会导致C#的重构成指数级恶化。另外还有报道指,设计时异常,如由数据绑定控件产生的,也会导致IDE崩溃。

  微软宣称计划为Visual Studio 2005发布两个service pack,第一个于2006年的12月份已经发布,致力于解决稳定性问题;而第二个有传言指为一个主要的service pack,将带来新的功能,可能会包括现在CTP版本中的WPF设计器、为特定语言改良过的工具、甚至很可能把IronPython提升至主流开发语言的位置。

  结论

  Visual Studio Team Suite实质上包括了一大堆的新技术,2.0版本的通用语言运行时库及它所用的语言也都在稳定性及执行效率方面,经过了改良提高,但只有C++/CLI,才是本质上新增的改进。而IDE也在建模及测试基础架构方面,有了两个主要的组件:建模架构,其发展潜力无可限量,但目前仍不及测试架构那般充分开发利用;而测试架构几乎马上就吸引了人们的注重力。Visual Studio Team Server是微软一个重要的新服务器产品,其发展潜力巨大,似乎也不会只把重心放在单一的开发论上。无论如何,微软所作出带来崭新技术的承诺及建立对此版本产品的信心,都需要充分利用Team Server。

  当然了,对大多数微软产品零售商及开发者来说,升级至这一新的Visual Studio版本,大概只是时间的问题。以下是正反方观点:

  正方:

  ·CLR及基类库(Base Class Library)执行效率及稳定性的提高。

  ·高产出库,如ASP.NET及Windows Forms。

  ·可支持目标设备的范围扩大:如64位及移动设备。

  ·工作项目跟踪的可伸缩性及实用性。

  反方:

  ·建模工具仍不完整全面。

  ·可疑的稳定性。

  ·未证实的服务器组件。

  ·价格。进入讨论组讨论。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表