计算机的学习路线
本文是介绍如何成为一个Geek,一个真正的计算机高手。
适合有成为IT领域技术大牛的人参考。
写给大一新生和所有向深耕IT领域的人,避免走一些弯路。
第一门入门的必备功课-语法与算法
什么是计算机?
用来做运算的机器
电子计算机在运算方面和廉价的计算器原理并没有区别。

什么是冯诺依曼架构?
冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。
核心的内容只有两点:存储和运算
我们可以将输入的数据进行运算,还能将运算结果进行存储。
而且能利用存储的数据进行判断,按照判断的结果实现程序流程的改变,就是循环和判断。
按照这样一个架构,我们就可以编写程序了,可以将很多运算和跳转的指令存储在计算机中(存储代码的这一段内存称为代码段),在运算过程中用产生的结果改变内存中的数据。
执行到判断跳转的指令时,根据内存中的数据修改PC寄存器的值(这个值是一个地址,这个寄存器始终将要运行的指令的地址),来修改程序执行流程。这样我们就实现了判断的逻辑和循环的逻辑,这两种逻辑可以将人类逻辑转换成程序执行流。
为什么要从一门高级语言-C语言学期,而不是底层?
上一个问题中描述的是运算,跳转两种指令指的是汇编语言的主要指令。
这种操作是很细节的,直接操作寄存器,CPU和内存。
我们在学习计算机入门需要培养的是什么,是逻辑。如果太关注硬件细节,对新手太不友好,当我们通过高级语言来训练好逻辑之后,再去学汇编语言,就已经具备了逻辑能力,学起来才会容易,这是一个循序渐进的过程。
为什么要选C语言而不是别的高级语言来入门,这是因为C的灵活是其他编程语言无法比拟的。设计一个编程语言其实是融入了设计者的哲学思考,C语言的基础语法很简单,但是真正的设计是博大精深的,所以在这里很难完整地阐述为什么选择C语言的原因。
如何学C语言?
这时你可能会去找一本C语言的书来读

你可能会看到这本,觉得C语言太复杂了,书这么厚。
实际上对于新手来说,只需要掌握最基本的语法,这本书过于严谨和全面。
你可以选择一本轻薄的教材,用一下午快速掌握一下基础语法,运算,循环,判断,函数,指针和数组。
有这些内容,你就可以去做任何事了。
什么是算法?
你接触过什么算法,欧几里得算法,秦九韶算法...
他们就是一套计算的方法,可以解决某个特定的问题,步骤比较机械,特别适合计算机来执行。
在计算机的世界中,除非你是过于底层的设计,嵌入式开发,芯片设计,别的所有领域这里提到的算法都是核心。
我们编写一个程序一般是为了解决一个问题,过程中用到一套算法。统计数据库中学生的数量需要一套算法。张一鸣正是发明了一套推送算法,创立了字节。图灵奖得主中因为在算法领域取得突出贡献而得奖的占多数。
一个思想上有深度的算法的诞生,标志着一类人类社会中的问题可以用计算机来实现了。
如何学习算法?
算法是核心,而且软件领域只有两种事情,别人的代码,我们要读懂,还有自己要写的代码,要有编码能力。
当你学了算法后对编程逻辑就有了驾驭能力。
我建议从oi算法入手,参加一些蓝桥杯,CSP认证之类的比赛。能力强,有机会的可以去参加ACM。如果你能力一般,那就是以赛代练,训练能力。如果你能力强,可以去当赛棍。
当然算法竞赛和实际问题区别是很大的,你不能短时间用算法编写程序不代表你比竞赛选手在计算机实际应用中的能力就差。参加比赛可以训练一定的编码能力。大一的计算机新生适合做一些算法竞赛具备这个必备能力。
我建议学习资源可以选择acwing网站和《算法竞赛进阶指南》
我们没必要一上手就是数据结构,看着冗长的代码,用算法竞赛的写法培养一下能力最重要。
当你有了对基础算法的掌控能力后,要仔细学习数据结构。
了解IT的各个领域

当你可以驾驭一门编程语言之后,你就可以几个小时内学习一门高级语言。只需要看最基础的语法就可以上手了。要在实践中学习。要有查阅技术社区博客和官方文档的能力。
IT领域中别人开放过的项目的代码你是不可能全部读完的,要想去认识,只有培养去理解的能力和查阅资料的能力,按照需求出发去选择性学。
可以学一下别的编程语言和数据库,相信你这时学习这些内容并不需要多长时间。
这样你已经提升了认知,打开了计算机的潘多拉魔盒。你可以了解任何一个方向,选择你所喜欢的方向进行深耕,网络安全,云计算,后端开发,前端开发,游戏开发,人工智能。你有自学看懂这些书籍的能力,因为你有了编码能力。
学好核心内容
计算机核心课程
考研所考的内容是数据结构与算法,操作系统,计算机组成原理,计算机网络,这几门是计算机的核心。
至于编程语言和数据库等知识,实操永远是第一位的。就像没有每天看游戏角色数据而不去玩的电竞选手。核心的是编码能力和认知,这些学科概念没任何用处,会实操即掌握。因为计算机世界中一部分是别人写的代码,一部分是自己写的。自己写需要逻辑能力,而这些学科是别人写的代码,给了你一个接口,你可以用你的编码能力来认识,来使用。但是发明者起的名词只需要灵活掌握。
我们知道清华姚班的姚期智教授,删除了老化课程,加强了核心学习,引导学生在本科阶段培养自己的专长。
核心课程
回到核心课程中,这些核心课程相对有必要按照科班教科书式地学习。而且也是考研所需要的内容,所以我们也不得不系统学习概念来获得一定的应试能力。
操作系统
程序员必须对操作系统掌握好,操作系统就是一个大程序,一般书会从抽象层次来开始讲述,什么是抽象,就是不给你具体代码,来讲述想要写的程序的逻辑。这个过程需要慢慢来理解。
程序使用的操作系统和服务器使用的操作系统是Linux,我们必须熟练掌握Linux的命令。
这里推荐MIT的CS计算机操作环境导论,学会Linux的命令才能进行开发。学Linux系统的操作和学习操作系统理论知识不存在先后关系,根据需求来学。
学好操作系统基础知识之后去看Linux的内核源代码,从具象层次将操作系统理解透彻,才能成为大牛。推荐《深入理解LINUX内核》。
计算机组成原理
可能是考研专业课中的瓶颈,涉及硬件层次的计算机架构,操作系统处于硬件和应用程序之间。
要想学好计算机组成原理,可以学一点数字电路,如果不做硬件开发的话,数字电路理解即可,简单涉略,没必要进行设计。也要学习一定汇编语言,这对于操作系统和计算机组成原理都是很有必要的。
当然直接拿计算机组成原理和操作系统的书来学也是可以的,但是这样可能就需要就好的抽象理解能力了。
计算机网络
网络的基础知识是比较简单的。理解网楼哦层次架构,记忆协议就可以。
计算机与基础自然科学的关系
物理学
其实目前技术应用上并没有关系,我们最底层研究到数字电路,但是数字电路是逻辑门的设计,用不到电压和电流等电学知识,哪怕你是嵌入式开发者,芯片设计者,也是不需要电学的。跟别说力学,相对论和量子力学了。
物理对于计算机毫无意义吗,也不是,摩尔定律失效是因为芯片设计碰到了量子力学,时代是向前发展的,基础自然科学对于你认知的提升有帮助。可能有些人也有计算机与物理结合方面的志向,但是物理学与目前真正的计算机核心毫无关系,根据自己需要完全可以不学。
生物,化学与计算机的联系是更小的。
数学
如果你的目标只是进厂,那么也许对于你来说更重要是业务能力,后端开发,前端开发,游戏开发,是最基础的工作都是具备编码能力,工作经验就可以胜任的。这时候很多码农就提出了数学无用论。
但是你要想自己设计一套算法,研究密码学,人工智能,做一个真正的高级人才,而不是码农,数学的要求是相当高的。最核心的是线性代数,概率论,离散数学。当然你需要的不是应试能力,是真正的数学能力。
我们常说计算机行业饱和了,其实不然,现在的世界是不缺少码农的,码农是可以社会培训几个月速成的,但是高级人才在我国都是缺口。BAT都没有实力养一套自己的加密算法。中国的第三代黑客也是处于断档,网络安全人员急缺。
僧多粥少,很多人忙于过度无意义内卷来试图通过分数更高来获得竞争力。其实也可以换一个思路,重剑无锋,在绝对的实力面前一切技巧都是徒劳,艰难之业当累日月。你可以选择一个自己愿意沉下心来钻研的方向进行深耕,会学到真正的技术,随大流是必不讨好的。
如果你把每一天当成最后一天来活的话,你就会轻松自在。 ——Steve jobs
相关文章:
计算机的学习路线
本文是介绍如何成为一个Geek,一个真正的计算机高手。 适合有成为IT领域技术大牛的人参考。 写给大一新生和所有向深耕IT领域的人,避免走一些弯路。 第一门入门的必备功课-语法与算法 什么是计算机? 用来做运算的机器 电子计算机在运算方面…...
TD算法超详细解释,一篇文章看透彻!
【已解决】TD算法超详细解释和实现(Sarsa,n-step Sarsa,Q-learning)一篇文章看透彻! 郑重声明:本系列内容来源 赵世钰(Shiyu Zhao)教授的强化学习数学原理系列,本推文出于非商业目的分享个人学习…...
4.1 路由器(华硕 官改/梅林 华为 小米 路由) 使用花生壳 实现远程管理
最近添置了一台华硕的八爪鱼GT AC5300,到手后刷了官改,而里面软件中就提供了花生壳程序,想到花生壳为每个用户提供了两条免费映射(带宽为1mbs,流量为1g/月),所以就打算利用来做一个远程访问。具…...
内容算法解读:提高内容摘要与原文的一致性(Faithfulness)
全文摘要:受益于预训练语言模型的发展,应用神经网络模型提取内容摘要的技术也获得了长足进步。但目前还存在一个未被很好解决的问题:神经网络模型提取的摘要不能如实反映原文档的中心思想,没有做到忠实(not faithful&a…...
python用openpyxl包操作xlsx文件,统计表中合作电影数目最多的两个演员
题目🎉🎉🎉:编程完成下面任务:已知excel文件“电影导演演员信息表.xlsx”如下图所示:🍳🍳🍳要求:使用 openpyxl 包操作打开此文件,编写程序统计在…...
Lesson12---人工神经网络(1)
12.1 神经元与感知机 12.1.1 感知机 感知机: 1957, Fank Rosenblatt 由两层神经元组成,可以简化为右边这种,输入通常不参与计算,不计入神经网络的层数,因此感知机是一个单层神经网络 感知机 训练法则&am…...
算法练习-排序(二)
算法练习-排序(二) 文章目录算法练习-排序(二)1 合并排序的数组1.1 题目1.2 题解2 有效的字母异位词2.1 题目2.2 题解3 判断能否形成等差数列3.1 题目3.2 题解4 合并区间4.1 题目3.2 题解5 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面5.1 题目5.2 题解6 颜色分类6.1 题目6.…...
202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多
202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多 《长安的荔枝》这本书真是酣畅淋漓啊,读起来一气呵成,以讲故事的口吻叙述,上林署九品小官员——李善德,兢兢业业工作多年,终于借贷买了房&…...
java封装继承多态详解
1.封装 所谓封装,就是将客观事物封装成抽象的类,并且类可以把数据和方法让可信的类或者对象进行操作,对不可信的类或者对象进行隐藏。类就是封装数据和操作这些数据代码的逻辑实体。在一个类的内部,某些属性和方法是私有的&#…...
【uni-app教程】UniAPP 常用组件和 常用 API 简介# 知心姐姐聊天案例
五、UniAPP 常用组件简介 uni-app 为开发者提供了一系列基础组件,类似 HTML 里的基础标签元素,但 uni-app 的组件与 HTML 不同,而是与小程序相同,更适合手机端使用。 虽然不推荐使用 HTML 标签,但实际上如果开发者写了…...
阿尔法开发板 .bin 文件烧写
一. IMX6ULL 开发板简介 IMX6ULL 开发板是正点原子提供的阿尔法开发板,所用芯片为恩智浦,基于 Cortex-A7 架构。 这里介绍一下裸机篇中,关于如何将 .bin 文件烧写进 SD 卡,从而设备运行程序。 二. xx.bin 文件烧写 IMX6ULL支…...
Ceres-Solver 安装与卸载ubuntu20.04
卸载 sudo rm -rf /usr/local/lib/cmake/Ceres /usr/local/include/ceres /usr/local/lib/libceres.a 安装 sudo apt-get install libatlas-base-dev libsuitesparse-dev git clone https://github.com/ceres-solver/ceres-solver cd ceres-solver git checkout $(git descr…...
汇编系列02-借助操作系统输出Hello World
说明:本节的程序使用的是x86_64指令集的。 汇编语言是可以编译成机器指令的,机器指令是可以直接在CPU上面执行的。我们编写的汇编程序既可以直接在操作系统的帮助下执行,也可以绕过操作系统,直接在硬件上执行。 如果你打算编写的汇编程序在…...
【2023unity游戏制作-mango的冒险】-前六章API,细节,BUG总结小结
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:unity游戏制作 ⭐mango的冒险前六章总结⭐ 文章目录⭐mango的冒险前六章总结⭐👨&a…...
进程控制及其操作
进程创建1.1 fork()函数1.2 fork()函数的返回值进程等待2.1 进程等待的必要性1.之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。 2.另外,进程一旦变成僵尸状态,那…...
Git常用命令复习笔记
1. Git与SVN区别,各自优缺点 Git: 分布式,每个参与开发的人的电脑上都有一个完整的仓库,不担心硬盘出问题;在不联网的情况下,照样可以提交到本地仓库,可以查看以往的所有log,等到有…...
代码随想录算法训练营day49 | 动态规划 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV
day49123.买卖股票的最佳时机III1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组188.买卖股票的最佳时机IV1.确定dp数组以及下标的含义2.确定递推公式4.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组123.买卖股票的最佳时机III …...
【教学典型案例】14.课程推送页面整理-增加定时功能
目录一:背景介绍1、代码可读性差,结构混乱2、逻辑边界不清晰,封装意识缺乏3、展示效果不美观二:案例问题分析以及解决过程1、代码可读性…...
【算法基础】DFS BFS 进阶训练
DFS与BFS的基础篇详见:https://blog.csdn.net/m0_51339444/article/details/129301451?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129301451%22%2C%22source%22%3A%22m0_51339444%22%7D 一、案例分析1 (树的重心 —— D…...
GO语言中的回调函数
0.前言 回调函数是一种在编程中常见的技术,通常在异步编程中使用。简单来说,回调函数是一个被传递给另一个函数的函数,它在该函数的某个时间点被调用,以完成某些特定的操作或任务。 在Go语言中,可以将函数直接作为参…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

