2008年2月29日
读书笔记 之 软件生产中的约束理论
写在前面:个人觉得作为一个项目经理 或者说 开发经理,其管理能力+技术能力二者相应达到一个合理的比例才能胜任。很多企业经常提拔在企业工作时间比较长的,技术能力强的人来担当这样的角色。个人认为老员工的确更加理解公司的企业文化,技术能力也相应比较突出,经验也更加丰富,但是我觉得这个经验和管理是不同的,更多的是其架构能力,遇到技术问题的解决方法。如果一个人长期关注于技术的积累,但是忽略管理能力的提高,很难成为一个合格的管理者。管理和技术一样是需要学习的,不是随着技术经验的积累成完全正比。衡量管理者的标准就是项目或者产品赚了多少钱,其他的例如人员沟通、开发等等都是保证成功的手段而已,而如何合理运用这些手段的过程就体现了一个管理者的综合能力。昨天刚好看电视,听到孙子兵法的一些思想,觉得很好。为将也,需具备"智、信、仁、勇、严"。之所以写在开头前,一是有感而发,二是这章的后面是各个经理的角色定位。
所谓约束 指的是 软件开发中的 受限资源、瓶颈。
约束理论包含5个过程域:
- 标识系统约束:顾名思义改进的基础就是充分认识现有系统的瓶颈。
- 确定如何利用系统约束
- 一切问题都要依照既定的方案执行
- 提高约束:如果第三点是执行的话,第四点就是改进了
- 如果在1-4中产生了新的约束,则循环往复直到问题解决。 可以理解问题总在不断变化的,当初的约束会随着时间慢慢解决,但是又会产生新的约束。
第二个过程域:在软件开发中一种明显的能力受限资源也就是约束 为 如何利用软件开发人员
开发人员每天法定得到8小时的工资,但是根据某项统计这段时间中会有15%的损耗,正常的效率时间是5.5小时左右,这是管理人员最不愿意听到的:)。--个人比较同意这个看法,很多管理人员认为8小时就得产生100%的效率,我想说不可能,除非在工作压力非常之大,许多公司为什么会加班,其实也可以理解为在8小时之外,来弥补这15%左右的损耗,不是吗?
我们需要做的就是来提高8小时内的效率,尽量使损耗降到最小,从而达到双赢。书中提到:任何时候都积压一些需要完成的开发任务可以避免开发人员无事可做。恩,可以理解,人的思维总是有时会开小差,或者会有些灵感的火花,如果没有足够多的任务积压时,小差开到的目的地就是八卦了。
文中提到的其他方式有:
- 最小化通信联络的沟通方式。
- 安静的工作环境
- 最好的开发工具
- 提供支持人员完成非生产工作等
- 充分的培训
- ……..
软件开发中的其他约束:功能集、进度、预算、资源。
产品功能:在开发过程中,在各种约束面前,可能产品需要的功能很多,那么需要做的就是分清几种需求吧:必须具有的功能、有则更好的功能、不会对签单造成影响的功能、时间要求非常紧迫的功能等。很明显分清这么几种功能,并加以和客户的协商沟通从而达到最佳的目的。使产品的成功对此约束的影响降到最低。这里还有一种需求可能是这样的,我个人把他称之为瞬时需求。假设某个需求市场需求特别急迫,如果满足这个需求那么对于产品市场、公司形象等都是一个促进,那么这种需求做不做呢?那么多银行推出各种各样的奥运VISA卡、某电视剧一经推出市场立马出现相关产品等,当然这种需求需要对市场的准确把握和对各种约束的协调等。
再说进度:文中给出了一个例子假设一个最有可能12天完成的任务,新手的估计可能是5天,有人估计可能是30天,对完成任务有80%把握的开发人员,可能是20天。其实这种估计误差的存在是合理的。但是错误的估计导致的后果可能是项目的取消或者项目的冒进。看完这里我想到一个估计的方法:估计人员的经验系数×估计人员认为的难度系数×估计时间。可以用多人来估计,恩,最简单的就是任务承担人和管理者2者估计的结合了。
除了上面的三种约束,其他2种,相对影响我觉得应该比较小一点。
第三个过程域:服从于约束使用
一切都要服从于保护和利用约束决策。
第四过程域:提升约束
在制造业中通常会引入添加机器等手段,在软件开发中提升约束通常通过无报酬的加班,聘用更多的开发人员或者倒班制。这些其实很多软件工程书籍都提到不是很好的办法,当然也是被实践所证明了的。文中提出了一个比较有效的办法是使用更好的开发人员。我觉得还有其它几个方面:充分激发现有人员的最大激情、流程合理、计划合理等等。
最后:焦点
一切问题的核心在于 投资回报率。这个公式很简单(产出-运营支出)/投入。如果投入增加,消除了这些约束那么产出自然增加,最后的公式是 投入回报=(原有产出+增加的产出)-投入/(原有投入+增加的投入)。
总结:系统的总体生产应该根据瓶颈能力进行平衡。应该保护和利用瓶颈,以最大限度地提高瓶颈的产出。
后记:此乃毫无管理经验之人,在看书时的感想,如果言之不当请批评指正。其实每个人都有自己的成功方式、管理方式、看待问题的方式,所以很多时候大家都是对的。
2008年2月20日
代码写多了啥问题都能遇到:)
保存为中文文件名时发生了乱码.
ofstream of(szFilename);
of<<szStr;
of.close();
解决方法
1、使用C语言的函数设置为中文运行环境
setlocale(LC_ALL,"");
2、使用STL函数设置为系统语言环境
std::locale::global(std::locale(""));
网上看到这个不错
C++ 库汇总(网址+简介)
作者: 来源: 发表时间:2007-07-31
浏览次数:
3333
字号:大 中 小
基础类
1、 Dinkumware C++ Library
参考站点:http://www.dinkumware.com
P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr.
Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其C/C+
+的产品中采用Dinkumware的库。
2、 RogueWave Standard C++ Library
参考站点:http://www.roguewave.com
这个库在Borland C++ Builder的早期版本中曾经被采用,后来被其他的库给替换了。笔者不推荐使用。
3、SGI STL
参考站点:http://www.roguewave.com
SGI公司的C++标准模版库。
4、STLport
参考站点:http://www.stlport.org
SGI STL库的跨平台可移植版本。
5、准标准库——Boost
Boost 库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。
Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。
Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的"准"标准库。
Boost中比较有名气的有这么几个库:
Regex
正则表达式库
Spirit
LL parser framework,用C++代码直接表达EBNF
Graph
图组件和算法
Lambda
在调用的地方定义短小匿名的函数对象,很实用的functional功能
Concept check
检查泛型编程中的concept
MPL
用模板实现的元编程框架
Thread
可移植的C++多线程库
Python
把C++类和函数映射到Python之中
Pool
内存池管理
Smart_ptr
5个智能指针,学习智能指针必读,一份不错的参考是来自CUJ的文章:
Smart Pointers in Boost,哦,这篇文章可以查到,CUJ是提供在线浏览的。中文版见笔者在《Dr. Dobb's Journal软件研发杂志》第7辑上的译文。
Boost
总体来说是实用价值很高,质量很高的库。并且由于其对跨平台的强调,对标准C++的强调,是编写平台无关,现代C++的开发者必备的工具。但是Boost
中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。并且很多Boost中的库功能堪称对语言功能的扩展,其构造用尽精巧的手法,不要贸然的花费时
间研读。Boost另外一面,比如Graph这样的库则是具有工业强度,结构良好,非常值得研读的精品代码,并且也可以放心的在产品代码中多多利用。
参考站点:http://www.boost.org(国内镜像:http://www.c-view.org/tech/lib/boost/index.htm)
GUI
在众多C++的库中,GUI部分的库算是比较繁荣,也比较引人注目的。在实际开发中,GUI库的选择也是非常重要的一件事情,下面我们综述一下可选择的GUI库,各自的特点以及相关工具的支持。
1) mfc
大 名鼎鼎的微软基础类库(Microsoft Foundation
Class)。大凡学过VC++的人都应该知道这个库。虽然从技术角度讲,MFC是不大漂亮的,但是它构建于Windows API
之上,能够使程序员的工作更容易,编程效率高,减少了大量在建立 Windows 程序时必须编写的代码,同时它还提供了所有一般 C++
编程的优点,例如继承和封装。MFC 编写的程序在各个版本的Windows操作系统上是可移植的,例如,在 Windows
3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。但是在最近发展以及官方支持上日渐势微。
2) QT
参考网站:http://www.trolltech.com
Qt
是Trolltech公司的一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面
向对象的很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是
流行的Linux桌面环境KDE 的基础,同时它还支持Windows、Macintosh、Unix/X11等多种平台。
3) WxWindows
参考网站:http://www.wxwindows.org
跨
平台的GUI库。因为其类层次极像MFC,所以有文章介绍从MFC到WxWindows的代码移植以实现跨平台的功能。通过多年的开发也是一个日趋完善的
GUI库,支持同样不弱于前面两个库。并且是完全开放源代码的。新近的C++ Builder X的GUI设计器就是基于这个库的。
4) Fox
开放源代码的GUI库。作者从自己亲身的开发经验中得出了一个理想的GUI库应该是什么样子的感受出发,从而开始了对这个库的开发。有兴趣的可以尝试一下。
参考网站:http://www.fox-toolkit.org/
5) WTL
基于ATL的一个库。因为使用了大量ATL的轻量级手法,模板等技术,在代码尺寸,以及速度优化方面做得非常到位。主要面向的使用群体是开发COM轻量级供网络下载的可视化控件的开发者。
6) GTK
参考网站:http://gtkmm.sourceforge.net/
GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnome这样的杀手应用。而GTK就是这个库的C++封装版本。
网络通信
1) ACE
参考网站:http://www.cs.wustl.edu/~schmidt/ACE.html
C+ +库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication
Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++
包装外观(Wrapper
Facade)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内
存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。
2) StreamModule
参考网站:http://www.omnifarious.org/StrMod/
设计用于简化编写分布式程序的库。尝试着使得编写处理异步行为的程序更容易,而不是用同步的外壳包起异步的本质。
3) SimpleSocket
参考网站:http://home.hetnet.nl/~lcbokkers/simsock.htm
这个类库让编写基于socket的客户/服务器程序更加容易。
4) A Stream Socket API for C++
参考网站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html
又一个对Socket的封装库。
XML
1) Xerces
参考网站:http://xml.apache.org/xerces-c/
Xerces-C++ 是一个非常健壮的XML解析器,它提供了验证,以及SAX和DOM API。XML验证在文档类型定义(Document
Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XML Schema 的基本完整的开放标准。
2) XMLBooster
参考网站:http://www.xmlbooster.com/
这个库通过产生特制的parser的办法极大的提高了XML解析的速度,并且能够产生相应的GUI程序来修改这个parser。在DOM和SAX两大主流XML解析办法之外提供了另外一个可行的解决方案。
3) Pull Parser
参考网站:http://www.extreme.indiana.edu/xgws/xsoap/xpp/
这个库采用pull方法的parser。在每个SAX的parser底层都有一个pull的parser,这个xpp把这层暴露出来直接给大家使用。在要充分考虑速度的时候值得尝试。
4) Xalan
参考网站:http://xml.apache.org/xalan-c/
Xalan是一个用于把XML文档转换为HTML,纯文本或者其他XML类型文档的XSLT处理器。
5) CMarkup
参考网站:http://www.firstobject.com/xml.htm'>http://www.firstobject.com/xml.htm
这是一种使用EDOM的XML解析器。在很多思路上面非常灵活实用。值得大家在DOM和SAX之外寻求一点灵感。
6) libxml++
http://libxmlplusplus.sourceforge.net/
libxml++是对著名的libxml XML解析器的C++封装版本
科学计算
1) Blitz++
参考网站:http://www.oonumerics.org/blitz/
Blitz++ 是一个高效率的数值计算函数库,它的设计目的是希望建立一套既具像C++
一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序,比
Fortran慢20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++的template技术,程序执行甚至可以比Fortran更快。
Blitz++目前仍在发展中,对于常见的SVD,FFTs,QMRES等常见的线性代数方法并不提供,不过使用者可以很容易地利用Blitz++所提供
的函数来构建。
2) POOMA
参考网站:http://www.codesourcery.com/pooma/pooma
POOMA是一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程序开发,对并行机器进行了优化以达到最高的效率,方便在工业和研究环境中使用。
3) MTL
参考网站:http://www.osl.iu.edu/research/mtl/
Matrix Template Library(MTL)是一个高性能的泛型组件库,提供了各种格式矩阵的大量线性代数方面的功能。在某些应用使用高性能编译器的情况下,比如Intel的编译器,从产生的汇编代码可以看出其与手写几乎没有两样的效能。
4) CGAL
参考网站:www.cgal.org
Computational Geometry Algorithms Library的目的是把在计算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。
游戏开发
1) Audio/Video 3D C++ Programming Library
参考网站:http://www.galacticasoftware.com/products/av/
AV3D是一个跨平台,高性能的C++库。主要的特性是提供3D图形,声效支持(SB,以及S3M),控制接口(键盘,鼠标和遥感),XMS。
2) KlayGE
参考网站:http://home.g365.net/enginedev/
国内游戏开发高手自己用C++开发的游戏引擎。KlayGE是一个开放源代码、跨平台的游戏引擎,并使用Python作脚本语言。KlayGE在LGPL协议下发行。感谢龚敏敏先生为中国游戏开发事业所做出的贡献。
3) OGRE
参考网站:http://www.ogre3d.org
OGRE
(面向对象的图形渲染引擎)是用C++开发的,使用灵活的面向对象3D引擎。它的目的是让开发者能更方便和直接地开发基于3D硬件设备的应用程序或游戏。
引擎中的类库对更底层的系统库(如:Direct3D和OpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其它类。
线程
1) C++ Threads
参考网站:http://threads.sourceforge.net/
这个库的目标是给程序员提供易于使用的类,这些类被继承以提供在Linux环境中很难看到的大量的线程方面的功能。
2) ZThreads
参考网站:http://zthread.sourceforge.net/
一个先进的面向对象,跨平台的C++线程和同步库。
序列化
1) s11n
参考网站:http://s11n.net/
一个基于STL的C++库,用于序列化POD,STL容器以及用户定义的类型。
2) Simple XML Persistence Library
参考网站:http://sxp.sourceforge.net/
这是一个把对象序列化为XML的轻量级的C++库。
字符串
1) C++ Str Library
参考网站:http://www.utilitycode.com/str/
操作字符串和字符的库,支持Windows和支持gcc的多种平台。提供高度优化的代码,并且支持多线程环境和Unicode,同时还有正则表达式的支持。
2) Common Text Transformation Library
参考网站:http://cttl.sourceforge.net/
这是一个解析和修改STL字符串的库。CTTL substring类可以用来比较,插入,替换以及用EBNF的语法进行解析。
3) GRETA
参考网站:http://research.microsoft.com/projects/greta/
这是由微软研究院的研究人员开发的处理正则表达式的库。在小型匹配的情况下有非常优秀的表现。
综合
1) P::Classes
参考网站:http://pclasses.com/
一个高度可移植的C++应用程序框架。当前关注类型和线程安全的signal/slot机制,i/o系统包括基于插件的网络协议透明的i/o架构,基于插件的应用程序消息日志框架,访问sql数据库的类等等。
2) ACDK - Artefaktur Component Development Kit
参考网站:http://acdk.sourceforge.net/
这是一个平台无关的C++组件框架,类似于Java或者.NET中的框架(反射机制,线程,Unicode,废料收集,I/O,网络,实用工具,XML,等等),以及对Java, Perl, Python, TCL, Lisp, COM 和 CORBA的集成。
3) dlib C++ library
参考网站:http://www.cis.ohio-state.edu/~kingd/dlib/
各种各样的类的一个综合。大整数,Socket,线程,GUI,容器类,以及浏览目录的API等等。
4) Chilkat C++ Libraries
参考网站:http://www.c'>http://www.c'>http://www.c'>http://www.chilkatsoft.com/cpp_libraries.asp
这是提供zip,e-mail,编码,S/MIME,XML等方面的库。
5) C++ Portable Types Library (PTypes)
参考网站:http://www.melikyan.com/ptypes/'>http://www.melikyan.com/ptypes/
这是STL的比较简单的替代品,以及可移植的多线程和网络库。
6) LFC
参考网站:http://lfc.sourceforge.net/
哦,这又是一个尝试提供一切的C++库
其他库
1) Loki
参考网站:http://www.moderncppdesign.com/
哦,你可能抱怨我早该和Boost一起介绍它,一个实验性质的库。作者在loki中把C++模板的功能发挥到了极致。并且尝试把类似设计模式这样思想层面的东西通过库来提供。同时还提供了智能指针这样比较实用的功能。
2) ATL
ATL(Active Template Library)是一组小巧、高效、灵活的类,这些类为创建可互操作的COM组件提供了基本的设施。
3) FC++: The Functional C++ Library
这
个库提供了一些函数式语言中才有的要素。属于用库来扩充语言的一个代表作。如果想要在OOP之外寻找另一分的乐趣,可以去看看函数式程序设计的世界。大师
Peter Norvig在 "Teach Yourself Programming in Ten
Years"一文中就将函数式语言列为至少应当学习的6类编程语言之一。
4) FACT!
参考网站:http://www.kfa-juelich.de/zam/FACT/start/index.html
另外一个实现函数式语言特性的库
5) Crypto++
提供处理密码,消息验证,单向hash,公匙加密系统等功能的免费库。
还有很多非常激动人心或者是极其实用的C++库,限于我们的水平以及文章的篇幅不能包括进来。在对于这些已经包含近来的库的介绍中,由于并不是每一个我们都使用过,所以难免有偏颇之处,请读者见谅。
6) Managed C++ wrapper for ZLib
压缩组件Zlib的C++类库
7) CppSQLite - C++ Wrapper for SQLite
SQLite C++封装库
8)CxImage
图像格式转换
资源网站
正
如我们可以通过计算机历史上的重要人物了解计算机史的发展,C++相关人物的网站也可以使我们得到最有价值的参考与借鉴,下面的人物我们认为没有介绍的必
要,只因下面的人物在C++领域的地位众所周知,我们只将相关的资源进行罗列以供读者学习,他们有的工作于贝尔实验室,有的工作于知名编译器厂商,有的在
不断推进语言的标准化,有的为读者撰写了多部千古奇作......
Bjarne Stroustrup http://www.research.att.com/~bs/
Stanley B. Lippman http: //blogs.msdn.com/slippman/(中文版http://www.zengyihome.net/slippman/index.htm)
Scott Meyers http://www.aristeia.com/
David Musser http://www.cs.rpi.edu/~musser/
Bruce Eckel http://www.bruceeckel.com
Nicolai M. Josuttis http://www.josuttis.com/
Herb Sutter http://www.gotw.ca/
Andrei Alexandrescu
http://www.moderncppdesign.com/
搞了半天,网上搜了不少帖子,说用SetWindowPos(&CWnd::wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW|);
这个方法可以实现,我从sourceforge上下了个源码,也有的确用这种方法实现的。但是我的不知道为什么就是不行,郁闷死了
最后稍作改变搞定了,晕死。
::SetWindowPos(this->m_hWnd, HWND_TOPMOST, 0,0,100,100,SWP_NOMOVE|SWP_NOSIZE);
这是然,所以然不知道。
WINAPI和CALLBACK这两个宏 WINAPI和CALLBACK这两个宏有什么区别呢?
_stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢?
首先看MSDN里给出的解释,不过有些语焉不详哦
WINAPI
·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported API entry points, you can use this for your own APIs.
CALLBACK
·Use in place of FAR PASCAL in application callback routines such as window procedures and dialog procedures.
再看看到底这两个宏的内容是什么吧
VC:WINDEF.h
#define CALLBACK PASCAL //=_pascal,VC已经不支持直接使用_pascal了
#define WINAPI CDECL //=_cdecl
BCB:windef.h
#define CALLBACK __stdcall
#define WINAPI __stdcall
引出了cdecl stdcall等一些可能很少见的关键字
那么cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?
非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是
压入堆栈的内容由谁来清除,调用者还是函数自己?
这些开关用来告诉编译器产生什么样的汇编代码。
下面把区别列表如下:
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No
简单说明:
__cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参
数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的
函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。
__stdcall调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函
数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参
数的堆栈。__stdcall可以写成_stdcall。
__fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节
(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可
以写成_fastcall。
·特别说明
1. 在默认情况下,采用__cdecl方式,因此可以省略.
2. WINAPI一般用于修饰动态链接库中导出函数
3. CALLBACK仅用于修饰回调函数
4. 你可能已经发现,VC下和BCB下对WINAPI的定义不同,那么你至少理解了
为什么不能直接从BCB下调用VC的dll的一个原因了。
2008年2月2日
微软老员工分享面试经历
关键词:
微软 老员工 分享 面试经历
对于微软亚洲研究院九年的建院历史而言,工作十年以上的员工并不多,邹
欣便是这为数不多中的一员。他在美国获得计算机硕士学位后便与微软结缘,先后在微软总部参与开发了Outlook, Visual Studio
2005等软件项目,2005年回国加入微软亚洲研究院创新工程中心,担任开发经理。时隔十余年之久,邹欣回忆起了他当年的微软面试故事。
作者: 邹欣
大约是1996年春天,我在韦恩州立大学(Wayne State
University)正忙着写硕士论文。一天,收到了一封电子邮件,来自Richard Brodie,我依稀还记得上面写着:"I'm the
creator of Word. I found your resume… are you interested in a contract
position at Microsoft?"他叫我写了一个程序
(好像是二叉树排序),我写好之后email给他。几天之后,他又安排了微软的一个电话面试,主要询问了一些关于项目、程序设计语言方面的知识。不久,他
说还得去面试,就把去微软公司总部Seattle的来回机票寄给我了。在这之前,我已经得到了几家软件公司的Offer。因为以前有过在一个大型公司工作
的经历,我对大公司的兴趣倒不是特别大,但是又一想,免费的机票、还有Microsoft 的名声,抱着去看看的心理就上路了。
那天清早,从Detroit 经Pittsburg 到了Seattle,由于时差的关系,到达时还是早上。Richard
接了我,从机场到微软的路上,他和我聊了我在国内做过的项目。听说我们在目标码上汉化了SCO
Unix,他吃了一惊,拍拍我的肩膀说,那你做这个工作是没问题的了。
我进了微软17楼的门厅,觉得气派不小,一个叫Gary 的人把我领到他的办公室,屋里堆满了各种各样的玩具,一个大盒子上好像还有日语写的“棋盘”二字。寒暄之后,就直奔主题。
他问道:“在一个含有DBCS的字符串中,如何从当前的位置向字符串头退一个完整的字符?”
你们看到这个地方可千万别笑,当时的不少文字编辑器不能处理这些问题,编辑的光标时不时会跑到一个汉字的中间去。我在黑板上边写算法,他在旁边提问。这
个问题的关键是了解DBCS (Double Byte Character Set) 中 leading byte 和 trailing
byte 的区别,然后向字符串开始处搜索,写完大概的算法后,又讨论了优化的问题。写完之后,他好像挺满意。
(现在想不起来午饭是如何解决的了,一般情况下吃午饭时也要安排面试,问一些和技术有关的问题)
第二个见面的叫Daniel,看样子像中国人,他叫我做了几个指针的程序,大概是把单链表倒过来之类的。然后要我分析各种算法的优劣。这一关很顺利就过了。
第三个见面的叫Matt,他跟我谈了他们正在做一个叫outlook 的email
和个人信息管理程序,远东版(中日韩语言)进度很慢,需要做不少处理双字节的工作,以及各种和中日韩环境有关的问题。我问他:“你们为啥不用
Unicode, 我觉得Unicode 一出,就再也不用DBCS了。”他有点尴尬地说,我们的程序是建立在一个叫MAPI
的平台上的,它还不支持 Unicode。正说着,门外一阵骚动,有人推门进来说:“哥们,快去……”。征得我的同意之后,Matt
带着我来到一个大厅,一帮人围着看一个人在被剃光头,有人还在起哄。被剃者面带微笑,岿然不动。他叫Mike,是Outlook
的开发经理(development manager)。据说他和大家打赌,如果在某月某日之前整个团队的bug
数量减少到一定数目,他就以光头回报。
看完剃头事件,我从冰箱拿了一听
Mountain Dew,和 Matt 回到他的办公室,继续面试。Matt 叫我实现标准函数 itoa()
功能,就是把数字转换成为字符串输出。或许是累了,或许是Mountain
Dew里的咖啡因起了作用,我觉得用简单的循环方法太平常了,就思考着是否可以用数学库函数来做。他说,这是我第一次看到这样的解法,你为啥不用简单的方
法?你知道数学库函数有多慢么?其实,我当时的幼稚想法是想通过这种解法向面试官证明自己懂得并不少。
下午,Richard 送我到机场附近的旅馆,路上他问,要不要在西雅图一带兜兜风?我说,我觉得我肯定会来这里上班的,以后有的是机会,这次就不用了:)。吃晚饭时,我还买了一份报纸,拿了几份房地产的广告,和中西部的价格比较了一下:)。
回到底特律一两天后,Richard 来email
说,前两个面试都挺好,好象第三个面试官有些看法……又过了几天,他说,你可以来上班了。于是,我就推掉了其它公司的offer,来到了微软公司所在的雷
德蒙,成为了Richard Brodie 公司的职员,在微软里开始为远东版的Outlook进行开发。 我那时的email
地址前有一个“v-”,表示vendor。
当时我面试的公司中,我记得只有微软是要
求我当场写程序,其他公司有一个是问了一些简单的问题后,就说,好吧,我们马上发传真Offer,你下个星期就过来吧。我说,这么快?于是要求和公司再了
解一下,于是他们找了一个中国员工来和我谈,后来得知他们是给别的公司做外包,业务特别多,急着要人。
我现在还记得曾经有个公司问我“你如何定义成功?”,这个问题真是难以回答,我真想亲自问一下提问人的标准答案是什么。还有一个公司还叫我做了两个小时
的心理测试问卷,其中问到:“古今中外,你崇拜的人是谁,为什么?”我心想如果写中国的古代高士,那太难解释清楚了,于是我转而描述了某位美国开国元勋,
而且尽量小心不要把他的事迹和其他开国元勋的事迹混淆起来。大概他们分析出来我的心理还算主流,不久之后我也得到了这家公司的邀请。
当时一个芝加哥的公司听说我不想接受他们的offer,问我为啥?我说西雅图气候宜人,而芝加哥太冷了,他们就说,这样,你的薪水上还可以再加上几千
元,这样芝加哥的冬天就比西雅图还好过了,如何?我想了想,还是直奔西雅图而去。现在回想这些面试过程中的趣事,还真是挺有意思的。
在微软上班一年后,我成为了微软正式职工,没有经过面试。当时outlook
的总经理叫Brian,他经常采取一些非常规的办法劝说在那里实习的学生直接成为正式职工,好像Daniel
就是退学后直接转正的。我问我的老板,不是说成为正式职工要5
个人面试么?他说,别浪费时间了,你的工作就是最好的面试。我想与即将经历面试的毕业生朋友们一起共勉。
Powered by ScribeFire.
2008年1月29日
今天用map时,想输出map中的内容到文件中,但是map的key我用的是字符串,这样做遍历输出来的就是按照字母排序的,但我要按照id大小排序,查了一下,网上有人说map默认就是排序好的,只能用key排序。看来除非换成vector等其他方式了,考虑到扩展性重新同时生成了一个id为key的map。
我想map还是应该有办法解决的,请高手指点!备案保存。
2008年1月28日
嘿嘿,本来是被MM拽上去逛学校,哈哈。结果在康博思腐败了顿后,转悠到未名湖,发现湖面上厚厚的冰,很多人在上面溜冰、玩冰车。本来没打算划的,因为就是大学本科的时候在陕西滑过几次,并且还不是特别会。真正的冰上更是没感受过,虽然每年我们宿舍后面的荷塘也结上一层厚厚的冰,但没敢上去过。在老婆的忽悠下,被她连哄带骗花了10元租了双冰鞋。开始她还说和我换着玩的,后来才发现那是骗人的。
在lp的搀扶下,走了几步,基本能站住了。最后慢慢的终于能滑上小段了,嘿嘿。不过期间也摔了几次,第一次和一mm撞上了,然后都是别人倒在我的面前之后,嘿,不会刹车啊,只有同归于尽了:),关键是像我这种不会的太多了,不是别人撞我了就是我撞别人了,绕冰场转了2圈,终于可以一只脚蹬了,估计mm被冻得不行了,我还没玩够呢,她就要走了,呵呵。那就打到回府吧。最后又溜了2圈,终于可以换脚了,下次一定要学会刹车,呵呵。不过不知道什么时候再能去玩,pku和thu离家有点远,郁闷。
其实最后挺不好意思的,本来说陪lp逛街的,结果变成mm陪我溜冰了。来张亮照。
发信人: kuji (无心·等我回来), 信区: TrafficInfo
标 题: 真惨 无奈的16小时-记江西连环相撞事故zz(提醒开车回家的朋友) (转载)
发信站: 水木社区 (Sun Jan 27 23:40:57 2008), 站内
【 以下文字转载自 AutoWorld 讨论区 】
发信人: prog2000 (世间有真情), 信区: AutoWorld
标 题: 真惨 无奈的16小时-记江西连环相撞事故zz
发信站: 水木社区 (Sun Jan 27 21:34:01 2008), 站内
http://www.xcar.com.cn/bbs/viewthread.php?tid=6945954&extra=&showthread=&page=1
贴个文字版
无奈的16小时-记江西连环相撞事故
这一天,让我感受到了人的生命是如此的脆弱。
时间:2008年1月25日
地点:南昌西二环9KM
事件:桥面结冰引致连环相撞
早上7点30,韶山某酒店停车场,我一出酒店就差点滑的飞了出去,楼梯上,地面上全是冰,平均两厘米厚度 。看着我的车,基本上被镀上了一层冰甲,我花了17分钟才把玻璃上的冰给铲除掉。
昨天因为在韶山冲结冰路面上掉头,车失去控制撞了防护栏,所以在韶山耽误了两天,等保险给我出查
勘单。我为什么跑去韶山冲,因为京珠北封路,一直不开放,我就顺便去瞻仰一下毛主席,可能我穿了一身美帝的军衣军裤还有鞋子,所以主席不高兴,惩罚我撞了护栏,这是我第一次领略冰路的麻烦。
韶山早上的路面全是薄冰,幸好路上没车,时速2-30公里开着,听湖南交通台,今天高速又封闭了,我准备开到长沙再说吧。一个小时后,我来到一个长陡坡前,上面三辆车都在刨着,不一会又滑了下来,
因为是个大坡,所以很多减速坎,车速度一慢下来就上不去了。我在后面看着,他们找来很多树枝,麻袋,一个小车上去了,另外一个也上去了,就剩下一个了,我就跟在后面冲。这车快到顶的时候突然歇菜了,我快到坡顶时,突然一老头从路边走了出来,吓得我一刹车,坏了,再也上不去了。于是两个车
拼命吼叫着,轮胎就像空转一样,没点反应,我车都快横过来了,路边的村民都出来看热闹。我冷静下来后,把车倒到坡下,然后往回平路开了100米左右,用2档起步,靠惯性冲了上去。这让我第二次领略到了冰路的麻烦。
我走国道到湘潭,然后到了长沙,107国道有个大坡结冰,几百车排队,大塞车,我后来跟着交警的车冲了出去,我是从坡上往下,所以没吃亏。到了长沙,差点哭了,所有的高速全封闭了,到处都是排队的大客车,所有酒店宾馆都住满了,因为湖南限制供电,很多人住酒店了。我该去哪啊,我从早上到中午才吃了两块巧克力,精力都快透支光了。
唯一的交通信息工具,收音机终于在中午传来一条消息:长永高速和机场高速开通
我打开地图,这条路可以从长沙到浏阳,然后到萍乡。萍乡有高速到南昌,南昌到九江,九江到黄石~~ 一下就有了精神,虽然是曲线,最终能到目的就行。而且听广播,26号将有冷空气下来,所以当前绕道江西应该是个好选择。
车一直到了浏阳,这是个很漂亮的小城市,路况非常好,让憋屈了几天的我开的飞快,下午3点当我看到湖南人民欢迎你再来的牌子时,进入江西了,我感觉到幸福的生活来临了。
进入萍乡,温度也高了点,路边虽然也有冰挂,但路面还比较干燥,当我来到高速入口前时,发现上百辆车在排队,入口全是红X,天哪!只能走国道了。
我走到了一条烂泥国道上,收音机那迷人的南昌普通话传来信息,江西境内高速全部开放,我终于从一个入口上了萍乡到南昌的高速。
时速一直保持在120左右,GPS显示到九江还剩下160多KM了,江西就是好啊,没有冰冻的感觉,只有潮湿 的小雨,我计划着9点左右在九江吃宵夜,休整一晚,明天就能到武汉了,哈哈~~
玻璃有些模糊,拨了拨雨刮,坏了?咋不喷水了,打开后面的雨刮,后面喷水,前面不喷,难道结冰了?想了想,不可能,湖南那末冷都没结。时速依然100以上飞驰。其实这个提示就是结冰了。
西二环,基本上没车,身边小车很多都是粤字头的,大家你追我逐,因为离终点不远了,当人最放松的时候,危险就悄悄降临了~~
我的车开始有点左右漂,我以为风吹的,继续保持110的时速,前面一个上坡,加了油门就冲了上去,当车头往下的一刹那,我看到一片闪烁的灯光~~~
刹车已经踩了下去,完全没作用,只能感受到ABS在跳动,第二脚,第三脚,强行将手自一体主动降档,最后一刻,我觉得两边都是车,前面一堵墙一样的物体在我面前,听天由命了,只感受到轮胎压过一堆碎石一样的东西后,最终我停了下来。我打了双闪,马上从车上跑了出来,我的天啊,我前面不知道多少部大货车撞到一起了 是一个厚达数十米的钢铁堡垒,如果我再前三四米,就钻货车的油箱了。
我右边6-7部大车挤着小车,我左边是撞烂的护栏和各种碎片。突然一个女的拉了我一把,叫道:快逃命啊!
我一看后面一个大巴左右摇摆冲了过来,轰隆撞到了应急带那排车上,后面还有灯光射来,我赶紧往中间的护栏跑。
我一抓护栏,全是冰,滑的要命,猛听到翻护栏人群中有男的喊救命,接着有女的吓的大哭,大叫护栏下面是空的。马上旁边又有人惊叫,又有人掉下去了,有个男的惊恐的发疯样的狂叫,接着远处又传来有人掉下去的喊叫。我赶忙跑回我车这边的护栏,一看下面是个河,原来这里是个桥,中间隔离带是空的,下面是河谷。
只能躲了,我看着一辆小车对着我的车飞来,天啊,我做了最坏的打算,它竟然停下了,离我只有不到一米,然后旁边又飞来一辆中山的小车,离我3米左右也停下了。这三辆就是这次连环相撞中仅有没有任何损失的三辆小车。车上的人也迅速跑了出来,因为后面来了个大家伙,我们听到急切的刹车声,那车扭动着,最后停下了,这是这次唯一一部没受损失的大货车。后面还有更多的灯光射了过来~~~~前面大概3-4部小车,后面最少三部大货车,这一下过来,我们中间的人紧张坏了,全得成肉饼了,我准备往旁边货车得车头爬了。
嘭,一小车碎片满天飞,转了360度,然后嘭嘭几声,又一小车被撞到了护栏上,小车都刹住了,但是后面得大车根本就刹不住。那辆最长得拖挂连撞几辆小车,整个车滑动过来,竟然横在了路中间。后面就啥也看不到了,只能看到射到天上得灯光在交互着,各种碰撞得声音和刹车的声音,接下来得声音震得 桥都在动,轰隆轰隆,灯光照射下见到碎片和烟尘满布空中。这种声音持续不断,我已经第二次打电话报警,对方说知道了,我说你妈听到没有,不停有车在撞上来,赶快封路!对方叫我打电话给高速公路管理局,我XXX!!!
5分钟过去了,动静小了很多,那辆横着的车阻挡了不知道多少部车的轰击,救了我们中间这一波。这时依然能听到远处传来撞击和刹车的声音,不过已经声音小了很多,很多司机钻了出来,我旁边那个江西司机很激动,他见人就说他刚才救了一个小孩,然后他翻到护栏外,用手抓住了才没掉下去,然后后面的货车把他的车屁股撞了.
我们看到他车后面,天啊,太惨了,一辆警车被压到了长度不到两米,被两个货车压着。那江西司机还是很激动,他说那警车停在他后面,他把那警察拉了出来,然后里面一车小孩和妇女,他随手抱了一个冲了出去,其他也跑了出去。还有一个被压在了里面,我们呼叫着,没人答应。
这时还有人翻越中间护栏,又有人叫救命,江西司机和几个北方司机跑去拉了一个女的上来,她的小孩还抱在中间护栏上在哭,那江西司机把小女孩一抱,小女孩一巴掌过去,喊着妈妈。这个妇女用手拉住中间的铁板才没掉下去,那末滑,她竟然坚持住了。
大家都开始了自救行动,各自对附近的车辆和人员进行检查,我和另外的司机跑到了前面,原来前面还有10来辆车挤到了一起,我看到一个液化气大卡就在我们前面这堵车墙的后面,10米不到,不过听说是空的。但是空气中弥漫着汽油柴油的味道。
大概40分钟后,一个打着手电的人从前面的废墟中翻了过来,地上很滑,基本上踉跄前进。大家告诉他有个孩子还在压扁的警车里面,他打了手电往里看,说要叫消防员来。他继续找寻其他伤亡者。
几个北方司机非常着急,讨论怎样把孩子弄出来,这时里面传来了哭声,声音很大,是一种求生的信号也是一种痛苦的哭声,但是没几分钟就没动静了。这是天下着冻雨,冷的让人无法忍受,大家各自躲回了车里。过一会又来了交警爬进去看,他出来说,孩子没了,我们大骂你们咋不早点来!他没说啥,只说了一句,我们的车到现在都开不上来。
一小时后,救护车消防车相继到来了,我们听到桥下有人喊,从护栏看下去,在下面车灯照射吓,竟然有10来米高,是干枯的河床,全是大石头,救护车停在旁边,几个人在搜寻。突然有人喊,这个还有气,他们找到一个男的,马上抬了上车。
消防队员来了,使用了很多工具,但是觉得救出来已经没意义了,叫了一个医生过来,医生说轮胎把整个人顶在墙上,肝脏估计破了。大家无语。
救护车救的最多的是几个大巴里的伤员,来来回回,而那些被夹住的车辆,无法确认里面还是否有人。横在我面前那个大车的河南司机跑了出来找我们问他副班司机的驾驶照是否真的,说副班司机是他刚雇的,他下来打电话给保险时,副班司机竟然拿了他的钱跑了,真不讲究。因为这里离出口不到1公里,所以很多人都陆续冲前方的护栏翻到对面,下去了。
夜逐渐深了,交警来的越来越多,安抚着大家,我们得知也只能明天清理现场了,因为重型车辆上不来。午夜,路政上来了,开始在路上撒盐。我在车里,想着刚才从我左边掉下去的那些人,还有救吗。我右边那个夹在车轮里的男孩说不定只是昏迷了,我一晚上老是想着他的哭声,那种绝望痛苦中最后爆发的哭声,是想告诉我们,他还想活下去,但我们无能为力~~
雨雪开始大了,不到半小时,车上就带冰挂了,今晚这些还没救出的伤员,这种天气下也会冻死的。
半夜两三点,突然一陈骚动,有人喊,听见桥下有小孩的哭声,各种手电灯光照射了下去,但是没有发现,因为部分地带是淤泥。
车里很冷,只能开发动机用暖气,我们几辆车还能发动,很多车都报废了,不知道他们是如何度过得。早上5点,轰隆隆得轰鸣惊醒了我,大型设备都上来了。
天刚蒙蒙亮,整个公路一片寂静,见到的都是残骸。随后吊车,拖车开始作业,到7点左右已经把第一波现场得车辆拖了一半出来,我看见一辆爱丽舍变成了一堆废铁。
液化气车竟然能发动,司机把车开到了路边。其余得货车用吊车一个个吊离前方。
这一晚上冻的够呛,也就睡了一个多小时,耳边老是想起那些男女哭喊的声音。
我打开车门,发现路上更滑了,虽然撒了盐,但是经过一晚上得霜冻变本加利。大家起来了,都在看清理现场,第一波,第二波的现场我们都能看到,第三波被横在路中间的那个货柜挡住了,看不到尾,不知道后面伤亡如何。
我走到那辆唯一没事的山东大货车前,那小伙刚好跳了下来,我说哥们你够幸运的啊,他叹了口气,说:过去了,别说了,要没后面那辆车横在那,大家全完。你的车咋样? 我笑着说:咱两今年运气都好!我们两个碰到了那个江西司机,还有副驾跑了那个河南司机,他们都说昨晚一闭上眼就是事故重现,越想越害怕。
"有开水吗,师傅,我孩子哭了一晚上,没吃没喝",我回头一望,一个农妇拿了一个破损的保温杯在问我,我说没有。我给你找去,问了几辆车都没有,我想起中间撞的那堆货车中地上有破碎的开水瓶,我去找了,也没幸存的开水。我回到我车边,开了车尾箱,吧我平时哄小妹妹的巧克力和牛肉干给了她,江西司机吧他唯一一包花生也给了她。她走的时候在前方捡了一打东西,后来我看到了,是尿不湿,pempers的,我这才注意到几十米范围散步了许多小孩的鞋 衣服 外套等。
天大亮了,不知道哪来了一些游民,不停从破损的车中和地上拿东西,被我们呵斥了住了一些。但是有部分穿救援服装的人员也在干这些事情,实在是无耻。
江西司机问吊车司机,这次算是江西最厉害的事故吧,他不屑说,这算啥大事故,130辆车的我都见过。
我开始找寻深圳的车辆,我能见到范围,一辆雅阁完全扁了,问旁边司机,说里面的人提前跑了,万幸
。
然后不远处一辆深圳的东南富利卡,撞的掉了个头,车辆前后都受损,听说人也提前下来了。我跑到
前面,发现一辆深圳迈腾车头撞毁,车主是去黄梅的,他说发动机还能打着,我看了一下只是水箱和风扇完了,A柱一点事都没。这车主昨晚还和我说他一小弟掉桥下了,也不知道咋样了。
前方的货车就快吊开了,交警也上来吧所有驾驶员的证件都收了,我们几辆没事的车希望离开,交警同志耐心和我们解释,现在到处封路,你哪都去不了,本次事故涉及人员伤亡,所以必须调查后才能放我们走。我们只能耐心等待。
跑了副驾那河南司机在外面冷的哆嗦,我把他叫到了车上来,他焦急的打着电话,给货主,老板,保险,还有认识那个副驾的所有人。车上运的是大葱,到北京,这样耽搁几天,怕坏了,而且叫来转货的货车还在福建根本就过不来。他只有不停骂那副驾发泄,从他眼中看出他多么无奈。
路对面多了一个很年轻女孩的尸体,大概20来岁,听说是从桥下找到的,多冤啊,逃生的时候从隔离护栏中间掉桥下了。
随后开始清理那压扁的警车,大车发动机还能动,刚一倒大家惊呼,停!人的衣服和轮胎可能冰到一块了,车轮把人带起来了。后面清理的时候我们几个不忍心看了。
随后,路边又多了这个男孩的尸体,手上还有厚厚的手套,估计就10来岁。不过人没压坏,就像睡着了一样。工作人员拿布把他脸蒙上了,安息吧。
大概11点,交警叫我过去写事故经过,我们三部没损失的小车大概描述了一下情况,这个年轻的交警人很好,他说叫警车过来把我们带出高速,并且准备从中间开个出口出来。到对面车道去。随后对面来了一个车队,警车带了两辆大客车上来疏导被困的旅客们,但是因为现场太长了,司机们还是走不了。
大概12点刚才和我们做记录的小伙子叫我们跟他的车出去,我的车经过那个江西司机时,他对我招手。我开了窗子,他说很羡慕我们能走了,他现在有点害怕,我说咋了?他说后面警车那小孩死了,不知道会不会找他麻烦。我下车安慰他,说是后面的车撞的和你无关,不要担心。他说那是个警察啊,他们如果要整我,我一个老百姓咋办啊。我这时只能说那句老土的话安慰他了:你要相信法律是公正的。随后我把我电话留给了他,如果有麻烦,我愿意为他作证。他说他放心了一点,我上车说的最后一句是: 兄弟你是个好人,你救了一个小孩一个妇女,你会有好报的!
我车开到开辟出来路中间的一个岔口,警车上的小伙跑了下来,问我,你车上还能带人吗,我们把剩下的人尽量往下带。我说,我就一个人,来吧。
警车带了几个旅客,我车上带了三个司机,这几个司机都是其他车委托他们下去买吃的,这天案发到现在已经16小时了,多少人到现在还是一口水一口干粮都没吃的。出口下去后是江西农业大学,我和那几个司机告别。
这个警车的小伙很负责,一直带了我们10来公里接近大道了,下车和我们告别,告诫我们小心,城区大桥也有冰,很感谢他,很棒的小伙子,从他身上看出了为人民服务的精神。
下午5点,昌樟高速基本可以通行,我在8点半来到了吉安,住到了酒店里,感受到了温暖,写下了这篇回忆。愿上帝保佑大家平安!
--
※ 修改:·kuji 于 Jan 27 23:41:28 修改本文·[FROM: 202.96.60.*]
※ 来源:·水木社区 newsmth.net·[FROM: 202.196.144.*]
2008年1月25日
昨晚听别的项目组同事联调我们这边的功能,发现发包间隔改为1分钟之后我们这边不发包了,当时就想事实既然存在那肯定有问题。这个处理流程是在界面上设置的时间-1分钟的间隔。这样我这边的任务调度间隔就变为0了,而在设计任务管理调度模块时,并没有遇到间隔为0的情况,当间隔为0时这个任务既没有调度也没有打印日志信息。从而导致不熟悉的同事调了半天发现有问题。一定要用边界值进行完整的测试,如果发生边界值问题,设计时要声明加到相关文档中去。