当前位置: 首页 > news >正文

计算机科班比其他专业有多少优势呢?

大家好,我是小北。

经常会有小伙伴问:”现在生化环材、机械这些专业自学 Java等语言后都可以找软件开发相关工作,那么计算机科班的学生学了这些课程又有什么优势呢?”

个人觉得就是系统学习过计算机课程的,应该建立起计算机系统能力,也就是在写代码、设计程序的时候会站在系统的角度考虑,怎么样才更加高效,或者说符合计算机的思维方式。

那么我们常说的计算机系统又是什么东西呢?

我看过很多同学将 计算机系统操作系统 划等号,尤其是网上很多同学推荐操作系统书籍,竟然把《深入理解计算机系统》这本书放在首位,尽管 CSAPP 这本书内有部分 OS 内容,但是我任然觉得它更是偏向“计算机系统”而非“操作系统”。

我理解中的计算机系统应该是包括计算机组成、存储层次、IO、高级语言程序及其实现机制、指令集、操作系统、编译器、链接器、加载等。

汇总起来就是:

一个程序在计算机中到底是如何运行的。

学习这些东西个人觉得并不是说就能让你怎么牛逼,这肯定不行,只是这些系统的知识能够在学习其它应用知识的时候帮助我们快速迁移学习,比如时空开销、缓存与局部性、分治、并发和并行、远程过程调用、同步异步、吞吐率和时延等概念,在实际项目中也经常会涉及到。

但是呢,国内大部分高校比较缺乏“计算机系统”方面的课程,只有少数高校有开设相关课程,比如南大计算机系统、交大等。

我们学校从 CMU 引进过 ICS(Introduction to Computer System),我们这叫做系统级编程:System Programming,教材就是使用的 CSAPP,不过有一些章节也没有上,也是靠自学。

到底什么叫系统编程呢?

系统编程真的和好的软件工程是不同的吗?这不一定。但是问题在于,软件工程和底层编程通常是孤立地教授的。虽然大部分的软件工程课程是以 Java 为中心的 “书写良好的接口和测试”,但我们也应该教给学生如何设计有重大资源限制的系统。或许我们将底层编程叫做“系统编程”,是因为很多有趣的软件系统是底层的(如数据库、网络、操作系统等等)。由于底层系统有很多的限制,因此需要设计者进行创造性的思考。

把系统编程叫做底层编程可能更好理解,就是直接面对各种底层机器细节。

如果你大学没有相关课程的话,建议可以去看看 CSAPP,国外也有几门不错的这方面课程,大家感兴趣的话可以去了解下:

一、麻省理工

麻省理工电子工程与计算机课程系下面的 EE (electrical engineering) 和 CS (com- puter science) 都开设的基 础课程:

  • MIT 6.004 计算结构 (com- putation structures)

这是一门贯穿整个计算机系统的课程。这门课包括硬件方面的门电路、功能 部件、单周期和流水线 CPU 之间的核心内容。

其次是软件方面的 C 语言、汇编语言、机器指令之间的基本内容,还涉及到过程调用、系统调用、进程、并行、性能评估等一些重要概念。

整体约等于 = 计组 + C  + 汇编 + 一些操作系统概念

教材是《计算机系统设计原理导论》

可以直接在浏览器搜索相关课程资源学习,B 站也有视频。

二、卡耐基梅隆 & 斯坦福

CMU 计算机学院与斯坦福计算机科学系比较类似,多个专业培养方案都有计算机系统或计算机工程。

这两所学校都有一门为计算机科学=专业学生开设的贯穿整个计算机系统的基础课。

其中 CMU 是 CS 213,斯坦佛是 CS 107,

CS 107 我完整的看完了,不过是很早以前的视频,当时还叫做 Programming Paradigms 编程范式,这门课我在星球也多次推荐过了,真的对你理解整个计算机、底层非常有帮助。

但是现在似乎叫计算机系统,这门课的重点在于计算机的基础设计和构建,尤其是学习软件编译的时候,运行一个程序会发生什么,以及程序是如何在内存中运行的。

课程官网:

http://web.stanford.edu/class/cs107/

b1ff82500117934e5ca2a22113606d81.png

两所学校用的教材都是大名鼎鼎的 《深入理解计算机系统》,课程内容和实验内容差不多,都是通过一组精心设计的 C 语言编程实验, 让我们能够更好地了解高级语言程序转换为机器代码的过程,深刻理解底层机器的系统结构。

也算是为后续的体系结构、编译原理、操作系统等课程打下良好的基础。

这个课程,配套的实验是精华,CMU 的总共 7 个实验,涉及数据的表 示、Cache、缓冲区溢出、 过程调用及栈的构成与使用、堆内存分配器、webproxy 等,我记得我们当时还做过一个给 C 写一个垃圾回收器,就是自己把 malloc 和 free 包起来做内存管理,好像是用的可达性分析,反正是最简单的做法,当时还写了个报告:

70cb5f5bfd85de567cbfc569c8d6084c.png

但是说实话,在国外都是在大一阶段上的课程,但是我们学校安排在了大三哈哈哈,现在回过去看,大一让我去上这个课,似乎也看不懂。。。

除了这三个学校,还有加州伯克利的 Computer Architecture 也挺不错的,总体来说这些课程内容都是比较接近的,主要涵盖以下主题:

C语言→汇编→指令 →微体系结构;编译 →链接→装入→执 行

程序性能优化、 存储器结构与管理、 并发和多线程、网络 编程

应 用级并行→数据级并行→ 线程级并行→指令级并行

大家在学校有时间的话,可以去找相关资料来学习,美国 CS 四大名校的课程体系都很不错, 非常注重计算机系统能力的培养。

并且,在课程内容横跨整个计算机系统,形成一条纵向的主线,把计算机里的每一层都串起来,而国内的课程体系更倾向于分层讲解。

比如自底向上的计组、数字逻辑、汇编语言、高级语言程序设计、操作系统、计算机网络、编译原理等,课程之间的联系比较少,这也导致了学生对 整个计算机系统的认识过程就像 “瞎子摸象”一样,很难形成一个完整的认识。

这也正是知乎上这个问题的解决方法:

db388970ca01e3fe712d2ea8a2590d87.png

RECOMMEND

推荐阅读

e2a6d394a21afe03430fa88bd34d2e5f.png

01

《深入理解计算机系统(原书第3版)》  

0795d65a27df233b55b5f43077ab9e5d.png

作者:[美] 兰德尔 E.布莱恩特(Randal E. Bryant)

大卫 R. 奥哈拉伦(David R. O'Hallaron)

译者:龚奕利、贺莲

推荐理由

本书是一本将计算机软件和硬件理论结合讲述的经典教程,内容覆盖计算机导论、体系结构和处理器设计等多门课程。卡内基-梅隆大学、北京大学、上海交大等国内外众多知名高校选用指定教材。本书的最大优点是为程序员描述计算机系统的实现细节,通过描述程序是如何映射到系统上,以及程序是如何执行的,使读者更好地理解程序的行为,以及造成效率低下的原因

1775b376447fbc6223f05f6b4acbb92f.png

02

《计算机系统解密:从理解计算机到编写高效代码》

bc0b1a046445782b6472dbb7780f4049.png

作者:[美]乔纳森·E.斯坦哈特(Jonathan E. Steinhart )

译者:张开元、张淼

推荐阅读

计算机程序硬件软件从底层实现到高层展现原理讲解,对底层知识的多个主题进行了公平的覆盖。

计算机编程不是抽象的,程序是在机器上运行的。了解计算机如何工作以及程序如何在计算机上运行是成为一名更好的程序员的必要条件。在本书中,资深工程师Jonathan E. Steinhart深入探讨了计算机背后的基础概念,比如计算机硬件,软件在硬件上的行为,如何编写高效的程序,计算机安全基础知识,以及在编写代码时需要考虑的现实问题。本书对底层知识的多个主题进行了公平的覆盖——介绍有助于提高整个系统质量的许多领域的知识(包括计算机硬件、组合逻辑、时序逻辑、计算机体系结构、计算机组成原理、操作系统、系统程序设计等)。

点击以下链接,了解更多好书~

《现代操作系统(原书第4版)》

《计算机网络:自顶向下方法(原书第7版)》

《计算机组成与设计:硬件/软件接口(原书第5版)》

《算法导论(原书第3版)》

《数据结构与算法分析——C语言描述(原书第2版)典藏版》

《计算机科学导论(原书第4版)》

《编译原理(原书第2版)》

  《数据库系统概念(原书第7版)》

e3613687c6d529a136e35830909b3947.gif

40cb309bc98e12549367bdc30a719349.png

扫码关注【深入理解计算机】视频号

1be2c77042505b2233848b21f300f990.gif

更多精彩回顾

书讯 | 10月书讯(下) |  小长假我读这些新书

书讯 | 10月书讯(上) |  小长假我读这些新书

资讯 | 什么是图数据库?图数据库实践与创新浅析

书单 | 你们要的Java学习路线图来了

干货 | 数字化转型的1个目标,3大领域,6大因素和9个环节

收藏 | 两本书助你构建智能计算系统知识树

上新 | 【新书速递】从技术小白到开发大牛,这本实验教程带你手把手全栈开发!

赠书 | 【第75期】《失控玩家》引发的思考:我们究竟离真正的人工智能有多远?79108cf89ee6c6c809f175f68479e43d.gif

相关文章:

  • 【第76期】50条有趣的Python一行代码,建议收藏!
  • 关于微服务系统中数据一致性的总结
  • 手把手教你做用户画像:3种标签类型、8大系统模块
  • 【新书速递】流量运营教科书
  • 纪念 C语言之父 丹尼斯·里奇 逝世10周年:他发明了计算机世界的钢筋水泥!...
  • 索引为什么能提高查询性能....
  • 五位卷王 | 总结的十道 JVM 面试真题!(建议收藏)
  • 【新书速递】图解IT-用Python轻松设计控制系统
  • Java、Go、Rust大比拼,高并发时代谁能称雄?
  • 32岁清华女教授获2021达摩院青橙奖,曾研制世界首台咽拭子采样机器人
  • 【新书速递】程序员必会的40种算法
  • 终于有人把流量运营讲明白了
  • 复杂的世界 简单的规律 —— 2021年诺贝尔物理奖科学背景介绍及解读
  • 【新书速递】分布式事务开山之作,带你深入理解分布式事务
  • 该囤书默默啃起来了,然后惊艳所有人
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Javascript弹出层-初探
  • JavaScript函数式编程(一)
  • Kibana配置logstash,报表一体化
  • Mocha测试初探
  • Promise初体验
  • SpringCloud集成分布式事务LCN (一)
  • Travix是如何部署应用程序到Kubernetes上的
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 创建一个Struts2项目maven 方式
  • 基于组件的设计工作流与界面抽象
  • 近期前端发展计划
  • 聊一聊前端的监控
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用 QuickBI 搭建酷炫可视化分析
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信开源mars源码分析1—上层samples分析
  • 为视图添加丝滑的水波纹
  • 我的zsh配置, 2019最新方案
  • 移动端唤起键盘时取消position:fixed定位
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # Maven错误Error executing Maven
  • #《AI中文版》V3 第 1 章 概述
  • #Ubuntu(修改root信息)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 提取注释生成API文档 帮助文档