??xml version="1.0" encoding="utf-8" standalone="yes"?>
目背景Q一个新的品,型目Q纯开发h?/span>3-4人,2名熟l开发h员,1名新手,偶尔会有协助人员。没有技术经理,目l理w负多个目Q对目q度兛_不Q部门经理会协助q行工作和进度管理。可以看到管理还是比较乱?/span>
׃目q度太慢Q领D求从我这边调一个熟lh员协助开发。我也基本了解他们的目状况Qؓ了不让我的hq去抓瞎Q我和他一起去了解目情况?/span>
目状况比较p糕Q介入项目时已经开发了一D|_保留的文档只有两份,一副数据库说明Q一份非常粗略的需求说明,而且q与开发进度不同步Q就是没有维护?/span>
我了解了一下项目目前的隑ֺQ开发h员和我反映一个是人员熟练E度的问题,二是需求变更的问题。我整体了解了一下项目目前的需求和设计Q以及进度。就挑了一个模块询问他们的变更情况Q这个模块是一个关键词匚w功能。结果是领导看了他们的页面之后,嫌信息量太少Q就要求提供一些更l化的数据展C。开发h员问我有什么意见,我就单讲了一下页面大概怎么构徏。其中有一个点Q是用于变更数据范围Q即查询的表变更Q我一开始觉得用下拉框可以,产生了一些意见。有人徏议分Z同子模块Q或?/span>tab,或者分为多块ƈ列展C。我想了惻Iq他们讲了我认为几U方案的优点~点及适用范围?/span>
1. 多块q行展示Q?/span>
多个不同范围的数据在同一面中分Z同区域以相同形式展示。原因是׃多块数据之间有一定的兌因果关系Q或值得Ҏ。适用范围Q如购物|站中的多个物品比较?/span>
2. Tab:
同一个页面的多个tab,表示多个tab中的数据可能在一定的领域概念之下有一定的兌Q但兌度不强。因?/span>tab|重要的是一个同步工作的状态,?/span>A tab|看一定信息,会打开B tab|看其他信息,中途还会切?/span>A tabc适用范围Q如邮箱中,收g和草稿?/span>
3. 下拉?/span>
下拉框作为查询条件的一部分Q常用于有着常规或固定的可选择内容中(如性别Q月份)Q更多是以过滤的形态出玎ͼ即下拉框更适合针对某表的某个字D过滤,如果针对的是数据范围或是对用户需要直观了解的重要业务条g则不太合适。适用范围Q如在考试成W中用下拉框qo“男女”?#8220;及格不及?#8221;?/span>
4. 单选框
单选框与下拉框的作用范围相|但是不同之处在于被选项全部展示Q目的在于能够让用户清楚的了解当前数据显C的实际范围或条Ӟ以及备选的其他范围或条件。更适用于选项与实际业务及当前展示数据关系重要Q不同选项可能会引发用L不同行ؓ。适用范围Q如银行pȝ昄了当前用户下l定多个帐号Ӟ使用单选框?/span>
l过上述讨论Q我们仔l分析了q个模块中用L实际需求,以及可能后箋操作Q最l选择的单选框的方案?/span>
目前q没有后l,但是我想我们Z用户真是需求的挖掘和后l操作的认真分析Q会让我们在与领D行需求讨论的时候有更加充分合理的依据?/span>
回来之后我又看了看淘宝的搜烦面Q比如就搜烦“鞋子”来讲Q将品牌q栏讄为单选和下拉是完全不同的效果,而确定方案的理由则是对于用户的需求和实际行ؓ的深入研I。这个应该是需求分析和调研的结果。将搜烦条g?/span>tag的Ş式标注于面上,q且可以直接点击X按钮q行删除Q我觉得更加可以們为用户体验。满_ƈ充分考虑了用户实际需求的是好的需求分析,能够化ƈ引导用户行ؓ的是好的用户体验?/span>
当我们面临的pȝ感觉非常隄的时候,往往q时候ƈ非是用户体验差,我们应该讨的是我们对用户需求有没有好好挖掘Q做出来的是不是用户惌、用戯用的pȝ?/span>
ZNode
Znode是核心l构QZookeeper服务中是由大量的Znode构成。Znode一般是由客L建立和修改,作ؓ信息或标志的载体Q甚xw就是标志?/span>
Znode可以讄为持久(PERSISTENTQ或临时QEPHEMERALQ,区别在于临时的节点若断开q接后就自动删除。徏立节Ҏ可选择是否使用序列号命名(SEQUENTIALQ,若启用则会自动在节点名后加入唯一序列~号?/span>
Session
作ؓ客户端和Zookeeper服务之间交互的凭证?/span>
Watch
当客L对节点信息进行查询操作之后,可以选择是否讄一个Watch。其作用是当本ơ查询的数据在服务器端发生变化之后,会对讄Watch的客L发送通知。一ơ发送之后,将删除该WatchQ以后的变更或不再设|Watch则不会通知?/span>
ACLs
节点的权限限制用ACLQ如增删Ҏ操作?/span>
1?/span>下蝲对应版本Ltar.gz文g
2?/span>使用 tar xzvf zookeeper-3.4.2.tar.gz -C ./ 解压
3?/span>讄Q将conf/zoo.example.cfg复制到conf/zoo.cfg或者手动徏立一个新的?/span>
4?/span>启动Zookeeper服务Qbin/zkServer.sh start
5?/span>启动客户端连接:bin/zkCli.sh -server 127.0.0.1:2181Q此处在本机Q且使用了默认端口,且在Java环境中)
6?/span>使用命oQls、get、set{?/span>
7?/span>关闭Zookeeper服务Qbin/zkServer.sh stop
代码~写部分比较单,因ؓ暴露的接口很,主要复杂在于目如何使用节点以及节点信息?/span>
启动Zookeeper服务之后Q客L代码q行节点的增删,Watch的设|,内容的改查等?/span>
此处查看官方的《Programming with ZooKeeper - A basic tutorial》部分,当中举了两个例子来模拟分布式pȝ的应用?/span>
代码基本没有问题Q唯一需要注意的是Q若之间按照原版q行调试Ӟ有可能在调用
q句代码时会出现一个异常,当中包括“KeeperErrorCode = ConnectionLoss for”?/span>
q个问题引v的原因可以看一下代?/span>
zk = new ZooKeeper(address, 3000, this);
mutex = new Integer(-1);
System.out.println("Finished starting ZK: " + zk);
最后一行有打印出Zookeeper目前的信息,若未修改的原代码Q此处的State应当是CONECTING。连接中的时候去验证是否存在节点会报错。解决的Ҏ也很单,是{到Zookeeper客户端以及完全连接上服务器,State为CONECTED之后再进行其他操作。给Z码示例:
private CountDownLatch connectedSignal = new CountDownLatch(1);
SyncPrimitive(String address) {
if(zk == null){
try {
System.out.println("Starting ZK:");
zk = new ZooKeeper(address, 3000, this);
mutex = new Integer(-1);
connectedSignal.await(); // {待q接完成
System.out.println("Finished starting ZK: " + zk);
} catch (IOException e) {
System.out.println(e.toString());
zk = null;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//else mutex = new Integer(-1);
}
synchronized public void process(WatchedEvent event) {
// 此处讄在Watch中会在状态变化后触发事g
if (event.getState() == KeeperState.SyncConnected) {
connectedSignal.countDown();// 倒数-1
}
synchronized (mutex) {
//System.out.println("Process: " + event.getType());
mutex.notify();
}
}
q样可以正运行代码了?/span>
此处是ؓ引用Q原地址为(http://rdc.taobao.com/team/jm/archives/1232 Q?/span>
ZooKeeper是一个高可用的分布式数据理与系l协调框架。基于对Paxos法的实玎ͼ使该框架保证了分布式环境中数据的Z致性,也正是基于这LҎ,使得zookeeper能够应用于很多场景。网上对zk的用场景也有不介l,本文结合作者n边的目例子Q系l的对zk的用场景进行归cMl?nbsp;值得注意的是Qzkq不是生来就些场景设计,都是后来众多开发者根据框架的Ҏ,摸烦出来的典型用方法。因此,也非常欢q你分n你在ZK使用上的奇技淫y?/span>
场景cd | 典型场景描述QZKҎ,使用ҎQ?/span> | 应用中的具体使用 |
数据发布与订?/span> | 发布与订阅即所谓的配置理Q顾名思义是数据发布到zk节点上,供订阅者动态获取数据,实现配置信息的集中式理和动态更新。例如全局的配|信息,地址列表{就非常适合使用?/span> | 1. 索引信息和集中机器节点状态存攑֜zk的一些指定节点,供各个客L订阅使用?. pȝ日志Q经q处理后的)存储Q这些日志通常2-3天后被清除?nbsp; 3. 应用中用到的一些配|信息集中管理,在应用启动的时候主动来获取一ơ,q且在节点上注册一个WatcherQ以后每ơ配|有更新Q实旉知到应用,获取最新配|信息?/span> 4. 业务逻辑中需要用到的一些全局变量Q比如一些消息中间g的消息队列通常有个offsetQ这个offset存放在zk上,q样集群中每个发送者都能知道当前的发送进度?/span> 5. pȝ中有些信息需要动态获取,q且q会存在人工手动M改这个信息。以前通常是暴露出接口Q例如JMX接口Q有了zk后,只要这些信息存攑ֈzk节点上即可?/span> |
Name Service | q个主要是作为分布式命名服务Q通过调用zk的create node apiQ能够很Ҏ创徏一个全局唯一的pathQ这个path可以作Z个名U?/span> |
|
分布通知/协调 | ZooKeeper中特有watcher注册与异步通知机制Q能够很好的实现分布式环境下不同pȝ之间的通知与协调,实现Ҏ据变更的实时处理。用方法通常是不同系l都对ZK上同一个znodeq行注册Q监听znode的变化(包括znode本n内容及子节点的)Q其中一个系lupdate了znodeQ那么另一个系l能够收到通知Qƈ作出相应处理?/span> | 1. 另一U心x机Ӟ系l和被检系l之间ƈ不直接关联v来,而是通过zk上某个节点关联,大大减少pȝ耦合?. 另一U系l调度模式:某系l有控制台和推送系l两部分l成Q控制台的职责是控制推送系l进行相应的推送工作。管理h员在控制C的一些操作,实际上是修改了ZK上某些节点的状态,而zk把q些变化通知l他们注册Watcher的客LQ即推送系l,于是Q作出相应的推送Q务?nbsp; 3. 另一U工作汇报模式:一些类gd分发pȝQ子d启动后,到zk来注册一个时节点,q且定时自qq度q行汇报Q将q度写回q个临时节点Q,q样d理者就能够实时知道dq度?/span> MQ用zookeeper来进行分布式通知和协调能够大大降低系l之间的耦合?/span> |
分布式锁 | 分布式锁Q这个主要得益于ZooKeeper为我们保证了数据的强一致性,即用户只要完全相信每时每刻,zk集群中Q意节点(一个zk serverQ上的相同znode的数据是一定是相同的。锁服务可以分ؓ两类Q?/span>一个是保持独占Q另一个是控制时序?/span> 所谓保持独占,是所有试图来获取q个锁的客户端,最l只有一个可以成功获得这把锁。通常的做法是把zk上的一个znode看作是一把锁Q通过create znode的方式来实现。所有客L都去创徏 /distribute_lock 节点Q最l成功创建的那个客户端也x有了q把锁?/span> 控制时序Q就是所有视图来获取q个锁的客户端,最l都是会被安排执行,只是有个全局时序了。做法和上面基本cMQ只是这?nbsp;/distribute_lock 已经预先存在Q客L在它下面创徏临时有序节点Q这个可以通过节点的属性控ӞCreateMode.EPHEMERAL_SEQUENTIAL来指定)。Zk的父节点Q?distribute_lockQ维持一份sequence,保证子节点创建的时序性,从而也形成了每个客L的全局时序?/span> |
|
集群理 | 1. 集群机器监控Q这通常用于那种寚w中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。这L场景中,往往有一个监控系l,实时集机器是否存zR过ȝ做法通常是:监控pȝ通过某种手段Q比如pingQ定时检每个机器,或者每个机器自己定时向监控pȝ汇报“我还zȝ”?nbsp;q种做法可行Q但是存在两个比较明昄问题Q?. 集群中机器有变动的时候,牵连修改的东西比较多?. 有一定的延时?nbsp; 利用ZooKeeper有两个特性,可以实时另一U集机器存zL监控系l:a. 客户端在节点 x 上注册一个WatcherQ那么如?nbsp;x 的子节点变化了,会通知该客L。b. 创徏EPHEMERALcd的节点,一旦客L和服务器的会话结束或q期Q那么该节点׃消失?/span> 例如Q监控系l在 /clusterServers 节点上注册一个WatcherQ以后每动态加机器Q那么就往 /clusterServers 下创Z?nbsp;EPHEMERALcd的节点:/clusterServers/{hostname}. q样Q监控系l就能够实时知道机器的增减情况,至于后箋处理是监控pȝ的业务了?/span> 在分布式环境中,相同的业务应用分布在不同的机器上Q有些业务逻辑Q例如一些耗时的计,|络I/O处理Q,往往只需要让整个集群中的某一台机器进行执行,其余机器可以׃nq个l果Q这样可以大大减重复劳动,提高性能Q于是这个master选D便是q种场景下的到的主要问题?/span> 利用ZooKeeper的强一致性,能够保证在分布式高ƈ发情况下节点创徏的全局唯一性,卻I同时有多个客Lh创徏 /currentMaster 节点Q最l一定只有一个客Lh能够创徏成功?/span> 利用q个Ҏ,p很轻易的在分布式环境中进行集选取了?/span> 另外Q这U场景演化一下,是动态Master选D。这p用到 EPHEMERAL_SEQUENTIALcd节点的特性了?/span> 上文中提刎ͼ所有客L创徏hQ最l只有一个能够创建成功。在q里E微变化下,是允许所有请求都能够创徏成功Q但是得有个创徏序Q于是所有的h最l在ZK上创建结果的一U可能情冉|q样Q?nbsp;/currentMaster/{sessionId}-1 , /currentMaster/{sessionId}-2 , /currentMaster/{sessionId}-3 ….. 每次选取序列h的那个机器作ؓMasterQ如果这个机器挂了,׃他创建的节点会马上小Ӟ那么之后最的那个机器是Master了?/span> | 1. 在搜索系l中Q如果集中每个机器都生成一份全量烦引,不仅耗时Q而且不能保证彼此之间索引数据一致。因此让集群中的Master来进行全量烦引的生成Q然后同步到集群中其它机器?. 另外QMaster选D的容灾措施是Q可以随时进行手动指定masterQ就是说应用在zk在无法获取master信息Ӟ可以通过比如http方式Q向一个地方获取master?/span> |
分布式队?/span> | 队列斚wQ我目前感觉有两U,一U是常规的先q先出队列,另一U是要等到队列成员聚齐之后的才统一按序执行。对于第二种先进先出队列Q和分布式锁服务中的控制时序场景基本原理一_q里不再赘述?nbsp; W二U队列其实是在FIFO队列的基上作了一个增强。通常可以?nbsp;/queue q个znode下预先徏立一?queue/num 节点Qƈ且赋gؓnQ或者直接给/queue赋值nQ,表示队列大小Q之后每ơ有队列成员加入后,判断下是否已经到达队列大小Q决定是否可以开始执行了。这U用法的典型场景是,分布式环境中Q一个大dTask AQ需要在很多子Q务完成(或条件就l)情况下才能进行。这个时候,凡是其中一个子d完成Q就l)Q那么就?nbsp;/taskList 下徏立自q临时时序节点QCreateMode.EPHEMERAL_SEQUENTIALQ,?nbsp;/taskList 发现自己下面的子节点满指定个数Q就可以q行下一步按序进行处理了?/span> |
|
我作为项目经理和技术架构管理h员负责公怸条生产线。讨Z后,首席架构师希望我们能够实?/span>TDD。在实施TDD的过E中Q设计实施过E的整体思\是Q单元测试用例文?/span> - 实施单元试 - 实施业务代码 – 修改业务代码逻辑。实施h员需要参与每个环节,按照规范~写单元试用例文档。单元测试我们按照模块(模块与h员基本没有重合)划分包(suiteQ,保证实施h不会产生q扰。。技术架构决定采用:mavenQ?/span>junitQ?/span>svn?/span>
技术背景:
技术架构设计上Q我们封装了dao层的实现Q所以实施h员基本无需涉及dao层的开发。服务层我们采用?/span>JAX-RS的服务规范,对外开发服务接口?/span>
在测试覆盖率斚wQ我们基本不要求?/span>dao层的单元试Q但要求在服务层的单元测试达?/span>100%。由于服务层?/span>Restful WS的模式,所以我们采用了模拟HTTPh的方式在试服务层?/span>
׃需要模?/span>HTTP的请求,所以我们在单元试中采用了jetty作ؓ内嵌服务器,单元试开始时同一启动Q完成后关闭?/span>
实施q程Q?/span>
开发过E中Q实际实施的时候发C个问题,对于试数据的管理问题。即试当中需要一定的数据环境来验证业务逻辑。这个数据环境如何徏立?
Ҏ一Q?/span>dbunit?/span>hsqldb。在试启动旉建数据环境?/span>
否决Q原因:
1.与实际运行环境差异较大?/span>
2.反复重徏数据环境Q效率上有缺失?/span>
3.技术架构增加,学习和维护曲U较大?/span>
讨论后决定?/span>
Ҏ二,独立Z套测试数据库Q完整数据环境。考虑到增删改与查询的冲突Q制定默认规则,?/span>id?/span>20之内的不允许q行M改动。以量隔离增删改的影响?/span>
针对Ҏ二,有一个较大的问题Q如何在开发过E中自由的切换数据库配置呢?׃我们q是用了Hudson作ؓCI服务器,q要考虑到打包的q程。整体考虑之后Q有两个步骤需要注意:
一?span style="font-family:宋体;Times New Roman";Times New Roman"">开发过E。开发过E中Q我们将配置直接指向试数据库?/span>
二?span style="font-family:宋体;Times New Roman";Times New Roman"">打包q程。用了
mavenQ存在单元测试配|与最l品配|的冲突?/span>所以最l问题的焦点集中在打包过E的maven配置Ҏ?/span>
搜烦之后比较好的资料?/span>
MAVEN:如何为开发和生环境建立不同的配|文?/span> --我的z方?/span>
Q?/span>http://www.tkk7.com/scud/archive/2010/10/27/336326.htmlQ?/span>
q篇博客是介l在maven 中?/span>mvn package -P test q样的自定义profile来实现的。这h可行的,但是?/span>Hudson中无法实C条命令切换两套配|?/span>
于是l箋LQ最l在maven的官方网站找到?/span>Building For Different Environments with Maven 2》(http://maven.apache.org/guides/mini/guide-building-for-different-environments.htmlQ看完文章之后发玎ͼ实际maven提供了一个非常好的插?/span>maven-antrun-pluginQ以实现某些ant的功能。此处还需要了解的知识是maven的构建生命周期标准(http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.htmlQ。基于上qC个知识点Q我们制定出如下ҎQ?strong>在项目中建立试配置目录及品配|目录,?/strong>maven?/span>package阶段开始前Q都使用试配置Q运行集成测试,完成?/span>package阶段前将产品配置覆盖x包文件夹内,然后q行打包。思\是q样Q下面脓?/span>pom文g的关键部分?/span>
POM.xml
<!—profile 节点定义覆盖文g的方式内?/span> -->
<profiles>
<profile>
<id>product</id>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>pre_product</id>
<phase>prepare-package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<!—此处?/span>ant的Q务相?/span> -->
<tasks>
<delete file="${project.build.outputDirectory}/spring/dataSourceContext.xml" />
<delete file="${project.build.outputDirectory}/log4j.properties" />
<copy file="src/product/assembly/log4j.properties" tofile="${project.build.outputDirectory}/log4j.properties" />
<copy file="src/product/assembly/spring/dataSourceContext.xml" tofile="${project.build.outputDirectory}/spring/dataSourceContext.xml" />
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<!—构徏q程 -->
<build>
<!—指定资源目录 -->
<resources>
<resource>
<directory>src/test/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
<resource>
<directory>src/test/assembly</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
<finalName>po</finalName>
<!—指定集成试配置 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<junitArtifactName>junit:junit</junitArtifactName>
<forkMode>once</forkMode>
</configuration>
<executions>
<execution>
<id>default-test</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<skip>false</skip>
<includes>
<include>**/*TestSuitex.java</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
软g企业的技术体pL构包括对软g产品本n及生产过E、Y件生产环境及生者的理和支持,此架构应当基于下列五基之上Q?/span>
l 开发技术架?/span>
l 开发环境架?/span>
l q程理架构
l 企业产品架构
l 企业Zg架构
下面详细介绍各项架构的内容及特点?/span>
开发技术架?/span>
开发技术架构作Z个Y件企业的基石Q包括可复用的架构组件、公用的基础代码库等。开发技术框架应当在一个良好的q程理之下Q严格的质量理与实用性检查,q且鼓励普通技术h员的参与?/span>
1.建立技术架构仓库标准体pMl护模式。徏议用MAVEN作ؓ所有开发技术(包括架构预研与实际项目开发)的基目理工具Q实施严格的质量理和持l集成?/span>
2.选拔l徏高素质的架构师队伍,q且鼓励技术h员参与到技术架构仓库的构徏和维护?/span>
3.加强技术架构实用性与适用性的查与攚w?/span>
4.架构q营模式的考察Q技术架构的改进与预研。技术架构的预研模式比较复杂Q多个部门中多个目可能都会要求q行多个同类框架的考察、比较、环境搭建等工作Q若集中在独立架构组可能压力较大。可以考虑架构l内部划分ؓ多个技术领域,如企业基应用架构、消息中间g、动态化lg、分布式集群{。以技术部门的实施领域作ؓ导向Q进行技术架构的预研?/span>
5.开攄识系l的构徏Q内部wikiQ个人博客,视频分nQ?/span>
Ҏ企业行业背景Q需要关注的技术领域包括:企业应用、ESB/SOA、大型分布式架构Q在U?ȝQ,自然语言处理?/span>
开发环境架?/span>
包含IDEQ编译环境,q程支持Q通讯支持与其他大量功能性支持YӞq可以根据不同的工作角色制定不同的环境,以便排除q扰Q更加快速有效的q入工作状态?/span>
目的关键问题是沟通,个性化的工具妨?#8212;—而不是促q沟通。开发和l护公共的通用~程/目理工具有很多的好处?/span>
1.建立h鲜明特色与强大实用性的自有开发环境,展示一个Y仉头企业在企业技术沉淀中的深厚功力和规范性?/span>
2.建立行政程以规范和U束开发环境管理?/span>
3.划分相关职能以保持对开发环境的l护
4.建立多种培训机制以促q新员工能够q速投入工作。如固定新员工开发环境熟悉培训机Ӟ建立企业讲解&培训视频库,组内互?amp;沟通?/span>
q程理架构
1.q程Ҏ
对多家企业Y件生命周期中使用的过E方法进行调查了解到Q大部分优秀的Y件企业对于过E方法十分重视,且存在针对不同项目合理运用不同的q程Ҏ。项目经理对于过E方法的理解与运用常常关pd目的成败?/span>
目前核心的管理模?q程Ҏ主要分ؓ三大c:CMMIQRUPQ敏捗?/span>
CMMI作ؓ软g质量体系的标准,软g企业必须具备的资质,h文档齐全Q流E规范等优势Q对于大型核心项目有较大优势Q其劣势在于灉|度不I无法很好的满x益变化的需求?/span>
RUP由Rational公司Q被IBM收购Q目前是IBM 软g集团旗下之第五大软g品牌Q提出,采用q代开发模式,四个阶段Q九大核心工作流Q明的角色划分与文档规划,可裁剪配|的开发过E。目前被大量的Y件厂商作为最核心的过E方法用?/span>
敏捷QAgileQؓ了满队伍小型化和需求快速变化而生的目前最行的过E方法。XPQExtreme ProgrammingQ通过单的四个核心价|沟通(CommunicationQ、简单(SimplicityQ、反馈(FeedbackQ和勇气QCourageQ)与十二条最佛_践从研发的角度提Z最单直接的开发方式。XP的Ş态特D,从编E的角度描述Ҏ与原则,加入了SCRUM之后Q加Z从行政体制方面的支持Q从而Ş成了完整的敏捷开发的q程Ҏ体系?/span>
q程Ҏ一定不是万金aQ针对不同的企业特点Q甚至不同项目,都有必要对过E方法进行合理的裁剪与整合。对于目前公司的情况Q大型核心项目可以用CMMIQ这些往往军_了企业的战略方向Q稳健的q程Ҏ最为合适。大部分中小型项目均可采?RUP+敏捷 的过E方法,即遵守RUP的核心阶D和工作,但是q代周期和开发的基本原则Ҏ敏捷Qƈ挑战整合部分敏捷Ҏ中的最佛_c这L{略用于面对市场需求的快速变化,同时也能很好的保障企业在软g生中的产品价g存和技术经验积累?/span>
2.q程Ҏ自动化支?/span>
针对不同的过E方法,往往有若q的软g产品用以快速自动化的实施。如实施CMMI时所使用到的DEVSUITE产品。完整体pȝ支持产品往往在应用于某套固定Ҏ有着良好的效果,但容易存在流E生,无法与开发环境更好结合Ş成了信息孤岛Q改q困隄~点。一套优U的过E方法支持YӞ需要和开发环境(如IDE{)良好l合Qƈ且易于调整以应对q程Ҏ的变化,同时没有复杂冗余的过多细节流E以便容易被开发h员学习和掌握?/span>
产品涉及斚wQ项目计划、项目需求管理、Y仉|管理、自动集成、自动品发布、代码审核、代码质量管理等?/span>
企业产品架构
1.产品/产品需求流E补充,产品立项时的立项报告中应当包含市场、竞争对手、对手品、风险等分析?/span>
2.领域模型与概念,在特定的行业中可以即使关注领域专家的动态,以便构徏正确的领域模型,定产品的发展方向和形态的正确性?/span>
3.对于特定产品的领域概念及相关技术发展需要深入了解,如舆情分析系l,需要进行了一定的市场调查Q跟q了当前领域专家的报告,参考国内外多项相关目的设计理念和原则。对于目前市场状c未来的方向、目前的技术实力等要有比较清晰的概?/span>
4.坚持以市Zؓ导向的原则,在商务部门与研发部门之间搭徏U极的沟通桥梁,研发部门的计划根据实际市场需求进行调整。品的发布配合市场的要求,辑ֈ利益最大化?/span>
企业Zg架构
企业自n环境除了常见的YӞSoftwareQ,gQHardwareQ以为,q应当加入hӞPeoplewareQ。之前的U种Q如q程Ҏ、技术架构积累、知识分享等均是Z整个企业构建成Z部精密的机器Q无论缺什么重要零件均可以快速修复,但是人员失所造成的损失是巨大的。目前公司有着良好的Yg环境Q技术部门作为发动机Q若在针Ҏ术性员工有特别的规划和兛_Q必然能够增强在整个市场中的竞争力,对企业自w的发展也是有良好的推进作用?/span>
公司可以按照职位和员工自w的情况规划发展路线Q明技术目标。开发进化角色基本按照Y考标准,E序?高E序?软g设计?pȝ分析?pȝ架构师,E序?高E序?目l理?/span>
在技术部门内部,可以定期l织交流心得、新技术等。(在SCRUM中实际上有一些比较好的行政手D可以借鉴参考)
׃软g技术部门的Ҏ性,一些应用于生U的行政制度可能能够讨论出更好的实施ҎQ避免员工单斚w的错误认识引发消极的工作态度?/span>
׃有一定经验,而且公司技术架构徏讄需要,能够很好的协助企业进行技术架构全斚w的介l和培训。而且我自w也很希望参与到企业文化的徏讑ַ作中去,鼓励技术h员之间的技术交与沟通?/span>