一份有关计算机的新人指南(希望如此)

如果你是一个刚刚进入大学,有大把时间学习且对计算机有热情的萌新,我觉得你不妨看看我这个老油条的胡言乱语。可能对你有些帮助

计算机学习的方法和误区

应该学什么语言

这是一个大家都很热衷于套路的一个问题,我应该学什么语言。市面上普遍有三种答案:

  1. 应该学C/C++
  2. 应该学Python
  3. 应该学Java,Go,Js...

这三个答案可以说是各有各的道理,我来给各位捋一下

  1. C/C++ 的理由 : 这是一门更接近底层,以及更加高效语言。
    1. C/C++不仅仅能让你养成比较良好的编程习惯;
    2. 还能自然而然的引出计算机的其他课程,例如:组成原理,编译原理,操作系统等等;
    3. 你会更直接的看到你的代码是如何从一个.c .cpp文件变成可执行文件等诸多过程的全貌,而这些全貌在其他语言中都会给你或多或少的隐藏
  2. Python的理由:这个语言好上手,你能很快的学会,获得编程的成就感,从而激励你继续学下去。而且还能蹭上所谓AI,大数据的热度。
  3. Java,Go,... :这些语言有一个特点,他们都是面向某一个特定的场景的,也就是和工作内容绑定的。为什么推荐你学,因为能赚钱。

我个人的观点更倾向于 C/C++ 。 因为:我已经把你的身份限制住了,一个有大把时间学习且对计算机有热情的萌新。对于现在的各位而言,扎扎实实地打基础才是王道。其他的都是浮云,趁着你还在学校把基础打的扎扎实实才是最好的。同时我觉得学知识本身就应该沉下心来,而学习Python的理由则是把无法承受孤独静心学习而需要成就感的刺激作为前提,我觉得不是很好。

不要总想的把语法都学完了才开始编程

从来就没有收拾好行囊在出发的说法,等你收拾好了黄花菜都凉了。要在实践中学习,编写程序边学语言。所谓学习不是一遍就能完事的,只有反反复复你才能真的搞明白。当你花费巨大的时间和精力把语言的所有语法学完,你会发现自己还是写不出代码,甚至一开始的东西全都不记得了。所以一边写程序,一边学语法,而且写程序花费的时间应该远远大于看书的时间。只看书永远都学不会编程。

看别人优秀的往往更重要

实际上,当你的编程已经入门时,你想迅速提高更好的方法就是看别人的写的程序。在GitHub上有很多非常nb的东西。而你可以通过搜索 一些高质量代码的推荐,找到优质的代码。GitHub里面真的很精彩。

等你回过神来发现看代码的时间会远大于自己写代码的时间,这就是证明你进入了一个新的高度。

编程语言仅仅是计算机这片汪洋的水滴

正如标题所言,编程语言只是计算机科学的很小部分(但你依旧需要熟练掌握一门程序语言)。这个部分我很难给你清晰的描述出来,因为只有你自己亲自看到整个计算机科学全貌时你才能体会到自己的渺小和人类智慧的伟大。至少这种震撼我一生都无法忘记。

别想着依靠别人,尤其是老师

遇到问题一定要努力自己解决,自己谷歌,自己bing(珍爱生命远离百度)。面向CSDN不是没有道理的。同时你要知道无论是哪里的博客他的知识都是可能有错误,至于你要如何判断,只能不断试错,学习和积累。日积月累的学习会让你判断出哪些东西靠谱,哪些是人造垃圾。重要的是你要自己努力解决,实在不行和同学讨论。别指望老师,一种最常见的情况就是:你的问题可能非常的细致,你的老师可能也不清楚是怎么回事,因为你的代码出问题了只有你才知道怎么回事,解铃还须系铃人。

所以,代码一定要自己写,不要Ctrl+C,Ctrl+V。不然出了问题你都不知道咋回事。

计算机科学的大致内容

数学基础

在很早的年代(可能是20~30年前),计算机还是数学的二级学科。而如今计算机的两个儿子(软件工程和AI)都自立门户了。但是计算机最核心的东西仍然是算法和数学。

在本科阶段,你将要面对至少4门数学。前三门是 高数线代概率,后一门是叫做 离散数学。

高数线代概率这三兄弟你务必要认真对待。你现在不好好学这三门课,到后面的进阶课程你是寸步难行。高数会为你未来的优化和计算方法(或者叫数值分析)打基础;线代会为你将来的图像处理,矩阵分析,AI打基础;概率说实话你高数学不好连概率都算不对,而且如果你概率没学明白,那我估计你人工智能可能这辈子都不会学明白了,又或者你未来的随机过程就真的随机过了。

所谓离散数学,你可以认为这个一个为了计算机科学而阉割过的数学。这门课是由 三门数学分别进行阉割得到的。他们分别是 数理逻辑,抽线代数(近世代数)和图论。把这三门课进行阉割拼接而成。在抽象代数这部分会重点讲布尔代数,而这个布尔代数可以直接给你后续的数字电路判死刑。(数字电路不是真正的电路,模拟电路才是真正的电路,数电就是布尔代数的直接产物)图论和数据结构里面的图结构会有些许联系,如果你将来会参加ACM,那应该是少不了。

基本上,本科阶段至少会学这四门。同时不排除有的学校会学更多。总之,数学这东西大部分情况都是 学的时候觉得没用,要用是的时候觉得没学。所以,千万不要有“这东西有个勾8用的想法”,不然等你要用的时候有你好果之吃。

计算机基础

计算机基础我这里只想说 我们喜闻乐见的 408 : 数据结构与算法分析,计算机组成原理,计算机操作系统和计算机网络。接下来我会随便聊一下这四门课的种种,让你提前有一个大概印象。

数据结构与算法分析

这门课是与你的编程语言关系最紧密的一门课。你需要用编程语言去实现数据结构和算法,是要实打实的敲代码的!但实际上,数据结构和算法分析在国内是分开讲的,一个数据结构一个是算法分析。前者更注重一些代码的实现,后者更侧重于算法的证明。如果你将来想进大厂,估计这门课就是最直接的一门课了。最简单粗暴的就是给你一个问题,通过编程来解决它,即给你输入,让你通过你写的算法得到输出。像力扣,洛谷,AcWing这些网站都是题目,没事做做也挺有趣的(虽然很多题我也不会,但就是菜还爱玩)

计算机组成原理

顾名思义,就是教你计算机是用什么硬件结构组成。有一个前置课程:数字电路。这个课有一个点,就是你要不仅要学明白计算机组成的硬件有哪些,而且还有搞清楚为什么这里选择用硬件实现而那里又选择软件实现。当你学完这个课的时候,可以挑战一下自己设计一个简单的CPU。(不开玩笑的说真的有大佬能设计出五级流水的简易CPU)

计算机操作系统

这个课怎么说,本来教的操作系统的设计,不过现在越来越多的985已经开始教实现了或者直接上来讲一些简易操作系统的源代码。这个课在国外有一个很好的公开课,忘记是MIT还是CMU了

计算机网络

大家经常说的计算机里的文科,很多人学这个课都是靠背。但是重点要把层的概念搞清楚。当你学完这个课,你应该能把一个完整的报文拆成每个层的小报文,再组装回去。如果有学Java的应用层要重点学,虽然本科教学的重点在TCP和IP上... 包括后续的涉及到网络安全的一些攻击手段也会用到一点网络的知识。

当然计算机的课不止这一点,但这四门的比重应该是最高的。传说中工科除了清华的912以外的最难的考研专业课。如果你打算考研最好把这四都学透,因为你大概率会考408.

至于其他的课 数据库,编译原理,汇编语言,人工智能导论,网络安全,设计模式,嵌入式,计算理论等等这里就不想挨个说了。

未来的路

最后来聊一下计算机的大致有哪些方向,不过这里很多仅是我的个人理解了。可能说的不全或者分类不对,请各位手下留情。

系统方向

所谓系统方向,可能算是计算机的本家。这个方向就是搞一些硬件和硬件软件协同的东西。例如 操作系统,芯片设计,编译器,高性能计算,计算机网络系统。这里也包括数据库系统和文件系统,说到底文件系统可以在操作系统里面,只是不在OS的内核而已。

计算机应用

也就是我们暂时忽略底层的硬件,真正的用计算机做点事情。这里面比较火的:机器学习和深度学习(ML和DL),计算机视觉(CV),自然语言处理(NLP),计算机图形学(CG),软件工程(SE),嵌入式,物联网(个人感觉嵌入式和物联网应该挺近的),大数据与云计算

计算理论

计算的复杂性理论,密码学理论(计算机里面最吃数学基础的方向)

网络安全

反正,国内是把网络安全单独算了。这里纯粹是我的知识盲区,我的理解就是逆向工程,小心学的时候别把自己学局子里去了。

以上所有领域如果有了解的朋友可以补充留言!感谢各位捧场

结语

最后我想讨论一下 有关于在计算机科学中 工程师和科学家的区别。这也只是我的个人理解了,其实这两者是不冲突的,所以有的同学立志成为科学家,然后会自然而然觉得不需要写程序;或者立志成为工程师,一下前沿的问题就一概不看。我只能说你想的美。无论是做科研的还是做工程的,你只要想做的比较出色前沿的领域和代码能力都是要过关的!

还有就是 跨专业的同学,我想说的是你如果对计算机有热情想跨过来你必须要付出更多,因为你将来几乎不可避免要和科班的学生竞争。没有人会因为你是跨专业就放你一马。在这个圈子里,只要你能顺利的拿到毕业证和学位证,除此以外全看能力。这可能不同于有的领域,所以各位在学习的过程中不要想的投机取巧。

我这里其实还有很多东西没有说,但是说到底学习还是依靠积累。如果个人还有问题,可以问我,如果我能回答且我能看到的话就会回答各位。

180 views
Comments
登录后评论
Sign In
·

可以推求學階段的筆電嗎?

·

网络安全方面实际上也只是计算机科学的一个分支,我的建议是不要去停留在应用层技术,应用层的技术是学不完的,2015年左右网站开发的主流还是Asp+Access,没过两年变成了PHP+MySql,这又过了两年,JavaWeb又变成了主流。

并且近些年国家非常重视网络安全,每年都会组织护网行动,基本可以说敏感站点的漏洞越来越少,漏洞挖掘的门槛越来越高,已经不是前几年不懂原理只要有工具就能一把梭的年代了。

很多朋友在B站等地方看了一些视频,觉得入门网络安全不过如此,看了几个视频就可以搞一些常见的攻击手段了,比如内网ARP攻击,生成msf木马控制目标机器等,实际上网络安全是一个非常吃知识量的领域

从Web开始聊,常见的Web后端开发PHP、Java、Go、Python是一定必须会的,不然哪怕拿到泄露的源码你都无法去进行审计,并且如果你不懂JavaWeb开发,你甚至连Servlet是是怎么去访问的都不清楚,前端Javascript等也是要会的,在XSS漏洞利用的时候要用得到,并且HTTP协议(楼主提到的计算机网络)也得非常了解才是

然而网络安全中Web只是一个方面罢了,以上你都学了,恭喜你成为了一名全栈开发

从Web进入内网,路由交换等东西你也得懂啊

还有题主提到的逆向,里面涉及到计算机底层的东西,需要学的东西楼主讲了

还有密码学,需要扎实的数理基础,需要学的东西楼主也讲了

还有.....

虽然我大篇幅的描述了Web,但是Web不过是安全渗透的第一步而已。。

·

学会弄懂c/c++真的很有必要,就好像是一个学习路上的方向标。把它们两个学好了,你会发现自己对于一些其他语言上的一些复杂问题时会变得游刃有余,毕竟,计算机的底层就摆在这,能够啃得下去才能有长足的发展 !!

·

题主写的实在,看完后两个感受:

  1. Learn CS concepts by coding them。
  2. 俺数学有点捞了,暑期需要补一补了,至少基础还是要会一点点。