当前位置 博文首页 > 程序员吴师兄的博客:为什么有人劝别选计算机专业?

    程序员吴师兄的博客:为什么有人劝别选计算机专业?

    作者:[db:作者] 时间:2021-06-13 15:40

    大家好,我是程序员吴师兄,一个坚持在 CSDN 日更原创的程序员。

    今天想和大家聊一聊为什么有人劝别选计算机专业?

    和大家说一句掏心窝的话:直到 2021 年,计算机专业依旧是寒门改变命运的一个最佳选择之一,要不是怕被喷,我都想把之一去掉,因为想了半天,我实在找不到其它与之匹配的选择。

    之所以会出现有人劝退计算机专业,我琢磨了一下,可能有以下几个原因:

    1、本身对编程无感,但听说计算机专业高薪,所以人云亦云的进来,后来发现这钱没有想象中那么好挣,996 是常态,于是发出呐喊:别选计算机!

    2、家里有矿,背景好,进可玩玩金融,退可当个包租公,瞧不起敲臭代码的程序员,于是居高临下鄙视到:别选计算机。

    3、身边有程序员,对程序员存在误解,认为程序员都是穿格子衫黑眼圈秃头的形象,选了计算机专业最终会变成单身狗,出于好心,提醒别人:别选计算机专业。

    4、稀里糊涂的参加了培训班,一出来发现找不到工作,浪费了大半年时间和上万元人民币,怒斥道:RNM,退钱,别选计算机专业!

    5、对计算机专业持悲观态度,认为计算机现在已经太火了,火过头了,比白酒还火,各行各业都想转计算机,人员早就饱和,现在进就等着失业吧。

    看完这些原因,可以得出一个很明显的结论:计算机专业并不是适合每一个人,劝进劝退都可以

    计算机专业不适合那些怕苦的人,不适合那些不缺钱的人,不适合那些不热爱技术的人。

    计算机专业最适合的群体是那些热爱计算机技术同时又想高薪的同学,想想一毕业就有可能找到月薪 20k 甚至 30k 的工作,而同龄人在其它非金融行业才五六千起步,寒门逆袭的故事正在书写。

    并且,计算机专业毕业去找工作,那些互联网大厂并不像招其他岗位的人一样,十分看重学历或者看重大学成绩,一次表现优异的秋招,足以。

    说来说去,对于想改变命运的寒门学子来说,我是相当劝进学计算机的,当然,很有可能你会说:我也想选计算机专业,但我怕自己不热爱技术

    关于这个问题,我建议在一开始的时候可以去看一个视频,叫做《计算机科学速成课》,这套课程是 Crash Course 旗下的计算机科学相关的视频,早期发布在 Youtube 上,整个系列课程高达 12 亿的播放量,现在你可以在 B 站上免费观看,有汉化有弹幕。

    之所以建议看这个视频,是因为这个系列视频总时长 10 个小时,一共 40 集,基本上每集控制在 10 分钟左右,只要不到 10 小时就可以粗略了解计算机科学这门学科,如果你是一个门外汉,相信我,通过这个短短的 10 个小时足以帮你打开计算机的大门。

    Crash Course 的这套计算机科学视频一共 40 集,基本上每集控制在 10 分钟左右,所以,只要不到 10 小时就可以粗略了解计算机科学这门学科,如果你是一个门外汉,相信我,通过这个短短的 10 个小时足以帮你打开计算机的大门。


    你可能会不禁疑惑,十几分钟能学到啥?而事实上,Crash Course 的视频信息量很大,每一秒的时间都是精华,视频里面不仅有图像、视频资料、图表等,更有老师面授,老师的语速也是很快的,如果跟不上,建议 0.75 的速度进行观看。




    如果你是小白,想了解一门学科,不妨通过该系列视频作为切入点;如果你是某学科学生,可以用该视频梳理总结课程的框架结构;如果你想拓宽知识,这个系列视频作为下饭菜也是十分合适的。

    Crash Course 的 Youtube 官方频道地址如下:

    https://www.youtube.com/user/crashcourse

    B 站频道地址如下:

    https://www.bilibili.com/video/av21376839

    书籍搭配使用:

    图解操作系统、网络、计算机组成 PDF 下载!

    如果你现在是计算机专业的学生,想要投入程序员的行业,拿高薪,那么强烈建议你学好以下几门计算机基础课程:

    1、计算机组成原理

    2、计算机操作系统

    3、计算机编译原理

    4、数据结构与算法

    5、计算机网络

    一方面这些计算机基础内容是面试必备,另外一方面你想要在程序员的领域学的更深入一些,这些计算机基础内容完全是必须的。

    计算机基础知识对程序员来说到底有多重要?

    一、计算机组成原理

    来源于深入浅出计算机组成原理
    从上面这张图可以看出来,整个计算机组成原理,就是围绕着计算机是如何组织运作展开的。

    我们依旧来举例子:)

    每个程序员应该都知道 Ascii码,GB2312,GBK,Utf8,Unicode 等编码格式,如果你没接触过,那总出现过文件压缩后解压乱码的情况吧?

    了解了这些编码的存储格式,你才会明白为什么会有中文乱码问题,靠,我在写这个回答的时候,我的后端同事发给我的日志就出现了中文乱码。。。。

    再来个例子。

    比如 LRU 缓存算法 的例子,它的设计也是借鉴计算机组成原理的内容的,

    看动画轻松理解「链表」实现「LRU缓存淘汰算法」
    ?
    在计算机的世界里,空间换时间,时间换空间这个概念在复杂的设计中时常出现。

    如果你想更详细的了解 计算机组成原理 的知识,推荐一本书:《计算机组成:结构化方法》。

    二、操作系统

    先来看一下操作系统都有哪些内容。

    现代计算机系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。

    说实话,程序员不可能会掌握所有计算机系统的细节,所以在硬件的基础之上,计算机安装了一层软件,这层软件能够通过响应用户输入的指令达到控制硬件的效果,从而满足用户需求,这种软件称之为操作系统,它的任务就是为用户程序提供一个更好、更简单、更清晰的计算机模型。

    我们依旧通过一个例子来解释操作系统在工作中的帮助。

    比如说,做一个网络代理软件,不过是从 socket 上收一个包然后转发给另一个 socket 而已,这好像和操作系统没多大关系吧?

    但真做了,你会发现,用一个线程处理网络IO,只要写对了,那么哪怕系统压力很大,只要CPU顶得住,就可以保证引入的延迟总是在几个毫秒之内;但如果用了多线程分别处理收/发,那么只要网络压力稍大,引入的延迟就会增加,很快额外延迟就可能突破几十个毫秒(这实际上已经完全不能用了)。

    想搞明白这是为什么,对操作系统调度原理、时间片等概念没有足够深刻的理解,是不可能的。
    尤其是,当你突然遇到类似“系统压力一大网络延迟急剧升高”的 bug 时,如果对操作系统没有深入理解,你连准确描述都做不到,连查资料、求帮助都不知道该往哪个方向努力,更不用说 debug了。

    换句话说,你可以不造轮子,但是你要知道这轮子是怎么造的,否则你连问问题都不知道如何去描述。

    再降维一点,你总要掌握如何安装 Windows 系统吧,否则妹子让你去她房间里修电脑你都只能拒绝掉!

    在这里插入图片描述

    三、编译原理

    众所周知,编译技术是计算机科学史上的明珠之一。

    对于编译原理,很多程序员的困惑就是:我也不会去设计一门新的编程语言,有必要学习编译原理吗?学了有什么用呢?

    实际上,编译原理不是用于炫耀的屠龙技,程序员在工作中经常会碰到需要编译技术的场景,比如:

    • 编写界面模板引擎;
    • 为项目编写各种各样的 DSL;
    • 深度理解甚至开发出 Spring、Hibernate、阿里巴巴 Druid 这样的工具。
    • 除此之外,解析用户输入,防止代码注入,为前端工程师提供像 React 那样的 DSL,像 TypeScript 那样把一门语言翻译成另一门语言,像 CMake 和 Maven 那样通过配置文件来灵活工作,运维工程师分析日志文件等等高级别的需求,都会用到编译技术。

    当然,说实话,编译原理并非随随便便就能入门的!

    换言之,需要准备一些基础知识在学习。

    编译原理的学习和实践通常基于对计算机编译过程、计算机基本工作原理、甚至一定的数学知识有一定积累,这些知识分别分布并应用在了编译原理的不同阶段。

    没有这些基本知识的积累,很快就会在某个阶段由于功底不够而无法再继续后面的学习。

    所以不要一开始就去啃编译原理

    四、数据结构和算法

    正如 N.Wirth 教授所说的: 数据结构+ 算法=程序。

    遇到一个实际问题,充分利用所学的数据结构,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效实现。

    这句话可能有点抽象,我举个例子给你们解释一下。

    在工作过程中,我们多多少少都接触过 OAuth2 ,在使用 OAuth2 授权的时候,通常应用会弹出一个类似这样的信息:

    1. 获取用户基本信息接口

    2. 获取用户列表接口

    3. 用户分组管理接口

    。。。

    在这里插入图片描述

    思考一下,如果让你设计数据库,应该怎么设计信息存储权限?

    如何你熟练掌握了各种数据结构的特点的话,那自然而然想到使用 bitmap 来存储权限。

    我们把权限划分成最小粒度之后,每一个 bit 都它的含义, 例如我们把权限划分为以下几种:

    • 获取你的头像、性别、昵称等基本用户信息
    • 以你的身份发布微博
    • 获取你的好友列表
    • 获取你的朋友圈信息
    • 每勾选一个选项,就代表着这个权限被授权,为了保证可扩展性,我们使用一个 uint64 来保存这些 bit ,也就是说,我们一共可以划分 64 种细分权限,然后对这些权限进行组合。

    例如,第一个 bit 如果设置了,那么就代表可以获取你的昵称、头像、地区、性别等基本用户信息, 第二个 bit 如果设置了,就可以用你的身份发状态。

    数据结构的实际作用还有挺多,感兴趣的可以搜索以下知识点:

    • 二叉树搜索用于中断处理、登记缓存查找等
    • 哈希表,用于实现索引节点、文件系统完整性检查等
    • 红黑树用于调度、虚拟内存管理、跟踪文件描述符和目录条目等
    • Radix树,用于内存管理、NFS相关查找和网络相关的功能

      上面这些例子是关于数据结构的,我再举一个算法的例子,如果有帮助,不妨点个赞收藏一下,好的内容值得肯定。

    同样的也来思考一个问题:计算机的缓存容量无论再大,缓存满了还是要删除一些内容,给新内容腾位置。

    那么删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?

    这个时候采取的策略就是 LRU 缓存淘汰算法。

    LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。

    关于数据结构和算法的学习,大厂在面试环节最喜欢考察的就是 LeetCode 的了,如果你有刷题的想法,那么推荐你看看这份算法刷题笔记,不是读者朋友拿到了理想 Offer:

    BAT大佬写的Leetcode刷题笔记,看完秒杀80%的算法题!
    ?
    觉得不错的话,记得点个赞哟,祝无论是自学编程还是计算机科班的学生,都能打好计算机基础,成为一名优秀的程序员。

    也可以关注下我程序员吴师兄,一个致力于把每道算法题都用动画的形式讲清楚的七年老程序员,持续分享计算机相关内容的干货,希望能帮助每一个人在编程这条路上走的更舒坦。

    作者简介

    作者:大家好,我是程序员吴师兄,在 GitHub 上开源了一个项目 LeetCodeAnimation,目前有 60k star,通过动画的形式讲解算法,已经帮助成千上万的程序员入门算法了,欢迎关注公众号「五分钟学算法」,和我们一起学习算法。
    点击了解程序员吴师兄
    转载说明:未获得授权,禁止转载

    下一篇:没有了