最基本的计算机知识

本文转自

很多人下班后都觉得计算机基础知识不足。计算机基础知识有哪些?

我觉得首先计算机专业有六大块:组成原理、操作系统、数据库、编译原理、计算机网络、数据结构(这个说了太多遍了,这次就不说了),其次还要加上分布式基础知识,因为现在系统已经变成分布式了。

如果你从事的是应用层开发,那么几门课程中的一些内容与日常工作的相关性不大。我会挑选最重要的,并把它们作为一个整体来说最小集

计算机组成原理

如果你不是操作系统驱动,直接处理硬件的机会很少,因为操作系统已经屏蔽了它们并提供了给我们抽象API。

但也必须了解冯诺依曼系统的结构,CPU与内存的关系,硬盘,各种外设,寄存器,缓存等知识。

CPU有哪些指令,如何执行这些指令?如果实现了数组、结构、函数调用,这就涉及到汇编的知识。

原码、补码、定点数、浮点数的表示和运算也是编程中必不可少的知识,几乎每种语言都涉及到。

现在很多语言都在虚拟机上运行。只要了解计算机的组成原理,看看哪些虚拟机,就会发现概念都是一样的。

此外,CPU中缓存、缓存一致性协议、DMA的异步思想也会体现在应用层。

如果能找到一本书,尽可能的把这些知识覆盖,我觉得还是神书《深入理解计算机系统》的前四章。之前也写过关于它的书评。这里:《深入理解计算机系统》为什么是神书?

《编码》是一本比较通俗,也比较有趣的关于构图原理的书。

操作系统

操作系统很无聊。从应用层的角度,我觉得重点是把握操作系统提供的抽象,包括进程、线程、文件、虚拟内存以及进程间的通信问题。

几乎所有的编程语言都会支持多进程或多线程编程,尤其是多线程并发编程,所以我们必须了解它们的本质是什么,线程是如何实现的(这对以后学习各种语言和并发模型会有很大的好处)。我们必须真正认识到“进程是资源分配的最小单位,线程是调度的最小单位。”这句话的意思。

几乎所有的编程语言都涉及锁和死锁。最好了解锁是如何在底层实现的。

需要了解虚拟内存和物理内存的直接关系,分段和分页,以及文件系统的基本原理。

对于进程调度,页面分配/替换算法,磁盘调度算法,I/O系统,我觉得优先级比较低。

计算机网络

我认为必须理解的是:

什么分组交换

TCP可靠传输原理,TCP/IP协议细节,三次握手,四波,TCP状态转换。

几个重要的协议DHCP,UDP,ARP,DNS。

它可以告诉客户端在访问网络后如何通过这些协议跨域网络与服务器通信。

将套接字知识和网络安全与应用层紧密结合(对称加密、非对称加密、哈希、数字签名和Https)

至于网络层的路由算法和链路层的各种协议,我觉得优先级比较低。

还有一个重要的知识点,一般的网书都没有提到。是输入输出复用吗涉及同步/异步、阻塞/非阻塞、选择/epoll,这是很多软件的基础,《Unix网络编程》和《深入理解计算机系统》有描述。

以上知识,当你学习Redis,Ngnix,Tomcat,LVS等软件的时候会有很大的帮助

资料库

这个和日常工作结合极其紧密,不用我再多说,包括最基本的SQL,各种范式,事务及其隔离级别,事务的实现方式,索引及其实现方式,B+树等等。

编译原理

你可能一辈子都不会写编译器,但是很有可能你会用现有的工具来生成/操作一个抽象语法树(AST),甚至写一个DSL(领域特定语言)。所以你必须了解词法分析、语法分析、语义分析、中间代码生成、代码优化的基本编译过程。

学习了编译和原理之后,你会对一些语言设计有更深入的了解,比如LISP。

分布式理论知识

因为现在的系统已经逐渐变得分布式,很多相关的基础知识都需要学习:

数据复制和一致性:

帽理论,基本原理,幂等性,2PC,TCC

数据分段和路由:

哈希碎片:哈希模(实践中非常常见的算法)、虚拟桶(Redis使用)、一致哈希(memcached使用)

范围碎片

最后,我想说的是,我们不能带着一种特殊的功利目的去学习这些基础,也不能想着马上把它们运用到实战中,从中受益。更重要的是理解和掌握他们背后的思想。总有一天你会发现:哦,我在哪里见过这个问题?我们可以用类似的方法解决!

学习相关知识:

计算机网络基础:学习最基础的计算机网络知识,包括Packet_Tracer的使用,NAT配置,以及GNS3对一些常见网络协议的数据包捕获分析。点击文末“阅读原文”立即学习!

大家都有不错的技术原创文章

点击查看提交详情重金悬赏 | 合天原创投稿等你来!

“看原文”,开始学习!

国务院侨务办公室

暂无留言,赶快评论吧

欢迎留言