为什么选择计算机科学

Hello,大家好。作为一个毕业一年的老学长,在科大学习计算机科学已经有一年的时间了,在这一年里我也接触到一些非常厉害的前辈同辈,在他们的影响下,我对计算机科学有了更深一步的理解与认识,于是打算写一篇文章来介绍一下计算机科学这个专业,同时可以对你们选择专业有一个参考。
ps:内含介绍与劝退

什么是计算机科学

计算机科学也叫computer science,简称CS.
计算机科学,研究计算机及其周围各种现象和规律的科学,亦即研究计算机系统结构、程序系统(即软件)、人工智能以及计算本身的性质和问题的学科(来自百度)

其实计算机的本质还是计算,所有的程序在计算机底层都会变为二进制的计算,而如何在这一堆0101100中实现上层逻辑则是由离散数学支撑的。计算机能处理的只有离散的量,像微积分研究的是连续的量,极限、微分、积分等等都强调连续。而离散数学,这门课包含数理逻辑和集合论、图论、代数结构、组合数学和数论。都是整个计算机科学的支撑。哈哈,不知道你们有没有被这一连串数学名词吓到。为了不让你们在开头就被劝退,离散数学的重要性我放在数学篇和大家聊。

CS大体可以分成以下几个大领域:硬件、系统、软件、网络、计算理论、计算方法。
具体内容就不在这赘述了,总之,计算机科学是一门进可做理论,退可做应用的学科,对科研有兴趣可以去做科研,对具体应用有兴趣可以去工业界互联网企业!

编程篇

对CS的误解

CS 是不是主要就是编程?结论是否定的。说CS主要是编程,就如同说数学主要是解方程。

以下是编程和解方程的共同之处

  • 它们都遵循一定的规范,服从一些经验,有方法和套路。
  • 它们都有例可偱,有“经典”问题
  • 它们都从浅入深,随着能力增强可以解决越来越复杂的问题。
  • 不懂数学的人很可能认为他们整天在解“1+1”,稍懂计算机的人认为他们整天在写代码,完全不懂计算机的人认为他们整天在修电脑。

以下是区别

  • 编程更多是解决“元问题”,即解决怎样解决问题的问题。因此编程可以解方程,这时候编程的内容就是“描述如何解方程”,而不是解方程本身,而编好的程序本身在计算机上运行的时候才执行真正的解方程流程。大量的科学计算软件就是做的这种事情,可以说现如今最繁杂的一些方程都是计算机根据程序的描述解的,这些方程如果要人工求解足以耗尽全世界的人力。
  • 编程是更加创造式和构建式的。编程一开始入手写的内容可能和题意相去甚远(为了实现一些基础构件),尤其是非常大的项目。
  • 编程是迭代式推进的。编程会一步一步地将东西构建完成,可能反复撤销更改,甚至要重构;解方程一般不会如此。
  • 编程很多时候涉及到多人协作和版本控制的问题(记录保持几百个版本很正常)。解方程除了特殊时期特殊需求一般不会如此。
  • 编程的问题类型远远多于方程的分类,基本是什么需求就有什么问题。
  • 编程很多时候能够一眼看到底,因为它的目的是完成需求而不是得出解。
  • 编程依赖的基础工具是编程语言。一种编程语言类似于一套数学符号或者物理规范,不同的语言可能适合不同场合下的编程。
  • 编程的过程性更加强。方程解对了,中间各个过程都正确,也没有什么再太苛求的地方。编程更近似于一种社会劳动,有协作和继承的特性,因此极其注重中间质量。比如
    PEP8 标准对 python 这种语言的格式要求的内容写了接近1000行的描述。
  • 有些方程解起来的难度可能非常大(不过因此有些解也会用程序近似)
  • 只会编程可能工资还挺高,但是只会解方程。。。

世界上最无知的是一知半解的人,对编程半桶水的人或许会认为编程就那么回事,比较esay,但是编程实际上不是一件简单的事。我们至今仍然不知道我们设计程序能力的上限,我们知道我们的程序能够发射火箭控制卫星,调度全国的电网,支撑起整个互联网,构建电子金融和电商平台,完成比特币交易,控制核电站运转,调度整个物流系统,能放音乐能放电影能跑游戏,能跑在每一部智能手机上面,跑在(电子锁的)小黄车里面,能扫描二维码能水群能禁言,能识别物体能识别语音能翻译文字,能下围棋能完美驱动两个脚是轮子的机器人,能支持核打击系统和导弹防御系统,能让当代军用加密系统难以出现二战德国Enigma那样的事故,能处理引力波数据,能模拟化学反应模拟风洞模拟刚体形变模拟核反应模拟弹道轨迹,能画函数图像能P图能用数位板画画,能设计奥运会鸟巢钢架结构,能导航能规划路线,能“嘀!学生卡”,也能像 WannaCry 一样让人不能毕业。

我们用了什么魔法?或许正如《西部世界》中所说,只有魔术师才知道这不是魔法,而常人已经意识不到当今社会高效运转严重依赖各种各样的程序,人编出来的程序。而下一步一些人推崇的 IoT(物联网) 正是希望让 “万物联网”,让几乎一切都在程序的驱动之下。

为什么资本偏爱Conputer Science?

因为懒惰

人们不想随身携带那么多现金,于是出现了移动支付;人们不想出门吃饭、购物,于是出现了外卖和网上购物;人们不想到马路上等车,于是出现了滴滴;人们不想过很久才收到好友的信件,于是出现了聊天软件。
毋庸置疑,很多现实中的任务都是机械的、重复的,它们作为社会规律或者社会形式会存在相当长的时间;但是解决它们的方法,却是相对固定的;而解决解决问题方法的方法,目前我们知道的为数不多的东西叫编程,而被如此大批量的使用且如此成功的,恐怕也只有编程。

因为它是“软”的而不是“硬”的

作为程序的存在,可以跑在光纤里,可以跑在无线电波里,跑在电缆里,睡在硬盘里,光盘里,U盘里;可以以光速移动,可以塞入细小的晶粒,可以随意复制,可以随意分享。

损坏的身体和机械,多数难以修复,但是损坏的软件或许只需要重装。

工厂(由于内部设计问题)出了导致生产全面停止的故障,一般很难在短期内恢复;但是一个宕机的网站,却往往能在几个小时内恢复。

因为方法免费

解决现实问题,总是要费用的。但是相当一部分程序或者服务却是免费的。人们很愿意使用这些服务(比如各类搜索引擎,比如各类网上商城);开发者也很乐意使用其中的一些免费程序,特别是所谓的开源程序。

因为代码也免费

IT业界这些年发展推动的一个重要动力是,开源(open source)。即开放程序的源代码,这样我们得以知道写程序的具体流程,可以稍微修改以用于不同的问题。

就 Github 上面的开源的工程就超过 10,000,000 个,包含数亿万行代码;而 Linux 等操作系统上大部分组件都是开源的。很可能这些开放的代码的量级和 Wikipedia+百度百科 的文本内容总量相当。

在这些开源项目的推动下,整个IT业界的更新换代速度是极其快的,远远超过传统工厂设备更换的速度。

因为产出的是想法而不是实物

你要造一个瓷杯子,你需要什么?可能你需要锻造炉,一些黏土,燃料,钳子,模具…,这些都是实在的资产,并且需要你亲自接触它们。

你要写一个程序,你需要什么?无论何时何处,一台电脑,一个WiFi,一个电源,足矣。

你产出的是什么?不是一个证明和构想,而是一个解决方案。

然后后者却往往可以卖更多钱。

编程与理性和逻辑

那有同学肯定会疑问,如果我们编写的程序一夜之间突然失效了怎么办?支付宝里面的钱突然清零,听歌发现一直循环播放同一首歌曲,高考分数出现了随机数(不知道你们是否喜闻乐见hhh)。。。
这可能会是一场灾难。
那既然我们这么放心的让程序替代以前人的工作,自然是相信它的稳定性,那我们凭什么相信它们会稳定的工作呢?答案回到了数学,数学是一门逻辑的学科,这保证了它的严密性与正确性。离散数学中的知识比如数理逻辑从根本上证明了一个算法的稳定性以及正确性,数学保证了程序会相对而言严密地运行,如果出现异常和错误,大概率是由人为操作引起的。

编程语言的选择?

很多人初学计算机最头痛的是要学哪一门语言。

毕竟编程语言有那么多,比如C、C++、java、python、matlab、JavaScript、PHP、SQL等等
具体可见编程语言排行榜
那我们具体要从哪门开始学呢?或者说真的是学的越多越好吗?

这里我给的建议是,如果啥都不知道,是小白,那么学C是不错的选择,C语言比较接近底层,而且很多大学都是以C语言为入门课程。
其实各种编程语言并没有绝对的好坏之分,它们的确有受欢迎程度的区别,但那只能说明对某种编程语言能够比较好实现的应用的需求比较大。不同编程语言的差异当然有很多,可没有所谓的万能语言或者说最好的语言。在不同的应用场景需要不同的语言。比如说我们想编写嵌入式,想为无人机编程,那么C语言比较合适,因为它直接与底层打交道,能够比较好的操控硬件。如果我们想写个web,也就是网站,那我们前端可以用html、css和js,后端则可以用python、java、PHP;同样,操控数据库最常用的是SQL而不是其他。想编写个神经网络识别动物图片,那么最好用的应该当属python,不过matlab也是个很不错的选择;想要计算导弹的轨道,建立模型,可以使用matlab绘图、计算微分方程组等等

所以说,使用什么语言不是必要因素,学会一两门常用的,以后需要什么再去学是可以很快学会的。

数学篇

数学在计算机科学中有用吗?

当然有用!当然有用!当然有用!
先让我们看看计算机专业在大学四年需要学哪些数学课:

  • 微积分
  • 线性代数
  • 概率论
  • 复变函数
  • 运筹学
  • 数理逻辑与集合论
  • 图论和抽象代数
  • 数论和组合数学

当我们只是学习数学的证明是无法意识到它们的作用的,这时候也许会觉得数学对未来的生活一点用都没有,更有可能会觉得数学枯燥无味,可当我们知道数学应用在计算机领域会有什么好玩的事情,可能学习兴趣就大大不同了。

  • 微积分与计算机:极品飞车就是一个很好的例子,在做汽车的仿真模拟的时候,需要计算汽车漂移过弯的一个极值,设置汽车漂移与方向盘旋转的角度的关系也是一个偏导数,在设计漂移或者驾驶的算法的时候就需要把这些数学推导加入进去,假如微积分不会,那恐怕做不出这些仿真的游戏。
    为什么选择计算机科学_第1张图片
    再举一个栗子,我们做图片的边缘检测,这属于图片识别的范畴,图片识别也是机器学习的一个分支,图片边缘检测算法戳这里
    其实这些算法的原理涉及微积分中的梯度知识,所以,我们现实生活中的人脸识别都有微积分知识蕴含在其中,能说微积分不重要吗?
    为什么选择计算机科学_第2张图片
  • 线性代数:线性代数中的矩阵在算法中是非常常见的,无论是机器学习中的支持向量机,还是图形学中的视觉算法都是非常常见的
    线性代数其实就是一门介绍向量之间线性关系的学科,而我们的游戏开发中向量的应用非常频繁,假如我们想做一个3D人物的旋转,那么只要把人物在坐标系中的向量乘上一个旋转矩阵,就可以发生旋转。线性代数还有在搜索引擎中的潜在语义分析;推荐系统的推荐算法中起到很大的作用。
  • 概率论与数理统计:直接这么说吧,概率论是搞机器学习的核心数学知识,无论是朴素贝叶斯还是马尔可夫决策模型等等都是机器学习的基石,而它们都是概率论中的知识。如果你说你以后做系统工程师,不搞机器学习,那么概率论就没有用了吗?非也,计算机系统工程师需要分析网络协议、路由算法和拥塞现象,而这些蕴含着大量概率论知识。所以啊,今年高考一卷大题搞了一道概率论的题目是很有道理的,毕竟现在人工智能这么火,而概率论在人工智能中的重要性不言而喻。
  • 复变函数:复变函数相当于高阶的微积分,当然复变函数在工程学科的应用更多,不过信号的处理实质上是对一个信号进行傅里叶展开,得到无穷的正弦余弦组合,从而在语音识别中对语音信号的处理上就需要使用到复变函数
  • 数理逻辑和集合论:其实数理逻辑和集合论是现代数学的基础,计算机就是在数理逻辑的基础上创造出来的,有了数理逻辑,我们才能保证不同的编程语言可以跑在同一台机器上,因为它们属于同一个集合,所以都可以在图灵机上实现问题。真的涉及到底层,涉及到电路那就是逻辑。或者做信息安全的要写一个加密,写一个哈希算法,那也是涉及数理逻辑。
  • 图论:这里不解释,图论对计算机科学真的非常有用!
  • 代数结构:我们举个栗子说明代数结构的重要性,就拿魔方来说事:
    魔方为什么一定可以复原,可能大家以前很少思考这个问题,魔方凭什么一定可以复原,其实它就是一个群,群的概念属于代数结构,除此之外,群的概念也可以证明一元五次方程不会有解。
    为什么选择计算机科学_第3张图片

综上所述,数学其实不会决定一个人能不能编程,不会数学同样可以写出一个web,写出一个微信小程序,也可以写个界面写个前端,会个排列组合就够了,但是数学决定的是一个人在计算机科学中的上限,不会数学将会寸步难行,要成为一个更加高级的开发者或设计师数学是唯一的敲门砖。所以不会数学是很难成为一个编程大牛的。
其实说这么多还是想强调数学在计算机科学中的重要性,数学是现代科学之母,这句话是没错的。

物理呢?

物理有没有用呢?其实还是有用的,比如做游戏开发的时候进行建模就需要仿真重力、质量等等。除此之外,还有一个例子,NLP的transformer模型被一个大牛学生刻画成多粒子模型,用常微分方程的知识改动了一点模型就成功优化,所以学好数理方程和热力学对计算机科学也是有用的。

计算思维篇

什么是计算思维

计算思维建立在对计算这个过程本身的能力和限制的理解之上。

计算思维不仅是计算机学家,也是每个人的基本技能。为了更好地进行阅读、写作、算术我们需要将计算思维作为孩子分析能力的一部分。

恰如出版社促进了3R(阅读、写作、算术这种教育体系)的传播,计算和计算机加速了计算思维的传播。

计算思维透过计算机科学的基本观念解决问题,设计系统,理解人类行为。它包含一些理念上的能够折射出计算机科学纵深的工具。

(如果)需要解决一个特定问题,我们或许会问:它难度有多大?解决它的最好办法是什么?计算机科学基于坚实的理论基础来精确回答这些问题。

计算思维通过规约,嵌入,变换或者模拟的方法,可以将一个难题转变为我们知道如何解决的问题。

计算思维使用抽象和分解来对付一个大的复杂的任务或者设计一个复杂系统。这是一种对事务的分离。计算思维为问题选择合适的表述形式或者为问题各方面的关联建模来使得它易于处理。

未来工作篇

工作方向

计算机专业的学生最青睐的国内公司当属BAT(百度、腾讯、阿里),在业界一般把比较大的互联网公司称为大厂,计算机专业毕业的学生大部分都是去互联网公司。

就业方向按工种划分的话大概是:
软件工程师,具体可分为前端、后端、移动端等等。也就是写网站,写app。后端还可以细分类型。
测试工程师,通过各种手段测试现有代码,找bug,调优
运维工程师,也就是配置服务器,保证服务器的高可用性,现在的云计算就是在服务器端实现的。
算法工程师,小到一个新闻的排序算法,大到推荐算法都是算法岗做的事情。
架构工程师,技术负责人,技术选择以及架构层次设计
数据科学家,研究数据的科学家,大数据时代,变得越来越重要
网络工程师,与下到布线,上到组网,与网络相关的岗位
数据库工程师,维护和优化数据库,有时候在某个网站搜索个东西比较慢可能就是数据库搜索耗时间
项目经理,管理项目的人
产品经理,一般不懂技术的比较多。。。
为什么选择计算机科学_第4张图片
在互联网时代,计算机专业毕业的学生可以去做应用,也就是去互联网公司做产品,无论是web还是app还是游戏,都属于应用。除此之外也可以去做科研,你想,做科研就是别人给钱给你做你自己喜欢做的事情,多好。当然还可以去做教育,比如现在比较火的少儿编程,教育这一块的前景还是很不错的。

前景

有人可能会有疑问,互联网真的还像前几年那么火吗?会不会毕业即失业?

其实在当下这个互联网时代,需要大量写代码和维护代码的人,互联网+在不断展示它的巨大威力,如果是正统科班出身同时又基础扎实的程序员是不怕找不到工作的,只是会有工作好坏的区别。需要担心的应该是学历不高经过社会上培训班出来的学生。
那为什么程序员的工资那么高呢?反观一些传统行业可能混十年才能到程序员刚入职的工资,互联网行业和传统行业的一个非常大的区别是互联网有开源精神,技术壁垒不高,中国能够比较快地在软件这一块赶上美国。而且互联网技术仍然在蓬勃发展。

结语

说了这么多,那到底什么样的人适合学计算机呢,又或者说在选择专业的时候又该考虑些什么呢?对于我来说,我很喜欢数学和物理,而且科大全校自由转专业,所以我来了科大,学习编程之后又觉得编程非常有意思,于是又了解了很多计算机领域的知识,发现CS浩瀚无比,有非常多有意思的领域,像是高性能计算、大数据、云计算、分布式、以及现在非常火的AI等等。计算机科学不是仅仅研究计算机,就像数学不是仅仅解方程;计算机科学也不仅仅是编程,或许叫它计算科学更合适,用计算的思维度量世界。
选专业还是要结合自己的爱好和特长,以及去可以自由转专业的学校是很不错的选择,比如科大。

ps:如果想要了解一个专业,可以去知乎,百度搜到的东西有时候很垃圾。。。或者能上Google更好。知乎上对计算机专业的一个很好的介绍戳这里
以上就是我对计算机科学专业的介绍了,如有不正确的地方敬请指正。

你可能感兴趣的:(为什么选择计算机科学)