Make A Plan(二)

来源:互联网 发布:开淘宝店在还好做吗 编辑:程序博客网 时间:2024/05/07 03:22

同为一亩三分地CS区的好帖,对于我这样第一种的Project经验第二种的算法能力的同学需要加油升级啊~按照攻略好好学!


现在有越来越多的人想学CS,自然就有这样一个问题:

如何

打好CS的基础?如何入门学习?”

我自己本科是学EE的(信号处理方向),然后到这边读CS小硕,所以觉得自己还是很有发言权的。我大二的时候发现自己对于EE完全无爱之后就一直在自学CS方面的知识,积攒了一些经验和资料,在这里和大家分享下。


本文适合打算从非CS专业(最好是工科)转到CS读master然后毕业找工作的人群,不适合打算读CS phd的同学




首先根据我对CS业界的观察以及实习经历,我觉得业界对于CS毕业生的需求倾向大概分为两种:


1、算法分析和设计的能力,要求熟练掌握常用算法和数据结构,能够快速针对一般性的问题给出optimal的解决方案,对于较复杂的问题能给出解决思路,要求手写代码的能力,而对project经历要求不高。


代表公司:facebook,amazon,google等以互联网为主要业务的公司


2、就是俗称的coding能力,要求熟练掌握常用算法和数据结构,并对某一种开发流派比较熟练,如web开发方向的javascript/PHP/Silverlight/HTML5,本地开发的Java/.Net,移动开发的ios/android/wp7,还有些更专精的方向,比如嵌入式开发的Linux+C,驱动开发等,对经验要求较高。


代表公司:Microsoft,IBM,Oracle等传统软件公司+各种小公司+各种startup公司


所以各位想转CS的同学,先想好你们以后打算往哪个方向发展,如果数学功底比较好、脑筋比较快的适合第一种(智力型),如果喜欢engineering的感觉、有一定coding经验的话适合第二种(敏捷型)。



第一种升级路线:

. 围观我们@1point 3 acres

首先要打好算法功底,本人推荐《Introduction to Algorithms 3rd》,算法学习的圣经,虽然厚但是非常细致,全书使用伪代码。把一些比较重要的章节学完之后做做课后习题,基本别的算法书就不用看了,之后做做面试题就行。

. 围观我们@1point 3 acres

然后掌握一门语言,建议C/C++,因为这两门语言非常低层,甚至连string处理都要自己一个char一个char地写(先无视STL吧),非常考验编程功力和优化水平。


对于C,大家知道有个C四库全书,其中K&R写的那本我觉得早就应该看完,然后剩下的《C和指针》、《C专家编程》和《C陷阱和缺陷》也要看一遍。看完这四本书基本就可以自称“精通C语言”了。


对于C++,因为过于博大精深,所以其实很难推荐,而且事实上没有一个人敢声称自己“精通C++”。但有一本书是学C++不可不看的,中文译名叫做《深度探索C++对象模型》,侯捷翻译的,质量不错。


对于编程语言的掌握水平,必须达到对于自己的代码、在大脑中能时刻勾画出代码的执行流程和数据在内存中的排布方式这种程度。


最后是OS和数据库,我觉得各选一门CS系研究生级别的课就足够了,只要明白基本概念、能使用unix的系统调用编程、能日常操作MySQL即可,不需要研究太深入。



第二种升级路线:


这一种对于算法的要求虽然没有第一种那么高,但是常用的算法和数据结构,比如快排、二分搜索、二叉排序树(即堆排序)、二叉搜索树、哈希表等还是要熟练掌握的,也推荐上面那本算法导论,没时间的话也可以用《数据结构与算法分析:C语言实现》来代替。


对于语言,建议除了以上提到的C/C++的基础,再另外掌握一门开发语言+一门脚本语言,如Java/C#+PHP/Perl/Python等,这个没什么教材好推荐,建议多做project,熟能生巧。


对于OS建议掌握更深一点,最好能阅读和学习Linux内核,推荐ULK第三版,即《Understand Linux Kernel 3rd》,讲2.6的内核,然后下载个Source Insight软件同步阅读内核源代码,不必全部看,重点关注进程管理、进程调度、内存管理、文件管理即可。还想深入、或者打算投身驱动开发的同学,LDD3(《Linux Device Drivers 3rd》)不可不看。


(关于OS再补充一句,我个人觉得面试如果问到OS,不会问你一般性的原理,比如“互斥锁是怎么实现的?”,而是会问你“Linux的互斥锁是怎么实现的?”。我记得以前在国内面试某T公司的时候,面试官看我简历上写了“Windows内核”就和我探讨了Windows内核对于物理内存的管理方式来着,然后我把AVL树说成红黑树了,囧啊。)

. 1point3acres.com/bbs

对于数据库,仍然建议掌握MySQL,能日常操作即可。


想走第二条升级路线的同学,project经历是重中之重(课上做的那种project不算),建议多参加一些实验室工程性质的项目、软件开发的比赛,或者干脆投身移动app开发,总之就是多积累作品,这样和面试官才有得聊。


. 1point3acres.com/bbs

我觉得对于转CS同学的指导思想就是在有限时间之内迅速掌握实用的知识和经验,其实CS虽然叫做Science,本质上还是个Technology为王的领域,不需要长年累月的积累,只要努力任何人都可以得其门而入。



以上皆为一家之言,欢迎各位指正和补充。


原创粉丝点击