一个供参考的计算机学习路线
本文是介绍如何成为一个Geek,一个真正的计算机高手。
适合开始入门并想成为IT领域技术大牛的人参考。
写给大一新生和所有向深耕IT领域的人,避免走一些弯路。
仅代表个人想法,供批判性参考。
第一门入门的必备功课-语法与算法
我认为这一部分的内容适合大一新生去做
什么是计算机?
用来做运算的机器
电子计算机在运算方面和廉价的计算器原理并没有区别。
什么是冯诺依曼架构?
冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。
核心的内容只有两点:存储和运算
我们可以将输入的数据进行运算,还能将运算结果进行存储。
而且能利用存储的数据进行判断,按照判断的结果实现程序流程的改变,就是循环和判断。
按照这样一个架构,我们就可以编写程序了,可以将很多运算和跳转的指令存储在计算机中(存储代码的这一段内存称为代码段),在运算过程中用产生的结果改变内存中的数据。
执行到判断跳转的指令时,根据内存中的数据修改PC寄存器的值(这个值是一个地址,这个寄存器始终将要运行的指令的地址),来修改程序执行流程。这样我们就实现了判断的逻辑和循环的逻辑,这两种逻辑可以将人类逻辑转换成程序执行流。
为什么要从一门高级语言-C语言学起,而不是计算机的底层?
上一个问题中描述的是运算,跳转两种指令指的是汇编语言的主要指令。
这种操作是很细节的,直接操作寄存器,CPU和内存。
我们在学习计算机入门需要培养的是什么,是逻辑。如果太关注硬件细节,对新手太不友好,当我们通过高级语言来训练好逻辑之后,再去学汇编语言和底层,就已经具备了逻辑能力,学起来才会容易,这是一个循序渐进的过程。
为什么要选C语言而不是别的高级语言来入门,这是因为C的灵活是其他编程语言无法比拟的。设计一个编程语言其实是融入了设计者的哲学思考,C语言的基础语法很简单,但是真正的设计是博大精深的,所以在这里很难完整地阐述为什么选择C语言的原因。
这就是为什么计算机应该从C语言开始学起的原因。
如何学C语言?
这时你可能会去找一本C语言的书来读
你可能会看到这本,觉得C语言太复杂了,书这么厚。
实际上对于新手来说,只需要掌握最基本的语法,这本书过于严谨和全面。这本书最后还添加了一些简单的算法,导致篇幅增加,但是很少有人会认为一本语法书适合学习算法。
你可以选择一本轻薄的教材,或者在线学习资源也足够,用一下午快速掌握一下基础语法,运算,循环,判断,函数,指针和数组。
刚开始学习C语言的同学可能有一个误区,会去卷各种库函数的记忆。这是没有用的,一个熟练的程序员在使用库函数时也是会选择查找,别人写的接口你需要查找使用即可,常用的自然会记住。不要在这里浪费你学习你接下来学习核心内容的时间。
有这些内容,你就可以去做任何事了。
什么是算法?
你接触过什么算法,欧几里得算法,秦九韶算法...
他们就是一套计算的方法,可以解决某个特定的问题,步骤比较机械,特别适合计算机来执行。
在计算机的世界中,除非你是过于底层的设计,嵌入式开发,芯片设计,别的所有领域里这里提到的算法都是核心。
我们编写一个程序一般是为了解决一个问题,过程中用到一套算法。统计数据库中学生的数量需要一套算法。张一鸣正是发明了一套推送算法,创立了字节。图灵奖得主中因为在算法领域取得突出贡献而得奖的占多数。
一个思想上有深度的算法的诞生,标志着一类人类社会中的问题可以用计算机来实现了。
如何学习算法?
算法是核心,而且软件领域只有两种事情,别人的代码,我们要读懂,还有自己要写的代码,要有编码能力。
当你学了算法后对编程逻辑就有了驾驭能力。
我建议从oi算法入手,参加一些蓝桥杯,CSP认证之类的比赛。能力强,有机会的可以去参加ACM。如果你能力一般,那就是以赛代练,训练能力。如果你能力强,可以去当赛棍。CSP也是很有价值的,但是很多学术机构对CSP都有要求,清华原则上不录取CSP低于300的。
当然算法竞赛和实际问题区别是很大的,你不能短时间用算法编写程序不代表你比竞赛选手在计算机实际应用中的能力就差。参加比赛可以训练一定的编码能力。大一的计算机新生适合做一些算法竞赛具备这个必备能力。
我建议学习资源可以选择《算法竞赛进阶指南》。
网站和如果上面这些两种学习资源对与你来说还是比较困难的,可以阅读一下《啊哈算法》。啊哈算法是很详细很直观地讲解算法,配有有趣的插图,为了所有人都能看懂。
还有大话数据结构比起那版清华的教材更适合新手阅读。
建议上述资源结合起来使用。
我们没必要一上手就是数据结构,看着冗长的代码,用算法竞赛的写法培养一下能力最重要。
你可以打一些在线的比赛,牛客网周赛,acwing周赛,还有比较著名的codeforces网站。
当你有了对基础算法的掌控能力后,要仔细学习数据结构。
这里可以简单介绍一下常见的算法竞赛。
蓝桥杯
这是一个工业信息化部门承办的算法竞赛,是一个普及性的比赛,希望大量计算机专业学生参加,而不是专门的算法竞赛选手。报名费有点小贵,300。但是很多弱省,省奖是很好拿的。一般拿到省奖会有单项奖学金或者学校报销报名费。虽然是一个普及性的比赛,但是题目质量开始越来越高,值得每个想学技术的人去参加一下。
ACM
这是门槛较高的国际编程竞赛。想要参加一般需要加入你们学校的校队。比赛一个队伍3个人,每个学校只有几个队伍有线下赛的资格。大一零基础的一般是有希望参加的,还有大二猛肝从零基础到夺金的情况。ACM含金量就比较高,如果你夺得区域赛银牌以上,很多大厂会有免除笔试,面试的绿色通道。当然这个比赛也有不同的声音,有大牛认为算法竞赛和实际问题区别很大,没有必要在ACM这个比赛上面浪费精力,学到技术是最重要的。
CSP认证
这是一个中国计算机协会举办的软件能力认证,题面趋向于越来越长。很多学术机构对这个认证是有要求的,清华考研CSP低于300分的原则上不录取。CSP的高分是简历上很好看的一笔。
了解IT的各个领域
当你可以驾驭一门编程语言之后,你就可以几个小时内学习一门高级语言。Java,Python,Go,Rust有能力的话都可以速成一下,只需要看最基础的语法就可以上手了。要在实践中学习。要有查阅技术社区博客和官方文档的能力。
IT领域中别人开放过的项目的代码你是不可能全部读完的,要想去认识,只有培养去理解的能力和查阅资料的能力,按照需求出发去选择性学。
可以学一下别的编程语言和数据库,相信你这时学习这些内容并不需要多长时间。
这样你已经提升了认知,打开了计算机的潘多拉魔盒。你可以了解任何一个方向,选择你所喜欢的方向进行深耕,网络安全,云计算,后端开发,前端开发,游戏开发,人工智能。你有自学看懂这些书籍的能力,因为你有了编码能力。
因为计算机很多领域都有相通的特性,都是代码实现的,所以一窍通,百窍通。所以你一开始没必要深入学习各个方向,可以几个月时间你就能在各个方向都玩一玩,了解自己喜欢什么,想做什么,扩展自己的认知。
如果你想在极短的时间内了解计算机的各个方向,可以看一下
。只有40节课,一节课10分钟,但是从很好的角度高屋建瓴地阐述了计算机的大部分主流领域。做项目
你可以做一个项目,将项目存储正在github上
github是一个代码托管仓库
项目可以是游戏,APP,网站
学好核心内容
计算机核心课程
考研所考的内容是数据结构与算法,操作系统,计算机组成原理,计算机网络,这几门是计算机的核心。为了考研和学术的需求,认真学习概念也是有必要的。
至于编程语言和数据库等知识,实操永远是第一位的。就像没有每天看游戏角色数据而不去玩的电竞选手。核心的是编码能力和认知,这些学科概念没任何用处,会实操即掌握。因为计算机世界中一部分是别人写的代码,一部分是自己写的。自己写需要逻辑能力,而这些学科是别人写的代码,给了你一个接口,你可以用你的编码能力来认识,来使用。但是发明者起的名词只需要灵活掌握。千万不要把是时间浪费在机械记忆上。
我们知道清华姚班的姚期智教授,删除了老化课程,加强了核心学习,引导学生在本科阶段培养自己的专长。
核心课程
回到核心课程中,这些核心课程相对有必要按照科班教科书式地学习。而且也是考研所需要的内容,所以我们也不得不系统学习概念来获得一定的应试能力。
操作系统
程序员必须对操作系统掌握好,操作系统就是一个大程序,一般书会从抽象层次来开始讲述,什么是抽象,就是不给你具体代码,来讲述想要写的程序的逻辑。这个过程需要慢慢来理解。
程序使用的操作系统和服务器使用的操作系统是Linux,我们必须熟练掌握Linux的命令。
这里推荐MIT的CS
,学会Linux的命令才能进行开发。学Linux系统的操作和学习操作系统理论知识不存在先后关系,根据需求来学。学好操作系统基础知识之后去看Linux的内核源代码,从具象层次将操作系统理解透彻,才能成为大牛。推荐《深入理解LINUX内核》。
计算机组成原理
可能是考研专业课中的瓶颈,涉及硬件层次的计算机架构,操作系统处于硬件和应用程序之间。
要想学好计算机组成原理,可以学一点数字电路,如果不做硬件开发的话,数字电路理解即可,简单涉略,没必要进行设计。也要学习一定汇编语言,这对于操作系统和计算机组成原理都是很有必要的。
当然直接拿计算机组成原理和操作系统的书来学也是可以的,但是这样可能就需要就好的抽象理解能力了。
编译原理
编译原理是相对比较难的一门学科,虽然不在408的范畴,但是也是技术人员必备的知识。
计算机网络
网络的基础知识是比较简单的。理解网楼哦层次架构,记忆协议就可以。
计算机与基础自然科学的关系
物理学
其实目前技术应用上并没有关系,我们最底层研究到数字电路,但是数字电路是逻辑门的设计,用不到电压和电流等电学知识,哪怕你是嵌入式开发者,芯片设计者,也是不需要电学的。跟别说力学,相对论和量子力学了。
物理对于计算机毫无意义吗,也不是,摩尔定律失效是因为芯片设计碰到了量子力学,时代是向前发展的,基础自然科学对于你认知的提升有帮助。可能有些人也有计算机与物理结合方面的志向,但是物理学与目前真正的计算机核心毫无关系,根据自己需要完全可以不学。计算机早已从电子学科中分离。
生物,化学与计算机的联系是更小。
数学
如果你的目标只是进厂,那么也许对于你来说更重要是业务能力,后端开发,前端开发,游戏开发,是最基础的工作都是具备编码能力,工作经验就可以胜任的。这时候很多普通码农就提出了数学无用论。
但是你要想自己设计一套算法,研究密码学,人工智能,做一个真正的高级人才,而不是码农,数学的要求是相当高的。最核心的是线性代数,概率论,离散数学。当然你需要的不是应试能力,是真正的数学能力。
我们常说计算机行业饱和了,其实不然,现在的世界是不缺少码农的,码农是可以社会培训几个月速成的,但是高级人才在我国都是缺口。BAT都没有实力养一套自己的加密算法。中国的第三代黑客也是处于断档,网络安全人员急缺。
数学课程推荐
僧多粥少,很多人忙于过度无意义内卷来试图通过分数更高来获得竞争力。其实也可以换一个思路,重剑无锋,在绝对的实力面前一切技巧都是徒劳,艰难之业当累日月。你可以选择一个自己愿意沉下心来钻研的方向进行深耕,会学到真正的技术,随大流是必不讨好的。
计算机科学丛书(黑皮书)
所谓计算机黑皮书,指的机械工业出版社引进的计算机科学丛书,其封面都是黑色的大理石纹理式样,体现了直男审美计算机工业的品位和格调:冷峻而不失高雅。
这些黑皮书都是从国外引进的,很多都是国外的教材,作者都是业界顶尖的大牛。
本科除了保证一定的代码量,还应该读一些黑皮书进行积累。大学时间也很长,制定计划,日积月累,总会读完。
深入理解计算机系统(CSAPP)
这是被誉为等量黄金的黑皮书,每个计算机学生有必要读完。
是黑书中最有必要读的书之一。
书的前言说的也很清楚,读完这本书的时候,你已经成为了为数不多的大牛。
这本书从程序员的视角出发,详细介绍底层知识,涉及计算机组成原理和操作系统的知识。
现代操作系统
是操作系统的最经典的书籍,作为如此核心的学科,这本书也很有价值。
可以作为学习操作系统的第一本书。
算法导论
算法导论对经典的算法进行了原理层面的剖析,虽然是一本巨作,但是可能不适合计算机新手阅读,入门计算机只需要熟练传统的算法和数据结构。人的精力有限,这样一本巨作不适合过早地读。很多ACM高手也不会去研究这本书。
但是对于想钻研算法的原理的同学,这本书是很适合的。
汇编语言:基于x86处理器
本书是个人感觉比较好啃的黑书,几天就可以看完。
汇编语言的学习对于理解编译原理,操作系统和计算机组成原理的学习都很有必要。否则很多概念会有些抽象。
其他黑书可以根据自己的需求去选择
计算机别的竞赛
除了算法竞赛之外,计算机还有很多别的竞赛。ACM有年龄限制,往往很多人因为考研工作等原因会在大三后退役。
计算机还有别的竞赛。喜欢的话可以参加。
CTF
这是网络安全的招牌。起源于黑客大会。称为夺旗赛(Capture the flag)。
分为Web,Pwn,Reverse,Misc,Crypto等方向
有解题模式和攻防模式。
Web
进行Web渗透测试,扫描漏洞,进行入侵,进入靶机,取出靶机中的flag
Pwn
利用二进制漏洞,进行StackOverflow等攻击手段进行攻击,取得shell,取得shell之后就可以随心所欲处理靶机中的任何文件,取出flag
Reverse
对一个可执行文件进行分析,取出其中的flag。比如我们熟悉的exe文件,exe文件和dll文件属于PE文件,是Windows系统中的可执行文件。题解模式会给一个执行文件,但是不给出代码,可以用逆向分析工具获取反汇编和反编译的代码。进行调试分析,取出flag,在现实生活中的引用有软件破解,恶意代码分析。
Misc
CTF中的杂项,涉及图片隐写,音频隐写等内容。隐写就是在一个文件隐藏数据,但是不影响原来文件的功能,比如,可以在一个图片文件中藏一个压缩包,但是图片文件看起来还是那个图片文件。比赛中我们要将隐藏的数据获取。
学习CTF的条件
只要有一定的编码能力就可以参加,最好对于别的核心学科有一定认知。但是不需要系统学习。
CTF入门过程是在实操中补充知识点来学的。
真正的CTF没有套路,需要查阅官方文档,自己学习。
区块链比赛
区块链是比较新的一个方向,也是资本喜欢的一个话题。与之有关的比赛也很多,奖金池也比较丰厚。
别的比赛在这里不一一列举了。
如果你把每一天当成最后一天来活的话,你就会轻松自在。 ——Steve jobs
- 点赞
- 收藏
- 关注作者
评论(0)