技术开发 频道

代码编写中的心理学与美学

【IT168技术文档】

  本文是Charles Petzold于2005年10月20日在NYC.NET开发者小组中的演讲稿节选。Visual Studio或许是程序员最好的伴侣之一,但这些年来,它变得日益冒进、专制,控件问题也变得越来越混乱。难道我们应该投降,让Visual Studio替我们来编写代码吗?还是它正在侵蚀我们的编程智慧而不是使我们增长智慧?这篇演讲剖析了Visual Studio生成的代码,分析了它为我们造就的令人震惊的编程习惯;狂热地表达了独立编程过程中的喜悦、挫折和满足感。
 
技术成瘾,信息尽在指尖的麻烦
 
  在使用计算机时,键盘和鼠标或许会使我们患上重复性神经压迫障碍症(repetitive stress disorder),.. 但软件对思想的影响要远远大于身体,即便如此,这种影响也是不易察觉的。
 
  有些观察家在观察我们的数字化生存方式后,注意到某些应用程序使用户以一种非常严格的预先设计好的方式进行思考,而且我们总是这样谈论一种消费技术:在拥有它之前,我们根本不知道有多么需要它。而大多数此类技术似乎都不是为了满足某种特定的需求,只是使我们沉迷于原本从未需要过的其他东西;不是为了使我们生活得更好,只是引诱我们服下设计师提供的又一剂迷药。一旦我们尝到甜头,就被引诱了。
 
  20 世纪90年代初,Microsoft公司提出了一个口号信息尽在您指尖。理论上来讲,这听起来相当不错,而今天,有了Google、Wikipedia、Internet MovieDatabase和其他有用的网站,这个梦想基本上已经实现。
 
  没有Visual Studio(以下简称为VS),世界将会怎样?它使我们按照各种预先设计好的方式进行工作,举例来说,如果VS实现的功能比现在少,那么人们是否会更高兴?VS的某些特性大大提高生产力,但就我个人而言,它们看上去贬低了VS,也减少了我的编程经验。
 
  自从20年前的1985年11月,Windows 1.0初次登场,记录的函数调用约有400种。10年以后,Windows 95中的函数调用超过了1000种。今天我们已经作好了迎接.NETFramework 2.0正式版的准备。仅仅统计MSCORLIB.DLL和那些以System开头的程序集,就有超过5000种公共类,包含超过45000 种公共方法和15000种公共属性,这还没有计算那些派生而来以及未重写的方法和属性。有这样一位能掌握60000种方法和属性的程序员吗?我认为没有。解决方案之一当然就是专门化。
 
IntelliSense
 
  VS试图通过IntelliSense这种特性降低类、方法和属性的大规模扩展给人们带来的问题。在防止用户出格方面,如果您将指尖理解为对屏幕上插入键所在位置的比喻,那么IntelliSense实际上就实现了信息尽在指尖这一目标。它与.NET配合得天衣无缝,这是因为VS可以使用映射从您指定为引用的实际DLL中获取所需的全部信息。
 
  为使IntelliSense正常运作,自下而上的编程是非常好的选择。IntelliSense要求每一个类、每一个方法、每一个属性等等都必须得到正确的定义,然后才能引用。如果您没有这样做,IntelliSense将使用已定义的相应内容尝试纠正您键入的代码,这可能会导致出错。
 
  但这里的结论令人惊愕。要想使IntelliSense正常运作,不仅要求使用自下而上的结构编程,在每一个方法或属性中,您还必须要从开始到结束呈线性地编写代码——这简直就像使用古老的DOS行编辑器EDLIN。您必须首先定义所有的变量,然后才能使用它们。根本不能在代码中越行编写。
 
  我不需要再记住任何东西。IntelliSense会帮我记住。我的编程过程成了一场与IntelliSense的持久对话。因此我不认为IntelliSense能帮助我们成为更出色的程序员。它实际的目标是使我们成为效率更高的程序员,这也就意味着使我们的劳动更为廉价。
 
  IntelliSense是一种不可避免要出现的技术。即便Microsoft公司没有开发出它,其他人也会将它带给我们。人类从不因为可能出现不幸的结果而尽量避免追捧某些技术。
 
生成的代码
 
  VS不仅仅试图完成我们正在键入的代码,多年以来,它一直想要为我们生成代码。例如,如果选择WindowsApplication作为新项目类型,给它命名并指定本机驱动器上的存储位置后,VS就会生成足够的代码,以使这一项目立即可编译、可运行。
 
  出于某种原因,我们都已经相信了这是编程的合理方式。我更喜欢自己键入预备代码,然后自己输入main函数或Main方法。我真正需要帮助的时机绝对不是开始编程时,而是在我试图结束编程时。那个时候VS又在干什么?
 
  VS会将我们编写的程序与一组它认为我们需要的动态链接库挂钩,而不管您的程序是否真的需要这些DLL。这些额外的引用不会造成任何实际的损害,但如果其他人查看程序,会造成一些混乱。
 
  在其他文件中,VS会创建一个名为Form1.cs的文件,这是源代码文件,事件处理程序将其应用于主窗体中的控件。您会在代码顶端看到一组命令,包含了程序需要的命名空间。除了WindowsForm程序标准命名空间外VS还包含了很多自创的东西,其中某些的确非常有用,但如果程序并未实际使用这些命名空间中的任何类,那它们就只不过是令人分心的噪声。
 
  VS还在一个以项目名称命名的命名空间内封装了其生成的所有代码。当然,我完全理解给DLL一个命名空间的价值,但是为什么要给应用程序一个命名空间呢?我就这个问题考虑了很久,但没有得到答案。
 
  VS还会创建一个名为Form1.Designer.cs的文件,在VS 2005的某些测试版中,这个文件甚至不会默认地显示在项目文件中。这是VS在您设计窗体时插入生成代码的文件。VS显然不希望您搞乱这个文件,出于某些很好的理由,VS希望这些生成的代码采用一种特定的格式,如果您把它搞乱了,那么VS就无法在您再次打开项目时读回这些代码。
 
交互式设计
 
  绝大多数革命性的交互式设计素材都是在Visual Basic基于Windows的版本中写下第一个表达式的,也正是从这里开始,我陷入了对Windows编程发展方向的深深忧虑。您不仅可以将按钮移动到窗体中、以交互式方式将其位置和大小调整为所需结果,而且如果您单击按钮,Visual Basic还会生成一个事件处理程序并允许您在其中键入代码。
 
  Visual Basic不是将程序作为一个完整连贯的文档来处理,而是作为附属于可视化对象的代码段来处理的,这是我困扰的原因所在。这不是程序应该有的样子。这不是编译器看到的东西。之后人们要怎样才能获得一种对完整程序的感觉呢?这令我感到非常困惑。

  交互式设计素材最终在C++开发和Microsoft Foundation Class中找到了自己的位置,代码生成的背后实际隐藏的东西根本没人愿意探讨,那就是多到令人毛骨悚然的MFC支持,我对此深信不疑。我不断地推出《Windows程序设计》的修订版,我认为其读者群是像我一样喜欢从头开始编写自己的代码的程序员。

0
相关文章