跳至主要内容

一个好玩的现象

一个好玩的现象

redraiment, 2009-07-05

一个好玩的现象





  这学期上了一门叫“软件工程实践”的课程。目的在于从需求分析、概要设计一直到验收结题,全程模拟真是的软件项目开发过程。让我们这些象牙塔里的本科生也有机会体验一下实战经历。

  一个学期做下来,对我来说印象最深的就是文档写作。相信很多程序员对写文档这档子事都是深恶痛绝。我们的需求频繁地更改(估计是老师们为了体现真实感而故意前后说得不一致),导致每次洽谈结果都是要修改大堆文档。但是我的厌恶倒并不在于需求变更,因为不管需求变化不变化我回来都照样工作,对于具体是什么工作我倒并不在乎。原本在Debian下我习惯用LaTeX来排版,但课程是硬性规定只能用Word排版、Visio画图、打包成rar提交。可惜了Word和LaTeX我都是半桶子水(不好意思,给咱们科班丢脸了),所以期间遇到了很多问题。但在用Word修改文档的过程中突然发现了一个很好玩的现象:“一个新手往往事必躬亲,每件事都亲历亲为;相反那些老手或者高手倒都是一个个懒人,能让机器做的绝不自己做。


  初看觉得很好笑,因为事必躬亲往往是那些能力强又追求完美的人喜欢做的:周围比自己好的人不多,事情交代下去就是不放心,干脆就自己解决掉算了。但环顾四周和计算机打交道的,猛然发现我们平时还真抢了不少计算机的饭碗!而且很多时候的烦恼都来自这些原本不属于自己的事情(的确有点杞人忧天,庸人自扰)。

从使用软件的角度看

  例如,作为一个Office(或者网页设计)新手,由于对软件功能的不熟悉同时也是在好奇心的驱使下,往往会不厌其烦地为每一句话甚至每一字设置字体、字号、颜色等,对每处细节都精雕细琢、力求完美(例如文档要求所有的引用需要用五号斜体宋体,新手们就手工一段一段地设置尺寸为五号、字体为宋体、风格为斜体,如果文章长的话就得花费很多时间),最终呈现的产品也可能完全符合要求。但这样的做法可维护性比较差,如果临时提出要求说所有引用的段落都要加粗,此时新手们可能要加班加点地给所有引用的段落添加粗体风格(可能会有遗漏。万一修改完成后又要求重新改回去,估计再温和的人都要发飙了^_^);老手们有更简便的方法,就是定义一些格式类型然后去套用(例如标题1、标题2等),要统一修改时只要右键“选择相同格式的文本”,就可以一次性全部重新定制。我们只需向计算机描述我们想要什么,比如告诉LaTeX,我要写一个报告(\documentclass{report}),标题是“Test”(\title{Test}),作者是“redraiment”(\author{redraiment})等等。至于“报告型文档”该怎么布局、标题该用多大尺寸、作者名是不是应该用斜体,都无需我们劳心,这些是LaTeX的工作。


  “绿色软件”这一概念也是一个很典型的例子!作为一个成熟的操作系统,统一管理软件包的安装与卸载属于份内之事。安装一款新的软件,不仅仅是把软件拷贝到硬盘上,将自己融入整个系统之中,在需要它的时候能很方便地调用(比如用IE在网页上打开一个pdf文件能自动调用Adobe Reader来显示)。而这些和操作系统打交道的工作交给系统本身是再合适不过了;“绿色软件”的思想是让应用程序与系统泾渭分明,目的在于尽可能少地产生系统垃圾。传统的“绿色软件”是很有益的,它们大部分都属于小工具,实在没必要向系统注册什么信息,这也恰巧体现了“物尽其用”的原则。只是最近“绿色软件”有被滥用的趋势:像office等通用软件也被制作成“绿色软件”。这意味着你要手工进行文件关联等操作,结果往往没系统自己做的好。我称他们为绿色发烧友,因为他们决定完全摒弃系统自动化的软件管理程序(由于抵触系统垃圾或其他什么原因)。

从开发软件的角度看

  产生上述这些现象有一部分原因在于新手对软件功能的不熟悉,也有一部分原因在于软件本身没做好本职工作(比如Windows环境下注册表体积增大的确会影响系统响应速度)。


  软件开发过程中也有很多此类现象:用Java开发GUI程序,新手普遍还不能理解Layout布局带来的优越性,为达到理想效果一般更倾向于用setLayout(null),把控件位置的控制权掌握在自己手中。但诸如不同平台上可能显示的位置不同,或出现重叠等棘手问题将接踵而至。


  另一个典型例子就是我们这些年轻程序员往往有一种“非自己做不可”的强烈情绪,相比于去理解和维护前辈们留下的代码更乐意于自己从零开始创作。这导致的结果会是文化没有沉淀、知识没有积累,从软件专业的角度来看就是代码没得到重用(重用的话题以后再聊)。一味地从零开始创作而不是在以往的基础上进行拔高,一般很难有所突破。

无为而治

  从上面的例子来看,似乎这是初学者过度到有经验者需要经历的一个阶段。这是不同的人,理解事物的方式不同:上述的新手们可能都是从结果到原因,而老手们则是从原因到结果。比如第一个例子中使用word排版,新手们就是因为“引用文字是斜体”这个结果才把某一段文字设置成斜体,而不是“因为这段文字是引用,所以它才是斜体”。如果一开始就本着这样的思想去学习,也许会少走一些弯路。


  事必躬亲虽然精神上值得鼓励,但可能不是长远之计。用这种方式去思考问题容易钻牛角尖,也容易沉浸于一些奇技淫巧中而学不到真正有价值的东西,终究只是看的见一棵树看不到整片森林。比如会有很多经验丰富C程序员告诫你“循环中用++i比i++快”、“整数的乘除尽量换成移位运算”等等。这些编程技巧基本上都是那些编程老手和自己的编译器混得太熟,以至于愿意为它们分担一些工作。但终归到底和语言本身无关,何况现代的高级编译器都已经具备自动优化功能。过度地手工优化不仅可能破坏代码的可读性和移植性,而且让编译器难以进行优化、发挥不出其长处,到底是聪明反被聪明误!


  而尽量让计算机来做事,这不仅体现“物尽其(奇)用”、“各司其职”,还反映了道家的无为思想(我所理解的无为不是不做任何事情,更确切的说应该是不做多余的事情。即“最小行为”或“按自然法则行为”。由于我的坚持,在中学里曾一度被语文老师树为反面教材)!它让我们摒弃一切不相干的事情,一心着眼于问题本身,提高解决问题的效率和质量。

后记

  “不做多余的事情”,这是与计算机打交道的方式,但不应该用来处理人际关系。虽然我们也都有各自的工作要做,但我还是挺愿意偶尔帮我老爸老妈干点活的~



评论

此博客中的热门博文

JavaScript中的字符串乘法

JavaScript中的字符串乘法 redraiment, Date 原文 原文地址: http://www.davidflanagan.com/2009/08/string-multipli.html 原作者:David Flanagan In Ruby, the "*" operator used with a string on the left and a number on the right does string repetition. "Ruby"*2 evaluates to "RubyRuby", for example. This is only occasionally useful (when creating lines of hyphens for ASCII tables, for example) but it seems kind of neat. And it sure beats having to write a loop and concatenate n copies of a string one at a time--that just seems really inefficient. I just realized that there is a clever way to implement string multiplication in JavaScript: String.prototype.times = function(n) {     return Array.prototype.join.call({length:n+1}, this); }; "js".times(5) // => "jsjsjsjsjs" This method takes advantage of the behavior of the  Array.join()  method for arrays that have undefined elements. But it doesn't even bother creating an array with n+1 undefined ele...

DAO层测试

<dependency> <groupId>com.wix</groupId> <artifactId>wix-embedded-mysql</artifactId> <version>2.1.4</version> <scope>test</scope> </dependency> 利用 wix-embedded-mysql 把MySQL嵌入到进程中,作为内存型的MySQL来做单元测试。 脚本: resources/migrations/mysql/<database>/<timestamp>_<action>.sql 但多个项目需要共享数据库脚本,可能可以用 git submodule 共享。

人所不欲,勿施于人

谁说博客也要像论文一样结构清晰、有条理?! 软件卸载 昨天整理自己的本本,卸载了 VMware 7.0 + 深度XP,MS Office 2007 以及 Visual Basic 6.0。我承认这些都是盗版软件,不过剩下的应用程序都是自由软件(freeware)或免费软件(freeware),这下我的计算机“干净”了。闲来无事,我就细数了一下当初装这些软件的原因: VMware + XP:当初刚买本本的时候,正好在上软件工程实践,紧遵老师的教导“将自己的开发环境随身携带”,自然第一款软件就是装了虚拟机(学校机房里是肆无忌惮地用盗版 VMware),另外上课指定使用 Visio 作图,那也只好一起装了;当然,也有部分原因是因为某些人的计算机装的是 XP,我这边有个 XP 环境也是为了方便问题重现(我的本本预装了 Vista)。 MS Office 2007:在毕设期间,我也还是用 Open Office 和 WPS 2010,但现在公司用的却是 Office 2007(正版)。我这次卸载这款办公软件其实也是在提醒自己:工作的事情要在工作时间里完成! VB 6:你可能无法想象在我们科班的毕业设计中有多少是 VB6 项目,从大二开始,每逢毕业将至,总会有人来找我帮忙看那些不晓得从哪儿搜罗来的 VB6 代码,经不住软磨硬泡,我总会帮着改改;另一个原因在我自己,我一直下不了决心去学 MFC 等,所以但凡要做 GUI 程序,我都是拿 VB6 来画界面,再调用由 C 语言开发的 DLL 库,不过现在改用 QT,于是 VB6 可以功成身退了。 己所不欲,勿施于人 有些人就喜欢把自己的事全盘交托给别人来做,我一直不明白他们既然有精力去说服别人,为什么就没耐心自己去完成(所以我下面说人和人之间是无法理解的)。既然自己都认为这是无聊的事情,为什么偏偏又假设其他人会愿意无偿地帮你来完成呢? 两千多年前,孔老夫子提出“己所不欲,勿施于人”的观点,但到了今天,我听到关于这句话时的语境普遍是,A说:“那个XX东西你也不要了(或要了也没用),不如就让给我吧?”,B就义正言辞地反对:“那怎么可以!己所不欲,勿施于人嘛。” 己所甚欲,勿施于人 易中天老师在《百家讲坛》讲解诸子百家...