这篇文章的阅读对象是计算机专业在读及刚进入工作一年左右的的同学,文章措辞也许不太严谨,主要目的是为了让大家更容易理解。
01
便利店背后的“系统”
“系统”这个词不只是可以用在计算机领域,日常所见到的便利店、超市、商场也可以称之为一个系统。参照现实生活中的系统,我们可以更容易的理解计算机系统。
UI
便利店的门面、装修、售货员、货架,一切你所能看到的外在就是UI。
UI,英文全称是 User Interface,中文名是 用户界面,UI是一个系统最接近用户的地方。
对于一个便利店来说,UI很重要,它决定了你消费体验是否良好。一个长得漂亮声音好听的售货员小姐姐一定会让你对便利店增加几分好感。比如说,像这样:
但这并不是核心,你进便利店的核心是你要买到你想要的商品。对于软件来说,核心就是功能、数据以及服务。如果在你楼下只有一家便利店,即使它再不堪,有卖你想要的商品,你也会光顾它。但是有两家便利店,你可能会更愿意光顾环境更好的那一家。
队列
当你到店里买东西准备结账时,在收银台前面站了好几个人,这时候你就需要排队等候,这在计算机领域叫做队列。队列应用非常广泛,它可以削峰填谷。
楼下这家便利店里可能上午下午都没什么客人,但是中午人非常多,而便利店只雇佣了一个售货员,上下午都很清闲,但是中午又忙不过来。
这种情况下,再雇佣一个售货员显得有点资源浪费。那中午忙的时候,还是让客人排队等吧,虽然只有一个售货员,但她可以一个个接待客户,虽然处理慢一点,可能接待完所有客户要到下午了,但是下午并不会有多少新客人到来,这就是削峰填谷。
消息队列在计算机中有着大量的应用,例如Windows系统上的软件,你的每次鼠标点击是发送到一个队列中,排着队交给你开发的软件进行处理的;在服务器的软件系统和软件系统之间,为了避免两个系统的处理性能差异太大,也会在中间加入一个消息队列中间件,避免请求太多导致系统无法承受压力而崩溃。
数据库
接着,聊聊核心: 商品,商品是由工厂生产的,生产好了之后会先放在工厂自己的货仓,这里就可以把货仓理解为计算机领域中的数据库,数据库里存放着我们想要的数据。
数据是信息时代的石油,不管是电商、游戏、社交还是其他软件,用户使用了它就会产生数据,对于互联网企业来说,数据就是他们最宝贵的资产。一旦一家互联网企业出现数据丢失、数据泄漏,他们将面临着重则破产倒闭的风险。
数据可以提取出非常多有用的信息,例如最近几年流行给家里安装上智能门锁,可以通过指纹、刷卡甚至是刷脸开门。一旦出现陌生脸庞出现在家门口,智能门锁可以通过互联网发送消息到你的手机上。这么一把锁,经过家人每天开门关门,会产生很多数据,通过这些数据,我们可以分析出家里一共有几口人、性别、出门时间、家里有没有人等等信息,除了通过锁获取的数据以外,还可以结合家里其他的智能硬件所采集的数据,这些数据融合在一起可以分析出更多的信息,这些信息可以给其他行业提供有效依据,而一旦落入非法分子手里,后果不堪设想。
而数据的形式也是多样化的,有结构化和非结构化之分,有文字、图像、文档、音频和视频等等,基于不同的数据形式,就会有不同的数据存储方式,也就有了各种各样的数据库和文件系统,以及处理这些数据的开发包,例如处理音视频的ffmpeg。
缓存
前面提到,商品由工厂生产,并且通常会存放在工厂自建的仓库里。但是工厂一般离我们居住的地方很远,我想不会有人愿意买一瓶酱油还要打车去。为了提高效率,工厂会通过物流把商品分发到各地方经销点的仓库,通过这个仓库中转再把商品送到各个商店的仓库,而店员会把商品摆在货架上。
现实世界中的物流在计算机领域可以理解为数据通过网络传输,而各级仓库和货架可以理解为缓存。
网络传输我想大家应该都能理解,缓存则是一种为了加快我们获取商品的机制,它同时也能减轻工厂自己仓库空间占用的压力。
计算机中,哪些地方用到了缓存呢?
浏览器中就有缓存,为了提高网页的加载速度,浏览器可以将网页直接下载到本地电脑,在下一次访问这个页面时,浏览器就不会重新到服务器去请求页面,而是直接使用本地的网页展示给用户,但网页中的内容数据还是需要每次从服务器中获取最新的。
内存条也是一种缓存机制,还有CPU自带高速缓存。我们日常购买到的电脑,通常硬盘从128G到1T不等,而内存只有4G、8G和16G。在软件运行的时候,软件会将代码和数据从硬盘中读取出来暂存在内存中,并在内存中进行处理。硬盘比内存更低廉,但存取数据较慢,就像工厂一般建在郊外,它的用地成本一定是比开在市区的便利店来的便宜。但便利店离你更近,到便利店买东西要比直接去工厂拿货效率更高。
为了进一步提高性能,CPU还内置了高速缓存。CPU计算时可以将数据从内存中加载到高速缓存,再由CPU进行处理。计算机中这一步步的性能优化,其实与我们现实生活中提高效率的方式是如出一辙的。
02
人是一个“计算机系统”
计算机一直在向一个取代我们人类的方向发展,所以我们人类所拥有的一些特性可以在计算机领域找到相应的学科,我们从人类身上可以看到很多如今非常流行的IT技术领域的身影。
人类有哪些特征呢?
我们人类有躯壳也有灵魂,躯壳上有五官也有四肢。
我们通过感官来接收外部环境的变化,我们可以听到早晨的鸟叫,闻到花儿的芬芳,看到多姿多彩的世界,感受四季温度的变化;我们依靠四肢做出执行动作,可以跟着音乐扭动身姿,可以在清晨的阳光下奔跑,可以单手把女朋友举高高。
除了这些零部件以外,我们还有一个非常强大的大脑,它存储了我们的所有往事记忆,它能帮助我们在遇到问题的时候做出决策,并对我们的四肢下达执行命令。
根据上面描述人类的特征,接下来我们在计算机世界里寻找到相应的技术领域。
躯壳 / 灵魂 · 硬件 / 软件
人类拥有躯壳和灵魂,在计算机领域中,对应着软件和硬件。相信不少同学都听说过 “ 软件是硬件的灵魂 ” 这句话。我们人类的灵魂需要依托于躯壳,同样软件也必须依赖于硬件。
电脑、手机在我们日常生活中已经非常普及,我相信软件和硬件的概念自然不必多说。
感官 / 四肢 · 物联网 / 边缘计算
人类拥有眼睛、鼻子、嘴巴、耳朵、皮肤,这些是我们的感觉器官,我们依靠这些器官来感受外部环境的变化。
眼睛:通过眼睛我们可以观察周边环境,在计算机领域中,眼睛的替代品是摄像头
嘴巴:嘴巴里有舌头,舌头赋予我们味觉能力,在计算机领域中,也有电子舌,但是这类硬件我工作至今也没有见到过,普及率比较低
鼻子:鼻子是嗅觉,网络上是有电子鼻这种东西,我也没有见过,可能商业上应用场景太少
耳朵:借助耳朵我们可以听到声音,这个在计算机里的替代品大家生活中很常见,就是话筒
皮肤:皮肤下的神经可以令我们感受到冷暖、痛觉,计算机领域里有温度传感器,可以检测环境温度
除了上面提到的器官,我们人类还有比如平衡感、空间感,在计算机领域均能找到相应的传感器,并且传感器的种类远超人类所拥有的感官数量。
这些感官、传感器是输入设备,和鼠标、键盘一样,是向系统输入信号的设备。
而人类的四肢,则是输出设备,就像音箱、显示器一样。
这些外设组成了我们人类的躯壳(内脏我就不提了,知识浅薄实在举不出例子)
而上面提到的传感器就是物联网感知层的内容(不巧,正是在下从事的领域)
光有传感器还不够,人类感官是仅仅是感受外部环境变化,它还需要将这些信息传输给我们的大脑,大脑来做出判断,冷了要加衣,热了要减衣。对应上图,人类体内用于传输信号的神经就是对应于计算机领域的网络。
目前计算机领域的网络多种多样,大家常见的有蓝牙、2G、3G、4G、WiFi,以及这两年推广的5G,其他的还有485有线传输、红外、Lora、NBIoT无线网络等等。
大脑就是应用层,为了思考问题、处理问题而存在。但是我们大脑比较高级,能够思考不同领域的问题,而计算机领域的应用通常只能处理一个领域的问题。
虽然说大脑负责我们人类的问题思考、处理计算,但并不是所有事情都交给大脑处理的。我们身体是有条件反射的,例如膝跳反应。当用小棒槌敲打膝盖时,我们的腿会不受控制的自然弹起,而且我们的大脑似乎毫无意识,事实上,这个动作并不是由我们大脑控制完成的,而是由脊髓控制的。
从敲打膝盖那一瞬间,信号如果是通过我们的神经传输到大脑,传输也是需要时间的,经过大脑再来处理和下发命令控制,那就是不是条件反射了。而脊髓来处理这些简单的信号则更快。
再举一个例子,
作为无脊椎动物中智商最高的一种动物,章鱼拥有巨量的神经元,但有60%分布在章鱼的八条腿(腕足)上,脑部却仅有40%。
逃跑、捕猎时异常迅速,八条腿明明白白,从不缠绕打结,这得益于章鱼类似分布式计算的“多个小脑+一个大脑”。
这在计算机领域里叫做边缘计算。
用人类、章鱼这种个体来描述物联网,格局上显得还是有点小的。格局如果上升一下,我们把一个园区、一个学校、一座城市来代替人类,在城市的各个角度部署各类传感设备,是不是我们就能感知到整个城市了呢?大家在马路上、街道旁是不是见过有很多的摄像头
大脑 · 云计算 / 大数据 / 人工智能
最后我们来详细聊一聊大脑。
大脑是我们人类最重要的组成部分,它帮我们存储记忆、逻辑运算、做出决策,并且还具备学习能力,能够根据以往经验来解决当下的问题,甚至对未来不确定的事物做出预判。
对应于计算机领域就是目前最火热的就是云计算、大数据和人工智能。
云计算
云计算是一个技术领域,也是一种商业模式。
从技术角度来说,云计算其实就是一堆服务器组成一个集群对外提供服务。对于使用者来说,使用者看不到背后那庞大的服务器集群,他可以随意使用而不用担心服务器资源不够,只需要付钱就可以了。
而云计算也是分层次的,有IaaS、PaaS和SaaS。
IaaS提供的服务是基础设施服务,基础设施包括网络、CPU、内存、磁盘等。使用者根据自己的需求可以购买不同配置组成一个服务器,只需要通过界面操作,而不用手拿螺丝刀自行物理安装。
PaaS提供的是平台服务,PaaS是建立在IaaS基础之上的服务,平台服务通常是提供给开发者使用,开发者可以利用平台提供的开发工具、开放接口、SDK,来完成自己的应用程序。
SaaS提供的是软件服务,SaaS就非常接近我们的日常生活,例如微信、QQ、网易邮箱,大家只需要开通一个账号就可以使用。
从商业模式角度上来说,云计算是一种购买服务的方式。在云计算之前,我们配置一台服务器需要自行选配服务器品牌、内存、CPU等等,托管到运营商的机房。现在则是按需购买,你可以按月、按年,甚至是按使用量进行付费,可以随时任意的升降配置。就像家里的水电一样,你只管用,付钱就行,这对企业来说其实降低了不少成本。因为云计算于企业就像水电于家庭一样,做IaaS的云计算公司是非常赚钱的。
其实云计算也算不上什么横空出世的新兴技术,一些技术在很多年前就出现了,只是到近些年才爆发,而在爆发期就会发展很快,在技术上、概念上都会进行大幅度升级。
大数据
人类的大脑存储记忆还是有限的,目前人类大脑开发程度还很低,并且记忆会随着时间推移逐渐淡忘,同时人类大脑也难以在短时间记录大量信息。
大家都知道,电脑靠硬盘存储数据,常见的个人电脑硬盘通常配置最高应该是在1TB。在互联网时代,几乎全球人类都在使用互联网,每天都在产生数据,到了物联网时代,设备也连接入网,设备产生的数据远比人类产生的数据来的更多,并且设备数量也将远超全球人口数。前面说到,数据是信息时代的石油,这么多石油,靠普通硬盘是肯定无法存储的,那应该要用什么存储呢?
存储就是大数据领域要解决的基本问题,解决方案就是采用分布式存储,一个硬盘存不下,那么就在多个硬盘存储嘛,这个在以后我们在深入介绍。
解决存储问题之后,还要解决计算问题。在前面提到,数据存储在硬盘上,计算时将会加载到内存中由CPU进行计算处理。
这么多的数据,要做计算恐怕一个内存条和一个CPU不一定能跑得起来吧?
同样的,这个计算也是大数据领域解决的问题,解决方案就是采用分布式计算,一个CPU不够,那就用多个CPU嘛。
而这些硬盘,CPU,内存从哪里来呢?就是由云计算来提供支撑。
人工智能
有了云计算和大数据来提供海量数据存储和计算能力,互联网、物联网来产生大量数据,人工智能发展速度也进而加快了。
在没有AI的时候,我们编写程序需要考虑到所有情况,根据不同情况进行不同的处理,把这些输入和输出的对应关系都通过代码固化在系统中,也就是我们应该在前期详细的告诉计算机应该如何处理。
这与我们人脑的智能程度相差甚远,严格来说,这并不智能。
人脑可以通过学习,对一些未知的事物进行预判。这就像是一个函数,在没有AI时,我们需要明确什么样的输入产生什么样的输出,而使用了AI,则只需要提供足够的样本数据让它学习,它能够自动建立输入与输出之间的关系。
目前在哪些应用场景可以体现AI带来的优势呢?
前面我们提到,物联网中的感知层可以采集各种各样的数据,通过摄像头可以采集图像、视频,通过话筒可以采集音频,那么如果是我们人类来人工处理这些数据,我们会去打开图像,看这个图像里有什么,它可能上面有一只动物,也可能是人的照片,如果用AI来处理的话,那就是要让代替人类来自动识别图像上有什么,或者是把图像上的文字自动提取出文本。话筒采集的音频,我们会打开听取里面有什么声音,可能是一个人在讲话,用AI处理可以代替人类把声音转换为文字。
从以上的介绍,大家是否能够感受到计算机是在向着代替人类的方向发展,我们是否可以根据这个思路去思考未来的计算机发展趋势。
03
敲开计算机的大门
前面两节介绍的内容是为了让大家能够更好的理解计算机领域的概念,但是对初学者来说,离当下的学习内容还是离的比较远。
接下来罗列一份针对就业的软件专业主要学习路线,注意是“主要” “针对就业”,其他支线不在本节范围。
1. 编程语言
语言是人类和计算机的沟通形式,就像汉语和英语是人类之间的沟通形式,但计算机语言的学习难度是远低于人类语言的。
在学校里通常学习的第一门语言是C语言,这一门语言大家一定要学扎实。
接着是很多学校会在大学期间安排学习很多门语言,按照我的经验来说,挺浪费时间的。语言是相通的,我建议大家在大学期间重点学习好C和Java语言即可,如果有兴趣可以自行再接触其他语言,但是一定要有一门主攻语言。当你有一门语言学习到一定高度时,学习其他语言的成本会很低,这也是我认为大学安排学习太多门语言是在浪费时间。
为什么是我推荐学习Java呢?
第一个原因是我主要擅长Java,哈哈,如果有问题我可以很轻松的帮你们解答,其他的语言可能我比较费劲,太费劲的事我不干,费劲的界限是帮你们解答一个问题超过20分钟。
第二个原因是Java的生态比较成熟,普及率非常高,对于找工作而言比较容易,C语言虽然发展这么多年更加成熟,但是由于性能高、开发效率低,更多的用在基础设施、中间件等领域,这些领域的公司不好找也不好进,当然大家如果有这个追求也可以去尝试。
还有硬件开发基本都会用C语言,这个是会比较好找工作,但是我不是做这一块,帮不上多少忙。
第三个原因是Java学习曲线相对于大学开的其他语言课程来说,是比较复杂的,并且Java适合大型软件项目开发。近些年人工智能的火热让很多高校都开设了python课程,python是一门比较好学的课程,如果学会Java,python自学就足够了,而且人工智能的核心在与算法不在于语言。
2. 数据结构算法
数据结构算法是学校正常都会排的课程,并且一般是使用C语言进行教学。
在高级语言中,都会有一套库把这些封装起来直接使用,所以这里学习的更多是原理,掌握了原理才能使用的更好。
3. TCP/IP网络协议及网络安全基础
有一本书叫《TCP/IP协议详解》,大家可以自己去看。
目前的系统很少是单机的,都需要通过网络进行通信,我们手机中App也是通过网络与服务器进行交互。如果是开发web应用,至少需要熟悉Http协议。如果是物联网开发,则至少需要熟悉TCP/UDP协议。
另外也需要掌握一些网络安全基础知识,例如如何通信加密,对称加密、非对称加密,一些常规的网络攻击方法等。
推荐观看:传送门
4. 数据库
目前的软件项目开发,几乎都会使用到数据库。
使用最多的还是关系型数据库,在学校里教的Oracle、SQL Server、Mysql都是属于关系型数据库。
除了关系型数据库以外,还有键值对数据库、文档数据库、图形数据库等等。
大部分项目使用Mysql足够,在银行等一些单位会要求使用Oracle、DB2,SQL Server对于用C#开发的人用得更多。
我们公司常用的数据库主要包括Mysql、Redis、Mongodb、Elasticsearch等。
5. 开发包
编程语言本身就会有标准库,但仅仅有标准库是不够的。为了实现各种各样的功能,我们会用各种各样的开源的开发包,这些开发包里封装了很多功能,例如需要权限控制我们会使用Shiro或者Spring Security,需要生成二维码会使用zxing库,需要生成excel文档我们会使用poi库。有一些库使用起来非常简单,有一些库想要使用则需要学习大量知识,例如图像处理、视频处理等等。
对于编程,很多人说数学非常重要,但在大部分企业里,对于编程工作来说英语更重要,因为有大量的开发类库、框架技术都是用英文编写的文档,能够顺利的找到这些资料并读懂他们就已经好了。即使现在有翻译工具,但对于计算机专业领域来说翻译还是有点蹩脚。
6. 前端界面
每款终端应用都有界面,手机app有界面,网页有界面,微信小程序也是界面。这里的界面主要是指H5,需要大家学习HTML/CSS/JavaScript,单纯学习这三门语言还不够,至少再学个Jquery吧,如果想跟上潮流,可以再深入学习Vue/React。
前端是更新迭代速度非常快的,因为它非常靠近用户,所以在项目中也是需求改动最多的地方。
7. 设计模式
掌握前面6点,你已经能够写出代码实现常规的功能了,但是写出的代码大概还缺点东西。设计模式是业界前辈总结的一些代码写法,学习设计模式在不同场景下使用相应的写法,我们可以提高我们的代码质量,让我们的代码更容易维护,并且为我们学习开发框架打下基础。
8. 开发框架
在企业里项目开发几乎没有不用框架的,因此很多企业招聘时都会要求需要掌握开发框架。从Java这条路线来说,大家在学校应该学习Spring、Hibernetes(可以不学,越来越多使用Mybatis) / Mybatis、Spring MVC、SpringBoot等等。通常企业会基于这些封装自己一套开发更方便的开发框架,如果大家的学习进度比较快,后续我可以给大家分享我们公司框架是如何搭建的。
04
几点建议
在校时考一本软考证书
软考是一门考试范围很广的考试,因为考的很广,所以难以同时兼顾考题的深度,如果不进事业单位,软考证书并没有什么实际作用。
那么我为什么推荐大家在学校考软考证书呢?
重点不在于拿到证,而是为了考试前学习的过程。
我在大一的时候,听说了软考这回事,我就去报了。软考有分系列的,有数据库系列、软件开发系列、网管系列、信息项目管理系列等,每个系列有初级、中级、高级。按软件专业来说,就应该去报考软件开发这一系列,也是最具难度的一个系列。如果同学们只是想拿本证以后进事业单位,可以考信息项目管理系列,这个系列难度最小,主要靠背,擅长考试也许一考就能拿下了高级证书。
每个软考科目都有一本厚厚的教材,我当时也买了一本,但是只看了目录就扔一边了。我根据目录找到各知识点所对应的书籍,直接看这些书。软考的教材是浓缩版,如果是应付考试也许看这一本就够了,但是我们目标不要放在为了考试,而是学习这整个知识体系。
第一次我报考的是软考初级程序员,按照上面这个方式考过了。紧接着第二个学期我也再报了软考中级软件设计师,初级的重点是C语言、数据结构算法,接着是数据库、网络、计算机组成原理、操作系统,还有一点法律知识和一题英文题。中级比初级主要多了设计模式,中级没有做准备裸考通过。
现在工作后,发现一些同事似乎只懂得他所工作的那一部分知识,回想起来,正是这段经历让自己对整个专业的知识体系有了系统的认识。虽然有很多知识在工作中没有直接用到,但是和其他公司、其他同事对接时,可以很快定位到问题出在哪里。
软考考试报名在200块左右不算贵,建议大家可以去考一下。
社会实践尽可能找相关工作
在大二时,我已经开始没有好好上课了,一个原因是我个人偏爱翘课,第二个原因是大二时准备比赛,学校允许可以不上课。参加比赛给我带来了很多积极的影响,因此如果有机会可以参加比赛,同学们要尽可能的把握机会。
在比赛后的那个暑假,我加入了一家工作室实习。在这之前,我的社会实践做过餐馆的服务员,也去过KTV做服务员,都是体力劳动,除了赚点钱,并不能带给我其他价值,并且还耗费了自己的时间。后来我决定再也不去找这类实习,而是要找自己的技能相关的工作。刚开始实习的时候,工资很低,当个服务员赚的都比这个多,当然我不是抱着赚钱的目的来实习的。当服务员是体力劳动,可替代性强,即使是工作多年的服务员和我们这些没毕业的大学生相比,也并没有很大区别,只需要花一个礼拜稍加培训就能上岗。
而编程就有很大不同,编程是脑力劳动,雇佣一个没有毕业的大学生,其实公司是很难依靠学生来产生价值的,而学生实习时所写的代码,也很有可能因为代码不符合规范、难以维护在后期整个推翻重写。因此雇佣大学生做项目具有非常大的风险。
刚开始谈的工资比较低,在工作一个月后,老板看我比较辛苦,超出了他的预期,发工资的时候主动给我加了工资。也因为我表现还可以,在暑假结束后,我仍然以兼职的形式边工作边读书,从那以后就没再找家里要过钱,自己承担了后来所有的学费和生活费。随着技术的提升和承担的责任越来越重,收入也逐渐有了提升。虽说开始的时候工资只能简单满足自己的生活费,但到了毕业那一年算了一笔账,从开始实习到毕业自己挣了小十几万。
有了前面软考的学习经历,加上后来的项目实践,再回到学校上课后,学校的课程学习起来就变得异常轻松。虽然我经常逃课,但也照样能连续拿到学校的一等奖学金,然后我逃课逃得更厉害了。
所以通过我的经历,建议同学们在假期实习时尽量找与自己未来发展相关的实习工作,如果自己找不到,要尽可能的发掘自己身边的资源,找老师介绍、找亲戚介绍,切记要主动,将来进入社会各种资源都需要自己去争取,不会有人主动双手送上来。这赚到的不仅是当下的零花钱,也是未来。
毕业前做两个软件项目
不管是软考证书,还是学习成绩,在找工作时,都没有做两个实实在在的项目更得面试官的欢心。
在企业中,招聘已经能独立动手完成项目的员工可以减少培养的成本,所以建议同学们在毕业前最好能够完成两个软件项目。
为什么是两个软件项目呢?一个不够吗?
这么说吧,一般初学者做出的第一个项目,都比较简单,不咋地,可能就是一个增删改查堆起来的系统。只做一个这么样的项目也行,但是这还够不上让面试官高看你一眼。
所以我说做两个项目,第二个项目做一点比较特别的功能,例如完成一个即时通讯功能,不用做得太花里胡哨,能证明自己在某方面的能力就行,而不是仅仅会增删改查。
如果觉得本文对你有帮助,可以关注支持一下,大家一起学习进步!也可以关注我公众号,上面有更多技术干货文章以及相关资料共享