计算机专业学生提升指南(上)

计算机专业学生提升指南(上)

如何成为一个具备系统知识与技能体系的计算机专业学生?

我分为八个方面来叙述这个问题,包含计算机专业能力提升路线,能力锻炼和价值提升,目标在于提升自己成为一个具备扎实技术功底,有足够丰富实践及方向明确的计算机行业从业者。

一:技术学习

大学期间对于技术学习大概分为两个类别:

  • 一个是围绕计算机、数学学科知识的学习
  • 一部分是编程技能学习

这两部分,前者属于计算机学科的基石,基本所有的编程,乃至计算机技术都是围绕前者建立的,想要在计算机方向深入,必不可少,接下来先就学科知识展开来讲

学科知识:

学科知识的学习可以重点放在大一大二,练好内功,才能融会贯通更多招式。

1.计算机组成原理

  1. ​ 计算机是由 CPU、内存、显示器这些设备组成的硬件,我们所书写的程序,也就是我们的软件。而软件和硬件之间,就需要一个渠道去沟通和交互,那么这个渠道就是“计算机组成原理”。了解了这个渠道,那么无论是书写操作系统、编译器这种硬核代码,还是 Web 应用、手机 App 这种应用代码,都可以心里有底
  2. ​ 除此之外,组成原理是计算机其他核心课程的一个引导课。学习完组成原理,向下可以继续学习数字电路相关的课程,向上可以学习操作系统这些核心课程。
  3. ​ 如果想要深入理解,甚至设计一台自己的计算机,体系结构也是必不可少的一门课。
(1))学习建议:

计算机组成原理作为专业基础课的第一课

第一点:杂

组成原理的内容多,且杂乱无章。概念及其广,并且每个概念的信息量也非常大。

第二:晦涩

  1. 组成原理中的很多概念展开来基本都可以当作计算机学科中的一门核心内容。比如我们说,我们所写的高级语言,如何变成计算机可以执行的机器码?如果把这个问题展开并且输入那就会成文编译原理这一门学科。第三不能学以致用,学习这些无法和自己的日常开发联系起来。
  2. 对于以后想从事嵌入式系统、操作系统设计等和硬件结合比较紧密的工作的同学,建议所有的内容都要学好。
  3. 而如果以后想从事软件相关工作的同学也要学好存储器、输入输出系统、计算机的运算方法、指令系统、CPU 的结构和功能等章节的内容,因为做大型系统软件会涉及到调优的问题,如果只懂软件,而不知道硬件在怎么运行的话,调优会受到限制,软件无法发挥硬件的最大优势。

课程推荐:

https://www.icourse163.org/course/UESTC-1001543002

https://www.icourse163.org/course/HIT-309001#/info

https://www.icourse163.org/course/HIT-1001527001#/info

书:《计算机组成》《计算机科学导论》

2.汇编

​ 学习汇编能脱离编译器甚至编程语言的限制,对于语法总结,对于了解编程语言本质,对于解决问题的能力帮助都很大。汇编语言的作用有很多,我们站在高级语言的角度来说,如果我们懂汇编,可以看懂每一行代码编译器生成的汇编代码,我们就知道这行代码计算机在做什么事情,就可以从本质上了解编程。

(1)学习建议:
  • ​ 学汇编需要一定的微机硬件基础知识,因为汇编过于底层,更加接近机器语言,所以很多东西要从机器语言的方面去理解。
  • ​ 学习汇编之前最好先学习一门高级语言(比如 C++Java),因为高级语言更贴近人,当我们在学习汇编遇到问题的时候,可以跳出汇编从高语言的角度看问题,不会被局限起来
  • ​ 汇编语言是更接近于机器语言的编程语言,如果我们将机器语言看成是操作计算机的本质语言的话,那么汇编语言是最贴近于本质的一个语言。
  • ​ 学习汇编的目的不是非要用汇编去挣钱吃饭。而是因为汇编语言对于一个编程人员所应该具备的基本素质的培养和形成的意义是非常重大的。

课程推荐:

https://www.icourse163.org/course/UESTC-1002047009

书:《编译原理》(龙书)

3.操作系统

计算机分为硬件系统和软件系统,操作系统是软件系统及其重要的一部分。而学好这门课程也为我们的未来提供了更多的可能性和上升空间。操作系统庞大且全面,我们可以在其中领会到各种数据结构的巧妙应用,各种解决问题的奇思妙想,他为许多的工程问题提供了非常经典并且极其有效的解决思路。学好这门课程,毫无疑问裨益非凡。学习操作系统也能够对程序运行和资源调配更清楚。

(1) 学习建议:

操作系统也是一个极其抽象的东西,重在理解。不行就先背过。先理清楚操作系统有哪些模块,每个模块都是干什么的,每个知识点,都去好好了解一下他的背景和意义。系统是人设计的,里面每一个设计的背后都有当时设计者的思考,所以你遇到的每一个设计细节都有为什么这么设计的理由。要注意看书和做题并应用。

课程推荐:

https://www.icourse163.org/course/NJTU-1003245001

书:《鸟哥的 Linux 私房菜》《现代操作系统》

4.计算机网络

互联网时代,所有的流量,传输都是依靠网络,无论是应用开发还是网络安全,都需要了解网络。

作为一个编程语言学习者,当我们在学习一门编程语言的时候,可能学到一些基本语法,面向对象等等。这个时候我们总感觉计算机网络完成不重要,反正我写代码也不设计网络传输,平时的工作也只是 CRUD,没什么用武之地。当我们接触到一些具体网络技术时,例如 Nginx,或者docker 等等我们就会发现网络基础的重要性。想要深入学习编程,计算机网络还是比较重要的一环。

(1)学习建议

计算机网络实质上是关于网络知识的导论,正因为是导论,所以会显得内容非常杂乱,那么建议在学习中注意以下几点:

1、理解计算机网络的组成

2、学习网络协议

3、了解网络分类的重要性

4、一定要学好 TCP/IP 协议(重点)

课程:

https://www.icourse163.org/course/HIT-154005

实验:

https://www.icourse163.org/course/BUAA-1002744004

书:《图解 HTTP》《图解 TCP/TP》《计算机网络:自顶向下方法》

5.编译原理

  • 目前国内计算机学习大趋势,是迎合互联网公司招聘需求为主,对于编译器的研究和操作系统的研究基本缺失,目前这块还处于被老外卡脖子的阶段,这门课是从使用语言到创造语言的必经之路。
  • 就算不能创造,有所了解,对日后编程的学习和研究也有很大帮助
  • 众所周知,编译技术是计算机核心之一。技术驱动的互联网巨头们都有自己的语言和生态,普遍具备了二次编程能力(最常见的就是 Office),可见编译技术的重要性。

可能有一些初学者或者程序员会问:我不可能自己去写一门新的语言,有必要学习编译原理么?

  • 编译技术不仅仅是屠龙技,在实际工作和开发中我们会经常碰到需要编译技术的场景。比如 Java 现在主流框架 Spring 中有对于注解的支持和字节码动态生成属于编译技术。如果我们想要写这些工具或者写更符合领域要求的工具,也需要编译技术。
  • 除去应用场景,他对我们自身的竞争力和对于计算机技术的理解也有很大的帮助。我们都知道有难度的面试都涉及到了底层,因为我们只有了解底层机制才能更深入的思考问题,而编译原理可以让我们从语法、代码优化、代码与硬件结合等多个方面去看待问题,加深对于计算技术的理解。
(1)学习建议
  • 编译原理并非是可以随随便便入门的一个学科,他的学习和实践通常基于对计算机编译过程,计算机基本工作原理,甚至有一定的数学知识的积累。
  • 我们在看编译原理之前,至少把 C 语言指针的思想搞清楚,学习离散数学,学习了数据结构。然后要理论和实践的结合,争取自己能写出一版玩具编译器。

课程:

https://www.icourse163.org/course/UESTC-1002047009

书:《编译原理》(龙书)

6.数据结构与算法

所有业务的实现都是算法,所有数据的存储都有结构。程序=算法+数据结构,某种意义上来说,这是最粗略区分码农和程序员的一门课。

同一个项目、或者框架,架构差不多,设计思路差不多,实现的功能差不多。为什么有的人做出来的框架 Bug 也多,性能也一般,可扩展和可玩性也不好, 只能在自己的公司仅有的几个项目里面用一下。而有的人做出来的就可以开源出来给很多人用,甚至被 Apache 收录。这么大的差距形成的原因,就是因为细节。这个细节就包括,你的内存是否节省,你的数据存取是不是足够的高效,你的算法是不是足够优化,等等等等,这些结合起来决定了一个框架是否足够优秀。如果你不懂数据结构与算法,不懂复杂度分析,那就只能写“凑合能用”的代码。

(1)学习建议

1、至少要掌握一门编程语言,以此为基础进行学习

2、要理解透彻数据结构的思想,然后一定要能够独立完成代码的实现。

3、多刷一些题目,通过一些难题去领会到数据结构的魅力。

4、做好规划,把每种结构的基本原理和应用列清楚

5、简单点说,动手多练。

6、再提一句,一定要勤奋刷题

刷题:牛客;力扣

书(电子档):《大话数据结构》《数据结构与算法分析》

课:https://www.icourse163.org/course/XMU-1206002801

ACM 题目解析:(https://www.nowcoder.com/ta/acm-solutions)

总结:

以上学科内容为“内功”,内功不一定能让你多拿多少工资,但是能够帮助建议对于计算机学科比较全面的认知。我们学的不是编程语言也不不是编程,是整个计算机学科。同时能够打造个人的适配性和稀缺性。 如果对技术深入兴趣不是太大, 或只是想以技术入行再找适合自己的定位的话,以上内容除数据结构和基础网络知识外,其他的都可以忽略

编程技能:

  • 编程技能是指用于实现产品开发的具体技能、编程语言等,例如 Java、C++等。
  • 编程语言的划分有脚本语言、标记语言、解释型语言等,简单了解下即可,不用纠结概念。
  • 脚本语言,他缩短了传统的编译的过程,他不需要编译器,只需要解释器,就好像一个专用的软件,你想要跟我进行交互就需要特定的一些操作。而这些操作的集合就是解释器,进行的操作就是脚本语言。
  • 编程语言,准确的说是编译语言,需要由编译器将计算机翻译成计算机所认识的二进制代码的工具。
  • 脚本语言相对而言会更加容易学习,但是不够全面,缺乏系统性,而且语言较为散漫。而高级语言相对比较难学,但是规则性较强,并且可读性相对较强,适合。
  • 随着技术的发展,脚本语言变得越来越强大,和编程语言的界限越来越模糊。比如 Python,因为他足够强大。

1、编程语言

  1. C语言:可以说作为当今所有流行程序语言的老祖宗,对老祖宗有所了解,对于学习他的子孙后代等其他语言(C#JavaPHP….)等等来说都有很大的帮助。而且又了这个基础,我们就有了选择的机会,是沿着老祖宗的道路继续发扬光大,还是根据自己的兴趣或者适应社会的各个需求灵活的进入技术领域。
  2. Java:一开始设计之初是在 C 的基础上做一个扩展,当 Java 的使用者越来越多的时候,才越来越偏向新手。发展到现在,相对 C++,他是更贴近新手的一门语言。
  3. C++:可以将C++看作是 C语言的加强。他完全兼容 C语言的特性。但是就难度来说,他的学期周期会更长。

2、脚本语言

  • Python:随着人工智能,python 越来越火热,同时也越来越强大。其在数据分析, 测试运维,快速开发等都有着很强大的作用。
  • 这里我想说的是,有些人会觉得我已经会了XXX 语言的,还有必要去学习XXX么?暂且不说语言是一通百通的,当我们学会一门语言(尤其是编程语言的时候),再去学其他语言就很快乐。要知道,语言就是我们的工具,就好像砸钉子就用锤子,拧螺丝就是用螺丝刀。我们学习一门语言是用来解决实际的问题,解决某个问题用什么最好就用什么,而不是单纯为了学某个语言而去学习。
  • 对于新人而言,建议以 C 或者 Java 作为自己的第一门编程语言 ,如果想要深入,建议在 C++或者 Java 中选择一门,相较其他语言,这两门语言不仅生态成熟,更具备软件工程设计的概念,更便于以此掌握编程的学习方法和对编程思维,同时这两门语言也是企业应用的技术常青树。

3.数学

(1)高等数学:

高等数学是基础,虽然说,一般的程序是很难用上高等数学的。但是如果你进入算法、数据库或者其他很专业的东西。它的基础作用就很明显了。个人认为高等数学的目的:1、培养思维(另外还有一门学科叫数学分析,对于数学逻辑的建立也有一定的帮助) 2、算法分析 3、程序本身(如果做图像处理,高数就尤为重要)。

(2)离散数学:

本科阶段离散数学四大块:逻辑学、集合论、图论、代数结构。计算机科学中普遍采用了离散数学中的一些基本概念、基本思想、基本方法,使得计算机科学趋于完善和成熟。他在计算机体系结构、数据结构、数据库、编译原理、人工智能中都有着很广泛的应用。

(3)线性代数:

矩阵计算在计算机科学中也有着独一无二的地位,在游戏开发、计算机图形学、计算机视觉、机器学习等方面都有着巨大的作用。最著名的用途之一就是谷歌的Pagerank 算法

4.物理

一些领域会涉及到一起物理概念,这要具体和某一个东西相关联,比如机器人就需要人体力学等物理相关概念,在学习相应领域知识时简单了解即可

  • 38
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温轻舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值