人生的过程,不断学习、不断向前迈进的过程

郎咸平:中国企业存在病态心理

下面的言语都是从郎咸平教授的博文《中国企业存在病态心理》摘录的妙语,看了后挺有感觉的:

“中国文化博大精深是没有错的,这个没有人会有意见。在这种博大精深的外衣之下,我们谈谈小问题。我认为中华文化有两个小问题,第一个小问题,投机取巧;第二个小问题,浮躁。”

“你有没有听过“杀鸡不用牛刀”?有没有听过“四两拨千斤”?很有道理是吧!只要你认为有道理的,基本上都是错的。”(PS:郎咸平之所以会持反对观点,是因为这些都是标准的小概率事件,很多事不能太冒险,出其不意就全都玩完了。)

“我们从小学念到大学,什么时候老师教我们说:你们为何对岳飞被十二道金牌召回,仔细研究一下他背后的原因。屈原跳汩罗江,好悲壮,我们只能说:你看看楚怀王的昏庸。再讲一句大家熟悉的谚语叫做“失败是成功之母”,这是全世界最荒谬的逻辑,失败加失败加失败竟然能够成功。”

“我们对于失败背后的原因从来不去深究,从来不去研究,可是我告诉各位每一次失败都有原因,不是管理的问题就是战略的问题要不然就是其它的问题,但是我们的文化从来不鼓励我们去研究失败的原因。我们只看表面现象,不看背后真正的原因,这种只看表面的民族是浮躁的。”

“我们的企业家是我常常批评的,他们有世界五百强的病态心理,做到一定规模就要做大做强,这就是浮躁的心态。当去问这些企业家为什么要做大做强时,他们是讲不清的,他们认为做企业就是要做大做强,这个问题就来源于他的浮躁心态,他们认为企业做大做强才是正确的。”

“联想2004年之前曾经做大做强过,他们想搞IT服务、手机、互联网,到04年之后宣布失败,随后又收购IBM的手提电脑部门。这一切的做法就是我讲的,一个浮躁的心态让他喜欢做大做强,而其手法是投机取巧,喜欢小概率事件。”

“要成为现代企业,真正要在国际市场上一争长短,走到华为那一步就很不容易了,因为华为已经做到了工序流程,但是他的评分只有2点7分。可悲的是,我们99%的企业还没有弄清楚华为内部的工序流程的积累。”

“中华文化从大宋王朝开始逐渐丧失创造力,因为宋朝的理学的本质就是考据学,因此从宋朝朱熹之后的八股考试,完全扼杀了我们的创造力,因为他在搞考据。一千年之后的今天,我们还在搞考据,那我们的创造力在哪里?丧失创造力的当儿,你可想象到我们企业的发展一定是困难重重。在文化的束缚之下,你是浮躁的,你是喜欢投机取巧的,只有打破这个束缚你才能发挥创造力。”

有时候在想,现代中国人更是急功近利,普遍都喜欢投机取巧,所以现在中国没有多少好的成果。试想一下,当年原子弹没得引进,“两弹一星”是何其辉煌啊!现在有得引进的呢,像汽车,像软件业,做得怎么样呢?也许要等整个中国环境安定下来,中国人都踏踏实实,中国才会更快更好地发展!
PS:想看原文的话可以进入这里

人生的第一次兼职

说实话,长到这么大,一直都是伸手一族的。这两天在维敏师姐的介绍下,在学校附近的一个科技楼里面做兼职。其实工作很简单,就是打印的资料有一些是打错的,经过更正了的,我的工作就是负责校对好有没有全部更正正确。
虽说简单,可是要一整天边对着电脑对边着资料,久了眼睛就会开始发眩,有点晕晕的感觉。而且在外面做工作就是跟在学校里面不一样,做得不好完全有可能被“叨”,今晚就被“叨”了一顿,晕晕乎。
其实两天就赚了一百多,也算不上多吧,可是真的,接触外面,才慢慢学会怎么做人,学会不敢懒散,学会对自己的老板负责,算是一个开端吧,嘿嘿~

你的大学是怎么过的?

今天在Q上无意中跟一个高中同学扯到了今年就业的事,他说他担心以后的出路(他现在大二),大学很茫然,什么都学不到。“什么都学不到”,这句话突然对我有些触动。
现在有多少人敢说自己的大学时光过得很充实呢?大学生活有相当一部分人是过得很糜烂的,也许这些人会在大三、大四时感受到一丝慌张,但也许晚了些了。年年都有新闻报道说百分之多少的大学生找不到工作而呆在家啊之类的云云,今年更是雪上加霜,金融危机的席卷让我们这些本科生变得更加难以“出售”!我不是什么砖家,我也没那么大的能耐,没有办法去分析这背后的根本原因,我只是在说自己的想法。年年有人一毕业就失业,这并不罕见,很多人把这个责任归根于我们的教育制度。这不假,我们的教育太过于喜欢理想化了,而且更大的“成就”在于扼杀学生的创造力。呵呵,中国老是在强调民族的创造力有多重要,却不知道中国人的创造力大部分在刚上幼儿园的时候就被那些老师给否定掉了。
但是,有多少人能反转一下角度来审判一下自己呢?大学四年,自己究竟学到了多少东西?对于一部分人来说,大学的四年是快乐的,因为高考结束了,很多人以为凭着大学的一纸文凭就是高人一等了,这社会需要什么,需要人才,需要能力,唯独不需要虚无的文凭。当然,“天才都不是科班的,可是不是科班的,却连龙套也跑不了”。
也许很多人并不赞成我的看法,毕竟这社会存在许多的阴暗面。也许社会就是这么不公平,但是我们整天埋怨又有什么用呢,还不如都静下心来,让自己在四年大学光阴中得到更多。我们都没有改变社会、改变制度的能力,我们也没有关系,没有背景,我们唯一能做的就是先改变自己的心态,不要陷入“读书无用论”的怪圈。四年过去了,是能人还是废物,也许就在这时候开始凸现了。

24块固态硬盘联手狂飙



固态硬盘可以有多疯狂?三星近日找来一批玩家,将24块512GB三星固态硬盘装在一套系统内,组成了总容量达6TB的RAID阵列,其速度只有让人咂舌的份儿。试验在Intel的Skulltrail V8双路平台上进行,配置包括两颗Core 2 Extreme QX9775四核心处理器、两块Radeon HD 4870 X2显卡、4GB DDR2-800 FBDIMM内存、两个1000W电源等。为了提供所需24个SATA接口,使用了六个SFF-8087转接头,每个都能将SAS接口转成四个SATA接口,同时由六个MOLEX负责供电,每个支持四块固态硬盘。在经过24个小时的奋战后,系统终于组建完毕,并顺利启动。其中一位仁兄显然有点儿紧张,在一旁拿着灭火器待命。接下来就是极致性能演示了:1、数据传输率超过2010MB/s,也就是2GB/s以上。2、打开六个Word文档只需0.5秒钟。3、打开53个不同程序呢?18.09秒。4、碎片整理不过弹指一挥间的事儿。5、删除总计5.6GB的700个文件根本无需等待。6、把DVD光盘从二楼扔下去和将700MB DVDRip内容复制到硬盘上哪个更快?0.8秒钟,几乎同时。7、在1920×1200分辨率和最高纹理质量下玩《Crysis》轻松异常。8、一只手拎着工作中的24块固态硬盘跳啊跳,没有任何影响。

用XP系统声音做成的音乐,牛强

歌听多了,这样的音乐应该没见识过吧,嘿嘿!下面自个听下。

关于类与对象的一些心得

    我们都知道虚函数为多态的实现起了关键作用,没有虚函数,多态也无从实现了。但是虚函数到时候是怎么做出来的呢,C++编译器是怎么达到动态绑定的目的的呢?

    其实C++编译器会建立一个虚函数表,每一个含有虚函数的类,编译器都会为它做出一个虚函数表,表中的每一个元素都指向一个虚函数的地址,这样在执行期就可以间接调用实际上想要绑定的函数了。此外,编译器还会为类加上一个成员变量,是一个指针,用来指向该虚函数表的(那指针常被称为vptr)。下面是一个例子:

class a{

public:

virtual void vfunc();

public:

data;

};

这样的话a对象实例在内存中占据这样的空间:

    每一个由此类派生出来的对象,都有这么一个vptr。当我们通过这个对象调用虚函数时,事实上是通过vptr找到虚函数表的,再找出虚函数的真正地址。

   虚函数表的内容是根据类中的虚函数声明次序,一一填入函数指针的。派生类会继承基类的虚函数表,当我们在派生类中改写了继承下来的虚函数时,虚函数表就受了影响:表中元素所指的函数地址将不再是基类的地址,而是派生类的地址。这样的话,指向派生类的基类类型指针调用虚函数时实际调用的是派生类所改写的虚函数了。


顺序容器迭代器的失效

    一般说来,会修改容器的内在状态或移动容器内的元素的一些容器操作,会使所有指向被移动的元素的迭代器失效,也可能同时使其他迭代器失效。使用无效迭代器是没有定义的,可能会导致与悬垂指针相同的问题。

    对于vector容器,当我们在容器中添加元素时,因为可能会导致整个容器的重新加载,这样的话,该容器涉及的所有迭代器都会失效。即使需要重新加载整个容器,指向新插入元素后面的那个元素的迭代器也会失效。

    而对于deque容器,在其首部或尾部插入元素不会使任何迭代器失效,而在首部或尾部删除元素则只会使指向被删除元素的迭代器失效。在deque容器的其他位置的插入和删除操作将使指向该容器元素的所有迭代器都失效。

    erase、pop_front和pop_back函数会使指向被删除元素的所有迭代器失效。但swap虽然可以交换两个容器内的所有元素,但是该操作不会删除或插入任何元素,而且保证在常量时间内实现交换。由于容器内没有移动任何元素,因此迭代器不会失效。

    总的说来,任何insert和push操作都可能导致迭代器失效。当编写循环元素插入到vector或deque容器中时,程序必须确保迭代器在每次循环后都得到更新。

关于选择顺序容器的提示(摘自C++ primer)

下面列举了一些选择容器类型的法则:

(1)如果程序要求随机访问元素,则应使用vector或deque容器。

(2)如果程序必须在容器的中间位置插入或删除元素,则应采用list容器。

(3)如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用deque容器。

(4)如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将元素读入到一个list容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器。

如果程序既需要随机访问又必须在容器的中间位置插入或删除元素,那应该怎么办呢?

此时,选择何种容器取决于下面两种操作付出的相对代价:随机访问list容器元素的代价,以及在vector或deque容器中插入/删除元素时复制元素的代价。通常来说,应用中占优势的操作(程序中更多使用的是访问操作还是插入/删除操作)将决定应该选择什么类型的容器。

决定使用哪种容器可能要求剖析各种容器类型完成应用所要求的各类操作的性能。

最佳实践:如果无法确定某种应用应该采用哪种容器,则编写代码时尝试只使用vector和list容器都提供的操作:使用迭代器:使用迭代器,而不是下标,并且避免随机访问元素。这样编写代码,在必要时,可很方便地将程序从使用vector窗口修改为使用list容器。

对于vector容器的一点心得

    vector容器为了支持快速的随机访问,其元素是以连续的方式存放--每一个元素都紧挨着前一个元素存储。看到这里,是不是想真起了数组的存储方式?那这样的话虽然访问比较快速,但我们往容器内添加一个元素的时候,岂不是得重新分配存储空间,用以存放原来的元素以及新添加的元素:存放在旧存储空间中的元素被复制到新存储空间里,接着插入新元素,最后撤销旧的存储空间。假如每次添加新元素都得这样的话,那这种性能将会让人无法忍受。既然这样,那为什么还要设计vector容器呢,因为按这样的话list容器应该优于vector容器啊。但是,通常出现的反而是以下情况:对于大部分应用,使用vector容器是最好的。原因在于,标准库的实现者使用这样的内存分配策略:以最小的代价连续存储元素。由此而带来的访问元素的便利弥补了其存储代价。
    为了使vector容器实现快速的内存分配,其实际分配的容量要比当前所需的空间多一些。这样的话,并不是每次添加元素时都需要生分配容器。这样效率自然比较高。这就是用空间换时间吧。vector类有两个成员函数:capacity和reserve,使程序员可与vector容器内存分配的实现部分交互工作。capacity操作获取在窗口需要分配更多的存储空间之前能够存储的元素总数,而reserve操作则告诉vector容器应该预留多少个元素的存储空间。这里先要弄清楚capacity和size的区别,size指的是容器当前所拥有的元素的个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。这样的话,如果size不超过capacity的话,容器就不用分配新存储空间。通常size是少于capacity的。reserve操作可以增加容器预留的存储空间,但要注意,不可以减少容器原本已经预留的存储空间,只能增加。
    总的来说,比起list和deque容器,vector的增长效率通常会更高。但如果在内存分配比较严格的情况下,选用list容器可能会更好一点,毕竟list容器是采用链表的存储方式的,空间利用比较有效,当然,在读取的时候效率肯定是会比较低的。

输出指向字符串的指针的地址

如果因某个原因要输出指向字符串的指针保存的地址,就必须交它显式强制转换为void*类型,这样就会调用ostream中带有该参数类型的成员函数,将地址发到流中。

const char *pMessage = "abc";

cout <<>(pMessage);

C++中重载和使用增量运算符(++)时应注意的事

假如a为int类型,初始值为10。经过++(++)a和(a++)++后的值为多少呢?我想很多人应该会回答是14。错了,应该为13。而且可能编译通不过。因为前递增运算(++a)返回的是对象引用,而后递增运算(a++)采用值返回。这样的话(a++)++就是错误的了,因为a++返回的不是左值,不能再进行递增运算。

 我们编写类时,重载(++)时就得编写两个重载函数了,因为运算符函数的前缀形式和后缀形式不同。这时候要如何区分呢?我们可以在后递增运算符重载函数的中多加如一个int标识,这个标识仅起到区分作用,没有实际作用的。例如,用任意类object重载++的函数声明如下:

 class object{

 public:

 object& operator++();

 const object operatoor++(int);

};

 前缀形式一般要求返回的当前对象递增后的引用。

 对于后缀形式,先在修改之前创建原对象的副本,再返回执行递增后的原对象的副本。后缀运算符的返回值声明为const,可阻止编译theobject++++这样的表达式。这种表达式会与运算符的一般形式混淆,产生不一致。但是,如果不把返回类型声明为const,这种用法就是允许的。

sizeof()有趣的地方

今天在浏览网页时无意中看到这样一道题:

 #include
 int main()
 {
 int i;
 i = 10;
 printf("i : %d\n",i);
 printf("sizeof(i++) is: %d\n",sizeof(i++));
 printf("i : %d\n",i);
 return 0;
 }

 我一眼看到这题,认定就应该是输出10、4和11。

 编译后才知道我错了,是10、4和10。百思不得其解,为什么不是11呢?难道i++这时并没有运算?

 后来在网上找了好久,才知道sizeof在编译期完成,我们应该把sizeof(xxx)看成一个size_t的常量,其中xxx的运算应完全忽略,sizeof只关心xxx的数据类型而已。看下面:

 char i = 1;
int j = sizeof(i++);
int k = sizeof(i+0.1);
printf("%d %d %d", i, j, k); // 输出为 1 1 8,因为i++并不真正计算,sizeof只关心输入的数据类型,i+0.1被提升为double

 是否超出你以前对sizeof()的认识呢?呵呵