热门回答:
非常重要。必须认真学习。
学习基础知识从来都是枯燥的。而且很多时候会给我们一个错觉。就是基础知识没有用。这主要是因为。我们未来工作以后。更多的是面向应用。更直接的就是面向工具的使用。基础知识基本是不可能直接拿出来用的。所以。大家就会觉得我只要懂应用方面的知识就好了。基础知识根本不需要去学。
就拿程序员来举例:
很多的程序员培训机构。他们并不会教任何的基础知识。直接就是教编程语言。然后设计一些案例做练习。3个月-6个月基本就结束。这样教出来的程序员能够写代码吗?当然是能的。不然这些培训机构早垮了。而很多大学本科4年读完的应届生。说不定写代码都没有这些培训几个月的学生强。大学4年对于程序员来说难道就是白费吗?
并不是的。
基础知识决定的是你未来的高度。可能你作为一个初级、中级程序员。你不一定会用到数据结构、算法、编译原理。但初中级的程序员就是你未来几十年的全部吗?
如果是的。在你30多岁的时候。应该就会面对裁员了并且很难找到下一份工作。
程序员是一个干到老学到老的工作。每天都需要去学习一点新的知识。技术也是在不断的演进。需要去了解未来的技术发展方向。这样才能够一直产生价值。而基础知识是什么呢。就是当你对技术了解越深入时。越需要用到的东西。
例如:你要做大数据的工作时。你需要数据建模。需要在海量的数据中抽取自己需要的数据。还需要不影响系统的性能。运算速度更快。那么你就必须要了解算法。了解时间复杂度。如果你曾经大学时好好的学习了这些知识。并且时不时会温习一下。那么你更高更快的胜任这份工作。
但是。对于一个只是了解应用知识的程序员来说。他需要想办法学习你用4年时间堆积起来的知识。而且还不一定有可靠的老师能够教他。
再举个例子。现在华为需要一些技术人才。来做他方舟编译器的迭代。待遇非常可观。
而这时。对于懂数据结构、懂算法、懂编译原理的人来说。查的无非就是一些应用实践的知识。这些知识只要有基础、有环境。1-2周就可以上手。
但是对于只懂应用知识的人。他可能就是看都看不懂。华为也就不可能去招聘这样的人。
所以。程序员也是有高低之分的。有的年薪百万。有的年薪可能就十来万。谁不想拿百万年薪呢?可能他们也觉得某些知识没有用。所以没有去认真的学吧。
其他观点:
数据结构和算法。操作系统。编译原理。计算机组成原理这些课程对普通程序员来说是否需要去学习?会带来哪些帮助?
一、数据结构与算法
正如 N.Wirth 教授所说的:数据结构+ 算法=程序。
遇到一个实际问题。充分利用所学的数据结构。将数据及其之间的关系有效地存储在计算机中。然后选择合适的算法策略。并用程序高效实现。
这句话可能有点抽象。我举个例子给你们解释一下。
在工作过程中。我们多多少少都接触过 OAuth2 。在使用 OAuth2 授权的时候。通常应用会弹出一个类似这样的信息:
1) 获取用户基本信息接口2) 获取用户列表接口3) 用户分组管理接口。。。
思考一下。如果让你设计数据库。应该怎么设计信息存储权限?
如何你熟练掌握了各种数据结构的特点的话。那自然而然想到使用 bitmap 来存储权限。
我们把权限划分成最小粒度之后。每一个 bit 都它的含义。 例如我们把权限划分为以下几种:
获取你的头像、性别、昵称等基本用户信息
以你的身份发布微博
获取你的好友列表
获取你的朋友圈信息
每勾选一个选项。就代表着这个权限被授权。为了保证可扩展性。我们使用一个 uint64 来保存这些 bit 。也就是说。我们一共可以划分 64 种细分权限。然后对这些权限进行组合。
例如。第一个 bit 如果设置了。那么就代表可以获取你的昵称、头像、地区、性别等基本用户信息。 第二个 bit 如果设置了。就可以用你的身份发状态。
数据结构的实际作用还有挺多。感兴趣的可以搜索以下知识点:
二叉树搜索用于中断处理、登记缓存查找等
哈希表。用于实现索引节点、文件系统完整性检查等
红黑树用于调度、虚拟内存管理、跟踪文件描述符和目录条目等
Radix 树。用于内存管理、NFS 相关查找和网络相关的功能
......
上面这些例子是关于数据结构的。我再举一个算法的例子。
同样的也来思考一个问题:计算机的缓存容量无论再大。缓存满了还是要删除一些内容。给新内容腾位置。
那么删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存。而把有用的数据继续留在缓存里。方便之后继续使用。那么。什么样的数据。我们判定为「有用的」的数据呢?
这个时候采取的策略就是 LRU 缓存淘汰算法。
LRU 的全称是 Least Recently Used。也就是说我们认为最近使用过的数据应该是是「有用的」。很久都没用过的数据应该是无用的。内存满了就优先删那些很久没用过的数据。
具体的关于 LRU 缓存淘汰算法 的介绍可以看我之前写的一篇文章。
二、操作系统
先来看一下操作系统都有哪些内容。
现代计算机系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。
说实话。程序员不可能会掌握所有计算机系统的细节。所以在硬件的基础之上。计算机安装了一层软件。这层软件能够通过响应用户输入的指令达到控制硬件的效果。从而满足用户需求。这种软件称之为 操作系统 。它的任务就是为用户程序提供一个更好、更简单、更清晰的计算机模型。
我们依旧通过一个例子来解释操作系统在工作中的帮助。
例子来源于 知乎大佬 @invalid s 。
比如说。做一个网络代理软件。不过是从 socket 上收一个包然后转发给另一个 socket 而已。这好像和操作系统没多大关系吧?
但真做了。你会发现。用一个线程处理网络 IO。只要写对了。那么哪怕系统压力很大。只要 CPU 顶得住。就可以保证引入的延迟总是在几个毫秒之内;但如果用了多线程分别处理收/发。那么只要网络压力稍大。引入的延迟就会增加。很快额外延迟就可能突破几十个毫秒(这实际上已经完全不能用了)。
想搞明白这是为什么。对操作系统调度原理、时间片等概念没有足够深刻的理解。是不可能的。
尤其是。当你突然遇到类似“系统压力一大网络延迟急剧升高”的 bug 时。如果对操作系统没有深入理解。你连准确描述都做不到。连查资料、求帮助都不知道该往哪个方向努力。更不用说 debug 了。
换句话说。你可以不造轮子。但是你要知道这轮子是怎么造的。否则你连问问题都不知道如何去描述。
再降维一点。你总要掌握如何安装 Windows 系统吧。否则妹子让你去她房间里修电脑你都只能拒绝掉!
三、编译原理
众所周知。编译技术是计算机科学史上的明珠之一。
对于编译原理。很多程序员的困惑就是:我也不会去设计一门新的编程语言。有必要学习编译原理吗?学了有什么用呢?
实际上。编译原理不是用于炫耀的屠龙技。程序员在工作中经常会碰到需要编译技术的场景。比如:
编写界面模板引擎;
为项目编写各种各样的 DSL;
深度理解甚至开发出 Spring、Hibernate、阿里巴巴 Druid 这样的工具。
除此之外。解析用户输入。防止代码注入。为前端工程师提供像 React 那样的 DSL。像 TypeScript 那样把一门语言翻译成另一门语言。像 CMake 和 Maven 那样通过配置文件来灵活工作。运维工程师分析日志文件等等高级别的需求。都会用到编译技术。
当然。说实话。编译原理并非随随便便就能入门的!
换言之。需要准备一些基础知识在学习。
编译原理的学习和实践通常基于对计算机编译过程、计算机基本工作原理、甚至一定的数学知识有一定积累。这些知识分别分布并应用在了编译原理的不同阶段。
没有这些基本知识的积累。很快就会在某个阶段由于功底不够而无法再继续后面的学习。
所以不要一开始就去啃编译原理。
四、计算机组成原理
从上面这张图可以看出来。整个计算机组成原理。就是围绕着计算机是如何组织运作展开的。
我们依旧来举例子:)
每个程序员应该都知道 Ascii 码。GB2312。GBK。Utf8。Unicode 等编码格式。如果你没接触过。那总出现过文件压缩后解压乱码的情况吧?
了解了这些编码的存储格式。你才会明白为什么会有中文乱码问题。靠。我在写这个回答的时候。我的后端同事发给我的日志就出现了中文乱码。。。。
再来个例子。
我们上面举的关于 LRU 缓存算法 的例子。它的设计也是借鉴计算机组成原理的内容的。
在计算机的世界里。空间换时间。时间换空间这个概念在复杂的设计中时常出现。
如果你想更详细的了解 计算机组成原理 的知识。推荐一本书:《计算机组成:结构化方法》。
书的内容完全建立在“计算机是由层次结构组成的。每层完成规定的功能”这一概念之上。
1、数字逻辑层
2、微体系结构层
3、指令系统层
4、操作系统层
5、汇编语言层
6、并行体系结构
以上就是我对 计算机基础知识对程序员来说有多重要 的一个回答。
其他观点:
那要看什么样的基础知识了。要是与非门之类的。对高级语言开发没嘛用处。但对低级语言开发就有点用处了。若是数据结构之类的基础知识。那就对高级开发语言有用了。基础知识并非全有用。只是有适用的环境而已。
您还感兴趣的文章推荐
- 为什么喜欢的总是害自己最深的?背后有何规律?
- 在北京月入14k,这种情况下要不要离职呢?
- 在当前社会背景下,学生学历低会导致爹不疼娘不爱且家庭成员不和睦吗?
- 刚刚离职的我现在还能从事哪些工作呢?
- 为何无人治理满大街逆行的送餐骑手?背后原因大揭秘
以上就是由互联网推广工程师 桔子生活网 整理编辑的,如果觉得有帮助欢迎收藏转发~
本文地址:https://www.wangchuang8.com/168914.html,转载请说明来源于:桔子生活网
声明:本站部分文章来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系进行处理。分享目的仅供大家学习与参考,不代表本站立场。
评论(2)
程序员,原理,数据结构,计算机,算法,基础知识,缓存,知识,数据,操作系统
没想到大家都对计算机基础知识对程序员来说有多重要?感兴趣,不过这这篇解答确实也是太好了
非常重要。必须认真学习。学习基础知识从来都是枯燥的。而且很多时候会给我们一个错觉。就是基础知识没有用。这主要是因为。我