编写一个商业应用软件或者仅仅小范围流通的自动化办公软件抑或其他,在设计或者实现中会考虑种种,这篇帖子我想以我所学,讨论一下这个问题,如有疏漏错误,欢迎指正。
首先,需求分析明确需求之后,就开始进入这一繁复阶段。我们会基于以下种种因素考虑使用什么语言:
1. 应用的展示形式:虽然桌面开发和网页版应用开发的界限逐渐开始模糊,但对于开发来说,应用的展示形式还是会决定了你后续的很多技术细节的,语言知识一方面,各种平台上应用都有不同的开发技术开发语言,以网页版开发为例,LAMP下的HTML+CSS+JavaScript+PHP/Python,微软常见的ASP.net等等(Ajax不是语言,是融合了多种语言的一种技术)
2. 公司或者项目组历史或者行政因素:一个团队创立之初选择什么语言,再加上团队内成员的使用习惯等,后边的项目会将这种习惯沿承下来。这会是项目选择语言时一个很大的决定性因素;而行政原因更加直接,例如微软是不太会同意选择Java做为其项目开发语言的。
3. 软件特殊需求。例如跟硬件或软件执行效率相关,大都会选择C/C++;对于便捷开发同时兼顾效率安全等等的一些项目更倾向于选择C#, Java等类库丰富集成化开发环境友好的语言;而小范围内使用的某些要求不太高或者要求开发进度的开发或者测试更倾向与使用类库更加丰富的解释性语言Python,Ruby等。
当然以上讨论这些因素不能以偏概全,语言无所谓好坏之分,一个语言能做到的其他语言应该都能做的到,要不然该语言早就死掉了。所谓语言之争就是程序员对语法语义的习惯,学习周期的对比,语言本身的类库是否丰富等等一种评判。而在实际情况下相当多的项目中并不会单独只使用一种语言,有很多情况下我们会使用Python编写界面,C++实现后台操作;抑或者以Java,C#为基础,但要求执行效率高(比如图像处理等)的部分使用C++;抑或考虑到软件复用技术为减少代码量而使用特定语言调用另一种语言编写的COM组件等等等等(当然这就涉及到语言之间交互的问题)。这一切的一切都说明,语言这东西,存在就是理由,存在因为理由,技术发展到现在编写一个语言就跟自定义一个控件一样,已然很简单,而从汇编开始在漫漫长河中多少语言沉淀成为了”死语言“,这些存活下来生命力已然顽强的语言一方面说明了他们足够优秀,另一方面也说明它们自适应迎合了技术的发展方向。 这些东西决定之后会考虑是否需要数据库,使用什么数据库等等,又是一系列的选择,还是那句话,存在就是理由,有这么多选择项可供选,这仅仅是一个幸福的烦恼而已。
大的方向选定之后,考虑实现细节,从架构开始,选择什么模型BS/CS,要不要分层设计,分层设计层与层之间是继承还是耦合,会不会使用到特定的设计模式等等。这是架构师的活,一个优秀的架构会给开发和后期维护带来很大的便利。关于模型或者模式之类的东西,有些人会把它看得很重,看得很高,然后想得很牛逼。它其实是对一些优秀工程实践中的一种总结,比如你的应用会考虑只允许存在一个实例那就考虑单件模式,多派生子类问题会考虑工厂模式,与原有代码配接会考虑到适配器模式等等。它和管理学类似,所谓管理学,其实是对社会公司或组织管理模式一种概括总结,所以牛逼的管理学大师一般都是工程师而不是学者。脱离了实践去谈模型模式Demo代码,是不会体会到它们的伟大之处。这些东西我们仍然可以学,可以了解Demo,而且这是必须的,但更重要的是在实践中能够想到去用,等真到了那个高度,你完全可以创立出一种属于自己的模型模式,供人膜拜。
而后就是程序员的活了,考虑实现细节。而在实践中所考虑的所谓”技术“,就很大程度上跟语言没什么关系了,不要在纠结于语言哪个牛逼这类听着就很二的问题了。在这一块程序员会考虑很多东西,诸如:
1. 进程通信:进程间通信IPC,大型商业软件,病毒,杀毒软件等等都会涉及进程间通信问题吧,这在开发中是无法回避的东西,也是对效率和安全影响最大的一处,处理不慎会严重影响软件质量。进程间通信总结起来会很庞大。
2. 异步编程: 避免UI”假死“或者软件执行效率而考虑多线程或者异步编程,而在异步编程中又要考虑多线程同步等问题;这是很大一块内容,不同语言的实现机制不同,以C#为例,为了便利程序员微软定义了一系列的多线程操作模式和同步方法,这一块回头单独写一篇介绍。
3. 内存管理:硬件限制和效率安全问题要考虑内存管理,延迟启动和冷启动热启动等,内存管理也是一块很大的内容,这涉及到内存泄漏,C#里垃圾收集等等这一块也单独写一篇介绍,而延迟启动和冷启动热启动这个问题总被人忽略,但这个块东西最能够影响用户体验,说到这我想提一下迅雷,当年我是迅雷的忠实用户,但最受不了它启动的时间,真怀疑它软件开发时有没有考虑这些东西,所以就给卸载了一直用简易版迅雷。
4. 语言之间交互:前边说了,很多软件都不是同一个语言写出来,这就涉及到多语言交互问题,不同语言语法语义不同,技术细节不同,想要创建一个共同的协议进行交互,这里边要考虑的问题很多,比如边界(boudary)安全问题,接口效率问题,内存管理问题。
5. 远程方法调用:其实这块我只是想说windows Service和Web Service,实际应用中服务随处可见,服务有普通应用所不及的特点,把这个放在这提一下貌似不太合适,放在这里提主要是感觉身边的程序员关于服务这个东西很陌生,也不太关注。
以上技术有交叉的部分而且只是陈列了部分内容还有好多暂时没有考虑到以后补上,这一切的一切都是为了自己所开发的应用安全性,健壮性,效率,可扩展性,这才是所谓程序员进阶的第二阶段,到了这一步你已经摆脱了语言的束缚,能够开始翱翔于真正的技术的天空了。 在实际开发中不仅要关注这些,还会从工程方面考虑问题,诸如:项目团队管理,进度管理,代码规范,文档规范,软件测试等等等。
又虎头蛇尾了,写这篇文章主要对这几年尤其是这段时间所关注的东西的一种总结,但写着写着就忘了,所以越写越短。而关于网页端的东西ASP.net Ajax Jquery的东西,只是刚刚涉猎,没敢提太多。以下链接主要针对C#,关于这篇文章中提到的一些东西的技术细节,有兴趣可以关注以下。
References:
垃圾回收:
http://msdn.microsoft.com/zh-cn/magazine/bb985010(en-us).aspx
http://msdn.microsoft.com/zh-cn/magazine/bb985011(en-us).aspx
http://msdn.microsoft.com/zh-cn/magazine/cc534993.aspx
http://msdn.microsoft.com/zh-cn/magazine/ee309515.aspx
http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae
http://msdn.microsoft.com/zh-cn/magazine/cc163528.aspx
http://msdn.microsoft.com/zh-cn/magazine/cc163392.aspx
http://msdn.microsoft.com/zh-cn/magazine/cc163316.aspx
代码交互及COM
http://www.cnblogs.com/salomon/archive/2012/05/21/2511335.html
http://msdn.microsoft.com/zh-cn/magazine/dd315414.aspx
http://msdn.microsoft.com/zh-cn/magazine/cc163361.aspx
http://msdn.microsoft.com/zh-cn/magazine/cc163494.aspx
http://msdn.microsoft.com/zh-cn/magazine/cc164193.aspx
性能问题:
http://msdn.microsoft.com/zh-cn/magazine/cc337892.aspx
http://msdn.microsoft.com/zh-cn/magazine/hh882452.aspx
线程,
http://msdn.microsoft.com/zh-cn/magazine/dd252943.aspx