web开发
php程序员应具有的7种能力
五 26th
php程序员应具有什么样的能力,才能更好的完成工作,才会有更好的发展方向呢?在中国我想你不太可能写一辈子代码的,过了黄金期,怎么办呢?希望下面几点对你会有所帮助。
一,php能力
1,了解阶段,您能写一些代码,因为那是在手册和google的帮助下,您才完成的。变量乱定义,N多函数不知道,做起事来很慢,想到什么写什么,代码写的比较乱,后期维护很麻烦。
2,熟悉阶段,经常查函数,手册估计也看过一,二遍了,常用的函数基本上您都了解了。后期维护给您带来了不少痛苦,您开始发现自己的代码有很多不足,开始思考如果改进自己的代码,如何站在项目的角度来规划自己的代码,而不是想到什么写什么,知道如何来减少冗余代码,使您的代码清晰,知道什么样的代码写出来让人看着舒服,基本的代码规范,已经形成。为了提高自己,会特意的去一些技术性的论坛,学习研究。
3,很熟悉阶段,本来我想写精通的,到现在我也不知道精通是到什么程度,也没有听到有人说自己精通PHP的,所以就用很熟悉了。这个阶段,我想您已经从面向过程进入了面向对象。个人觉得面向对象的最大好处就是,能使整个项目功能化,模块化,后期维护,改版,升级就很方便了。没有面向对象的时候,不也一样开发吗.这个时期,您已经研究过了一种或者几种框架,结合自己的实际项目经验,在脑子里已经能形成自己的一个框架,这个框架是最适合你的。并且能够将这个框架运用到实际的开发中去,以提高自己的开发效率。
如果您刚写代码的时候,就有人能约束你按OOP的思想去写代码的话,那您就遇到贵人了。当不好的代码习惯养成时,在想改就不那么容易了。
二,数据库能力
用php来做项目的话,用mysql是最多的了,其次是pgsql。因为他们二个是免费的。哈哈,以mysql为例
1,了解阶段,知道mysql是什么,能写一些简单的sql语句,能设计简单的表,知道如何使用数据库管理工具(如:phpmyadmin)
2,熟悉阶段,知道如何才能写出高效率的sql语句,了解索引原理,知道如何创建索引,会写一些储存过程,触发器等,能通过各种手段来分析,测试数据库,例如:利用mysqlslap来进行压力测试,通来explain来分析sql语句,通过开启慢查询来分析哪些sql语句真正影响mysql的运行,能利用dbdesigner4,mysql workbench为设计数据库,能在命令状态下,查询,分析mysql环境变量,来分析mysql的运行状态等等
3,很熟悉阶段,对于各有种存储引擎的原理非常熟悉,知道通过修改配置文件来,使存储引擎达到最优化,知道如何来优化数据库的最大连接数,知道怎么样来优化mysql的I/o瓶颈,为了项目的需要,向mysql数据库增加存储引擎或者插件,知道如何搭建数据库集群,并监控数据库的运行状态等等
三,html,css能力
php是脚本语言,我们用php大多数情况下是用来做网站的,慨然是网站,那肯定是离不开html,css
1,了解阶段,知道html标签是干什么用的,通过网络和手册能自主的写一些html,知道css是怎么回事,能在html中写一些简单的style等
2,熟悉阶段,能利用css来能设计一些简单的布局,可以将css单独的写成文件,熟悉css的语法规则,以及继承性等
3,很熟悉阶段,能够设计出很好的CSS,并且管理好这些CSS文件,尽量减少冗余代码。知道如何写出有利于搜索引擎搜索的代码,例如:title,h1,h2权重比较高的。等
对于php程序员来说,并不一定要你去设计页面,但是给你一个页面,你要知道如何来修改CSS文件,html就不要说了肯定要掌握的。
四,js能力
如果提高用户体验,是一个网站能留住人的重要标志。这个就要用到JS了
1,了解阶段,了解JS的基本语法,知道如何去调试这些程序,能写一些简单function等
2,熟悉阶段,对JS的语法,函数,正则等已经熟悉了,能利用js来写一些特效,并且发现用JS写特效,是比较累人的一件事,开始尝试jquery,prototype,并对jquery,prototype基本语法有所解,个人反对不学JS,直接入手jquery,prototype这样的JS框架。
3,很熟悉阶段,在框架的帮助下,能熟练的用OOP的思想的来写代码,而不是一个个function累加,熟练运用jquery,prototype的ajax,或者是网上一些ajax框架,如(ajaxrequest),不在直接写active控件了。能够利用网络资源,来完成各种特效。
对于大型公司来说一般都是有js程序员的,小公司基本上没有,要么交给程序员来做,要么交给美工来做。美工一般都不是程序员,也没有编程基础,所以学JS比较吃力,但是学jquery比较容易的,因为css对html进行控制的方法,和jquery对html的控制方法基本上差不多(css,jquery的相同之处),所以有好多公司把特效交给美工来做。
五,apache等能力
个人觉得,到目录为止,跑php的话用apache的人还是最多,以apache为例
1,了解阶段,不管是linux下,还是windows下,能够安装配置apache,知道如何添加php添模,如果面试官问你,apache为什么能解释php代码,你怎么回答呢。对apache的基本配置有所了解,对于启动中遇到的问题能够解决等
2,熟悉阶段,知道如何向apache中添加新的模块,如果如何进行url重写,防盗链,进行IP限制等
3,很熟悉阶段,知道如何利用apache来缓存图片,能利用apache来做负载均衡,并且知道利用ab命令来进行压力,通过工具对日志分析,经过分析来对apache进行优化,知道如何搭建多个虚拟主机;对apahce的常用模块都有实际操作经验等
对apache进行监控和维护,一般是运维人员或者是项目经理来做的,个人觉得最好还是了解一点,因为这样您才不会那么容易被忽悠,对于自己将来的转型也是非常有必要的。
六,linux系统
为什么要掌握linux系统呢?用php写的网站大多数运行在linux或者freebsd下的,掌握linux系统对自己将来的发展还是比较有好处的。
1,熟悉阶段,会装linux系统,对系统的常用命令能够熟练运用等
2,运用阶段,在linux系统下,能够安装配置apache,php,mysql,svn,memcache,squid,lvs等一些web项目必要的工具,能够通过日志分析其状态等。对shell要有所了解,并能够写一些简单的shell脚本等
七,勾通能力
这一点非常重要,并且被越来越多的人所忽视,其实做程序员挺杯具的,根电脑打交道的时间是最多,也许是因为这样吧,勾通的时候,是比较费劲的,也有可能是被程序的严谨性束缚了大脑,说出来的话,太专业,可能其他人听不懂的。所以平时多和他人交流,特别是跟非技术人员多勾通,多站在对方的角度来思想问题,这样的话,我想勾通起来会容易很多。
From : http://blog.51yip.com/php/1153.html
PHP程序员突破成长瓶颈
五 17th
From:http://blog.zuowj.com/?p=408
身边有几个做PHP开发的朋友,因为面试,也接触到不少的PHP工程师,他们常疑虑自己将来在技术上的成长与发展,我常给他们一些建议,希望他们能破突自己,有更好的发展。
对PHPer的片面划分
a: PHP 爱好者 (半个PHPer)
b: PHP 初学者 (PHP Beginner)
c: PHP 初级程序员 (Primary PHP Coder)
d: PHP 中级程序员 (Junior PHP Coder)
e: PHP 高級程序员 (Senior PHP Coder)
f: PHP 工程师 (PHP Programmar)
定义: 正在以PHP程序为主要工作,并正在进行新产品的研发.可以同时使用C+/perl等辅助提高PHP程序性能的人是PHP工程师.
有自己的代码库和快速开发工具…
具体到PHP中级程序员之后,PHP程序员就开始选择发展方向进行分化了.能够到这一步的人,基本都对自己的职业规划有清晰的认识
PHPer的共同特点:
0: 会电脑,能上网.
1: 知道w3c标准,
2: 会html,会JS,会PHP.会MySQL.
3: 知道linux.见过linux运行.
PHP工程师面临成长瓶颈
先明确我所指的PHP工程题,是指毕业工作后,主要以PHP进行WEB系统的开发,没有使用其的语言工作过。工作经验大概在3~4年,普通的WEB系统(百万级访问,千成级数据以内或业务逻辑不是特别复杂)开发起基本得心应手,没有什么问题。但他们会这样的物点:
- 除了PHP不使用其它的语言,可能会点shell 脚本。
- 对PHP的掌握不精(很多PHP手册都没有看完,库除外)
- 知识面比较窄(面对需求,除开使用PHP和mysql ,不知道其它的解决办法)
- PHP代码以过程为主,认为面向对象的实现太绕,看不懂
这些PHPer 在遇到需要高性能,处理高并发,大量数据的项目或业务逻辑比较复杂(系统需要解决多领域业务的问题)时,缺少思路。不能分析问题的本质,技术判断力比较差,对于问题较快能找出临时的解决办法,但常常在不断临时性的解决办法中,系统和自己一步步走向崩溃。那怎么提高自己呢?怎么可以挑战难度更高的系统?
更高的挑战在那里?
结合我自己的经验,我列出一些具体挑战,让大家先有个感性的认识。
高性能系统的挑战在那里?
- 如何选择WEB服务器?要不要使用fast-cgi 模式
- 要不要使用反向代理服务?选择全内存缓存还是硬盘缓存?
- 是否需要负载均衡?是基于应用层,还是网络层? 如何保证高可靠性?
- 你的PHP代码性能如何,使用优化工具后怎么样? 性能瓶颈在那里? 是否需要写成C的扩展?
- 用户访问有什么特点,是读多还是写多?是否需要读写分离?
- 数据如何存储?写入速度和读出速度如何? 数据增涨访问速读如何变化?
- 如何使用缓存? 怎么样考虑失效?数据的一致性怎么保证?
高复杂性系统的挑战在那里?
- 能否识别业务所对应的领域?是一个还是多个?
- 能否合理对业务进行抽象,在业务规则变化能以很小的代价实现?
- 数据的一致性、安全性可否保证?
- 是否撑握了面向对象的分析和设计的方法
当我所列出的问题,你都能肯定的回答,我想在技术上你基本已经可能成为架构师了。如何你还不能回答,你需要在以下几个方向加强。
怎么样提高,突破瓶颈
如何你还不能回答,你需要在以下几个方向加强:
- 分析你所使用的技术其原理和背后运行的机制,这样可以提高你的技术判断力,提高你技术方案选择的正确性;
- 学习大学期间重要的知识, 操作系统原理,数据结构和算法。知道你以前学习都是为了考试,但现在你需要为自己学习,让自己知其所以然。
- 重新开始学习C语言,虽然你在大学已经学过。这不仅是因为你可能需要写PHP扩展,而且还因为,在做C的应用中,有一个时刻关心性能、内存控制、变量生命周期、数据结构和算法的环境。
- 学习面向对象的分析与设计,它是解决复杂问题的有效的方法。学习抽象,它是解决复杂问题的唯一之道。
“这么多的东西怎么学,这得学多久呀” ?
如果你努力的话,有较好的规划,估计需要1~2年的时间
关于具体收入水平
总的来说因为这几年PHP培训班的加多,大量PHP新手开始搞乱市场,所以很难说清.在此贸然写出有误导之嫌.而且收入水平和所在地区有很大的关系,例如重庆的同水平PHPer肯定比北京的工资低.但在重庆省着点花钱反而比北京剩的工资多.
不过,PHP的市场确实在逐步混乱,目前因为培训班/大学选修课等原因,初级PHPer大量增加.故初级PHPer的工资市场有步asp呈现白菜价的趋势,但高级PHPer仍然极为缺乏.
但我认为:工资水平和实际技术水平基本成正比,目前业界信息透明,且到目前位置高端PHPer的圈子仍然极小.大家交换信息极为方便.如果PHP水平不高,但拿到高工资的概率不高.即使PHP技术差能拿到高工资也不能长久.
关于其他
1 PHP程序员从中级程序员阶段就开始分化
具体方向根据公司性质,工作条件,自己的兴趣等不一而同.因此需要擅长的详细技能也不太相同
例如: 公司使用 joomla 构建网站, 这就要求程序员必须精通joomla. 如果公司使用自研CMS+discuz构建网站,这就要求程序员能够熟练进行DISCUZ的二次开发.强行要求程序员精通这精通那,意义不大.
到高级程序员开始.PHP程序员由于自己的职业经历.肯定会有自己的专攻方向,有人擅长大负载下程序开发优化,有人擅长项目快速开发.而到这个阶段,如果PHP程序员还需要看这篇文章规划自己的职业生涯.那么请自己列出自己擅长的PHP技术.并选择一种最擅长的技术专攻.
2 关于coder和programmar.
字面上理解第一个是编码员,第二个是程序员.实际因为国内名词的混乱.第一个大多以程序员称呼,第二个目前大多处于项目核心领导层面.故本文暂以工程师称呼.
coder 是进行少量创新的,大量重复工作的人.
programmar 是进行新技术摸索开发,并实际领导/带领大中型项目开发的人
3 关于 C++ . PHP初期的语法(php3/4时代)和C几乎一样
但到一定深度之后.有些PHP的特性需要实际阅读PHP源码才能理解(相关文档不全或者不好找到).有些实际项目功能使用C++开发远比PHP效率高.
比如我现在做的项目需要爬虫持续海量抓取,当带宽足够的情况时,纯使用PHP实现效率不高.所以必须使用C++. 所以C++到需要用的时候自然而然的就要用了.不过如果有C/C++的基础,学习PHP要轻松很多.
关于架构师
九 27th
在定义过体系架构的内涵之后,我们现在将目光转移到对其创造物负责的角色上面——架构师(此处特指开发环境架构师)。架构师的角色被 认为是任何一个开发项目中最具挑战性的角色。从技术的角度来看,他们是项目的技术领导者,并且最终承担项目成败与否的责任。IEEE 1471 标准将架构师定义为“负责系统体系架构的人员、团队、或者组织”。
尽管架构师应当具备特定领域非常深入的技能,但是作为项目的技术领导者,架构师更需要具备的是广博而非深入的技能。在本小节中,我将讨论适用于所有类型架构师的特点,其中自然也包括开发环境架构师。
鉴于架构师需要具备广泛的技能,所以架构师的角色往往是由一支团队而不是某个人扮演的。这样的话,技能被分散到一群人身上,每个人具备自己的经验。所以在本文中,“架构师”一词是指角色,这个角色是由一个人或者一支团队所扮演的。
[团队] 是指具有互补技能的一小部分人员,他们具有共同的目的、实现目标和分工方法。 8
特别地,开发环境架构师往往利用具备不同技能的专家(例如配置管理主题专家)来增强体系架构团队的实力。
如果架构师的角色是由一支团队来扮演的话,那么找到一位首席架构师就是一件非常重要的事情,他需要负责版本控制和团队协调。如果没有这种团队协调的话,团队各个成员所生产出来的体系架构就有可能是非内聚的,或者团队无法做出有效的决策。
首要的一点是,架构师应当是一位技术领导者。这就是说,除了具备技术技能之外,架构师还必须具备领导能力。领导能力既可以在公司的职位中表现出来,也可以在架构师所展现的素质上面表现出来。
就 公司中的职位而言,架构师是项目的技术领导者,并且应当具有做出技术决策的权利。另一方面,项目管理者更加关注从资源、进度和成本等方面管理项目计划。打 个电影行业的比方,项目管理者就是制片人(确保物资和人员到位),而架构师就是导演(确保拍摄影片的质量)。结果是,架构师更应当在做出创建体系架构的决 策时成为鼓吹者。
就架构师所表现的素质而言,领导能力也可以表现为同团队其他成员之间的交互方面。特别地,设 计时应当通过例子来指引大家,并且显示确定方向的信心。成功的架构师是面向人的,并且花时间扮演团队中的导师和教练的角色。这对持怀疑态度的团队成员、项 目以及公司都会带来好处,这是因为最有价值的资产(人员)变得更加具有技能了。同样地,架构师需要非常关注有形结果的交付,并且从技术角度看必须扮演一个 驱动项目向前推进的角色。他们必须能够做出决定(在压力之下),并且确保那些决定能够被交流、理解、并且最终被确定。
如同掌握技术一样,我们也非常期待(有时是必须)架构师对业务域有很好的理解。
[业务域] 是指由该领域中的实践者所理解的一组概念和术语所表现的一套知识和活动。[UML 用户指南]
这样的知识将使得架构师能够更好的理解系统的需求,并且为之作出贡献。同样地,特定业务域往往同所要应用的体系架构的某组模式相关联。知道这种对应关系对架构师来说很有帮助。
更 加特别地是,开发环境架构师应当不仅理解开发环境的技术方面;而且对于这一环境将要应用到的业务域的相关知识的理解,更是对于开发环境架构师具有重要的帮 助作用。举例来说,金融服务方面的知识可以使得开发环境架构师知道在该环境中必须为某种调节标准提供支持,从而对后续的处理过程、工具的配置等产生影响。
尽管我们希望架构师是万能的,但是他们必须在需要的时候“深入进去”。这意味着他们能够承担系统的某一关键方面的设计,甚至是用某种程序设计语言表现一个关键的算法。
同样的原则也适用于开发环境架构师。举例来说,他们需要理解开发环境内部的安全性实现细节,从而确保对于敏感信息的访问是受到限制的。
在 架构师所应具备的所有“软实力”之中,沟通能力无疑是最重要的一个。有效沟通的方式有许多,架构师必须精通所有。特别地,架构师应当具备有效的口头、书 面、以及陈述技能。同样地,沟通是一种双向的活动。因此,除了是一位很好的谈论者之外,设计还应当是一位很好的倾听者和观察着。
具 备有效的沟通技巧是项目成功的基础之一。很明显,同涉众进行沟通对于理解他们的需要并且同他们达成一致意见十分重要。同项目团队进行沟通也是十分重要的, 这是因为架构师不仅负责向团队传达信息,而且负责推动项目的进行。特别地,架构师负责交流(和加强交流)系统的图景,从而使得这一图景被大家所分享,而不 仅仅是架构师自己所理解和相信的东西。
那些不能够在情况不明的、没有足够时间探索所有可能性的、处于交付的压力之下的环境中做出决定的架构师是无法生存下去的。这样的环境是客观存在的,成功的架构师接受这一现实,而不是试图去改变它。因此,架构师可能不得不修改或者放弃自己所作出的决定。
软件架构师的生活就是在半昏暗中不断地做出未达到最佳标准的设计决定。 9
无法做出决定将会对项目产生慢性地破坏。项目团队将会对架构师失去信心。真正的危险在于架构师没有对体系架构作出并且记录决策,然后团队成员将会自行解决,作出他们自己的(很有可能是不正确的)决定。
成功的架构师不仅要关注技术,而且需要清醒的知道公司的实力所在。从而他们能够确保同正确的人进行沟通,并且他们的项目在正确的轨道上运行。忽视公司的政策是十分愚蠢的。实际的情况是,有许多项目之外的因素影响着系统的交付,这些因素必须被考虑进来。
鉴 于架构师需要同许多涉众进行交互,所以他们需要具备谈判的技巧。举例来说,架构师尤其关注的是如何尽可能早的最小化项目的风险,因为这一点直接关系到稳定 体系架构所需要的时间。由于风险是同需求相关联的,所以消除风险的一种方式就是移除或者减少同风险相关的需求。因此,架构师需要将需求“推回去”,进而在 涉众和架构师之间达成一致意见。这需要架构师能够清楚地表达出不同权衡的结果。
在描述过开发环境体系架构的意义和开发环境架构师的特点之后,现在我们将考虑设计一个开发环境的流程这一主题或者特性,也可以从零开始创造一个环境,也可以从一个现有的开发环境中提炼。依照 IEEE 1471 标准:
[软件设计表现] 定义、记录、维护、提高和证明一个体系架构的适当实现的活动。
设 计虽然仍然处于形成阶段,但它已经是一门经过验证的科目了。然而,随之而来的是对技术、处理过程和资产的关注,它们的关注点是提高设计流程的完备性。推进 这种完备性的方法之一就是从现有的知识中汲取营养。概括地说,架构师在开发一个体系架构的时候会寻找已被证明为有效的解决方案,而不是自己闭门造车,从而 他们能够避免许多不必要的工作。以参考体系架构、体系架构和设计模式、以及其他复用组成要素等形式归纳整理的经验都将扮演很重要的角色。无论如何,设计时 的经验总是会关系到项目的成败。
尽管设计被视为一门科学,但有时提供某种程度的创造力对它来说也是必要的。当 处理新颖和空前的系统是更是如此。在这种情况下,也许并没有现成的经验可以套用。就像一位画家面对一张空白的画布寻找灵感,架构师也可能将他们的工作视为 一门艺术而非科学。然而,在大多数情况下,艺术方面的因素在设计中只占很小的部分。即使是在最新奇的系统中,通常还是有可能从其他地方找到相似的解决方 案,然后对其加以改造并且使之适应我们所考虑的系统的。
因此,开发环境架构师在其工作中将会把其他成功的开发环境考虑进来,但是也将会根据需要创建具有一定的创造性。
架 构师在处理过程中会涉及到许多科目。显然地,架构师涉及最深的核心体系架构活动就是定义一个需求的解决方案。当然,架构师还会涉及到其他许多科目。举例来 说,架构师可能对所有需求进行排序,从而确保那些他们感兴趣的需求被捕获到(特别是那些非功能性的需求,例如性能和可用性)。架构师和项目管理者也会紧密 协作,因为架构师拥有项目计划活动的输入。
经验显示,架构设计不是在项目早期一次性完成的工作。相反,设计被应用在整个项目周期之中,它不断的增长并且迭代交付。每一次交付时,体系架构都会变得更加完整和稳定。问题产生了,在整个项目周期中,架构师的关注点是什么呢?
成功的设计努力是结果驱动的。因此,架构师的关注点随着时间的推移而不断改变,就像期望结果的改变一样。如图2中所示,据说这是 Bran Selic 为了和 Philippe Kruchten 进行交流而画在餐巾纸上的。

图 2. 架构设计强调随着时间的过去发现、发明和实现。
这 幅图显示了在早期,架构师非常关注发现。强调的重点在于理解系统的范围和识别关键的特性以及任何相关的风险。这些组成要素对于体系架构具有明显的影响。强 调的重点随后转变为发明,此时首要的关心就是开发一种稳定的体系架构,它能为全面的实现努力提供基础。最后,强调的重点转变为实现,此时大多数发现和发明 都已经完成了。
正如前面所描述的,体系机构需要满足大量的涉众的要求。因此,设计的流程(包括一个开发环境的设计)必须满足所有这些涉众以确保他们的关注,特别是那些有可能对体系架构产生影响的关注。将相关的涉众引入任何一个关于这些关注的解决方案的回顾之中,也是十分必要的。
设计流程中所涉及到的满足所有涉众的努力,并应当被低估。涉众们影响到处理过程的许多方面,包括需求被聚集的方式、体系架构被记录的形式、以及体系架构被评估的方式等。
鉴 于影响体系架构的众多因素,体系架构的流程很明显会涉及到权衡的问题。通常,权衡是在需求之间作出的,可能还会请涉众帮助做出决定。一个在成本和性能之间 做出权衡的例子是,将网络压缩技术引入到分布式环境中将会提高性能,但是需要一定的成本。这就是一对矛盾的需求,假设架构师已经探索了所有的选项,那么剩 下的就是需要涉众做出决定了。做出权衡有时是不可避免的。架构师需要考虑所有选择,并且从中做出取舍,这是设计流程的一个至关重要的方面。
架构师很少从零开始工作。正如前面所提到的,他们积极地寻找那些能够被归纳整理为模式和现成的解决方案的先前经验。换句话说,架构师寻找复用资产。只有最无知的架构师才不会考虑这些事情。
复用资产是对重现问题的解决方案。复用资产是指在头脑中被复用开发的资产[RAS]
从开发环境架构师的角度来看,复用资产可能是一个方法插件程序、一个工具配置、一个培训课程、一个基础结构规范、或者一个角色定义。
架构师不仅会考虑使用复用资产,而且会考虑将复用资产贡献给公司的资产库。
许 多体系架构常常是以一种自顶向下的方式被考虑的,涉众的需要被捕获并且需求被开发,在体系架构被定义之前,组成要素被设计并且随后被实现。然而,很少有体 系架构是完完全全的自顶向下的。体系架构也可能被自底向上地驱动,例如一个体系架构的概念的证明。成功的架构师承认这两种方式都是必要的,并且他们所创建 的体系架构既是“自顶向下的”,也是“自底向上的”。这也被称之为“从两头到中间”的设计方法。
概括地说,设计在降低成本、提高质量、及时交付和满足需求方面发挥着关键的作用。在这一小节中,我将详细分析设计一个开发环境所带来的好处。
设计的流程不仅要关注必需的功能性需要,还要确保系统的质量达到要求。举例来说,为了处理性能需求,它可能必须考虑体系架构中每一个组件的实现时间,以及组件之间进行通信的时间。
从开发环境架构师的角度来看,根据不同的组成要素考虑应用不同的质量是值得的。举例来说,一种方法可能关注可用性和可配置性,一个工具集可能关注性能和可靠性,授权可能关注可用性,一个基础结构可能关注性能,一个组织可能关注可部署性(随时间变化的能力)等等。
设计的流程推动了不同涉众达成一致的意见,这是由于它提供了对解决方案进行争论的平台。为了支持这样的争论,设计的流程需要确保体系架构能够被清楚地沟通和理解。有效沟通的体系架构使得决定和权衡能够被争论,促进了回顾,并且最终取得共识。
相 反的,不能有效沟通的体系架构就不会导致这样的争论的发生。从而导致一个低质量的体系架构。与此相关的是,体系架构能够推动架构师和新的或现有成员之间达 成一致的意见。再一次说明,体系架构必须是有效沟通的,这样我们才能获得好处。那些清晰地知道自己将实现什么任务的开发团队更有机会生产出期望的产品。
架 构设计的流程支持大量的科目,特别是支持不同的项目管理活动,例如:进度安排、工作分配、成本分析、风险管理以及技能开发。这就是架构师和项目管理者之间 应当建立起紧密关系的主要原因之一。大部分支持都来自于体系架构识别出解决方案中重要组成要素以及它们之间的依赖关系这一事实。
举例来说,对解决方案做出改变的成本需要一定程度的影响分析,依次地,按照组成要素之间的依赖关系来决定哪些被影响。在进度安排方面,依赖关系指出每一个组成要素被实现的顺序。在工作分配方面,体系架构可以再次帮助我们识别出需要分配特定技能和资源的区域。
架 构设计流程的一个首要目的就是确保体系架构为设计人员和实现人员所承担的工作提供一个坚实的架构。很明显,这远比传达一个体系架构的观点要复杂得多。为了 确保结果体系架构的完整性,架构师必须清晰地定义体系架构本身,从而识别出体系架构重要的组成要素,例如解决方案的要素、它们的接口以及它们的交互作用。
架 构师还必须定义适当的实践、标准和指导,这些将指导设计人员和实现人员的工作。体系架构的目标之一就是消除设计人员和实现人员部分上不必要的创造力,这一 点是通过加以必要的限制而实现的,背离这些约束将导致体系架构的破坏。有助于确保体系架构的完整性的另一个方面是适当回顾和评估活动的采用。这些活动的关 注点是考虑设计人员和实现人员的工作,并且决定采用适当的体系架构标准和指导。
今 天的系统(包括开发环境)比以往任何时候都要复杂。我们需要对这种复杂性加以管理。由于体系架构只关注那些重要的组成要素,所以它提供了一个系统的抽象, 并且从而提供了一种管理复杂性的方式。通过递归地将系统分解为各个要素部分,关注体系架构也是一种很好的将大型问题分解为一系列小型问题的方式。
管理复杂性的另一个方面是使用那些允许体系架构的抽象被沟通的技术。采用那些允许抽象被表达的工业标准,例如统一建模语言(UML),今天已经被广泛用于记录不同类型的解决方案,其中也包括开发环境。
设计的流程既能够支持复用资产的使用,也能够支持复用资产的创造。实践已经证明,复用资产能够降低系统的整体成本,并且能够提高它的质量,所以复用资产对于公司来说是十分有好处的。
体 系架构的创造误支持鉴定复用机会的可能性。举例来说,体系架构重要组成要素及其相关的接口和质量的鉴定,支持现成的组成要素、现有的系统、以及打包的应用 程序等的选择,它可以被用来实现这些组成要素。从开发环境的角度来看,也许有一种方法或者方法内容能够被复用、工具或者工具配置能够被复用、过程能够被复 用、基础结构能够被复用、甚至组织角色也能够被复用(例如一个现有的帮助办公桌)。
设 计的流程能够通过许多方式有助于减少维护的成本。首要的一点,设计的流程总是应当确保系统的维护者是一个关键的涉众,他们的需要应当格外受到关注。结果不 应当仅仅是一个为了减轻解决方案的维护压力而被适当记录的体系架构——架构师还将确保将用于维护系统的适当机制合并进来,并且将在创建体系架构的时候考虑 系统的适应性和扩展性。
本文详细阐述了开发环境、开发环境的体系架构、开发环境架构师所扮演的角色、以及设计一个开发环境的流程的相关内容。本文总结了从一个设计良好的开发环境中我们所能得到的好处,以及这些好处是如何给那些真正关心自己软件开发能力的公司带来价值的。
千万不要忘记顶下原帖:http://www.ibm.com/developerworks/cn/rational/edge/08/apr08/eeles/
关于程序员的几句话
九 13th
1 可以理解的才是代码,无法理解的是垃圾
这是我进入公司后印象深刻的第一句话,这句话也让我立刻意识到我之前写过的成千上万行曾经还让我自信满满的代码很可能就是垃圾,因为自从我写过后就不想再去看。从那以后,我就开始为不制造垃圾而努力!
2 最难的是命名
那时导师无论对设计还是代码都要求很严格。代码检查的时候会不时地提出一些命名问题。有的是词不达意,有的是牛头不对马嘴。对于命名问题,被指出后可以很快有更改方表明对问题还是有比较深刻的认识,只是命名时没有太在意。如果很难给出更改方案,那很有可能有更深层次的问题,要么函数结构不合理,要么根本没有理解问题域。有时命名不是单纯的名字问题,同时还和分析设计有密切联系。
3 程序员应该为这样的代码感到惭愧!
这是一次代码检查中的事。那时为了满足公司的一个编码规约,我把很自然的逻辑反过来写,不仅代码多了,而且也更难理解。当被指出问题后,我理直气壮地说这是编码规约规定的。这时导师就指出了“程序员应该为这样的代码感到惭愧!编码规约是死的,人是活的,认为对的就应该坚持和尝试”。会后我反思了下,其实写代码的时候我就很矛盾,但一念之差我还是选择了编码规约。后来在遇到类似的情况,我就更有勇气听自己的心,至少尝试一下。否则感觉对不起这样一个职业。