作为机械专业自学转行,并拿过世界500强等一线大厂offer的我,给大家分享一下自己的一些看法,希望能给学弟学妹们答疑解惑。

要说「计算机专业学生如何提高自己」,我觉得应该是包括下面三大块:

  1. 计算机基础知识;
  2. 特定业务技能;
  3. 解决问题的能力。

计算机基础知识,是根本,是任何从事编程工作的工程师都应该具备的能力,包括:计算机组成原理、计算机操作系统、计算机编译原理、数据结构与算法、各种编程语言等等。

基础知识是基本功,你基础打扎实了从事任何一个领域的工作,都会游刃有余。

特定业务技能,就是你所从事的细分领域所应具备的业务及专业技能。比如,你做嵌入式,就需要学习一些硬件知识;做算法,就需要掌握比较深的数学及算法知识;做人工智能,就要学习更多专业技能了。

现在企业的业务各不相同,所以细分出来的领域也非常多。想要做到每个领域都精通,几乎不可能。所以大部分程序员只能挑选少数几个领域进行深耕。

解决问题的能力,这个应该是各个企业都非常看重。企业是请你来解决问题,不是吃干饭,更不是来创造问题。这是程序员的软实力,你是菜鸟程序员还是资深程序员,差别就在这。

在学校里,遇到程序问题还可以跟同学们甚至老师一起讨论,但在企业里,大家都很忙,遇到问题几乎都需要自己想办法解决。

业务技能及解决问题能力,需要自己长时间的积累,以及刻意训练,甚至贯穿程序员的整个职业生涯。

而计算机基础知识,大家学习的内容都差不多,下面我就给大家总结一下,作为计算机专业的学生,应该掌握哪些基础知识。

在开始之前,先提醒一下大家,算法非常重要,几乎每个公司面试的时候都会考到。这里准备了一份 BAT 大佬总结的 LeetCode 刷题宝典,很多人靠它们进了大厂。

冒死分享,面试必备!LeetCode 刷题神器,看完 BAT 随你挑!​mp.weixin.qq.com/s?__biz=MzU3NTgyODQ1Nw==&mid=100024059&idx=1&sn=442094f986b8f19d618895129bfe68f0&chksm=7d1fa67d4a682f6b7ae96f645eee072b93e2199bb3ab87091f0c10524f35edc6820e41f881b2#rd正在上传…重新上传取消​

本文较长,全是干货,7000字长文警告!!欢迎点赞收藏,便于下次阅读。

首先给大家看一张图,计算机专业学生大学四年一般课程安排:

各个学校可能会有些许的差异,但基本上都大同小异。

所以如果想自学计算机的话,可以按照上面学校的课程安排,自己去学习即可。

但是,上面的这些课程,很多又非常杂,如果你时间有限的话,可以先抓住计算机基础知识部分学习。

计算机基础知识部分,又分为:基础中的基础(数学/英语)、计算机组成原理、计算机操作系统、计算机编译原理、计算机网络、数据库、数据结构与算法、编程语言等等。

这几部分内容,我又都做成了思维导图,大家可以看看:

一、基础中的基础

俗话说,基础不牢,地动山摇。所以如果你想学好CS,一定要在学习编程语言、计算机组成、计算机操作系统、编译原理、数据结构/算法等等之前,先打好最基础部分。

最基础的部分一般包括以下内容:

  1. 数学
  2. 英语

这两块内容,对于任何想学习CS的专业课之前,是必修的基础课。

其实,等你工作到一定年限之后你就会发现,代码只是工具而已,不管你是用Java、Python、还是C++,其实这些语言都或多或少有相通性,最终的结果都是要用来解决实际问题的。

所以,为什么会有很多人非常擅长写代码,却成不了一个好的「软件工程师」。这也正是区别「码农」与「工程师」的关键之处。

而如果你想拥有非常好的业务能力,肯定会离不开数据结构和算法。而这两块都需要很强的数学功底。

而现在国外的计算机水平领先国内几十年,一些新技术、新框架往往都会先出现,所以你需要扎实的英文水平第一时间获取到这方面的信息。同时,如果编程过程中遇到问题,还可以在国外的论坛上得到更多的解答。

二、专业理论基础

在打好数学及英语基础之后,就可以开始学习计算机专业基础知识了。其中理论基础包括以下5门课程:

  1. 计算机组成原理
  2. 计算机操作系统
  3. 计算机编译原理
  4. 计算机网络
  5. 数据库基础

学好这几门课程,无论是你将来读研、读博,走学术路线,还是参加工作进入职场,走技术路线,升职加薪,都是非常非常关键的。

但是很可惜的是,现在太多人急于求成了,过于注重编程语言的学习,这5门课被严重忽略了,草草带过。

这是非常错误的行为!!如果你想成为一名优秀的软件工程师,这些课程一定要认真学习一遍!

很多人自学CS,一上来第一步就是开始学编程语言,比如Java/Python/C++,但实际上,学习编程语言不代表你就是学会了CS,编程语言只是一门工具而已。就比如,你学会了PS,并不代表学会了设计;你学会了打字,并不代表学会写作一样。

实际上,你完全不需要学任何理论知识,都有可能使用编程语言实现一些很简单且很实用的功能。但是,一旦涉及到更多需要基础含量的工作,理论基础扎实不扎实就马上体现出来了。

1. 计算机组成原理

计算机组成原理介绍了计算机的基础知识,包括计算机的各子系统(运算器、存储器、控制器、外部设备和输入输出子系统等)的基本组成原理、设计方法、相互关系以及各子系统互相连接构成整机系统的技术。

学好了这门课程,你的七大姑八大姨,或者你暗恋很久的翠花,叫你修电脑的时候,就会游刃有余。

这门课程不仅介绍了计算机软硬件的相关知识,也介绍了计算机的各大基本部件的组成原理、设计方法及相互关系。

书籍推荐

  • 入门系列

《计算机是怎样跑起来的》
《程序是怎样跑起来的》
《Computer Organization》

  • 深入系列

《计算机组成与设计:硬件 / 软件接口》
《深入理解计算机系统》
《计算机组成:结构化方法》
《计算机体系结构:量化研究方法》

视频教程推荐

1) 国外视频

视频则推荐伯克利大学 Brian Harvey 的 SICP 课程,CS61A。建议至少学完 SICP 的前三章,并把练习题做完。

CS 61A: Structure and Interpretation of Computer Programs

如果你觉得 SICP 的课程太难,可以选择 How to Design Programs。

How to Design Programs

还有两门课也很经典:

  • Harvard的CS50

CS50: Introduction to Computer Science

  • MIT的6.001

mit-6.001

2) 国内视频

  • 清华大学刘卫东老师的课程:

https://www.bilibili.com/video/BV1c4411w7nd

  • 哈工大刘宏伟(135讲)

https://www.bilibili.com/video/BV1t4411e7LH

2. 计算机操作系统

即使不是程序员,每个人几乎每天都跟操作系统打交道(PC or phone)。简单来讲,操作系统是在为应用程序提供服务,比如:内存分配、进程调度、管理虚拟存储器,管理中断,管理磁盘,等等。

所以,对于程序员而言,你学了操作系统,你就会更加清楚如何去进行内存管理,如何进行进程调度。编写出来的程序也会比不懂操作系统的程序员更加优雅。

而且,不管对于大厂还是小公司,在面试或笔试的时候,都很经常考到操作系统,所以不管是工作还是为了应付面试,都需要好好学习一下操作系统。

书籍推荐

  • 入门系列

《现代操作系统》
《操作系统导论》

  • 深入系列

《深入理解计算机系统》
《自己动手写操作系统》
《操作系统真象还原》

视频教程推荐

1) 国外视频

  • MIT的操作系统公开课(http://pdos.csail.mit.edu/6.828)。MIT自己基于Unix v6开发的xv6类Unix系统。除了没有视频,课表,作业,考试等都有。youtube上有第四讲以后的所有视频https://www.youtube.com/watch?v=kDRHsNauoxk&list=PLfciLKR3SgqNJKKIKUliWoNBBH1VHL3AP
  • Udacity的Advanced OS公开课:Advanced Operating Systems from Udacity
  • Coursera上北大操作系统原理公开课(15年3月17日开课):Advanced Operating Systems from Udacity

2) 国内视频

  • 《操作系统原理》,清华大学老师的课程,讲得很浅显易懂。

https://www.bilibili.com/video/BV1uW411f72n

  • 《操作系统》,哈工大李治军老师,32讲

https://www.bilibili.com/video/BV1d4411v7u7

3. 计算机编译原理

编译简单来讲就是把高级语言翻译成计算机可识别的机器语言,但这个过程并不容易,而且,你理解这个过程也同样不容易。

编译原理是计算机技术中相当基础的一门技术,同时它也是计算科学中技术含量较高的一门学科,它和算法、数据结构、编程语言等都有非常密切的联系,对这些相关技术的深入学习提供基本的理论基础,所以学好编译原理不但对该技术非常重要,而且对于学习相关的技术也非常重要,掌握编译原理你才有机会掌握更多的技术。

编译原理非常难,而且非常枯燥,需要要很强的功底才可以入门学习。

书籍推荐

《编译器设计-第二版》
《编译原理》

视频教程推荐

1) 国外视频

  • CS143: Introduction to Compilers
  • CS243 - Program Analysis and Optimizations
  • CS 343
  • https://www.cs.cmu.edu/~410/
  • 15-411: Compiler Design (Fa'12)
  • 15-440/640, Spring 2015: Distributed Systems

2) 国内视频

  • 《编译原理》,哈工大,81集

https://www.bilibili.com/video/BV1zW411t7YE

  • 《编译原理》,东南大学,廖力老师主讲,全64讲

https://www.bilibili.com/video/BV1cW411B7DW

5. 计算机网络

在互联网如此发达的今天,几乎没有应用软件不连接网络的,所以对于一个程序员而言,不懂计算机网络的话简直寸步难行。

学习计算机网络,你需要懂得Socket编程,知道TCP/IP网络模型,了解OSI七层网络架构,知道一个数据包是如何层层包装,再层层拆包,从客户端发送到服务端。

计算机网络应该是除操作系统与算法之外,另一个面试常考的方向。所以,准备面试的小伙伴计网也一定需要好好准备一下。

书籍推荐

《网络是怎么连接的》
《计算机网络-自顶向下方法》
《图解HTTP》

视频教程推荐

1) 国外视频

  • http://www-net.cs.umass.edu/wireshark-labs/
  • https://lagunita.stanford.edu/c
  • Stanford的CS144

2) 国内视频

  • 《计算机网络》(谢希仁第七版)-方老师

https://www.bilibili.com/video/BV1yE411G7Ma

  • 《计算机网络》,哈尔滨工业大学,李全龙老师

https://www.bilibili.com/video/BV1Up411Z7hC

6. 数据库基础

数据库当然就是存储数据的地方,很多人自称CRUD工程师,但如果你连数据库都不懂,恐怕连这个称号都担不起。

一个软件在运行过程中,需要保存大量的输入信息,同时也会产生很多中间信息,所以数据库是必不可少的一个组成部分。它无所不在,网站的背后、应用的内部,单机软件,区块链里,甚至在离数据库最远的Web浏览器中,都有它的身影。

数据库分为关系型数据库和非关系型数据库,但近年来又出现了个NewSQL的东东,也需要稍微了解一下。学习数据库,你不仅要懂得SQL语句,表设计结构这些基础部分,还要懂索引、慢查询优化,配置参数调优,更深入的还要学习SQL优化、备份与恢复、架构优化等等进阶内容。

书籍推荐

  • 入门系列

《MySQL必知必会》
《SQL学习指南(第2版 修订版)》

  • 深入系列

《MySQL技术内幕——InnoDB存储引擎》
《Redis设计与实现》
《ZooKeeper:分布式过程协同技术详解》

视频教程推荐

1) 国外视频

  • 斯坦福的数据库公开课Introduction to Databases:http://www.db-class.org
  • 伯克利的 CS168 课程
  • https://archive.org/details/UCBerkeley_Course_Computer_Science_186

2) 国内视频

  • 《数据库系统概论》,王珊老师,中国人民大学

https://www.bilibili.com/video/BV1pW411W7Do

三、编程语言

现在网上关于第一门编程语言的选择有很多不同的看法,主要都在争论是C还是python。虽然现在很多大V能说出很多理由选python,但是我在这里比较推荐C。

因为像python这样的高级编程语言更多的是面向API编程,或者说就是熟悉API,很容易给人造成一种假象:计算机就是调包然后各种花里胡哨。

然而C这种更偏向“底层”的语言更注重的是逻辑,可以帮你培养出非常良好的编程思维和习惯,尤其是指针章节,虽然的确新手不好理解,但是这块知识非常适合给新手初窥一下计算机系统的门径,后面学习其他语言和理论知识也是事半功倍。

而且C也没有OOP(面向对象)的特性,刚上手不推荐学很多很杂的理念,很容易把人的思维搞乱。

书籍推荐

《C程序设计语言》
C语言三剑客(《C和指针》,《C专家编程》,《C陷阱与缺陷》)
《C primer plus》
不推荐谭浩强的书,写得很烂,里面还各种错误。

视频教程推荐

1) 国外视频

如果听得懂澳大利亚的口音的话,这门课是从C语言入门编程最好的公开课。
讲课的教授幽默风趣,知识丰富。面向的学生也是大一新生。绝对值得一学。
C programming by Richard Buckland UNSW 2008

2) 国内视频

强烈推荐翁恺老师的这门公开课,讲得浅显易懂,口碑十分好!
https://www.bilibili.com/video/BV1sJ411E7St

四、数据结构与算法

大家或多或少都听说过,在企业面试的时候,数据结构与算法是必考的一部分内容。所以,你如果想要进入一个心仪的公司,一定要学好数据结构与算法。

但是,难道除了面试,数据结构与算法就没有用武之地了吗?肯定不是的!即使你整天的工作就是CRUD,但是如何你不懂时间、空间复杂度,你如何更合理调用那些API?如何降低功耗,提高程序运行效率?

而且,作为业务开发,我们会用到各种框架、中间件和底层系统,比如 Spring、RPC 框架、消息中间件、Redis 等等。在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。

如果你能弄明白这些底层原理,你就能更好地使用它们。即便出现问题,也很容易就能定位。因此,掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。

书籍推荐

  • 入门系列

《算法图解》
《大话数据结构》

  • 深入系列

《算法-第四版》
《算法导论》

视频教程推荐

1) 国外视频

  • Stanford: Algorithms

这门课由斯坦福大学计算机科学系教授Tim Roughgarden授课,适合至少掌握一种编程语言的编程学习者。斯坦福的课强调理论和概念上的理解。学完这门课后,对你今后面对技术面试时将会非常有利。

  • UCSD:数据结构与算法

Daniel M Kane、Pavel Pevzner等五位老师共同授课,这门课程的最大特点是理论和实践的结合,你将学习到解决各种计算问题的算法技巧,并实现大约100个算法编码问题。

  • Prin:Algorithms, Part I

Kevin Wayne和Robert Sedgewick共同授课,涵盖了有关算法和数据结构的基本信息,重点是Java实现的应用程序和科学性能分析。第一部分包括基本数据结构、排序和搜索算法。第二部分重点讨论了图形和字符串处理算法。

2) 国内视频

  • 《数据结构》,浙江大学陈越和何钦铭教授联合授课,其大名在计算机领域可谓耳熟能详了。

https://www.bilibili.com/video/BV1JW411i731

  • 《数据结构与算法C++版》,由由北京大学张铭教授等七位授课老师全力打造,国家精品公开课。

https://www.bilibili.com/video/BV1R741117bK

  • 《数据结构》,武汉大学李春葆教授

https://www.bilibili.com/video/BV1gb411C71L


再次强调,想进大厂的同学,一定要好好学算法,这是面试必备的。这里准备了一份 BAT 大佬总结的 LeetCode 刷题宝典,很多人靠它们进了大厂。

计算机专业学生该如何提高自己?相关推荐

  1. 提高计算机专业技能,如何提高计算机专业学生综合技能.doc

    如何提高计算机专业学生综合技能 如何提高计算机专业学生综合技能 摘要:提高计算机专业学生的综合技能是整个计算机专业教学的重要环节.只有紧跟时代,创设良好情境,选取科学教学模式,抓好基本知识技能教学并注 ...

  2. 计算机专业怎样提升竞争力,新形势下如何提高计算机专业学生就业竞争力.doc...

    新形势下如何提高计算机专业学生就业竞争力 新形势下如何提高计算机专业学生就业竞争力 摘 要:受经济社会和 IT市场发展的影响,高校学生的就业形势越来越严峻,提高学生的就业竞争力至关重要.本文分析造成就 ...

  3. 计算机专业大创要求,“大创项目”推动计算机专业学生创新实践能力的提高

    2016年第1期 总第172期 27 创新创业就业 计算机科学与技术专业是自1980年各高等院校成立计算机专业以来的老牌专业.目前,绝大多数高校都设置计算机或与其相近的专业,每年有大批计算机科学专业的 ...

  4. 计算机专业看能力还是学校,【计算机专业论文】学校计算机专业学生实践能力的培养(共3502字)...

    摘要:中等职业学校计算机专业学生要想在计算机领域找到一个理想的工作岗位,其不仅需要具备扎实的理论知识,同时还需要一定的实践能力.因此,中等职业学校计算机专业学生实践能力的培养是当前中等职业学校计算机专 ...

  5. 大一计算机专业学生如何在寒假充电?

    写在前面 本文章刚在知乎发布24小时就获得1.6万阅读+1211收藏+213喜欢+187点赞,被知乎精选为全站热门内容. 全文共计2000+字,预计阅读5分钟. 昨天在知乎发布了一个回答:大一计算机专 ...

  6. 结合计算机专业谈创新,计算机专业学生创新能力培养论文

    计算机专业学生创新能力培养论文 创新能够对社会发展产生巨大推动,它是新技术.新知识.新原理的创造与发现.创新来源于积极的创新精神.扎实的基础知识.科学的思维方法以及良好的心理素质等[2].当前计算机专 ...

  7. 计算机专业学生社会实践,计算机专业学生社会实践报告

    计算机专业学生社会实践报告 篇1: 看着四年的大学生活就快要结束了,心中隐隐有一种伤感与失落,我陷入了沉思:该挺直腰杆走自己的路了!学习嵌入式是我的梦想,我很羡慕能够在嵌入式方面独档一面的高手,希望有 ...

  8. 一个计算机专业学生几年的Java编程经验汇总

    在javaeye上无意中发现这份转帖,对j2se,j2ee各方面都有涉及,一口气看了j2se的部分,写得挺不错的,转过来给大家分享. 一个计算机专业学生几年的Java编程经验汇总 ========== ...

  9. 计算机专业顶岗实训,计算机专业学生的顶岗实习

    一.高职计算机专业学生顶岗实习中存在的问题 高职计算机专业的学生在学校学到了理论知识以后,在顶岗实习过程中才能把这些理论知识运用到实践当中,才能进一步提高自己的专业技能.计算机作为一种信息交流传播的工 ...

最新文章

  1. C++及Windows异常处理(try,catch; __try,__finally; __try, __except)——一道笔试题引起的探究
  2. C++ - 编写一个从字符串转变成长整型的函数
  3. jquery 悬浮验证框架 jQuery Validation Engine
  4. 经典算法笔记:无监督算法(聚类、降维)
  5. rfid1-stc11f32x
  6. java inireader_java读取配置文件 Java中如何设置读取ini配置文件?
  7. python实现概率分布
  8. IFIX 6.0 安全登录
  9. c++之按距离某点的距离排序
  10. 为什么大部分的程序员成不了架构师?为什么?
  11. vbs整人代码蓝屏_来人。教你们用vbs代码和bat代码整人。高手勿进。
  12. 随机效应估算与固定效应估算_面板工具变量法学习手册(固定效应与随机效应方法、过度识别检验、预测等)...
  13. 粒子滤波 particle filter—从贝叶斯滤波到粒子滤波—Part-V(粒子滤波 PF)
  14. 「04」机器学习、深度学习需要哪些数学知识?
  15. 路由navigate
  16. 计算机管理用户组不见了,win7系统计算机管理本地用户和组不见了的解决方法...
  17. stm32语音识别文字显示_『免费开源』基于STM32的之语音识别
  18. 午芯高科“电容式”MEMS高性能数字气压传感器WXP380
  19. verilog将100mhz分频为1hz_verilog—分频器设计
  20. 加州大学圣克鲁兹分校计算机科学,加州大学圣克鲁兹分校排名

热门文章

  1. 项目管理心得:两权相利取其重,两权相害取其轻
  2. editText限制输入的4种方法
  3. 当程序员没了互联网,该如何继续学习写代码
  4. 俞敏洪在2008年北大开学典礼的演讲
  5. Windows 老是弹出要自动拨号连接怎么办
  6. 腾讯地图H5位置获取
  7. UVA e 11795 洛克人的难题
  8. SpringBoot MybatisPlus Druid 多数据源项目
  9. Pólya计数法的应用
  10. LeetCode 1396. 设计地铁系统(map/unordered_map)