开发工程师面试的秘密( 整理自 Export C Programming )

开发工程师面试的秘密   

  因为打算转战linux平台,所以一直在配置自己喜欢的linux操作系统。同时在看那本《C 专家编程》,这本书主要是针对ANSI C 介绍的,所以和Linux(Unix )渊源比较深了,但是还是把自己看的睡着了。所以决定倒着看,首先是附录中的关于开发工程师面试的秘密,收获颇多,就整理一下自己学到的知识,同时也给自己充充电。

1.懂硬件的程序员是很危险的   

  为什么这么说呢,因为硬件是编程最终体现的平台,一个程序员如果还掌握硬件的知识,那么她就可以为所欲为了。将程序稍微烧在一个芯片上,就可以实现很多的功能,可以各种恶搞,还有追妹子。所以建议程序员学习一些硬件的知识,将自己的编程知识运用在硬件上面。

2.面试的侧重点(硅谷程序员面试)   

  “一个典型的面试会持续一整天,包括连续与六七个不同的工程师进行一个小时交流——在这个过程中,你必须让所有的人都信服你的确有能力加入到开发小组中来”。面试的问题不仅仅看中的他们对于问题做什么样的反应,更重要的是怎样做出的反应。面试的人是不是对于一个问题深思熟虑,还是将自己心中的答案脱口而出,面试这在说明自己的论据的时候是否具有足够的说服力。对于自己的答案的明显的策略固执己见还是思维灵活,完善自己的答案。   所以在面试的时候,要认真的思考,想一下面试在考察什么知识,凡事多思考一下,不要让面试管觉的你浮躁的样子或者是没有思考,而是在背答案之类的。

3.检测链表循环

  这一个问题是很经典的问题,如果是面试着直接的给出答案的话,就会让面试官感觉这个人是之前看到过这个题目,面试的效果就显示不出来。其实一般人最直接的想法就是遍历链表,并且做一个标记,如果在遍历过程中遇到自己做的标记的话,那么就是出现了循环。   进一步的思考的话,就是在不允许修改链表,这些数据是只读的,那么我们就不能够使用这一种方法了,而且要考虑一下时间和空间复杂度的问题。   最好的答案就是使用两个指针,从头开始,第一个指针每一次移动一个单位,第二个指针每一次移动两个单位,如果在遍历的过程中出现p1 == p2 ,也就是两个指针指向的是同一个对象的话,那么说明存在循环。

4.深层次的理解代码   

  这里想要说是关于运算符的操作,参考下面的几个语句:   x= x+1;  ++x; x++; x+=1;   最终的结果都是将x加1,但是在实际的编程中还是需要考虑一下上下文环境,会有不同的答案。   对于++操作,我们希望开发人员能够站在编译器的角度去思考:++x表示的是取x的地址,增加它的内容,然后把结果保存在寄存器中;x++表示的是取x的地址,把它的内容装入到寄存器,然后增加内存中的x的值。   

  arr[--j + i++]  += --y;   

  这一句代码翻译成为简单的C++代码:   

  --y;   

  --j;

  arr[j+i] = arr[j+i] + y;

  i++;

5.库函数的调用和系统调用的区别

  函数调用是调用函数库中的一个程序,并且相同的编译器版本,函数库是相同的,同时有些函数是自己实现的;库函数调用则是和用户程序相关的,是在用户的地址空间上执行;运行时间是用户时间,该过程属于过程调用,开销比较小.   系统调用与操作系统相关很大,不同的操作系统系统调用不同,它调用的是系统内核的服务;系统调用是操作系统的一个进入点,在内核的地址空间执行;运行状态是在内核态,属于系统的运行时间,同时需要切换到内核上下文环境,开销比较大;

6.文件描述符和文件指针

  文件描述符在形式上就是一个非负证书,实际上它是一个索引,指向内核为每一个进程所维护的该进程打开文件记录的表格。当程序中打开一现有的文件或者是创建一个新文件,内核都会向进程返回一个文件描述符。文件描述符的概念一般只是在linux unix操作系统中有。文件描述符的有效范围是0~OPEN_MAX,一般来说一个进程最多可以打开64个文件,一些操作系统则没有限制,取决于内存的大小,int的大小,以及系统管理的设定。文件描述符是有无符号的整形的表示的句柄,进程使用它来标识打开的文件,文件描述符与包括相关信息的文件对象相关联,这些信息被称为文件的上下文。对于每一个进程,操作系统内核在u_block结构中维护文件表述符表,所有的文件描述符都在该表中建立索引。   

  文件指针保存的是一个FILE 结构体的地址,FILE 是系统定义的一个结构,该结构含有文件名、文件状态、文件当前位置等等信息。

7.如何判断一个变量是有符号的还是没有符号

  有无符号和是不是负数是完全不同的概念。而且不同的编译平台也不相同。下面采取的方式是针对二进制底层的判断。   

    #define ISUNSIGNED(a)  (a>=0 && ~a >=0)   

  因为所有的无符号的数据都不可能是小于0 的,对该变量取反,原变量和取反之后的结果均是大于0 的,说明它是无符号的。   

  还可以采用一种方式就是   

    #define ISUNSIGNED(type)  ((type)0 - 1> 0)

8.从文件中随即提取一个字符   

  该问题的最常见的回答方式就是遍历文件,计算文件的大小,然后在该范围内随即产生一个数字,提取该字符即可;但是只允许顺序遍历文件一次的话,怎么做 ?   就是在遍历文件的时候就选择一个随即的字符,读入一个字符,怎么随机,也只是这一个字符,然后在读取一个字符,在这两个字符之间随机选取,一次执行下去。

附今日总结:   

  打造自己喜欢的Ubuntu 12.04 (Office &  输入法)   

  今天在新学生活动中心学习一些linux上面的知识,因为喜欢金山的WPS,而且金山也有专门的deb安装包,所以就在Ubuntu12.04上面安装了WPS,打开的时候,因为缺少字体,就找到一些字体安装包,果然是可以使用的。不过问题又出现了,就是输入大太不好使用了,因为输入狂总是在左下角落里,体现效果太差了,搜了一下解决办法,果然是比较好,竟然有linux版本的搜狗和谷歌输入法,就安装上了这个比较习惯的输入法,重启电脑之后就可以了。   

  还有就是今天感觉还不错,上午的时候,偶然发现了一个比较好的框架WordPress,之前听MH同学提起过,不以为意。今天看到一个网站也是用它做的,就向试一下,果然是很豪华的样子。入门应该比较简单,需要在自己的电脑上安装好PHP5.5 + MySQL + Apache环境,然后就是在取WordPress官方网站下载该框架,直接解压到服务器的根目录即可。打开网站的时候,会一步步的提示你,创建数据库表格,不过数据库是不可以创建的,所以我们需要之前在数据库中创建一个对应的数据库,或者是使用已经存在的数据库。   

 

  今天就先到这里了!

追寻梦的飞飞

2013.04.06 于广州

上一篇:设计模式(一)工厂模式Factory(创建型)


下一篇:Python访问私有变量