技术经验分享——给还在迷茫中的程序猿(GDUTCSCW511求职交流会,神牛YJ师兄总结,感谢!)
写这篇分享的初衷:我想把我自己的一些经验分享给大家,希望新人们能少走一些弯路。
这篇文章的由来:2011/11/24 团队内部 求职经验分享 整理后所得。
—————————————我是分割线—————————————————
我的求职结果:
新太实习offer,淘宝实习offer
腾讯offer,深信服offer
—————————————我是分割线—————————————————
言归正传:
作为一门编程语言,相对java、C#,C++入门门槛太高,有些人可能学习了一段时间后还做不了什么东西,导致信心受了打击,进而放弃。在我身边不乏这样的例子,借由韩寒的话说是,人走茶凉,茶都干了,只剩下一堆杯具。可是我要说如果你能坚持下去,那堆杯具中就不会有你的位置。
—————————————我是分割线—————————————————
以下谈一些具体应该学习什么,不包括技术细节。其中列出了一些书单,这些都是我曾经看过觉得不错的书,权当抛砖引玉:
1.
语言的学习。这个没什么好说的,只要能好好啃完《C++ Primer 4th》,基本上语言方面是不会有什么问题的。在面试的过程中,经常会有一些语言特性问题,例如sizeof,static,const,还有重点的类(虚函数表),高级特性(运行时类型识别)。
2.
数据结构与算法。很多程序员不重视甚至忽略这方面的知识。但是,当我们想让我们的程序跑的更快、内存占用更少的时候,这些知识就非常非常重要了。刚开始学习的时候不需要太深入,一些常见的算法和数据结构一定要会。像是数组、链表、二叉树、哈希表等。这里啰嗦一下,像淘宝、腾讯这样的公司,大都会自己去封装一些底层的数据结构和算法,对算法一般比较了解。如果面试连常用算法都不知道(例如快排),那就… (此处省略500字,你懂的。) 还是实际点,推荐两本书,第一本是《数据结构(C语言版)》,此书用C语言描述(感觉比较费话),更加关注结构和算法本身而不是语法,对初学者来说确实是居家旅游必备;第二本是《算法导论》,这本是acmer的圣经,我对此也是一知半解 =.=||| 。这基本是一本数学教科书,每章都会有不少的数学推理什么的,对于理解算法思想有着非常好的帮助。引用一位acmer大牛的忠告:算法讲究的是思想,可能你不能立即写出代码,但必须要理解算法里面的思想,再灵活变通!这句话也被我奉为学习指南。再后来吧,就是练习实践了,推荐一个飘香的做题链接——几个ACM/ICPC做题网站,对于初学者的话,杭电的OJ还是不错的,基础题目比较多,平时无聊就上去切切题。说来惭愧,我在上面也只是A了100多道题,可以作为平常脑力锻炼活动。当你心情不好时,还能切切水题(比切水果好多了),必定心情舒畅、笑口常开,一口气上7楼都不气喘(好像有点过了) …
3.
数据库。毫无疑问,现在数据库已经成为程序猿的必备基本技能之一,如果现在你还不会,出门你都不好意思说自己是程序猿,攻城师了。不过数据库也有好多,这里首推MYSQL。原因嘛,第一这个是开源的,可以自己定制或二次开发;第二还是因为它是开源的,企业里面很多会用它在作为后台的数据库,这不要钱而且还能自己改改玩玩的东西,谁用谁知道啊亲!PS:淘宝基础架构平台里面就有个专门干这事的小组(MYSQL数据库组),现在这些定制过的MYSQL数据库正像撒了欢的兔子一样跑在成百上千的PC服务器上呢。
4.
多进程/线程。前阵子写了一篇论文《服务器中的多核计算》,CPU的主频极限是4.0GHZ(如果技术没突破的话),即已经不能遵循摩尔定律了,多核将会是CPU的发展趋势(现在普遍双核)。要有效利用CPU资源,开发高性能应用程序,提高用户体验…(省略500字),总之一句话,多进程/线程很重要!个人建议还是先透彻的理解进程/线程的相关理论,例如进程/线程切换时候占有的资源(传说中的切换开销),进程/线程通信/同步的机制及相互的区别(思想很重要,面试经常被问到)。在一个后台服务器程序中,多线程/线程池太普遍了,尤其是在Linux下对于接收到的数据包分发处理问题,标准的处理方法是:1个任务队列,1个线程池(理想线程数量:2 * CPU个数)分发处理任务,可以达到高并发高响应。这个思想跟windows完成端口简直就是异曲同工。
5.
网络编程。这个也是很重要的一块,也是在高性能服务器方面很容易成为瓶颈的一个点。这里说的当然是基于socket的,稳定高效的特性无疑让它成为企业应用中的宠儿。由于我专注于这方面,看的书还是比较多的,这里就推荐4本书吧,前两本是偏向理论的,后两本是偏向具体开发的:第一本是《计算机网络》,老谢编的。对于初学者来说相当适合,不仅能对计算机网络可以有个概念上的认识,多看几遍还能应付期末考试(当时我看了不下8遍),这一石二鸟一箭双雕的好事都让咱们碰上了;第二本偏向理论的书是《TCP/IP详解卷1:协议》。这本(系列)是网络方面的圣经啊亲,没准买回来放在台面上都会大大增强自己的信心!如果非得让我用两个词来形容它的话,那就是博大精深(词穷了 =。=)了。首先是博,涵盖了计算机网络的多个层次和协议,从数据链路层到应用层,从PPP协议ARP协议到TCP/UDP再到FTP/SMTP,应有尽有!再是深,从IP层的路由选择原理到动态选路协议,从TCP的协议头解析到三次握手,从有限自动机到滑动窗口,从往返时间RTT到拥塞避免算法再到TCP定时器。如果知道这些,面试神马的都是浮云,没准你还能给面试官上一次“别开生面”的课啊亲!当然如果不是专门搞这方面的,大致了解一下TCP内部原理即可。第三本是《windows网络编程》,此书是在windows下的权威,侧重实际编程。着重掌握编程模型,select啊、基于消息、事件啊、重叠啊,完成端口啊必须要知道,尤其是这些模型的优缺点(它们是一步一步演化过来的)。第四本是《Unix网络编程》,跟windows那本差不多,着重讲在Unix/Linux环境下网络编程。个人觉得网络可以脱离平台性,都差不多,就是接口有一些不同而已。如果不是专门搞网络这块的,建议老谢的《计算机网络》和根据自己平台选择Windows或Unix/Linux网络编程。
6.
库。C++标准库仅仅提供了一些很基本的功能,所以我们经常会引入一些第三方库。最著名的恐怕就是被称为准标准库的boost库,它提供了我们编程中用到的各方面的技术,文本处理、算法、网络、多线程、图像处理等等,几乎无所不包。像前面提到的,大公司一般会自己封装库,如果在熟悉了一些第三方库以后,更应该看一些源码方面的,至少懂得思想。像侯捷的《STL源码剖析》就不错,可惜我也只是看过vector方面的一些思想和源码(掩面…)。
7.
操作系统。在Windows或Linux下编程,少不了和操作系统打交道,而我们知道的应该远不止应用层面上的。如果游戏开发,客户端方面的,首推《Windows核心编程》。此书从基本概念入手,全面系统地介绍了Windows底层实现机制、Windows应用程序的基本构件以及各类WindowsAPI等,并列举了大量应用程序示例。如果是搞服务器,分布式等,推荐两本书:《鸟哥的Linux私房菜》,这本是入门级,通俗易懂,诙谐幽默。很适合初学者学习,只需要花2个多星期就能略读完,可以有个大致的概念。另一本则是Unix/Linux程序猿的圣经读本,照网上的说法是常备床头,每天睡前都要膜拜一下的权威——《Unix环境高级编程》。此书不适合初学者,应该是高级进阶读物,据说每天膜拜还能攒RP呢亲!
8.
项目经验。对程序员来说,项目经验更加重要。一个好的项目可以让你把各种技术进行综合运用,并且能学到一些新的知识。如果能进学院的团队,那是最好,自然有一些项目练手。如果没有的话也不要紧,找几个志同道合的一起研究搞个项目,学校也可以申请一些项目,在不行就上论坛找别人研究过的一些课题自己搞… 如果有心的话,项目应该不是一个大问题。但相同的项目最好不要做第三次,比如**管理系统,做再多也只是重复劳动了。
9.
进阶。说了不少的好书,但这些还是不够的!如果说书籍是系统的学习,那论坛就是分散的提高。或许这就是辩证统一吧,两者缺一不可:书籍大都是系统但相对“过时”,论坛里面有最新的解决方案但往往是一些独立的方面。推荐几个经常上的论坛:ChinaUnix、CSDN(很多排名靠前的博主有很靠谱的技术博客)、伯乐在线(职业规划,业界新闻)、hackchina(一直使用的源码搜索引擎,很多好代码好项目在里面)、豆瓣读书(如果不知道读什么的话,上去转悠转悠就知道了)。
好吧,现在万事俱备,只欠东风了。如果说面对这么多学习内容,有什么好办法的话,那我觉得就是坚持 和 技巧:坚持在一个较窄的方向学下去,因为大学的时光不长,朝三暮四根本没办法学的深入(排除精力旺盛的神人)。技巧的话也是平时积累的,譬如1)google搜索,别以为很容易,随便打个“为什么***”就在那里一页一页的找,最好知道搜索引擎如果工作,抽离出简洁的关键字,这样查找起来精确率会很高;2)做笔记,你可能不需要发博客,但要记下所犯过的错误,及时总结。虽然这会花费一些时间,但是经验告诉我相当值得的,谁知道哪天你又在同一条沟里翻了船呢;3)到论坛上发问,对此我曾经就UDP可靠化方案跪求过,很庆幸得到了某位在这方面有过几年经验的大牛的精简可行方案。论坛上有很多热心的人,如果能好好利用这笔资源将受益不浅。