战略、架构、设计、编码

来源:互联网 发布:电脑超频软件 编辑:程序博客网 时间:2024/05/01 20:45

战略、架构、设计、编码
 
不得不说,这是一个很大的话题,即使是任何其中一个放出来讲,都是TB级的储量量。我在这里讲的,是以我多年经验来做的一些零碎的总结,试图从一个开发者的角度去理解这四者之间的关系。本文没有任何赞扬某一点的意思,也不存在贬低某一职位的想法,如果读者能从中读出些少不爽,也只是现实中存在的问题,跟我的思维没有任何关系。
 
首先我不得不说,尽管已经在IT界摸爬滚打七八年,也努力过也奋斗过,但到现在为止至少我认为还是个彻头彻脑的失败者。不为别的,只因为到目前为止我还是一名开发者,是处于编码的位置。很多人把软件工程用建高楼来作比喻,我也不例外,因为现在也只有楼价才能让人兴奋觉得有意义了。软件设计就是要建一幢楼,根据楼的定位用途,是作商用还是民居还是商住两用,架构师架构了这样一个模型,先把楼的形状、大小、面积、高度、基础设施、每一层的用途确定下来,设计师拿到这样一个模型,开始进行楼层的装修设计,而编码者,在这些设计的基础上盖楼,进行地板、墙面的装修。
 
架构就是要定义这样的一个软件模型,定义这个软件分几层,每一层用什么技术实现,可以怎样扩展部署,怎样为业务的实现提供基础设施服务,这种服务包括编程元素(元数据)如何定义,事务管理,业务对象管理,还可能包括磁盘文件读写、异常捕捉、日志记录、安全性管理、配置管理、缓存管理、线程服务、服务器和客户端通讯管理、国际化服务,如何提供框架来限制开发人员的行为,让他们按统一规范、统一方向进行编码实现。架构师要架构好整幢大厦,如果架构出了问题,那就是里面的单元设计得再好,装修得再豪华,就算里里外外都用金子贴成的,只要它的指标达不到要求,那整幢大厦就不能用了。软件也是这样,如果基本指标达不到要求,比如系统性能、容量、安全、扩展、稳定、维护方面达不到要求,那是完全不能用的。好的架构还有一个特点,那就是不能让开发者随心所欲,为所欲为,例如不能在jsp中直接调用DAO进行数据操纵,也不能在DAO层写业务逻辑代码。这些都体现在细节方面,对一个企业级的软件来讲尤为重要。比如我写一个基于hibernate的DAO层框架,我就没有提供直接的jdbc调用,有不少开发人员因为比较熟悉sql语句吧,遇到困难就说要开放jdbc调用,其实sql语句能做的,hql也99%能实现,实现不了的,说明我们的思维太超前,超前到出问题了。很多时候并不是说hql语句做不到,而是由于我们的惰性影响了我们的行为,不想花时间跟精力去找相关的解决方法。如果放开jdbc调用,必然会影响缓存跟后面的数据库无关性设计,软件架构就起不到限制的作用了。有点软件可以发现UI层直接写sql的现象,也发现了sql写在逻辑层里的东西,更扯的是 DAO层里面出现UI的东西,比如拼前端标签,这些都是没有架构好的直接体现。
 
以下抄录了架构师的分类,出处太多原著不得而知,请原著原谅。
架构师细分为以下几种:平台架构师:这里的平台其实包括两个平台,一个是系统平台,也就是负责搭建多个系统整合的系统应用平台;另外一个其实是基础平台,是专门负责搭建基础技术平台;两者其实区别蛮大,也经常容易被从业人员混乱。举个简单例子,金蝶有平台架构师一职,但是金蝶BOSS应用和金蝶中间件两者招聘的对象和技术要求是截然不同的。应用架构师:其实应用架构也就是我们绝大多数人理解系统架构师,它主要是负责系统的开发框架及基本结构层次的建设。但是,对于这样一个职责,千万不要以为就是struts + spring + hibernate这样的组合,如果是那样,这架构师也未免太容易当了吧。一个好的系统架构是必须充分理解和融合相关业务应用的行业以及运营背景的。这个话题我们可以另外细谈。业务架构师:业务架构其实已经开始脱离技术层面了,但是它要求架构师有跨越多系统的大局观,去整合和组织不同系统的技术平台与交互模式。其实这个职位的未来也就是CIO了。网络架构师:过去,我们可能听的最多的是网络工程师。不错,一个优秀的网络架构师必须有足够的网络技术基底,并且它的关注点也是系统的基础架构。比如说如何搭建并优化集群环境,如何构建基于云计算的系统应用与部署等等。它对于像淘宝、腾讯这样的互联网公司是极其重要的。一个优秀的架构必须满足以下几个条件:1.必须充分融合并满足系统运行的环境特点(包括业务环境、硬件环境、网络环境等等)。2. 它能适用未来一段时间由于环境变化带来的扩展和改变。3.它所代表的架构思想可以成为被复用的模式,从而在相似的领域中获得复用。一个优秀的架构师也必须满足以下几个条件:1.充分认识系统所涉足环境的特点。2.有比较扎实和全面的技术功底,能够比较充分认识所应用技术的特点(包括优点、缺点)以及相关的应用场景。3.有自己比较鲜明的设计理念,并能将其优势充分融入系统的架构设计中。
 
如果说架构决定了软件可不可用,而设计跟编码决定了软件好不好用。好的设计要在一个好的架构上进行,如果软件架构本身都有问题,你就是设计得再好也是白搭。就像一幢大厦,里面就算装修得再漂亮再好,只要大厦存在倒塌的危险,那就不能使用了。设计就是在架构的基础上针对某一业务功能进行细分,进行相关实体的建模,相关业务流程的梳理,相关数据库模型的整理。比如一幢大厦,哪里要做超市,就要设计成超市的样子;哪里要做成购物商场,那就设计成商场;哪里要做办公楼,就要设计成办公楼的样子;哪里要做成民用住房。。。。。。对于高效的软件工程,良好的设计是关键,一个设计得好的软件系统应该是可直接实现和易于维护、易懂和可靠的。设计得不好的系统,尽管可以工作,但很可能维护起来费用昂贵、测试困难和不可靠。
 
编码是处于最低层的工作,但是也经常容易被自己高估。当然,任何软件系统都是由一行一行的代码构建而成的,一个合格的程序员就是要写出高效简洁的代码来实现某一项功能。编码是设计和架构的基础,想要成为一个好的设计师或架构师,首先要成为一名优秀的程序员。开发人员有个很大的通病就是追求完美,追求极致,而在追求的过程中往往耗费掉自己大量的时间和精力而无暇去顾及其它。其实,开发系统要适可而止、见好就收,程序没有最好只有更好,不可能搞到完美为止,特别是对于业务方面的编程开发就更是如此,对于系统、内核级别的代码又另当别论。程序员需要挤出点时间来学习,学习设计、架构,学习新技术新知识新领域,并尝试与不同的人进行交流沟通,扩展自己的关系圈。
 
小米创始人雷军说过,“离开金山对我是一次重创,心理上的创伤超过了大家的想象。我这个人很努力,很勤奋,带着一帮和我一样的人,打了这么多年江山,整成这个样子,我肯定不服气。要是我没努力也认了,但是我非常努力。二十多年,这么多的机会,一个都没捞着,我问自己为什么,问题肯定出在我身上了,那我的问题是什么呢?就是不服输。”逆势而为,虽百倍努力后会略有成功,但也只是小成;顺势而为,看起来不够有情怀,但这是成功的真谛。这里的势,其实指的就是战略。战略是个很玄的东西,是非常高层次的产物。像地产界的老大,他不需要知道怎么砌砖,怎么设计高楼,怎么一层一层地往上盖;他只需要拿个地图画个圈,或者站在高处指着一块土地,他选择的地方,就是以后BCD商业中心。位置选择不好,哪怕你请多好的设计师,建筑得再宏伟,也成就不了商业中心。战略决定了一切,搞软件亦是如此。如果战略不对,就算你开发出再美轮美奂的软件,也没有人会去使用。程序员的人生战略很重要,比如你是进入传统行业做ERP,还是进入互联网做电子商务,当然,行行出状元,只是成功率和付出的汗水,肯定不一样的。很多时候,到了一定的年纪就会发觉,选择,确实比努力更重要。选择,也在乎你的战略,懂得战略的程序员,最后才能是TABLE类的领军人物,TABLE指腾讯、阿里巴巴、百度、雷军系、周鸿祎。
 
当然,这些都是一个失败者----严格来说是一个不成功者对程序员生涯的个人看法。失败者,我认为比不成功者要高级,就因为他曾经追求过成功。