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