一个好玩的现象

一个好玩的现象

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

一个学期做下来,对我来说印象最深的就是文档写作。相信很多程序员对写文档这档子事都是深恶痛绝。我们的需求频繁地更改(估计是老师们为了体现真实感而故意前后说得不一致),导致每次洽谈结果都是要修改大堆文档。但是我的厌恶倒并不在于需求变更,因为不管需求变化不变化我回来都照样工作,对于具体是什么工作我倒并不在乎。原本在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++快”、“整数的乘除尽量换成移位运算”等等。这些编程技巧基本上都是那些编程老手和自己的编译器混得太熟,以至于愿意为它们分担一些工作。但终归到底和语言本身无关,何况现代的高级编译器都已经具备自动优化功能。过度地手工优化不仅可能破坏代码的可读性和移植性,而且让编译器难以进行优化、发挥不出其长处,到底是聪明反被聪明误!

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

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



版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者“redraiment”和主站点上的本文原始地址



我的邮箱,欢迎来信(redraiment@gmail.com)
我的玩具箱(子清行
我的百度空间(梦婷轩

时间: 2024-11-03 10:10:05

一个好玩的现象的相关文章

Google今天推出了一个好玩的教育功能

Google今天推出了一个好玩的教育功能,可以让用户直接在Chrome里玩拼读单词的游戏.这个游戏叫Spell Up(点击可以试玩),由Chrome来朗读一个单词但不显示拼写,听到单词的你要用语音把一个字母一个字母拼读出来,如果拼对了,就可以多搭一层积木,拼错的话,对不起,请再来一遍.据说后面还有语音填空.正确发音等等关卡,不过只试了一试的我还没玩到. 其实Google这次推出Spell Up,更多的意味应该是给开发者们做个范例,告诉开发者们目前Chrome的"Speech Synthesis

旅游行业存在这样一个矛盾的现象

旅游行业存在这样一个矛盾的现象:需求端用户的习惯已经高度智能化,人们在线上进行酒店.机票产品的搜索和预订已成习惯,但供给端的资源拥有方信息化程度却很落后--酒店批发商.包房商们仍用纸质表格记录和电话报价的方式与上游酒店以及下游分销商对接,房间库存的采购与销售不够及时,导致资源方的供给效率低下,供应链的能量没有被完全释放. 看准这个痛点,"天下房仓"想通过为酒店批发商(一级代理).包房商(一手)解决信息化问题,帮助他们实现电商化,同时为酒店实现数据化方式对接批发商,从而搭建一个酒店供应链

发现一个有趣的现象,互联网公司开始集体农村刷墙

最近,发现一个有趣的现象,互联网公司开始集体农村刷墙.淘宝.京东.360.易信.当当.世纪佳缘--纷纷"上山下乡".而且,一个比一个有意思.比如淘宝的"要想生活好,赶紧上淘宝",当当的"老乡见老乡,购物上当当",世纪佳缘的"上佳缘找媳妇儿,种地有帮手"-- 围观之余,有一个问题,为什么热衷于"互联网思维"的这些公司愿意"上山下乡"?真的只是单纯地想弄个噱头,炒一把么?当然不是!想炒作,社

一个锁等待现象的诊断案例

  前两天与一个客户交流的时候,客户提出了一些对mysql隔离级别以及锁的疑问,然后问到了出现锁等待现象的排查思路.和客户进行了简单交流之后,翻了翻之前的一个诊断案例,当时折腾了两三天,现在看看还是有些借鉴价值的. 问题描述 数据库实例:主库XXXX:3306  问题详情:客户反映,涉及到user_site表相关的程序回调操作很慢,部分操作会超时报错: 下单操作很慢甚至直接报错失败 程序端报错信息如下: General error: 1205 Lock wait timeout exceeded

CSS的BUG:IE6中一个奇怪的现象!

css 先声明,是偶的同事xpoint遇到的,不是偶首发的.不说这句话偶肯定挨揍...当ID与Class组合使用的时候在IE6下无法正常显示. CSS代码: #f{ font-size:20px} #f.a{color: red;} #f.b{color: black; font-size:50px} #f.c{color: blue;} #f.d{color: orange;} HTML代码: <div id="f" class="a">a</d

谈谈C#的私有成员的一个有趣的现象!

大家都知道,一个类的私有成员只能在他的内部访问! 但是不知道大家注意到没有,实际上在C#中一个类的实例是可以访问同一个类的另外一个实例的私有成员的. 请看这段简单的代码 public class MyClass { private int i = 0; public void Function() { MyClass a = new MyClass(); Console.WriteLine( a.i); //这里成功访问了另外的一个实例a的私有实例字段 } } 大家也可以自己写一段类似的代码来测

一个神奇的现象,我左边JTree,右边JTable,都加了JScrollPane,用JSplitPane分左右,JTable读数据库,但是必须先移动一下JTree和JTable分解的那条东西

问题描述 未移动前移动后谁知道原因吗,附源码importjavax.swing.*;importjavax.swing.tree.*;importjavax.swing.event.*;importjava.awt.event.*;importjava.awt.*;importjava.io.*;importjava.util.*;importjavax.swing.table.DefaultTableModel;importjava.sql.*;publicclassTest3extendsJ

IE下一个奇怪的现象

问题描述 首页页面A,这个页面里有一些SQL语句,suchas:select*fromuser..还有一个LINK可以跳到页面B页面B,静态页面A和B都包含一个公共函数页面#includec.asp现在我从A点LINK跳到B,发现页面A的SQL语句select*fromuser..被执行了通过HTTPWATCH监视,我先好象有个HTTPGET的请求发给了A页面,FIREFOX下正常请问各位大侠有知道怎么会事的吗我们是用的ASP开发页面,不是ASP.NET 解决方案 解决方案二:没有碰到过...应

一个神奇的现象

问题描述 String s ="一";byte[] b =s.getBytes();System.out.println(b[0]);System.out.println(b.length+"-"+s.getBytes().length);以上代码分别把UTF-8和GBK两份,分别运行以上程序,居然得到两种结果...求原因... 问题补充:String s ="一"; byte[] b =s.getBytes(); System.out.prin