Friday, November 25, 2005

招聘的广告

如今,看国内的招聘广告几乎清一色的薪水面议,
我不知道是这些用人单位在炫耀自己有多么出色的评估能力,
还是什么别的原因,
比如,你在面试时越能蒙,我就给你高点,不然少点。

也许是这些雇主认为现在求职的人多了,
自己的买方市场,
总会有人来找这份工作的,
难怪企业都是短命的,
活过了十来年的也是浑身上下没一处还是完好的。

Thursday, November 24, 2005

嵌入式linux系统

嵌入式linux系统涉及颇多,
诚如《Building Embeded Linux System》一书概括的,
嵌入式意味着要从软件和硬件两方面进行开发、编程和调试,
Linux系统需要有Unix系统管理任务,如硬件配置,系统设置维护及用shell脚本自动化,
嵌入式Linux系统更多的还要知道开发调试各种Linux设备驱动,及内核操作,
大凡在Linux下开发不可避免地要有效使用GNU工具包括各种不同工具的诸多选项。

人云“不谋万事者,不足以谋一时”,
一旦想要涉足嵌入式Linux系统这个领域,
就应当就上述各方面进行布局,
并不断操练提高,才是长久之计。

《Building Embeded Linux System》是一本不错的总纲,
还提供了一个几乎可套用的worksheet,值得一阅。
《Linux Devices Driver》则是一本专门讲述Linux下设备驱动开发的书籍,
其它方面实在还没找到很经典的,gnu官方网站的文档值得关注。

Wednesday, November 23, 2005

STL容器的内存增长

在C语言中,如果我们分配了一个能容纳10个元素的数组arr,
如果arr中已经含有了10个元素,我们又想向其中加入一个元素,
这时就需要进行内存重分配了,
向C++标准STL容器添加元素同样会面临类似的内存增长问题。

完成上述所需任务,我们需要做以下几件事:
1.分配有足够空间的一块新内存;
2.把原数组所有元素复制到新内存;
3.销毁原数组的所有元素对象;
4.释放原数组所占内存空间。

由上可见,内存重新分配后元素通常都不再保存在原有的内存地址,
内存重新分配捎带进行的元素复制代价不菲(复制元素,销毁对象、释放内存)。
C++把内存管理的重任从程序员肩上挑了过去,
每当调用insert或者push_back/front等添加元素到STL容器中会自动判断是否进行上述4步。

可以想像出,如果在内存重分配前用一些指针变量保存了数组arr的元素地址,
在进行重分配后,这些指针通常都将指向无效的地址。
向C++的STL的容器中加入新元素时,
此前保存的迭代器变量遇到内存增长后也将是无效的。

避免内存重分配在程序运行效率、正确性方面都有重要意义,
如果在C++程序中确切知道某个容器需要容纳的元素总数,
可以直接用reserve成员预留出足够的空间,
使其后向其增加元素不会引起内存增长。

Tuesday, November 22, 2005

你是不是故意的呀?

记得韩国人李健熙刚从日本学成回国接掌父亲留下的三星集团,
向日本藉的员工发飚:
听说你们日本人做事向来都很认真负责,
做出来的产品都讲质量的,
可是为什么你们在三星做的却不是这样,
是不是你们只给日本做才可以做成那样?
底下的日本员工这样回答他:
不是这样的,老板,
我们也想认真负责,也想把产品做好,
可是决策层今天要我们做一台冰箱,明天又让我们搞个电视,
忙不过来呀,老板。
于是小李子说:好吧,从今天起你们就给我只做一台电视,
于是三星就把所有的精力砸在那台电视机上,
做出质量过硬的电视后,三星又把精力放到另一个数码产品上,
于是三星就从一个不怎么起眼的N流企业慢慢地挤到一流。

小时候课本上也讲起宴子出使齐国(或者是楚国,记不太清了)说过,
桔子到了北方结出来的果子就变成了枳子,
可是如今我们有时候还是不能好好理解其中的玄机,
有时候我们还会这样说:
那小子在学校时考试年年都披红挂绿,没想到如今竟然怎样怎样。
你小子原来在我的项目组做的东西狗屎不是,现在做得这样好,是不是故意呀?

我想这样的话说过一次是可以原谅的,因为无知嘛。
如果重复地又说了一次也可以原谅,因为不小心了。
如果说过或听过两次以后自己还要说,那就有点悲哀了,
倘若乐此不疲地逢人就说,那是无可救药了。

别人考试老不如你,那仅仅是过去,
可能是那时人家因为无知或者幼稚没怎么去好好学,
也可能是方法不当学得效率很低或者其它什么原因,
但是如今人家不是也不需要跟你比考试了,你干嘛还这么无知?

人家在你手下的时候项目是由你来支配的,
也许做出来的烂东西正是按照你想法来做的,
也许你没有发现并发挥人家所擅长的能力,
总之你应该羞愧自己而不是去追究别人。

Sunday, November 20, 2005

STL的删除算法

从STL容器中删除元素对不同容器有不同的考虑,
使用不当可能会降低代码的效率,甚至产生无法预期的后果。
因为关联容器的erase成员返回值为void与其它STL容器返回值不同,
《Effictive STL》的Item9就总结了各种情形下的用法:

删除容器中等于某个值的所有元素时,
对连续存储的线性容器用erase成员套remove算法,
list有自己的remove成员可直接使用,
关联容器的erase成员可直接完成。

删除容器中满足某个谓词的所有元素时,
线性容器用erase成员套remove_if算法,
list的remove_if成员可以搞定,
关联容器可以用效率低下的remove_copy_if后接swap算法,
或手工循环并在调用erase成员时对迭代器使用后缀的++自增运算。

倘若在每删除一个元素时还要做点其它工作,
对线性容器可用手工循环,每次要用erase返回的迭代器位置更新,
对关联容器,需要同删除满足谓词的容器元素相同地后缀++的erase。

STL的某个实现版本的remove算法先调用find找到某个迭代器位置,
如果是序列末则返回该迭代器位置,
否则返回对该位置后面的子序列调用remove_copy算法,
给定的目标起始位置为find返回的迭代器位置。

同版本的remove_copy实现用for循环遍历输入的序列,
遍历每一步测试如序列元素值不与输入的值相等则把该元素赋值到目标迭代器位置,
同时目标迭代器位置前移,
最后返回目标迭代器位置。

remove_if和remove_copy_if的实现类似,
只是测试的条件用输入的谓词代替了等于运算符。