现在的位置: 首页 > 综合 > 正文

毕业后就是程序员《转》

2014年08月08日 ⁄ 综合 ⁄ 共 7386字 ⁄ 字号 评论关闭

再开始我的博客之旅。东奔西跑的忙了一个多月,找工作的事算是告一段落;这段时间有兴奋,有失落,有迷惘,也有开心,是一个让自己得到锻炼,得到提升的好机会,是一段难忘的时光,记录下留作纪念,也希望能给同样要走这一段路的人一点提醒,免得像我一样,当碰得头破血流之时才不得不去承认。先写总的感受,后面针对具体的笔试面试续写。
(1)凡事预则立,不预则废
    事前有准备有计划毋庸置疑,但是也应该相信从前人的经验中汲取学习。我是个倔强且自信的人,我相信准备,却固执的认为经验总归是经验,笔试、面试不可能重复。但考试还就是考试,重点也只有那么些,你还有选择么?那么就准备吧,先送上一篇激励我的文章:《【天道酬勤】
腾讯、百度、网易游戏、华为Offer及笔经面经》
我是计算机专业的,个人认为准备应该有基础知识、平时积累和面试技巧三方面。基础知识,主要是数据结构(非常熟练),算法、计算机网络、操作系统、组成原理之类的重点知识的梳理,要让自己能够流畅而调理的表达出来,最好能用自己的话,自己的理解;平时积累,这个后面还会讲到,主要是对自己过去做过的、学习过的东西的总结;面试技巧,我没有太多的经验可以谈,感觉每次都是失败的,只能以我失败的经验唤起对你的警醒,比如镇静放松,思考,语速慢,保持微笑,大可以搜索到,而后是对常见问题的提前准备,是的,常见的真的会经常被问的,不要不相信,比如项目难点,最有成就的等等。对于笔试真的很多题目就是过去考的,有有变化的,也有连数字都不变得,那么《程序员面试宝典》、《编程之美》之类的书籍绝对是你的必备。不要不相信。
(2)平时积累
    积累不是一句空话,仅仅做过是远远不够的,要善于总结学习,善于发现问题、思考问题,并解决问题。我是个热爱技术的人,想用我的技术丰富或改变我的生活。但是对技术的热爱和使用,仅仅停留在简单的用过的基础上,没有去深入,没有在用的基础上,去改善。怕麻烦是我的缺点,或许当时仅仅以为知道有这么一回事,确认能够实现就已经满足的心态让我停留在表面。看我自己过去写的东西,看到过的,做过的非常多,但是能够去思考,去真正解决想要解决的东西却没有;另一方面,本以为从嵌入式到上层应用都有接触是我最大的优势,例如对编译环境搭建,内核、文件系统移植,各种功能软件的搭配使用,能让我对软件、对系统有更好的认识,但是缺乏对所学所用的总结,让你仅仅是头脑中有模糊的,不连续的影像,你无法顺畅的、条理的讲述出来,甚至本不多的那些影像也随着时间的推移,越来越模糊。结果是可想而知的,找嵌入式和互联网都碰壁,反而成了不专。思考、总结不能忘啊。
(3)针对性
    如果你开始准备得早,有大把的时间复习总结,而且平时积累也充足,喜欢阅读各种技术书籍,那么恭喜你,这个可以略过不看。如果你仅有一月不到的准备时间了,又没有太多的积累,那么我觉得有针对性的参加公司宣讲会和笔试面试会为你提供更多的时间来准备。每个人的看法不同,情况不同,有些人通过不断参加笔试、面试为自己积累了大量的笔试面试经验,并且不断发现总结问题,提高自己,选择合适自己,发现自己所擅长的领域;有些人却是不断得游走各个宣讲、笔试面试场合,不断受到自信心的打击,那么赶紧反思,停止如此做法,有针对的选择剩下的机会,突击前人提供的各种经验资料,为自己争取时间和机会。傻傻的我就是在忙乎了大半月才发现,自己真是什么都投,什么都去试试,想多给自己些机会,却是把时间浪费在路上,浪费在了宣讲会现场;最后居然出现了一天三四场笔试,而且一场出来不会的题,紧接着的一场又出来同样不会,悲剧啊!因此啊,要有自己的针对性,这个度要把握好,既要给自己机会去锻炼,也要留足充分的时间来总结;同时有些宣讲会是绝不能错过的,因为他们只招来参加宣讲的人。
(4)坚持
    这是个不变的经验,要给自己信心,坚持下来去争取。当一家一家自己非常渴望去的公司走过,希望变得越来越渺茫,千万不要就此放弃了,即使产生了对自己的怀疑,也要振作起来去准备,不争取连希望都没有。同样。如果你早早得拿到了offer,也不要被公司的逼签所胁迫,要个保底之类的心态,早早的把自己的三方交给别人,除非它是你一开始的最强烈的选择,很可能因为你的草率让你失去更好的机会,因为有些公司优先选择那些三方在手的。(互联网网大公司一般都会等你,且会给你付违约金的,但是研究所之类的很可能不会等你的。)提醒一下是,别被周围的人鼓动,头脑一热做决定,我们实验室差点一下子一起去签,去保底了,最后证明大家坚持下来的正确。

    最后,其实还有很多,比如你的运气和善于抓住利用机会,个人魅力等等,毕竟笔试面试考察的可能你刚看过的,面试是和人在交流,怎样让人家喜欢和你交流(他们是在找未来的同事,都不想见你怎么会要你呢?!)都是需要自己去注意的。自己不够优秀,仅拿到了标题中的三家offer,有遗憾,但也没有什么好后悔的,把握现在,创造未来。

这篇详细的写写笔试面试的经验,还是接上篇说法,那四点不要忘,要相信。开头就像每次写嵌入式的博文先介绍环境一样,我先介绍个人实际情况。
      专业:计算机软件与理论      学历:硕士  
      项目:一年多的物联网相关,主要是嵌入式Linux和ZigBee、WiFi等;一年多的Android相关。 可以坦诚的讲,了解得足够,深入有限,但对于一般的技术预研或提供部分解决方案应该还是可以的。(原因很简单,没有成熟的产品支撑,都是Demo。) 
      时间:2012年8月底9月初开始准备基础
      实际情况:专业基础知识没有系统复习过,都是本科时期的;没有实习经历或者完整的找实习经历;平时没有算法练习(比如做ACM、POJ上的题,只是听过);参加过一两次程序设计比赛,都是晋级奖、优秀奖;最后可怜的是不常看技术书籍,都是项目需要了现学现用,因此除了几篇博客外几乎没有技术积累。我的情况基本上是一穷二白,大家对比可以确定自己的优势(貌似没有比我还劣势的了吧!)。
    统说
      进正题,说说我的经验。总的来说,先系统的复习专业基础,其中《数据结构》(严蔚敏)是重中之重,其它的可以总结常见的笔试面试题中抓重点复习;抽空看技术书籍,要针对自己的方向选择;最后针对公司多搜集笔经面经中的常见题;如果有必要还有看看行测,特别是智力题。
      锻炼纸上写代码的能力
      表达要有条理,分点细说;可以的话对一些问题思考一二十秒,慢慢说出;不要像我又急于回答,说话又太快。
      心里上要镇静,即使表面上看起来稳重。我是一直没有做到,所以有机会了适当的锻炼。
    细说
      先推荐书籍:
    《数据结构》(严蔚敏):这本必须搞定,纸上没事写个冒泡、选择的吧,最好KMP、快排也写下;然后轻松得处理链表操作,插入、删除、反转;9种排序对比,找人多说说,用自己的话表达出来;其实可以系统的复述其中的重点,我就不一一列举了。其它的如操作系统、网络、组成原理可以抓重点,建议看本考研综合复习的书。如果兼职考研复习辅导,那么恭喜你,找工作一半已经是个体力活了。
    《程序员面试宝典》(第三版),居然强调第三版,是因为虽然大体内容一样,但是第二版还是有不少错误和解释不清的地方,对于不太思考的人要慎重。这本当然是笔试、面试必备之书了,如果实在没有复习时间,那么就捧着它吧,能帮你挡掉不少。
      后面的是根据自己互联网公司C++、Java方向等来看待了
    《编程之美》,比较有意思,其中常考的也只有几个,下面给出;然后是《编程珠玑》的前两章
    《大话设计模式》或HeadFirst的《设计模式》,没有实践经验的只能粗略的了解,常见的单例模式要会写。三类:创建型、结构型、行为型,要能去理解划分,当然不用真的每种模式都非常清楚,但要有能说得上来的几种,而且最好能有实际结合,或者知道Java语言里I/O类的装饰者模式等;最后就是常见的开放—封闭原则、聚合复用等等。
    《Java编程思想》,需要好好的多读几遍,之前我也大略读了,还写了博文,O(∩_∩)O~那写得简直垃圾啊,后面再读,做笔记,真的会发现理解有变化啊。其中的Java内存管理、字符串、内部类、容器不得不看啊,而虚拟机的理解可以看看《深入java虚拟机》,对了将内存回收的可以看看《Java SE 6.0编程指南》中的相关节。
    《C++ Primer》,我主要是看的Java,这本只是部分阅读;但是《深度探索C++对象模型》是看了几次,不管C++还是Java都值得去了解一下,而《C++沉思录》我功力不够,依个人情况吧。
    《TCP/IP详解 卷一》,这个适合没有时间复习原来课本的同学,特别是里面的TCP,一定要细读,能画它的状态迁移图当然好啦;分析分析与UDP的区别。
    《UNIX环境高级编程》、《算法导论》前者写Linux下的程序时是非常好的工具书,而后者据说有些点被问到过,当然有时间平时能浏览最好了。
    《UNIX网络编程》两卷,《深入理解计算机系统》据说都是非常必要看的,只是我个人还没有耐心的品味完,可能我还没有发现到吧。
      没想到,光写推荐的书籍就列了这么长的文字,我推荐的确实是我看到的,你认真的阅读绝不会亏的;如果一开始有些不适应,多实践些,再细细看,细细想,坚持下来,不要书到用时方恨少。下一篇写具体的题的经验吧。

接着上篇,这篇侧重于具体的笔试、面试的问题,至于是哪个公司的就不去追究了,但一定是经常问到的,而且我嵌入式系统工程师和移动开发工程师都参与了,问题要区别看待,那么自然就少了很多对C++问题的考察。
    笔试
    有一个教训是,题目让你编程实现的,不要罗列一大堆思想方法,编程么,就是把你的代码写上去,比如写个非递归的中序遍历二叉树,都知道用个栈就好了,但是还是要写的。
    嵌入式中最常考的就是
   (1)运算符优先级,实在记不下来,每次去前看一遍(没办法,人家非要考)
   (2)用变量a给出下面的定义(《程序员面试宝典》,后面很多题都是其中的),注意a)一个指向有10个整型数数组的指针 b)一个指向函数的指针,该函数有一个整型参数并返回一个整型数 c)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
   (3)结构体占用内存空间大小的计算,然后优化;考察内存对齐(为什么要对齐?),其实不同编译器,不同平台都是有差别的,但既然要考,把基本的弄清楚。
   (4)剩下的对const的理解,#define和inline的区别,typedef、volatile的理解使用以及值传递、地址传递,内存空间分配(堆栈)等宝典上都有。

   (5)这里加两个代码的:a)CPU大小端的判断(要理解)

  1. int check_endian(){  
  2.     union w{  
  3.         int a;  
  4.         char b;  
  5.     }  
  6.     c.a = 1;  
  7.     return (c.b == 1)  
  8. }  

    b)求二进制数中1的个数(《编程之美》),这个很常用,是一些问题的基础,其中a是要求1个数的数

  1. int num = 0;  
  2. while(a){  
  3.     a &= (a-1);  
  4.     num++;  
  5. }  
  6. return num;  

   (6)Java中主要涉及接口、抽象类的理解,异常处理机制
   (7)对内存回收时机的考察(恰当时候,不是一定回收),finalize的执行,顺带的可以和final、finally的理解一起出现,而且注意finally即使在return后面,也照样执行;有些公司考到内存的分代回收,可以了解下。
   (8)字符串常量池的理解,题目的话就是结合new创建对象和==、equal,问你创建了几个对象,判断两个对象是否相同,一般记住new肯定创建新的引用,而是否指向同一个字符串用==无法判断,而单独声明String对象,那么就没有新创建对象。
   (9)String类的+操作,StringBuild的优化和StringBuffer的区别,相类似的对各种容器的区别理解(List,Set,Map),而且会说到线程安全SynchronizedMap和ConcurrentHashMap的区别;至于真的考察Java中I/O类的联合使用,那就靠自己的经验了。
   (10)内部类、泛型、反射好好看看《Java编程思想》,基本应该能搞定。而且你还会看到是否有sizeof,线程之间的协作问题等等。
    面试
    不管答案怎样,面试的心态和表达技巧一定要多学习,不要仅仅回答是或否,要有条理的展开,否则一个小时左右的面试会有各种各样的问题,总有你答的不好的;面试是个人和人交流的过程,但是简单基础的问题千万别错,否则后面一点机会没有。
   (1)必问:进程间通信、写个擅长的排序或者网络公司问个TCP、UDP区别,其实可以从问你DNS、HTTP、Ping等属于哪一层,底层是基于传输层的什么来考察你的;还有就是各种权限相关的,序列化相关,C++的虚函数实现,Java的内存回收机制,强调的是要用自己的话说出来,尽量不要去背。嵌入式的基本nand
nor Flash的区别以及笔试中的大小端、宏定义、断言等问题也常在面试中出现。

   (2)常问在《编程之美》上的如摸石头的游戏3篇, 求二进制数中1的个数 ,寻找最大的K个数,斐波那契(Fibonacci)数列,数组相关的如 求数组的子数组之和的最大值,求数组中最长递增子序列 以及 桶中取黑白球等,很多是原题,也有就是以此为基础来做的; 比如百万级数量的IP段,一个区段对应一个地方(比如北京,西安之类),给一个IP查找确定是哪个地方
   (3)设计模式 23个常用的要了解一下,单例模式要会实现,看看我推荐的书应该问题也不大的。
   (4)Android相关的也是些框架的理解,进程间通信,四大组件的理解使用,从这些问题上看看你到底用到、学习到一个什么样程度,对错估计不是特别在意的。
   (5)非技术性的就是些项目难点,收获,感受,你的优势,证明你的能力之类,还有就是你期望的工作环境、氛围,职业规划,理想;有时会遇到压力的优缺点,把一个MP3推销给聋子等问题。补充一下的是,有时候会从你做的项目中问你对产品的思考,包括UI、功能实现,性能优化等等。面试还是针对公司的特点,多看以往的面经比较好。
    最后要说的是不管你大二、大三,研一、研二,其实对于找实习都是个非常好的锻炼机会,早早的了解自己的优势和需要弥补的地方,同时也能证明你是个用心,早做准备之人,机会是留给有准备的人的,祝你好运!后面会再写一篇关于工作,关于人生道路的选择的。

 前面几篇写的都是自己一点经验的记录,不在于能提供多少内容,只是希望能够相信提前准备,平时有所积累就好。我是一个简单单纯的人,应该也是个缺乏思考的人;对于找工作,没有过多的包装,本来想展现最真实的自己,结果原有的很多自认为优势的都没有展现出来,没有什么后悔、遗憾,人生本来就是一个过程。对于去哪里工作,做什么样的工作,我的老师很实在的说了两种人,一种是善于管理、交际、有城府的人,这样的人似乎到哪里都会有非常好的发展,可以根据自己的兴趣,建议是去体制内的单位,这样的前途发展更安逸;另一种是像我这样老实本分的人,只能去私企,凭自己的一点技术吃饭,否则在体制内就是一颗永远的螺丝钉。我的朋友告诉我很多东西可以学来的,我的老师告诉我很多人的性格就是那样,几十年一辈子都没有变化,我相信他们,也看得清自己,写下来,留作纪念。

      稳定

      稳定的人生,可能是我内心中最向往的。在稳定的基础上,做自己想做的事情,没有必要去在大风大浪中闯荡。可是想做什么事情呢,似乎只有被认可才是想做的事情。我的想法就像我简历上写的,热爱技术,希望用我的技术区丰富或改变生活。面试中有一直坚持的事情,人生理想的问题。理想,显得太遥远。自己曾经也想过为国家的军事现代化做些贡献,但是一次被歼十的一篇报道所震撼。因为从它开始立项,到研制,验证,最后量产是一个非常漫长的过程,很多人可能一辈子就做了这么一件。这样的稳定是很多人希望的,却应该不是我所想要的,代价太过大。还好我也没有这样的机会,这样的单位有着他们特别的选拔人才的方式。O(∩_∩)O~另一个是记得在哪篇博文中看到,一个软件开发人员从银行银行单位跳出,觉得和外界的技术相比,落伍了好几年;不管真假,这样的事情总是在心里留下了几缕丝线,别扭,想抽出来。我想稳定,但我也想我的技术,我想在能干动的年纪,做想做的事情。

      程序员

      读书读到了这样一个阶段,想去转变到其它行业得需要多大的一个勇气和多大的一种热爱。我别无选择。面试中有很多问到职业规划,技术、管理。管理,没有太多好说的,技术呢,技术的方向,从我现在的认知看,感觉很重要。选择服务器、搜索等方向要长久得多,十几年甚至几十年都会一直存在,而Java开发,一般都会涉及的SSH框架,当时的J2ME,现在的Android开发,总是看不到路的远方,谁知道后面还会不会有什么呢,现在云计算不是很火么。我却是不怎么喜欢B/S系统的搭建的,本科的时候就不太喜欢。我庆幸一直有机会做着嵌入式相关的项目,对硬件设计也不再那么畏惧(所以不可能达到芯片设计),我可以实现很多只要自己想要,人们确实需要的东西。寻找这样的一个结合点,是我目前最大的希望。另一点是关于考研和工作(早点成为程序员)的想法,就像凡事都有好坏一样,谁也说不清楚。就像我的本科同学,有好的月薪过万或者项目经理之类,也有在生存线上挣扎的;而现在的同学,好的前途更是一片光明,但也有不知所措的;其实本身都一样,看你根据自己选择一个怎样的生活方式而已。人生么,死是最终的,无论结局怎样,最后你都不会在意的;在意的是现在,在意的是半途中会不会后悔。我想这样一个过程是最重要的,结果那是给别人看待的,已经和自己无关了。

    选择什么样的路,选择和什么样的人走这条路,考虑好;开开心心得走吧!突然想到女友喜欢的于娟的书,真的,乐观的人无论怎样都会开心的,没有什么不能去面对的,走好自己的路。


抱歉!评论已关闭.