说实话,从通信转软开,需要补的基础知识有点多。虽然本科时候多少也涉及一些,但全是皮毛,没有深入研究过。比如,TCP的三次握手发生在哪个函数中,如何查看每个报文送达后C/S的状态等看似简单的东西,都不会。一下子要研究这么多的东西,建立一个知识体系是不太可能的,更不要说一蹴而就。但凡事都会有一个过程,其无外乎都是从一开始的白纸,到知道一点、一些,再到全面获知。过程更像是一种螺旋式上升的途径。主要原因是,根本没有老师带领,凡事只能靠自己,比如说看人家的博客、经验贴、请教、听学长学姐的过往经历等等。这就非常考验个人捕获信息的能力。我想说的是,如果你真想转这方面,需要一点如下的品质:
兴趣
这个词真是老生常谈了。自打大家进入学堂门,长辈们便告诫,兴趣是最好的老师。要对学习感兴趣。试问能做到的,又有多少了,至少我没有做到。这里的兴趣,可能就有点牵强了。采用排除法,寻找一下自己所仅存的一点兴趣是什么。首先,对自己学术专业着迷嘛,其次,工作定位是什么,产品、销售、服务、技术。技术里面又有算法、开发等。开发又包括软开、测试、运维等。待把他们从左至右按最不感冒排序,那么最后一项就是你兴趣所在了。额,这种测兴趣的方法有点牵强,但很实用。因为一旦确定了自己要从事的、仅存感兴趣的技术,就要一路走到底,打死也不要改。
目标
目标实在太重要,它就像海上的灯塔,指引船只前进的方向。比如,我所定位的是C++后台开发方向,最终就想进入XX厂。这里有个小插曲,因为室友非常想进XX厂,于是自己暗下目标,要替室友完成进入XX厂的心愿。哈哈哈,我也觉得好搞笑,但却是真话。
坚持
有了兴趣,目标也在那里,那接下来关键就是坚持啦。这一步非常的漫长,很多人由于目标不明确,在这里会迷失方向。又有一些人,因为找不准最有效的途径去学习而放弃。在大家的脑海里,一定会觉得要以最短路径到达彼岸,也就是不走弯路或少走弯路。试问,对一个初学者来说,哪有不走弯路的。走点弯路是正常的,也是必要的。否则,容易达成目标会使人膨胀,不去珍惜所获得的成果,当然也就容易失去。此外,还是想再次声明,学技术如烹小鮮,切莫翻来覆去。既然选定了,就要一路走到底,走到黑。
我想还是有一部分学弟学妹在找工作的途中想少走些弯路,至少不要偏离前进的大方向。于是作为一名刚完成求职的应届生,将针对自己求职过程中如何去准备与该学些什么、面试官交流中的问题与后感、签约选择等三方面作相关介绍。求职方向主要针对C++后台开发/C++开发岗位。但很多东西都具有共性的,只要抓住了如何学的方法,便可以加之推广开来,我想求职其他岗位的准备方法也就大同小异吧。
工作性质:软件开发工程师
工作岗位:后台开发(偏网络),C++开发
必备语言:C/C++
掌握的基础知识:C/C++语言特性(基础语言特性,STL库,面向对象思想,泛型编程),数据结构,常见的算法思想,网络通信(socket套接字联网和进程间通信),操作系统(指Unix或类Unix),数据库,通信协议(如tcp、udp、http、https、dns)。
建议阅读书籍:
《后台开发核发技术与应用实践》腾讯资源后台工程师,徐晓鑫编——这本书应该算是后台开发基础知识架构型书籍,除数据库外,都有涉及,但都不深入,建议以下面书籍作为补充。会很好建立知识体系。
《C陷阱与缺陷》
《C专家编程》
《C++ primer》第五版(扫盲)
《effective C++》,此书使人对OOP思想和泛型编程思想的思考上升一个台阶
《STL源码剖析》或者《effective STL》
《数据结构:思想与实现》上海交大翁惠玉老师版,一定要认真读完,再跟着练几遍。
《剑指offer》
《程序员面试宝典》
《鸟哥的Linux私房菜》
《Unix网络编程》卷一和卷二
《Unix高级环境编程》
《TCP/IP详解》卷1,要是把卷2、3也看,应该可以妙杀同届求职者啦。
《大话http》
《SQL技术内幕InnoDB存储引擎》有选择性看
《高性能MySQL》有选择性看
《Redis实战》
《Docker实战》
《大话设计模式》或者《设计模式》有选择性学几个模式,毕竟脱离工程去学,好难啃。
常浏览的网站:leetcode,牛客网,CSDN,博客园,github,菜鸟教程:http://www.runoob.com/
忠告:光看的话,那真就是纸上谈兵;一定要边学边实践,入门时,只会是模仿,总结,记忆,理解。过程很难,但一定会很有成就感。勤学如春起之苗,不见其增,日有所长。祝福、加油!
求职的岗位以及该准备的书籍等都具备了,接下来就是该怎么学习它们。这方面的学习真是仁者见仁,智者见智。有人天生阅读速度快,做起事来从不拖泥带水,那太棒了,比一般人起步就领先一大截;有人资质平庸,但却勤奋好学,驰而不息,是可以上岸的;有人做事慢条斯理,但却十分有计划,可以坚持,仍可以上岸的。不管怎样,只要肯学、肯实践、肯坚持,就一定可以上岸的。不太记得哪个大牛说过一句狂话:以绝大多数人努力程度之低,还谈不上拼天赋。这话虽然有点瞧不起人,但固然有它的道理。
接下去,我以自身的学习经历讲述一下该如何学,一家之言,自然有不足的地方,其中难免有败笔。还请看客们结合自身情况,取其精华吧。
首先,重中之重的是编程语言。很多人觉得编程语言不重要,重要的是数据结构、算法思想。感觉有点不太对头,但又不太好回怼这句话。不管怎样,掌握语言及其特性很重要。至于是哪种编程语言,这倒真没什么关系。这里只讲述自己熟悉的C/C++如何学吧。想必大家多多少少都会有些C语言的基础,这就够了,至于能用到什么程度,不好说,哈哈。要知道,Linux的创始人也只用C写东西,在下服,服的五体投地。建议大家C++的参考书籍就用《C++ Primer》第五版。这版之所以重要,是因为它最先加入C11特性。像智能指针、lambda、bind、无序容器、pair类型等等都成为C++标准的一部分。而且公司面试时,还会问你有了解过C11特性吗。如果学习的起点是以C11开始的话,这些都将不再是问题。书籍一看就有点厚,想必也吓跑一大批人啦,哈哈。
这里还是要说明一下,如果只是用C++来练练算法、数据结构、装B啥的,只需要看到12章就行。但如果想从事C++开发,怎么能忽略类的内部特性呢(第13章);既然数字运算可以用加减乘除,那么自己定义的类也应该要实现相应功能,所以运算符重载也就避免不了(第14章);C++与C最大的区别就是面向对象,如抽象封装、继承、多态三大特性,能不重点了解嘛(第15章);同样是vector或string或list或deque或map或set,只是内部元素类型变了,其他接口都一样,根本没必要为每个不同元素类型的容器重新写一大堆重复的代码,为了偷懒,可以使用template泛型编程特性(第16章);第17章真可以放一下;异常怎么会发生,发生了是直接宕机还是忽略,值得思考;命名空间有助于避免相同名称误用;多重继承与虚继承,两者相生相杀,而C++标准采用中立的态度,既不偏坦含虚继承也不宠爱多重继承,乍一听,十分有趣是吧;所以还是有必要看一下第18章吧。至于19章,看了容易忘,你想怎样,仁者见仁喽!
建议大家花2至2.5个月的时间,重头到尾精读一遍这本书,无论是知识点好还是课后习题也罢,至于课后习题的答案,可以参考链接https://blog.csdn.net/misayaaaaa/article/details/53786215 。当然,有些知识你当时理解不了,这或许并不是你的错,可能是它确实没有讲清。我就清晰记得,第7章的最后一节讲static关键字特性。看完一遍,没看懂,第二遍还是没看懂,直至看了N遍还是没看懂,我才意识到书的表达意思可能并不清晰。但给我留下了十分深刻的印象,直至我在《C陷阱与缺陷》加多个博文才将static关键字的特性弄明白,可参考我之前的总结,链接https://blog.csdn.net/TT_love9527/article/details/81537466 。此外,千万不要以为看一遍就可以将此书置之不理了,大错特错。这本书应该放在你最显眼的地方,常回家看看。
接下来建议《C陷阱与缺陷》,这本书很薄,但东西却很实在。适当可以看一下这本书的来历,就会发现它有多牛叉。语言的特点,如词法、语法、语义,对于非科班计算机或软件的同学来说,还是非常有必要知道一些的。除非你学过编译原理,否则本书将针对我们容易犯错的地方进行高度的凝练,值得拥有。印象最深刻的除static外,还有优先级表的记忆。有谁会记优先级表呀,第一,我们可以查,第二,表中东西太多,难以记。看完此书,就会发现优先级表的记忆根本不是问题啦。首先单目运算符优先级最高,不容置疑;其次双目运算符,包括算术、移位、关系、逻辑;最后是条件运算符(三目)。OK!《C专家编程》非常不错,这本书解决我好些困惑的问题;如复杂类型声明,有关这点讲的真是透彻,如数组与指针的区别,如typedef、typedef struct,如动态与静态链接库的作用,如编译的四个主要过程,如讲内存泄漏讲到你感到后怕等等。这本书结合《C陷阱与缺陷》,两者相得益彰。
怎么说着说着就说到了C呢!不是只说C++么。我也不知道为什么跑题。只是觉得好,非常有必要看,才推荐。紧接着,要推荐《effective C++》和《STL源码剖析》这两本经典书籍。前者使你对C++的面向对象、泛型编程及其他细节特性有一个质的跃变。后者使你对STL库的使用得心应手。如果说STL库是C++语言的百宝箱,应该没人反对吧。《effective C++》书主要讲述C++极其重要的语言特性,如this指针、virtual、const、inline等;如何设计一个好的接口;如何设计一个好的类,这其中又讲述OOP思想,加深对OOP思想的理解;泛型编程中需要注意的问题。感觉这种书籍第一遍看都会有些吃力,一方面是作者写的太好了;另一方面也说明自己对C++语言的认识还只停留在表面上。任重而道远,需要坚持!关于于STL库,只看《STL源码剖析》就足够了。对于STL库需要把握其三大特点:容器、算法、迭代器。有人说,会用STL库就行,何必需要理解并重复造轮子呢。每每听到这种话,都懒得反驳。道理很简单,因为每种付出都不会白废,付出的成果或许会在以后潜移默化的影响你。好吧,点到为止即可。
对语言特点的理解,如果能在融入做项目的过程中,那简至再好不过。虽说这样也会耽误项目进程,但对其理解和记忆肯定是最佳的。由于没有项目的依托,那就多看看前人写的书,一定要看经典书籍,这非常重要。除上述推荐必看书籍外,还有梅耶大师另两本《More effective C++》、《effective STL》,惨愧,我也只听其名,还没行动起来。
程序等于数据结构加算法,嗯,I got it!数据结构,想必IT人都上过这门课。回忆本科时上课的片头,只想说呵呵,水的自己都不好意思承认上过这门课。至于采用什么书,我想说的是,看自己最熟悉的数据结构教材就够了。建议编程基础扎实的同学,快速过一遍。特别是查找算法、内/外排序、二叉查找树、AVL树、红黑树、B/B+树、DFS/BFS、prim/Kruskal/Dijkstra、查并集等等。如果基础薄弱的同学,建议提早准备,精读一遍非常有必要。数据结构实在是太重要了,用太多的文字描述它都显得苍白无力。
算法,咋一听上去有点高大上。但我所说的并不是什么高大上的算法,也不是指算法岗的算法或机器学习之类的算法,别想多。而是说实实在在解决一些问题需要用到思想。这里的算法多多少少考查一些数学能力。可能我们马上可以想到,动态规划、回溯法、递归等;又如以时间换取空间或以空间换取时间;又或如将数学玩到极致,直接既降时间又降空间。如何去学习它,又以用什么资料作为辅助?个人推荐leetcode网站和《剑指offer》一书。leetcode上的题目现已有700+道了,若全能刷一遍,妙杀同届求职者应该不成问题。但是大家的时间有限,除了自学计算机知识外,想必还要完成自身学术科研任务,甚至还要帮老师打打杂,出个差。所以在短时间内刷完leetcode上所有题题几乎不太可能,大神除外啦!个人建议只刷Top 100 Liked questions就可以了。但需要记住一点,需要经常总结,找出题目隐含思想中共性的地方,然后多刷几遍,多刷几遍。有关算法题目的书籍建议看《剑指offer》。书中题目真是良心题,面试高频题,所以其价值和意义是显而易见的。
学后台技术,请远离windows,远离windows,远离windows。当前后台开发环境基本上都是在Unix系统下,所以用windows学习有点格格不入,越学到后面越是灾难。建议尽早尝试linux吧,越早越好。早点装个ubuntu或centos,也请尽快适应。如果在这方面完全是个小白,可以阅读《鸟哥的linux私房菜》第四版。截止目前,大陆还没有第四版纸质书,需要电子档的,可以邮件形式问我要哈([email protected])。这本鸟哥写的linux学习书,只是让你熟悉怎么去用。说白点,其知识只停留在表面上。在这我列举一下常用的linux命令(不打算在这里细究命令的作用,如有需要查询,可参考链接:http://man.linuxde.net/),以供参考吧。如cd、ll、cp、mv、rm、touch、cat、mkdir、type、find、which、whereis、locate、vim、gdb、gcc、g++、clear、tar -xvfz(解压)、tar -cvfz(压缩)、awk、sed、grep、netstat、top、tcpdump、vmstat、ipcs、ipcrm、dd、losf、strace、df、diff、patch、ifconfig、ps -aux、kill、man、echo、nl、who、head、tail。
接下来操作系统必看的书藉是《Unix高级环境编程》。这本书是配得上不朽之作的美誉,也是程序员必备的床头书。建议阅读此书时,一定要与实践相结合去记忆与理解。网上有人说,这本书就像是在讲每个linux命令的内部结构,不肯否认,初看之下确有这样的味道。好想将其中重点的东西相应挑出来单独讲讲,但这样做又与精读全书又什么区别呢!耐下性子,精读一遍吧。一定会有意想不到的收获。
协议是后台开发十分重要的模块。针对网络通信,主要了解传输层及其以上的协议。如TCP、UDP、ICMP、HTTP、HTTPs、DNS、FTP等。这里推荐的书《tcp/ip详解》卷一。此书更侧重传输层与网络层协议的讲解。想必大家多多少少都接触过计算机网络这门课,所以对每层协议及相关技术都有一定的认识。因此在阅读《tcp/ip详解》卷一时,建议大家主攻tcp、udp协议,特别是tcp。不要放过其中的任何陌生细节。举个例子吧,当通过tcp三次握手建立连接的过程时,针对第二次握手产生丢包现象后,服务器会作出如何响应?这种问题在面试过程中是十分常问的。因为面试官觉得该现象在实际网络中十分常见,所以他觉得面试者连这个都不知道会有点不可思议。但事实是,个人只在单机或实验室环境下观察网络状态,基本上都是正常现象。这种网络故障现象,书上会涉及吗?我想是会有的,但需要十分仔细才会发现和理解作者阐述的问题。如果需要知道答案的同学,可以参考我的相关博文,链接:https://blog.csdn.net/TT_love9527/article/details/82903285。
有关Http协议,之前参考的书籍是《后台开发核发技术与应用实践》。感觉此书都有涉及,但却不够深入,所以同学们还可以结合《大话http》。相应http总结链接可以参考:https://blog.csdn.net/zhangxiao93/article/category/6447016。
网络编程讲述着网络主机间如何互连互通以及主机内进程间的通信,在后台技术中处于核心基础地位,其重要性不言而喻。市面上有着书籍真的太多大多,但经典书籍屈指可数,这里尤为推荐《Unix网络编程》卷一卷二。卷一主要讲述套接字联网技术,即通过套接字将各主机互连互通。在卷一的学习过程中,将可以深入了解到何为客户机或服务器、有哪些常用套接字、不同传输协议如何使用、如何写一个服务器、服务器有迭代、并发、进程池、线程池等多种类型、套接字选项是什么如何用、五大输入/输出函数、并发C程序思想(如何开进程/线程、如何进行线程间的关系)等等。卷一的学习真心可以将你对网络的认识提升一个台阶,这也是W.Richard Stevens写的书为什么如此经典的原因。
既然能有毅力看完卷一,不妨再进一步,把卷二精读一遍。卷二主要讲述进程间通信IPC。常用的进程间通信方式有管道、消息队列、共享内存、RPC等。这里作者并行讲述有IPC通信方式的Posix标准和System V标准。我们针对共享内存的通信方式,多说一点。所谓共享内存,即开僻一个共有的内存区,大家往这块区域写或读信息。如果大家只是读信息还好一些,因为信息就摆在那,你上一秒读的内容与下一秒读的内容完全一致。但如果是对共享内存写信息,这就存在很大麻烦。因为你写的时候,别人也写,或者你写的时候,别人读,这就乱套了,对吧。怎么办,必须要引入锁机制防制出现这种乱套现象。这也是共享内存优劣势十分明显的地方。使用共享内存通过减少系统调用及拷贝操作来提升速度,但需要引入锁机制从而增加设计逻辑复杂性。这下就非常清晰了,在介绍共享内存模块时,就必须先介绍同步模块。相应地,同步模块包括互斥锁、条件变量、读写锁、记录上锁(通过fcntl函数实现)、信号量机制(需要与互斥锁进行区别)等等。这本书非常经典,以至于多年来,少有知识对其进行补充,所以这本书的唯一作者属于W.Richard Stevens。
据小道消息所知,W.Richard Stevens本来还打算写《Unix网络编程》卷三的,但不幸于1999年9月1日去逝。无法见到卷三了,希望网络技术大师W.Richard Stevens在天堂幸福。
有关数据库知识,也是非常重要的。所以也需要尽自己最大能力去掌握。至少数据库常识知识还是要非常熟悉。有关关系型数据库书籍,不太好推荐,图书馆应有尽有。在此,我列举了一有关数据库的基本知识以供参考,并给推荐几个非常好的链接供大家学习。
关系型数据库的基本知识:
i、Innodb(MySQL的默认引擎):支持事务、行级锁、外键、支持一致性非锁定读(不太理解)
ii、MyISAM
iii、performance_schema
A原子性:要么全执行、要么全都不执行
C一致性:不改数据库中数据一致性,例如:a+b=10,a变,则b也变,而且结果仍然是10。
I隔离性:事务与事务之间的执行相互独立,互不影响。
D持久性:事务执行成功后,其更新便是永久性的,不会无缘无故的回滚。
DML(data manipulation Language):select、update、insert、delete
确保数据完整性的约束还有,主键约束、唯一键约束、非空约束等
聚集索引和非聚集索引,其本质都是B+索引。
其区别如下表示:
聚集索引,其叶子节点存放行记录数据,即叶子节点也称为数据页,也就是说表中数据也是索引的一部分。其特点是一张表只能拥有一个聚集索引。在Innodb中,会以每张表的主键为准,生成聚集索引,如果表没有主键,会根据某列自动生成默认键,从而构建聚集索引。
非聚集索引,其叶子节点并不包含行数据,而是除key值元素外含一个书签(指针)指向相应的存储地址区。据了解,利用非聚集索引查找,最终还是要回归到聚集索引查找。非聚集索引可以创建多个,其创建命令:create index …
从程序员角度上看,
乐观锁:假定不会发生并发冲突,只在提交操作时检查是否违反数据完整性(利用版本号验证)。
悲观锁:假定会发生并发冲突,屏蔽一切可能违后数据完整性的操作。
从数据库解度上看,
共享锁:也为读锁,允许多个用户进行并发读取。
独占锁:也为写锁,只有当数据即没有读,也没有写时,才可进行写上锁。
更新锁:防止死锁产生,首先锁定数据,等需要更新时,再将更新锁改为写锁。
关系型数据库学习链接:
https://blog.csdn.net/weinierzui/article/details/71054964(这篇博文中的参考链接值得大力开发利用)
http://www.runoob.com/mysql/mysql-tutorial.html(学习MySQL命令,很适合新手上路)
leetcode:
练算法题必去的网站之一,其声名无须多加赘述。尽早练起来吧。
牛客网:
适当可以用来练一练算法题。在练题这块似乎比leetcode低了一个档次。但它有一个最大的好处,相关岗位的面经贴可以值得借鉴,并且及时了解各大公司面试情况。
CSDN:
这就是一个博客,只不是程序员常驻足的博客。里面内容虽然有点多,有点杂,而且阅读性也因人而异。建议大家多关注大牛们的博文,特别是排名靠前的大牛。同时也建议大家可以经常写点东西分享上去,但需要注意可读性,也就是说你写东西时尽可以站在别人的角度上去思考如何表述。如果常留心观察,你会发现很多排名靠前的大牛其实就是同届或比你更小的学生。不多说了,留点余地给大家品味吧。
博客园:与CSDN一样,程序员常驻足的博客。两者相互借鉴。
github:
一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。(哈哈,这个地方,我偷懒啦)
菜鸟教程:http://www.runoob.com/
涉及几乎每种IT技术介绍的网站,面向菜鸟级选手。