我对软件架构的一些看法和思考

做了几年软件开发,对于各种各样的软件架构稍微有一点点的了解,对于如今各种各样的技术也有一些自己的看法,包括对于面向对象的软件开发和面向过程的软件开发也有自己的一点观点,下边我来谈谈我的想法
我是做Java起家的,所以一开始接触的就是面向对象的思想,后来了解的越来越多,接触的代码也越来越趋向于底层,在架构上也开始慢慢入门。
谈谈计算机的发展,本质上高度抽象的,将现实世界中的事务最终抽象为0和1,怎么去抽象呢?方法就是去编程,从开始的机器语言逐渐发展为汇编语言然后更加高级一点的C语言出现了,到此编程其实已经变的非常简单了,可以用比较容易理解的语言和计算机进行沟通,更多的事情交给了编译器,然后就产生了更高级的语言更加接近于现实思维的语言,如:Java,C。走到这一步其实很多的工作都已经交给了虚拟器去做,而虚拟器是什么开发呢?C语言,这样编程就变的更加的简单了,以至于各种各样的培训机构如雨后春笋一般的出现,因为少了很多抽象的思维编程变的更加的简单,编码的成本下来了,那什么上去了呢?对于硬件的成本上去了。其实这和编码的道理是一样的,底层做的工作越多,上次做的工作必定越少,随之而来的就是大量的封装,转换必然会对硬件开销的增加。
其实软件开发到底难在什么地方呢?其实是难在需求上,提出一个问题然后选择一种合适的方法去解决,这是一种方法论,和实际生活就一样了。其实做软件开发和做一道数学题差不多,有时往往有很多的方法,但是肯定有一种方法是最简单的,最高效的。
好了,现在说点具体的吧,在选择技术的时候一定不能武断,一定要弄清楚用户的需求,以及其潜在需求,尽可能的根据工期来选择技术,软件开发没有银弹,没有一种通用的解决方法,只有最适合的,尽量的去接近最优,扩展性这个东西其实很笼统,没有一种技术可能满足无限的扩展,所以一旦开发一套系统必须明确其系统的边界。如果这个边界定义不好以后会很麻烦。天气预报的系统再怎么使用设计模式,也不可能成为导弹控制系统,这一点一定要明确,扩展只是在一个角度上去考虑可扩展,比如说数据存储容量,计算速度等。做技术一定要知道一项技术的局限性,不要认为这项技术是一种通用的解决方法,举个例子,现在比较流行的DDD,知道什么是DDD,DDD开发方法适用于什么,DDD其实只是一种方法论,主要应用于对问题的建模,对问题的分析,是一种架构的思想。举个例子来说,对于数据存储,DDD倾向于使用面向对象的思想去组织数据避开关系型结构化数据,因为关系型结构化数据和面向对象的思想有很多抵触,但是从另一个角度去思考,恰恰缺少了对数据的抽象概括,结构化数据在很多场合还是非常重要的。
SQL和NOSQL,大家多去想想他们的局限性,适用的场合。其实就是关系数据和非关系数据,只不过目前关系型数据技术在性能上有一定的瓶颈,关系这个思想并不落后,其实是对数据组织结构的一种高度抽象,更加通用。
总结一下吧。其实现在才感觉自己刚刚入门,软件开发的奥义完全可以上升哲学的角度,不知道大家有没有静下心来思考一下呢?还是沉迷于眼花缭乱的技术当中呢?

现在比较流行的DDD,知道什么是DDD,DDD 开发方法适用于什么,

讲的非常好..更多的是多接触一些大型企业的架构..数据库的设计...

向楼主学习.

我认同大哥的观点,同时在我看来:在需求,人,技术三者之间;人充当的角色是最重要的;他是一个美丽或是伟大结局的缔造者。我讨厌为某一个技术或是思维去论战,但我喜欢看别人去争去辩,而我还能虚心在旁边“谋利”,为日后的升华做积淀。做牛人后面的人,同时又能担当好这份角色,不失为一个选择。个人不成熟见解,心能受者,愿与之共勉。

写得不错,希望每个人都从自己角度来理解软件设计,才是真正掌握设计,条条大路通罗马,虽然最终井冈山会师,但是各自来的路线不一样,讲给后来者听,就百花争艳了,给不同人不同启发。
[该贴被banq于2010-04-26 09:22修改过]

深有同感。
选用什么技术,采用什么架构,最终都是要匹配特定的应用场景的。

说的不错,每一种技术都有它的适用场景,没有万能的。 明确需求是根本, 知晓技术的局限性, 才能更好的技术选型,更好的满足需求。