Sep 30, 2008

Job-Seeker Chapter 05 A Confession

近几日好不容易静下心来整理自己大学三年在编程方面所得
越整理越寒
原来自己差不多病入膏肓

真的是被某些开发平台给宠坏了,现在的我也许可以比较清楚的说出微软的VC封装的库函数
但我却把C的一些基本知识给忘得一干二净
不该,不该

只是重读了谭浩强先生所著的“C程序设计”,我就感到很寒了
原先的我居然是那样浮躁,而我却一点都未察觉
我真的准备好了吗,不尽然

于是赶紧把手边的一些关于ASP.NET和C#的书还给图书馆
从图书馆借来两本C的经典
Brian W.Kernighan & Dennis M. Ritchie所著的《The C Programming Language》
Stephen Prata 所著的《C Primer Plus》
希望我能尽早的挽回些什么

P.S 最近买了些计算机考研的复习材料
看着很有考研的感觉
我一定不能败给计算机专业的牛人们,哼哼

Sep 27, 2008

Job-Seeker Chapter04 The rain and terrible exam

最近成都咋回事,老落雨
最恐怖的一次是从早晨开始打雷下雨一直到中午
那闪电啊,乖乖,平均三秒钟一次,一共2048次(MP,是不是天上某仙写的打雷程序啊,2的11次方)
据说被雷劈死了不少人捏,还真是,被雷到了,哇喀喀喀
不少上班族冒死上班,某些人居然因为迟到被罚钱,哟
说实在的那天气上班不容易啊,已经早上八九点了还跟晚上似的,雨又大,同情一个
/*---------------------------------------------------
天气回顾播送完了,以下转入就业正题
----------------------------------------------------*/
刚开始几天真的昏了头了
投了网易的简历,看到技术部的软件工程师,想都没想就往里边投
结果,被BS了哇,人家收的是研究生,你个瓜的
还好班上的院士投了杭州研究员的DBA,收到笔试通知
我才知道有笔试,就去强笔了一次,哈哈

第二天就笔试,我是前天晚上才知道的,地点在清水河,早上九点
于是决定第二天早上早早起
于是第二天我真的早早起了,六点起
外边天还黑得不像话
冷的不行啊,下雨,风又大
撑着伞走在空荡的大街上
冷风一吹,街灯一照,雨一落
真有点慷慨就义的味道
没法子,找工作切
等车等了好久,在到清水河校区前身上还不怎么湿
一到清水河
我sun
北风那个吹啊,雨滴那个飘啊
完全不知道下一秒风雨从何处袭来
四处都是积水,于是很快中招了
在风雨中都了不到一分钟
牛仔裤都湿到底裤这了,鞋子像快沉的船一样吸饱了水,囧囧囧囧囧囧

我忍

在风雨中走在新校区,不小心就忘记走到哪了
这宿舍区建的啊,哎,宿舍又远
走到宿舍,我感觉自己已经不产热了
整一个water man
把院士叫起去BS

到了笔试的地点,门口把守着人,要检查身份证
原来上边有名单的
···差点吐血
就像长征到了终点时发现自己还在敌人的包围圈里一样···
难道最终还是逃不过···
还好,监考的也是毕业不久的学生GG
同意让我们考

考试时真不爽啊
鞋子,牛仔裤是湿的
太早起来没睡够头有点晕
做的感觉一般
中间还抽空发了几天短信给LP
哎,那感觉真是,该怎么说呢
穿的袜子原先吸饱了水粘在脚上还没什么感觉
可是坐了一会儿脚开始暖和了一点,袜子粘得没那么紧了
那种湿漉漉又有点滑的感觉,yi~~~真TM恶心
脚稍微用力踩一下就能感觉鞋底有水渗出来,yi~~~~~~
裤管周围有股湿湿的热气,yi~~~~~
这考试还真是,锻炼人的意志啊

shit

今天还在下雨,嗷~~~~~,下了这么多天了
该停了,因为雨又死了一批人
北川已经被泥石流淹没了··
够惨了
赶紧停吧···来个大晴天

【典藏】C++笔试经典 其二

勇敢的再刷一次自己的墙~~~~~~~



1. 以下三条输出语句分别输出什么?
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?
cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?
答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。

2. 以下代码中的两个sizeof用法有问题吗?
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
for( size_t i=0; iif( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;

答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。

3. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?
答:
a. class B : public A { ……} // B公有继承自A,可以是间接继承的
b. class B { operator A( ); } // B实现了隐式转化为A的转化
c. class A { A( const B& ); } // A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数
d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个

4. 以下代码有什么问题?
struct Test
{
Test( int ) {}
Test() {}
void fun() {}
};
void main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}

答:变量b定义出错。按默认构造函数定义对象,不需要加括号。

5. 以下代码有什么问题?
cout << (true?1:"1") << endl;
答:三元表达式“?:”问号后面的两个操作数必须为同一类型。

6. 以下代码能够编译通过吗,为什么?
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
答:str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。

7. 以下反向遍历array数组的方法有什么错误?
vector array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 3 );
for( vector::size_type i=array.size()-1; i>=0; --i ) // 反向遍历array数组
{
cout << array[i] << endl;
}

答:首先数组定义有误,应加上类型参数:vector array。其次vector::size_type被定义为unsigned int,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。

8. 以下代码中的输出语句输出0吗,为什么?
struct CLS
{
int m_i;
CLS( int i ) : m_i(i) {}
CLS()
{
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;

答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。

9. C++中的空类,默认产生哪些类成员函数?
答:
class Empty
{
public:
Empty(); // 缺省构造函数
Empty( const Empty& ); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=( const Empty& ); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符 const
};


10. 以下两条输出语句分别输出什么?
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?

答:分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。

Sep 25, 2008

【典藏】C++笔试题汇总 其一

额,猛的发现自己居然有传说中的刷墙嫌疑···还好刷的是自己的墙

1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?

virtual修饰符会被隐形继承的。private 也被集成,只事派生类没有访问权限而已。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。


--------------------------------------------------------------------------
2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)

#include
using namespace std;


void main()
{
char a[50];memset(a,0,sizeof(a));
int i=0,j;
char t;
cin.getline(a,50,'\n');
for(i=0,j=strlen(a)-1;i{
t=a[i];
a[i]=a[j];
a[j]=t;
}
cout<}

//第二种

string str;
cin>>str;
str.replace;
cout<

--------------------------------------------------------------------------
3.请简单描述Windows内存管理的方法。

内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~
我先说个大概,希望能够抛砖引玉吧

当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。

内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理

块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程 序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。

页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。

段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。

段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。

各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其实都很相似。

这只是一个大概而已,不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的讲解


--------------------------------------------------------------------------
4.
#include "stdafx.h"
#define SQR(X) X*X

int main(int argc, char* argv[])
{
int a = 10;
int k = 2;
int m = 1;

a /= SQR(k+m)/SQR(k+m);
printf("%d\n",a);

return 0;
}
这道题目的结果是什么啊?

define 只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的

a /= (k+m)*(k+m)/(k+m)*(k+m);
=>a /= (k+m)*1*(k+m);
=>a = a/9;
=>a = 1;

--------------------------------------------------------------------------
5.
const 符号常量;
(1)const char *p
(2)char const *p
(3)char * const p
说明上面三种描述的区别;


如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

(1)const char *p

一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是不能改变它指向非char对象,如:
const char *p;
char c1='a';
char c2='b';
p=&c1;//ok
p=&c2;//ok
*p=c1;//error

(2)char const *p
(3)char * const p

这两个好象是一样的,此时*p可以修改,而p不能修改。

(4)const char * const p
这种是地址及指向对象都不能修改。

--------------------------------------------------------------------------
6.下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?
int n;
if (n == 10) // 第一种判断方式
if (10 == n) // 第二种判断方式

如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=

--------------------------------------------------------------------------
7.下面的代码有什么问题?
void DoSomeThing(...)
{
char* p;
...
p = malloc(1024); // 分配1K的空间
if (NULL == p)
return;
...
p = realloc(p, 2048); // 空间不够,重新分配到2K
if (NULL == p)
return;
...
}

A:
p = malloc(1024); 应该写成: p = (char *) malloc(1024);
没有释放p的空间,造成内存泄漏。


--------------------------------------------------------------------------
8.下面的代码有什么问题?并请给出正确的写法。
void DoSomeThing(char* p)
{
char str[16];
int n;
assert(NULL != p);
sscanf(p, "%s%d", str, n);
if (0 == strcmp(str, "something"))
{
...
}
}

A:
sscanf(p, "%s%d", str, n); 这句该写成: sscanf(p, "%s%d", str, &n);

--------------------------------------------------------------------------
9.下面代码有什么错误?
Void test1()
{
char string[10];
char *str1="0123456789";
strcpy(string, str1);
}

数组越界

--------------------------------------------------------------------------
10.下面代码有什么问题?
Void test2()
{
char string[10], str1[10];
for(i=0; i<10;i++)
{
str1[i] ='a';
}
strcpy(string, str1);
}

数组越界

--------------------------------------------------------------------------
11.下面代码有什么问题?
Void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)
{
strcpy(string, str1);
}
}

==数组越界
==strcpy拷贝的结束标志是查找字符串中的\0 因此如果字符串中没有遇到\0的话 会一直复制,直到遇到\0,上面的123都因此产生越界的情况

建议使用 strncpy 和 memcpy

--------------------------------------------------------------------------
12.下面代码有什么问题?

#define MAX_SRM 256

DSN get_SRM_no()
{
static int SRM_no; //是不是这里没赋初值?
int I;
for(I=0;I{
SRM_no %= MAX_SRM;
if(MY_SRM.state==IDLE)
{
break;
}
}
if(I>=MAX_SRM)
return (NULL_SRM);
else
return SRM_no;
}

系统会初始化static int变量为0,但该值会一直保存,所谓的不可重入...

--------------------------------------------------------------------------
13.写出运行结果:
{// test1
char str[] = "world"; cout << sizeof(str) << ": ";
char *p = str; cout << sizeof(p) << ": ";
char i = 10; cout << sizeof(i) << ": ";
void *pp = malloc(10); cout << sizeof(p) << endl;
}

6:4:1:4

--------------------------------------------------------------------------
14.写出运行结果:
{// test2
union V {
struct X {
unsigned char s1:2;
unsigned char s2:3;
unsigned char s3:3;
} x;

unsigned char c;
} v;

v.c = 100;
printf("%d", v.x.s3);

}

3

--------------------------------------------------------------------------
15.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数

A1:
16位的系统下,
int i = 65536;
cout << i; // 输出0;
int i = 65535;
cout << i; // 输出-1;

32位的系统下,
int i = 65536;
cout << i; // 输出65536;
int i = 65535;
cout << i; // 输出65535;

A2:

int a = ~0;
if( a>65536 )
{
cout<<"32 bit"<}
else
{
cout<<"16 bit"<}


--------------------------------------------------------------------------
16.C和C++有什么不同?

从机制上:c是面向过程的(但c也可以编写面向对象的程序);c++是面向对象的,提供了类。但是,
c++编写面向对象的程序比c容易

从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式;c++适合更上层的,复杂的; llinux核心大部分是c写的,因为它是系统软件,效率要求极高。

从名称上也可以看出,c++比c多了+,说明c++是c的超集;那为什么不叫c+而叫c++呢,是因为c++比
c来说扩充的东西太多了,所以就在c后面放上两个+;于是就成了c++

C语言是结构化编程语言,C++是面向对象编程语言。
C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。

--------------------------------------------------------------------------
17.在不用第三方参数的情况下,交换两个参数的值
#include

void main()
{
int i=60;
int j=50;
i=i+j;
j=i-j;
i=i-j;
printf("i=%d\n",i);
printf("j=%d\n",j);
}

方法二:
i^=j;
j^=i;
i^=j;

方法三:
// 用加减实现,而且不会溢出
a = a+b-(b=a)

--------------------------------------------------------------------------
18.有关位域的面试题(为什么输出的是一个奇怪的字符)

a.t = 'b';效果相当于 a.t= 'b' & 0xf;

'b' --> 01100010
'b' & 0xf -->>00000010
所以输出Ascii码为2的特殊字符


char t:4;就是4bit的字符变量,同样
unsigned short i:8;就是8bit的无符号短整形变量

--------------------------------------------------------------------------
19.int i=10, j=10, k=3; k*=i+j; k最后的值是?

60

--------------------------------------------------------------------------
20.进程间通信的方式有?

进程间通信的方式有 共享内存, 管道 ,Socket ,消息队列 , DDE等

--------------------------------------------------------------------------
21.
struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}
sizeof(A)=?(不考虑边界对齐)

7

struct CELL // Declare CELL bit field
{
unsigned character : 8; // 00000000 ????????
unsigned foreground : 3; // 00000??? 00000000
unsigned intensity : 1; // 0000?000 00000000
unsigned background : 3; // 0???0000 00000000
unsigned blink : 1; // ?0000000 00000000
} screen[25][80]; // Array of bit fields
二、位结构
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
位结构定义的一般形式为:
struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;
其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct{
unsigned incon: 8; /*incon占用低字节的0~7共8位*/
unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1; /*blink占用高字节的第7位*/
}ch;
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor

注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字
节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;
上例的结构定义了关于一个工人的信息。其中有两个位结构成员, 每个位结
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。


--------------------------------------------------------------------------
22.下面的函数实现在一个固定的数上加上一个数,有什么错误,改正
int add_n(int n)
{
static int i=100;
i+=n;
return i;
}

答:
因为static使得i的值会保留上次的值。
去掉static就可了

--------------------------------------------------------------------------
23.下面的代码有什么问题?
class A
{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }

A* p;
};

答:
会引起无限递归

--------------------------------------------------------------------------
24.
union a {
int a_int1;
double a_double;
int a_int2;
};

typedef struct
{
a a1;
char y;
} b;

class c
{
double c_double;
b b1;
a a2;

};

输出cout<
答:
VC6环境下得出的结果是32

另:
我(sun)在VC6.0+win2k下做过试验:
short - 2
int-4
float-4
double-8
指针-4

sizeof(union),以结构里面size最大的为union的size

----------------------------------------------------------------------------------

25.i最后等于多少?
int i = 1;
int j = i++;
if((i>j++) && (i++ == j)) i+=j;

答:
i = 5

--------------------------------------------------------------------------
26.
unsigned short array[]={1,2,3,4,5,6,7};
int i = 3;
*(array + i) = ?

答:
4

--------------------------------------------------------------------------
27.
class A
{
virtual void func1();
void func2();
}
Class B: class A
{
void func1(){cout << "fun1 in class B" << endl;}
virtual void func2(){cout << "fun2 in class B" << endl;}
}
A, A中的func1和B中的func2都是虚函数.
B, A中的func1和B中的func2都不是虚函数.
C, A中的func2是虚函数.,B中的func1不是虚函数.
D, A中的func2不是虚函数,B中的func1是虚函数.

答:
A

--------------------------------------------------------------------------
28.
数据库:抽出部门,平均工资,要求按部门的字符串顺序排序,不能含有"human resource"部门,

employee结构如下:employee_id, employee_name, depart_id,depart_name,wage

答:
select depart_name, avg(wage)
from employee
where depart_name <> 'human resource'
group by depart_name
order by depart_name

--------------------------------------------------------------------------
29.
给定如下SQL数据库:Test(num INT(4)) 请用一条SQL语句返回num的最小值,但不许使用统计功能,如MIN,MAX等

答:
select top 1 num
from Test
order by num desc

--------------------------------------------------------------------------
30.
输出下面程序结果。

#include

class A
{
public:
virtual void print(void)
{
cout<<"A::print()"<}
};
class B:public A
{
public:
virtual void print(void)
{
cout<<"B::print()"<};
};
class C:public B
{
public:
virtual void print(void)
{
cout<<"C::print()"<}
};
void print(A a)
{
a.print();
}
void main(void)
{
A a, *pa,*pb,*pc;
B b;
C c;

pa=&a;
pb=&b;
pc=&c;

a.print();
b.print();
c.print();

pa->print();
pb->print();
pc->print();

print(a);
print(b);
print(c);
}

A:
A::print()
B::print()
C::print()
A::print()
B::print()
C::print()
A::print()
A::print()
A::print()

--------------------------------------------------------------------------
31.
试编写函数判断计算机的字节存储顺序是开序(little endian)还是降序(bigendian)

答:
bool IsBigendian()
{
unsigned short usData = 0x1122;
unsigned char *pucData = (unsigned char*)&usData;

return (*pucData == 0x22);
}

--------------------------------------------------------------------------
32.简述Critical Section和Mutex的不同点

答:
对几种同步对象的总结
1.Critical Section
A.速度快
B.不能用于不同进程
C.不能进行资源统计(每次只可以有一个线程对共享资源进行存取)

2.Mutex
A.速度慢
B.可用于不同进程
C.不能进行资源统计

3.Semaphore
A.速度慢
B.可用于不同进程
C.可进行资源统计(可以让一个或超过一个线程对共享资源进行存取)

4.Event
A.速度慢
B.可用于不同进程
C.可进行资源统计

--------------------------------------------------------------------------
33.一个数据库中有两个表:
一张表为Customer,含字段ID,Name;
一张表为Order,含字段ID,CustomerID(连向Customer中ID的外键),Revenue;
写出求每个Customer的Revenue总和的SQL语句。

建表
create table customer
(
ID int primary key,Name char(10)
)

go

create table [order]
(
ID int primary key,CustomerID int foreign key references customer(id) , Revenue float
)

go

--查询
select Customer.ID, sum( isnull([Order].Revenue,0) )
from customer full join [order]
on( [order].customerid=customer.id )
group by customer.id

--------------------------------------------------------------------------
34.请指出下列程序中的错误并且修改
void GetMemory(char *p){
p=(char *)malloc(100);
}
void Test(void){
char *str=NULL;
GetMemory=(str);
strcpy(str,"hello world");
printf(str);
}

A:错误--参数的值改变后,不会传回
GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。

修改如下:
char *GetMemory(){
char *p=(char *)malloc(100);
return p;
}
void Test(void){
char *str=NULL;
str=GetMemory(){
strcpy(str,"hello world");
printf(str);
}

方法二:void GetMemory2(char **p)变为二级指针.
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}

--------------------------------------------------------------------------
35.程序改错
class mml
{
private:
static unsigned int x;
public:
mml(){ x++; }
mml(static unsigned int &) {x++;}
~mml{x--;}
pulic:
virtual mon() {} = 0;
static unsigned int mmc(){return x;}
......

};
class nnl:public mml
{
private:
static unsigned int y;
public:
nnl(){ x++; }
nnl(static unsigned int &) {x++;}
~nnl{x--;}
public:
virtual mon() {};
static unsigned int nnc(){return y;}
......
};

代码片断:
mml* pp = new nnl;
..........
delete pp;


A:
基类的析构函数应该为虚函数
virtual ~mml{x--;}

--------------------------------------------------------------------------
36.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。

答:
101个先取出2堆,
33,33
第一次称,如果不相等,说明有一堆重或轻
那么把重的那堆拿下来,再放另外35个中的33
如果相等,说明假的重,如果不相等,新放上去的还是重的话,说明假的轻(不可能新放上去的轻)

第一次称,如果相等的话,这66个肯定都是真的,从这66个中取出35个来,与剩下的没称过的35个比
下面就不用说了

方法二:
第3题也可以拿A(50),B(50)比一下,一样的话拿剩下的一个和真的比一下。
如果不一样,就拿其中的一堆。比如A(50)再分成两堆25比一下,一样的话就在
B(50)中,不一样就在A(50)中,结合第一次的结果就知道了。

--------------------------------------------------------------------------
37.static变量和static 函数各有什么特点?

答:
static变量:在程序运行期内一直有效,如果定义在函数外,则在编译单元内可见,如果在函数内,在在定义的block内可见;
static函数:在编译单元内可见;

--------------------------------------------------------------------------
38.用C 写一个输入的整数,倒着输出整数的函数,要求用递归方法 ;

答:
void fun( int a )
{
printf( "%d", a%10 );
a /= 10;
if( a <=0 )return;

fun( a );
}

--------------------------------------------------------------------------
39.写出程序结果:
void Func(char str[100])
{
printf("%d\n", sizeof(str));
}

答:
4
分析:
指针长度

--------------------------------------------------------------------------
40.int id[sizeof(unsigned long)];
这个对吗?为什么??

答:

这个 sizeof是编译时运算符,编译时就确定了
可以看成和机器有关的常量。

微软将于10月28日发布Windows 7预览版(图)


北京时间9月25日消息,据国外媒体报道,业界人士周三透露,在今年10月28日举行的“微软专业开发者大会”(PDC)上,微软Windows部门高级副总裁史蒂文·辛诺夫斯基(StevenSinofsky)将亲手发布Windows 7预览版。

Windows 7为微软下一代PC操作系统。在今年的PDC大会上,外部开发人员将了解到Windows 7的更多技术详情,其中包括技术内核、网络连接、硬件设备要求和用户界面等等。在了解这些技术详情后,外部开发者今后就可利用Windows 7的应用编程接口(API),从而为该操作系统开发出各类新款应用程序。

上月期间,辛诺夫斯基正式启动了名为“Windows 7工程”的官方博客,称将通过该博客及时披露Windows7开发的最新进展情况,并欢迎外部开发者和普通网民就Windows 7开发事宜积极提出建议。他今年5月曾表示,Window 7将基于Windows Server 2008内核,而Windows Server 2008内核又是在Vista基础上改进而来,因此Window 7可以兼容所有支持Vista的驱动和软件。

本月中旬,美国知名IT网站internetnews.com援引消息人士的表述称,虽然微软对Windows 7发布时间的公开说法是2010年初,但实际上微软内部已制定了Windows 7发布的时间表。该时间表显示,Windows7的确切发布日期为2009年6月3日。

一家不愿透露身份的硬件厂商此前也透露,微软已经把Windows 7内部测试版交给各大硬件厂商测试,以检测Windows7与硬件之间的兼容性,但目前只有同微软存在合作关系的硬件厂商才能拿到该测试版.

解密Google Chrome兼容缺陷:网页开发者惹的祸

Google Chrome浏览器在推出之后就以简洁、快速的特性吸引了一干G粉的青睐。但是在试用之后,有不少网友抱怨Chrome兼容性不佳,甚至与Google旗下的YouTube都无法兼容。

  这一方面是由于Chrome还是测试版。按照Google的习惯,测试版总是有这样那样的缺陷,只有一路beat下去,才会越来越臻于完美。而另一方面,所谓的兼容性问题却完全是网页开发者惹的祸。

  比如说Chrome无法登录网上银行,那是因为国内网银的网上交易安全控件普遍是采用ActiveX技术开发的,必须依托于IE才能正常运行(浦发银行似乎是唯一的例外)。而这个ActiveX在给网民带来各种丰富的应用体验之外(其实也带来了很多的麻烦,很多臭名昭著的流氓插件就是基于 ActiveX开发的),也为非IE内核的浏览器设置了一道无法逾越的障碍--除非网上银行提供for Chrome、for Firefox的插件,否则Chrome 、Firefox又怎么可能正常访问呢?

  但是,面对IE一家独大的局面,网页开发者们早已被惯坏了。事实上,大多数网页开发者已经为微软提供的高效率集成开发环境所折服。除了依赖ActiveX之外,中国很多网页开发者在开发脚本程序时也使用了微软专有的VB脚本或者IE简写格式的Java脚本。

  依赖微软并没有错,享受微软高效率的集成开发环境也没有错。错的是网页开发者们只顾自己的舒服,却没有考虑到网民的用户体验。于是,世界上有近3成的网民(按照Net Application9月7日的统计,非IE内核浏览器累加的市场份额已接近30%)就不得不为网页开发者的愚蠢和懒惰买单了。

  迄今为止,国内完美支持非IE内核浏览器的网上支付网站只有支付宝。从下周开始,支付宝将全面支持Firefox(对Linux平台的支持也正在测试中,近期即将发布),在不久的将来还有可能将支持Google Chrome、苹果Safari等浏览器。支付宝也可以实现网上购物、转账、买机票,而且支付宝覆盖的商家比任何一家单独的网上银行都要广泛,多少可以弥补一下Firefox不能正常使用国内网银的遗憾了。

  但是,要想让非IE内核浏览器畅游网络,还需要更多网站、更多网页设计者的努力。作为一名普通的网民,我只能尽量把真相告诉更多的人--无论是 Chrome、Firefox还是其它的非IE内核,它们的兼容性并不是大家看到的那么糟糕。这些严格遵循W3C标准(WEB开发的工业标准)的浏览器只不过栽在了一群忽视网民利益的、懒惰的网页开发者手上。

售价179美元 全球首部Google手机发布







在经历了一年的漫长等待之后,万众瞩目的Google手机的终于正式发布了。北京时间9月23日22:30,在美国纽约Google及运营商T-Mobile共同发布了备受关注的第一部Google手机T-Mobile G1。这款手机不仅在机身背面标记有Google的LOGO,而且还搭载了由Google领衔开发的Android系统平台,是全球第一支Android平台手机。

由于之前已经有大量真机图片及视频在网络上曝光,人们对这款Google手机的造型款式已经是相当的熟悉。该机不仅配备有3.2英寸HVGA(320×480像素)分辨率的全触控式屏幕、而且采用了侧滑盖设计,提供了QWERTY标准键盘,可让用户获得更便利快捷的文字输入功能以及手机上网等功能。与之前人们的猜测一样,互联网应用成为了该机功能上的最大特色。该机内置广受欢迎的多项Google服务,包括Google地图、街景服务、Gmail、YouTube等。同时容易操作的界面以及快捷键设计,可以让用户以更快的速度进入Google功能,从而让用户可及时获得他们所需要的信息。

T-Mobile G1还装载有528MHz的Qualcomm MSM7201A处理器,内置192MB RAM和256MB ROM并支持最大8GB容量的micro-SD存储卡扩展功能。支持GSM850/900/1800/1900MHz、UMTS850/1900/2100MHz及HSDPA/ HSUPA网络和WLAN(Wi-Fi 802.11 b/g)无线局域网接入功能,兼容AAC, AAC+, AMR-NB, MIDI, MP3, WMA, WMV等格式音乐播放,内置320万像素的摄像头,但可惜的是没有提供自动聚焦功能。

作为第一款Google手机,T-Mobile G1内置GPS模块并完美支持Google地图功能。借助该功能,用户能够随时通过简便的触控界面察看地图,卫星影像图、附近商家及相关导航服务。不仅如此,T-Mobile G1还提供了Google街景服务,用户能够随时随地查询街道信息。无须花费任何力气,就能轻松浏览任何想去的地方。值得一提的是,该机的Google地图还能够与手机内置的电子罗盘同步化,这项业界首创的功能,让用户只要移动手中的手机,就能够以360度查看浏览目标位置。

除了丰富的Google相关功能,T-Mobile G1还具备强大的商务应用水准。内置rich HTML的电子邮件服务,能够实时同步化用户的Gmail或其它大多数POP3及IMAP邮件服务中的电子邮件、行事历以及连联系人信息。此外,由于该机具备多任务操作功能,用户可以一边浏览网页一边下载电子邮件。而在美国流行的Google Talk、AOL 、Yahoo! Messenger以及Windows Live Messanger等即时通信功能也被完全移植到该机之上,让用户可以随时与朋友和家人保持联系。当然,由于具备多种移动上网方式,并提供快捷的上网速度,因此T-Mobile G1 的用户可以将内置摄像头拍摄的照片随时随地与他人分享相片、或是查询最新体育赛事结果以及登陆上社交网站等。

T-Mobile G1也是全球第一支持Amazon音乐下载功能的手机,该机内置了Amazon所开发的软件程序,用户可以轻松连接到Amazon.com网络商店。并在该网站所提供的600多万首完整的DRM-free MP3音乐中,搜寻喜爱的项目,并利用Wi-Fi连结直接自该网站下载至手机。此外,该机也支持YouTube,可以让用户在手机欣赏YouTube上的原创内容,观赏熟悉的影片、浏览各分类项目、或搜寻特定的视频
T-Mobile G1的机身尺寸为117.7 mm ×55.7 mm×17.1 mm,重158克,在配备1150毫安时电池的情况下,手机可获得319小时的待机时间和406分钟的连续通话时间。据悉,该机将由T-Mobile独家推出,将于10月22日在美国上市,在与运营商签定两年和约的情况下,手机的销售价格为179美元。此外,该机还将于今年11月在英国问市,其它欧洲国家则预计于2009年第一季开始销售,包括德国、奥地利、捷克共和国、以及荷兰。

Sep 24, 2008

Job-Seeker Chaper03 Academic and Baidu

这三天真的有点生气了
为什么呢?让我们把目光集中在学院教务科
我们学院本科生已经全部在新校区了,所以本科生的教务处也搬过去了
最近几家公司网投有要求提交成绩表的
这成绩表当然要加盖学校教务处公章才有效
可是要打印成绩必须先倒学院教务科去把成绩打出来,让主管老师签字
然后学校教务处才给你盖章的(感觉最近中国各种体制都开始完善了)

而现在的问题是
丫的新的教务处系统是瓜的!不知道是委托哪家公司开发的
根本就不健壮
搞笑的是它的打印成绩功能不可用
日了,老子要知道那开发的人的姓名,非找人揍他一顿不可
MP
哪有瓜成这样的,而且教务处的更瓜,出了这么大的茬子居然好几天了没人管
好笑么?我们这些要找工作的就这么被你们遗弃么
我说这电子科大虽然以前就盛传出了名的缺少人文关怀
可是恕我直言这是没有人文关怀
日了,老子太生气了
而且,就算打印了成绩还要回学校教务处盖章
也就是要花两小时坐公交,转车倒校本部,找领导盖了章,再花两小时坐公交,转车回新校区
学校TMD不给学生开班车
宁可整天十几辆校车趴在逸夫楼底下也不开学生专列
老子,想打人了

/*——————强烈鄙视电子科大领导群——————
*接下来把话题转倒就业上
*谈谈今天的百度笔试
——————再次鄙视电子科大领导群——————*/
今天参加了百度的宣讲+笔试
感觉百度公司开得真有民族气节,是家好公司
当然也是家聪明人扎堆的公司,能进去最好不过了
可是笔试试题发下来人就开始寒了

一眼扫下来没有头绪,囧……

一共五套题。我所申请的质量部的软件开发工程师与商务搜索部的Windows软件开发工程师都要求做试卷一

第一题是这样的:
假设有N(万级)个集合,每个集合有从0开始的ID,同时每个集合有1~M(M为100)个term。每个term是一定的字符串集合组成,格式为
Term_1 空格 Term_2
Term_1 空格 Term_3
Term_1 空格 Term_3Term_4
要求实现按照一定的输入term去查找包含与term相同字符串的内容,并输出集合的ID
要求能够不间断服务,针对大量的输入提供输出。同时给出时间复杂度和空间复杂度。

第二题是这样的:
有R1到Rn顺序存储的数,这些数是无序的,但你知道有一个数M,满足
R1《R2《``《Rm Rm+1《Rm+2《```Rn(这里本来该写小于号,可是这样发不出去哈)
1:写一个程序或算法,使得n个顺序存储的数按从小到大排列。时间复杂度为O(n)
2:写一个程序或算法,使得n饿顺序存储的数按从小到大排列,时间复杂度为O(n),空间复杂度为O(1)(即使用的内存空间与M和N没有关系)

看到这两道题,是不是有点晕···
第三道更晕
是什么题呢,说白了,就是搜索引擎的算法题
题目很长很长,要求很多很多
但是你如果做出来了,百度不用面试直接就会给你签offer(猜测)
BT,直接考这个
真是的
我稍微看了一下,试卷一与试卷四是最难的吧



我还是太嫩了
出了学校后一定要努力提升自己,努力,努力!!!!!

Job Seeker——Chaper 02 The first paper resume and others

昨天,终于投出了纸做的简历,乖乖
Moto公司的
由于我们学院已经搬倒了新校区——传说中的伟大的清水河和尚庙
而MOTO公司在本部夏新厅开宣讲会收现场简历
所以我就帮我兄弟投了

MOTO这公司也不厚道
招聘页面上明明有23个Job Title
结果在我们学校发的Campus Hiring Positions就列出10~23的Job
我那位兄弟申请的HR Intern, Project Management等都在10以前
后来我看到杭州那有个Project Management就帮他填了那个
结果回来一查,那个PM是做Software Management的
他想做的是Supply Chain,也就是我们专业方向的职务
估计是白投了
而我投了个在北京的14号Software Engineer-Network Service & Mobile Application
回来一查,居然要两年的Windows开发经验
····
这两年要怎么算呢,我第一个做的Windos Project是在Uestc-Uec联合实验室里的系统
而且还是07年的,夹杂在海量resume里估计也是白投,日了

昨天同时开始的还有EMC的
里边的VMware的position蛮诱人的
不过呢,看了它上边的职位要求
一定要求你要熟悉一个现代版本的UNIX
比如Linux,FreeBSD,Solaris,HP/UX等等等等
我服了,真服了,没一个会的
上次才刚刚开始看UNIX初级教程呢,因为这找工作的事又放在一边了
哎···找完工作后在那段糜烂的时间里一定要争取再学点什么

昨天看了电视,有多远走多远系列的(总觉得应该叫有多远滚多远才号)
在广东东莞里吃当地小吃
哇···那个,确实好吃···
如果能去深圳那边工作也不错啊,吃得习惯天气也习惯
不过呢,最近看来北京,深圳工作多,难选择
哎··什么时候才是个头呢

网投简历真是会让人等得从焦急到无奈再到绝望
昨夜电闪雷鸣风雨交加
为了避免把闪电引进屋我才把手机给关了
等啊
等一个电话
还要等多久,不知道,可是必须等···

想到最近的这段日子里,有多少的Job-Seekers辗转难眠
真的是需要勇气
等待,耐心的等待,不管是什么样的消息
一直的等

Sep 23, 2008

Job Seeker——Chapter 01

维持我的一贯作风,写作尽量少用英文
讲讲这几天的找工作经历吧
从哪里开始呢···
我算是哪种一定要在deadline附近才会认真起来的男人
哎,天性
初高中将上课铃声踩到最后一秒的习惯使然
9月22日,也就是今天
有天空传媒,网易,腾讯三家宣讲会
/*--------------跑题的发散线----------------*/
腾讯瓜娃子,本来该9月23的,结果临时改的9月22
而且和网易同一时间开始
这不拧上了吗,日了
/*--------------跑题的回归线----------------*/

我昨天傍晚才开始写简历
结果今天早上刚想把成绩单和一些实验室的资料拿去打印的时候
小李匆匆忙忙过来说今天日本那方的徐博士要过来,我刚下飞机赶过来了,你负责接待云云
又日了
/*--------------跑题的发散线----------------*/
几天前也说明教授和徐博士要来实验室参观来着
结果让我们白等了一天,放我们斑鸠~~~
/*--------------跑题的回归线----------------*/

没办法,小李博士是上级,于是只好在实验室呆着
然后把RobotX拿出来把以前调好的动作模块烧进去继续调
可是用无线手柄调时机器人重心居然严重后倾
在线调一下,左腿小腿关节的舵机坏了
电路还没烧,只是失控了,估计是被激情四射的new members给玩坏的
/*--------------跑题的发散线----------------*/
为了不让new members没有任务闲得发疯
我们要求他们每人调一些机器人的动作模块出来
虽然有一定的烧舵机的心理准备
可这一切来得太快了吧
/*--------------跑题的回归线----------------*/
又日了,待会儿就演示不了了,哎

过了一会儿,宇哥打了个电话来
说是今天教务科不能打印成绩单
说什么其他学院录入成绩服务器暂时断开
我在实验室里一登学校教务处,噌的一下就进去了,查成绩查得不亦乐乎
于是感叹教务科的都是群SB,大四忙着找工作,想打印份成绩也不行
然后徐博士来了,还算比较好接待,主要是中国人
Japanese Professor来了还得跟他讲英语
要命的是还要听他讲英语
然后抓紧一切时间修改我的简历,目前简历已经修改到v3.8版本了,呵呵
升级不容易啊,每一次升级就是一个改进
下午天空传媒是不去了(非要成绩单的那个)
本来想傍晚去顺便补下自己没选的一门课
结果上学校就业网一看,哇,腾讯什么时候也跑到今天来宣讲了
而且还是在沙河这边
跟群里的兄弟伙商量了一下,我帮他们投腾讯,他们帮我投网易
吃晚饭的时候点了酸菜米线
刚吃了一小半,一看表都6:30了,7点就开始宣讲
于是乎后面就不知道自己吃了些啥
帮兄弟们打印了简历后朝着一教进发
一进现场哇靠真是人山人海红旗招展
站着挺副总裁吹了半天,一位师兄前辈吹了半小时,一个主持人吹了半小时
接下来答疑答了快一个小时(有这么多问题吗腾讯!!),居然是网投
发个短信过去,网易那边居然也是网投
百度,微软都是网投
真TM先进啊
//--------------重点的注释----------------//
今天的腾讯其实前边的宣讲会讲得还是不错
但是腾讯这公司怎么说呢,口碑老不大好
谁让你一直抄袭别人的呢
今天腾讯也被问到了这个问题
结果主持人一句“其实模仿也不一定不好”让我再不想听后边的内容了···
腾讯是有的是客户,可是,就不怕客户流失么
QQ和校内,毕了业的人还会用它们吗?
中国这块市场,你们能守得住吗?
腾讯,什么时候能拿出自己的创意封住所有批判的嘴?
说实在这几天我的心情是及其复杂的
我的未来啊
我接下来的三年不能浪费了啊
好好睁大眼睛找工作
找到一家好公司干上几年然后再作选择吧
加油,加油!
所有的Job-Seekers都好好加油
别泄气
这是我们工作一族最辛苦的几个月
一定要挺过去啊

Sep 21, 2008

山姆大叔刷爆卡---债务下的美国经济

今年真是多事之秋,中国在经历了一系列的雪灾,ZD,大地震(亲身体验)等天灾人祸后成功的举办了奥运
刚想歇口气呢,这边又煤矿塌方,那边又尾矿库“9-8”溃坝事件。
看看外边的世界,也不太平。
美国雷曼兄弟公司申请破产保护了,这样美国五大金融巨鳄倒了三个了,剩下两个还能支撑多久呢
巴西万豪酒店受1000公斤汽车炸弹袭击死了60,伤200多人····
Swetter本来是个目前只想钻研技术的人
可是这外边世界太乱,变化如此之快,以至于我有了与世隔绝的惶恐
于是乎这几日关注了下各大社会,经济,政治新闻,有些手痒了
昨日凤凰卫视推出报导片《山姆大叔刷爆卡--债务下的美国经济》
Swetter看了之后,终于,忍不住要开口了

美国是世界上最发达最富裕的国家,综合国力世界首位,这想来没人会有什么意见
为何会欠别人钱呢?
美国的第一债权人是日本,第二债权人,嘿嘿,正是咱们伟大的中国
美国如何欠了债?这得从它的消费理念开始

众所周知,美国那边买东西可以刷Credit Card。现在没钱,没事,银行帮你买单,以后记得还就是了,利息也不太贵。而美国全国上下大家一起刷卡消费明天的钱,这样依赖,美国的金融机构吃不消了。于是债权就拿出国卖,换成钱或者货物,外国的个人或者政府(绝大多数是政府)也愿意买,投资嘛。于是乎,这钱也渐渐的欠起来了。

美国每天都要进口大量物资,大部分都是从中国,2007年圣诞节是美国次贷危机后的第一个圣诞节。美国人乐,因为可以花钱;中国人也乐,因为可以赚到钱。每10棵圣诞树就有8棵是中国制造;其实不只是这样,从芭比娃娃,耐克阿迪到新款高级羊毛衫内衣裤,中国制造包围着美国人身体的每一部分。

中国大多数外汇储备都购买了美国的外债,可谓投入了一大笔钱
而美国现在的经济形式呢?
布什今年2月签署1680亿美元的法案,根据此法案美国人每人可以一次性得到600美元退税。
而调查显示,36%的美国人计划退税所得用于偿还债务,25%用于储蓄或者投资,只有另一个25%计划直接花掉
对大多数美国人,借钱,不消费,没有工作。
最下层工人比30年前工资降低了约30%,子女的日子过得不如父母。
连中等收入的中产阶级一半变富一半变穷,5千万美国人没有健康保险。
美国的汽车工业,自80年代的次贷危机后就一蹶不振。那次危机是与德国和日本汽车工业间的竞争而引发的。

事实上,30年来世界上最富裕的美国人民的生活和工资水平都一直停滞不前,这是真正的就业危机。现在靠福特汽车公司和沃尔玛的工资无法过上中产阶级的生活。在某种意义上,美国是从过于以通用汽车作为企业象征,转移现在的沃尔玛为企业象征,这就是一个改变---从制造变为零售。
以前通用汽车是最大雇主,现在是沃尔玛。靠沃尔玛经济能让美国人生存吗?靠沃尔玛发的工资能让美国人过上大多数人想要的生活吗?

报导中有一个比喻相当不错。美国经济犹如空载高速运行的火车,车上聪明的外国投资者会在车祸之前跳下火车。当前这火车正在不断加速,股票价格空前高涨,资金可以自由流动,经济仍在不断增长,但这挣钱大赛的背后有什么风险呢,这列火车只需一颗小石子或者一个小小的意外都可以导致火车的出轨,美元的崩溃,国外投资的消失,房产价格的巨跌。

而现在美国要求人民币升值。为什么呢
因为美国欠中国的债是以美元记的
中国欠美国的债是以人民币或美元记的
而且美国欠中国的债比中国欠美国的多得多(1970年出现贸易逆差后就愈演愈烈的美国经济导致的结果)
如果人民币升值,美元就贬值了
美国从人民币升值中可以让自己的外债凭空消失相当有分量的一部分
中国就得为美国人民的消费买单,为美国的经济衰退,次贷危机买单
Swetter想到这里,简直就是一股无端的怒火
我不是愤青,可是我也有看不下去的时候
美国政府,别太过分,中国人不好惹

Sep 20, 2008

7 Habits of Highly Ineffective People

7 Habits of Highly Ineffective People
By Henrik Edberg
With a twist to the common list of habits that are useful to establish, here are 7 habits that you do best to avoid.
Just like finding habits that can be useful for you it’s important to find habits that are holding you back. Most of these 7 habits can easily become such a normal, everyday part of life that you hardly notice it (or how it’s affecting you). I’ve dabbled with all of them quite a bit. Not surprisingly I didn’t get much of the important stuff done. I´d also like to add that these are just 7 broad habits you can establish to become highly ineffective in most parts of your life. I pretty sure there are several more.

1. Not showing up.
Maybe you’ve heard this quote by Woody Allen:
“Eighty percent of success is showing up”
One of the biggest and simplest thing you can do to ensure more success in your life – whether it be in your social life, your career or with your health – is simply to show up more. If you want to improve your health then one of the most important and effective things you can do is just to show up at the gym every time you should be there.
The weather might be bad, you might not feel like going and you find yourself having all these other things you just must do. If you still go, if you show up at the gym when motivation is low you will improve a whole lot faster than if you just stayed at home relaxing on the sofa.
I think this applies to most areas of life. If you write or paint more, each day perhaps, you will improve quickly. If you get out more you can meet more new friends. If you go on more dates you chances of meeting someone special increases. Just showing up more can really make a big difference. Not showing up will not get you anywhere.

2. Procrastinating half the day. To keep it short, my 3 favourite ways to get out of a procrastinating state are:
- Swallow that frog. What´s this means is simply to do the hardest and most important task of the day first thing in the morning. A good start in the morning lifts your spirits and creates a positive momentum for the rest of the day. That often creates a pretty productive day.
- How do you eat an elephant? Don´t try to take it all in one big bite. It becomes overwhelming which leads to procrastination. Split a task into small actionable steps. Then just focus on the first step and nothing else. Just do that one until it’s done. Then move on to the next step.
- The Get around to It Paraliminal. I find this guided mediation to be very useful. After 20 minutes of mostly just lying on my bed and listening I’m far more productive for a few days. I don´t feel the urge to sink into that procrastinating state or the need to find out what’s new over at one or five of my favourite websites.

3. When actually doing something, doing something that isn’t the most important thing right now.
One of the easiest habits to get stuck in, besides procrastinating, is to keep yourself busy with unimportant tasks.
To be effective you probably need some kind of time management-system. It might be something really simple, like using the 80/20-rule at the beginning of each day. The 80/20 rule, or the Pareto Principle as it´s also known, says that you´ll get 80 percent of your results from only 20 percent of your tasks and activities. So you need to focus most of your energy on those few important tasks to be effective.
When you have prioritized using this rule just write down the top 3 most important things you need to do that day. Then, from the top, start doing them. Even if you just get one of the things done, you have still done the most important thing you could do today. You may perhaps prefer some other system, such as GTD. But however you organise your work it’s still of highest priority to find the most important tasks so you don’t spend days, weeks or months doing busywork that isn’t that essential anyway. Just getting things done faster isn’t that useful if the things you get done are unimportant to you.

4. Thinking too much.
And thereby seldom taking action. Paralysis by analysis can waste years of your life. There is nothing wrong with thinking before you do something. Do some research, make a plan, explore potential upsides and problems.
But compulsively thinking and thinking and thinking is just another way to waste your time. You don’t have to examine everything from every angle before you try it. And you can’t wait for the perfect time to do something. That time never comes. And if you keep thinking you’ll just dig yourself down deeper and deeper and taking action will become more and more difficult. Instead you just need to stop thinking. Shut of your mind – it just helps you up to a point – and go do whatever you need to do.

5. Seeing the negative and downsides in just about anything.
When you see everything from a negative perspective you quickly punch a hole in your own motivation. You find faults everywhere and problems where there are really none. You cling to details. If you want to find a reason to not do something then that’s no problem. From a negative viewpoint you can find ten reasons every time.
And so very little gets done, you whine to anyone who wants to hear – and many who don’t – about how crappy your job, life and boss is. Which becomes a self-fulfilling prophecy as you create the life that is appropriate considering how think and see your world.
A solution is to realise the limits of a negative perspective. And that your perspective isn’t some kind of 100% true picture of the world. Then try other perspectives. For instance, trying to establish a habit of seeing things in a more positive and optimistic light can be quite useful. In that vein, you may want to try the Positivity Challenge. It´s not easy, but if you do the challenge and try to only think positive thoughts for 7 days it can give you an insight in how much your perspective and beliefs changes how you interpret your world. And what results you get.

6. Clinging to your own thoughts and being closed to outside influences.
It can be hard to admit that what you thought or believed was not the best alternative. So you cling to your thoughts harder and harder and keep your mind closed. This makes it hard to improve and for instance to become more effective. Even really considering the possibility that you can change your life can be difficult in this position.
One solution, obviously, is to open up more. To open up and learn from the mistakes of others, from your own mistakes and from other sources like books. This is easy to say though. It can, as almost anything, be harder to do. One suggestion I have is to, like I said about the previous habit, realise the limits of what you know and the way you going about things. And then just try something new.
Another tip is to read A New Earth by Eckhart Tolle and especially look at the chapters about the Ego. If you stop identifying so much with your thoughts and your Ego, as Tolle prescribes, it becomes a whole a lot easier to let new ideas and thoughts come into your life. And to let go of old thoughts that aren’t useful to you anymore. On the other hand I’d like to add and counter-balance with these tips: don’t get stuck in reading, in just taking in new information either or you might become a self-help junkie. Use the new information, put what you have learned in to action and try it out.

7. Constantly on information overload.
With information overload I don’t just mean that you read a lot. I pretty much mean an overload in all input. If you just let all information flow into your mind it will be hard to think clearly. It’s just too much stimulation. A few more potential downsides to this habit are:
- Some of the input you receive will be negative. The media and your surroundings often put a negative spin on things for various reasons. If you aren´t selective in what input you want in your life then you’ll be dragged into this negativity too. This affects how you think, feel and act.
- It creates an urge to keep up with what’s happening but there are always ten more things happening so you can’t keep up. This makes life stressful.
- It becomes hard to make decisions and take action if your mind is constantly bombarded with information or trying to sort through it all. Personally I find that if I get too much information it leads to a sort of paralysis. Not much get´s done. Or you get stuck in habit #3 and keep busy, busy, busy at high speed with low priority activities.
To be able to focus, think more clearly and take action it´s useful to be more selective in what you let into your mind. When you work shut out as much distractions as possible. Shut off the phone, internet and shut the door. It is strange how much you can get done when you aren´t interrupted every fifth minute or have the opportunity to procrastinate by checking your RSS-feeds or favourite websites.
Now I´m not suggesting that you should stop reading all blogs or newspapers. But think about what you really want to read and what you read just read to fill your time. And have a look at other areas of input where the doors are wide-open.
For instance, you don´t have to let in all the negative emotions from your surroundings. If everyone else are procrastinating or are anxiously keeping themselves busy by doing low-priority tasks at warp speed it´s easy to be influenced by that mood. If you have a door, then it might be good idea to shut it and focus on doing more important things.

Sep 17, 2008

【典藏】C++ Type traits

C++ Type traits
by John Maddock and Steve Cleary

泛型编程编出来的代码,适用於任何「吻合某种条件限制」的资料型别。这已成为撰写可复用代码时的一个重要选择。然而,总有一些时候,泛型不够好 ─ 有时候是因为不同的型别差距过大,难以产生一致的泛化实作版本。这个时候 traits 技术就变得相当重要。这种技术可以将那些需要被纳入考量的型别性质以一种 type by type 的原则,封装於一个 traits class 内,於是可以将「由於型别之间的差异,必须撰写出来以备用」的代码体积降至最低,并使泛用代码的体积提升到最高。
考虑一个例子:当我们处理字元字串(character strings)时,常见的一个操作行为就是决定「以 null 为结束符号」的字串的长度。很明显我们不可能写出一份泛型代码取代众所周知原本就存在的极有效率的解法:是的,C 标准函式 strlen 和 wcslen 通常是以组合语言完成,如果再加上适量的硬体支援,就能够比 C++ 泛型版本有明显的速度优势。C++ 标准程式库的作者了解这一点,所以他们抽取出 char 和 wchar_t 的性质,置於 class char_traits 内。於是,泛型代码一旦处理字元字串,便可以简单地使用 char_traits<>::length 来决定一个「以 null 为结束符号」的字串的长度,并且很安心地确知 char_traits 的特化版本将采用最适当的方法来完成任务。
Type traits(型别特性)
Class char_traits 是「把一系列与型别相关的性质包裹於单一 class 之内」的典型例子,那正是 Nathan Myers 所谓的 baggage class [叁考资料1]。在 Boost type-traits library 中,我们 [叁考资料2] 完成了一组非常特别的 traits classes,其中每一个 classes 都封装了 C++ 型别系统中的一个(仅仅一个)特性。所谓特性(trait)指的是,举个例子,某型别是否为一个 pointer,或是一个 reference?某型别是否拥有一个 trivial constructor,或是拥有一个 const 修饰词? 这些 type-traits classes 共同享有一致性的设计:每一个 class 都有一个 member value,那是一个编译期常数,如果某型别拥有某种特性,此一常数的值就是 true,否则就是 false。稍後我将为你展示,这些 classes 可以被使用於泛型编程之中,用来决定某个型别的特性,并导入对应的最佳化措施。
Boost type-traits library 也内含一组 classes,可以针对某个型别执行专属的特定的转换。例如它们可以从某个型别身上移除一个上层的 const 或 volatile。每一个用来执行转换的 class 都定义有一个 typedef-member type,那便是转换结果。所有这些 type-traits classes 都被定义於 namespace boost 之中。为求简化,本文的范例代码大多省略命名空间的设定。
实作(Implementation)
要在这里显示 type-traits library 的所有实作内容,是不可能的,那真是太多太多了。如果你有这个需求,请看 Boost library 的源码。大部份实作方法都是重复的,所以这里我只给你一种风貌,为你示范这些 classes 如何实作出来。让我们从程式库中最简单的一个 class 开始。is_void 有一个 member value,如果 T 是 void,它就是 true。
template
struct is_void
{ static const bool value = false; };

template <>
struct is_void
{ static const bool value = true; };
在这里,我们定义了 template class is_void 的一个主版本,并针对「T 是 void」的情况提供了一个全特化( full-specialisation)版。虽然 template class 的全特化是一项重要技术,但有时候我们需要的解决方案介於「完全泛化」和「完全特化」之间。这正是标准委员会之所以定义出偏特化(partial template-class specialisation)的原因。举个例子,让我们考虑 class boost::is_pointer,这里我们需要一个主版本,用来处理「T 不为指标」的所有情况,以及一个偏特化版本,用来处理「T 是指标」的情况:
template
struct is_pointer
{ static const bool value = false; };

template
struct is_pointer
{ static const bool value = true; };
偏特化的语法带了点不可思议的味道,而且一谈到它很容易就耗掉一整篇文章。就像全特化的情形一样,为了针对某个 class 写出一个偏特化版本,你首先必须宣告 template 主版本。偏特化版本在 class 名称之後多出一个 <┅> ,其中内含偏特化叁数;这些叁数定义出「将被系结於偏特化版」的某些型别。究竟什麽叁数会(或说能够)出现於偏特化版本之中,规则颇为曲折,以下是一个简略的规则。如果你能够以此型式合法写出两个多载化函式:
void foo(T);
void foo(U);
那麽你就能够以此型式写出一个偏特化版本:
template
class c{ /*details*/ };

template
class c{ /*details*/ };
这个简则并非绝对成立,但它非常简单,足以让你牢牢记住并足够接近精确的规则。
至於比较复杂的偏特化例子,让我们考虑 class remove_bounds。这个 class 定义了唯一一个 typedef-member type,其型别与 T 相同,但移除任何上层(top level)的 array 边界;这是「traits class 对某个型别进行转换」的例子:
template
struct remove_bounds
{ typedef T type; };

template
struct remove_bounds
{ typedef T type; };
remove_bounds 的目的是:想像一个泛型演算法,接受一个 array 型别做为 template 叁数,remove_bounds 会提供一个方法,让你有办法得知底部(underlying)的 array 型别。例如,remove_bounds::type 会被核定为型别 int[5]。这个例子也向你展示,在一个偏特化版本中,template 叁数的个数并不需要吻合 default template 中的个数。然而,出现於 class 名称之後的叁数个数必须吻合 default template 的叁数个数和叁数型别。
copy 最佳化
现在我要举一个例子,说明我们可以如何运用 type traits classes。考虑标准程式库所提供的 copy 演算法:
template
Iter2 copy(Iter1 first, Iter1 last, Iter2 out);
很明显,写一个泛型版本的 copy 绝无问题,它可以处理任何型别的迭代器 Iter1和 Iter2。然而在某种情况下,copy 动作可以透过 memcpy 完成。为了能够以 memcpy 完成 copy,以下条件必须成立:
两个迭代器 Iter1 和 Iter2 的型别都必须是指标。
Iter1 和 Iter2 都必须指向相同的型别 - 但允许有不同的 const 和volatile 修饰词。
Iter1 所指的型别必须有一个 trivial assignment operator。
所谓 trivial assignment operator,我的意思是这个型别如果不是一个纯量型别(scalar types)[叁考资料3],就是:
这个型别没有使用者自定的 assignment operator。
这个型别没有任何 data members 采用 reference 型式。
所有的 base classes,以及所有的 data member objects 都有 trivial assignment operators。
如果上述所有条件都获得满足,那麽这个型别就可以被 memcpy 直接拷贝,而不使用一个由编译器产生的 assignment operator。type-traits library 提供了一个 class has_trivial_assign,使得当 T 有一个 trivial assignment operator 时,has_trivial_assign::value 为 true。这个 class 只能对纯量型别起作用,但你很轻易就可以将它特殊化,使它适用於那些也拥有 trivial assignment operator 的 class/struct。换一个角度说,如果 has_trivial_assign 给出错误的答案,它会导致安全性方面的错误。
列表一显示一个最佳化(使用 memcpy)的 copy 代码。代码之中首先定义一个 template class copier,接受唯一一个 template 叁数 Boolean,然後是一个 static template member function do_copy,执行 copy 的泛型版本(也就是比较慢但比较安全的版本)。接下来是一个 copier 特化版本,其中也定义了一个 static template member function do_copy,这一次使用 memcpy 来执行最佳化拷贝动作。
为了完成整份实作代码,现在我们需要一个 copy 版本;如果可以安全使用 memcpy,就让它呼叫 copier::do_copy 执行特化版本,否则就呼叫 copier::do_copy 执行泛化版本。这正是列表一的代码的所作所为。为了了解这些代码如何运作,请看 copy 函式代码,并首先注意最前面的两个 typedefs v1_t 和 v2_t。它们使用 std::iterator_traits::value_type 来得知两个迭代器所指的是什麽型别,然後将其结果喂给另一个 type-traits class remove_cv,用以移除上层的 const- 或 volatile-修饰词,这使 copy 得以比较两个型别而不在乎 const- 或 volatile- 修饰词。接下来,copy 宣告一个列举元 can_opt,它将成为 copier 的 template 叁数 - 在这里,宣告为常数只是为了方便:数值可以被直接传递给 class copier(译注:我无法理解这一段意思;代码本身并未出现常数宣告)。can_opt 的值是根据「以下所有项目都验证为真」而计算出来:
首先,两个迭代器必须指向相同型别 - 验证方法是透过 type-traits class is_same。
其次,两个迭代器都必须是真正的指标 - 验证方法是透过先前描述过的 class is_pointer。
最後,被迭代器所指的型别必须有一个 trivial assignment operator - 验证方法是透过 has_trivial_assign。
最後,我们可以使用 can_opt 的值做为 template 引数,传给 copier。这里所呈现的 copy 版本会根据它所获得的叁数而调整,如果有可能使用 memcpy,它就会那麽做,否则就使用一个泛型的 copy。
值得如此吗?
许多文章都会引用这句话:「贸然实施最佳化,是各种伤害的根源」("premature optimization is the root of all evil") [叁考资料4]。所以你一定会问这样的问题:我们的最佳化是否太过贸然?是否太过唐突?为了透视这一点,我把我们的 copy 版本拿来和一个传统的泛型版本做比较 [叁考资料5],结果显示於表一。
很明显,最佳化与否,造成两个截然不同的结果。但我也要持平地说,时间的量测并不含括「快取装置误击效应」(cache miss effects),因此这份结果并未能在两个演算法之间展现精确的比较。然而,或许我们可以加上一些警告,放到「贸然最佳化」的规则里头:
如果你一开始就使用正确的演算法,那麽最佳化就不再有必要。某些情况下,memcpy 是正确的演算法。
如果某个组件即将在许多地方被许多人使用,那麽最佳化是值得的 - 即使对少数使用者而言,最佳化可能是小题大作。
表一:以 copy 拷贝1000 个元素,所花费的时间(微秒)
版本
型别 T
时间(微秒)
最佳化的 copy char 0.99
传统的 copy char 8.07
最佳化的 copy int 2.52
传统的 copy int 8.02

Pair of References
「copy 行为最佳化」这个实例告诉我们,type traits 如何被用来在编译时期执行最佳化策略。type traits 的另一个重要用途是允许某些「除非运用极端的偏特化,否则无法通过编译」的代码得以被顺利编译。只要将偏特化行为授权(delegating)给type traits classes,便有可能做到。关於这种用法,我举的例子是一个可以持有 references 的 pair [叁考资料6]。
首先让我们检验 "std::pair" 的定义,为了简化,我略去其中的 comparision operators, default constructor, 和 template copy constructor:
template
struct pair
{
typedef T1 first_type;
typedef T2 second_type;

T1 first;
T2 second;

pair(const T1 & nfirst, const T2 & nsecond)
:first(nfirst), second(nsecond) { }
};
此刻这个 "pair" 无法持有 references,因为如此一来其 constructor 将被迫接受一个 reference to reference,而这种语法目前并不存在 [叁考资料7]。让我们想想,为了允许 "pair" 得以持有 non-reference 型别、references 型别、constant references 型别,constructor 的叁数必须是什麽样子:
"T1" 的型别 constructor 的叁数型别
T
const T &
T &
T &
const T &
const T &
一个和 type traits classes 类似的技术,允许我们建构单一的对应关系,使我们得以根据 contained class 的型别决定叁数型别。type traits classes 提供了一个 "add_reference" 转换,可以为自身型别加上一个 reference,除非它本身已经是一个 reference。
"T1" 的型别 "const T1" 的型别 "add_reference::type" 的型别
T
const T
const T &
T &
T & [注8]
T &
const T &
const T &
const T &
这使我们得以建立一个 template 主版本,定义一个可内含 non-reference 型别、 reference 型别、constant reference 型别的 "pair" :
template
struct pair
{
typedef T1 first_type;
typedef T2 second_type;

T1 first;
T2 second;

pair(boost::add_reference::type nfirst,
boost::add_reference::type nsecond)
:first(nfirst), second(nsecond) { }
};
为它回添标准的 comparision operators, default constructor 和 template copy constructor 之後(它们都和原先版本相同),你就有了一个可以内含 reference 型别的 std::pair。
当然我们也可以使用偏特化技巧完成同样的扩充,但果真如此,我们需要三个 "pair" 偏特化版本和一个主版本。Type traits 允许我们仅仅定义一个主版本,就可以自动而神奇地将自己调整为任何偏特化版,取代一一偏特化的所谓「暴力法」。以此方式使用 type traits,可允许程式员将偏特化授权(delegate)给 type traits classes,使得代码比较容易维护,也比较容易被理解。
结论
希望这篇文章能够给你一些想法,让你大略知道 type-traits 是什麽。boost 说明文件中有更完整的 classes 列表,以及更进一步的使用范例。Templates 使 C++ 有能力实现泛型编程所带来的复用性;这篇文章还告诉你,templates 可以和 generic 一样地美好。这都有赖 type traits 带来的价值。
致谢
感谢 Beman Dawes 和 Howard Hinnant 对本文所提的意见。
叁考资料
Nathan C. Myers, C++ Report, June 1995.
这个 type traits library 的完成,要感谢 Steve Cleary, Beman Dawes, Howard Hinnant 和 John Maddock。你可以在 www.boost.org 找到它。
所谓纯量型别(scalar type)就是算术型别(例如内建的整数或浮点数)、列举型别(enumeration)、指标、函式指标、或以上任何型别再加上 const- 或 volatile- 修饰词。
此句引自 Donald Knuth, ACM Computing Surveys, December 1974, pg 268.
这一份测试代码是 boost utility library 的一部份(见 algo_opt_examples.cpp),以 gcc 2.95 编译完成,所有最佳化选项都打开。我的测试结果是在 400MHz Pentium II + Microsoft Windows 98 上获得。
John Maddock 和 Howard Hinnant 已经送出一个 "compressed_pair" library 给 Boost,其中使用的一个技术,和此处所描述的技术类似,也是用来持有 references。他们的 pair 也使用 type traits 来决定是否有任何型别是空的,并且采用 "derive" 而非 "contain" 的方式,用以保存空间 -- 这正是 "compressed" 的命名由来。
这其实是 C++ 核心语言工作小组的一个议题,由 Bjarne Stroustrup 提出。暂时的解决办法是,允许 "a reference to a reference to T" 的意义等同於 "a reference to T",但是只能存在於 template 具现实体中,或是存在於一个「具备多个 const-volatile 修饰词」的 method 中。
为什麽这里不该有 const 修饰词呢?对此感到惊讶的人,我要提醒你,请记住, references 永远是个隐晦常数(举个例子,你不能够重新对一个 reference 赋值)。同时也请你记住,"const T &" 是完全不同的东西。因为这些理由,template 型别引数如果本身是个 references 的话,其「const-volatile 修饰词」都被忽略。

列表一
namespace detail{

template
struct copier
{
template
static I2 do_copy(I1 first,
I1 last, I2 out);
};

template
template
I2 copier::do_copy(I1 first,
I1 last,
I2 out)
{
while(first != last)
{
*out = *first;
++out;
++first;
}
return out;
}

template <>
struct copier
{
template
static I2* do_copy(I1* first, I1* last, I2* out)
{
memcpy(out, first, (last-first)*sizeof(I2));
return out+(last-first); // 译注:因为是 RandomAccessIterator
}
};

}

template
inline I2 copy(I1 first, I1 last, I2 out)
{
typedef typename
boost::remove_cv<
typename std::iterator_traits
::value_type>::type v1_t;

typedef typename
boost::remove_cv<
typename std::iterator_traits
::value_type>::type v2_t;

enum{ can_opt =
boost::is_same::value
&& boost::is_pointer::value
&& boost::is_pointer::value
&& boost::has_trivial_assign::value
};

return detail::copier::do_copy(first, last, out);
}

Sep 12, 2008

我的实习之旅(暑期实习论文)

首先声明:原创。无剪刀浆糊之举。如有雷同,肯定是别人抄我的,嘿嘿~~~
                    由于要上交学校,所以,情节有做很小很小的改动
 

                                            我的实习之旅

 

2008年的暑假是我过得最充实的一个暑假,转眼间将要大四,此时的我在经过一段时间的考虑后选择了毕业就业这条道路。为了使自己尽快的适应以后的工作环境,我决定慎重对待自己的暑期实习。于是,我来到了成都盛景栋力信息技术有限公司进行我为期两个月的暑期实习计划。

 

我一直相信,放弃了考研,转而打算从事计算机程序类工作的我想在三年内比我的研究生同学们学得更多,变得更强,我只有几种选择:第一是进一个大型公司,如百度,华为等,在强手如云的环境中迎难而上,慢慢的充实自己历练自己;第二种是进入一家中小型的公司,这里有比大型公司更多的机会留给你,这里你能够把自己的才能尽可能的发挥,同时还有机会学到一些管理方面的技巧;最后就是自己创业,可是我和一些同学讨论过,如果对某一行业理解不够深入,贸然创业很容易失败的,虽然有很多成功的案例,可是我们没有看到那些没有被报道出来的失败案例的。

 

是的,很长一段时间这三条以后我可以走的道路都一直在我脑海中萦绕,我很像找到答案,究竟什么是最适合我的,究竟我想要什么,究竟我该怎么做。如何得到答案,当然只有到实践中去。这次暑期实习,针对自己以后想要从事的行业,我找到了成都盛景栋力信息技术有限公司公司的负责人,经过一段时间的商谈之后,我很幸运的得到了实习的机会。这是一家规模不大的公司,但是员工很团结踏实,其中不乏高手,是一个比较好的工作环境。在实习的过程中我也不断的在思考,从而有了新的感悟。现在,就让我细细道来。

 

学习不仅仅是咬文嚼字的过程,至少对于编程一类的工作,实践往往更显得重要。我首先要声明以下言论不是攻击现有的教学制度或教材,纯属个人感受。我自己学习技术已经有两年多了,学习的过程中给我的最大体会就是你的学习如果只是根据教材上的例子做那你一般不会出错,因为谁都不会把错误教给别人,教材上的例子都是经过一次次调试确定可以通过没有错误后才放上去的,最多只是一些印刷错误。同时,由于教材教的都是一些基本的知识而很少深入(至少对于大部分书籍来讲是这样),教材注重人人都可以理解,太多人咀嚼过的东西就显得淡而无味;另外,教材上的知识一般是注重教学的,也就是说,大部分的实际意义并不大,也许很多年前老掉牙的问题教材上照样讨论得津津有味。所以,作为一个学生相当忌讳的一件事是学完教材上的东西,就自以为学富五车,才高八斗了,而实际扔给你一个题目让你实现一个功能,你就会发现原来很多问题是你不曾发现的。是的,真正到了要你完全自己动手的时候面对突如其来的许多问题,你很快就会觉得自己很无助,进而感到有那么一点绝望,有那么一点受挫,如此这般之后,你会想重新审视一下自己的所学所想。现在社会上有一些声音是批评我们大学生的,说我们是商品教育的产物,实际动手能力差得可以。刚开始听到这种言论的时候我感到及其不舒服,但是又想不到反驳的理由,总不能把责任推卸给学校吧。然而做了一些实际的项目之后我发觉其实那些觉得大学生大而无用的人其言论固然偏激,可是不无道理。于是我学会了谦卑,老老实实的检讨了自己的能力不足这一问题,同时在项目中慢慢补足,这样的过程对大学生是有益的。我最后还是要声明以上言论不是攻击现有的教学制度或教材,纯属个人感受。

 

这里我想引入一句话:“工作中所学的东西和在学校里学的是不一样的”——不只一位前辈这样告诉我。在实习过程中,我也确实发现了这一点。

 

在实际做项目的时候,我经常的被一些大大小小的问题所困扰,而这些问题的出现根本是毫无征兆。比如用VC6.0做一个登陆对话框,想来挺简单,一个对话框,几个控件,然后写些代码就行了,其实不然。当然,这其中有一部分原因也许是因为我用的开发平台比较旧,如果是用VS.NET做的话,也许不会存在这么多问题。回到登陆对话框这里,我要做的那个登陆表单上面要求填入用户帐号,姓名,服务器IP,然后提供登陆和注册两个功能,点击注册则销毁当前对话框跳出一个注册对话框,注册信息填写无误后,直接连上服务器并进入主界面。仅仅这个功能我就被卡住好几次。比如,要在两个对话框间切换,而我要在哪里设置一个可以直接结束整个软件系统的进程的关闭功能(考虑到用户可能没有账号,想注册一个,后来又取消这个念头想关闭这个软件,而关闭的功能分成关闭整个程序进程;关闭登陆对话框进入注册对话框;关闭注册对话框返回登陆对话框;关闭登陆或注册对话框进入主程序,而关闭的函数很有限因此要仔细考虑用法);如何验证两个对话框的有效性(用户账号密码不能为空,是否为数据库中存储的已注册的账号,是否可以通过该IP连上服务器);如何保证用户登陆或注册成功后进入主界面(主要是对两个对话框的操作和验证问题),如何在MDI的环境下实现不同视之间的切换等等问题。仔细考虑后就是会有这么多的疑问,编写期间当然也会有疑问跳出来,总之,问题多多。

 

是的,这就是实际的项目,面向真正的客户的项目。这时的需求是客户提出的,也许会出现千奇百怪的要求,反正绝对不会像书本上教的那样,书本上教的全是作者假设出来的客户,假设出来的需求;而实际情况中,即要满足客户的需求,又要考虑到用户实际操作中的各种可能性(因为客户一般不是专门的程序员,他们最希望的他们付钱买的软件是完全傻瓜化的操作,越简单功能越丰富越好),所以实际做项目时,要注意很多问题。下面我就把先我亲身经历的一些开发过程写出来。

 

首先,设计系统时要全面的分析。需求说明书是开发人员和客户联系的第一座也是重要的一座桥梁。在接到项目以后一般会有一次会议,开发人员代表和客户代表一起坐下来谈项目,客户代表首先提出自己的需求以及对软件的一些设想;开发人员认真听取需求并从专业的角度来向客户阐述开发的流程和工作,并给出一定的意见。然后开发人员代表根据讨论的结果起草一份用户需求说明书,提交给客户代表,审阅通过后,用户需求说明书就成为后期软件开发的重要依据。用户需求说明书不仅仅是开发人员开发过程中的参考文档,也是项目验收期间用户的参考文档,同时,如果对于开发结果不满而产生一些纠纷,用户需求说明书也是一个可以参考的依据。软件工程中各种文档都已经形成标准,可以从网上下载到很多标准文档格式进行参考。

 

其次,由于我参与开发的是一个相对较小的项目,所以没有去遵循一些权威书籍诸如《代码大全 2》中所提出的大型软件工程项目所必须遵循的一些流程,而是简化了一些步骤。通过了需求说明书后,项目的负责人,兼首席软件架构师就开始写软件开发流程说明书,软件架构分析说明书。在其中会给出软件的功能需求,模块划分,开发周期和工作制度等等内容。团队里的所有程序员都必须认真阅读需求说明书和开发流程说明书,软件架构分析说明书。接下来一般会有一次团队内部的会议,会议内容再清楚不过,就是分配任务,把划分好的模块分配到具体的一个开发人员。当然,如果对这些说明文档里的内容有疑问,也可以当面提出来,团队内部讨论后决定是否更正部分内容。会议结束后,每个开发人员要干什么活一般都清楚了,接下来就是自行安排时间,能赶得上进度就好了。

 

再次,就是编写阶段了。相信很多人现在还认为编程就是写代码吧,刚开始学的时候我也这么认为,学了一阵子之后我就发现不是这么简单。编程不仅包括写代码,那些前期的准备工作,与客户的讨论和会议,编写过程中的纠正,模块间的联调,程序员间的交流等,这些都是编程。所以这个编写阶段,不是每个分配到任务的人把自己关进小黑屋子,对着电脑狂敲键盘的过程,这样写的代码根本就没用,很孤立。真正的编写是大家在一间窗明几净的工作室里完成的,所有人在一起工作,做各自的工作。实际编写过程中经常会有一些问题出现,这时就会有两三个人聚在一起讨论;或者是模块接口方面出现了一些问题,模块的编写人员在一起讨论解决方案;或者是某一功能模块不明确或者划分不当,向小头目反应后可能会有另外一个小会来解决这个问题。使得,真正的编程是一个很快乐的过程,很多人一起编写,一起讨论,互相学习,共同进步,真的是这样的,并不是套话而已。而必须要指出的是,编写阶段一般都不会总是和当初说明文档里面的设想相一致,可能的原因很多(架构师的经验问题,考虑的不全面等等),但是偏差也不会很大(否则那些说明文档就没有存在的意义了)。在实际的编写过程中你往往会对自己所用的某一门语言,某一个IDE有了新的体会,这是你一味的学习书本上的知识所没有的体会。

 

编写好大部分代码后其实调试工作就已经要开展了。调试是一个很折磨人的过程,对于新手来说,更是“感觉像在地狱走了一回”。是的,调试就是DEBUGBUG就是软件中的不稳定因素,也可以概称为漏洞。BUG在刚写好的代码中肯定存在的(这间接证明了一个观点,那就是人肯定都会犯错误的),而BUG越早被发现越好。软件工程学中有一个观点,那就是问题在系统中存在得越久最后解决问题的成本也就越高,这是众人总结出来的观点,我认为是正确的。设想一下,一个BUG是在刚开始的几十行代码中容易被找到,还是在后来的几千行代码中容易被找到呢?答案不言而喻。而且,代码越多,就越可能出现一些编译器上的错误,还有其他的一些例如内存泄漏,访问越界等错误。这些错误如果叠加到一起,相信我,你肯定会觉得很郁闷的,郁闷到不能再郁闷,到后期BUG的出现往往令你措手不及,反复的调试过程极大的考验了你的耐性。如果能在联合调试前就尽量保证代码的质量,那就可以给后期的DEBUG过程减轻很多负担。这是让我感受很深的一个教训。我所经历的调试期虽然碰到了问题,可是问题都能很快被找出来,主要归功于各个开发人员的编程水平都经过了考验和平时多交流多探讨及时解决问题这些良好的习惯。这又给我一个启示,作为一名开发人员,提高自己的专业水平同时与他人共同进步,养成良好的开发习惯,这样对人对己都是有利无害的。

 

程序员的调试期结束后,就把编译后的软件交给客户试用调试。这就类似我们经常听到的一些字眼,“内测”和“公测”,还有软件发布中的“α版”和“β版”等,意思差不多,就是要说明一个道理,那就是软件是要经过一系列的测试的。如果程序员的调试做得好的话,用户一般是碰不到什么错误的。用户觉得满意了,项目验收就结束了,接下来就是一些结算的问题了,客户付钱,程序员收钱,这样,代码就换成银子了。这是以后我的工作,写代码的一个目的——维持生计。很实际的一件事,在以后我们工作了的时候都会这样。

 

这里我想对用户测试期说一些话。程序员把写好的软件程序交给客户使用,是一定会附上一份“用户手册”的。为什么呢,因为用户不是程序员,而且他们也没有参与编写这款软件,软件中的功能,菜单的级别,内部机制,快捷键的使用,程序员自然清楚,可是用户还不清楚啊。如果不把软件的使用方法告诉一个外行人,你认为他会用得好好的吗?肯定不会,他肯定要摸索上好一阵子才渐渐熟悉。日常生活中我们经常可以看到一些说明书,用户手册就是软件的说明书。买家电什么的都有一本用户说明书,买双耐克鞋,说明书就那么长了,何况一款软件。用户手册要怎么写呢?这就是说明文了,我们在日常生活中经常用到的文体,只要遵循一定的格式,写的时候困难不在于格式而在于你自己。我当初写用户手册时遭受了很大的困扰,总是有很多地方我认为没有必要写出来,是人都知道的事;很多地方我认为不需要特别标注,傻瓜才会犯错呢;很多地方我认为一笔带过,小处无关痛痒……现在想来那是纯粹的跟着感觉走,是一种危险的举动。我将我写的第一份用户手册交给小头目审阅,马上被打回来了,曰:“写给谁看呢,具体点”我这才把原先自以为是的地方给补上了。说明文就是这样,白菜内容,该具体的地方具体,不该具体的地方也不要简单得漏掉什么。

 

我感觉实际做项目有很多好处,首先实际的项目带给你的是更多的责任感。责任感可能来源于很多地方。因为你在做一个实际项目,你要对付你酬劳的客户负责。另外,你要对自己负责,不能再因为自己是学生而轻易的原谅自己。我想这样对个人而言是很好的,很利于成长;其次,实际做项目可以碰到很多原来没有机会碰到的问题,这些问题解决了之后你会对自己有了一种新的想法。这些问题也许会让你很受挫,但是正视这些问题,勇敢的解决它们,你会发现自己的技术有了新的提高;再次,实际做了些项目之后你会对某一行业的一些内部运行机制有了更清楚的了解,没有什么比亲身经历更让人难忘的了;最后,实际做了项目之后,很自然的你就会对这个社会有了新的理解,这和你在大学这个象牙塔里所看到的社会将会有所不同。而且随着你理解的深入,你会发现他们越来越不同。最终你会完成从一个大学生到一个职场人员的转变。

 

然而在实习中我也发现,某些人在工作之后就失去了学习的热情,变得很实际而没有太多的上进心。这对我而言是很可怕的。我总认为,不学习你就无法进步,更不能因为工作或者生活的重担,压力等等因素让你失去了学习的热情。我一直很认同一句老话“活到老,学到老”。不错,学习是一个不轻松的过程,身为学生我对此也颇有感触,但是学习带给你的感觉是任何感觉都无法比拟的。也许在学习和钻研的过程中你会感到痛苦,但是,不“吃得苦中苦”,怎能“方为人上人”?我也发现自己一个比较好的优点就是始终都想学习,以前是,现在是,将来也是,而且越长大,了解的东西越多,想要学习的也越多。学习使人丰富。我想我自己不会在工作中失去学习的热情的。

 

在实习过程中我另一个比较深的体会是团队合作的重要性。编写一个软件系统,不仅要保证所有主要的想法主要的方向统一,编写过程中也需要所有成员的交流。这就是说,一个好的团队应该首先所有的想法出自同一个大脑,其次它的四肢应该在服从大脑指挥的同时很好的协同工作。否则,我们做一个系统就好像找来一群互不认同的工匠盖房子,大家都各自盖自己的,因为彼此之间没有共同语言所以创造的过程是很枯燥的,大家都感觉自己在遵循总的原则,朝着一个总的方向前进,结果到了最后要把各自盖的部分组成一个完整的房子时才发现原来各个部分之间根本不能很好的组合在一起,排水系统,通风系统和屋子主体结构没法联合在一起,导致房子最终没法完成,只留下一堆烂摊子。是的,团队成员间的交流是重要的,特别现在的面向对象的编程过程中,都把一个系统分成几个模块,模块内再细分,然后将某部分的功能指派给一个程序员完成,模块间的通信都是通过接口实现的,如果不及时,合理的交流,两个类之间可能根本就无法通信,或者干脆就没有留有商议好的接口导致无法通信,工作当然也就完成不了了。我记得曾经有个神话传说,古巴比伦时代人们很聪明很团结,曾经他们想建一座通天塔去探索天上的秘密。这个举动惊动了天神,为了防止人类的团结危及他的统治,天神让那批建造古巴比伦通天塔的工人们彼此有不同的语言而无法向当初那样交流,最终让通天塔没法完成,人类探索天上秘密的脚步因此停住了。这样看来,天神真的很聪明,看出了人类的交流是多么的重要,交流的力量是多么的强大,让人类无法交流,人类就无法合作。而实际工作中,交流也一直占据着一个不可动摇的重要地位。

 

在实际中我也碰到了由于交流不够而产生的问题。比如在一个视上要接收用户的输入数据,然后要判定有效性和合法性(这几乎是交互时必须要做的事情了),先前这两个互留接口的模块编写人员没有好好交流,后来联调的时候会出现这个验证功能,或者两人都没写,或者两人都写了这样的情况。都写了那不是太大的问题,都没写的话问题可能就大了,可能会导致一些意料之外的错误,而调试人员要费好大的劲,绕了很多弯路才发现问题的出处。因为没有经过验证的数据会有潜在的危险,把没有通过验证的数据放行了,就好比给系统引入了一个没有钟表的定时炸弹,不知道它什么时候会爆炸,更不知道它会给系统带来什么样的破坏。所以下边的对话是大家都不愿意碰到的:

A:“哎,这怎么会溢出呢”

B:“我看看···”

过了好长一阵子,这是一段辛苦的摸索过程。

B:“你看,问题在这。这里接收的输入结构体在链表中的存储不对,你看,出现了部分非法数据,这怎么会是个这么大的负数嘛”

A:“怎么会这样,我填充了结构体后就传给你了。你接收我传过去的数据时没有验证吗”

B:“啊,我以为你写了,我就直接收了push到链表里了”

A:“……,知道了,原来是个谁都可以做的验证过程,只是我们都没有写而已”

B:“就这么个小问题浪费我们半天时间,哎,你写还是我写……改吧,早点调完早点解脱”

……

请不要觉得这段对话很搞笑,因为我做的是一个中小型的软件系统,所以出现这样的情况还是相对比较好解决的。如果是做一个大型系统,那么,如果这样的错误出现,很可能的情况是开发周期要往后推迟几星期,不幸的话,一两年都有可能,因为系统越大,问题越多,问题藏得也就越深,找到问题的所在所要花的时间和精力都将是巨大的,同时这一大段时间里大家都在为找出错误而忙的焦头烂额,同事之间的争吵和不和也油然而生,影响了团队的团结。长时间的延期也会给公司的形象造成相当一部分的损失,可能一些现有的或者潜在的客户听说了公司的某些延期项目之后会重新考虑和公司的合作,这样直接导致客户流失,公司付出的代价将是巨大的。所以,身为一个开发人员,在做项目做开发的时候一定要有一种严谨的态度,要和自己的工作伙伴合理的交流,防止这种缺少交流而出现的错误发生。

 

还有一点是必须要说明的,那就是:在实际的工作中是肯定会碰到问题的,碰到问题该怎么解决呢?以我这段时间的体会来看,我认为首先要自行求解,实在不弄不清楚再去请教高手,这是一种比较好的习惯。就像当初刚刚学习编程时候一位师兄的提醒一样,首先要自己试着去寻找答案,因为在这个寻找的过程中你往往能学习到很多知识,不管是与你的问题有关的或者是无关的知识,总之你又多学了一点。就算最后没找到答案,你已经比当初的你更丰富了;自己找不到答案,然后才拿去问别人,这是一种对待问题的比较好的方法。在实际工作中我发现网络是个很好的资源,充分利用的话足够你解决几乎所有的问题。因为网上有很多人提出了跟你或许相似的问题,也有很多人针对这些问题作了解答,这些解答有很多参考价值。回顾我的三年大学生涯(虽然还没结束),现在看来对于网络我一直没有把它用在该用的地方,虽然我不是堕落的人,但是大多数上网的时间我都是用来上浩方打DOTA(还好不是那种很浪费时间的网游例如魔兽世界之类的),聊QQ,看电影,看漫画什么的。在这次实习中我仿佛认识了一个新的网络一样。原来网络上有那么多我想要解决的问题的答案,还有那么多引导我解决问题思路的线索,有那么多牛人写的博客……原来我一直只是用了庞大的网络资源中小得可怜的一部分而已。我感觉自己是一条小鱼儿,一直一味网络就是我所游过的一条条小溪小河,如今突然闯进了汪洋大海,这才对自己之前的浅薄感到羞愧,这才有了一种相见恨晚的感觉,这才急切的想要去弥补自己的不足。

 

总的来说,这个暑假确实给我好好上了一课,让我对于这个社会,对于职业对于人生有了更多的思考和总结。写这份报告的时候,实习已经结束了,而我的心久久不能平静。大学眼看就要结束了,我是否准备好工作了;就要踏入社会了,我是否成为一个合格的社会人了;前方是哪里?我的未来将会是怎样的?一大串的新问题又出现了,但是我不会想当初那样的手足无措,我会一路前行,同时认真思考自己的前途。

 

现在我想自以为是的为自己解答几个在实习之初我问我自己的那些问题。

 

其一:究竟什么是最适合我的?

答曰:“这个地球不是以你为中心才会转的,很多时候你没法改变大环境。要寻找‘最’适合你的东西,那你是要付出很大代价而且风险也相当之大。所以,还是不要去寻找‘最’。前边提到的三条路,其实每条都可以走,但是可以先考虑前两条,有了社会经验和对某行业的谙熟这两个条件后可以再考虑创业。做事情要一步一步来。不过,目前看来有个相当适合你的存在,叫做‘学无止境’”

 

其二:究竟我想要什么?

答曰:“你不是那种甘心到老了还是个工程师的人,你想学很多东西,其中有你最喜欢的技术;同时你还想涉猎其他区域,如管理和人际,心理学等。‘池中之物’不是你最终的归宿,但是现在是重要的积累期,你要的就是一个更好的自己”

 

其三:究竟我该怎么做?

答曰:“对技术:求知的心和严谨的治学态度。

       对人:坦诚交流和互相帮助。

       对工作:认真和敢于承担起责任。

       对生活:毫无根据的热爱。”

 

最后,我衷心的祝福我的兄弟姐妹们。希望所有出国的同学们签证顺利,在国外能够过上安稳的生活;希望所有保研的同学们在这段时间辛苦过后能够保到一个好的导师名下,三年后能很好的成长;希望所有考研的同学们在残卷枯灯的考研征途上一路走好;希望所有即将找工作的同学们找到理想的好工作,同时也希望在自己以后的职业生涯中一路走好。

 

努力

暑期的实习报告
老师要求一万字 T_T

努力啊

大四青年之烦恼

一个暑假忙完了
我也大四了,要准备找工作了
大学四年,还真是没有闲下来的时候啊

我原先决定先用几年时间把自己的技术水平提高到一个新的层次
可是我和一些学长还有长辈交流过后
他们告诉我一些他们的想法
总结起来,大概都不外乎这三条
做技术的,有三条路走:
第一是进一家大公司,里边强手如云,工作强度也比较大,在那里能够在技术上进步很快,因为有很多高手可以请教和交流
第二是进一家中小型公司,在那里由于人员不多,强人没有大公司里多,你可以将你自己的专长尽情发挥,在那里还有更多的机会让你从如何被管理学到如何管理别人
第三是自己创业,但是难度和风险都相当大,需要有足够的洞察力和良好的市场,还要有优秀的领导才能,同时技术当然也要过硬

老实说,现在的我这三条路都想走
我想学好技术,同时不会当一辈子的工程师,更想自己可以做点什么大事
这就是年轻吧
激情,野心,无畏,带着那么一点点贪婪

可是以后的道路怎么走
我真的得好好想想了
有些基本原则是不变的
那就是求知的心,耐性和坦诚对人
一路走好,我的王

Sep 10, 2008

华为牛人写的话(有点长)

徐是华为数据中心的头,技术超级牛人,一级部门总监,华为副总裁,年收入过千万,数据中心是用火山岩建的深入地下的一个大型建筑.防辐射,可防卫星的电子,雷达等手段的侦察.里面有象卫星发射中心那种超大屏幕,机房里满是三米的大型服务器和大型计算机.连接整个华为全球的每一台终端,整个华为每天三十多万封邮件,海外和全球的同步研发,内部的信息管理,内部流程,华为的国内国际IP电话都是通过出去.

  上周,我正式提交了离职报告,准备给自己的职业生涯一个很大的转折,这是我长时间的思考最后所做的决定.但真的提出离职后,回想在公司的十年,还是百感交集.

  1997年7月16日,我只身提着一个包从深圳宝安机场下飞机,走出机场,天是那么蓝、白云那么低、空气那么潮,仰头望天,对这个城市,对公司、对即将开展的工作和生活、对自己的前途一片茫然.到了科技园,发现是个荒凉而偏僻的地方,不过倒很安静,上学的几年中,一连串的打击,使得我似乎有点喜欢这种安静、荒凉、在他乡的感觉.现在想想,经过十年的工作,自己的心灵真是麻木得可以了.那时候的心里,好像时时有些什么没有着落的东西在激荡,但又说不出来,只有在听德沃夏克的《自新***交响曲》时,才发现多有深处的共鸣以至落泪.

  由于没赶上大批应届生的接待,我是自己一个人来到科技园1号楼的,干净整洁的大楼,很帅很靓的保安和前台,进进出出精神饱满的员工,让人的心情为之一振.象没头苍蝇一样乱走了一会后,一位人力资源的大姐,很职业、热情、耐心的告诉了我入职手续如何办理,并安排我当晚在粤海门华为之家临时居住,又安排之后的宿舍事宜,在举目无亲的异乡让人倍感亲切,至今记得.

  来深圳、来华为当时确实是一种机缘,96年华为名气并不响,特别是在行业之外,偶尔一次我在同学家里看到一张华为人报,有几片文章印象至今很深:一篇是周劲写的欧洲考察心得,讲欧洲一个20-30人的小公司,所具有的那种全球化运作战略、能力和气度.一篇是唐东风写的被评为杰出员工受表彰后的感想.还有一篇名头很大“中央研究部知识产权处”,当时被这个名头吓了一跳.文中讲到华为当年研发累计投入1.8亿人民币,更让我吓一个跟斗.我想当时清华大学一年科研经费也就1亿多点,这家公司什么来头,花的科研投入比清华还多?当时就有了兴趣.

  快毕业的时候,连连受挫,找工作跟当年大部分同学一样,希望留北京,但连续被联想、方正、科海、卫通等当时大名鼎鼎的公司录取后又告知要交几万块钱才能解决户口问题之后,想到了还有华为这样一家公司,给人力资源部寄了一份简历.没几天,一个深圳的电话,说某年某月某日有个副总裁来北京,面试一下.抱着试试看的态度跑过去了,是公司原副总胡红卫,他基本上没有问我什么问题,到是介绍了一下华为的情况,然后把人力资源经理田景琦叫了过来,当场就给了我一个“录取通知函”和入职操作指导.我一肚子犯嘀咕,这是不是一家骗子公司?怎么这样就算面试通过了?连工资有多少都没有机会问.之后一直到报到前,都有点怀疑,幸好有个本科的同学,在华为工作过,在向他咨询后了解到公司还是实实在在有的,才下了决心过来.总的说来,就是被一张华为人报“骗”来的.

  就这样懵懵懂懂到了华为,一开始新员工培训,纪律严明、严格,班车不会多等半分钟,之后是部门培训,大量的信息扑面而来.之后到了工作岗位上,给我分配的工作是ERP系统管理员兼DBA,虽然以前也搞过一些大系统,如兼职做过印度人的大型银行软件的客户化开发,但见到我们的ALPHA8200和我们的软件ORACLE,心里还是激动不已.IT的发展一日千里,10年前的技术与今天比,很多人可能没有体会了.那时比较落后,很多人也没有机会接触这种当时很先进的系统.我见到我们居然有2G巨大内存的“超级服务器”当时实在是佩服不已,为自己能做它的管理员而自豪,又为自己将来能不能玩转它而焦虑.我师傅王忠宁见到我就撂给我一本书《ORALCEADMINISTRATORGUIDE》,一寸半厚的英文书,愣是一周之内从头到尾看完并写了厚厚的读书笔记和一大堆不懂的问题,自此再也不怕厚厚的英文书.

  当时正好是公司ERP上线没多久,业务正在推行,系统极不稳定,每天的并发程序有一半是跑错的,系统还会动不动CRASH.我看完一本书后,在刚刚成为OneBookMan时,问题单就来了,有一个重要的××引入程序有时候跑得出来,有时候跑不出来.说实话,那时候对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的复杂性越来越增加的情况下,逐渐理解了很多.西方公司职业化的专家,做任何事情都有方法论、有套路,甚至于如何开一个会都有很多套路,后来我对这些套路的研究有了兴趣,自己总结出了不少套路并给部门的骨干培训和讨论.在一个复杂的环境下,很多问题已经不能就事论事来研究和解决,非常需要系统性的方法和战略性的眼光.对于一个组织的运作来讲,制度和流程的设计尤其需要这一点.爱恩斯坦说过:Wecan'tsolveproblemsbyusingthesamekindofthinkingweusedwhenwecreatedthem.

  六、独立思考,不人云亦云.公司大了,人多了,混日子也容易了.人很容易陷入随波逐流、不深入业务的境地,而看不到问题和危险.专家有过一个研究,雪崩发生时,一般受害者都是一批一批的,很少有单个人的受害者,原因很简单,单个人在雪崩多发地会相当小心和警觉.但一个群体,群体越大,每个个体就会有一种虚幻的安全感和人云亦云的判断,但现实是不管群体的力量有多大,雪崩都是不可抵抗的.因此我觉得在大的机构里,保持独立思考的能力尤为重要.

  七、少抱怨、少空谈、积极主动,多干实事.我曾经是个抱怨很多的愤青,经常容易陷入抱怨之中.但多年的工作使得我有所转变,因为知道了抱怨是最无济于事的.世界上永远有不完美的事情,永远有麻烦,唯一的解决之道是面对它,解决它.做实实在在的事情,改变我们不满的现状,改变我们不满的自己.实际上也有很多值得抱怨的事情都是我们自己一手搞出来的,比如社会上很常见的是高级干部退下来了,抱怨人心不古、感慨世态炎凉,如果好好去探究一下,原因很可能是他权位在手春风得意时不可一世、视他人如粪土造成的.

  八、对职业负责、对目标负责,对自己负责,成功者往往自觉自律、信守承诺、心无旁骛.大企业肯定会有绩效考核、会有论功行赏、会有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,有时候回家陪这些“小情人”比陪她的时间多,她都能谅解.她对金钱和名誉常常很不在乎,家庭财务也一塌糊涂.不过做事雷厉风行、执行力超强,我刚提离职,她就以迅雷不及掩耳盗铃之势把我们的房子卖掉了.

  感谢我的女儿,虽然她才不到二岁,但她带给我和太太的快乐和幸福简直难以描述.在养育她的过程中,我们自身不断学习、反思,也得到很大的提高,小孩的成长也是我们父母重新成长一次的机会,在与她互动的过程中,我觉得最主要的不是我和太太教育她,而是她教育我们,她触发了我们更好地去面对、体会、反思、感悟生活和人生,并且她也触发了我很多关于管理的深入思考,感觉育儿和管理很多方面真是很相通的.为此我还专门开了一个博客,把自己对于儿童教育、管理等的感悟记录下来.

  最后感谢公司老板,给我们提供了这样一个工作平台,在这个平台上我们努力过、奋斗过、沮丧过、抱怨过、成功过、快乐过...我们从一个土老冒逐渐成长为一个职业人.真心说声谢谢!希望公司变得越来越强大,越来越成为中国人在世界上的骄傲.
Powered By Blogger