计算机专业学习的核心是什么?

news2024/11/22 15:39:10

既然是学习CS,那么在这里,我粗浅的把计算机编程领域的知识分为三个部分:

  • 基础知识

  • 特定领域知识

  • 框架和开发技能

基础知识是指不管从事任何方向的软件工程师都应该掌握的,比如数据结构、算法、操作系统。

特定领域知识就是你从事某个细分方向时需要掌握的知识,比如做游戏引擎的需要掌握图形学;做前端的需要掌握浏览器渲染原理、前端三大件;算法工程师需要更多的数学知识。

毕竟计算机各种门类挺多的,需要选个细分方向专研下去,什么都学只会什么都不精(大佬除外啦。

上面那么划分可能有同学还比较疑惑,再细一点,我认为需要重点掌握学习的就是 :

  • 2-3门编程语言(1-2静态编译型:C/C++、Java + 1-2 动态/脚本语言: Python、shell之类)

  • 算法与数据结构

  • System(OS、计算机组成、memory、cache等等)

  • 工程开发能力(git、linux、shell、环境搭建、部署等)

计算机专业的核心课几乎都是围绕着构建上诉这些能力来的,比如:

  1. 计算机学科导论和 C 语言

  2. 汇编、操作系统、C++、数据结构、离散数学、数值分析和计算机组成原理

  3. 计算机编译原理和数据库

  4. 计算机网络与安全和软件工程

还有高数、线性代数、离散数学、网络原理、网页设计、多媒体技术、汇编语言、面向对象的设计语言、Java 编程、ASP、SQL等

总的来说是

  1. 先学习 C 语言和 C++。教材有:C programming language-K&R、C traps and pitfalls、Algorithms in C 和 Expert C Programming

  2. 学习数据结构。清华大学严蔚敏《数据结构》,目前还未找到经典的国外教材

  3. 学习算法。算法导论和具体数学及其应用

  4. 计算机组成原理。Computer Organization and Design The Hardware-3rd-David Patterson

  5. 计算机系统。CSAPP

  6. 操作系统。鸟叔的私房菜和计算机网络

一、学习顺序

可以直接参考网易云课堂上CS科班的课程安排,国内几乎大部分高校都是这样:

这里也顺便给学弟学妹们推荐一些优秀的学习资源:

核心就是计算机底层 + 通过造轮子方式学习计算机基础课:

操作系统

国外有很多优秀的操作系统公开课,比如 mit6.828、哈佛 OS/161, 这类课程基本都是给你一个 mini os 壳,让你去完成部分操作系统的核心模块,比如线程管理、文件系统、分页、调度等。

相比纯看书,这样的学习方式无疑更加的生动和有趣。

这是课程官网:

https://pdos.csail.mit.edu/6.828/2018/schedule.html

中国的知名大学,世界知名大学的操作系统课都有大实验,有一个现成的小系统让你去学习,分析。比如MIT有xv6,哈佛有,伯克利有Nachos,斯坦福有PrintOS, 清华有ucore等等。这些代码全是开源的,也都在1两万行上下,完全可以在大学期间啃下来。

国内也有一些顶尖高校也是采取类似的方式,比如清华ucore、哈工大 好像是基于 Linux 0.11魔改

哈工大:

https://github.com/hoverwinter/HIT-OSLab

有些还有配套的视频,比如清华在线的慕课:

https://next.xuetangx.com/course/THU08091000267/1516699

另外推荐一本可以让你从零开始写一个mini os的书《操作系统真象还原》,这本书讲得真的非常的细致。

数据库

都说很多开发是 crud ,而crud的对象就是数据库,所以好好掌握数据库的原理也是非常重要的,如果也能通过造一个简单的db的方式来学习,我相信这样的方式一定是最好的:

当然了,实现一个数据库也是相当有难度的,你大概需要这些知识:

  • SQL解析,你需要实现一个语法分析器, 《编译原理》的基础知识就用上了,不过这里自己去实现不太现实,可以参考TIDB,用Lexer & Yacc去做 SQL的解析,生成 AST。

  • 数据需要持久化存储,这里需要考虑存储引擎,涉及到《操作系统知识》需要对外提供接口,B+树等数据结构知识,这里简单一点甚至可以直接写到文件,毕竟管理磁盘也挺恶心的。

  • 实现索引

  • 需要做表的Join,事务的ACID,  进阶一点,考虑如何实现 MVCC等

  • db的client和server之间如何访问又需要用到socket编程的知识

做这些可能有点难,不过在GitHub上有教程教你如何一步步实现一个像sqllite这样的小型关系型数据, 比如这一个:https://cstack.github.io/db_tutorial/

另外 MIT 6.830 Database Systems 也是很不错一门课

这是数据库系统的一门核心课程。由数据库的一大山头Samuel Madden教授。前半部分比较基础的数据库的知识,后半段主要在讲Distributed Databases的东西,各种consistency挺有意思,也是database比较火的研究方向。

课程链接:http://db.csail.mit.edu/6.830/

还有 CMU 的两门 数据库课程也不错:

https://15445.courses.cs.cmu.edu/fall2019/   // 初级

https://15721.courses.cs.cmu.edu/spring2019/  // 进阶

计算机网络

// 这里就是考虑如何去实现个网络协议栈了

可能不需要完全实现每一层,比如可以尝试用 UDP 去把学到的那些超时重传、ACK、滑动窗口等实现一下,这样对 TCP 理解也会更加深刻

这个国外也有公开课,后面有人看再(疯狂暗示点赞哈哈哈)更新吧~

一些好书&教材

这里就不列太多了,免得吓到大家哈哈哈,随便来两本:

  • 《CSAPP》

  • 《程序员自我修养》

  • 《编码》

  • 《Inside the C++ Object Model》

  • 《Linux 高性能服务端编程》

  • 《计算机网络自顶向下》

  • ....

大家应该也看出来了,我推荐的书偏向 C++ 方向,因为我从大三开始就偏向 Linux C++ 开发方向

前前后后看了《C++ Primer》、《APUE》、《UNP》、《深度探索C++对象模型》、《STL源码剖析》、《C++设计与演化》、《Linux内核设计与实现》、《Linux内核完全注释》、《effecitve C++》 、《effective modern C++》、《程序员自我修养》、《Linux高性能服务端编程》、《Linux多线程服务端编程》(知乎陈硕大佬写的)......

顺便还看了点 Muduo 源码,自己模仿着基于 Epoll 写一个 Reactor模型的 Web 静态服务器,跟着知乎 Milo 大佬写 Json 库,总之,这段时期是写了一些小”轮子“的。

(PS:知乎上有朋友问我是如何看完这么多书的,其实在之前的文章中就写了,看书我会有选择的挑章节看,不会从头看到尾的,而且大三开始课就少了,我基本就在刷这些书,其实时间还蛮多的?毕竟我也没参加什么社团、学生会之类,也没女朋友。。。

那时候会每天记录看书的进度,感觉特别有劲:

书看得越多,其实你越能找到自己的方向,大三上我就给自己学习定位:

深入C++语言(多线程)+ 存储(学习 Redis、leveldb)+ 网络编程(学习muduo,各种网络编程模型)+ 学习分布式(MIT 6.824、ddia、google 三大论文等)

基本上是沿着上面几个方向去展开学习的,有的看书,有的论文,也有的看博客看源码。

总之,知识面在大三不断扩充,自己开始关注学习 C10K、C100K 这样的后台服务器开发高性能、高并发的解决方法。

当然了,还有些到现在还没开始,比如 leveldb 的源码、6.824 的 lab,可能是变懒了......

也可能是学习变得不那么纯碎面向技术了,变成面向工作、面向赚钱了哈哈哈。

值得一提的是,大三上我们学院有门 System Programing 的课,教材就是使用的 CSAPP,因此我之前大二草草看完的书,得以再次翻开,这一次我把附带的是个实验也挨着挨着做了,收获良多,有位运算各种奇技淫巧,有 Bomb lab 刺激的打怪通关、也知道了buffer overflow attack.... 还有实现基本的内存管理等等。


另外,对于还在大一、大二的很多学弟学妹们来说,可能觉得刚学会一点编程语言,什么都做不了,更不知道和实际工作的差距在哪。

那么最好的方式就是先按部就班的把学校安排的基础课程学好,再在课外自己多练习编程,了解一些业界的技术、框架。

把时间充分利用好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python花瓣雨

目录 前言 小海龟 花朵类 移动函数 画花朵 尾声 前言 来啦来啦来啦,小伙伴们快快来领取七彩花瓣雨吧!! 小海龟 老生常谈啦,在用python画樱花树前,我们先来了解一下turtle吧! 小海龟(Turtle)是P…

Java学习路线(13)——Collection集合类:List集合与Set集合

一、集合类体系结构 二、部分Collection类型对象 Collection集合特点 List系列集合是有序、可重复、有索引。 ArrayList:有序、可重复、有索引LinkedList:有序、可重复、有索引 Set系列集合是无序、不重复、无索引。 HashSet:无序、不重复…

0202条件过滤-自动装配原理-springboot2.7.x系列

1前言 在springboot的自动装配过程中,执行完候选配置类导入后,会进行条件过滤。那么在讲解条件过滤前,我们先来了解springboot常用的条件注解,以及它们底层执行原理。 在Spring Boot中,条件(Condition&am…

使用qemu模拟CXL.mem设备

CXL可以说是自PCIe技术诞生几十年以来最具变革性的新技术了。可以想象有了CXL以后机箱的边界将被彻底打破,服务器互相使用对方的内存,网卡,GPU 。整个机架甚至跨机架的超级资源池化成为可能,云计算也将进入一个新的时代。 当前In…

C++寄存器优化

在C里面有个有趣的现象&#xff0c;先看代码 #include<iostream> using namespace std; int main() {int const tmp 100; //定义常量tmp tmp不能修改int const* p &tmp; //不能通过指针修改指向的值 int* const q const_cast<int*>(p); //去常属性 可以通过…

【C++11】C++11新增语法特性 右值引用/移动语义/完美转发

C11 右值引用 1 右值引用1.1 左值 、 右值1.2 左值引用 VS 右值引用1.3 谈谈C11引入右值引用的意义1.4 左值引用和右值引用的一些细节问题 2 移动语义3 完美转发4 总结 1 右值引用 1.1 左值 、 右值 在C中所有的值不是左值就是右值。左值是指表达式结束后依然存在的持久化对象…

【JavaSE】Java基础语法(二十二):包装类

文章目录 1. 基本类型包装类2. Integer类3. 自动拆箱和自动装箱4. int和String类型的相互转换 1. 基本类型包装类 基本类型包装类的作用 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一&#xff1a;用于基本数据类型与字符串之间的…

Goby 漏洞更新|锐捷网络 NBR路由器 webgl.data 信息泄露漏洞

漏洞名称&#xff1a;锐捷网络 NBR路由器 webgl.data 信息泄露漏洞 English Name&#xff1a;Ruijie NBR Router webgl.data information CVSS core: 7.5 影响资产数&#xff1a;204290 漏洞描述&#xff1a; 锐捷网络NBR700G路由器是锐捷网络股份有限公司的一款无线路由设…

口碑超好的挂耳式耳机盘点,这几款蓝牙耳机值得一看!

运动已成为人们业余生活中不可缺少的组成部分&#xff0c;徒步、夜跑、骑行等运动项目受到越来越多的人的喜欢&#xff0c;运动与耳机的搭配也是当代年轻人喜爱的行为方式&#xff0c;在颠簸的运动项目中耳机的稳固性和舒适性是非常主要的&#xff0c;现在新推出的开放式耳机深…

Ps:移除工具

移除工具 Remove Tool是一款简单易用、功能强大的工具&#xff0c;可快速、轻松地清去除图片中的干扰元素或不需要的区域。 快捷键&#xff1a;J 就如同使用画笔工具一样&#xff0c;只要在不需要的对象上涂抹&#xff08;描边&#xff09;即可将其去除。 移动工具基于人工智能…

几号发工资就能看出公司的好坏?(文末附招聘岗位)

作为一名资深的职场搬砖人&#xff0c;不知道各位最近有没有跟我一样关注到这个话题 ​#发工资时间看公司#小编刚看到这个话题的第一印象&#xff0c;想的是发工资时间无非是公司实力的体现&#xff0c;工资发的越早证明这个公司的现金流越稳定强大。 打开评论区&#xff0c;不…

Linux——进程优先级

1.什么是优先级&#xff1f; 优先级和权限息息相关。权限的含义为能还是不能做这件事。而优先级则表示&#xff1a;你有权限去做&#xff0c;只不过是先去做还是后去做这件事罢了。 2.为什么会存在优先级&#xff1f; 优先级表明了狼多肉少的理念&#xff0c;举个例子&#xff…

Processing通过编程实现艺术设计_实现艺术和现实的交互---数据设计分析002

还记得这个生命的游戏,也是在这上面有 https://processing.org/ 官网是这个 使用Processing可以用编程的方式来创作艺术 Processing是一门开源编程语言,可以直接对用它来做艺术创作, 可以看一些它的作品 https://processing.org/examples/gameoflife.html 官网是这个,完…

作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)

gdb(GNU Debugger) 是一个用于调试 Linux 系统的软件工具。在学习 Linux 的过程中&#xff0c;gdb 的重要性不言而喻。以下是 gdb 在 Linux 学习者中的重要性的详细说明: 帮助理解 Linux 系统的运作方式:gdb 是一个强大的调试工具&#xff0c;可以帮助学习者深入了解 Linux 系统…

代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划

代码随想录算法训练营day53 | 1143.最长公共子序列&#xff0c;1035.不相交的线&#xff0c;53. 最大子序和 动态规划 1143.最长公共子序列解法一&#xff1a;动态规划 1035.不相交的线解法一&#xff1a;动态规划 53. 最大子序和 动态规划解法一&#xff1a;动态规划解法二&am…

Python学习38:凯撒密码——解密

类型&#xff1a;字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述‪‬‪…

【Netty】Netty 编码器(十三)

文章目录 前言一、MessageToByteEncoder 抽象类二、MessageToMessageEncoder 抽象类总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff09;Netty 架构设计&#xff08;二&#xff09;Netty Channel 概述&#xff08;三&#xff09;Netty ChannelHan…

notepad++查询指定内容并复制

背景说明 记录一下使用notepad进行文本内容查找以及替换的相关场景,简单记录方便后期查看,场景内容: 1.从指定的给出内容中筛选出所有的人员id集合 2.将每一行后面添加逗号 1.从指定的给出内容中筛选出所有的人员id集合 要求从指定的给出内容中筛选出所有的人员id集…

便携式明渠流量计的使用特点

便携式明渠流量计使用特点&#xff1a; 便携式明渠流量计使用特点&#xff0c;首先了解相关要求&#xff1a; 随着新标准JJG711-1990《明渠堰槽流量计试行检定规程》、HJ/T15-2019《超声波明渠污水流量计技术要求及检测方法》、HJ 354-2019《水污染源在线监测系统(CODCr、NH3-N…

Java开发 - 你不知道的JVM优化详解

前言 代码上的优化达到一定程度&#xff0c;再想提高系统的性能就很难了&#xff0c;这时候&#xff0c;优秀的程序猿往往会从JVM入手来进行系统的优化。但话说回来&#xff0c;JVM方面的优化也是比较危险的&#xff0c;如果单单从测试服务器来优化JVM是没有太大的意义的&…