梦想天空

.NET/.NET CF/Mobile Phones HP1937,Siemens M55,Siemens CXV65,Nokia 6021 PDU,SMS,Data Cabel,IrDA,Bluetooth and so on.
数据加载中……
思考
  我知道迟早我要来弄弯管机的控制和仿真程序的,结果这一天早早的来到了。接手了这个项目的3D显示部分的任务,也着实看到了实验室的强人的代码。

  弯管机的控制程序运行在工控机上面,而工控机本质是用PC机作为载体,装的XP作为操作系统。整个控制通过专业的控制卡进行。硬件方面不说,我也不是做硬件的,就从软件的角度看看代码就让我彻底晕死了。

  整个项目用的是VC6进行设计开发,数据库用SQL SERVER 2000。麻烦的就在这个VC6上面,彻底的古老的玩意儿了,不完全支持STL,有些莫名奇妙的vector的BUG就出现在里面。就我来看整个界面是比较简单的,没有太多动态的部分,但是整个工程的代码让我看了就彻底郁闷了——几乎所有的窗体、按钮都是慢慢用MFC凑出来的,也就是说,界面纯粹用代码写出来的。结果,这个界面变得奇丑无比,想改一下相关的东西都很麻烦,想想全是API在那儿弄过去弄过来,一会儿一个SendMessage,烦不烦!我拿到这个代码以后想添加一个东西完全无从下手,在未编译运行之前根本不知道这个窗体是什么样子的,好歹那些纯静态的窗体你给我用画出来嘛。结果由于是他们要做多国语言,不得不硬编码。至于运行起来有动态的地方(其实也就是一些类似tabControl的东东)更是摸不着头脑,只有大概猜一下,然后设置一个断点,再运行一下,看看是不是那个地方,感觉比盲人摸象还牛,毕竟盲人知道那个是象,有四条腿,总不会摸出第五条腿嘛!

  界面的超级抽象不说了,另一方面更强的问题在于怎么去修改这个界面。每次做个修改都要实际运行一下看看结果,不对再改,天啊,这太折磨人了。

  去年刚刚接触这个项目的时候,我就对当时写了一半的代码提出质疑,为什么现在开发项目还在用VC6,为什么不用.NET平台?.NET已经是很先进的一个平台了,虽然直接操作API上面有一些屏障。大家一致回答,不懂.NET,也不知道怎么用.NET来控制工控卡,还是用熟悉的VC6来做吧。其实我后悔当初为什么加进来,还不如另给我一个题目,让我从0开始!

  再来看看我周围的研究生,他们来的时候都或多或少学了一些C/C++,老一届的师兄因为历史的原因都说用VC6吧,所以天天抱着一本厚厚的MFC读啊读,做项目也只有用这个了,因为学了C/C++,他们认为用VC6这个投资才没有浪费。没有人告诉他们,还有C#可以满足你的要求,学学C++/CLI,生活便会开心许多。但我想,对于大多数“懒”人来说,我的这句话依然只是一句废话。

  其实在我接触C++/CLI之前我也有一些疑问,.NET如何去控制工控卡。VS2003时代有Managed C++ Extenstion,但其怪异的语法让人望而却步。幸亏微软没有忘记这个强力雾气,在VS2005时推出了C++/CLI。这个革命性的语言让托管和非托管语言隔阂缩小了很多。可以说目前.NET平台上,C++/CLI是最为强大的语言,他将历史和未来进行了完美的结合,让以前旧有的代码得以充分利用,也让现有的工作可以基于.NET平台,从而享受.NET带来的优势和愉悦。目前,我利用C++/CLI,已经实现把纯C++的OpenSceneGraph图形库和C#结合起来一起工作,C#专门做界面,OpenSceneGraph负责OpenGL图形显示,各司其职,将做复杂界面的挑战减小到了最小,而又不失灵活。

  那么工控机运行.NET程序是否那么快?据我了解现在所配置的工控机的CPU配置都达到了P4的水平,内存也多在512以上,除了第一次运行可能比较慢以外,这个配置运行.NET程序不存在任何问题。但对于开发机来说,VS2005先进的功能让很多旧电脑不堪重负,强人们的机器实在是太老了,512内存跑VS2005那是很痛苦的。为什么老板就不能升级一下我们的电脑呢?呵呵,为什么“不”这就不容多说了吧。我怕哪天学生科的老师又叫一个学生敲敲寝室的门,然后对我说,XX老师叫你好好学习。

  废话不多说,以我的观点来看,如此简单的工控机的界面用不着动用VC6这个老元老了,除非是需要继续进行2000年左右项目的开发,而迁移成本很高的情况下。2005年以后的工程都可以用VS2005来开发了,在嫦娥都能奔月的今天,开发工具不在进行革新,就好比原始人用石头和现代人的原子弹比拼。要知道我做PDA上面的地震数据采集的界面都比这个复杂太多,工控机优越的硬件环境足以支撑.NET平台。

  用C++来构造界面往往需要花费很大的精力才能调整好整个,有过MFC开发经验的人就知道这些痛苦了。要实现一个多国语言都显得很麻烦。其次,C++的内存管理始终是一个问题,即便很小心,也可能忘记new了一个数组以后(int* p=new int[count])需要用delete[] p进行删除。编译器不会给你说这个地方需要怎么做,最多给你一个Warning,但恐怕业余程序员也不屑于来更正这些Warning。错误的操作导致的内存泄露很麻烦,也不容易查找出来,而.NET的托管平台就没有这个隐患,除非你自己使用了非托管资源而未作处理。

  .NET的优势不仅在于以上所说的创建界面方面,整个.NET平台简化了太多的操作。XML结合序列化反序列化的使用使得存储一个结构变得轻而易举,XML以明文存储的结构数据更能很容易的进行查看,找到问题所在。而在现在的项目中,由于VC6的局限,最方便的方法莫过于直接将一个结构写二进制文件。但这样造成了严重的后果,如果以后版本升级,之前的数据文件将不再兼容,虽然有些即便看上去可以用,但值却不是一一对应,可能隐藏一些很复杂的问题。想想为什么现在Office 2007都要用XML来存储,我想,这肯定是经过了太多的兼容性的折磨的。其次微软的跨平台的野心也促使其使用工业标准。正是由于这些原因,这才带来了OpenOffice和Microsoft Office的高度兼容。

  再说说数据库里面存放的玩意儿。对数据库我不是太在行,对于表结构那些我没有太多的看法。当然我知道用C++调用ADO访问SQL Server在现在.NET平台下看来简直是没事找事做。强人们用了好几百行代码来写这个数据库部分,有必要么?现在系统数据库里面存储的工艺文件和管形文件是用二进制来存储的,如果要调试,就要用专门的类来进行读取,才知道里面到底有什么。我知道,C++里面操作XML不是一个简单的事情,C++缺少META信息也给序列化带来了不便。这不怪强人们,如果他们出生在我的年代,用上了.NET平台,用上了序列化和反序列化,我想他们肯定很乐意几行代码将需要的结构保存下来,而不是费尽心思去写Load和Save的代码。

  回过头来,当身处强人们的位置时,当机器无法快速运行VS2005时,当老板的项目逼得很急时,没有更强的专业开发人员时,作为业余的程序员,也只有选择走一些弯路。越调越多的BUG,越变越复杂的需求,无不深深的折磨着他们身心。而现在项目就要移交给我,我真想将整个项目重新规划,用.NET重写整个逻辑,用C++/CLI来操作工控卡,但,老板愿意承担其中的风险么?他愿意花时间么?一年多积累下来的代码重新以后是不是改动太大了?如果再不做一些改动,恐怕这些代码以后的路很难走。

  当然,项目组一起做上来的业余程序员也只能走一步算一步,越走越黑暗,越走越伤心,最终毕业了就真正解脱了——为什么程序开发这么难?为什么生活变得如此之乏味?为什么还在用那么难看、那么折磨人的VC6?为什么有那么多莫名其妙的BUG?当问号越来越多的时候,我就和他们一样彻底崩溃了。

  目前由于一些原因和时间的限制,我只能对目前的代码做一些小的改动。我把之前的代码迁移到VC++2005,修正了一些兼容性的问题,现在能够很好的编译执行。编译已经打开了CLR选项,以便支持.NET平台的混合开发。虽然这样的代价是更慢的编译速度,但这些时间值得,我再不用去考虑new了一个东西要记得delete,我只管gcnew,让CPU去处理吧。我不再面对高度抽象的界面,至少我静态的窗体能够很方便的创建。

  今天过得很累,也写了很多。这些几M的代码让我看到了我几年前开发的思路和模式,感触颇多。让这些老工具提前退休吧,我可不想在我毕业的时候面黄体瘦,让这个研究生过得更有意义点吧,而不是去修正那些本不该修正的问题。

  重复造轮子,吃力不讨好!睡觉!

posted on 2007-10-31 23:49 Dream world 梦想天空 阅读(1903) 评论(19)  编辑 收藏

评论

#1楼  2007-11-01 08:00 81      

我也支持用。net代替vc6开发工控程序,的确,有些强人在程序方面只能说是业余的。

我们这也有用vc6和sql2000做的控制程序,几十个数组的交互占了大部分代码,界面很差,数据库交互和现在的Ado.net相比也太难看。

从代码本身上看,只有小学水平!他们做了几个月,按我的看法用vs2005两个星期比这做的还好。
    回复  引用  查看    

#2楼  2007-11-01 08:39 1-2-3      

楼主是研究生呀,好羡慕,不像俺因为学历低连简历都没人看。用VC6作界面确实挺累的,还有古怪的宏定义让人望而生畏。不过即然大家都怕冒险而不愿意换语言,楼主也只好去适应大多数人了,这种事以后在工作中也会经常碰到的,我的原则是:可以服从大多数人(或领导)的决定,但是前提是已经充分地向大家说明了我的观点。最后贴一句俺的偶像温伯格的话:“生活是如此艰难,所以更不能太认真。”


在每天的折磨中仍能保持好心情^_^
    回复  引用  查看    

#3楼  2007-11-01 08:52 Enzo      

构架没弄好的烦恼
    回复  引用  查看    

#4楼  2007-11-01 09:18 neoragex2002      

牢骚啥,自己转便是,以后师弟师妹看你们写的代码不也会觉得像小学生么?我读研时还曾将几M的borland C++图形图像+DSP代码从dos转到VC6+windows下来过呢... 不受点挫折不叫读书。
    回复  引用  查看    

#5楼  2007-11-01 10:07 二手的程序员      

开发小程序与其用MFC还不如用Win32API来的痛快。
开发大程序用C#或Java
    回复  引用  查看    

#6楼  2007-11-01 10:17 dc [未注册用户]

很多时候,用什么语言或者什么工具来做开发,不是取决于开发者的,这里面有公司的原因,也有历史遗留的原因,不是每个项目都有推倒重来的机会。作为开发人员,只能尽量丰富自己各方面的能力,以适应各种状况,你认为.NET好,他还说Java好,怎么办?

其实C++也还是有很多无可替代的方面,之所以工程做到这个地步,不是C++的错,而是项目管理混乱和开发人员参差不齐造成的。就算你用.NET开发,如果还是这样管理模式,或者根本就没有管理,不出几年,开发人员一多,各种问题依然会接踵而至。

做大项目的人,不是凭一己之力或一两个优秀的开发人员就可以了,必须看到问题的本质,你都是研究生了,软件工程想必也懂得不少,但是如何付诸实践,还有很长的路要走。
    回复  引用  查看    

#7楼  2007-11-01 10:27 阿里 [未注册用户]

对C++/CLI,不知道楼主是怎么使用带有指针的指针(**)这样API的函数的,使用环境在Form.h文件内。
    回复  引用  查看    

#8楼 [楼主] 2007-11-01 10:56 Dream world 梦想天空      

刚起来看到各位的回复,非常感谢大家对我文章的关注。
@81
感觉工控程序的精髓还在于其控制部分。但整体看来整个系统,包括界面、数据库这些都是必不可少的部分。关键在于将精力放到哪儿上面去。而我看现有的代码,很大程度都是将重心放到了界面的设计上面,由于团队的编程经验不足,将某些控制的东西都放到了界面中去,这和我几年前开发程序的思路是一样的,浑浊不堪,难以修改和检查。

@1-2-3
哎,学历并不代表实际的能力,有些时候可能是因为实际环境的影响而造成学历的耽搁了。重要的还是自己的能力和学习的方法,我并不看好懒惰的研究生。也并不鄙视那种勤奋钻研的低学历的人。
由于我们属于机电系,所以这里的人不是专业写软件的,所以对软件方面的了解很少,很多人都是从研究生一开始才正式使用编程语言的,而我自己例外,从小就对编程感兴趣,虽然没有参加过什么算法大赛之类的,但实际编程经验还是比较丰富的。
以前曾给实验室全体做过.NET的讲座,给了他们.NET的感性认识。也给老板写过一篇VC6和VS2005的对比,陈述了我的观点,但感觉都不了了之。毕竟他们都不是做软件的,更看重什么时候能够完成,是不是正在加班加点的做,而不是考虑效率,不是考虑可维护性这些。反正,毕竟只有三年,混过就对了。
现在已经和团队中马上就毕业的一个开发人员达成共识了,他说这个项目要叫给我做了。我就只有自己处理了,按照我的想法。

@Enzo
感觉是根本没有什么架构。经验的问题。

@neoragex2002
主要老板时间不允许,而且控制部分的代码目前还无法调试,因为整个机器还在外地,当地没办法调试。当然如果给我足够的时间,我依然可以办到。

@二手的程序员
现在的小程序,如果开发给自己用用,还是C#这些方便,拖拖窗体,几句话搞定。
不可否认,如果不是由于历史原因,新开发的大型程序,还是用更高级的语言来做。

@dc
“作为开发人员,只能尽量丰富自己各方面的能力,以适应各种状况,你认为.NET好,他还说Java好,怎么办?”
恩,对于目前所需要开发的东西和平台来说还是只有用.NET最适合。Java并不适合用于做工控。
“而是项目管理混乱和开发人员参差不齐造成的。就算你用.NET开发,如果还是这样管理模式,或者根本就没有管理,不出几年,开发人员一多,各种问题依然会接踵而至。”
对,目前除了我项目还有两个人在做,一个博士生,和一个即将毕业的研究生。所以其实只有两个人来做。研究生的项目很麻烦,历史遗留的代码要交给后面人来做,实在是很困难。两年三年一个轮回,越弄越糟,以至于最后还是流产。
由于我们老板和学生都不是学软件的,软件开发经验也很少,所以他们不懂得怎样去管理这个项目。在我去微软实习之前,我也是单枪匹马一个人单干了很多年,当然在这单干的时间内学会了很多,也尝试到了各种痛苦。但在实习之后,明显对团队软件开发有了更清楚的认识。再回来看看现在的实验室的管理模式,只能摇摇头。思考着,怎样能够做得更好,思考着……
    回复  引用  查看    

#9楼 [楼主] 2007-11-01 11:01 Dream world 梦想天空      

@阿里
能举个API的例子么?不知道你要在托管的函数里面使用还是要在Form.h里面声明?
    回复  引用  查看    

#10楼  2007-11-01 11:27 木野狐(Neil Chen)      

同意楼主,要跟上潮流,折腾老东西总是痛苦的。
    回复  引用  查看    

#11楼  2007-11-01 12:19 沙加      

同情楼主
    回复  引用  查看    

#12楼  2007-11-01 12:27 zz土 [未注册用户]

没有办法,怪中国的企业没有实力用C++/C/汇编写出VC++6,Net,OS...只有跟着别人走了...
别人用VC+6,是以前的人为了利用现有的投资,用.Net是现代人利用现有的投资,本身就是矛盾的.
还是要怪微软利于C++/C/汇编写出些什么C#.Asp.net,.Net...产品来挣你的钱,而我们的争议都是建立在别人的产品上的...
如果大家思想一致认识问题的本质,我想你会理解用VC++6的同事,而用VC++6的同事也会理解你...
    回复  引用  查看    

#13楼  2007-11-01 12:49 Justin      

帮你顶!
    回复  引用  查看    

#14楼 [楼主] 2007-11-01 12:57 Dream world 梦想天空      

@zz土
不可否认,这些产品做出来还是很有用的,很多推进了业界的发展,要不然如今博客园不会存在。如果固步自封,不学习先进的技术,还停留在MFC 6阶段,我相信国家还是无法进步的。用开发工具的道理起始和从98升级到XP的道理一样,总是要进步的。
顺便说一句,如果用VC++6肯定是盗版的,但用VS2005不一定是盗版的,微软有专门的教育版可以用,而且是免费的,这也是优势。如果实在不想为IDE掏钱,那好,用SDK吧,反正也一样。
    回复  引用  查看    

#15楼  2007-11-01 16:37 zz土 [未注册用户]

用MFC...或你用.Net也不代表国家进步,总之,你用别人产品来生产应用程序总是一种不好预兆.幸好是一些普通的应用,什么网站呀,什么桌面程序呀...生活层面的.
在核心方面,如国家机密的应用方面,我想还是'倒退'的技术好.
当然你说的VC6与.Net当然是用.Net好啦
不过你没有看明白我的意思.同事之间有学不同技术的,要相互沟通才能把工作做好
    回复  引用  查看    

#16楼 [楼主] 2007-11-01 20:11 Dream world 梦想天空      

@zz土
呵呵,话不能说得太死~
    回复  引用  查看    

#17楼  2007-11-02 10:37 小呆子 [未注册用户]

楼主根本就没有搞清楚问题出在什么地方。看你的描述有多少东西和VC6有关系啊,都是人为造成的。
为什么很多问题还要纠缠在编程工具和编程语言上呢,又不是编程工具在写程序,是人在写程序。

不要把自己局限在某个工具某个语言上,不要做语言和工具的奴隶,这才是engineer和Coder的区别
    回复  引用  查看    

#18楼  2007-11-02 12:26 Cure      

不要把前任的错误作为现在项目困境的理由,而且抱怨也没有用,项目需要的不是新的技术,架构,需要的是积极的心态。
    回复  引用  查看    

#19楼 [楼主] 2007-11-02 14:33 Dream world 梦想天空      

@小呆子
生产力的进步总是和生产工具的进步结合在一起的。语言不重要,我不是还用C++/CLI么?那请问作为一个工程师就不考虑用什么工具么?非也,当人和工具天人合一的时候,才是最完美的!
@Cure
呵呵,当现有的新技术已经很容易满足需要的时候而现在用很古老的技术开发,当目前的架构已经乱套的时候,我想,积极的心态也只能凑合凑合吧。
    回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
向地震灾区捐赠爱心