给计算机新生的一封信
引子
一转眼又是一年高考结束了,想先给所有学弟学妹们说声:“恭喜!你们终于结束了炼狱般的高三,来到了听起来似乎很美好的大学生活!” 前段时间莫名被拉到一个新生群,看到学弟学妹们各种各样的问题,突然很想写一篇博文总结下。
PS:以下内容为计算机专业(CS)专属,可能不适用于其他专业,但是思想都是一样的,也可以作为参考。
你真的喜欢计算机吗?
这个问题看上去很蠢,不喜欢计算机专业为什么要学计算机?
但是,我想让你们仔细思考下以下问题:
- 你对计算机专业有多少了解? 是不是在你的印象中,计算机专业的学生就是抱着一台笔记本,敲着一大堆你看不懂的东西,看上去很厉害?
- 你选择计算机专业的原因有哪些? 是因为看上去很厉害?还是因为容易找工作,工资高?或者完全是因为家里人推荐?亦或者是因为你不知道选什么,听网上铺天盖地的自媒体随便选的?
如果你的回答是我很喜欢计算机,我选择计算机完全是因为我自己感兴趣,那我想说恭喜你,你是一个懂得为自己负责的成年人了。如果你不幸中枪了,也没有任何关系,这并不是你的错。国内如今的教育相当僵化,你们很难获取什么其他有用的信息,只能在有限的信息渠道中获取有限的信息。我想说计算机专业是有趣的,也是有前景的,也许你在进入此专业后很快会爱上它,就算你真的不感兴趣,也可以寻求转专业。
计算机专业学什么?
我们专业全称应该是计算机科学(computer science)
,通常简写为CS
。
在这个专业,你大致会学习以下内容:
- 数据库
- 计算机网络
- 操作系统组成与原理
- 算法与数据结构
- 编译原理
这些东西专业的核心课程,几十年都不会被淘汰的那种。这些就是区别你和那些非科班出身的人的重要知识,让你成为工程师(Software Engineer) 而不是码农。当然还有其他很多内容,比如一些专业基础课如离散数学,数电模电,还有你们最熟悉的编程。
国内的计算机专业情况如何?
上面说了那么多看上去很高大上的内容,不知道有没有吓到你们呢?我在这里想让你们放心,因为这些内容中很多学校并不会真的教。比如编译原理,比如函数式编程。或者学校就算教,也是非常水,每天上课念念PPT之类的。原因其实很简单,因为这些课程过于硬核,太难。而我在上面说了很多人选择计算机并不是真的喜欢计算机,而只是单纯想选一个所谓的热门专业,所以对这些在找工作中没有直接价值的课程完全没有兴趣。
因此我真的很想给所有的准大一新生说:大学完全靠自己
尤其是对于我们计算机专业的同学们来说,千万不要想着上课听懂了就行。如果这样,你会发现四年下来你很难找到工作,最后只能再次随波逐流选择考研(扪心自问下,你们希望如此吗? 对于CS这种实践性特别强的专业,一定要勤于动手,或者说简单点:写代码 你把书看一万遍都不如把代码敲进去看看跑出来是什么效果。
此外,也不要对学校的教学抱有太大的幻想。学校里教的很多内容都相当落后,据说有的地方教C语言用的编译器还是VC6.0
? C++不出意外都是上古时代的C++98,而最新的稳定版本已经到了C++20了。。。
所以千言万语汇成一句话,大学要学会自学
总体来说我应该掌握哪些技能?
- 自学
原因之一我在前面已经详细提到了,另外的原因之一是与计算机相关的很多技术栈都是日新月异,如果没有一个良好的自学能力,很快就会被淘汰。
- 搜索知识
假如你在学习C语言,遇到了一个问题,不知道你会怎么处理呢?你是会直接放弃?还是选择直接去群里问所谓的大佬?还是选择用搜索引擎独立解决? 想必你已经猜到了,最推荐的做法就是使用搜索引擎尝试独立解决。在编程的过程中,我们很可能遇到各种奇奇怪怪的问题,也许你会调试一个Bug一整天!这时候使用搜索引擎的能力便很重要了,因为如果你选择在群里问所谓的大佬的话,本来两分钟能解决的事情可能会拖到几个小时。 当然,如果我已经仔细搜索过了,还是解决不了呢?请看提问的艺术 另外对于搜索引擎,我推荐Google,这是世界上效果最好的搜索引擎,没有之一。如果用中文搜索没有结果,用英文基本上都能解决。一定不要用臭名昭著的百度。对于百度如何烂,网上已经有太多的文章了,我实在不想浪费时间于此,可以看看陈皓写的这篇“作环保的程序员,从不用百度开始”
使用不了Google?这是个锻炼你搜索能力的好机会,相信你一定可以解决。;-)
我想提前学一些内容,有什么推荐吗?
在大一上学期,你会学一门课程叫做程序设计基础
,主要教授内容为C语言。不知道你们所接收的信息告诉你们C语言是一个怎么样的存在,但我想说C语言是一门符合Unix哲学,小而美的非常值得学习的编程语言。
它本身有一些历史遗留下来的坑,比如缺少类型安全的字符串,以及过于灵活的类型强转。这些问题可能会困惑你一段时间,但是请不要放弃。只要你使用良好的教材,多看一些高质量的博文,相信你一定可以很快掌握的。
一定一定不要沉迷在一些垃圾教材中,死扣一些无意义的语法细节,或者是被一些妖魔化指针的言论所吓倒。
我推荐一些有用的学习资料:
这本书可以说是一本是十分经典的C语言教材,可以说入门C语言这一本书就够了。也许你在学习这本书的时候常常看不懂内容而感到疑惑,可以给大家提个建议:把书上所有出现的代码都敲进电脑看运行结果。 暂时理解不了也没有关系,只要多写多思考,你自然就会理解。另外,你也可以利用搜索引擎,查找一些优秀的,深入浅出的博文,增加自己的理解。
当你觉得上面那本书你已经看的差不多了,C语言已经学完了的话,可以看看这本书打击下自己的自信心。这本书是CMU的经典教材,评价相当高。虽然这本书不是完全讲C语言的,但是很多东西都以C语言作为基础,非常适合大家计算机入门。(没听错,入门。 这本书可能难度有点大,大家不用强求自己理解里面的所有内容,也可以配合网课视频加强理解。
这个人是Redhat工程师,主要活跃在知乎,写了很多很好的文章,非常推荐大家去看看,比如如何有效持续地增进编程能力?,和为什么要开源?
酷壳是陈皓的个人博客,他是一个资历相当老的一位程序员,写了很多有价值的文章,相信读他的博客可以给你很多启发和感悟,比如如何超过大多数人,如何学好C语言,Unix传奇。
我相当相当不不推荐完全通过看视频的方法学习编程,缺点主要如下:
- 观看视频是【被动】的过程——你需要跟上视频播放的节奏。在这个过程中,你【没有】足够的时间来进行【深入】思考。
- (大多数)视频的内容和书籍比起来肤浅,无法深入学习一些有价值的内容。
- 如果你经常看视频,(由于观看时不用深度思考)你的大脑会处于非常放松的状态——也就是说:【停留在心理舒适区】。看的视频越多,停留在心理舒适区的时间就越长。 每个人都是有惰性的。你【越少】离开心理舒适区,你就【越难】离开它。这种现象可以通俗地称之为:针对“心理舒适区”的【成瘾性】。
我该用什么设备?
这个问题绝对是大家的一个高频问题,要买电脑吗?买什么类型的?Macbook可以吗?游戏本可以吗?
首先我想说,电脑肯定是要买的,CS专业的学生都不买电脑,你还上啥课?
至于操作系统来说,我个人认为尽量选择Unix-like
的操作系统,而不是Windows。Windows确实是一款成功的操作系统,我对微软也没有什么太大的偏见。我只是说,对于计算机学生,Unix-like
的操作系统会更佳。这主要与历史有关,主流的计算机发展史就是以Unix
为核心的,而C语言和Unix则像一对孪生兄弟,发展到最后你中有我,我中有你,共同成功。很多古老但是如今依旧流行的命令行工具也是从那个时代所诞生的。Windows则是半路出家,凭着一些商业优势抢占了市场,凭心而论技术并没有多强。(当然现在的Windows早已不是以前的那个Windows,已经是一个很成熟且优秀的操作系统了。
所以应该选什么呢?满足要求的应该有Mac OS X和Linux 这里有人可能会说,Mac和Linux中缺少很多软件,用不了。我想反驳的是:Mac和Linux中好用的工具比Windows有的不知道多多少倍,你之所以如此认为,是因为学校只说了Windows下面应该用什么,而对于其他平台直接忽略。
比如学习C语言,Windows平台下可能会使用VC++
或者更好的Visual Studio
,而Linux下我们可以使用gcc
,clang
等优秀的编译器,而使用vim
,emacs
等编辑器。像我现在给你们写这篇博文,用的就是vim。可以给大家说一下我常用的一些工具,比如编译器用gcc
,clang
编辑器用vim
还有终端复用工具tmux 等等。当然,我也会使用一些现代化的IDE,比如VSCode
,Clion
,IDEA
等。使用unix,你的编程效率会更高,它也是最正统的操作系统。
那么问题又来了,我买不起MacBook怎么办?我用不来Linux怎么办?
这些都是很现实的问题,我不推荐因为我说的什么大家不考虑实际就强上。这里我给出一个折中的解决办法:先购买Windows的笔记本,可以使用WSL2获取Unix的编程体验,或者安装虚拟机,装一个Ubuntu试试。等到时机成熟,你已经掌握了差不多的知识,你可以和我一样装一个双系统。目前除了打游戏,我都是在Linux下工作和学习,Windows基本已经被废弃。
可以给大家看一下我平时的一些截图:
后言
目前国内的计算机教育可以说是参差不齐,计算机相关的知识也是鱼龙混杂。也许你被花萎的哄懵系统搞得热血沸腾,也许你被市面上所谓的AI,人工智障搞得云里雾里,或者你被互联网企业35岁辞退的新闻吓得不知所措……
我想说的是计算机所学的,远不于此而已,以后能做的,也绝不仅限于在大厂中CRUD而已……
希望诸君都能找到自己想要的那条路,实现自己真正的价值 ;-)