随笔 - 11  文章 - 0 评论 - 16 trackbacks - 2
<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

与我联系

搜索

 

常用链接

留言簿

我的标签

随笔档案

最新评论

阅读排行榜

评论排行榜

“好好活着,因为我们要死很久。”

                ——网路谚语

根据Tom DeMarco和Timothy Lister在PeopleWare中的论述,“在今天的某个地方,一个项目正在失败”,也许就在我写这篇文章的时候,某些程序员或者开发经理正在经历项目失败的痛苦。

那么,是什么造成软件项目的失败呢?我们又可以做些什么,才能避免软件项目的失败,或者,说的现实一些,如果项目的失败无可避免,我们又能做些什么,才能在项目失败的时候,不至于成为项目的陪葬,或者管理者眼中的炮灰?

我想,要想回答以上三个问题,我们首相要搞清的是,什么样的项目,才是失败的项目,也就是说,我们需要为“失败的项目”建立一个判定的标准。就我个人的意见,我把以下几类项目归结为“失败”的项目:

1、项目中止或没有部署。这类项目应该在所有的失败项目中占到很大比例,至于项目中止的原因,不外乎项目消耗超出预算、和甲方的谈判破裂,或者更匪夷所思的,项目开发完成后才发现,项目的功能是实际的需求已经相差太远,以至无法使用或没有使用价值。

2、项目闲置。软件只有在使用中,只有和用户的交互中,才能体现其价值,很多项目开发完成后,就被束之高阁,随着岁月的流逝渐渐蒙尘,被人遗忘(抱歉,写的有点感伤了)。尽管很多项目的消耗在预算之内,完成的期限也很及时,最重要的(至少对软件公司的Boss来说),软件开发款也如数支付了,但是我个人还是倾向于将这类项目归为失败的项目。

3、项目延期。这里的延期,指的是长事件的交付延误,以至于给项目开发的成本激增,给软件的开发方造成严重的负担,或者项目的中止或者没有部署(参见原因1)

4、项目质量低劣。这类项目的归类存在一定的争议。软件成功发布,但是用户体验低劣,或者代码质量低劣,以至于无法对其进行维护,或者维护成本很高。我个人倾向于将其归类为“隐性”的失败项目。

关于失败的软件项目,我会写一些文章,每篇都不会很长,但是我会尽量坚持写下去(我其实并不是一个很有长性的人)。

相信大家也参与,或者遇到过失败的软件项目,也希望大家就失败的项目,和我交流,我会将大家的意见及时补充到我的文章中。

我的mail是:chieftech#263.net
MSN:mingyeh1979#hotmail.com
(请将#替换一下,呵呵)

Technorati 标签: ,,

posted @ 2008-09-27 11:11 小笨狗 阅读(69) | 评论 (0)编辑

 

效果如上图图表的下半部分,这在中国的软件项目中,也算一个比较常见的需求了。

实现代码如下:

 

合并GridView单元格

 

在GridView的DataBound事件中调用上面的函数:

 

调用代码
posted @ 2008-08-22 13:41 小笨狗 阅读(114) | 评论 (0)编辑

一定得选最新的开发平台
用高端服务器
做就做最牛叉的政府项目
光纤接到桌面
网速最低也要千兆
什么激光鼠标啊,移动硬盘啊,人机键盘啊
能给他接上全他你接上
车里有笔记本、口袋里有PocketPC
身边站一专属的技术支持
头发乱乱,特憔悴的那种
用户一进门,甭管有事儿没事儿
都得跟人家说“尼嘞就饶了我吧”
一口地道的天津塘沽腔儿,倍儿有面子
人手一本用户手册
光索引就得八九百页
再搞一次技术培训
地点设在普吉岛
就是一个字儿,爽!
光吃住就得5万美刀
中国的政府不是搞无纸办公就是搞电子政府的
你要是说自己不会用IE
你都不好意思和人家打招呼
你说,这样的项目,一年能做多少个?
(我觉着,怎么着也就两三个吧)
两三个?那是还在调研的!五个项目起
你别觉得多,这才起步
你得研究政府部门的心理
舍得花两万美刀置办服务器的
还在乎再花四万美刀开发一套OA?
什么叫政府部门你知道吗
政府部门就是有条件要上没有条件创造条件处心积虑勒紧裤带竭尽全力也要上!
所以,我们做项目的口号就是:
上也得上,不上,也得上。
谢谢!

posted @ 2008-07-31 15:17 小笨狗 阅读(106) | 评论 (3)编辑
昨天遇到了一个在Visual Studio 2008中通过鼠标拖拽改变图片大小的时候,造成CSS文件错误更改的问题,详情请点击我昨天的帖子

改问题可以通过设定Visual Studio的属性解决,具体解决方法如下:
点击“工具”->“属性”->“HTML编辑器”->“CSS样式”


选中“为图像使用宽度和高度属性而不是CSS”选项,就可以解决了。

不知道这算不算Visual Studio的一个bug,就算不是bug,好像也不怎么厚道

另外,在Visual Studio 2008中设定表格等元素的风格时,经常在页面头部生成类似于style1,style2,style3的样式风格,我们可以在下面的窗口中将选项改为“CSS(内联样式)”,避免上述问题


posted @ 2008-06-19 16:24 小笨狗 阅读(152) | 评论 (0)编辑
首先,新建一个aspx文件,在其中引用一个CSS文件



在CSS文件中有一个img样式



页面上放两个Image



然后利用鼠标拖拽改变其中一个图像的大小,你可以看到另一个图像的大小也在改变



切换到CSS文件,会发现Visual Studio 2008 更改了CSS中的img元素的width和height属性



不知道这能不能算作一个Bug,从常规上讲,Visual Studio 2008应该在页面中插入的Image上加style,而不是改变全局CSS文件的属性吧?
posted @ 2008-06-18 17:33 小笨狗 阅读(150) | 评论 (0)编辑

二 面向用户,才是关键
回首自己两年多的编程生涯,我感觉除了知识水平的局限,制约程序员个人发展的一个重要因素,恰恰是“技术至上”。
记得当初给唐山国土资源局开发DigitalLand OA的时候,软件设计说明书中赫然写着“本系统采用先进的B/S架构,可大大降低系统的部署成本...使用面向对象的方法开发,对于系统的可维护性和可扩展性...”。
然而,我们扪心自问,OO和B/S对于用户来说,真的有那么大的吸引力吗?还是只是我们刻意的炒作呢?
给唐山国土资源局作系统实施的时候,我发现很多规划处的用户宁可使用中地公司用MapGIS开发的规划软件,而不是我们的系统,令我十分困惑。无论是软件的功能,数据的完整性还是软件的总体技术水平,我们的系统是绝对不输MapGIS的,客户有什么理由“弃明投暗”呢?规划处的王处长是这么说的:
“也许你们系统的技术水平确实比MapGIS高,可是我们还是觉得MapGIS用得顺手,你们的系统操作太复杂了...你和我们说的什么OO,什么S,什么数据完整性,我们也不明白,我们用系统,只要好用就行了。”
最后的结果是,我们被迫对系统的界面和操作方式做了若干的改动,系统才勉强得以实施。可是在唐山,包括吉林、东莞和河南项城,还是有N多的用户对MapGIS的规划系统和开思的绘图功能念念不忘,令我们大感困惑——我们,中国技术水平最强的GIS公司(无论是资金,还是人员,我都绝对不是吹牛),竞争对手居然是两个名不见经传的公司,真是匪夷所思!
也许这两个软件的数据完整性,安全性等方面的确存在一些瑕疵,但瑕不掩玉,系统的操作方式和方便性,确实值得我们学习。例如图形的外延功能,一座房屋,需要画出沿房屋轮廓外延2米的图形,在我们的系统中,需要进行一些复杂的操作才能实现,而在MapGIS中,只需选中房屋的面层,进行一次操作就能完成。
坦率的说,那次的事情对我的触动很大,刚刚毕业的时候,我总是觉得好的设计,良好的编码,数据的完整性和系统的安全性,是一个软件成功的关键,这件事情之后,我觉得只有满足客户的要求,才是一个软件最重要的目标。还是用数据库设计来举例吧,我们都知道,数据库的设计,要求满足范式,以消除数据的冗余和不一致性,可是是否完全满足数据库范式的系统,才是好的系统呢?或者说,好的应用系统,是否要满足所有的数据库范式呢?答案是否定的。两年的编程生活告诉我,一个得以顺利实施的应用系统,其数据库设计常常是在一定程度上违反数据库范式的;而完全依照数据库范式设计的应用系统,很多恰恰不能顺利实施。
难道数据库范式是没有意义的吗?难得大学中所学的数据库原理课程,都是老学究的空想?
当然也不能走这个极端,一个良好的数据库设计,常常是以数据库范式为基础,依照系统具体情况,做出适当的让步。
例如:
方案A:
table:employee
=============================================
name      gender    nativeplace  position
---------------------------------------------
Doe,John  1         1            4
Doe,Jane  0         2            5
blue      1         3            6

table:gender
==================
genderid  gender
------------------
0         F
1         M

table:nativeplace
=====================
cityid    cityname
---------------------
1         Boston
2         New York
3         Tianjin

table:position
=====================
positionid   position
---------------------
4            Saleman
5            CFO
6            SDE

方案B
table:employee
=============================================
name      gender    nativeplace  position
---------------------------------------------
Doe,John  M         Boston       Saleman
Doe,Jane  F         New York     CFO
blue      M         Tianjin      SDE

table:gender
==================
genderid  gender
------------------
0         F
1         M

table:nativeplace
=====================
cityid    cityname
---------------------
1         Boston
2         New York
3         Tianjin

table:position
=====================
positionid   position
---------------------
4            Saleman
5            CFO
6            SDE

以上,就是一个HR系统中雇员表的两个设计方案。
方案A依照数据库范式进行设计,将籍贯,职位,性别等信息抽取出来,建立字典表,通过主键和雇员表连接。可是你有没有想过这么做有什么缺点吗?我们的例子中涉及到的字典字段是三个,那么,如果有十个呢?三十个呢?也许你觉得这根本不可能发生,可是shit may happen!如果依照这个方案设计数据库,当你需要检索一个雇员的相关信息时,也许会这么做:

select emp.name,gender.gender,city.cityname,position.position
from employee as emp,gender as gender,nativeplace as city,position as position
where emp.gender = gender.genderid and emp.nativeplace = city.cityid and emp.position = position.positionid

哇~是不是比较复杂呢?闭上眼睛,想象一下,一共三十个字典表...额滴神啊~
这种方案不只实现复杂,在实际运行的时候,还可能造成系统服务器的巨大开销。
okay,我们再来看看第二种方案,那边的兄弟说了,你这个东东好像不符合数据库3NF哦,这个...不错,不过请听我慢慢道来。
我们设计字典表的目的是什么?为了防止数据的不一致,否则employee的position字段中,SDE也是软件开发工程师,或者你也可以写全称software developing engineer,明明是一个含义,统计的时候却会有两条记录。可是,维护数据的唯一性,是不是只能通过插入外键呢。我们换一个方法,我们在程序的窗体上放一个combobox,将dropdownstyle设置为dropdownlist,在窗体加载的时候,对combobox中的内容进行动态绑定,这样不是也能控制客户输入有效的数据吗?区别只是在插入数据和更改数据的时候,是传入combobox的SelectedIndex还是SelectedValue的问题。至于取得一个雇员的信息:
select * from employee
爽吧?呵呵,不只是写着过瘾,运行速度也绝对比方案A快很多。且对于数据的查看次数大大多于插入和更改的次数的情况,尤为有效。
并不是所有的客户都知道OO,B/S,数据库范式是什么东东,系统的界面漂亮,功能好用,运行速度快捷,确实客户可以切实感受到的。

posted @ 2008-06-18 09:05 小笨狗 阅读(154) | 评论 (1)编辑

写在前面
自今年年初,便很想写一些文字。一来是有很多学弟学妹们经常问我,要成为一名合格的程序员,应该具备那些知识和能力,二来,也想在工作六年之际给自己一个交代。
然而,每当动手把自己心里要说的话付诸文字,心中总有些惴惴。
我能算作一个合格的程序员吗?虽然进入IT这个行当已经近六年,可至今,还是有很多领域没有涉足,还是有很多的知识我不具备,有一些还是急待了解和掌握的,比如LINQ,再比如WPF,更不要说Java,更不要说C++...
还没有动笔,冷汗却已打湿衣衫。自己尚且如此,何必再写些东西骗人呢?自己落个欺世盗名倒也无妨,可误人子弟的恶名,却是实在承受不起的。
上周,和师傅聊起此事,师傅劝我:“有时候,失败也是一种学习,即使你觉得自己有所欠缺,能够让别人从你的失败中有所得,也是很有意义的。”
所以,就有了这篇文章。

一 编程无涯,学习亦无涯
记得毕业的时候,学校领导曾送给我一件木牌,作为优秀毕业论文的奖品,木牌上写有:
“博学笃志,明德求真”
回想自己工作的两年,真的有些愧对学校领导对自己的期望。无数个夜晚,我不是在书桌边研读Burce Eckel的Think''in in C++,不是在小戴(作者注,笨狗的DELL本本的爱称)上实践书上的Sample,而是在Delta Force中沉迷,或者索性在电视台播放的肥皂剧前发呆。
在工作中提高和充实自己,对于任何一种职业,都是必要的,对于程序员,则尤为重要。因为程序开发,是一项十分耗费脑力和精力的工作,而人的一生中精力充沛的黄金时期,也不过那么十几年。一个程序员的一生是功德圆满还是碌碌无为,都取决于这十几年的时间。当然,有的学弟学妹可能会说,国外有很多年龄很大的程序员,写程序写到头发全白,直至掉光,这个我也不能否认,可是在中国,一个30岁以上的人去应征程序开发的工作,恐怕会很难很难。何况,即使你真的能做到四十几岁,五十几岁,那个时候的你,怕已经为生活的琐事所累,能抽出的学习提高时间也不会很多。
师傅曾和我开玩笑说,做程序员的好处之一,就是总有可学的东西。这话一点不假。光是主流的数据库系统就有MS SQL Server,Oracle,DB2,My SQL等等N多种,程序设计语言更是有Visual Basic,C,C++,C#,Java,Python等N+N多种,更不要说每个软件差不多都要不停推出新的Verson。就拿笨狗正在研习的C#来说,自己连remoting都还没怎么弄通,Visual Studio 2008就已经RTM,据说其中加入了范型等N多新的特性,看来笨狗脑中的知识又要有一次大的update。
既然不愁没有可学的东西,剩下的就是学些什么的问题。记得大学的西经老师耿伟姐姐告诉我们,一件东西的价格和供给的数量成反比,换成不是很拽的话,就是“物以稀为贵”。这个定理在程序员中也很适用,能熟练使用汇编语言编写单片机控制程序的兄弟和会用VB写Hello World的兄弟相比,少而又少,前者可能在Luccent拿着几十万的年薪,而后者可能在一个小公司靠着每月两三千块的薪水苟延残喘(比如,我-_-!)。当然,要是有哪位兄弟可以拿汇编写出任天堂的模拟器,每个月却只有可怜巴巴的几百大元,记得来TEDA找我,我倒是很愿意请你吃一顿香喷喷的水煮鱼,听你一诉衷肠,同时和你一起问候一下贵公司老板的母亲。不过,汇编语言的难度和VB相比,同样也是相差几个数量级。所以,若想年薪几十万,开着Polo(或者是别克凯越,我只是打个比方)到处疯,就要付出比别人多几十倍的代价。(那边的兄弟说了,他是做传销的,初中毕业,已经有自己的奥迪A6了,而且是一次性付款,这个~,哪位兄弟帮我去马路上拣块板砖回来*_*)我那苦命的爷爷曾经对我说过,要想人前显贵,就得人后受罪,当我每个月发薪日前为剩下几天如何过活发愁的时候,才发现他老人家的话真的一点不错。
当然,学东西也不是说刻意捞偏门,也要参考社会各类人才的需求程度,比如,现在社会上熟练掌握ALGOL语言的人不能不说凤毛麟角,可是你要真是去钻这个东西,恐怕对于自己的polo梦帮助实在有限。Why?''Cause it is out of date,man!过时啦~
所以说,学东西还是应当有一些前瞻性,从beta版本开始,是一个好的策略。也就是说,学习一门语言(或者说,学习一种语言的一个版本)应该由它的beta版本开始,这样当正式的版本RTM的时候,你才有机会先声夺人。不过,值得注意的是,软件厂家常常会在正式版发布的时候对软件本身做一些更动,所以正式版发布的时候,应该注意一下软件厂商提供的软件文档说明。
对于语言的学习本身,更多的是要注意勤于思考,争取做到"think''in in XXX"(所以笨狗一向觉得Bruce Eckel绝对是个天才),也就是从语言本身的特性思考实现的特性。嗯,比如Java吧,程序的设计者所注重的是程序本身的安全性,而不是运行性能(记得看过一篇文章上说某版本的java程序在VM上跑的比VC写的原生程序还要快,我一直很怀疑),所以既然C++中的指针指来指去的,容易出问题,索性从java中去掉,至于内存管理...C++的程序员经常会创建一个对象而忘记释放,造成内存泄漏,所以java设计了GC。至于.net Framework,从java中借鉴了很多思想,不过比java和微软的产品结合的更加紧密(比如,特别为微软的数据库提供了System.Data.SqlClient命名空间,Oracle的支持却是1.1才加上的),一套Visual C#标准版的售价不过一千多块,一套企业版的操作系统或者数据库系统则动辄几万块,所以Bill Gate同样是个天才。

posted @ 2008-06-17 09:39 小笨狗 阅读(171) | 评论 (1)编辑
CREATE PROCEDURE [dbo].[TablePrint] 
@TableName VARCHAR(50

AS

SELECT Sysobjects.name AS [数据表名], syscolumns.name AS [列名]
systypes.name 
AS [数据类型], syscolumns.length AS [字段长度]
sys.extended_properties.
[value] AS [字段描述],  syscomments.text AS 
[默认值],syscolumns.isnullable AS [是否允许空值] FROM syscolumns 
INNER JOIN systypes 
    
ON syscolumns.xtype = systypes.xtype 
    
LEFT JOIN sysobjects ON syscolumns.id = sysobjects.id 
  
LEFT OUTER JOIN sys.extended_properties ON 
  ( sys.extended_properties.minor_id 
= syscolumns.colid 
    
AND sys.extended_properties.major_id = syscolumns.id) 
  
LEFT OUTER JOIN syscomments ON syscolumns.cdefault = syscomments.id 
  
WHERE syscolumns.id IN 
    (
SELECT id FROM SYSOBJECTS WHERE xtype = 'U' AND NAME = @TableNameAND (systypes.name <> 'sysname'
    
ORDER BY syscolumns.colid

GO

posted @ 2008-06-17 09:25 小笨狗 阅读(248) | 评论 (5)编辑
程序员在很多人心中的形象似乎是这样的:
1、着装不修边幅
2、一边写C++一边喝咖啡一边听摇滚乐
3、高薪水
4、很高杆,技术了得,至少能黑进某某网站或者什么系统
5、黑白颠倒,昼伏夜出
唉,Matrix,AntiTrust这类欧美电影不知道混淆了多少人的视听,其实象电影中的那种程序员,(至少在中国)实在不是很多。现在就让我create一个Merlin伯伯来喊声“Cut”,然后说说我和我认识的程序员朋友的生活是什么样子。
先说说着装,中国的大多数IT公司,对于员工的着装,还是有一些要求的。以我们公司为例,没有袖子的上装和短裤是不能穿的,因为经常有一些客户来访,穿的过于随便对公司的形象无益。当然,相对于很多白领来说,程序员的着装还是相对要自由一些,至少不用每天穿西装打领带那么刻板。
至于C++,我实在是没怎么用过,只是在大学时代用来做过几个比较小的程序(大约一两百行)来应付学期作业。大三的时候开始接触Delphi(那时候还是5.0),用了两年。2002年6月份工作后,主要是用ASP和VB,用了一年多,后来才转到C#。我工作的时候喝咖啡只是为了提神,并不是作为一种喜好,因为做医生的妈妈说过,喝太多的咖啡很伤胃,我一直铭记在心。夏天很热的时候,我比较喜欢喝苦丁茶,很败火,也很解暑。摇滚乐倒是也听过,黑豹,面孔,Beyond都很好,不过工作的时候,倒是不一定听,记得大学时代写程序的时候比较喜欢听Vanessa Mae的提琴,现在正在听Linkin‘ Park和Roxette。
关于第三点,我多么希望是真的啊~~ :~( 可惜做程序员的薪水,其实并没有很多人想象的那么高,拿我来说,我主要是用C#做B/S架构的企业应用,薪水不过3K多一点,当然,也不排除有每月NK的Java 大牛,不过大多数的程序员的月薪在2~4k左右(至少在天津这边,是这样的)。
我从来不觉得自己的技术很高杆,俗话说,一山更比一山高,我现在每天都要抽出一段时间用来学习新的技术,越看却越觉得自己对于很多方面知之甚少,开发工具,操作系统,几乎每年都要推出新的版本,也只好不断的学下去,也许这就是程序员的无间地狱吧。至于Crack,我没有太多的研究,更没有黑进过什么系统,以我的年龄,做黑客似乎太老了。
大多数IT公司,对于员工的作息时间,有严格的规定,我现在所在的公司,每天早上8:30上班,每天下午5:30下班,有专人记录考勤,如果迟到或者早退,是要扣银子的,至于加班,似乎没有通宵的惯例。工作两年多,经历的唯一一次通宵加班,是在北京的时候,也是因为产品参加科技部的测评,而不是旁的原因。每天朝九晚五的生活,虽然看似平淡,却也充满了乐趣,这些,我也会在后面的文章中细细说来。
posted @ 2008-06-16 13:45 小笨狗 阅读(185) | 评论 (4)编辑
小笨狗死后,来到天堂门前。
圣彼得问道:“死狗,你一生浑浑噩噩,但无大过,特准你进入天堂,那么,你想在天堂从事什么职业呢?”
小笨狗想了想,答道:“如果可能,我还想做一个程序员,但希望我做的项目需求永远不会变更,进度永远不会延后,系统永远不会宕机,内存永远不会溢出,磁盘空间永远不会不足,网络永远不会拥塞,用户也永远不会输入错误的数据,也没有黑客对我的系统进行攻击,我的电脑要配备最快的中央处理器,内存条要插满高容量内存,还要有高速的Internet接入,每天要有N多的漂漂美眉陪我聊天吃饭。”
圣彼得叹了口气,说:“上帝啊,把我也变成程序员吧!”
posted @ 2008-06-12 13:33 小笨狗 阅读(128) | 评论 (2)编辑