Aaron's profile做最好的自己PhotosBlogListsMore ![]() | Help |
做最好的自己Be My Personal Best |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
February 05 [zz]最常见的20种VC++编译错误信息集合最常见的20种VC++编译错误信息集合 再网上看到的,大部分都比较常见,对初学者挺有用~~~ 1、fatal error C1010: unexpected end of file while looking for precompiled header directive。 寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include "stdafx.h") 2、fatal error C1083: Cannot open include file: 'R…….h': No such file or directory 不能打开包含文件“R…….h”:没有这样的文件或目录。 3、error C2011: 'C……': 'class' type redefinition 类“C……”重定义。 4、error C2018: unknown character '0xa3' 不认识的字符'0xa3'。(一般是汉字或中文标点符号) 5、error C2057: expected constant expression 希望是常量表达式。(一般出现在switch语句的case分支中) 6、error C2065: 'IDD_MYDIALOG' : undeclared identifier “IDD_MYDIALOG”:未声明过的标识符。 7、error C2082: redefinition of formal parameter 'bReset' 函数参数“bReset”在函数体中重定义。 8、error C2143: syntax error: missing ':' before '{' 句法错误:“{”前缺少“;”。 9、error C2146: syntax error : missing ';' before identifier 'dc' 句法错误:在“dc”前丢了“;”。 10、error C2196: case value '69' already used 值69已经用过。(一般出现在switch语句的case分支中) 11、error C2509: 'OnTimer' : member function not declared in 'CHelloView' 成员函数“OnTimer”没有在“CHelloView”中声明。 12、error C2511: 'reset': overloaded member function 'void (int)' not found in 'B' 重载的函数“void reset(int)”在类“B”中找不到。 13、error C2555: 'B::f1': overriding virtual function differs from 'A::f1' only by return type or calling convention 类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。 14、error C2660: 'SetTimer' : function does not take 2 parameters “SetTimer”函数不传递2个参数。 15、warning C4035: 'f……': no return value “f……”的return语句没有返回值。 16、warning C4553: '= =' : operator has no effect; did you intend '='? 没有效果的运算符“= =”;是否改为“=”? 17、warning C4700: local variable 'bReset' used without having been initialized 局部变量“bReset”没有初始化就使用。 18、error C4716: 'CMyApp::InitInstance' : must return a value “CMyApp::InitInstance”函数必须返回一个值。 19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing 连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭) 20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)" 连接时发现没有实现的外部符号(变量、函数等)。 function call missing argument list 调用函数的时候没有给参数。 member function definition looks like a ctor, but name does not match enclosing class 成员函数声明了但没有使用 unexpected end of file while looking for precompiled header directive 在寻找预编译头文件时文件意外结束,编译不正常终止可能造成这种情况 [zz] 编译开源代码的方法今天在折腾libjpeg,这是一个开源的JPG文件的编码函数库。因为DirectX中提供了完善的图像文件格式支持,而OpenGL在这方面却显得非常简陋,只好自己来写JPG文件读取函数。而且libjpeg只提供了从文件读取的函数,无法处理内存中的数据,也就是说在处理打包的资源时会比较麻烦。幸好已经有高手写出了修改libjpeg代码的方法,需要重新编译libjpeg.lib。在修改之前先尝试了用命令行(Visual C++ 2008 Express Edition)来编译代码,遇到了一些问题,还好都不是大问题,都解决了,呵呵,赶紧记下来免得忘了。 1、从ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/jpegsr6.zip下载libjpeg的源代码 2、解压出来一堆文件,打开命令行窗口(CMD),进入代码所放的目录下 3、运行命令:nmake /f makefile.vc nodebug=1 开始编译,然后问题就来了 4、“nmake 不是内部或外部命令” 5、makefile.vc<11>:fatal error U1052: file 'win32.mak' not found 6、NMAKE:fatal error U1073: don't know how to make 'jconfig.h' 7、NMAKE: fatal error U1077: '...\cl.EXE' : return code '0xc0000135' December 15 退而结网我一直在告诫自己”与其临渊羨魚,不如退而結网”,但实际上我执行的很不好,每每有点时间都是在徘徊蹉跎,想想再过几年我就很难再有这么多的闲余时间来学习,来发展兴趣爱好。Just do it。 December 13 Lenovo OEM Windows 7 Ultimate 旗舰版x86电驴资源 下面是用户共享的文件列表,安装电驴后,您可以点击这些文件名进行下载 rayfile 下载网页:http://www.rayfile.com/files/491c254f-c67e-11de-ab89-0014221b798a/ 电驴下载地址:ed2k://|file|LENOVO_WIN7_UM_32_ZH_CN_RDVD.iso|2829281280|1e4fc97988ed20988e4335420fa6beda| [资源名称]---Lenovo OEM Windows 7 Ultimate 32BIT December 09 敏捷开发中的Code Review一些敏捷团队在实施敏捷开发中忙于编码、忙于Unit Test、忙于沟通、忙于Build等,虽然也有编码审核阶段,但大都浮于表面,流于形式,效果不佳。本文结合实践,介绍笔者对敏捷开发中CodeReview的理解和相关经验。 文/陈序明 黄彦军 敏捷开 发中Code Review的目的及内容 做任何事情,首先要清晰为什么要做,才能有目标和动力把事情做得更好,Code Review 也是如此。只有清晰明确了敏捷团队进行CodeReview 的动机,才能以此为方向开展后续工作。下面我们推荐的敏捷开发中常见的Code Review的目的: 设计合理性Review 在笔者的另一篇文章中《敏捷开发中的架构设计》谈到,敏捷开发中崇尚Code is design,对开发人员提出了比以往更高的要求,即需要开发人员不断地重构出合理的设计。所以敏捷开发中的Code Review也需要承担一部分“结对设计”和“设计把关”的职责。 这部分的Code Review 包括:设计的合理性(如实现方法,数据结构,设计模式,扩展性考虑等),是否存在大量重复代码和其他组件是否有重复的代码,包结构设计是否合理等。 笔者了解的一些项目中, 进行敏捷开发后, 提高了开发效率, 但是设计的质量却下降了。如Repeat Yourself 的现象(特别是跨组件之间的Repeat Yourself 现象);更有甚者,在笔者看到一个某银行的应用中(不是国内的),数据库连接和操作是直接在JSP中写SQL语句。 像这些Bad Design 的例子还是很多的。这些在重构的时候应该由开发人员解决。但考虑到不同开发人员之间技术功底不一,很有必要在Code Review阶段进行Review和讨论。 互为Backup 这是很容易被忽略,但是又很重要的一个Code Review的目的。 我们知道,敏捷开发中强调高质量的代码胜过详细的文档,所以某种程度上来说Code is Document。敏捷开发中的代码承担了一部分Document的职责,即传递技术的作用。 Code Review 中,Review 的开发人员了解代码的设计和实现,传递了技术,开发人员互为Backup,方便后期的维护,也减少了项目风险。 分享知识、设计、技术 这也是很容易被忽略的一个很重要的目的。敏捷开发是一个中央集中控制到个体发挥积极性的过程,中央集中控制的优点就是有统一的视图和控制,经常开大会,开长会,这样知识和经验也较容易集中。敏捷开发中,分散在两个Scrum Team的开发人员之间,如果没有好的机制,相互沟通也会相对较少,造成知识和好的经验无法在整个团队传播。 笔者参加的项目中就碰到了类似情况, 当时我们整个团队分成三个Scrum Team,其中一个Scrum Team负责一个Eclipse 工具的开发, 其中用到的一些功能和知识在其他ScrumTeam上以前都有涉及过。当时负责开发的同事非常优秀而且能力突出,但由于不知道其他Scrum Team同事有这方面的经验,没有很好地分享以往好的经验和知识,以至于最后导致浪费了一些学习的成本。 Code Review是一个学习和享受的过程,一个开发人员的能力有限,而Code Review正是这样的一种机制,让好的知识、设计在团队中分享,实现整体团队的成长和整体的效益最大化。 代码可读性 如上所说,敏捷开发中强调高质量的代码胜过冗余的文档,所以Code某种程度上是Document。敏捷开发中,代码的要求不止是能运行功能正确的代码,而是有了更高的要求,即Code for maintenance。 可维护的代码,需要清晰,可读性强,这里可读性代码检查不是指代码格式(代码格式可以通过工具检查出),而是指代码语义。在笔者的文章《软件可消费性设计》中有一些这方面的讨论和建议。 Code中的“地雷区”Review 代码中的逻辑,除了业务逻辑,还应该包括技术逻辑。技术逻辑就是实现逻辑, 比如数据库连接打开是否忘记关闭,是否正确使用线程,Exception 处理,密码是否加密存储等。 我把这些最常出现错误的地方,而且是测试不容易发现的地方,称为Code中的“地雷区”。这些“地雷区”在Code Review 中是值得花费一些时间进行维护和检查的。 建议,在整个团队中维护并共享“地雷区”注意事项列表,以及统一的处理方式和机制。并在编码和Code Review过程中都按照团队的最佳实践进行。 发现代码中的业务逻辑错误 业务逻辑指的是代码开发的功能是否符合业务需求,如一个加法函数,检查其是否真的实现了加法的功能。 笔者了解的一些敏捷团队中,把发现代码的业务逻辑错误当做目标和内容,但往往效果都不是很好,基本都是从形式上泛泛检查一番。原因有两个: 1.业务逻辑的检查是从需求到代码的全方位检查,需要花费大量时间,投入产出比失衡。 2.业务逻辑的检查和业务需求紧密关联,已经超出了检查人员的能力范围(一般Code Review是开发人员,不是业务人员)。 笔者认为,发现逻辑错误,不应该是Code Review 的目的和内容。应该是Unit Test,功能测试,集成测试的目的。从投入产出比考虑,不应该花费太多时间在Code Review 阶段去进行逻辑错误检查。 敏捷开发中不推荐的Code Review的目的及内容 下面还有一些常见的Code Review目的和内容被很多团队广泛使用,但作者认为这些并不是敏捷开发中的主要目的和内容,团队应该把时间花费在重要的目的和内容上,而不应该投入精力在下面的这些Code Review目的和内容上。 发现性能问题 有些团队把性能问题,也作为Code Review的目的和内容之一,然后提出一些如String应该使用StringBuilder,而不能使用+,类似这样的看似有用其实无用建议。 笔者认为,性能问题是需要量化的衡量和精确定位, 很难通过Code Review检查出来。而一些粗浅的性能问题可以通过一些工具方便地扫描出来,而无须花费时间去进行Code Review。 如图1是RAD V7.0 (IBM Rati onal Application Developer) 中的Software Analyzer工具带有的Performance检查:
图1 RAD Software Analyzer中的Performance检查 所以笔者认为,开发人员提交的代码,需要是经过工具检查后的代码。而代码审核人员则无须花费时间在性能相关的Code Review 上。具体的性能问题交给性能测试。 发现开源的授权法律问题 开源软件也可以借助一些检查工具, 统一通过工具扫描, 无需在Code Review 阶段花费时间。 其他问题,如国际化,J2EE Best Practice等 这些问题开发人员可以在提交代码之前通过工具发现和解决, 不是Code Review 阶段的职责和目的,也无须花费时间去处理。 像FindBugs 和RAD 这样的工具就具备类似的代码检查功能,如RADV7.0 中的Software Analyzer 工具带有如下的检查功能:
图2 RAD Software Analyzer中检查规则列表 1.设计原则(5):用于面向对象编程的设计原则的规则。 2.全球化(47):基于全球化编码最佳实践的规则,有助于确保代码在局部环境中正确地运行。 3.J2EE 最佳实践(32):基于最佳的 Java™ 2 Platform Enterprise Edition( J2EE)开发实践的规则,以及支持瞄准 IBM® WebSphere® 服务的Web 项目的规则; 4.J2EE 安全性(17):验证代码符合 J2EE 技术安全性需要的规则; 5.J2SE 最佳实践(71):基于最佳的 Java™2 Platform Standard Edition (J2SE)开发实践的规则; 6.J2SE 安全性(9):验证代码符合 J2SE 技术安全性需要的规则; 7.命名(2):关于 Java 代码中命名约定的规则; 8.性能(26):加强在 Java 应用程序中提高性能和减少存储器足迹的建议的规则; 9.私有 API (3):定位那些不属于 Java 代码的 API 的规则。 敏捷开发中如何开展Code Review 在清晰明确了敏捷团队进行Code Review 的目的和内容后,下面介绍如何有效地开展Code Review。 沟通、协作、互助、学习的团队氛围 Code Review 中,Review 人员和开发人员不是对立的关系,而是互助、沟通、协作和学习的过程。团队形成互助、互学的气氛,既能互相增长团队的知识和经验,还能把产品做得更好。 Code Review协作过程: a)先由代码的开发人员向检查人员进行大体的介绍,包括设计思想、数据结构、程序代码结构介绍等。 b)双方进行讨论、交流。 c)检查人员单独进一步进行Code Review,并记录Review结果和建议。 d)由检查人员和开发人员一起,检查人员反馈Code Review结果,并和开发人员一起讨论改进方法,重构。 e)最后把可重用的Code Review的经验总结编码规范,或者记录到“地雷区”中。便于整个团队复用经验。
图3 Code Review是沟通、协作、互助和学习的过程 开展以上过程可以以开发人员为主,辅助以工具。但无须规定系列的文档、流程、Check List 等,这反而会影响开发人员的积极性。 Code Review是发现问题的过程,同时也是学习和交流过程。需要是灵活、自由、主动的态度,而不是行政上的控制和规章流程。笔者建议:和敏捷开发的核心思想一致,让团队明确Code Review 的思想、作用和目的内容后,充分发挥个体的积极性和学习分享的动力。随时随地地进行Code Review,讨论,重构,改进。 增量式Review 大家都知道,软件开发中存在长鞭效应,即一个问题越在后期发现造成的影响会越大,Code Review 也是 如此,如图4所示:
图 4 Code Review中的长鞭效应 软件的开发过程中, 应该阶段性地进行Code Review,而不是等到所有代码都开发完毕后再做一次性的Code Review。那时如果发现问题,造成的改动成本比增量式的检查来的大得多。 笔者了解的一些开发团队,他们在软件开发完毕,并测试后,才临时确定Code Review的人员,然后再安排半天左右的时间进行Code Review。结果尽管发现一些结构或设计方面问题,但由于修改成本大,也无法进行改进。 正确的方式是,在早期就参与设计开发过程,抱着互助、沟通、协作、学习的思想,阶段性的参与讨论、学习并贡献自己的意见。具体Review的频率、次数则可以由开发人员抱着主动、积极的态度,按照敏捷的思想自己去把握决定。 利用工具进行Code Inspection 有很多的工具可以辅助Code Review : 1.如代码格式检查Checkstyle 工具,检查如过大的类、太长的方法和未使用的变量等这样违反编程规范的问题。 2.RAD中的Software Analyzer工具,可以基于规则进行国际化、J2EE最佳实践、性能、安全等检查。3.CSAR,用于扫描代码检查开源软件等。 4.JDepend,可以检查包依赖关系。 5.CPD工具,Eclipse 的 PMD 插件提供了一项叫做 CPD(或复制粘贴探测器)的功能,用于寻找重复的代码。 6.Eclipse 的Metrics 插件,提供了很多有效地查出代码复杂度的功能。 辅助以工具和自动化流程,能花很少时间轻松完成很多基本的Code Inspection 工作。让团队有更多的时间和精力去做更重要的Code Review。 持续自动化Code Inspection 工具检查可以由开发人员自行检查并修正, 但一种更可持续的做法是自动化的集成工具进行Code Inspection,可以通过自动化脚本在每日进行Build 前进行扫描,并呈现报告给相应人员。 Code Review协作工具 为了快速有效地进行人工Code Review协作,可以使用诸如Jupiter这样的工具辅助进行。可以帮助开发人员有效管理Code Review任务、问题、建议等。 总结 Code Review 的核心是:互助,沟通,协作,学习的过程,这是一个美妙而享受的过程,是跨越需求分析、架构设计、编码等各阶段的过程。敏捷团队应该统一达成Code Review 对产品、对团队、对个人的巨大好处的共识,发挥出个体的积极性,相信会改变“流于形式”的现状,发挥Code Review巨大的威力。 本文来自《程序员》杂志0912期) December 07 [zz经典] 堆和栈的区别非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 二、堆和栈的理论知识 2.2 2.3申请大小的限制 2.4申请效率的比较: 2.5堆和栈中的存储内容 2.6存取效率的比较 char s1[] = "aaaaaaaaaaaaaaa"; 2.7小结: windows进程中的内存结构 在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Regeister)。每种变量都有不同的分配方式。先来看下面这段代码: #include <stdio.h> int g1=0, g2=0, g3=0; int main() //打印出各个变量的内存地址 printf("0x%08x\n",&v1); //打印各本地变量的内存地址 编译后的执行结果是: 0x0012ff78 0x004068d0 0x004068dc 输出的结果就是变量的内存地址。其中v1,v2,v3是本地变量,g1,g2,g3是全局变量,s1,s2,s3是静态变量。你可以看到这些变量在内存是连续分布的,但是本地变量和全局变量分配的内存地址差了十万八千里,而全局变量和静态变量分配的内存是连续的。这是因为本地变量和全局/静态变量是分配在不同类型的内存区域中的结果。对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈 (stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。 ├———————┤低端内存区域 堆栈是一个先进后出的数据结构,栈顶地址总是小于等于栈的基地址。我们可以先了解一下函数调用的过程,以便对堆栈在程序中的作用有更深入的了解。不同的语言有不同的函数调用规定,这些因素有参数的压入规则和堆栈的平衡。windows API的调用规则和ANSI C的函数调用规则是不一样的,前者由被调函数调整堆栈,后者由调用者调整堆栈。两者通过“__stdcall”和“__cdecl”前缀区分。先看下面这段代码: #include <stdio.h> void __stdcall func(int param1,int param2,int param3) int main() 编译后的执行结果是: 0x0012ff78 0x0012ff68 ├———————┤<—函数执行时的栈顶(ESP)、低端内存区域 上图就是函数调用过程中堆栈的样子了。首先,三个参数以从又到左的次序压入堆栈,先压“param3”,再压“param2”,最后压入“param1”;然后压入函数的返回地址(RET),接着跳转到函数地址接着执行(这里要补充一点,介绍UNIX下的缓冲溢出原理的文章中都提到在压入RET后,继续压入当前EBP,然后用当前ESP代替EBP。然而,有一篇介绍windows下函数调用的文章中说,在windows下的函数调用也有这一步骤,但根据我的实际调试,并未发现这一步,这还可以从param3和var1之间只有4字节的间隙这点看出来);第三步,将栈顶(ESP)减去一个数,为本地变量分配内存空间,上例中是减去12字节(ESP=ESP-3*4,每个int变量占用4个字节);接着就初始化本地变量的内存空间。由于“__stdcall”调用由被调函数调整堆栈,所以在函数返回前要恢复堆栈,先回收本地变量占用的内存(ESP=ESP+3*4),然后取出返回地址,填入EIP寄存器,回收先前压入参数占用的内存(ESP=ESP+3*4),继续执行调用者的代码。参见下列汇编代码: ;--------------func 函数的汇编代码------------------- :00401000 83EC0C sub esp, 0000000C //创建本地变量的内存空间 ……………………(省略若干代码) :00401075 83C43C add esp, 0000003C ;恢复堆栈,回收本地变量的内存空间 ;-------------------函数结束------------------------- ;--------------主程序调用func函数的代码-------------- :00401080 6A03 push 00000003 //压入参数param3 聪明的读者看到这里,差不多就明白缓冲溢出的原理了。先来看下面的代码: #include <stdio.h> void __stdcall func() int main() 编译后执行一下回怎么样?哈,“"0x00414141"指令引用的"0x00000000"内存。该内存不能为"read"。”,“非法操作”喽! "41"就是"A"的16进制的ASCII码了,那明显就是strcat这句出的问题了。"lpBuff"的大小只有8字节,算进结尾的\0,那 strcat最多只能写入7个"A",但程序实际写入了11个"A"外加1个\0。再来看看上面那幅图,多出来的4个字节正好覆盖了RET的所在的内存空间,导致函数返回到一个错误的内存地址,执行了错误的指令。如果能精心构造这个字符串,使它分成三部分,前一部份仅仅是填充的无意义数据以达到溢出的目的,接着是一个覆盖RET的数据,紧接着是一段shellcode,那只要着个RET地址能指向这段shellcode的第一个指令,那函数返回时就能执行shellcode了。但是软件的不同版本和不同的运行环境都可能影响这段shellcode在内存中的位置,那么要构造这个RET是十分困难的。一般都在RET和shellcode之间填充大量的NOP指令,使得exploit有更强的通用性。 ├———————┤<—低端内存区域 windows下的动态数据除了可存放在栈中,还可以存放在堆中。了解C++的朋友都知道,C++可以使用new关键字来动态分配内存。来看下面的C++代码: #include <stdio.h> void func() void main() 程序执行结果为: 0x004107d0 可以发现用new关键字分配的内存即不在栈中,也不在静态数据区。VC编译器是通过windows下的“堆(heap)”来实现new关键字的内存动态分配。在讲“堆”之前,先来了解一下和“堆”有关的几个API函数: HeapAlloc 在堆中申请内存空间 当进程初始化时,系统会自动为进程创建一个默认堆,这个堆默认所占内存的大小为1M。堆对象由系统进行管理,它在内存中以链式结构存在。通过下面的代码可以通过堆动态申请内存空间: HANDLE hHeap=GetProcessHeap(); 其中hHeap是堆对象的句柄,buff是指向申请的内存空间的地址。那这个hHeap究竟是什么呢?它的值有什么意义吗?看看下面这段代码吧: #pragma comment(linker,"/entry:main") //定义程序的入口 _CRTIMP int (__cdecl *printf)(const char *, ...); //定义STL函数printf 执行结果为: 0x00130000 hHeap 的值怎么和那个buff的值那么接近呢?其实hHeap这个句柄就是指向HEAP首部的地址。在进程的用户区存着一个叫PEB(进程环境块)的结构,这个结构中存放着一些有关进程的重要信息,其中在PEB首地址偏移0x18处存放的ProcessHeap就是进程默认堆的地址,而偏移0x90处存放了指向进程所有堆的地址列表的指针。windows有很多API都使用进程的默认堆来存放动态数据,如windows 2000下的所有ANSI版本的函数都是在默认堆中申请内存来转换ANSI字符串到Unicode字符串的。对一个堆的访问是顺序进行的,同一时刻只能有一个线程访问堆中的数据,当多个线程同时有访问要求时,只能排队等待,这样便造成程序执行效率下降。 最后来说说内存中的数据对齐。所位数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍,DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽,x86 CPU能直接访问对齐的数据,当他试图访问一个未对齐的数据时,会在内部进行一系列的调整,这些调整对于程序来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保证数据对齐。同样一段代码,我们来看看用VC、Dev-C++和lcc三个不同编译器编译出来的程序的执行结果: #include <stdio.h> int main() 这是用VC编译后的执行结果: 这是用Dev-C++编译后的执行结果: 这是用lcc编译后的执行结果: 三个编译器都做到了数据对齐,但是后两个编译器显然没VC“聪明”,让一个char占了4字节,浪费内存哦。 基础知识: 参考:《Windows下的HEAP溢出及其利用》by: isno 摘要: 讨论常见的堆性能问题以及如何防范它们。(共 9 页) 前言 什么是堆? 在程序中,使用堆来动态分配和释放对象。在下列情况下,调用堆操作: 事先不知道程序所需对象的数量和大小。 对象太大而不适合堆栈分配程序。 GlobalAlloc/GlobalFree:Microsoft Win32 堆调用,这些调用直接与每个进程的默认堆进行对话。 LocalAlloc/LocalFree:Win32 堆调用(为了与 Microsoft Windows NT 兼容),这些调用直接与每个进程的默认堆进行对话。 COM 的 IMalloc 分配程序(或 CoTaskMemAlloc / CoTaskMemFree):函数使用每个进程的默认堆。自动化程序使用“组件对象模型 (COM)”的分配程序,而申请的程序使用每个进程堆。 C/C ++ 运行时 (CRT) 分配程序:提供了 malloc() 和 free() 以及 new 和 delete 操作符。如 Microsoft Visual Basic 和 Java 等语言也提供了新的操作符并使用垃圾收集来代替堆。CRT 创建自己的私有堆,驻留在 Win32 堆的顶部。 Windows NT 中,Win32 堆是 Windows NT 运行时分配程序周围的薄层。所有 API 转发它们的请求给 NTDLL。 Windows NT 运行时分配程序提供 Windows NT 内的核心堆分配程序。它由具有 128 个大小从 8 到 1,024 字节的空闲列表的前端分配程序组成。后端分配程序使用虚拟内存来保留和提交页。 在图表的底部是“虚拟内存分配程序”,操作系统使用它来保留和提交页。所有分配程序使用虚拟内存进行数据的存取。 分配和释放块不就那么简单吗?为何花费这么长时间? 堆实现的注意事项 当应用程序或 DLL 创建私有堆时,这些堆存在于进程空间,并且在进程内是可访问的。从给定堆分配的数据将在同一个堆上释放。(不能从一个堆分配而在另一个堆释放。) 在所有虚拟内存系统中,堆驻留在操作系统的“虚拟内存管理器”的顶部。语言运行时堆也驻留在虚拟内存顶部。某些情况下,这些堆是操作系统堆中的层,而语言运行时堆则通过大块的分配来执行自己的内存管理。不使用操作系统堆,而使用虚拟内存函数更利于堆的分配和块的使用。 典型的堆实现由前、后端分配程序组成。前端分配程序维持固定大小块的空闲列表。对于一次分配调用,堆尝试从前端列表找到一个自由块。如果失败,堆被迫从后端(保留和提交虚拟内存)分配一个大块来满足请求。通用的实现有每块分配的开销,这将耗费执行周期,也减少了可使用的存储空间。 Knowledge Base 文章 Q10758,“用 calloc() 和 malloc() 管理内存” (搜索文章编号), 包含了有关这些主题的更多背景知识。另外,有关堆实现和设计的详细讨论也可在下列著作中找到:“Dynamic Storage Allocation: A Survey and Critical Review”,作者 Paul R. Wilson、Mark S. Johnstone、 Michael Neely 和 David Boles; “International Workshop on Memory Management”, 作者 Kinross, Scotland, UK, 1995 年 9 月( Windows NT 的实现(Windows NT 版本 4.0 和更新版本) 使用了 127 个大小从 8 到 1,024 字节的 8 字节对齐块空闲列表和一个“大块”列表。“大块”列表(空闲列表[0]) 保存大于 1,024 字节的块。空闲列表容纳了用双向链表链接在一起的对象。默认情况下,“进程堆”执行收集操作。(收集是将相邻空闲块合并成一个大块的操作。)收集耗费了额外的周期,但减少了堆块的内部碎片。 单一全局锁保护堆,防止多线程式的使用。(请参见“Server Performance and Scalability Killers”中的第一个注意事项, George Reilly 所著,在 “MSDN Online Web Workshop”上(站点: 什么是常见的堆性能问题? 分配操作造成的速度减慢。光分配就耗费很长时间。最可能导致运行速度减慢原因是空闲列表没有块,所以运行时分配程序代码会耗费周期寻找较大的空闲块,或从后端分配程序分配新块。 释放操作造成的速度减慢。释放操作耗费较多周期,主要是启用了收集操作。收集期间,每个释放操作“查找”它的相邻块,取出它们并构造成较大块,然后再把此较大块插入空闲列表。在查找期间,内存可能会随机碰到,从而导致高速缓存不能命中,性能降低。 堆竞争造成的速度减慢。当两个或多个线程同时访问数据,而且一个线程继续进行之前必须等待另一个线程完成时就发生竞争。竞争总是导致麻烦;这也是目前多处理器系统遇到的最大问题。当大量使用内存块的应用程序或 DLL 以多线程方式运行(或运行于多处理器系统上)时将导致速度减慢。单一锁定的使用—常用的解决方案—意味着使用堆的所有操作是序列化的。当等待锁定时序列化会引起线程切换上下文。可以想象交叉路口闪烁的红灯处走走停停导致的速度减慢。 堆破坏造成的速度减慢。造成堆破坏的原因是应用程序对堆块的不正确使用。通常情形包括释放已释放的堆块或使用已释放的堆块,以及块的越界重写等明显问题。(破坏不在本文讨论范围之内。有关内存重写和泄漏等其他细节,请参见 Microsoft Visual C++(R) 调试文档 。) 频繁的分配和重分配造成的速度减慢。这是使用脚本语言时非常普遍的现象。如字符串被反复分配,随重分配增长和释放。不要这样做,如果可能,尽量分配大字符串和使用缓冲区。另一种方法就是尽量少用连接操作。 在所有的服务器系统中(如 IIS、MSProxy、DatabaseStacks、网络服务器、 Exchange 和其他), 堆锁定实在是个大瓶颈。处理器数越多,竞争就越会恶化。 尽量减少堆的使用 如何减少使用堆操作?通过利用数据结构内的位置可减少堆操作的次数。请考虑下列实例: struct ObjectA { struct ObjectB { // 同时使用 objectA 和 objectB // // // struct ObjectX { 避免使用指针关联两个数据结构。如果使用指针关联两个数据结构,前面实例中的对象 A 和 B 将被分别分配和释放。这会增加额外开销—我们要避免这种做法。 把带指针的子对象嵌入父对象。当对象中有指针时,则意味着对象中有动态元素(百分之八十)和没有引用的新位置。嵌入增加了位置从而减少了进一步分配/释放的需求。这将提高应用程序的性能。 合并小对象形成大对象(聚合)。聚合减少分配和释放的块的数量。如果有几个开发者,各自开发设计的不同部分,则最终会有许多小对象需要合并。集成的挑战就是要找到正确的聚合边界。 内联缓冲区能够满足百分之八十的需要(aka 80-20 规则)。个别情况下,需要内存缓冲区来保存字符串/二进制数据,但事先不知道总字节数。估计并内联一个大小能满足百分之八十需要的缓冲区。对剩余的百分之二十,可以分配一个新的缓冲区和指向这个缓冲区的指针。这样,就减少分配和释放调用并增加数据的位置空间,从根本上提高代码的性能。 在块中分配对象(块化)。块化是以组的方式一次分配多个对象的方法。如果对列表的项连续跟踪,例如对一个 {名称,值} 对的列表,有两种选择:选择一是为每一个“名称-值”对分配一个节点;选择二是分配一个能容纳(如五个)“名称-值”对的结构。例如,一般情况下,如果存储四对,就可减少节点的数量,如果需要额外的空间数量,则使用附加的链表指针。 正确使用 _amblksiz。C 运行时 (CRT) 有它的自定义前端分配程序,该分配程序从后端(Win32 堆)分配大小为 _amblksiz 的块。将 _amblksiz 设置为较高的值能潜在地减少对后端的调用次数。这只对广泛使用 CRT 的程序适用。 其他提高性能的技术 使用 Windows NT5 堆 改进了堆代码内的锁定。堆代码对每堆一个锁。全局锁保护堆数据结构,防止多线程式的使用。但不幸的是,在高通信量的情况下,堆仍受困于全局锁,导致高竞争和低性能。Windows 2000 中,锁内代码的临界区将竞争的可能性减到最小,从而提高了可伸缩性。 使用 “Lookaside”列表。堆数据结构对块的所有空闲项使用了大小在 8 到 1,024 字节(以 8-字节递增)的快速高速缓存。快速高速缓存最初保护在全局锁内。现在,使用 lookaside 列表来访问这些快速高速缓存空闲列表。这些列表不要求锁定,而是使用 64 位的互锁操作,因此提高了性能。 内部数据结构算法也得到改进。 上述改进已在 Windows 2000 beta 2 和 Windows NT 4.0 SP4 中使用。改进后,堆锁的竞争率显著降低。这使所有 Win32 堆的直接用户受益。CRT 堆建立于 Win32 堆的顶部,但它使用自己的小块堆,因而不能从 Windows NT 改进中受益。(Visual C++ 版本 6.0 也有改进的堆分配程序。) 使用分配高速缓存 典型地,自定义堆分配程序在进程堆的顶部实现。自定义堆分配程序与系统堆的行为很相似。主要的差别是它在进程堆的顶部为分配的对象提供高速缓存。高速缓存设计成一套固定大小(如 32 字节、64 字节、128 字节等)。这一个很好的策略,但这种自定义堆分配程序丢失与分配和释放的对象相关的“语义信息”。 与自定义堆分配程序相反,“分配高速缓存”作为每类分配高速缓存来实现。除能够提供自定义堆分配程序的所有好处之外,它们还能够保留大量语义信息。每个分配高速缓存处理程序与一个目标二进制对象关联。它能够使用一套参数进行初始化,这些参数表示并发级别、对象大小和保持在空闲列表中的元素的数量等。分配高速缓存处理程序对象维持自己的私有空闲实体池(不超过指定的阀值)并使用私有保护锁。合在一起,分配高速缓存和私有锁减少了与主系统堆的通信量,因而提供了增加的并发、最大限度的重用和较高的可伸缩性。 需要使用清理程序来定期检查所有分配高速缓存处理程序的活动情况并回收未用的资源。如果发现没有活动,将释放分配对象的池,从而提高性能。 可以审核每个分配/释放活动。第一级信息包括对象、分配和释放调用的总数。通过查看它们的统计信息可以得出各个对象之间的语义关系。利用以上介绍的许多技术之一,这种关系可以用来减少内存分配。 分配高速缓存也起到了调试助手的作用,帮助您跟踪没有完全清除的对象数量。通过查看动态堆栈返回踪迹和除没有清除的对象之外的签名,甚至能够找到确切的失败的调用者。 MP 堆 本程序包是好的步骤 —一种改进的 MP-友好的自定义堆分配程序。但是,它不提供语义信息和缺乏统计功能。通常将 MP 堆作为 SDK 库来使用。如果使用这个 SDK 创建可重用组件,您将大大受益。但是,如果在每个 DLL 中建立这个 SDK 库,将增加工作设置。 重新思考算法和数据结构 减少需要的小对象的数量减少堆分配程序的负载。例如,我们在服务器的关键处理路径上使用五个不同的对象,每个对象单独分配和释放。一起高速缓存这些对象,把堆调用从五个减少到一个,显著减少了堆的负载,特别当每秒钟处理 1,000 个以上的请求时。 如果大量使用“Automation”结构,请考虑从主线代码中删除“Automation BSTR”,或至少避免重复的 BSTR 操作。(BSTR 连接导致过多的重分配和分配/释放操作。) 摘要 评价您的代码中堆的使用。 改进您的代码,以使用较少的堆调用:分析关键路径和固定数据结构。 在实现自定义的包装程序之前使用量化堆调用成本的方法。 如果对性能不满意,请要求 OS 组改进堆。更多这类请求意味着对改进堆的更多关注。 要求 C 运行时组针对 OS 所提供的堆制作小巧的分配包装程序。随着 OS 堆的改进,C 运行时堆调用的成本将减小。 操作系统(Windows NT 家族)正在不断改进堆。请随时关注和利用这些改进。 [zz]ARM流水线关键技术分析与代码优化引 言流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。ARM7处理器核使用了典型三级流水线的冯·诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构。通过增加流水线级数简化了流水线各级的逻辑,进一步提高了处理器的性能。 1 ARM7/ARM9流水线技术 2 三级流水线运行情况分析
流水线中阻断现象也十分普遍,下面就各种阻断情况下的流水线性能进行详细分析。 2.2 带有分支指令的流水线
3 五级流水线技术
3.1 五级流水线互锁分析
全部拷贝过程由两个结构相同的循环各自独立完成,分别实现两块数据的拷贝,并且两个拷贝过程极为类似,分析其中一个即可。 调整之后,T1~T5是5个单独的时钟周期,T6~T13是一个循环,同样在T14的时候BNE指令在写LR的同时,循环的第一条指令开始取指,所以总的指令周期数为5+10×10+2×9+2=125。
因此流水线的优化问题主要应从两方面考虑: 4 结 论 October 12 汽车标志奥迪AUDI: August 31 zz 有时间再看行业里干了很多年,发表一下自己当前的想法一、运营商的政策情况: August 29 杭州景点门票价格一览表杭州景点门票价格一览表
补充下,还有六通宾馆那里的高丽寺 票价20 ic卡补差价10元。 August 22 【整理】构造函数 拷贝构造函数 赋值函数构造函数: 对象创建都会调用构造函数,不实现C++也会默认生成一个,其目的是实现对象的创建和对象成员变量赋初始值。其特点是: 1.构造函数的命名必须和类名完全相同;而一般函数则不能和类名相同. 拷贝构造函数: 拷贝构造函数的格式为:构造函数名(对象的引用) 有这样几种case会用到拷贝构造函数: 1. 一个对象以值传递的方式传入函数体; 拷贝构造函数不可以改变它所引用的对象,其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。 赋值函数: 即是赋值符的重载函数,形式为 A& A::operator = (const A& a1) 其实现上有几个注意点: 1.自检查,防止自己给自己赋值。 2.释放原有资源。 3.malloc 新的资源并复制。 4.返回本对象的引用。return *this; 以对象的链式表达(a=b=c) August 20 [zz]7个顶级心理寓言
(一)成长的寓言:做一棵永远成长的苹果树 一棵苹果树,终于结果了。 【心理点评】你是不是一个已自断经脉的打工族? (二)动机的寓言:孩子在为谁而玩 一群孩子在一位老人家门前嬉闹,叫声连天。几天过去,老人难以忍受。 【心理点评】你在为谁而“玩” (三)规划的寓言:把一张纸折叠51次 想象一下,你手里有一张足够大的白纸。现在,你的任务是,把它折叠51次。那么,它有多高? 【心理点评】 (四)逃避的寓言:小猫逃开影子的招数 “影子真讨厌!”小猫汤姆和托比都这样想,“我们一定要摆脱它。” 【心理点评】 (五)行动的寓言———螃蟹、猫头鹰和蝙蝠 螃蟹、猫头鹰和蝙蝠去上恶习补习班。数年过后,它们都顺利毕业并获得博士学位。不过,螃蟹仍横行,猫头鹰仍白天睡觉晚上活动,蝙蝠仍倒悬。 【心理点评】 (六)放弃的寓言:蜜蜂与鲜花 玫瑰花枯萎了,蜜蜂仍拼命吮吸,因为它以前从这朵花上吮吸过甜蜜。但是,现在在这朵花上,蜜蜂吮吸的是毒汁。 【心理点评】 (七)亲密的寓言:独一无二的玫瑰 小王子有一个小小的星球,星球上忽然绽放了一朵娇艳的玫瑰花。以前,这个星球上只有一些无名的小花,小王子从来没有见过这么美丽的花,他爱上这朵玫瑰,细心地呵护她。 【心理点评】 做一棵永远成长的苹果树[zz]做一棵永远成长的苹果树
原文点评: 于是,你愤怒、你懊恼、你牢骚满腹……最终,你决定不再那么努力,让自己的所做去匹配自己的所得。几年过去后,你一反省,发现现在的你,已经没有刚工作时的激情和才华了。 “老了,成熟了。”我们习惯这样自嘲。但实质是,你已停止成长了。 这样的故事,在我们身边比比皆是。之所以犯这种错误,是因为我们忘记生命是一个历程,是一个整体,我们觉得自己已经成长过了,现在是到该结果子的时候了。我们太过于在乎一时的得失,而忘记了成长才是最重要的。好在,这不是金庸小说里的自断经脉。我们随时可以放弃这样做,继续走向成长之路。 切记:如果你是一个打工族,遇到了不懂管理、野蛮管理或错误管理的上司或企业文化,那么,提醒自己一下,千万不要因为激愤和满腹牢骚而自断经脉。不论遇到什么事情,都要做一棵永远成长的苹果树,因为你的成长永远比每个月拿多少钱重要。 David感想: 我相信很多同学毕业之后,看着周围的同学月薪成倍涨,买车又买房,必然心里会产生些不平衡,会心急会茫然会失望,顿觉前途渺茫。我们努力工作我们付出打杂,可拿刀的薪水跟老人比起来还是差很多,你有没有像上面的那个棵苹果树一样拒绝成长?反正我是有过的感受的,虽然最后都会慢慢接受,会想通想明白,但是这样的感受还是有切身体会的。庆幸的是,我没有拒绝成长,只是有些黯然,之后还是要奋进要努力。 有朋友跟我说,要看得再远一点,多想想几个月之后,几年之后的情景,而不要局限于眼前。是的,我们有什么理由拒绝成长呢?成长是为了自己,而不是为了别人。那么让我也做一课永远成长的苹果树吧! [zz]杭州163网易研究院面试题目网友汇总篇1.写出对“知之者不如好之者,好之者不如乐之者”的理解。 2.用中文写出尽可能多的中文语句,要求包含有“都”的意思(all、both之意),但不能有“都”字 3.new/delete和malloc/free的区别,并说说你在什么情况下会自另行建立自己的内存分配机制。 4.求极限lim(x-[x]),x趋于-3。 5.比较两个电路的可靠性。 6.编程题:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。 7.有两个字符串 str1和str2,写一个函数实现在str1中查找str2的初始位置。要求不区分大小写。 8.在字符串S中寻找最长的字符串x,条件是x存在于S中。即是如:abcabcdcd中的abc。 9.求Fibonacci数列中第k个与前面所有数互质的数(除前面两个数 1,1 )。 10.有100个真币和一个假币,只知道真币与假币不等重,要求只称两次,得出是真币重还是假币重。 11.证明题:给出n个互不相同的分数数列a1/b1, a2/b2… an/bn ,证明(a1 + a2 + … + an) / (b1 + b2 + … + bn) 的值在数列a1/b1, a2/b2… an/bn 数列的最大值和最小值之间。 12. 证明题:在三角形中,假设等角对等边,证明大角对大边。 13. 文学题:在以下的空白中填入相应的词(蔼、断、淡、泰)并解释其含义。 自处超然,处事 然,无事澄言,处事 言,得意 然,失意 然。 14. 问答题:为什么现在的计算机采用二进制?而不是八进制或十六进制?你认为以后的计算机会采用几进制? 15.程序设计题:给出若干个单词,组成字典,要求查找速度最快。 16.,有b1/a1,b2/a2,....,bn/an 共n个分数,分母同号,证明: (b1+b2+...+bn)/(a1+a2+...+an)的值在上面n个分数值最大制和最小值之间. 17.证明:三角形中大边对大角,已知等边对等角 18.为什么计算机中多用二进制,16进制也用在程序中.你认为有没有可能回出 现多进制的计算机,为什么 19.一个没有拷贝构造函数和重载=运算符的String类,会出现什么问题,如何解 决? 20.编程题. 有篇文章,找出文章中单词在词典中的序号,要求高效率.词典没排序. 21.有一位警长,抓了三个逃犯。现警长决定给他们一次机会。他拿出3顶黑帽子,两顶白帽子,然后往这三个逃犯头上每人戴了一顶帽子,每个逃犯只能看到另外两个逃犯帽子的颜色,不能看到自己帽子的颜色,而且不能进行通讯,不能进行讨论,只能靠自己的推理推出来,如果猜出来了,放一条生路,否则处死。 警长先问第一逃犯,结果第一逃犯猜错了,被杀掉了。 警长问第二个逃犯,结果还是猜错了,同样被杀掉了。 警长再问第三个逃犯,结果第三个逃犯猜对了。 说明一下,每个逃犯在回答问题时,其他逃犯是听不到的。 为什么第三个一定能猜中,请你给出解释。 August 18 关于push mail今天有一家做push mail的公司给我电话,使我产生了一点兴趣。看了一下关于push mail的资料,这里简单总结一下: 1.什么是push mail? Push Mail是一项将Email直接推送到移动终端(手机)上的服务。 在Push Mail出现之前,用户需手动拨号上网,收取邮件,这是一种Pull(拉)技术。而Push Mail系统能够将用户电子 邮箱中刚刚收到的新邮件在第一时间快速地推送到用户手机上。用户不用再频繁上网登录邮箱,就可随时随地收发处理邮件。 2. Push mail 的特点: Push Mail是将邮件主动推送到手机终端的移动邮件解决方案,能随时将企业邮件推送到用户手机终端上,实现关键信息 随时、随地、随身获得。 3.目前的push mail 有两种形式: Blackberry依托电信运营商可以在底层就实现Push Mail 功能,从而使他的效率更高,功能扩展更简单。而其他Push Mail 服务只不过是在现有的网络服务上扩展的一个功能而已。就好比OSI 7层模型, BB 在第2层数据链路层就能实现Push 这个动作,而其他人只能在第7层应用层来实现这个服务了。 b.MS的push 方式。利用运营商的数据服务,通过定时查询来获得邮件信息,来get mail。尚邮 也是采用相同的原理来实现邮件push。 以上是一点转载的更多细节的资料:http://cxxcn.com/pushmail_tech/ Blackberry的pushmail实现原理: 相当于解释了为什么Blackberry要跟各国的移动运营商合作: Blackberry依托电信运营商可以在底层就实现Push Mail 功能,从而使他的效率更高,功能扩展更简单。而其他Push Mail 服务只不过是在现有的网络服务上扩展的一个功能而已。就好比OSI 7层模型, BB 在第2层数据链路层就能实现Push 这个动作,而其他人只能在第7层应用层来实现这个服务了。 BlackBerry 通过自己的PIN在运营商那里注册,每个PIN 对应一个手机号码,运营商要投入来管理这些PIN。MS 的PushMail也是一样的道理。 MS的Pushmail与BB的Pushmail对比: 和bb不同的是,wm的方式可以完全避开运营商提供特殊服务的环节,只要运营商有internet数据服务,wm的设备就可以通过internet数据服务直接与exchange联系并得到push过来的邮件.当然wifi,与电脑同步也可以,不过那样就不能移动了. 最后,根据我的经验,能不能pushmail,不取决于是否wm5设备,ppc2003就可以,只要exchange升级了. 1、用WAP+代理不可能实现真正的Push。 WM5会在后台启动一个进程,时不时跟exchange发生https的交互,时刻保持在wap处留下内外网IP的转换记录确保当exchange有邮件的时候,可以发送trigger到那个内网IP。 wap+代理,在计算机网络的术语中,我们可以称之为NAT(具体实现方式不讲了,有兴趣的可以自行参考其他技术书籍),这种模式的上网方式,只能是由内部发起对外部的访问,外部无法主动发起对内网的访问。显而易见,在这种方式下的PushMail,即使在没有邮件的情况下,仍然会产生GPRS流量,对移动的各个网元GGSN SGSN都是要占用一些资源的,所以严格意义上来说,MS Exchange的PushMail还不算是真正的PushMail,因为在没有邮件的情况下产生了GPRS流量,会产生一定的GPRS费用。 推论:当BES/BIS发现有新的邮件时,就是发送一条短信给客户端,让客户端启动PushMail的进程准备接收新的邮件,这个时候由BES将邮件推到客户端中,在这种方式中,blackberry需要运营商的介入才能完成整个 Push流程,这种是比较干净的PushMail方式,因为不需要用户支付GPRS流量费(在没有邮件的情况下)。 2、MS的Direct Push过于依赖于Exchage Server,估计应用的范围大不到哪去?如果大家使用BB、WM都是用来收集POP3邮件的话,其效果倒也差不了多少。不过,如果大家都这样来使用 pushmail服务的话,估计免费的服务器是难以负担其沉重的负荷啊! 3、看来看去BB的pushmail还是最佳的解决方案,那就是和运营商合作,而且具有低维护成本的绝对优势。 结论:BB的Pushmail解决方案还是王道。虽然其他厂商也提供类似的解决方案,但RIM仍处于这个产业的上游,也就是说“立于不败之地”。也许,有一天RIM不做硬件了,专心为其他厂商提供pushmail的解决方案。 August 16 [zz]什么是“糖水片”?偶尔看到一篇文章,觉得写得挺有意思,就转来了。 August 02 20090802工作我一直面临一个很严重的问题 就是如何让自己的阅读成为有效阅读,也许是不专心 也许是兴趣不在此,所以经常出现看过了 只能留下一点印象 而不能真正自己的知识。这个问题 我一直没找到很多的解决办法。 July 27 bbweather使用方法+感受【加入截图】bbweather使用方法+感受【加入截图】本帖最后由 hkwon 于 2009-2-26 00:21 编辑 July 18 [zz] #pragma 指令在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。 (1)message 参数 message参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息, (2)另一个使用得比较多的pragma参数是code_seg 格式如: (3)#pragma once (比较常用) 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了, (4)#pragma hdrstop 表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度, (5)#pragma resource "*.dfm" 表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体 (6)#pragma warning( disable: 4507 34; once: 4385; error: 164 ) 同时这个pragma warning 也支持如下格式: (7)#pragma comment(...) 该指令将一个注释记录放入一个对象文件或可执行文件中。 例如,对循环优化功能: 有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告, 每个编译器对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。 补充 —— #pragma pack 与 内存对齐问题 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k Win32平台下的微软C编译器(cl.exe for 80x86)在默认情况下采用如下的对齐规则: Linux下的GCC奉行的是另外一套规则(在资料中查得,并未验证,如错误请指正): ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和。 如何使用c/c++中的对齐选项 vc6中的编译选项有 /Zp[1|2|4|8|16] ,/Zp1表示以1字节边界对齐,相应的,/Zpn表示以n字节边界对齐。 实际上,1字节边界对齐也就表示了结构成员之间没有空洞。 要专门针对某些结构定义使用对齐选项,可以使用#pragma pack编译指令: (1) #pragma pack( [ n ] ) 该指令指定结构和联合成员的紧凑对齐。而一个完整的转换单元的结构和联合的紧凑对齐由/Zp 选项设置。 (2) 编译器也支持以下增强型语法: 若不同的组件使用pack编译指示指定不同的紧凑对齐, 这个语法允许你把程序组件组合为一个单独的转换单元。 带一个pop参量的pack编译指示的每次出现都会检索内部编译器堆栈顶的值,并且使该值为新的紧凑对齐值。 pack编译指示的新的增强功能让你编写头文件, 确保在遇到该头文件的前后的 (3) 栈内存对齐 在vc6中栈的对齐方式不受结构成员对齐选项的影响。它总是保持对齐,而且对齐在4字节边界上。 [zz]查看lib 函数list最近遇到个库文件,lib.a,想知道里面是不是网络相关的一个库文件。于是就想到要把这个库文件的函数的list给导出来。 查了不少资料,后来终于找到方法,现总结如下: 比如lib.a文件,我们可以通过如下的方法来进行操作。 1。dumpbin lib.a /linkmember 这个dumpbin虽然是微软上vc上自带的工具,但是用于arm上出来的也是可以的。 当然,如果记不住这个参数,可以直接用dumbbin lib.a /all 2.这个方法虽然麻烦但是对于更好的理解lib.a作用比较好。 1。armar -x lib.a 这个直接把这个lib.a里面的.o组成文件给释放出来。-x参数及时把.o文件给释放出来。 2。fromelf –s test.o 这个命令可以把test.o文件的函数名字给列出来。 July 17 成员数据指针1.2 成员数据指针 struct MyStruct 现在有一个结构对象: MyStruct me; 我们需要 value 成员的地址,我们可以: int * pValue = &me.value; 当然了,这个指针仍然是属于第一种范筹----常规数据指针。 int MyStruct::* pMV = &MyStruct::value; 这种指针的用途是用于取得结构成员在结构内的地址。我们可以通过该指针来访问成员数据: int value = pMe->*pMV; // 取得pMe的value成员数据。 那么,在什么场合下会使用到成员数据指针呢? int sum(MyStruct* objs, int MyStruct::* pm, int count) 这个函数的功能是什么,你能看明白吗?它的功能就是,给定count个MyStruct结构的指针,计算出给定成员数据的总和。有点拗口对吧?看看下面的程序,你也许就明白了: MyStruct me[10] = 也许,你觉得用常规指针也可以做到,而且更易懂。Ok,没问题: int sum(MyStruct* objs, int count) 你是想这么做吗?但这么做,你只能计算value,如果要算key的话,你要多写一个函数。有多少个成员需要计算的话,你就要写多少个函数,多麻烦啊。 July 12 [zz]在华为工作十年的感悟(注:本文作者,徐是华为数据中心的头,技术超级牛人,一级部门总监,华为副总裁,年收入过千万,数据中心是用火山岩建的深入地下的一个大型建筑。防辐射,可 防卫星的电子,雷达等手段的侦察。里面有象卫星发射中心那种超大屏幕,机房里满是三米的大型服务器和大型计算机。连接整个华为全球的每一台终端,整个华为每天三十多万封邮件,海外和全球的同步研发,内部的信息管理,内部流程,华为的国内国际ip电话都是通过出去。) 正文: 上周,我正式提交了离职报告,准备给自己的职业生涯一个很大的转折,这是我长时间的思考最后所做的决定。但真的提出离职后,回想在公司的十年,还是百感交集。 1997 年7月16日,我只身提着一个包从深圳宝安机场下飞机,走出机场,天是那么蓝、白云那么低、空气那么潮,仰头望天,对这个城市,对公司、对即将开展的工作和生活、对自己的前途一片茫然。到了科技园,发现是个荒凉而偏僻的地方,不过倒很安静,上学的几年中,一连串的打击,使得我似乎有点喜欢这种安静、荒凉、在他乡的感觉。现在想想,经过十年的工作,自己的心灵真是麻木得可以了。那时候的心里,好像时时有些什么没有着落的东西在激荡,但又说不出来,只有在听德沃夏克的《自新***交响曲》时,才发现多有深处的共鸣以至落泪。 由于没赶上大批应届生的接待,我是自己一个人来到科技园1号楼的,干净整洁的大楼,很帅很靓的保安和前台,进进出出精神饱满的员工,让人的心情为之一振。象没头苍蝇一样乱走了一会后,一位人力资源的大姐,很职业、热情、耐心的告诉了我入职手续如何办理,并安排我当晚在粤海门华为之家临时居住,又安排之后的宿舍事宜,在举目无亲的异乡让人倍感亲切,至今记得。 来深圳、来华为当时确实是一种机缘,96年华为名气并不响,特别是在行业之外,偶尔一次我在同学家里看到一张华为人报,有几片文章印象至今很深:一篇是周劲写的欧洲考察心得,讲欧洲一个20-30人的小公司,所具有的那种全球化运作战略、能力和气度。一篇是唐东风写的被评为杰出员工受表彰后的感想。还有一篇名头很大“中央研究部知识产权处”,当时被这个名头吓了一跳。文中讲到华为当年研发累计投入1.8亿人民币,更让我吓一个跟斗。我想当时清华大学一年科研经费也就1亿多点,这家公司什么来头,花的科研投入比清华还多?当时就有了兴趣。 快毕业的时候,连连受挫,找工作跟当年大部分同学一样,希望留北京,但连续被联想、方正、科海、卫通等当时大名鼎鼎的公司录取后又告知要交几万块钱才能解决户口问题之后,想到了还有华为这样一家公司,给人力资源部寄了一份简历。没几天,一个深圳的电话,说某年某月某日有个副总裁来北京,面试一下。抱着试试看的态度跑过去了,是公司原副总胡红卫,他基本上没有问我什么问题,到是介绍了一下华为的情况,然后把人力资源经理田景琦叫了过来,当场就给了我一个“录取通知函”和入职操作指导。我一肚子犯嘀咕,这是不是一家骗子公司?怎么这样就算面试通过了?连工资有多少都没有机会问。之后一直到报到前,都有点怀疑,幸好有个本科的同学,在华为工作过,在向他咨询后了解到公司还是实实在在有的,才下了决心过来。总的说来,就是被一张华为人报“骗”来的。 就这样懵懵懂懂到了华为,一开始新员工培训,纪律严明、严格,班车不会多等半分钟,之后是部门培训,大量的信息扑面而来。之后到了工作岗位上,给我分配的 工作是ERP系统管理员兼DBA,虽然以前也搞过一些大系统,如兼职做过印度人的大型银行软件的客户化开发,但见到我们的ALPHA 8200和我们的软件ORACLE,心里还是激动不已。 IT的发展一日千里,10年前的技术与今天比,很多人可能没有体会了。那时比较落后,很多人也没有机会接触这种当时很先进的系统。我见到我们居然有2G巨大内存的“超级服务器”当时实在是佩服不已,为自己能做它的管理员而自豪,又为自己将来能不能玩转它而焦虑。我师傅王忠宁见到我就撂给我一本书《ORALCE ADMINISTRATOR GUIDE》,一寸半厚的英文书,愣是一周之内从头到尾看完并写了厚厚的读书笔记和一大堆不懂的问题,自此再也不怕厚厚的英文书。 当时正好是公司ERP上线没多久,业务正在推行,系统极不稳定,每天的并发程序有一半是跑错的,系统还会动不动 CRASH。我看完一本书后,在刚刚成为 One Book Man时,问题单就来了,有一个重要的××引入程序有时候跑得出来,有时候跑不出来。说实话,那时候对ERP、ORALCE、操作系统一切几乎还是一头雾水,而问题却已经传过来了,只好硬着头皮,摸索了好半天,终于明白了有一批数据在倒的时候,系统准出错。几万条数据,一条条试是不可能的,我就想出了用二分法,一批一批的试,完全手工动作,笨拙、费时、费力,做了几十遍,花了整整一天中午饭都错过了,终于定位到了其中一条数据,而后发现是数据超长而数据库定义的长度不够并且校验程序有BUG没校验出来。经过又返回去重复验证,证明找到的原因是正确的。当时真是心中大喜,几乎在完全不懂系统、不懂这个程序是做什么的、不懂程序处理的逻辑、不懂数据库的设计的情况下,把这个BUG定位出来并交回给ORACLE处理了。这是我上班后解决的第一个问题,至今我对这个问题本身还并不明白,呵呵。这让我懂得了一个道理,工作和读书不是一回事,工作是要解决问题的,是要产生结果和输出的。不管怎么样,能找到方法解决问题、能够有好的输出结果那就是成功。读书才追求的是慢慢读,读懂为止。 那时的系统,真是岌岌而可危,公司的业务高速发展,业务也不断推行,系统的负荷越来越高,但系统却不是经常宕机,就是跑得如老牛般慢。我们的技术水平和管理水平,也是与现在不可同日而语。水平不行体力补,大家兢兢业业背负责任,闯过种种难关,终于还是挺过来了。现在想想,还真是有点后怕的,稍有不慎真有可能全线崩溃。我也能理解有些大企业,为什么倒起来那么快了。现代的组织,经常是高度复杂的组织,就象生物一样,低等的蚯蚓断成两段,照样生存。而高等的人,身上戳个小小的洞可能得毙命。高度复杂的组织,就象人体一样,内部小小一块地方如果出关键问题了,组织可能崩溃。要保证不崩溃只有两条路:1)组织本身的设计和流程的设计高度科学、冗余和足够的制度性反应机制,这是西方国家的强项,他们的公司历一百年不倒,是有强大的内在因素的。2)依靠组织内每一个最小单元的高度的负责、警觉。虽然我们多年来一直在强调第一种能力的培养,但我们天生缺少这样的土壤和基因,因此第二种能力变得十分重要,虽然这不是最好的办法。 头两年的工作中,我们水平很低,体力劳动很多,有一段时间,我一上班就得高度紧张地盯着系统,不停地干预,系统才能跑下去。一会儿系统进程死了,一会儿空闲进程多了要杀掉,一会儿表空间不够了要扩展,一会儿用户提交了不合理的并发程序要中止…有一段时间,我成了热线兼现场支持,一天接50-80个电话,接了电话到处跑。之后我们做了很多改进工作,升级了系统硬件、写了自动脚本,成立了专门的热线等等,这期间我慢慢懂得了一个道理,一个大的复杂系统要成功的管理好,没有绝招,依靠的只是一点一滴持续不断的改进和努力。 有一度由于压力过大,也使我精神高度紧张,到了比较神经质的地步,有一段时间,一听到CALL机响,甚至是电视广告里的“摩托罗拉寻呼机,随时随地传信息 ”中的BP声,我的心跳就不由自主加速,喉咙发干。有一次去香港出差,从出发开始就一直惴惴不安,生怕系统出问题,结果刚到香港住进酒店,一个电话就来了,说系统崩溃了。我立即打国际长途叫赵×赶紧去处理,过了几分钟,赵回电话绝望地说,他以最快速度赶到一号楼,进了电梯刚走到一半,喀嗒停电了,电梯卡在中间半个多小时,祸不单行,当时那种感觉真是 “农夫内心如汤煮”啊。最后过度紧张使得我想逃避,导致我提出了辞职。所幸那时候的领导袁总和郭总,开导我多次,我逐渐有所缓解,然后慢慢开始理解了什么叫大将风度。做我们这一行,要如履薄冰、但也要有点临危不惧的精神。工作紧张,但心情要避免无谓的紧张。后来我们的ERP系统、IT数据中心,又出现过多次危险情况,淹过水、着过火,而我们最终都能够化险为夷。 工作并不只有艰苦和繁琐,有时候,乐趣也不期而至。当时我们的数据库总是出ORA-1555错误,严重影响系统的运行,我多天努力、百思而不得其解。现在的管理员可能会想,这不是一个小问题吗,但那时网络还没现在这么发达,什么东西一GOOGLE都出来了,我找了大量的资料,苦苦思索,最后终于灵光一现,象拼藏宝地图一样拼出了逻辑严密的解释和解决方案,我记得当时是深夜,内心偷着乐的感觉妙不可言,不需要别人知道、不需要别人理解,走出公司大门,仰望星空,深深吸一口气,内心偷着乐。还有另一次,当我们经过30多个小时的连续作战,解决种种问题,终于顺利升级成功ERP系统后,那种感觉也象打了胜仗的将军,充满胜利的喜悦。记得当时正是刚谈女朋友,给她写了第一封也是唯一一封情书,成为太太后,她有一次跟我说,你那玩意儿叫啥呀,那能叫情书吗?通篇都在讲你如何如何工作的,象工作汇报一样,简直可以跟鲁迅写给许广平的“情书”相媲美,尽是革命理想,没有点花前月下…..还有一次,我们的EMAIL系统突然出了故障,大量的来信收不到。那时是华为开拓海外市场的初期,海外还根本没有什么公司网络,所有的一切都是靠EMAIL和国际长途,天象塌下来一般,我们跟主管国际市场的徐直军汇报、最后向老板汇报请示是否应该报公安,因为当时的故障现象很象DDOS攻击。系统停了整整七天,我们请了各路专家,日夜攻关,试了N个方案,大家象大禹治水一样过家门而不入。最后还真找到了一个木马“冰河”的攻击,但却发现不是根本原因,故障依旧。最后一天晚上,我与阿韦坐在科技园一号楼冰冷的网络机房,看着系统一封一封的邮件,连接了,又中断了,一筹莫展,濒临崩溃。我抱着死马当活马医的心态,又祭出了我的“二分法” 体力活,测试了一封空邮件,能成功;测试了一封大邮件,失败;取其中间值,又失败;再取中间值,成功;再取前两次的中间值,成功…..一直到深夜,试了N次,终于总结出了规律!再一验证,只要在某个大小的地方,比它大的统统收不到。重要发现!然后改用PING包,发现在一千四百多字节的地方,再大就 PING不通了,现象可重复。再去想理论,如果按协议理解,这也不可能啊,即使MTU调小了,大包超过MTU也应该自动分片啊?除非是MTU在某个地方调小了,而协议又有异常。发现这个规律后,阿韦立刻跟电信联系,果然是一周前电信调整了路由器MTU并且CISCO的路由器有BUG引起。问题就此解决,当时吸了口气,那种舒坦啊!…没经受过类似极限考验的人可能不容易理解那种快乐!这种快乐是工作本身带来的,不需要别人来表扬,甚至不需要别人知道。能够有机会也能用心去体会这种快乐的人,怎么会不热爱工作? 工作也肯定不是只有成功和荣誉,有时候我也做很多蠢事和傻事,或者由于幼稚被人骗,或者是由于轻率导致工作失误。有一段时间,ERP系统岌岌可危,系统容量面临崩溃。我多次大声疾呼,几乎每一次有机会见到CIO郭总都大呼小叫一番。郭总当时刚来我们部门,一开始觉得我这个人怎么能这样?在一次部门全体会议上,郭总点名批评“徐家骏总是瞎咋呼,只会威胁我,却拿不出一个好的方案”。心里相当郁闷,但系统还在我手里,能等着它死吗?我还是一如既往的瞎咋呼,但也改进了一点,拿出了方案。郭总批准花了500多万来改进系统,这次给了我们1 -2年的稍稍太平时间,从而有机会做更多的改进优化工作。当时的500多万跟现在的概念可大有不同,现在IT花个500多万是小菜,那时500多万可是天文数字啊!当时相当佩服郭总的魄力,记得他要做大笔花钱的决策时,常说的一句话是“牛都杀了,还在乎牛毛?!”。很久以后,郭总有一次提到,徐家骏这个人工作还是蛮执着的。后来我的职位不断地得到了提升。之后我负责了很多重大的项目,往往涉及重大的投资,几百万、几千万,这些年来总共给公司花掉好几个亿。这中间技术方案制定,也有被忽悠了的。甚至重大项目投标时,有供应商恶毒的投诉诬蔑我的事,所幸公司及领导给了我这样的土老冒充分的信任。这些事我的体会是:只要你心无旁骛,目标单纯,就是想把这个事情搞好,并且持续地、啥都不计较地、傻傻地去推动,内心无愧,一时可能会有工作失误,一时可能会得罪人,可能会有人不理解,但长远来看还是会得到公正的承认的。 公司快速发展和扩张,由于工作业绩还过得去,很快就被提拔为小主管了,一开始觉得做主管也没啥,业务的细节我都是一清二楚的,不就是多了几个人一起干活吗?有一次,IT二把手袁总说“我要参加一次你组织的部门例会,看看你是怎么做管理的”,没问题,在例会上,我侃侃而谈,把业务分析得透彻细致,把工作安排得井井有条,洋洋得意地结束了会议,期望着袁总能给点表扬。袁总一声不吭坐到结束,等人都走了,劈头盖脸一顿“徐家骏,你知道这叫什么吗?这叫生产队长!农民!…”,一开始还不服气,我业务这么清楚、工作安排得这么妥当,管理能力还不行?后来,慢慢地自己也发现了问题,后来部门安排了去参加封闭4 天的管理干部培训,才算接触到了管理ABC,渐渐体会到,原来管理也是一门学问,而且大有学问。有了这个认识,后来我也时时留心。其实在华为要学习管理最简单,第一要诀是向身边的人学,华为的很多管理者,修养和能力超强,在平时和他们一起工作的一点一滴中,如果你细心去观察和体会,收获实在可以不少。比如说,有一段时间,我每周参加IT部门干部例会时,大家讲得差不多了,该由领导作判断和决策、做工作安排之前,我就会猜,领导可能会做有什么判断、会做什么决策,特别是有些事情充满矛盾和冲突,需要权衡时。一开始十猜九不中,并且很多看法别人说出来之后觉得耳目一新、不胜佩服。于是就去想他为什么会这样判断和决策,背后做的功夫是什么,慢慢地自己处理类似问题的思路也比较开阔了。另外、别人在管理中犯的错误,也是自己学习的好机会,自己犯错误自己是不容易觉察的,但别人犯错误自己可以觉察,然后可以警醒自己避免类似错误。 后来,做数据中心经理、技术支持经理、IT基建经理、系统运作副总监,变做边学,做团队管理、做考核、做流程优化,应对种种难题:如用户严重不满、工作头绪繁多流程乱来、资源严重紧张、骨干员工要离职、刺头员工提种种要求、部门骨干之间文人相轻、部门之间配合大起冲突、末位淘汰等等等等,逐渐逐渐对管理的体会越来越深,对管理的重要性认识越来越深。应对这些难题,当时真是殚精竭虑,有时甚至痛苦不堪。但我事后的体会是,凡是自己在感觉严重受挑战、整天闹心痛苦的工作阶段,往往是自己能力和心态进步比较快的阶段,而有时候工作一切都已摆平、风平浪静,可以悠哉游哉的时候,半年过去,发现自己一无所获,毫无建树,其实内心深处更加焦虑和痛苦。我后来总结过很多管理工作的要点和戒律,也总结了一句话,叫做“成功人士就是经常成功地跟自己过不去的人士”。 2003年下半年,数据中心建成后,IT运作这一块,在多年的岌岌可危之后,终于有点风平浪静的意思了,为了“跟自己过不去”,其实也是为了自己的兴趣,我向领导申请去信息安全部并得到了批准。当时业界还处在冬天时期,华为在冬天时期,不但面临竞争对手的威胁,更严重的是面临内部的威胁,屡屡爆发的重大产品、商务信息泄密,给公司造成了重大的损失,信息安全形势十分严峻,也触发了公司最高领导层对信息安全工作的超级重视。信息安全工作是是一个基本纯防守的工作,防守战线太长太长,整个系统的防守强度取决于最薄弱环节,而攻击者却可以集中资源,只要攻其一点即可。我到信息安全部,发现我们的管理体系、政策体系经过几年的努力,已经有一定的建树,而技术方面的能力却是很薄弱的环节。因此,重点在此方面开展了工作。几年之内,我们部署了很多防护系统,也培养了一批人,在我离开信息安全部时,整体上应该讲有了较大的改变。 调到信息安全部工作期间,其实给我最深的体会是跨部门的合作,在原来部门时,信息安全部也经常来“烦”我,我的反应经常的是排斥和不满,到了信息安全部 后,变成经常是我得去“烦”别人,并且我们部门是特别讨人“烦”。如何取得他人的合作?是一直来磕磕碰碰的难题。比如 SPES开发和推行这个大项目,要 “烦”的人实在太多了:数据中心、网络部、PC、海外IT、研发信管办、销服信管办、采购、发货、进出口部、物流、各国代表处、公司各级领导、最终用户等等。在不断地“烦”人的过程中,我总结出了一套“合作方法论”,有很多道道,不过最终总结起来,一句话简单说就是“如果你总是抱怨别人跟你不合作的时候,问题一定是出在你自己身上。” 03年底,当时业界连续几次蠕虫的发作,部门几个技术人员一直在讨论如何搞一个方案对付这个问题,我们设想了种种可能性,最后部门技术大牛季昕华提出一个设想:把客户端的软件和网络上的设备联动起来来控制蠕虫,并且做了一个很有意思的胶片,把对付SARS的手段用来对付蠕虫了。我一下子被这个新颖的设想所吸引,后来我在此基础上与大家多次讨论进一步扩展了概念,提出了策略强制系统的概念。为了让我们的设想能够付诸现实,我在部门其实并未授权的情况下,偷偷搞了几个人,花了半年时间把POC系统做了出来。 POC系统刚出来,我们就听到了CISCO在04年中发布了其SDN/NAC产品概念,跟我们的思路非常接近,这给了我们很大的信心,后来我干脆主动请缨,放弃其他管理事务,全职投入到组建一直开发队伍,开发SPES产品中去。最终我们产品开发成功了,在公司全球100多个国家6万多员工大规模的推广也成功了,并且在公司内部良好运行至今。这件事给我最大的启示是:我们要有信心、要敢做,CISCO并不可怕。说老实话我们是一支很土八路的队伍,也不属于公司的研发体系,我们这支土八路的队伍,坐了2年冷板凳,磨啊磨啊,最终还真磨出来一个还不赖的东西。 2004年底,在磨出来这个东东之后,我们又开始张罗产品认证、组织市场活动、策划定价及销售策略、寻求多方合作、建设支持体系等,在我们经过艰苦的市场拓展,客户已经开始广为感兴趣并已经形成几单实际销售的情况下,公司由于政策问题,为了确保资源最大限度投放到公司内部工作以支持公司海外市场的大发展,叫停了我们真正做成对外销售的产品,虽然我理解公司的大方针,但这个决定还是让我非常痛心,否则我相信今天这个产品很有可能已得到更大的发展。前不久我去北京出差,跟一个公司产品的代理商偶尔聊天,他不知道我是SPES的主要负责人,大大的吹了一通我们的东东并很惋惜为什么不卖,不禁让我又喜又悲。 转眼工作十年了,在华为的十年,正是华为从名不出专业圈子到现在成为路人皆知的大公司,高速发展的十年,见证了公司多年的奋斗历程。也投身其中,在大潮中边学边游泳,走到今天。现在我要离开公司了,准备去开始新的事业,接受全新的挑战,我将要去做的事情,风险很大,很有可能是九死一生,九死后还能不能有一生,也难说。在开始新的事业之前,想起了对过去的十年做个一个详细的总结。在一个象华为这样高速发展的大企业工作,有时是一种炼狱般的锻炼,如果我能够总结十年的经验和教训,从中学到关键的做事、做人的道理,我想对将来一定大有益处。 这些年来有些人离开公司,写一些东西或书,对公司指手画脚、评头论足、指点江山,对公司的高层领导逐个点评一番,我个人感觉除了带来一些娱乐价值,还有什么益处呢?公司照样在发展,发展的背后,6万人种种梦想、努力、贡献、牺牲、奋斗、抱怨、不满、沉淀、离去、希望、失落;发展的背后,种种机会、重大决策、危机、失误等等的内在逻辑又岂是局外人说得清楚?我不想多说公司,只是想对自己的工作经历好好反思反思,想想自己做了什么努力,做了什么贡献,做了什么自己最高兴、做了什么自己最受益、学到了什么?总得说来,我在华为的十年是懵懵懂懂过来的,当初我好像没有什么远大的理想、没有详细的规划,只是想着把一件一件事情做好。通过自己的总结和反思,将来我希望自己能够更加有规划、更加清晰一点。 大概想了想,我觉得有以下几点,是这些年深有体会的经验和教训,值得今后再发扬。 一、 “从小事做起,学会吃亏,与他人合作”,这是研究生毕业前最后一堂课,电子电路的老师最后送给我们几句话,虽然我忘了这位老师的名字,但这几句话却至今铭记。在华为的工作实践,越发感受到这简单的几条的道理深刻。从小事做起不是一直满足于做小事,也不是夸夸其谈好高骛远。学会吃亏不是忍受吃亏,是不斤斤计较于一时一地的是非得失,是有勇气关键时候的放弃。 二、“心有多大,舞台就有多大”,我们很多的成功,来自于敢想,敢做,就象我第一次接到问题单,根本不懂,但敢去试,敢去解决,还真的解决了;就像 我们做 SPES,即使没人、没技术、没积累,还有CISCO等大公司也在做,我们也敢做,敢推行,不盲目崇拜或畏惧权威,也取得了成功。当然,这不只是盲目的胆大,心大还意味着积极地关注广大的外部世界,开阔宽容的心胸接受种种新鲜事物。 三、 “好好学习,天天向上”,这句话用来形容对IT人的要求,最贴切不过了。真正的成功者和专家都是“最不怕学习”的人,啥东西不懂,拿过来学呗。我们 IT 现在有个技术大牛谭博,其实他不是天生大牛,也是从外行通过学习成为超级专家的,他自己有一次跟我说,当年一开始做UNIX系统管理员时,看到#提示符大吃一惊,因为自己用过多年在UNIX下搞开发都是%提示符,从未有过管理员权限。看看专家的当初就这水平!当年跟我做备份项目时,我让他研究一下 ORALCE数据库时点回退的备份和恢复方法,他望文生义,以为数据库的回退是象人倒退走路一样的,这很有点幽默的味道了,但他天天早上起来,上班前先看一小时书,多年积累下来,现在在系统、数据库、开发等多个领域已成为没人挑战的超级专家了。但是,学习绝对不是光从书本学习,其实更重要的是从实践工作中学习,向周边学习。比如说我在华为觉得学到最重要的一个理念是“要善于利用逆境”,华为在冬天的时候没有天天强调困难,而是提出“利用冬天的机会扭转全球竞争格局”并真的取得成功,如果没有这个冬天,华为可能还要落后业界大腕更多年份;华为在被CISCO起诉时没有慌乱,而是积极应对,利用了这次起诉达到了花几亿美金可能达不到的提高知名度的效果。等等这些,把几乎是灭顶之灾的境遇反而转化为成功的有利条件,对我留下的印象十分深刻,也对公司高层十分佩服。 四、勇于实践,勇于犯错,善于反思。很多事情知易行难,关键是要有行动,特别是管理类的一些理论、方法、观念。空谈、空规划一点用处都没有,不如实 际把它做出来,做出来后不断反思改进,实实在在最有说服力。没有实践中的反复演练和反思,即使是人人皆知的东西要做好都其实不容易,举个小例子,比如做管理者要会倾听,我想华为99.9%的管理者都很懂这一点,但实际做的如何呢?华为有多少管理者做到了不打断别人讲话?不急于下结论给定义?不急于提供解决方案?有多少管理者能够做到自然地引导对方表达?问问对方感受?确认自己明白对方? 五、要有方法、有套路,对问题系统思考、对解决方案有战略性的设计。在前几年的工作中,由于取得了一点成功,技术上也有了一点研究,就开始夜郎自大 起来了,后来公司化重金请来了大批顾问,一开始对有些顾问还真不怎么感冒。后来几年公司规模越来越大、IT的复杂性越来越增加的情况下,逐渐理解了很多。西方公司职业化的专家,做任何事情都有方法论、有套路,甚至于如何开一个会都有很多套路,后来我对这些套路的研究有了兴趣,自己总结出了不少套路并给部门的骨干培训和讨论。在一个复杂的环境下,很多问题已经不能就事论事来研究和解决,非常需要系统性的方法和战略性的眼光。对于一个组织的运作来讲,制度和流程的设计尤其需要这一点。爱恩斯坦说过: We can’t solve problems by using the same kind of thinking we used when we created them. 六、独立思考,不人云亦云。公司大了,人多了,混日子也容易了。人很容易陷入随波逐流、不深入业务的境地,而看不到问题和危险。专家有过一个研究, 雪崩发生时,一般受害者都是一批一批的,很少有单个人的受害者,原因很简单,单个人在雪崩多发地会相当小心和警觉。但一个群体,群体越大,每个个体就会有一种虚幻的安全感和人云亦云的判断,但现实是不管群体的力量有多大,雪崩都是不可抵抗的。因此我觉得在大的机构里,保持独立思考的能力尤为重要。 七、少抱怨、少空谈、积极主动,多干实事。我曾经是个抱怨很多的愤青,经常容易陷入抱怨之中。但多年的工作使得我有所转变,因为知道了抱怨是最无济 于事的。世界上永远有不完美的事情,永远有麻烦,唯一的解决之道是面对它,解决它。做实实在在的事情,改变我们不满的现状,改变我们不满的自己。实际上也有很多值得抱怨的事情都是我们自己一手搞出来的,比如社会上很常见的是高级干部退下来了,抱怨人心不古、感慨世态炎凉,如果好好去探究一下,原因很可能是他权位在手春风得意时不可一世、视他人如粪土造成的。 八、对职业负责、对目标负责,对自己负责,成功者往往自觉自律、信守承诺、心无旁骛。大企业肯定会有绩效考核、会有论功行赏、会有KPI、会有领导 指示、甚至会有一点企业政治,但如果我们片面地追求考核成绩、片面追求KPI指标、片面追求权钱利益,片面地对上负责、对别人负责,而不对自己负责、不对自己的目标负责,失去工作的使命感、责任心、热情和好奇心,必将不能达到自己的最佳境界。而一个企业如何能够成功营造一个环境,让每个个体尽量发挥到最佳境界,企业也会战无不胜。 九、多点人文修养和审美情趣,看起来与工作不怎么相关,其实太相关了。杰出成就的取得离不开对美的境界的追求,最伟大的科学发现,往往蕴涵着秩序、简洁和美。缺乏一点审美的追求,什么UGLY的事情都敢做、不择手段、凡事凑合,一点都不“高雅”,必将不能长久。 十、 “大家好,才是真的好”,关注人,帮助人,真诚待人,厚道做人。快速发展的现代社会,由于媒体的作用,过分渲染了人与人之间日益冷漠、诡诈的关系,但实际的社会、社区可能真的不是那么回事,起码我来华为之前,对一个大企业中工作的人事关系开始还有点未知的恐惧,但实际上在这个集体中的感觉几乎人人都能开放、真诚相待,关系融洽和谐。所以关键是我们自己要能够真诚对待他人,在与他人互动中将心比心。当然,工作中的冲突是不可避免的,实际上冲突也是没有必要去避免,甚至很多冲突对组织来讲,是大有益处的。就象夫妻吵一架后感情往往更好。只要我们掌握两大原则:1)对事不对人,2)与人为善。就肯定能把适度的冲突引导到对自己、对组织都有利的方向。 十一、开放和分享的态度,在一个高科技公司工作,如果报着保守和封闭的心态,成长肯定会受阻。 十二、做好时间管理。在华为工作十年,3650天,工作日3000天左右,这些时间是不是花在最重要的事情上了,有效的、有产出的工作时间究竟有多少,实在值得怀疑。时间管理是我在华为工作当中最大的教训之一,可能也是公司整体性的问题,工作缺乏计划,经常是面临不断的被打断;或者是不断去打断同事下属;或者是不断的会议、讨论,占去绝大部分的时间;或者是被自己的兴趣所牵引,花大量时间搞一些不着边际的事情;或者是花很多时间在一些细枝末节的事情上,把很难很重要的事情一直拖到非解决不可的地步然后被迫仓促行事。现在回想,如果真的能管理好这十年时间,我觉得成就应该大很多。 在华为的十年,还有一笔最宝贵的财富是结识无数优秀的同事、朋友,他们给予我很多启发、给予我无私帮助,要感谢无数给予过我帮助、启发的人: 首先感谢我的师傅王忠宁和二师傅祈宇,是他们带着我走上了工作岗位的第一步并真诚地帮助我。或许是由于左手有六个手指头的缘故,师傅个性偏执,牢骚满腹,与很多人合不来。但我跟他一年多,一起抽烟、一起在冰冷的机房喝冰冷的可乐、一起发牢骚、一起到路边小摊吃炒米粉,无话不谈,成了最好的朋友,他对自己的事情高度负责的精神和刚直的个性给了我深深的感染。他终身未婚,在99年不幸患肝癌离世。去世前几天,我去医院看他,给他送了一朵鲜红的玫瑰花,希望他能够把花献给他喜欢的、住院期间给他很好照顾的护士,他非常高兴。 感谢我的老领导许总,刚到部门时他给我们做ERP培训,我们班上所有的人都皱着眉头很痛苦,因为都听不懂他的诸暨话。而我大喜,因为我也是浙江诸暨人。作为公司元老级人物,许总这么多年来工作激情丝毫不减,让人佩服;许总经常骂我们,甚至狗血喷头,但他也是最经常请我们吃饭的领导,点菜的水平很高,酒德很好…也感谢曾经作为我领导的郭总、袁总、李总、胡总、洪总、周总、陆总、付总等,他们给予我太多机会、给予我太多宽容,我从他们身上也学到很多很多。 感谢太多同事和下属,不管是还在华为或者已经离开的,曾经为了支撑我们的工作目标,他们承担太多压力、默默付出太多。科技园我们的机房值班人员邓迅雷,天天晚上彻夜坐在冰冷而空气不好的机房里,为了防止老鼠咬断网线,想了种种办法捉老鼠。周振惠老婆在医院生孩子,他却半夜在公司加班处理自动仓库的紧急问题。EMAIL系统出问题内存泄漏,在找到根源之前,向阳连续2天24小时坐在电脑前监视和及时重启服务。WDGL服务器几百G数据全部丢失,沈勇偷偷摸摸、吭哧吭哧折腾了半个多月,借信用卡从美国自费买了软件,最终终于把数据恢复回来,避免了一场IT的灾难。SPES开发组,一开始基本是在师出无名失败风险极大的情况下,成年累月日夜奋战,幸好后来胡总力排众议鼎力支持,才终于搞出来一点土土的东西。SPES在海外实施时,柯晓宇在埃及去机场遇车祸,清醒过来第一反应是赶紧再找车去机场,否则误机了耽误下一个地区的实施。吴橹晓楠等人,瞒着家人和老婆,抢着要去伊拉克,还以为那儿可以搞支AK47 玩玩。孙颖单身女将,独闯欧亚诸国,李晶顾磊在孟加拉上吐下泻,打电话回来说话的力气都没有,照样圆满完成超出预计复杂度的任务。还有小宋、小曹、周讯、老翟、老刘、家汉、牟头、老叶、陈君、伏朝阳、李斌、小麦、张华彦、齐燕英、鲁飞、闵朋、曾宇斌、邓湛、钟美琴等等等等……,一回忆太多太多扑面而来,真是不能一一列举。 感谢我们部门所有默默无闻、给予我们无数帮助的秘书MM,小吴、小关、梁、沈、肖、王、龙等等,特别感谢我97年刚到公司时的秘书李丽东,做事雷厉风行,我新员工刚报到时用一台电脑没多久,有个老员工过来说这个电脑是他的,他要拿走。我赶忙向许总求救,许总听完我的汇报后,抬起头:“嗯&@$# %,我们部门的电脑怎么管理怎么这么混乱?必须加以改进了!”之后一时没下文,我也不知道怎么办,灰溜溜回到了座位上发愁,看到小李起身慢慢走到那个老员工前面,劈头盖脸狂骂一顿,不知道说了些啥,走回来时,拍拍我肩膀“徐家骏,搞定了”。当时我对她崇敬不已,简直须仰视可见。之后有一天,她上班的时候叫我,“徐家骏,到我家去一趟”,我乐呵呵的去了,把她的一台破24寸电视机从蛇口的一端搬到了另一端的修理站,当然,这算是外出公干! 感谢若干多的供应商销售和支持人员、顾问,多年来我有时把他们逼得走头无路。DEC的罗辉、SUN的李建文、IBM的GARY、ORALCE的张力、高波等等等等,都是我崇拜的大牛,从他们我学到了很多很多。我最佩服的张力有一个本事无人能及,他能端端正正地坐着,手放在键盘上,头直直得好像在盯着屏幕,然后睡着并且打很大的呼噜。98年我们系统从10.6升级到10.7,我陪着他一口气干了30个小时,中间偶尔等系统在跑,他就这样睡着了。我盯着系统,一跑完就叫他,他眼睛一睁,手就开始动了,中间遇到重重难关,他都不慌不忙,很帅,很有大将风度。升级完后,我跟他去海景酒店的房间休息,我也学他,在洗澡的时候睡着了,从浴缸里咣噹摔到了外面地上,他煞有介事的冲过来“干啥干啥呢?这么大动静!”。 感谢在我喝醉稀巴烂时半夜扶我一直到家里的王涛,感谢在我发高烧一人倒在中心医院重症抢救室时前来救我的老罗、建新,老罗陪我一夜后第二天又正常来上班 了,并且晚上又加班了;我一直希望自己也有他那牛一样的金刚不坏之躯。还有他太太,细致入微,给我买了各种必要的住院物品,在困难之中倍感温暖。 感谢我的父母,他们大半辈子都在极艰苦、极勤奋、又是快乐中度过,他们给了我最无私的爱,也给了我最大的宽容和自由。从初中开始,凡有我的重大决定,他们都让我自己做主。初中考高中,冒着没学上的风险,我要考县里的中学,他们支持我。考大学,他们说“清华是好的,北大是好的,科大也是好的…”,大学毕业找工作,他们说“联想是好的,方正是好的,考研也是不错的”,研究生毕业,他们说“华为是好的…”虽然他们没听说过华为,只知道是家民营企业不大保险。找老婆时他们说“这个媳妇真好…”,并且要求我不许欺负她,而不顾实际情况真好相反。 感谢我的太太,虽然欺负我,但对我的工作和所有怪念头都理解和支持,我工作太忙过,也发烧过 PDA、发烧过智能手机、发烧过钢琴、发烧过小提琴、发烧过 APPLE,有时候回家陪这些“小情人”比陪她的时间多,她都能谅解。她对金钱和名誉常常很不在乎,家庭财务也一塌糊涂。不过做事雷厉风行、执行力超强,我刚提离职,她就以迅雷不及掩耳盗铃之势把我们的房子卖掉了。 感谢我的女儿,虽然她才不到二岁,但她带给我和太太的快乐和幸福简直难以描述。在养育她的过程中,我们自身不断学习、反思,也得到很大的提高,小孩的成长也是我们父母重新成长一次的机会,在与她互动的过程中,我觉得最主要的不是我和太太教育她,而是她教育我们,她触发了我们更好地去面对、体会、反思、感悟生活和人生,并且她也触发了我很多关于管理的深入思考,感觉育儿和管理很多方面真是很相通的。为此我还专门开了一个博客,把自己对于儿童教育、管理等的感悟记录下来。 最后感谢公司老板,给我们提供了这样一个工作平台,在这个平台上我们努力过、奋斗过、沮丧过、抱怨过、成功过、快乐过…我们从一个土老冒逐渐成长为一个职业人。真心说声谢谢!希望公司变得越来越强大,越来越成为中国人在世界上的骄傲。 [zz]程序员应该做的事情程序员每天该做的事 1、总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多 2、考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作 3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢 4、考虑自己一天工作完成的质量和效率能否还能提高 一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍 5、看一个有用的新闻网站或读一张有用的报纸,了解业界动态 闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示 6、记住一位同事的名字及其特点 你认识公司的所有同事吗?你了解他们吗? 7、清理自己的代码 今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗? 8、清理自己的桌面 当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净 程序员每周该做的事 1、向你的老板汇报一次工作 让你的老板知道你在做什么,这很重要。可以口头、书面、邮件,看你老板的工作方式而定 2、进行一次自我总结(非正式) 这周之内自己表现得怎么样?该加分还是扣分? 3、制定下周计划 把下周要做的事情列出来,一样要分清楚优先级 4、整理自己的文件夹、书柜和电脑文件 把桌面以外的地方也要清理干净,电脑的文件夹,收到的邮件,把过时的垃圾全部清理掉 5、与一个非公司的朋友沟通 它山之石,可以攻玉 6、看一本杂志 找一本适合自己的专业杂志 7、纠正自己或同事一个细节上的不正确做法 《细节决定成败》看过了吗?没看过强烈建议先看看 程序员每月该做的事 1、至少和一个同事一起吃饭或喝茶 不光了解自己工作伙伴的工作,还要了解他们的生活 2、自我考核一次 相对正式地考核自己一下,你对得起这个月的工资吗? 3、对你的同事考核一次 你的同事表现怎么样?哪些人值得学习,哪些人需要帮助? 3、制定下月的计划,确定下月的工作重点 4、总结自己工作质量改进状况 自己的质量提高了多少? 5、有针对性地对一项工作指标做深入地分析并得出改进的方案 可以是对自己的,也可以是对公司的,一定要深入地分析后拿出自己的观点来。要想在老板面前说得上话,做的成事,工作上功夫要做足。 6、与老板沟通一次 最好是面对面地沟通,好好表现一下自己,虚心听取老板的意见,更重要的是要了解老板当前关心的重点 程序员每年该做的事 1、年终总结 每个公司都会做的事情,但你真正认真地总结过自己吗? 2、兑现给自己、给家人的承诺 给老婆、儿子的新年礼物买了没有?给自己的呢? 3、下年度工作规划 好好想想自己明年的发展目标,争取升职/加薪、跳槽还是自己出来干? 4、掌握一项新技术 至少是一项,作为程序员一年要是一项新技术都学不到手,那就一定会被淘汰。 掌握可不是看本书就行的,要真正懂得应用,最好你能够写一篇教程发表到你的blog 5、推出一种新产品 可以是一个真正的产品,也可以只是一个类库,只要是你创造的东西就行,让别人使用它,也为世界作点贡献。当然如果真的很有价值,收点注册费也是应该的 6、与父母团聚一次 常回家看看,常回家看看 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|