posts - 94, comments - 250, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

引言:

GameByro作为一款次世代引擎,使用了复杂的材质系统,用来满足各种各样的需求。材质代表了物体受到光照后所呈现出的质感,而这种质感在计算机图形学中需要着色代码来完成,所以当前流行的图形引擎设计是使用被渲染对象的材质与shader相关联,GameByro也不例外。GameByro的材质系统可以通过shade tree生成shader程序,增强了应用程序层对可编程渲染管线的控制能力。

渲染架构概览:

在GameByro中,对象表面的色彩、纹理、光滑度、透明度、反射率、折射率、发光度等可视属性与传统的材质系统分离,独立的成为了对象的渲染属性(NiProperty),而材质(NiMaterial)仅用来对着色程序的封装,这样就实现了渲染数据和渲染方法的分离,降低了耦合性。如上所说的这些可视属性在Gamebyro中会封装成一个属性对象,在应用程序中如果对对象挂载这个属性对象,在GPU程序中就可以访问这个属性对象的值。渲染属性对象可以在创建时指定其类型,如纹理、浮点、矩阵、向量或数组,此外一些全局性的对象也可以通过在Shader中用语意声明为全局object对象,如灯光和摄影机等,这样就可以以同样的方式来访问这些对象上的属性。

GameByro每一帧的渲染(NiRenderFrame)划分为多个步骤(NiRenderStep),每个步骤又包含很多个批(NiRenderClick),NiRenderFrame封装了上层对渲染系统调用的接口,而NiRenderClick则代表了图形硬件的一次绘制操作(对渲染队列中所有的对象的顶点缓存调用DrawPrimitive),当应用程序调用NiRenderFrame的Display接口时, NiRenderFrame会依次调用每一个NiRenderStep的Render()接口,NiRenderStep就会执行所有的NiRenderClick操作。

对于每个NiRenderClick来说,首先要设置视口和渲染目标,也就是渲染数据流的入口和出口。视口建立以后就可以通过关联的摄影机对场景图中的对象进行裁剪(默认的有视口裁剪和遮挡裁剪,此外还可以通过回调函数加入自己的裁剪方式),将未被裁剪的对象放入渲染队列。然后Gambyro会根据材质来对渲染队列中的对象进行排序,让材质相同的对象处于相邻位置,这样可以减少切换shader的开销。

clip_image002

如图所示为帧渲染系统的结构图(简化版)

材质系统:

GameByro中的材质代表渲染对象所采用的方法。前面说过。纹理属性包含了着色所需的原料,那么材质就指定了对这些原料的加工方法。基于当前可编程渲染管线设计,材质就成为连接对象与GPU程序的中间层,应用程序可以通过材质将shader应用于几何体。

NiMaterial类是所有材质的基类,这个类通过一个Map来保存当前应用程序中所有NiMaterial的指针,当然这个Map是静态也就是说相当于全局变量,通过static NiMaterial* NiMaterial:: GetMaterial(const NiFixedString& kName)接口对这个全局的Map进行访问。也就是说,当前环境中所有的NiMaterial对象是通过NiMaterial类来管理的。此外NiMaterial类还通过静态成员变量保存了一个工作路径(即shader文件路径),通过这个路径加载shader文件。NiMaterial就像是一个中介,全权代理对对象的渲染工作。用户可以通过重载NiMaterial来实现自己的渲染机制。每个NiMaterial都是全局性的,可以作用于多个甚至是所有的渲染对象,但一个渲染对象也可以拥有多个NiMaterial,但只能有一个处于激活状态的NiMaterial。

NiMaterial的派生类NiFragmentMaterial提供了对可编程渲染管线完整的控制机制,内部保存了NiShader的哈希表、一个NiGPUProgramCache数组。并且NiFragmentMaterial会生成一个用来编译GPU程序的shade tree(后面会有解释)。这样的话,每个NiFragmentMaterial可以对应多个shader程序,这样就提供了一种机制,在运行时根据不同的运行环境和渲染对象不同的状态,来选择合适的shader程序。在NiRenderClick依次渲染可见集中的每个对象时,首先会判断其是否需要被渲染的标记(flag),如果需要被渲染,则使用NiMaterial::IsShaderCurrent接口判断当前shader(上一次渲染所使用的shader)是否有效,所谓有效就是仍然存在并且可以应用于本次的渲染对象,如果无效,则会调用NiMaterial::GetCurrentShader获得shader,用于本次渲染。NiMaterial::GetCurrentShader会根据渲染对象的属性和当前环境硬件条件来选择合适的shader程序。当然,可以通过重载IsShaderCurrent和GetCurrentShader接口来指定自己的有效性判断规则和如何选择shader程序的方案。 NiFragmentMaterial提供了一套搭建shade tree的框架,用户可以通过重载来搭建自己的shade tree,当然,如果不想通过shade tree的形式生成shader程序也可以,使用NiSingleShaderMaterial可以从文件生成shader程序。

Shade Tree

什么是shade tree呢?我们通常编写的shader代码是线性执行的,即每个pass流程执行的是文本上定义好的shader流程,每一段shader功能模块是按一定顺序依次执行的。如果需要修改流程中的某一部分就需要更改相关的shader代码并重新编译。而shade tree将shader代码以树形结构组织起来,每一个shader代码块(一般是一个函数)都会被编译成一个节点,通过定义输入变量和输出变量来提供数据流的入口和出口,这些节点的插入和删除可以通过应用程序来控制,从而灵活的控制整个渲染过程。这样shader程序中的一些核心模块可以由美术通过工具生成,然后插入到shade tree中,只要输入和输出的接口不变,就无须修改其他代码,从而降低了美术开发shader的门槛。

GameByro通过以下几个类搭建shade tree:

l NiMaterialConfigurator:shade tree被封装在这个对象中,Uniform constants被封装在NiMaterialResource中,而NiMaterialNode封装了相关的shader代码,所有的资源和节点通过NiMaterialResourceBinding连接起来。当所有的连接都确立以后,NiMaterialConfigurator会调用Evaluate接口生成GPU程序和一个输入Uniform资源的集合。

l NiMaterialFragmentNodes:这个类包含了一个shader代码片段的集合,这些代码片段为不同的平台和编程语言所编写。这就为shader程序员提供了更大的灵活性,用以控制他们的代码在不同平台和图形硬件上的表现。例如:在高端平台可以采用高级的shader model提供更好的效果,而在低端平台上可以关闭一些特效来加快速度。

l NiMaterialNodeLibraries:这个类是一个NiMaterialNode的集合,其实也就是一个shader库。它允许shade tree节点完全基于数据驱动。shader库的生成可以通过两种方式,解析XML文件或用XML文件生成C++代码。GameByro提供了相关的解析器和代码生成器。

l NiMaterialResources:shade tree中的Uniform constants,支持多种数据类型,包括Constant、Predefined、Attribute、Global、Object。

固定管线的渲染:

GameByro支持固定管线的渲染,其纹理混合过程如下。

clip_image004

固定管线的着色处理流程

上图很清楚的显示出了每个stage的操作,平行的表示两张纹理的采样是同时进行的,特定情况下右边的纹理可能被忽略。

大部分情况下,应用程序不会使用上面所有的stage,开启或者关闭那个stage可以由应用程序来指定。

以下为多重采样的原理图:

clip_image006

固定管线的纹理多重采样

缺省的着色处理流程:

GameByro提供了一个默认的着色处理流程,封装在NiMaterial的派生类NiStandardMaterial中,这个类执行类似于固定管线的流程,在不同阶段将纹理采样、并将采样到的数据混合到最终的结果中去。

GameByro默认的材质系统的特性如下:

  • Skinned and unskinned transformations. Skinned transformations can support up to 30 bones per draw call.
  • Vertex colors
  • Base maps
  • Normal maps
  • Parallax maps
  • Dark maps
  • Detail maps
  • Bump environment maps
  • Gloss maps
  • Glow maps
  • Decal maps (up to 3)
  • Cubic and spherical environment maps
  • Point/Spot/Directional/Ambient lights contributing to the diffuse, specular, and ambient color. Up to 8 total lights. Per-pixel or per-vertex.
  • Projected light maps. Clipped or unclipped. (Up to 3)
  • Projected shadow maps. Clipped or unclipped. (Up to 3)
  • Texture transforms per map.
  • Per-vertex fog

下图显示为不同的纹理、灯光、材质属性的组合过程,不过需要注意的是,视差贴图和凹凸贴图属于特殊的情况,它们仅仅影响到纹理采样的UV坐标,而并非直接对最后的颜色值产生贡献。视差贴图会改变所有贴图采样的UV坐标,而凹凸贴图仅对环境贴图的UV产生影响。

clip_image008

以上流程完全由shade tree构建,NiStandardMaterial提供了大量的函数接口用于对每个流程的控制,用户可以通过重载相关的接口,插入自己的shade tree节点,修改每一步的操作或处理过程。例如:

virtual bool HandleBaseMap(Context& kContext, NiMaterialResource* pkUVSet,

NiMaterialResource*& pkDiffuseColorAccum,

NiMaterialResource*& pkOpacity, bool bOpacityOnly);

当然,整个流程的顺序和结构修改起来比较困难,如果有需要可以定制自己的材质系统,搭建自己的shade tree。

NiStandardMaterial提供了若干回调函数,这些函数可以动态的修改流程,分割PASS,对shader运行失败进行容错。

l SplitPerPixelLights/SplitPerVertexLights:这两个函数分别作用于逐顶点光照和逐像素光 照,当物体所受的光源数量太多,超过了顶点或像素着色器的能力时,通过这些函数可以将失败的pass分割成两个,如果分割出的pass仍然不能执行,那么函数会被递归调用,直到每个pass只有一个光源为止。

l SplitTextureMaps:这个函数会把对纹理采样的pass进行分割,当纹理查询过多时,顶点或像素着色器就会过于复杂,这时就可能导致shader运行失败。此函数只能迭代一次,生成一个额外的pass。

l DropParallaxMap:这个函数用来从几何体上移除视差贴图,且不产生额外的pass。

l DropParallaxMapThenSplitLights:这个函数首先调用DropParallaxMap移除视差贴图,然后一直调用SplitPerPixelLights直到失败为止。

NiMaterialInstance:

NiMaterial并不是直接与NiRenderObject相关联,而是经过了NiMaterialIstance这个中间层,由它来代理将NiMaterial关联到几何体,它负责调用NiMaterial为NiRenderObject生成NiShader,通过改变NiMaterialIstance上的接口SetMaterialNeedsUpdate,可以决定每一帧NiRenderObject所使用的材质是否需要被更换,通过接口SetDefaultMaterialNeedsUpdateFlag,可以决定当前材质所需的数据(即当前渲染流程所需的数据)是否要被更新。这样每个NiMaterialIstance只能被一个NiRenderObject所拥有,而多个NiMaterialIstance可以共享一个NiMaterial,这样就减少了重复创建NiMaterial的时间和空间上的开销,同时降低了渲染对象个材质之间的耦合度。

如下为材质系统的类结构简化图:

clip_image010

渲染属性:

前面提到过,GameByro将渲染所需要加工的数据全部封装在了NiProperty中,只要在shader中用指定的语法进行声明,就可以访问这些属性的值。

目前引擎中已经定义了12种属性,均派生自NiProperty,分别代表渲染数据的12种不同类型:

l NiAlphaProperty

l NiDitherProperty

l NiFogProperty

l NiMaterialProperty

l NiRendererSpecificProperty

l NiShadeProperty

l NiSpecularProperty

l NiStencilProperty

l NiTexturingProperty

l NiVertexColorProperty

l NiWireframeProperty

l NiZBufferProperty

用户也可以自定义属性类型,但所对应的数据类型要被shader语言所支持。

光照与阴影:

光照与阴影密不可分,因为阴影就是由光照产生的,前面在材质系统中已经提到过光照对着色的影响,这里重点阐述,GameByro是怎样根据光源产生阴影的。由GameByro提供的阴影均基于ShadowMap技术,

但也提供了ShaowVolume的示例代码。

Shadowing System是完全建立在帧渲染系统上的, 通过一个RenderClick生成ShadowMap,然后在正常渲染流程开始之前将ShadowMap更新到可见集内每一个渲染对象上。这样当渲染对象使用NiStandardMaterial时就会根据光源的阴影技术来对ShadowMap进行采样,并将结果与最终的输出颜色按一定比例混合。

阴影系统由以下几个类构成:

GameByro提供了三种类型的Shadow Write Materials,分别为NiPointShadowWriteMaterial、

NiDirectionalShadowWriteMaterial、NiSpotShadowWriteMaterial,适用于三种不同的光源类型。

  • Shadow Technique:这个类封装了阴影算法的细节,包括生成ShadowMap和使用ShadowMap投射阴影。
  • Shadow Render Click: 这个类是一个生成ShadowMap的批,这个类的对象是由shadow click generator负责生成。
  • Shadow Click Validator: Shadow Render Click:通过此类对象判断接受阴影的几何体对于shadow generator来说是否可见。
  • Shadow Map: 每个ShadowMap对象包含一个作为阴影图的纹理,shadowmap对象由shadowManager直接管理,每个shadowmap对象都被一个shadow generator引用。
  • Shadow Cube Map: 同shadowmap作用相同,只是阴影图的纹理类型为CubeMap。主要用于点光源生成的全方向阴影。
  • Shadow Generator: 阴影生成器,每个ShadowGenerator都对应一个NiDyamicEffect(NiLight的基类),也就是为这个NiDyamicEffect代表的光源生成阴影, 生成阴影所采用的技术由对象引用的ShadowTechnique来决定。
  • Shadow Click Generator: 生成ShadowMap的Shadow Render Click都由此类负责创建。这个类为每个ShadowGenerator指定ShadowMap,并负责每帧更新ShadowMap和ShadowMap所对应的变换矩阵。
  • Shadow Manager:所有的ShadowMap、ShadowTechnique、ShadowGenerator、shadow render click对象都由ShadowManager统一管理,并负责使用一个shadow click generator 在每一帧生成一个shadow render click的列表。

阴影系统静态结构如下:

clip_image012整个阴影渲染的流程大致如下:

1. 在应用程序初始化阶段,通过调用NiShadowManager的Initialize()接口实现对整个阴影系统的初始化,此时应用程序会注册所有的ShadowTechnique,并初始化NiShadowClickGenerator。

2. 当我们创建一个NiLight以后,我们可以通过NiShadowManager为这个NiLight新建一个NiShadowGenerator,NiShadowGenerator会通过NiLight的类型来选择合适的NiShadowTechnique,此时NiShadowManager会为新的NiShadowGenerator创建一个NiShadowRenderClick。

3. 当帧渲染系统启动后,NiShadowRenderClick的PerformRendering()接口会被调用,此时NiShadowRenderClick会通过引用的NiGenerator获得阴影生成的着色程序和所需的数据(例如深度偏移),同时通过NiGenerator引用的Camera获得场景图中的可见集。下一步就是对可见集中的渲染对象添加ShadowWriteMaterial并设为激活状态,而ShadowWriteMaterial的类型是根据NiDyamicEffect的类型指定的。最后NiRenderClick就会启动渲染流水线,将可见集中的对象的深度全部渲染到ShadowMap中。

4. 在第一个RenderClick中生成了ShadowMap,下面就要使用这些ShadowMap投射阴影。在每一帧开始之前,用户还可以自己指定不接受阴影的节点,手动将其插入NiShadowGenerator::m_kUnaffectedReceiverList中。在渲染BackBuffer的RenderClick中,首先会对场景图中的节点进行一次遍历,将不受阴影的节点放入NiShadowGenerator:: m_kUnaffectedCasterList的列表。在对每个节点进行渲染时,会遍历NiShadowManager中所有的NiShadowGenerator,判断这些NiShadowGenerator是否对这个节点有影响,判断的规则是此节点是否存在于UnaffectedReceiverList和UnaffectedCasterList这两个链表中,如果存在于任何一个链表,则节点不受此NiShadowGenerator影响,如果受此NiShadowGenerator影响,那么就将该NiShadowGenerator上的ShadowMap和数据更新到节点上的渲染属性中,NiStandardMaterial会根据这些数据选择对ShadowMap采样的方式,并将结果混合到最终的输出颜色中。

值得注意的是,点光源的shadowMap默认的是采用CubeMap实现,用户可以通过接口选择不使用CubeMap实现,当采用CubeMap实现时,光源无法产生软阴影。

渲染系统的扩展:

为了验证GameByro渲染系统的扩展性,笔者尝试着加入了一个后期处理特效Screen Space Ambient Occlusion(SSAO),即屏幕空间的遮蔽,由于仅仅为了熟悉GameByro的渲染流程,所以笔者并未对SSAO算法做深究,仅仅用了自己简化的算法。

在渲染过程中先单独使用一个RanderClick将场景中的深度渲染到一张纹理上,然后在渲染到后台缓冲区的RenderClick中对深度纹理进行采样,执行SSAO算法,将结果混合到最终的结果中。采样点的偏移坐标是通过对一组随机向量进行归一化再乘以0~1之间的随机数而生成的,即长度为0~1之间的随机向量。

PS代码如下:

float VerticalRange:GLOBAL; //控制XY方向采样范围变量,可以在应用程序层对其进行调整

float HorizontalRange:GLOBAL; //控制在Z方向采样范围的变量

float calAO(float2 texCoord,float dw, float dh ) //通过当前像素所标和偏移量计算AO

{

float2 coord = float2(texCoord.x + dw, texCoord.y + dh);

float4 CenterPos = tex2D(DepthSampler,texCoord);

float4 CurPos = tex2D(DepthSampler,coord);

float depthDiff = clamp(CenterPos.z - CurPos.z,0,VerticalRange);

float ao = depthDiff/length(CurPos.xyz - CenterPos.xyz);

return ao;

}

// Pixel shader

float4 PS_SSAO(VS_OUTPUT In) : COLOR

{

float2 texCoord = In.BaseTex;

float depth = tex2D(DepthSampler,texCoord).z;

float ao = 0.0;

float scale = HorizontalRange/depth; //因为采样范围会受深度影响,故除以此系数。

for(int i=0; i<32; ++i)

{

float2 offset = arrRandomPt[i].xy* scale;

ao += calAO(texCoord, offset.x, offset.y);

}

ao/=32;

float4 color = tex2D(BaseSampler,texCoord);

color.xyz *= (1.0 - ao);

return color;

}

最终实现效果如下:

clip_image014clip_image016

SSAO生成的明暗图 无SSAO材质

以下两图上图为无SSAO效果,下图为开启SSAO后的效果。

clip_image018

clip_image020

总结:

GameByro的帧渲染系统是比较灵活,想加入自己的渲染流程是比较容易的,此外由于RenderTarget和RenderView都可以由用户指定,所以想实现自己的shader效果不是很难。然而,NiStanderMaterial的shade tree比较复杂,总共高达6000行代码以上,过程非常复杂,这就是说,如果想实现自己的材质处理流程也要付出相当大的工作量,阴影系统虽然实现了较低的耦合度,但是实现过于复杂,不够简洁高效。

作者:叶起涟漪

posted @ 2009-04-22 10:22 Condor 阅读(2143) | 评论 (2)编辑 收藏

★ 你好,我去杀几个人,很快回来。
★ 我去后山和黑山老妖研究吃唐僧的事,有事回来再说。
★ 便秘中。。。。。勿搅。。。
★ 你终于来啦,我找你N年了,去火星干什么了?我现在去冥王星,回头跟你说个事,别走开啊
★ 您所呼叫的用户尚未安装QQ......
★ 你呼叫的人现在不在,当你听到硬盘“咔”的一声,请对着鼠标留言,谢谢......
★ 主人不在。到哪儿去了?就......就是不告诉你!真要找的话,请按住电脑power键4秒钟后留言......
★ 该用户没有回应,可能用户忙,请稍候再试。或按Ctrl+Alt+Del返回.
★ 自杀中,稍后再说...
★ 有事找我请大叫!
★ 你现在连接到的是海狼的冰箱,放入食物后请断线,谢谢合作。
★ 我正在下五子棋,上次分心把裤子输光了。这次再输会被拍裸照!我可不想让人看见,等这盘下完了一定回你。
★ 嘀,这里是自动应答,MM请再发一次,我就与你联系;JJ请再发两次,我就与你联系;GG、DD就不要再发了,因为发了也不和你联系!
★ 腾讯服务器系统崩溃,请稍后再试!
★ 计算机正在处理你的信息,请稍侯,如果长时间没有响应,请重新启动计算机!
★ 你好,现在我在玩一个叫CS(或其他)的游戏,有事请按下电脑上“RESET”键,在听到“嘀”一声之后留言,谢谢
★ 你有权保持沉默,你所说的一切都将被作为存盘记录。你可以请代理服务器,如果请不起网络会为你分配一个。
★ 您使用的QQ是未注册版本。您可以继续使用本软件,但将屏蔽发送短信息的功能。支持国产软件,请您注册新版!
★ 广告之后,马上回来!
★ 正在澡澡哦~~不要偷看~~~嗯~啊~~嗯~啊~~~
★ 在加本人为好友前请详细阅读以下条款:1.未满18岁者请在父母指导下与本人聊天;2.非专业聊天人士,不承担主动招呼义务;3.谢绝你问我答制。在本人不回复的情况下请自觉停止一切信息!
★ 你所呼叫的用户正在系统整理,请稍后再呼。
★ 此人正在被国际刑警组织全球范围内通缉,如果您有此人的消息,请拨打当地报警电话120,请对着电话说如下密语言:我真的不是疯子,我不是疯子,我真的不是疯子!然后汇报你的所在地谢谢合作。我们的专业人员会去保护您的安全。
★ 您的QQ已经中了我安插的病毒,请不断向本人发信,否则本人一有闲暇立刻动手!
★ 您好,QQ今天休假,我是NETANTS......
★ 由于大气电离层影响,与该用户的卫星连接已中断,请稍后再试。
★ 对不起,由于服务器的原因,您刚才发的信息丢失,请重发一面。
★ 机主正在裸奔,机主已奔出服务区。
★ 正在格式化你的硬盘,请稍候......
★ 唉呀~你可真调皮!你看,我话还没说完你又来了~~
★ 嗨~我现在不在,如果有事请在听到“逼”的一声后留言······逼!
★ 对不起,网路不通,请重新发送...
★ 你要机主不在,请等到“嘟~”声后拿起鼠标留言。。。
★ 对不起,您所呼叫的用户不在计算机旁,请你现在立刻猛击你的显示器直到它冒火花为止,听到响声后我会给你回复
★ 你好。这是腾讯服务中心自动回复。收到这条信息表明您的操作系統出了问题。请按Ctrl+Shift+Del
★ 您所呼叫的用户先不再服务区内......可能是网络不通...想解决此类问题...请您将头用力撞向显示器......以保证网络通畅......
★ 本人现在位置:WC; 姿势:下蹲; 脸部:抽搐; 状态:用力中。。。。
★ 注意:使用腾讯移动QQ的用户可能无法立即获取你的留言。
★ 我去吃饭了,如果你是帅哥,请一会联系我,如果你是美女.................................就算你是美女,我也要先吃饱肚子啊
★ 你要和我说话?你真的要和我说话?你确定自己想说吗?你一定非说不可吗?那你说吧,这是自动回复,反正我看不见
★ 你好,我是XXX的自动回复,现在他不在,跟我说什么我也就这几句!
★抽筋中……请勿打扰……
★悟空啊,你想和为师说话么?想说话你就说呀,你不说为师怎么知道你想和为师说话呢?

posted @ 2009-04-06 21:43 Condor 阅读(577) | 评论 (0)编辑 收藏

终于结束了近一个小时的枯燥会议,每周五公司级别的项目周会就像一个例行的检查,多少有点不痛不痒的味道,大部分的时候就是一个例行贯事,每个项目组按照顺序汇报一下各自项目组的情况和需要,如果不出现大的问题的话,也就是有本上奏,无本退朝的一个过程。或许有些人觉得这是一个比较浪费时间而且意义不大的会议,每周浪费大伙一个小时的时间去再次陈述这些本来在邮件中已经说明的问题和项目进度,不过存在就有价值,这个会议的最大的功能在于能尽量使各个项目组之间有部分的消息互通,至少能让大家了解到一点,其他人都在做什么,从而避免了每个项目组过于孤立的现象。
       今天的周会时间有点长,主要由于两件事情的讨论超出了会议的议程安排,第一件事情是大伟负责的项目目前进度出了问题,目前人员处在一个持续加班的紧张状态,即便如此,对于项目的最终Release时间还是比较确定的状态,用大伟的话来形容就是:“我们能够按时完成,但是可能会有点小问题。”一句比较含糊的托词,如果说套用官方的言词就是:“对于项目能够按时完成,我们还是谨慎乐观。”另外事情对于公司来说是一个好消息,公司将在下个月启动一个新的项目,这个项目是今年规模最大的一个项目,其业务方向主要针对美国的医疗领域,规模大概有150人/月。
这个项目将会被安排到我们项目组来处理,消息对于我来说就是一个挑战,对于自己来说,这个规模的项目也是超过了以往的一切项目,在会议上听到这个项目将由我来接手处理,不由小小的兴奋了一把,但是这股兴奋的感觉很快就被冲淡,自己粗略的考虑了一下项目组内目前的工作量和目前的人员情况,不由感觉到这个活不太好揽。不过有压力才有动力,这是我一贯的做事风格,类是这种明知会将苦重重的活,我越能够信心十足。我简单的在自己的记事本上写下了以下下周的关健工作内容:确认项目的具体开始时间和结束时间;调整目前项目组内的工作内容;向客户先要部分的开发相关资料;了解一下公司内部其它项目组的人员状况。
       会议后半程的内容我没有听多少,只是对于大伟的问题大家有部分的讨论,我才回过神来参与,大伟虽然说自己还是有信心能够保证项目的进度,但是为了保险起见,希望从其它的项目组借调两个人来协助他们做一些类是测试的工作,这样的话总的进度就可以进一步得到保证。以目前公司的架构模式,每个项目组相对独立的运作模式,如果说希望从其它的项目组借调人员,这种短期人员的借调有时候是比较困难,因为每个项目组目前来说都处于比较繁忙的阶段,目前闲暇的人员不多,即便其它项目组肯借人,大多放出去的人员也都是能力相对比较弱,正常情况下人不可能把项目组内部优秀的人员借调出去,这或许也是人的一种私心。
       在公司的协调安排之下,最后还是给大伟支援了两个人员,这才把讨论不休的会议打住。会议结束后我还在会议室坐了一会,我的脑袋里还在考虑下周的工作顺序,盯着自己的笔记本在对刚刚写的问题进行细化,把工作分解到下周的每一天。突然一股浓浓的烟味直接灌进我的鼻子,我不用抬头就能猜出是大伟,这个烟枪一天最少一包烟,如果遇到加班或则心情不好的话,估计两到三包都有可能。
       “少抽点烟,怎么心情不好?”看着大伟吐着烟圈,我问道。
       “没有,只是有点累。”大伟嘴里叼着烟,目无表情的应道。
       “我看到你们项目组的那些去年刚刚毕业的学生,最近是天天加班到晚上11点左右。这是怎么回事?”
       “噢,那时我故意的。”
       “故意?”我一时没有明白,疑惑的问道,“为什么要故意呢?”
       “我是按照我自己的工作能力给那些新人安排工作,如果说我是能够在上班时间内完成工作的话,那么那些新人肯定需要加班了。这样他们才能进步。”大伟的表情中开始露出得意的神色。
       “怪不得他们要加班,你工作了多少年,他们才工作多少年,再说了你拿的工资和他们那得工资能一样吗?”
       “我就告诉他们,如果你想工资那得和我一样,那么这些工作你能够准时完成,那么你就有机会。”大伟熄掉手中烟头,用双掌在脸上使劲得措动。
       “那你该不会是按照你的能力来做的项目估算吧?”对于大伟的这个逻辑我并不能苟同,但是我还是想了解项目的问题。
       “嗯…..”大伟支吾着回答到。
       “哈哈,你这是自作自受。”我对着大伟带着嘲讽的笑声说道。
       对于大伟的做法我却是无法苟同,虽然他的失误在于前期的估算过于乐观而且并不准确。但是对于给新人安排工作的方式上存在有比较大的问题,如果说前期的估算出现失误,这些错误在后期项目开始过程中还可以进行添加人员的方法进行补救的话,那么对于人员使用不当的问题,就像整个项目过程的绝症,其会影响到整个项目过程。
       项目组中开发人员从能力上有几个不同的级别,系统架构师(Systems Architect),高级工程师(Senior Engineer),中级工程师(Middle Engineer)和初级工程师(Junior Engineer)等等。对于每个级别上的人员的能力和开发技能都有一定的差异。这些就像我们手的手指一样,五指有长短,能力个不同。不同能力的人员应该在项目组中相应的工作内容和工作量。
       在正常的项目中我们讲究的是人尽其用,但是不能把一个项目在开始的时候就设想是通过发挥项目组人员的超水准的基础上来完成。很多人都说人在一定的压力之下,能够超能力的发挥出他们的水平,但是比代表说所有的人都能够在这种环境下能够有说突破,很多人在持续长时间的高压下会显得精神不振,萎靡的情况。所以作为项目管理来说,不能再项目一开始的时候就采用这个立足点来进行开发工作。
       对于大伟所说的那种歪论,我只能回应以自作自受的答案。我们给个人都是在逐步的学习和进步,如果说有一定压力灾,对于学习确实是一个比较有效的促进。但是作为项目经理来说,需要明白的是一个问题,我们的职责在于项目,而不是在于锻炼新人,新人进入项目组织后,通过项目过程的工作和学习能够提高他们的能力,这些是项目的副产物。而我们首先要保证项目的进度,质量。我在实际的项目开发过程中,对于给新人的工作计划都是按照其能力的80%-90%进行安排,很少会针对新人能力的100%进行工作任务分派,因为新人由于缺乏经验,所以在项目实际过程中如果遇到问题,他们解决这些问题的所采用的方法和思路都存在有时间的风险,有时候他们可能由于一个问题会难住他们,消耗掉很长的时间。即便我不断强调说如果有遇到问题,在一个小时内解决不了的话,就要把问题抛出来给大伙来共同处理,但是往往这个问题被最后迫不得已提出来的时候,都是在一天或则更长的时间之后。新人在开发过程中遇到这些问题的概率非常高,所以在工作安排工程中必须要考虑到这种风险。所着一旦推倒第一张加班的牌,那么后续的将是多米洛效应,加班将一发不可收拾,进入恶性循环阶段。
       对于实际的项目中我会采用减算安排工作的方式,那是因为我需要保留对项目整体的进度有更大的回旋缓冲时间。无论对新人还是对高级工程师,中级工程师和初级工程师我都会采用一样的策略,因为人脑不是机器,所以我们无法保证我们时时刻刻都能正常的满负荷运转。但是在平常的学习过程或者非实际项目的锻炼过程中,我会采用超负荷的工作安排模式,这个时候给人员的工作量安排都是100%-120%的程度,因为这个时候我的主要目的在于人员培养,所以需要一种超强度的环境,营造一种压力的气氛。其实开发过程何尝不是一个不见硝烟的战场,如果你想要在战场上不受伤,只有在平时多多受伤,这样在真实的战场上才能从容应对。
       对于项目组中我们需要比较清楚的了解每个成员的能力和个性,如果对于他们的能力了解能够像看着我们手指头那么清楚,我们就能够依据他们的长短,让他们协调发挥出水平来。我们需要避免工作不分能力,均等划分的安排方式,更不能把项目寄托在成员的超水平发挥的基础上。在工作中我们需要明白项目的最终目的,项目成功还是锻炼人员,从而采用减算还是加算得工作安排方式。
作者:Yice(小余)
出处:http://www.yice800.cn

posted @ 2009-03-25 21:20 Condor 阅读(554) | 评论 (0)编辑 收藏

超仔刚刚推门进来,屁股还没有碰到他的椅子上已经让人感觉到他欢喜轻飘的神色,我抬头望着他眼睛,神色中洋溢的满是欢快。我看着他那兴奋的样子,微微笑着问道:“签完了?结果还可以吗?”
“还不错!”
“能满意就可以,继续努力。”
“嗯。”
我知道超仔刚刚和公司签了新的合同,在新合同里他的工资有了一定的提高,这些都是因为对于他去年的绩效考核成绩还不错应该得到的结果。
年底对于我来说,可真是多事之秋,因为我需要在年底前完成对我团队这些人的一年的绩效评定,这些不但关系到他们年终的奖金,也影响到来年他们工资的涨浮。虽然自己一直讲究的是赏罚分明的做事方法,但是往往对于我来说要清晰分析哪个人在过去的一年中犯了什么样的错,对于这些错误去做一个评定,算其功过,工作不亚于一个项目的开发。一方面如果我评定的尺度太严格,那么最明显的一个影响就是年底年终奖金和来年的工资,在工作中涉及到这部分利益的东西处理起来本身就是敏感,所以自己一直都是平时严厉甚至苛刻,但是到这个时候,我反而会手下留情,只要态度对位,错误可以酌情考虑。对于我来说,一个人的态度决定他的一切。
“我的工作目标就是要替掉你。”这是超仔在面试的时候留给我印象最深的话,也因为这句话我发而对他有不少的好感。人最应该有的是有自信,超仔是刚刚毕业一年的新人,在面试时候做在我前面表情僵硬,全身紧张的他,在我问“你希望进入公司之后,能够有什么养的发展方向时?”这样的回答可能是一种自大,但是在我看来,这也是他的自信。也这是这种自信让我决定录用这个计算能力不算好,但是我觉得各种条件还算合格的小伙子。
当然我也非全凭一句“就要替掉你。”就把小伙子招聘进来,然后放到自己身边使劲搂拧,我想自己还不至于有这种变态的爱好。我喜欢面试的时候让应聘人员都手动填写一份简历,虽然很多时候他们自己都带了一份打印的现成简历,但我还是会让他们把公司那份表格填写完整,虽然很多时候他们自要把内容抄写过去就可以,但是这也是我对他们的第一个考验。很多程序员的字写的都有大师级的水平,对于他们来说,楷书,行书都不足以表达他们的意境,狂草,唯有这个才能体现他们的追求。有不少程序员在填写这个简历的时候,字迹就和天书一样,当然文字也像蛇一般的在纸上盘绕。
对于我来说,我只是通过这张简历看看他对自己的一个态度,我不要求他们的字能够达到书法家的水品,但是至少要工整,整个纸张让人看起来要干净清晰。我很难看到你对目前的工作有多少的渴望,但是我可以通过你写下来的文字看出来你是否重视这个事情,如果连工作机会都不重视,那以后的态度就值得担忧。所以通过这个我也放弃掉不少的人,虽然有些人在和我免谈的时候给我感觉也非常不错,但是如果两者结合在一起评定,如果后面没有做好,那么我只能认为他是学院派的,能说未必能做。
超仔长的不像程序员的样子,一米七五的个子,相貌也有几分帅气,留着平头短发,每日衣着新潮个性。他平时个性活泼开朗,又一次他还请了一天的假,说是去参加超男的选拔赛,结果回来之后,感慨道:“强人太多了,人外有人。”不过自己到没有为被淘汰的事情耿耿于怀,倒是很享受乐在其中的过程。
超仔进入公司的时间也只有半年左右,在这边年里面他不到两个月就给他转正了,比公司规定的三个月试用期提前了一个月多。肯学习和努力的态度让我对自己当初挑选他感到非常满意。在第一个月培训的时候,让他整理了以前遗留的旧的项目,那些项目本身缺少相关部分文档,但是由于项目一直在延续开发,所以久而久之,也就这么一直持续的做下来,那些已经对这些内容滚瓜烂熟的人也就没有心情去做,后来者也之能够在前辈的口传身教的情况下才能了解其中的奥妙,我一直希望能够把这部分资料补充完整。但是由于人手上不足,所以就一拖再拖。
公司对新人有比较详细的培训计划,在这些培训之外,我对超仔说:“你看看这个程序,因为你以后需要维护和开发这个,如果你有时间的话,可以把熟悉开发环境的步骤写成文档,文档的格式可以参考项目组内其他的模板,内容你线考虑一下,但是有一个要求,如果另外一个新人来接触这个程序,我需要他再看了你的稳当之后,就可以把环境搭配起来。些做的方式可以图文结合。”
结果在一周之后,超仔就给我说:“小余,我把那份文档写了一部分,你先看看有什么问题,如果不行的话我再修改。”
很多人都知道程序员非常讨厌写文档,所以很多程序员写出来的文档比写出来的代码还要难读,有时候读这种文档就是一种折磨,比读法律条款还难受,估计很多时候需要和法律文件一样,需要再配套上一本详细的解释才能把问题说明清楚。
但是超仔的文档让我非常满意的地方在两个地方,一方面再环境搭建的时候,用了截图的方式描述,而且每一幅图都是用作图工具简单的剪裁过,只保留关键部分,而避免乐像其他人那样是整个屏幕的图片,在么个图中对于操作关键区域还用红色正方形边宽标注说明,每个图片还有编号。
另外一个是整个文档是用Excel文档做成的,因为公司比较喜欢用Excel做给中开发文档,但我尝试着用打印预览的时候,让我惊奇的事情发生了,总共10页的文档,每一页都调整过,图片没有出现跨页的问题,而且打印的页头和页尾都修改过了,并没有保留上个文档的名称,作者和日期也都是正确的。
“页面打印是你调整过的?”看着文档,我轻声问道。
“我常常听到你让大家发邮件给客户的时候,要预览一下。所以我也就调了一下。”
听到这话,我心中是暗自窃喜,一个新人能够有这样的工作意识和态度,实属可造之才,技术可以学习培养,但是如果你想改变一个人做事态度其难度要远远大于技术上的培养过程。
超仔在后续半年的工作中也有犯了不少的错误,从刚刚开始技术上弱势,但是好学肯问,其进步的幅度不小,也使得他在很快的时间内能够达到对他所定位的能力要求。在于我看来这一切取决于他的态度,态度端正。
“态度端正,学习良好。”我的脑海中突然冒出这几个字,这不是小学时候,老师在每学期的期末成绩单上最喜欢用的两个评语。什么是态度?怎么才能算是端正呢?我在心中问了一下自己:“我的工作态度算不算端正呢?”或许像超仔这样的新人属于上升求学阶段,所以憧憬无限,但是对于我来说呢?当年何尝不是如此,现在还是不是一就有这样的心境呢?
“哎。”想着想着,不由自己叹了口气,难道我老了吗?怎么我还没有感觉到青春灿烂,这青春怎么就没了呢?看看坐在开发室中的其他人:老马,阿毛,木子,超仔,大师, 杰克这几个人,我们应该是活力无限的开发团队。
“Hi,小余,你在吗?”还没等我在继续发愣,MSN上的就弹出消息来。是上海的PM李。
我急忙回过去问有什么事情。
“我刚刚给你发了一封邮件,我把需要像客户移交的内容重新做了一个整理,你再看看有什么问题没有?”
我突然记起来,昨天晚上快接近9点的时候,我还在理发店修头发的时候,就接到李从上海给我打过来的电话,她问我现在有没有先前她发给我的计划列表,因为明天客户需要确认,所以她想今天晚上再把这份计划列表完善一下,如果我笔记本上有备份的话,给她转发一份,结果我刚好也只是把邮件接收到公司的机子上。最后我听到她在电话里说了一句:“那好,我明天早点去公司去修改一下,然后再给客户。”
李在一个月之前已经和公司提出离职的申请,因为她家庭的原因,她需要到国外发展。应该说再过两天她就会到美国去了,她本来是这个项目上海的项目经理,但是对于我来说,她是一个非常优秀的项目经理,从她身长我看到了一个项目能够成功的关键,态度。也就是她的这种工作态度,让整个项目有序稳定的进行。
在听完李的电话之后,我里一直佩服到,这才是工作态度。
作者:Yice(小余)
出处:http://www.yice800.cn

posted @ 2009-03-25 21:19 Condor 阅读(642) | 评论 (0)编辑 收藏

你有没有考虑过自己能够管理多大的项目,能够带领多少人员的项目团队?5人?10人?100人?还是千军万马?但是在现实的项目中,能够带领100人员的项目经理未必能够带好10人的团队,反之亦然。因为作为软件项目来说存在有非常大的差异?无论你是大才还是小才,我们首先要清楚的认识到自己的才能是否能符合项目的实际应用,5人的项目和100人的项目团队中项目经理的工作重心必然不同,如果不区别对待,那么你的结局是大才小用,或者是小才大用。
项目的差异性
我没有机会参加类似IBM的OS/360规模的项目,我所能够参与的最大项目规模不过是100人/月上下的项目,当然也做过产品线的长期开发项目。所以对于那种巨无霸形的项目也只能是望梅止渴,对于其中的奥妙也只能捧读《人月神话》这类的经典,希望能够从中吸取精华来强壮自身。
项目的规模不一样,项目所能够配备给定的人员也不一样,对于大型的项目,除了项目经理之外,还会配置项目辅助管理人员和咨询顾问管理人员等。如果说项目超过了10000人/月这个规模,项目往往会采用纵向切割来进行管理,整个项目会像工厂中产品线生产方式:系统需求;系统设计;配置管理;代码开发;系统测试;文档编写;产品构建等过程,整个项目会根据不同的分工被切割成每个小项目团队,虽然每个团队可能的工作都只是针对于局部,在各自的内部这些工作是相对独立的,但是每个项目又都对其他部分有比较严重的依托,比如系统设计是以项目需求为基础,代码开发是以系统设计为前提,所有的工作序列彼此关联,每个工作都可以独立安排二级甚至三级的项目经理,这样整个项目的组织管理模式也就形成了金字塔的模式,从项目经理到最底下的开发人员形成一个自顶向下的体系结构。这个时候对于项目经理的主要工作也就不能要求事必躬亲,小到一个螺丝钉都要亲自过问,对于这种项目经理的要求更多在于总体协调和整体的掌控上面,他就像一个元帅一般的任务,要的是果断的决策,准确的判断,良好的协调和丰富的管理经验。
实际上大部分的项目经理很难有机会成为如此大规模项目的最高决策者,即便有机会参与的时候,更多都是处在二线或者三线的位置,所能够管理的实际人员也大部分在10人或则20人左右。更多项目经理参与的项目都是中小规模的项目,毕竟中小的项目的数量还是非常巨大,所以有很多的项目经理在从事这种的开发工作。对于项目规模在100人/月的项目对于很多公司来说也算是具备有一定规模的项目,这些项目的人员投入一般都会在10人之上,不会有公司对这种项目采用投入一个人做一百个月的方式。对于10人规模的项目管理对于大部分的项目经理来说可以是一个不小的挑战,因为虽然说项目的规模不能与上述所说的超级项目抗衡,但是项目在整体过程中所做的事情和上述相当,系统需求,系统设计,配置管理,代码开发,系统测试,文档编写,产品构建等都不会缺少,但是在人员配备里面可没有二级或则三级的项目经理,甚至很多时候会有人力资源捉襟见肘的情况,在10人的规模里面可是要包含需求做成人员,项目开发人员,测试人员等。在很多的时候一个人需要充当多个角色,可能在某一个阶段你需要做需求,当需求做完了之后,你又需要投入开发,后期的时候可能需要做项目文档和项目部署,甚至用户培训。所以对于我的直观感觉来说,这种项目对于项目经理的能力要求可能更高,如果要做好这种项目的项目经理,首先最好有比较扎实的技术开发能力和工程背景,这样你的项目估算才能做得比较准确,为后续的开发赢得更多的时间;其次好需要又比较良好的业务知识,因为你可能更多需要做一个用户的接口,所有的需要都需要通过你和客户去沟通,以及最终的定案,所以对于业务的熟悉程度也至关重要;再者需要又良好的计划性,因为这种项目的变数比较多,项目不会像又很长的规划周期,所以如果控制好这些可变因素,已经如何协调内部的有限资源,让资源发挥最大的优势可能成为项目经理每日计划中关键的一部分。
还有不少的项目规模在10人/月左右的项目,这种项目对于很多公司来说属于不痛不痒的项目类型,因为同一个时期内公司可能会有多个这种类型的项目同时在进行中,在这种情况下项目所能够获得的资源就更加有限,往往项目的安置人员也就在5人左右,当然和上面两种情况类是,项目过程的事情还是不可省缺,但是由于项目总体的规模偏小,所以项目的复杂度也比较容易控制,但是这种项目对于项目经理的要求更多在于技术上的要求,因为如果这个时候在安排一个缺乏技术经验的人员做项目经理,那么整个项目组的安排出现一个外行领导四个内行的局面,而且四个内行中可能有一半以上是新人或者初级的开发人员,如果再包括测试等一系列的工作,人员分布上就缺乏合理性。所以这个时候的项目经理往往都是技术过硬的人员担任,这样可以化解人员不足的问题,但是也有一个问题,对于技术优秀的人员都会有一个通病,首先看不上别人的工作结果和质量,另外一方面往往会以自己的标准去衡量别人和给人安排工作,这样对于新人或者初级的开发人员来说,他们的工作就会出现不合理的问题。同时在做估算的时候也比较容易出现轻易的问题,以自己的能力估算项目进度,结果造成项目估算不准确,后期严重加班的问题。所以这种类型的项目经理需要又良好的技术背景,还需要学习项目的实际管理和合理的人员安排,以及如何做好与项目内部成员的友好沟通和关系。
最后一种项目类型就是那种一个人吃饱,全家不额的类型,项目规模非常小,不到1人/月,所以在这种项目的投入人数往往只有一个人或则两个人。当然这个时候也不会要求说项目开发的那一系列的工作都做到位,很多时候都是口头相传,这种项目的结果大部分之要求软件代码和程序能够满足要求。所以这个过程中很多人可能认为只要管好自己就可以了,但是我认为,时间虽然短,但是事情还是需要做足,比如说需求的明确文档化,还有与外界的沟通等一些列过程实际上都可以和正常的模式一样,对自己的工作也需要有一个良好的计划,这个时候对于自己的要求就是一个锻炼的机会,为今后做更大的项目准备好时机。所以这种项目经理的要求实际不抵,如何管理好自己可能会是一个比较大的难题。
项目类型的差异性
项目从规模差异上来说是对一个项目经理的开发能力,管理能力等有不同的要求。但是如果说从项目类型的差异的角度来看,就会对项目经理的一些其他能力又要求,如果说你做的是国内的项目,那么你需要有与客户沟通的良好能力,能够有足够的能力应对客户的各种要求,如何应对客户千奇百怪的要求,如何合理的说“NO.”都是你需要具备的能力。如果说是对日,对欧美的外包服务开发,需要有良好的语言沟通能力,比如说日语,英语。还需要了解不同国家的文化差异等等,这个时候你可能需要充当起桥梁的作用,如何与国外的客户进行沟通和交流,包括有工作安排,技术上等一系列问题的沟通工作。
给自己的定位
项目管理本身就是一个比较复杂的过程,不像行军打战那样,有了一盯一眼的制度就可以管理好项目,因为项目的变数太多,情况迥异,也就没有放之四海而皆准的管理方法。所以对于不同类型的项目来说,我们需要了解项目的特点,在我们有良好的基础准备的前提下,根据自己的能力特点,再结合项目的实际情款来不断调整工作中的方法和内容。
虽然我们很难有一个标准化的管理手册来指导每一个希望做项目经理的人,但是我们可以从别人身上去借鉴各种成功或则失败的经验,特别是别人失败的经验,因为别人的成功可能我们很难克隆,但是我们可以避免别人错误再我们身上重演。
不想当将军的士兵不是好士兵,但是不想当项目经理的程序员未必是坏的程序员。毕竟对于技术领域来说,程序员的最终发展方向项目经理未必是一个最优秀的方向,程序员可以走的道路有很多,可以往架构师,分析师,资深技术人员,咨询师等等。路可能有很多条,而且每一条对于人员的能力要求也都不一样,都有良好的发展机会。所以对于自己能力的判断和分析,认清自己,给自己合理的定位是直观重要。让自己的才华得到发展和认可是今后职业道路上一个关键,自己要才尽其用。
作者:Yice(小余)
出处:http://www.yice800.cn

posted @ 2009-03-25 21:18 Condor 阅读(439) | 评论 (0)编辑 收藏

自己一个人独自回想工作了这么多年,到底给自己留下了什么?如果要给自己找一个答案,或许有两个会在今后很长一段时间一直影响自己的东西,一个是在工作了这么多年让自己明白了我们要担负什么样的责任,另外一件是工作这么多年给自己的颈椎留下了不小的病症。一好一坏或许是这么多年的最大收获。
我们该如何看待责任
时至今日蒙牛老总牛根生说过的那句话还让我记忆犹新,“有德有才,破格重用;有德无才,培养使用;有才无德,限制录用;无德无才,坚决不用。”在我认为德的基本就是这个人的责任心和他的态度。无论是软件行业还是其他的行业,在很多的时候考核一个人是否符合相应的工作岗位,职位技能往往不是最主要的考核标准,而在所有的考核标准中,人的品性和责任态度才是考核的关键。
什么人活得最轻松,不负责人的人。丈夫有责任给妻子一个良好的生活环境;父亲有责任给孩子一个良好的生长环境;孩子有责任赡养自己的父母;员工有责任做好自己的本职工作;所有的这些都是一些基本的责任。如果一个人富有责任心,生活中的这些责任会让自己感觉到沉重的压力,一旦人在这些压力的之下,要想过的轻松舒服就很困难。所以如果你希望自己过得轻松写意,你放下一切的责任态度,做个不负任何责任的人,那么或许你会过得比较轻松,但是你也将成为社会中一个不合格的人。
软件开发本身属于脑力密集型的劳动,所有的一切都依托于人,软件行业本身和其它的制造行业有一个本质性的差异,软件主要依靠人的智慧来进行工作,虽然我们现在看到很多的软件工程管理书籍,无论是大师的作品,还是坊间口声相传的经验之谈,我们都很难解决一个问题,我们很难像制造行业一样,让我们每个程序员写出来的代码都能够像机器加工出来的那样,每一个行代码都能够像一个模子印出来的,很难做到整个团队写出的代码像出至一人之手。所以软件行业的工程管理比其它的工程来说要存在有更大的困难,那么在这些问题困挠之下,整个行业对人的依赖尤为严重,对人的依赖程度也就造成对人本身品德和责任心的要求程度相对要高。
在自己工作这么多年来,感觉最轻松的时候还是刚刚毕业的时候,那个时候是初出校门,作为一个新人进入项目组中,对于自己最大的挑战主要是能不能按时准确的完成自己相应的模块开发工作。后来开始负责项目之后,虽然也在做编码开发工作,但是所担心的和让自己欢欣的事情和开始已经完全不同。如果你希望自己能够能够作为一个合格的项目经理经理,那么你首先需要明确自己的肩上的担子的分量。在我们的工作中,我们每个人必须承担工作的各种责任,如果我们缺失这种看待责任的态度,那么工作最后的结果往往将会以失败告终。
对于自己在这几年的最大一个一个收获就是让自己更明确到责任重于泰山的道理。当然也是这种态度让自己能够坚持着把一个一个项目做下去,做好这些项目。如果要对自己做一个评价,或许在技术上我不敢说自己有十足的优势,但是这些年养成的这种做事情的方法和态度还能值得一提。
在项目中你该承担什么责任
如果你要问项目组中谁的压力最大,一般说来应该是项目经理,当然项目经理所拿的工资相对来说也会比较高,责任和压力本就应该和报酬成正向比例关系。项目经理对下必须对项目团队成员负责,向上必须对公司负责,同时还需要纵向向客户负责,所以项目经理经理就像一个传动轴承,这个项目的运作应该在他驱使之下有效稳定的运转。
项目经理需要考虑项目的成本因素,所有的公司都是以盈利为主要目的,有时候公司会出于其他的因素和目的,对于项目的盈利并没有很严格的要求,但是项目经理要有成本的概念和意识,要有团队的总体成本和利润要有基本的计算方式。同时还需要控制项目的质量和进度,还有些项目还要求有保密意识和其他的相关要求,这些都是项目经理需要向公司负责的地方。
如何组建好一个团队,如何培养团队的成员,让每个团员很够在一个比较良好的环境中工作和学习,能够实现每个人的目标和各自的价值观,把团队建设成什么样类型,和项目经理所采取的方法有直接的关系,有些项目团队组建后团队人员如走马灯似的换,有些团队组建后队员除了编码之后就没有任何的学习机会,如何利用有限的资源和合理的安排,让团队的成员都能够发挥各自的特长,让每个人都能够体现自己的价值,有时候需要替项目组的成员去和公司去争取他们所应该有的福利和报酬,这就是对项目团队和团队成员所要承担的负责。
我们每一个项目最终都将面对我们的客户,有时候我们的客户的要求会让我们很难接受,甚至有时候会让我们团队感觉到很恼火,但是作为一个项目经理需要化解这些对项目团队一个不利的因素,一方面需要避免影响团队的士气,另外一方面需要和客户进行沟通,明确那些要求可行,那些要求不可行,对于不可行的要求需要给一个比较合理的解释,避免由于后期无法完成对客户造成欺骗的行为。同时需要控制项目的整体进度和质量,保证项目最终能够解决客户的为,这些就是对客户负责的一个态度。
如何树立团队的责任意识
对于项目组中项目尽力所承担的责任应该说是最大的,无论项目的成败都和项目经理由直接的关系,所以任何一个项目做项目总结的时候,如果项目成功的话,需要给项目经理记上一功,如果项目失败的话,不论任何原因,棒子首先需要打在项目经理的身上。项目经理需要对项目的得失成败负上完全的责任。
在一个项目团队中,需要有各个不同的角色相互配合才能最终完成项目,需求调研人员,系统分析人员,高级程序员,初级程序员,测试人员,配置管理人员等,虽然项目经理在项目中的责任最大,但是项目中每一个成员都会有相应承担的责任,或许说着这都是一些工作的职责,开发人员需要按照开发中的各种要求进行开发工作,测试人员需要按照测试的要求准备测试文档和数据等,所有的角色都会有各自的工作内容,在实际工作中我们是每一个角色协作来完成项目,有时候由于项目的规模偏小,有些人可能会同时充当多个角色,比如说高级程序员有时候需要同时兼顾系统分析人员,项目经理有时候还需要兼顾测试等等。但是不论规模的大小,项目经理需要非常清晰的意思到每个角色的工作职责,在项目分工中对各种工作要比较清晰,合理化安排。同时也需要让每个工作的人员清楚的知道自己的工作要求和检验的方式,避免含糊性的安排,做到责任清晰。
明确责任的首要是明确工作内容,对于团队成员中需要做到责任均衡,尽量避免能者多劳的问题,工作中进行工作安排时往往容易把工作重点都落到部分能力较强的人员上,这种安排比较容易造成工作天平的倾斜,一旦倾斜的严重,这部分开发人员就比较容易造成由于精力不足造成质量问题。所以项目经理在安排工作中需要有个权衡,如果说存在人员能力不均衡问题,那么在工作安排的时候,需要尽可能抽取重复性的工作,让能力欠缺的人员做这部分工作,同时需要协调他们学习,也需要明确学习的目标和结果。
对于团队中我们需要树立一个责任意识,同时需要有合作精神,在项目开发中整个团队需要彼此合作,有时候一个人的问题有时候会影响到整个团队的质量和进度。我们最终给客户交付的是一个完整的程序,其中任何一个部分出了问题,客户对整个产品的评价都会因此而改观,客户不会说那个模块怎么怎么样,而是说你这个程序怎么怎么样,这就代表说是一个整体的结果,所以项目经理需要在团队中树立起这种整体的责任意识,避免团队中出现个人自管门前雪,不理他人瓦上霜的现象。
你能承受多大责任
你有没有评价过你的项目经理,你有没有对你的项目经理感到无奈和气氛,如果你希望自己能够往项目经理方向发展,在我看来你首先需要考虑的不是你的技术背景,你的管理经验是不是足够,首先要考虑的是你是不是有能够承受那些责任的心态。如果你是项目经理的话,那么你负责管理的团队无论人员多少,他们需要在你的协调下工作,那么你肩上担负的就是那些人的工作结果和评定,还有来自公司的各种压力和考核。这些比单纯写代码要劳心许多。
影响项目成败的因素有很多,但是如果说项目经理缺少责任心,我可以说项目必败无疑。正是因为这样,我才会在此一再强调责任心的问题。
作者:Yice(小余)
出处:http://www.yice800.cn

posted @ 2009-03-25 21:17 Condor 阅读(489) | 评论 (0)编辑 收藏

如果你爱他,那么让他去当项目经理,因为那里会是他事业的天堂;如果你狠他,送他去当项目经理,因为那将是他的地狱。
软 件开发工作应该属于分工比较明确的行业,每一个项目的启动,调研,开发,测试,部署,用户培训和后期维护等一系列的过程都有不同的角色参与其中。在这一系 列的角色中项目经理是最直接的管理者,无疑显得格外的突出和重要。软件项目开发的成功率本身就不高,在众多的失败过程中,由于项目经理在管理上存在的问题 造成项目无法按时交纳,质量不高甚至失败的例子在我看来数不胜数。虽然项目经理的能力并不是项目失败的直接原因,因为影响项目成败的因素有很多,但是如果 一个合格的项目经理,对于项目的整个开发过程来说,如何利用他的经验和能力来有效合理的管理项目进度,从而避免很多无谓的失误,在项目的最终成败中还是占 有关键作用。
对 于很多从事软件开发的人来说,项目经理是他们事业上追求的目标,从初出校园的小牛犊,从最低级的学徒似的初级开发人员,再不断的努力和学习,慢慢得爬到有 经验的中级程序员,再后来到高级程序员,到后来的大牛人才,慢慢开始带领新人,开始接触项目管理上的工作。我想很多人的轨迹都是这么一步一步的过来。在整 个过程中我们彼此都在学习,关于很多的技术方面的知识可以通过网络和书籍进行学习。但是如何做一名项目经理,如何做好一名项目经理,倒缺乏一个系统的学习 框架,包括我自己在内,也是跟随前人身边学习,自己观察,在一次次错误后进行反思后才有所进步。这个话题的文章我考虑了很久后才决定要写出来,在一系列的 文章中结合我自己的项目和我自己身边的项目,希望能够将这些经验与大伙分享,通过讨论,彼此共勉。机会往往是给有所准备的人,不论你现在是否是充当项目经 理的角色,但是如果你有所准备,我想对于你来说机会只是迟早的事情。
项目从规模来说,可以划分微型项目,小型项目,中型项目和大项目,当然还有超大型的项目,对于工数在一人/月(一个中级程序员开发一个月,总计21个工作日)的项目定为微型项目;对于工数在1人/月到10人/月之间的规模称为小型项目;对于工数在10人/月到100人/月之间的规模称为中型项目;如果超过 100人/月的项目称为大型项目;对于我们所讨论的项目管理中,对于超过1000人/月的项目不做讨论,因为一般的公司来说,还是比较少能够遇到中规模的项目。
如 果从类型来说可以简单的划分为产品开发和项目开发,产品的开发一般会有后续定期的产品升级性开发,项目的开发时间跨度也会比较长,对于项目的开发来说,一 般是指为了满足某一特定客户而开发的软件,其开发周期往往会比较紧张,后续的开发主要是针对客户的新功能追加,这种项目的开发往往会划分为几个阶段分步进 行。
如果从合作方式上也可以划分为自主研发和外包开发,甚至还有部分项目使用外驻人员进行项目开发,有时候开发还受到地域性的影响,两地,三地合作开发,国内国外的合作开发,还有甚至多国之间的合作开发。
不 同的项目开发方式都会有不同的问题出现,比如说小型项目和大型项目的人员配备上就不可能一样,外包开发和自主研发的项目计划也不一样,跨地域的合作上的时 间差异和人员的沟通和本公司内部背靠背的模式也不一样。项目中实际可能发生的事情千奇百怪,这些问题绝大部分都需要项目经理来过问,分析和决策。所以说项 目经理或许对于很多人来说将会是地狱,一旦深陷其中,很难有苦尽甘来的那一天。但是如果方法得当,管理手段有效,能够合理的规避风险呢?那你将会感到项目 中的一切对你来说游刃有余,团队中每个人也都能相应发挥自己的特长,也都能从中找到各自的成就感。
生与死只在一线间,好和坏也是如此。希望能够从项目经理的角度来看看项目实际过程中我们会遇到哪些问题,该如何去处理这些问题,通过着一些列的文章能让你对项目的整体过程有更全面的了解,同时也能够让你更清楚项目经理的日常工作和行为职责。
作者:Yice(小余)
出处:http://www.yice800.cn

posted @ 2009-03-25 21:16 Condor 阅读(544) | 评论 (0)编辑 收藏

作者:Michael Howard
原文出处:Strsafe.h: Safer String Handling in C

  在微软公司举行的Microsoft Windows Security Push 活动期间,一批测试者、程序管理经理和普通程序员共同决定要为 C 语言量身定制一套具有较高安全性的字符串处理函数,并且希望这些函数能被 Windows 程序员和微软公司内部的程序员所采用。
简单说来,现有的 C 语言运行时函数实在难以在当今充斥着恶意攻击企图的大环境下立足。这些函数要么在返回值和参数上缺乏一致性,要么隐含着所谓的“截断误差”(truncation errors) 错误,要么无法提供足够强大的功能。坦言之,调用这些函数的代码太容易产生“内存溢出”问题了。
  我们发现,面向 C++ 程序员的类足以应付各种安全处理字符串的编程需要;他们能够选择 MFC 的Cstring 类、ATL 的CComBSTR 类 或者STL 的string 类,等等。然而,经典的 C 语言程序仍然普遍地存在,何况许多人正在把 C++ 当作 “改良的 C 语言” 来用,却把丰富的 C++ 类束之高阁。
  其实只需要添加一行代码,你就能在 C 语言代码中调用安全性良好的 strsafe 系列函数了,详细请参阅:
《Using the Strsafe.h Functions》
这些新函数包含在一个头文件和一个函数库(可选)中,而后两者能在新版的 Platform SDK 中找到。对,就这么简单:

#include "strsafe.h"

还等什么呢!
再强调一次,对 strsafe 函数库的引用是可选的。
为了实现 strsafe 系列函数的目标,你的代码必须满足下列条件:

  • 始终以 NULL 字符结束字符串。
  • 始终检测目标缓冲区的长度。
  • 始终用 HRESULT 语句产生统一的返回值。
  • 兼顾 32 位与 64 位两种运行环境。
  • 具有灵活性。

  我们觉得,缺乏统一性是导致现有许多 C 语言字符串处理函数容易产生安全漏洞的根本原因,而 strsafe 系列函数所带来的高度统一性恰恰是解决此问题的一剂良药。然而,strsafe 也不是万能药。单纯依靠 strsafe 系列函数并不能保证代码的安全性和坚固性——你还必须开动你的大脑才行——然而这样对解决问题还是大有帮助的!
下面给出一段采用经典 C 语言运行时间函数的代码:

void UnsafeFunc(LPTSTR szPath,DWORD cchPath) {
	TCHAR szCWD[MAX_PATH];

	GetCurrentDirectory(ARRAYSIZE(szCWD), szCWD);
	strncpy(szPath, szCWD, cchPath);
	strncat(szPath, TEXT("\\"), cchPath);
	strncat(szPath, TEXT("desktop.ini"),cchPath);
}

  以上代码中的 bug 随处可见 —— 它没有检查任何一个返回值,而且在对 strncat 函数的调用中也没有正确地使用 cchPath (因为MAX_PATH 中保存的是目标缓冲区内剩余空间的长度,而不是目标缓冲区的总长度)。于是,“内存溢出” 问题将会快找上门来。然而,象这样的代码片段早已泛滥成灾了。如果改用 strsafe 系列函数,那么以上代码应该变成:

bool SaferFunc(LPTSTR szPath,DWORD cchPath) {
	TCHAR szCWD[MAX_PATH];

	if (GetCurrentDirectory(ARRAYSIZE(szCWD), szCWD) &&
			SUCCEEDED(StringCchCopy(szPath, cchPath, szCWD)) &&
			SUCCEEDED(StringCchCat(szPath, cchPath, TEXT("\\"))) &&
			SUCCEEDED(StringCchCat(szPath, cchPath, TEXT("desktop.ini")))) {

			return true;
	}

	return false;
}						
  这段代码不但检查了每一个返回值,还保证了适时传入同一目标缓冲区的总长度。你还可以采用 Ex 版本的 strsafe 系列函数来实现更加高级的功能,比如:
  • 获取目标缓冲区的当前指针。
  • 获取目标缓冲区的剩余空间长度。
  • 以某个特定字符填充空闲缓冲区。
  • 一旦字符串处理函数失败,就把用特定值填充字符串。
  • 一旦字符串处理函数失败,就把目标缓冲区设成 NULL 。

  如此改进后的代码性能又如何呢?告诉你一个好消息:它与原先的代码在性能上几乎没有差别。我曾在自己的 1.8 GHz 电脑上测试过混用经典 C 语言中各种字符串连接函数的代码、混用 strsafe 系列中各种字符串连接函数的代码和混用 Ex 版本 strsafe 系列中各种字符串连接函数的代码。它们各自独立运行一百万次(没错,就是 10,000,000 次)所消耗的时间分别为:

  • 经典 C 语言 —— 7.3 秒
  • Strsafe 系列—— 8.3 秒
  • Strsafe 系列 (Ex 版) —— 11.1 秒

在测试中,调用 Ex 版本的 strsafe 系列函数的程序会在调用失败时把缓冲区设为 NULL ,并以 0xFE 作为填充字节,代码如下:

DWORD dwFlags = STRSAFE_NULL_ON_FAILURE | STRSAFE_FILL_BYTE(0xFE);

  其中设置填充字节的代码耗时较多。事实上,如果这里仅仅把缓冲区设置为 NULL 的话,则采用 Ex 版本的 strsafe 系列函数的代码将会与采用普通的 strsafe 系列函数的代码耗时相同。
  由此可见,以上三种方案的性能差异极小。我相信你也不会经常在一个程序中数百万次地反复执行包含大量字符串处理函数的代码吧!
还有一点值得引起注意:当你引用 strsafe 系列函数时,原有的 C 语言字符串处理函数都将被自动进行 #undef 处理。这也没问题,因为调试过程中的出错信息将会告诉你哪些函数已经被相应的 strsafe 系列函数取代了。好了,请放心地使用 strsafe.h 吧!更多相关信息请参阅 《Using the Strsafe.h Functions》

posted @ 2009-03-20 10:57 Condor 阅读(2610) | 评论 (1)编辑 收藏

一、墨菲定律

    1949年,一位名叫墨菲的空军上尉工程师,认为他的某位同事是个倒霉蛋,不经意间开了句玩笑:“如果一件事情有可能被弄糟,让他去做就一定会弄糟。”
这句话迅速流传,并扩散到世界各地。在流传扩散的过程中,这句笑话逐渐失去它原有的局限性,演变成各种各样的形式,其中一个最通行的形式是:“如果坏事情有可能发生,不管这种可能性多么小,它总会发生,并引起最大可能的损失。”
这就是著名的“墨菲定律”。下面是墨菲定律的一些变种或推论。
人生哲学
1.别试图教猫唱歌,这样不但不会有结果,还会惹猫不高兴?
2.别跟傻瓜吵架,不然旁人会搞不清楚,到底谁是傻瓜?
3.不要以为自己很重要,因为没有你,太阳明天还是一样从东方升上来?
4.笑一笑,明天未必比今天好。
5.好的开始,未必就有好结果;坏的开始,结果往往会更糟。
处世原理
6.你若帮助了一个急需用钱的朋友,他一定会记得你——在他下次急需用钱的时候。
7.有能力的——让他做;没能力的──教他做;做不来的──管理他。
8.你早到了,会议却取消;你准时到,却还要等;迟到,就是迟了。
9.你携伴出游,越不想让人看见,越会遇见熟人。
爱情意义
10.你爱上的人,总以为你爱上他是因为:他使你想起你的老情人。
11.你最后硬着头皮寄出的情书;寄达对方的时间有多长,你反悔的时间就有多长。
生活常识
12.东西越好,越不中用。
13.一种产品保证60天不会出故障,等于保证第61天一定就会坏掉。
14.东西久久都派不上用场,就可以丢掉;东西一丢掉,往往就必须要用它。
15.你丢掉了东西时,最先去找的地方,往往也是可能找到的最后一个地方。
16.你往往会找到不是你正想找的东西。
17.你出去买爆米花的时候,银幕上偏偏就出现了精彩镜头。
18.另一排总是动的比较快;你换到另一排,你原来站的那一排,就开始动的比较快了;你站的越久,越有可能是站错了排。
19.一分钟有多长? 这要看你是蹲在厕所里面,还是等在厕所外面。

    二、二八法则

    1897年,意大利经济学家帕列托在对19世纪英国社会各阶层的财富和收益统计分析时发现:80%的社会财富集中在20%的人手里,而80%的人只拥有社 会财富的20%,这就是“二八法则”。“二八法则”反应了一种不平衡性,但它却在社会、经济及生活中无处不在。    附:破窗理论等

     在商品营销中,商家往往会认为所有顾客一样重要;所有生意、每一种产品都必须付出相同的努力,所有机会都必须抓住。而“二八法则”恰恰指出了在原因和结 果、投入和产出、努力和报酬之间存在这样一种典型的不平衡现象:80%的成绩,归功于20%的努力;市场上80%的产品可能是20%的企业生产的;20% 的顾客可能给商家带来80%的利润。遵循“二八法则”的企业在经营和管理中往往能抓住关键的少数顾客,精确定位,加强服务,达到事半功倍的效果。美国的普 尔斯马特会员店始终坚持会员制,就是基于这一经营理念。

     “二八法则”同样适用于我们的生活,如一个人应该选择在几件事上追求卓越,而不必强求在每件事上都有好的表现;锁定少数能完成的人生目标,而不必追求所有的机会。

    三、马太效应

    《新约·马太福音》中有这样一个故事,一个国王远行前,交给三个仆人每人一锭银子,吩咐他们:“你们去做生意,等我回来时,再来见我。”国王回来时,第一 个仆人说:“主人,你交给我的一锭银子,我已赚了10锭。”于是国王奖励了他10座城邑。第二个仆人报告说:“主人,你给我的一锭银子,我已赚了5锭。” 于是国王便奖励了他5座城邑。第三个仆人报告说:“主人,你给我的一锭银子,我一直包在手巾里存着,我怕丢失,一直没有拿出来。”于是国王命令将第三个仆 人的那锭银子赏给第一个仆人,并且说:“凡是少的,就连他所有的,也要夺过来。凡是多的,还要给他,叫他多多益善。”这就是马太效应,它反映了当今社会中 存在的一个普遍现象,即赢家通吃。
对企业经营发展而言,马太效应告诉我们,要想在某个领域保持优势,就必须在此领域迅速做大。当你成为某个领域的领头羊的时候,即便投资回报率相同,你也能 更轻易地获得比弱小的同行更大的收益。而若没有实力迅速在某个领域做大,就要不停地寻找新的发展领域,才能保证获得较好的回报。

    四、手表定理

    手表定理是指一个人有一只表时,可以知道现在是几点钟,而当他同时拥有两只表时却无法确定。两只表并不能告诉一个人更准确的时间,反而会让看表的人失去对 准确时间的信心。你要做的就是选择其中较信赖的一只,尽力校准它,并以此作为你的标准,听从它的指引行事。记住尼采的话:“兄弟,如果你是幸运的,你只需 有一种道德而不要贪多,这样,你过桥更容易些。”
如果每个人都“选择你所爱,爱你所选择”,无论成败都可以心安理得。然而,困扰很多人的是:他们被“两只表”弄得无所,心身交瘁,不知自己该信仰哪一 个,还有人在环境、他人的压力下,违心选择了自己并不喜欢的道路,为此而郁郁终生,即使取得了受人瞩目的成就,也体会不到成功的快乐。
手表定理在企业经营管理方面给我们一种非常直观的启发,就是对同一个人或同一个组织的管理不能同时采用两种不同的方法,不能同时设置两个不同的目标。 甚至每一个人不能由两个人来同时指挥,否则将使这个企业或这个人无所适从。手表定理所指的另一层含义在于每个人都不能同时挑选两种不同的价值观,否则,你 的行为将陷于混乱。

    五、“不值得”定律

    不值得定律最直观的表述是:不值得做的事情,就不值得做好,这个定律似乎再简单不过了,但它的重要性却时时被人们疏忘。不值得定律反映出人们的一种心理, 一个人如果从事的是一份自认为不值得做的事情,往往会保持冷嘲热讽,敷衍了事的态度。不仅成功率小,而且即使成功,也不会觉得有多大的成就感。
哪些事值得做呢?一般而言,这取决于三个因素。
1、价值观。关于价值观我们已经谈了很多,只有符合我们价值观的事,我们才会满怀热情去做。
2、个性和气质。一个人如果做一份与他的个性气质完全背离的工作,他是很难做好的,如一个好交往的人成了档案员,或一个害羞者不得不每天和不同的人打交道。
3、现实的处境。同样一份工作,在不同的处境下去做,给我们的感受也是不同的。例如,在一家大公司,如果你最初做的是打杂跑腿的工作,你很可能认为是不值得的,可是,一旦你被提升为领班或部门经理,你就不会这样认为了。
总结一下,值得做的工作是:符合我们的价值观,适合我们的个性与气质,并能让我们看到期望。如果你的工作不具备这三个因素,你就要考虑换一个更合适的工作,并努力做好它。
因此,对个人来说,应在多种可供选择的奋斗目标及价值观中挑选一种,然后为之而奋斗。“选择你所爱的,爱你所选择的”,才可能激发我们的奋斗毅力,也 才可以心安理得。而对一个企业或组织来说,则要很好地分析员工的性格特性,合理分配工作,如让成就欲较强的职工单独或牵头来完成具有一定风险和难度的工 作,并在其完成时给予定时的肯定和赞扬;让依附欲较强的职工更多地参加到某个团体中共同工作;让权力欲较强的职工担任一个与之能力相适应的主管。同时要加 强员工对企业目标的认同感,让员工感觉到自己所做的工作是值得的,这样才能激发职工的热情。

    六、彼得原理

管理学家劳伦斯·丁·彼得(Laurence.J.Peter),1917年牛于加拿大的范库弗,1957年获美国华盛顿州立大学学士学位,6年后 又获得该校教育哲学博士学位,他阅历丰富,博学多才,著述颇丰,他的名字还被收人了《美国名人榜》、《美国科学界名人录》和《国际名人传记辞典》等辞书 中。

     彼得原理(The PeterPrinciPle)正是彼得根据千百个有关组织中不能胜任的失败实例的分析而归纳出来的。其具体内容是:“在一个等级制度中,每个职工趋向于 上升到他所不能胜任的地位”。彼得指出,每一个职工由于在原有职位上工作成绩表现好(胜任),就将被提升到更高一级职位;其后,如果继续胜任则将进一步被 提升,直至到达他所不能胜任的职位。由此导出的彼得推论是,“每一个职位最终都将被一个不能胜任其工作的职工所占据。层级组织的工作任务多半是由尚未达到 不胜任阶层的员工完成的。”每一个职工最终都将达到彼得高地,在该处他的提升商数(PQ)为零。至于如何加速提升到这个高地,有两种方法。其一。是上面的 “拉动”,即依靠裙带关系和熟人等从上面拉;其二是自我的“推动”,即自我训练和进步等,而前者是被普遍采用的。

     彼得认为,由于彼得原理的推出,使他“无意间”创设了一门新的科学——层级组织学(hierarchiolgy)。该科学是解开所有阶层制度之谜的钥匙, 因此也是了解整个文明结构的关键所在。凡是置身于商业、工业、政治、行政、军亨、宗教、教育各界的每个人都和层级组织息息相关,亦都受彼得原理的控制。当 然,原理的假设条件是:时间足够长,五层级组织里有足够的阶层。彼得原理被认为是同帕金森定律有联系的。

     帕金森(C.N.Parkinson)是著名的社会理论家,他曾仔细观察并有趣地描述层级组织中冗员累积的现象。他假设,组织中的高级主管采用分化和征服 的策略,故意使组织效率降低,借以提升自己的权势,这种现象即帕金森所说的“爬升金字塔”。彼得认为这种理论设计是有缺陷的,他给出的解释员工累增现象的 原因是层级组织的高级主管真诚追求效率(虽然徒劳无功)。正如彼得原理显示的,许多或大多数主管必已到达他们的不胜任阶层。这些人无法改进现有的状况,因 为所有的员工已经竭尽全力了,于是为了再增进效率,他们只好雇用更多的员工。员工的增加或许可以使效率暂时提升,但是这些新进的人员最后将因晋升过程而到 达不胜任阶层,于是唯一改善的方法就是再次增雇员工,再次获得暂时的高效率,然后是另一。次逐渐归于无效率。这样就使组织中的人数超过了工作的实际需要。

     彼得原理首次公开发表于1960年9月美国联邦出资的一次研习会上,听众是一群负责教育研究计划、并刚获晋升的项目主管,彼得认为他们多数人“只是拼命地 想复制一些老掉牙了的统计习题”,于是引介彼得原理说明他们的困境。演说召来了敌意与嘲笑,但是彼得仍然决定以独特的讽刺手法呈现彼得原理,尽管所有案例 研究都经过精确编纂,且引用的资料也都符合事实,最后定稿于1965年春完成,然后总计有16家之多的出版社无情地拒绝了该书的手稿。1966年,作者零 星地在报纸上发表了几篇述论同一主题的文章,读者的反应异常热烈,引得各个出版社趋之若婺鸳。正如彼得在自传中提到的,人偶尔会在镜中瞥见自己的身影而不 能立即自我辩认,于是在不自知前就加以嘲笑一番,这样的片刻里正好可以使人进一步认识自己,“彼得原理”扮演的正是那样一面镜子。

    七、零和游戏

一个游戏无论几个人来玩,总有输家和赢家,赢家所赢的都是输家所翰的,所以无论输赢多少,正负相抵,最后游戏的总和都为零,这就是零和游戏。
    零和游戏之所以受人关注,是因为人们在社会生活中处处都能找到与零和游戏雷同或类似的现象。我们大肆开发利用煤炭石油资源,留给后人的便越来越少;我们研 究生产了大量的转基因产品,一些新的病毒也跟着冒了出来;我们修筑了葛洲坝水利工程,白鳍豚就再也不能洄游到金沙江产卵了……
    发展是硬道理。人类在经历了经济高速增长、科技迅猛发展、全球经济一体化及曰益严重的生态破坏、环境污染之后,可持续发展理论才逐渐浮出水面。零和游戏原 理正在逐渐为“双赢”观念所取代,人们逐渐认识到“利己”而不“损人”才是最美好的结局。实践证明,通过有效合作,实现皆大欢喜的结局是可能的。
    领导者要善于跳出“零和”的圈子,寻找能够实现“双赢”的机遇和突破口,防止负面影响抵消正面成绩。批评下属如何才能做到使其接受而不抵触,发展经济如何 才能做到不损害环境,开展竞争如何使自己胜出而不让对方受到伤害,这些都是每一个为官者应该仔细思考的问题。
    还是那句话,世上没有现成的标准答案。这些企业经营管理定律只能供我们参考和借鉴,至于什么条件下适合借鉴哪一种,回到手表定理上去,你需要自己选择一块戴着舒适而又走时准确的手表。

    八、华盛顿合作规律

    华盛顿合作规律说的是:一个人敷衍了事,两个人互相推诿,三个人则永无成事之日。多少有点类似于“三个和尚”的故事。

  人与人的合作不是人力的简单相加,而是复杂和微妙得多。在人与人的合作中,假定每一个人的能力都为1,那么10个人的合作结果有时比10大得多,有时甚至比1还要小。因为人不是静止的物,而更像方向不同的能量,相互推动时自然事半功倍,相互抵触时则一事无成。

    九、酒与污水定律

    酒与污水定律是指,如果把一匙酒倒进一桶污水中,你得到的是一桶污水;如果把一匙污水倒进一桶酒中,你得到的还是一桶污水。几乎在任何组织里,都存在几个 难弄的人物,他们存在的目的似乎就是为了把事情搞糟。他们到处搬弄是非,传播流言、破坏组织内部的和谐。最糟糕的是,他们像果箱里的烂苹果,如果你不及时 处理,它会迅速传染,把果箱里其它苹果也弄烂,“烂苹果”的可怕之处在于它那惊人的破坏力。一个正直能干的人进入一个混乱的部门可能会被吞没,而一个人无 德无才者能很快将一个高效的部门变成一盘散沙。组织系统往往是脆弱的,是建立在相互理解、妥协和容忍的基础上的,它很容易被侵害、被毒化。破坏者能力非凡 的另一个重要原因在于,破坏总比建设容易。一个能工巧匠花费时日精心制作的陶瓷器,一头驴子一秒钟就能毁坏掉。如果拥有再多的能工巧匠,也不会有多少像样 的工作成果。如果你的组织里有这样的一头驴子,你应该马上把它清除掉;如果你无力这样做,你就应该把它拴起来。

     十、水桶定律

    一只水桶能装多少水取决于水桶中最短的一块木板而不是最长的那块木板。
    任何组织几乎都有一个共同的特点,即构成组织的各个部分往往是优劣不齐的,但劣势部分却往往决定着整个组织的水平。问题是劣势部分是组织中一个有用的部分,你不能把它当成烂苹果扔掉,否则,你会一点水也装不了,可它却让你那些长的东西白长了!
    劣势决定优势,劣势决定生死,这是市场竞争的残酷法则。水桶定律告诉我们,领导者要有忧患意识,如果你个人身上某个方面是“最短的一块”,你应该考虑尽快 把它补起来;如果你所领导的集体中存在着“一块最短的木板”,你一定要迅速将它做长补齐,否则,它带给你的损失可能是毁灭性的—叫艮多时候,往往就是因为 一件事没做好而毁了所有的努力。有些人也许不知道水桶定律,但都知道“一票否决”,这是中国的“水桶”,有了它你便矢口道水桶定律是多么重要。
    决策和执行发生的机率。让谋划的人尽心谋划,让执行的人全力执行,让他们都从中获得间接而不是直接的功利,这样我们才能把“粥”分得更好。当然,还应有必不可少的独立的监督。

    十一、蘑菇管理原理

    蘑菇长在阴暗的角落,得不到阳光,也没有肥料,自生自灭,只有长到足够高的时候才开始被人关注,可此时它自己已经能够接受阳光了。
    蘑菇管理是大多数组织对待初入门者、初学者的一种管理方法。从传统的观念上讲,“蘑菇经历”是一件好事,它是人才蜕壳羽化前的一种磨炼,对人的意志和耐力 的培养有促进作用。但用发展的眼光来看,蘑菇管理有着先天的不足:一是太慢,还没等它长高长大恐怕疯长的野草就已经把它盖住了,使它没有成长的机会;二是 缺乏主动,有些本来基因较好的蘑菇,一钻出土就碰上了石头,因为得不到帮助,结果胎死腹中。
    让初入门者当上一段时间的“蘑菇”,可以消除他们不切实际的幻想,从而使他们更加接近现实,更实际、更理性地思考问题和处理问题。领导者应当注意的是,这 一过程不可过长,时间太长便会使其消极退化乃至枯萎,须知不给阳光不给关爱不仅是任其自生自灭,而且更是对其成长的抑制。如何让他们成功地走过生命中的这 一段,尽快吸取经验、成熟起来,这才是领导者所应当考虑的。

    十二、钱的问题

    当某人告诉你:“不是钱,而是原则问题”时,十有八九就是钱的问题。
照一般的说法,金钱是价值的尺度,交换的媒介,财富的贮藏。但是这种说法忽略了它的另一面,它令人陶醉、令人疯狂、令人激动的一面,也撇开了爱钱的心理不谈。马克思说,金钱是“人情的离心力”,就是指这一方面而言。
关于金钱的本质、作用和功过,从古到今,人们已经留下了无数精辟深刻的格言和妙语。我们常会看到,人们为钱而兴奋,努力赚钱,用财富的画面挑逗自己。 金钱对世界的秩序以及我们的生活产生的影响是巨大的、广泛的,这种影响有时是潜在的,我们往往意识不到它的作用如此巨大,然而奇妙的是:它完全是人类自己 创造的。致富的驱动力并不是起源于生物学上的需要,动物生活中也找不到任何相同的现象。它不能顺应基本的目标,不能满足根本的需求-的确,“致富”的定义 就是获得超过自己需要的东西。然而这个看起来漫无目标的驱动力却是人类最强大的力量,人类为金钱而互相伤害,远超过其他原因。

    附:一街东头那个乞丐去摸彩票。中了五等奖,得款50元。甚喜!这个冬天好过了,他拥有棉袄、棉裤、和棉鞋了。街西头那个乞丐也去摸彩票。中了一等奖,得款50万元。狂喜! 

 首先大宴宾客,热闹三天,煞是风光,耗款3千元,小意思。然后买西服、配手机、穿金戴银,容光焕发,一扫穷气。再次,买房子,满街转悠,要带车库 的。第四,就是买车了。“夏利”太便宜,“奔驰”太贵,还是“桑塔纳”吧!第五……第六……第七……过年的时候,街东头那个乞丐还在到处晃悠,穿着那50 元买的“家当”;而街西头那个乞丐却在劳教所里,据说是因为赌博、嫖娼、吸毒、闹事……拥有50元,街东头的乞丐不再受冻,自得其乐;拥有50万元,街西 头乞丐成了个大富翁,却也把自己送上了死路。不懂得善用钱财的人,还是没钱点才安全。

    十三、奥卡姆剃刀定律

    12世纪,英国奥卡姆的威廉主张唯名论,只承认确实存在的东西,认为那些空洞无物的普遍性概念都是无用的累赘,应当被无情地“剃除”。他主张“如无必要, 勿增实体”。这就是常说的“奥卡姆剃刀”。这把剃刀曾使很多人感到威胁,被认为是异端邪说,威廉本人也因此受到迫害。然而,并未损害这把刀的锋利,相反, 经过数百年的岁月,奥卡姆剃刀已被历史磨得越来越快,并早已超载原来狭窄的领域,而具有广泛、丰富、深刻的意义。

  奥卡姆剃刀定律在企业管理中可进一步演化为简单与复杂定律:把事情变复杂很简单,把事情变简单很复杂。这个定律要求,我们在处理事情时,要把握事情的主要实质,把握主流,解决最根本的问题,尤其要顺应自然,不要把事情人为地复杂化,这样才能把事情处理好。

    美国政治学家威尔逊和犯罪学家凯林经过观察提出了“破窗理论”。

  如果有人打坏了一栋建筑上的一块玻璃,又没有及时修复,别人就可能受到某些暗示性的纵容,去打碎更多的玻璃。久而久之,这些窗户就给人造成一种无序的感觉,在这种麻木不仁的氛围中,犯罪就会滋生、蔓延。

  “破窗理论”更多的是从犯罪的心理去思考问题,但不管把“破窗理论”用在什么领域,角度不同,道理却相似:环境具有强烈的暗示性和诱导性,必须及时修好“第一扇被打碎玻璃的窗户”。

  推而广之,从人与环境的关系这个角度去看,我们周围生活中所发生的许多事情,不正是环境暗示和诱导作用的结果吗?

  比如,在窗明几净、环境优雅的场所,没有人会大声喧哗,或“噗”地吐出一口痰来;相反,如果环境脏乱不堪,倒是时常可以看见吐痰、便溺、打闹、互骂等不文明的举止。

  又比如,在公交车站,如果大家都井然有序地排队上车,又有多少人会不顾众人的文明举动和鄙夷眼光而贸然插队?与这相反,车辆尚未停稳,猴急的人 们你推我拥,争先恐后,后来的人如果想排队上车,恐怕也没有耐心了。因此,环境好,不文明之举也会有所收敛;环境不好,文明的举动也会受到影响。人是环境 的产物,同样,人的行为也是环境的一部分,两者之间是一种互动的关系。

  在公共场合,如果每个人都举止优雅、谈吐文明、遵守公德,往往能够营造出文明而富有教养的氛围。千万不要因为我们个人的粗鲁、野蛮和低俗行为而形成“破窗效应”,进而给公共场所带来无序和失去规范的感觉。

  从这个意义上说,我们平时一直强调的“从我做起,从身边做起”,就不仅仅是一个空洞的口号,它决定了我们自身的一言一行对环境造成什么样的影响。

帕金森定律

  英国著名历史学家诺斯古德·帕金森通过长期调查研究,写出一本名叫《帕金森定律》的书。他在书中阐述了机构人员膨胀的原因及后果:一个不称职的 官员,可能有三条出路,第一是申请退职,把位子让给能干的人;第二是让一位能干的人来协助自己工作;第三是任用两个水平比自己更低的人当助手。这第一条路 是万万走不得的,因为那样会丧失许多权利;第二条路也不能走,因为那个能干的人会成为自己的对手;看来只有第三条路最适宜。于是,两个平庸的助手分担了他 的工作,他自己则高高在上发号施令,他们不会对自己的权利构成威胁。两个助手既然无能,他们就上行下效,再为自己找两个更加无能的助手。如此类推,就形成 了一个机构臃肿,人浮于事,相互扯皮,效率低下的领导体系。

  苛希纳定律

  西方管理学中有一条著名的苛希纳定律:如果实际管理人员比最佳人数多两倍,工作时间就要多两倍,工作成本就要多4倍;如果实际管理人员比最佳人员多3倍,工作时间就要多3倍,工作成本就要多6倍。

  250定律

  美国著名推销员拉德在商战中总结出了“250定律”。他认为每一位顾客身后,大体有250名亲朋好友。如果您赢得了一位顾客的好感,就意味着赢 得了250个人的好感;反之,如果你得罪了一名顾客,也就意味着得罪了250名顾客。这一定律有力地论证了“顾客就是上帝”的真谛。由此,我们可以得到如 下启示:必须认真对待身边的每一个人,因为每一个人的身后,都有一个相对稳定的、数量不小的群体。善待一个人,就像拨亮一盏灯,照亮一大片。

  达维多定律

  达维多定律是以英特尔公司副总裁达维多的名字命名的。他认为,一个企业要想在市场上总是占据主导地位,那么就要做到第一个开发出新产品,又第一 个淘汰自己的老产品。这一定律的基点是着眼于市场开发和利益分割的成效。因为人们在市场竞争中无时无刻不在抢占先机,只有先入市场才能更容易获取较大的份 额和较高的利润。

  木桶定律

一个有许多块长短不同的木板箍成的木桶,决定其容量大小的并非其中最长的那块木板,而是其中最短的那块木板。同样,在一个企业的营销过程中,必然存在着许多相关的环节,只有找出制约企业经济效益提高的某一关键环节,把这一个矛盾解决了,其它矛盾就可以迎刃而解了。

a、领导

太长了!先看到这里去看看是谁发的这么火的帖子~~~

一、 素养

蓝斯登原则

在你往上爬的时候,一定要保持梯子的整洁,否则你下来时可能会滑倒。
提出者:美国管理学家蓝斯登
点评:进退有度,才不至进退维谷;宠辱皆忘,方可以宠辱不惊。

卢维斯定理

谦虚不是把自己想得很糟,而是完全不想自己。
提出者:美国心理学家h·卢维斯
点评:如果把自己想得太好,就很容易将别人想得很糟。

托利得定理

测验一个人的智力是否属于上乘,只看脑子里能否同时容纳两种相反的思想,而无碍于其处世行事。
提出者:法国社会心理学家h·m·托利得
点评:思可相反,得须相成。

二、统御

刺猬理论

刺猬在天冷时彼此靠拢取暖,但保持一定距离,以免互相刺伤。
点评:保持亲密的重要方法,乃是保持适当的距离。

鲦鱼效应

鲦鱼因个体弱小而常常群居,并以强健者为自然首领。将一只稍强的鲦鱼脑后控制行为的部分割除后,此鱼便失去自制力,行动也发生紊乱,但其他鲦鱼却仍像从前一样盲目追随。
提出者:德国动物学家霍斯特
点评:1、下属的悲剧总是领导一手造成的。2、下属觉得最没劲的事,是他们跟着一位最差劲的领导。

雷鲍夫法则

在你着手建立合作和信任时要牢记我们语言中:
1、最重要的八个字是:我承认我犯过错误
2、最重要的七个字是:你干了一件好事
3、最重要的六个字是:你的看法如何
4、最重要的五个字是:咱们一起干
5、最重要的三个字是:谢谢您
6、最重要的两个字是:咱们
提出者:美国管理学家雷鲍夫
点评:1、最重要的四个字是:不妨试试;2、最重要的一个字是:您

洛伯定理

对于一个经理人来说,最要紧的不是你在场时的情况,而是你不在场时发生了什么。
提出者:美国管理学家r·洛伯
点评:如果只想让下属听你的,那么当你不在身边时他们就不知道应该听谁的了。

三、沟通

斯坦纳定理

在哪里说得愈少,在哪里听到的就愈多。
提出者:美国心理学家s·t·斯坦纳
点评:只有很好听取别人的,才能更好说出自己的。

费斯诺定理

人有两只耳朵却只有一张嘴巴,这意味着人应该多听少讲。
提出者:英国联合航空公司总裁兼总经理l·费斯诺
点评:说得过多了,说的就会成为做的障碍。

牢骚效应

凡是公司中有对工作发牢骚的人,那家公司或老板一定比没有这种人或有这种人而把牢骚埋在肚子里的公司要成功得多。
提出者:美国密歇根大学社会研究院
点评:1、牢骚是改变不合理现状的催化剂。2、牢骚虽不总是正确的,但认真对待牢骚却总是正确的。

避雷针效应

在高大建筑物顶端安装一个金属棒,用金属线与埋在地下的一块金属板连接起来,利用金属棒的尖端放电,使云层所带的电和地上的电逐渐中和,从而保护建筑物等避免雷击。
点评:善疏则通,能导必安

四、协调

氨基酸组合效应

组成人体蛋白的八种氨基酸,只要有一种含量不足,其他七种就无法合成蛋白质。
点评:当缺一不可时,"一"就是一切。

米格-25效应

前苏联研制的米格-25喷气式战斗机的许多零部件与美国的相比都落后,但因设计者考虑了整体性能,故能在升降、速度、应急反应等方面成为当时世界一流。
点评:所谓最佳整体,乃是个体的最佳组合。

磨合效应

新组装的机器,通过一定时期的使用,把磨擦面上的加工痕迹磨光而变得更加密合。
点评:要想达到完整的契合,须双方都作出必要的割舍。

五、指导

波特定理

当遭受许多批评时,下级往往只记住开头的一些,其余就不听了,因为他们忙于思索论据来反驳开头的批评。
提出者:英国行为科学家l·w·波特
点评:总盯着下属的失误,是一个领导者的最大失误。

蓝斯登定律

跟一位朋友一起工作,远较在"父亲"之下工作有趣得多。
提出者:美国管理学家蓝斯登
点评:可敬不可亲,终难敬;有权没有威,常失权。

吉尔伯特法则

工作危机最确凿的信号,是没有人跟你说该怎样作。
提出者:英国人力培训专家b·吉尔伯特
点评:真正危险的事,是没人跟你谈危险。

权威暗示效应

一化学家称,他将测验一瓶臭气的传播速度,他打开瓶盖15秒后,前排学生即举手,称自己闻到臭气,而后排的人则陆续举手,纷纷称自己也已闻到,其实瓶中什么也没有。
点评:迷信则轻信,盲目必盲从。

没走过的路。2、特色不特,优势无优。

古特雷定理

每一处出口都是另一处的入口。
提出者:美国管理学家W·古特雷
点评:上一个目标是下一个目标的基础,下一个目标是上一个目标的延续。

十四、计划

列文定理

那些犹豫着迟迟不能作出计划的人,通常是因为对自己的能力没有把握。
提出者:法国管理学家P·列文
点评:如果没有能力去筹划,就只有时间去后悔了。

弗洛斯特法则

在筑墙之前应该知道把什么圈出去,把什么圈进来。
提出者:美国思想家W·P·弗洛斯特
点评:开始就明确了界限,最终就不会作出超越界限的事来。

十五、参谋

波克定理

只有在争辩中,才可能诞生最好的主意和最好的决定。
提出者:美国庄臣公司总经理詹姆士·波克
点评:无磨擦便无磨合,有争论才有高论。

韦奇定理

即使你已有了主见,但如果有十个朋友看法和你相反,你就很难不动摇。
提出者:美国洛杉矶加州大学经济学家伊渥·韦奇
点评:1、未听之时不应有成见,既听之后不可无主见。2、不怕开始众说纷纭,只怕最后莫衷一是。

十六、决策

福克兰定律

没有必要作出决定时,就有必要不作决定。
提出者:法国管理学家D·L·福克兰
点评:当不知如何行动时,最好的行动就是不采取任何行动。

王安论断

犹豫不决固然可以免去一些作错事的机会,但也失去了成功的机遇。
提出者:美籍华裔企业家王安博士
点评:寡断能使好事由好变坏,果断可将危机转危为安。

十七、执行

格瑞斯特定理

杰出的策略必须加上杰出的执行才能奏效。
提出者:美国企业家H·格瑞斯特
点评:好事干实更好,实事办好愈实。

吉德林法则

把难题清清楚楚地写出来,便已经解决了一半。
提出者:美国通用汽车公司管理顾问查尔斯·吉德林
点评:杂乱无章的思维,不可能产生有条有理的行动

d、调控

十八、信息

沃尔森法则

把信息和情报放在第一位,金钱就会滚滚而来。
提出者:美国企业家s·m·沃尔森
点评:你能得到多少,往往取决于你能知道多少。

塔马拉效应

塔马拉是捷克雷达专家弗·佩赫发明的一种雷达,它与其他雷达的最大不同是不发射信号而只接收信号,故不会被敌方反雷达装置发现。
点评:善藏者人不可知,能知者人无以藏。

十九、监督

小池定理

越是沉醉,就越是抓住眼前的东西不放。
提出者:日本管理学家小池敬
点评:自我陶醉不易清醒,自以为是不喜批评。

赫勒法则

当人们知道自己的工作成绩有人检查的时候会加倍努力。
提出者:英国管理学家h·赫勒
点评:只有在相互信任的情况下,监督才会成为动力。

二十、控制

横山法则

最有效并持续不断的控制不是强制,而是触发个人内在的自发控制。
提出者:日本社会学家横山宁夫
点评:有自觉性才有积极性,无自决权便无主动权。

蝴蝶效应

"紊乱学"研究者称,南半球某地的一只蝴蝶偶尔扇动一下翅膀所引起的微弱气流,几星期后可变成席卷北半球某地的一场龙卷风。他们将这种由一个极小起因,经过一定的时间,在其他因素的参与作用下,发展成极为巨大和复杂后果的现象称为"蝴蝶效应"。
点评:善终者慎始,谨小者慎微。

阿什法则

承认问题是解决问题的第一步。
提出者:美国企业家m·k·阿什
点评:你愈是躲着问题,问题愈会揪住你不放。

二十一、法纪

洛克忠告

规定应该少定,一旦定下之后,便得严格遵守。
提出者:英国教育家洛克
点评:简则易循,严则必行。

热炉法则

当人用手去碰烧热的火炉时,就会受到"烫"的惩罚,其有以下三个特点:即时性、预警性、平等性。
点评:罪与罚能相符,法与治可相期。

二十二、改革

柯美雅定律

世上没有十全十美的东西,所以任何东西都有改革的余地。
提出者:美国社会心理学家m·r·柯美雅
点评:不拘于常规,才能激发出创造力。

达维多夫定律

没有创新精神的人永远也只能是一个执行者。
提出者:前苏联心理学家达维多夫
点评:只有敢为人先的人,才最有资格成为真正的先驱者。

自吃幼崽效应

美国硅谷企业竞争十分激烈,以至于各公司都积极寻找自己的致命弱点,所有公司共同的生存之道是:拿出更好看产品来击败自己的原有产品。有人将这种行为戏称为"自吃幼崽"。
点评:1、自己不逼自己,别人迟早会逼你。2、敢于对过去告一个段落,才有信心掀开新的一章。

二十三、创新

舍恩定理

新思想只有落到真正相信它,对它着迷的人手里才能开花结果。
提出者:美国麻省理工学院教授舍恩
点评:只有信之不疑,才能持之以恒。

吉宁定理

真正的错误是害怕犯错误。
提出者:美国管理学家h·吉宁
点评:不怕错误的人,错误往往也离他最远。

卡贝定理

放弃是创新的钥匙。
提出者:美国电话电报公司前总经理卡贝
点评:在未学会放弃之前,你将很难懂得什么是争取。


史密斯原则

如果你不能战胜他们,你就加入到他们之中去。
提出者:美国通用汽车公司前董事长r·史密斯
点评:竞争使人进步最快,合作让人得到最多。

二十六、营销

阿尔巴德定理一个企业经营成功与否,全靠对顾客的要求了解到什么程度。
提出者:匈牙利全面质量管理国际有限公司顾问波尔加·韦雷什·阿尔巴德
点评:看到了别人的需要,你就成功了一半;满足了别人的需求,你就成功了全部。

冰淇淋哲学

卖冰淇淋必须从冬天开始,因为冬天顾客少,会逼迫你降低成本,改善服务。如果能在冬天的逆境中生存,就再也不会害怕夏天的竞争。
提出者:台湾著名企业家王永庆
点评:逆境不错,顺境更好。

二十七、广告

布里特定理

商品不作广告,就像姑娘在暗处向小伙子递送秋波,脉脉此情只有她自己知道。
提出者:英国广告学专家s·布里特
点评:要推而广之,先广而告之。

伯内特定理

只有占领头脑,才会占有市场。
提出者:美国广告专家利奥·伯内特
点评:脍炙人口才会耐人寻味,深得人心方可引人入胜。

拉图尔定律

一个好品名可能无助于劣质产品的销售,但是一个坏品名则会使好产品滞销。
提出者:法国诺门公司德国分公司负责人苏珊·拉图尔
点评:取名的艺术,亦是取得成功的艺术。

赫斯定律

广告超过12个字,读者的记忆力要降低50%。
提出者:澳大利亚广告家h·赫斯
点评:忘却即等于抛弃。

二十八、公关

玛丽法则

假如还没有破,就不要去修它,免得弄巧成拙。
提出者:美国著名企业家玛丽·凯·阿什
点评:弄巧之所以成拙,往往是因为本来就无巧可弄。

弗里施定理

没有满意的工作人员,就没有满意的顾客。
提出者:德国慕尼黑企业咨询顾问弗里施
点评:协调内外关系,从协调内部关系开始。

反哺效应

动物学家将某些动物长大后把觅到的食物给予其父母的行为称为反哺。
点评:给别人好处的人,往往也是得到好处最多的人。

史崔维兹定理

如果你为获得好处而帮助他人,就不算帮助他人。
提出者:美国社会心理学家g·史崔维兹
点评:动机不纯,行为失真。

二十九、谈判

奥狄思法则

在每一次谈判中,你都应准备向对方作出让步。
提出者:美国谈判专家j·s·奥狄思
点评:争,丈不足;让,寸有余。

居家效应

一个人在家里或自己最熟悉的环境中,言谈举止表现得最为自信和从容。
点评:没有实力垫底,自信永远是苍白的。

尼伦伯格原则

一场圆满的、成功的谈判,每一方都应是胜利者。
提出者:美国著名谈判学家尼伦伯格
点评:总想自己得势,必然势不两立。

比林定律

一生中的麻烦有一半是由于太快说"是",太慢说"不"造成的。
提出者:美国幽默作家比林
点评:1、没有否决权,发言权也很容易被剥夺。2、对不该让步的事不让步,别人反而更容易给你让步。

三十、交往

克林纳德法则

与人相处得好坏,在很大程度上取决于我们用什么方式与人打交道。
提出者:美国人际关系学家h·h·克林纳德
点评:交之有道,能打好交道;来而无往,难有常来往。

忌讳效应

因风俗习惯或个人理由等,对某些言语或举动有所顾忌,积久成为禁忌。
点评:知道别人不喜欢什么,比知道别人喜欢什么更重要。

弗里德曼定律

当一个人的需要可以满足另一个人的需要时,两人就趋于互相喜欢。
提出者:美国心理学家n·w·弗里德曼
点评:有利益与利益的相互补充,才会有需要与需要的相互满足。

三十一、成果

基利定理

容忍失败,这是人们可以学习并加以运用的极为积极的东西。
提出者:美国多布林咨询公司集团总经理拉里·基利
点评:1、成功者之所以成功,只不过是他不被失败左右而已。2、不许失败,无异于不许成功。

沸腾效应

水温升到99度,还不是开水,其价值有限;若再添一把火,在99度的基础上再升高1度,就会使水沸腾,并产生大量水蒸气来开动机器,从而获得巨大的经济效益。
点评:只差一点点,往往是导致最大差别的关键。

王永庆法则

节省一元钱等于净赚一元钱。
提出者:台湾企业界"精神领袖"台塑总裁王永庆
点评:赚钱要依赖别人,节省只取决自己。

posted @ 2009-03-17 19:48 Condor 阅读(349) | 评论 (0)编辑 收藏

算法的力量
算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门,就产生了一种误解,认为 学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实,大家被这些公司误导了。编程语言虽然该学,但是学习计算机 算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库 原理等等。在“开复学生网”上,有位同学生动地把这些基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式,没 有功力,是不可能成为高手的。
算法与我
当我在1980年转入计算机科学系时,还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说:“知道为什么只有你们系要加一个‘科学’,而没 有‘物理科学系’或‘化学科学系’吗?因为人家是真的科学,不需要画蛇添足,而你们自己心虚,生怕不‘科学’,才这样欲盖弥彰。” 其实,这点他们彻底弄 错了。真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和 手段的最佳演绎就是“算法”。
记得我读博时写的Othello对弈软件获得了世界冠军。当时,得第二名的人认为我是靠侥幸才打赢他,不服气地问我的程序平均每秒能搜索多少步棋,当他发 现我的软件在搜索效率上比他快60多倍时,才彻底服输。为什么在同样的机器上,我可以多做60倍的工作呢?这是因为我用了一个最新的算法,能够把一个指数 函数转换成四个近似的表,只要用常数时间就可得到近似的答案。在这个例子中,是否用对算法才是能否赢得世界冠军的关键。
还记得1988年贝尔实验室副总裁亲自来访问我的学校,目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍,而且,在扩大至大词汇系统后,速 度差异更有几百倍之多。他们虽然买了几台超级计算机,勉强让系统跑了起来,但这么贵的计算资源让他们的产品部门很反感,因为“昂贵”的技术是没有应用前景 的。在与他们探讨的过程中,我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了O(n*n*m)。更惊 讶的是,他们还为此发表了不少文章,甚至为自己的算法起了一个很特别的名字,并将算法提名到一个科学会议里,希望能得到大奖。当时,贝尔实验室的研究员当 然绝顶聪明,但他们全都是学数学、物理或电机出身,从未学过计算机科学或算法,才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机科学的人了吧!
网络时代的算法
有人也许会说:“今天计算机这么快,算法还重要吗?”其实永远不会有太快的计算机,因为我们总会想出新的应用。虽然在摩尔定律的作用下,计算机的计算能力 每年都在飞快增长,价格也在不断下降。可我们不要忘记,需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据(照片,视频,语音,文本等 等)。日益先进的记录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也在飞快增长。在科学研究方面,随着研究手段的进步, 数据量更是达到了前所未有的程度。无论是三维图形、海量数据处理、机器学习、语音识别,都需要极大的计算量。在网络时代,越来越多的挑战需要靠卓越的算法 来解决。
再举另一个网络时代的例子。在互联网和手机搜索上,如果要找附近的咖啡店,那么搜索引擎该怎么处理这个请求呢?
最简单的办法就是把整个城市的咖啡馆都找出来,然后计算出它们的所在位置与你之间的距离,再进行排序,然后返回最近的结果。但该如何计算距离呢?图论里有不少算法可以解决这个问题。
这么做也许是最直观的,但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆,那这么做应该没什么问题,反正计算量不大。但如果一个城市里有很多咖啡馆,又有很多用户都需要类似的搜索,那么服务器所承受的压力就大多了。在这种情况下,我们该怎样优化算法呢?
首先,我们可以把整个城市的咖啡馆做一次“预处理”。比如,把一个城市分成若干个“格子(grid)”,然后根据用户所在的位置把他放到某一个格子里,只对格子里的咖啡馆进行距离排序。
问题又来了,如果格子大小一样,那么绝大多数结果都可能出现在市中心的一个格子里,而郊区的格子里只有极少的结果。在这种情况下,我们应该把市中心多分出 几个格子。更进一步,格子应该是一个“树结构”,最顶层是一个大格——整个城市,然后逐层下降,格子越来越小,这样有利于用户进行精确搜索——如果在最底 层的格子里搜索结果不多,用户可以逐级上升,放大搜索范围。
上述算法对咖啡馆的例子很实用,但是它具有通用性吗?答案是否定的。把咖啡馆抽象一下,它是一个“点”,如果要搜索一个“面”该怎么办呢?比如,用户想去 一个水库玩,而一个水库有好几个入口,那么哪一个离用户最近呢?这个时候,上述“树结构”就要改成“r-tree”,因为树中间的每一个节点都是一个范 围,一个有边界的范围(参考:http://www.cs.umd.edu/~hjs/rtrees/index.html)。
通过这个小例子,我们看到,应用程序的要求千变万化,很多时候需要把一个复杂的问题分解成若干简单的小问题,然后再选用合适的算法和数据结构。
并行算法:Google的核心优势
上面的例子在Google里就要算是小case了!每天Google的网站要处理十亿个以上的搜索,GMail要储存几千万用户的2G邮箱, Google Earth要让数十万用户同时在整个地球上遨游,并将合适的图片经过互联网提交给每个用户。如果没有好的算法,这些应用都无法成为现实。
在这些的应用中,哪怕是最基本的问题都会给传统的计算带来很大的挑战。例如,每天都有十亿以上的用户访问Google的网站,使用Google的服务,也 产生很多很多的日志(Log)。因为Log每分每秒都在飞速增加,我们必须有聪明的办法来进行处理。我曾经在面试中问过关于如何对log进行一些分析处理 的问题,有很多面试者的回答虽然在逻辑上正确,但在实际应用中是几乎不可行的。按照他们的算法,即便用上几万台机器,我们的处理速度都跟不上数据产生的速 度。
那么Google是如何解决这些问题的呢?
首先,在网络时代,就算有最好的算法,也要能在并行计算的环境下执行。在Google的数据中心,我们使用的是超大的并行计算机。但传统的并行算法运行 时,效率会在增加机器数量后迅速降低,也就是说,十台机器如果有五倍的效果,增加到一千台时也许就只有几十倍的效果。这种事倍功半的代价是没有哪家公司可 以负担得起的。而且,在许多并行算法中,只要一个结点犯错误,所有计算都会前功尽弃。
那么Google是如何开发出既有效率又能容错的并行计算的呢?
Google最资深的计算机科学家Jeff Dean认识到, Google 所需的绝大部分数据处理都可以归结为一个简单的并行算法: Map and Reduce(http://labs.google.com/papers/mapreduce.html)。 这个算法能够在很多种 计算中达到相当高的效率,而且是可扩展的(也就是说,一千台机器就算不能达到一千倍的效果,至少也可以达到几百倍的效果)。Map and Reduce 的另外一大特色是它可以利用大批廉价的机器组成功能强大的server farm。最后,它的容错性能异常出色,就算一个server farm里面的机 器down掉一半,整个farm依然能够运行。正是因为这个天才的认识,才有了Map and Reduce算法。借助该算法,Google几乎能无限地 增加计算量,与日新月异的互联网应用一同成长。
算法并不局限于计算机和网络
举一个计算机领域外的例子:在高能物理研究方面,很多实验每秒钟都产生几个TB的数据量。但因为处理能力和存储能力的不足,科学家不得不把绝大部分未经处 理的数据丢弃掉。可大家要知道,新元素的信息很有可能就藏在我们来不及处理的数据里面。同样的,在其他任何领域里,算法都可以改变人类的生活。例如人类基 因的研究,就可能因为算法而发明新的医疗方式。在国家安全领域,有效的算法可能避免下一个911的发生。在气象方面,算法可以更好地预测未来天灾的发生, 以拯救生命。
所以,如果你把计算机的发展放到应用和数据飞速增长的大环境下,你一定会发现,算法的重要性不是在日益减小,而是在日益加强。
给程序员的七个建议
(1)练内功。不要只花功夫学习各种流行的编程语言和工具,以及某些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结 构、计算机网络,离散数学等基础课程学好。大家不妨试试高德纳所著The Art of Computer Programming里的题目,如果你能够 解决其中的大部分题目,就说明你在算法方面有一定的功力了。
(2)多实战。通过编程的实战积累经验、巩固知识。很多中国大学毕业生缺乏编程和调试经验;学习C语言,考试过关就算学会了;课题项目中,只要程序能够编 译,运行,并且输入输出满足要求就算了事。这些做法是不行的。写程序的时候,大家必须多想想如何把程序写得更加精炼、高效、高质量。建议大家争取在大学四 年中积累编写十万行代码的经验。我们必须明白的是:好程序员是写出来的,不是学出来的。
(3)求实干。不要轻视任何实际工作,比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作风与敬业精神。我发现不少程序员对于知识的掌握很 肤浅,不求甚解,没有好奇心,不会刨根问底。比如,学会了C++,是否了解一个对象在编译后,在汇编代码中是如何被初始化的?这个对象的各个成员在内存中 是如何存放的?当一个成员函数被调用时,编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没 有详细提到,只有通过踏实的实干才能真正掌握。
(4)重视数学学习。数学是思维的体操,数学无处不在。学计算机至少要学习离散数学、概率论、布尔代数、集合论和数理逻辑。这些知识并不难,但是对你未来 的工作帮助会很大。 尤其当你对一些“数学密集型”的领域如视频、图像处理等有兴趣时,这些知识将成为你手中的利器。
(5)培养团队精神,学会与人合作。今天的软件工程早已经不是一个人可以单独操作的,而必须靠团队合作才能成功。不懂得合作的人是不能成大器的。大家要多去寻找可以与人一起做项目的机会。
(6)激励创新意识,培养好奇心,不要死记硬背。没有掌握某种算法技术的根本原理,就不会有应变和创新的能力。想成为一位好程序员(其实从事任何一个行业 都是如此),重要的是要养成钻研,好奇,创新,动手,合作的优秀习惯,不满足于填鸭,不满足于考试交差,不满足于表象。这不是学几门课能够一蹴而就的。
(7)有策略地“打工”。在不影响学业的前提下,寻找真正有意义的暑期工作或兼职。去找一个重视技术的公司,在一个好的“老板”指导下完成真正会被用户使 用的程序。不要急于去一个要你做“头”而独挡一面的地方,因为向别人学习才是你的目的。找工作也是一样,不要只看待遇和职衔,要挑一个你能够学习的环境, 一个愿意培养员工的企业,一个重视你的专业的公司。最后,还要挑一个好老板。
希望大家都能把握机会,养成好的学习习惯,把算法学精学透;希望大家都能有一个美好的未来!

posted @ 2009-03-17 19:37 Condor 阅读(268) | 评论 (0)编辑 收藏

仅列出标题
共10页: 1 2 3 4 5 6 7 8 9 Last