作为一个刚入行的小白,你可能想知道:
* 软件是如何开发出来的?
* 程序员是如何工作的?
* 需要用到哪些技术?
* 你如何才能入门?
* 怎样快速在这个行业里找到工作?
我们就先来看看在软件公司里不同的程序员是如何协同工作的,需要哪些技术以及这些技术之间相互的联系。
知道了这些,更有利于你明确未来学习的方向和目标。
1.什么是软件开发?
我们都知道计算机系统是由「硬件」和「软件
」两个部分组成的。所谓硬件就是计算机的物理部分,就是那些你可以看得见摸得着的外壳、屏幕、电路板这些。但是只有这些计算机是不可以工作的,就像人如果只有完整的躯体是不够的一样。
所以,当计算机从生产线上装配完毕以后或者到我们手中后,要做的第一件事就是给它装上各种软件(例如Windows, QQ, Steam)。
软件(Software)就是使计算机可以运作起来完成我们指定任务的程序和数据。
这和人类也很像——我们在出生以后,成年人就给我们的大脑装入各种数据和程序,我们识别人和物体并记住他们,学会喝水、吃饭、说话等等。
除了现有的、已经被开发出来的软件,各行各业的用户还有自己特定的需求,软件开发就是根据用户的需要,帮助他们编写一系列的程序,满足他们正常或变态需求的过程。
软件开发是一项包括需求获取、开发规划、需求分析和设计、编程实现、软件测试、版本控制的系统工程
1.2 谁在开发软件?
从事软件开发的公司有两种:
* 一种是根据已有客户的需求,先签订合同,再定制软件系统的「项目型公司」。
* 另一种是创造一个软件系统,然后让很多客户购买或使用它的公司,这种公司我们称为「产品型公司」。
还有一种叫「互联网公司」,这种定义不太好下,因为现在谁都在宣称自己是互联网公司了,但是互联网公司也是做产品的,所以我们还是把他们当作产品型公司好了。
在这些公司里,各种角色合作进行软件开发,其中的主力就是我们程序员。
1.3 程序员在干什么?
作为小白,我们经常疑惑于「程序员」到底是干什么的?在软件行业,程序员的分工已经非常细致了——不同程序员岗位的工作领域和技能要求是不同的。
举一个例子,你在「饿了吗」浏览不同的店家,选择你要订的外卖并下单、支付,直到送到你手上并完成评价的一系列过程,都是不同程序员、甚至不同公司的程序员协同工作才完成的。
但是,无论是简单还是复杂的软件系统,程序员们其实只做三件事:
* 向用户展示用户界面、获取用户输入的信息或操作
* 处理业务逻辑或执行操作
* 实现数据存储和交换
参与软件开发的角色很多,在这里我们先介绍程序员、与程序员工作相关性很强的岗位,他们包括:
* 设计用户界面的——UI/交互设计师
* 实现用户界面和交互逻辑的——前端工程师(前端程序员)
* 实现用户逻辑和数据存储/交换的——后端工程师(后端程序员)
* 设计系统的——系统架构师
1.3.1 用户界面的设计——UI/交互设计师
当你打开手机APP或者用电脑打开一个网页,首先你看到的就是这个系统的用户界面,简而言之,你在手机和网页上「看
」到的,都是用户界面。用户界面是由「UI/交互设计师」来设计的,他们一般不会写程序。
用户界面的设计有两个核心:
* 视觉设计
* 交互设计
视觉设计是指如何让用户界面「好看」,交互设计是让用户界面「好用」。
视觉设计的产出物可以是效果图,比如用Photoshop产出的PSD文件。但是效果图是「死」的,不能真实模拟软件在操作时的步骤,所以很多交互设计师还会用诸如Axure
RP之类的软件做一些以假乱真的「原型系统
」。高保真的原型系统看起来和真实的软件界面一样,你甚至可以操作它(就像它已经开发完了一样),但它只是个模型而不是真正的软件系统。原型系统的开发速度比较快,成本也比较低,它只是用来验证用户需求和用户界面交互性的工具。
视觉和交互设计的过程程序员一般不参与,UI/交互设计师做好线框图、UI设计图、原型以后程序员才开始工作的。你要记住一点,千万不要叫他们或她们「美工」,会得罪人的。
这是我司一个UI设计师提交的设计图:
1.3.2 用户界面的实现——前端工程师
「UI/交互设计师」
把线框图、UI设计图、原型设计好并通过评审以后,程序员们就可以开工了[1]。现在的主流软件开发方法是将软件开发分为「前端」和「后端」两部分,前端程序员主要负责:
* 呈现用户界面
* 实现用户交互
* 实现后端交互
1.3.2.1 呈现用户界面
UI/交互设计师提交的是UI设计图或者系统原型,它可能是一个Photoshop的设计稿(或者是其他格式的设计稿),设计稿是一副静态的图片,因此需要前端工程师把设计稿「转换」成正式的用户界面代码。
如果你要做的是一个网站,
你首先要用图像处理软件切图(有的公司里UI设计师已经切好了,也有一些UI设计软件自动帮你切好),然后用HTML+CSS来表达这个用户界面,直到浏览器上可以显示出和设计稿一样的界面来,而且你的页面应该在不同浏览器上显示出完全相同的效果。这其实很麻烦,因为不同的浏览器都有自己的小性子,前端开发人员经常被困扰。
APP的用户界面开发与之类似,只不过描述用户界面的不是HTML和CSS。Android和iOS的APP使用不同的界面描述语言来表示用户界面,进行交互的语言也不同(不是JavaScript),但要做的事基本一样。
1.3.2.2 与用户交互
只是显示界面是不够的,还有一些基本的「用户交互
」功能也要前端工程师实现,比如点击一个链接跳转到另一个页面,或者输入完手机号码后需要验证手机号码格式是否正确......这些都是基本的交互,在网站中一般使用JavaScript来完成。
用户交互的程序一般都运行在终端(例如你的手机)上。
1.3.2.3 与后端交互
终端并不能处理所有的事,因此前端程序还需要与后端进行交互。例如在一个用户注册的页面中,我们先用JavaScript验证了这个手机号码格式是正确的,但是我们并不知道这个手机号码是否被注册过,这时就需要
与后端交互——把这个号码发送给后端的一个接口,后端程序检查完毕以后返回给我们一个结果,我们再告诉用户这个号码已经被注册过或者进行下一步的操作。
综上,前端工程师的工作是:
* 根据UI效果图构建前端界面代码
* 实现与用户的交互
* 实现与后端的交互
1.3.3 后端工程师
在前面我们知道,前端工程师要验证一个手机号码是否被注册过,是把手机号码发送给后端的一个接口,再由后端程序进行检查并返回结果给前端。
这些接口是用户看不到的,但是可以被程序调用。设计、并实现这些接口工程师叫做后端工程师或后端程序员。在程序员们开工之前,系统架构师已经规定好了前端和后端是如何交互的,包括:
* 前端程序员通过何种方式调用后台接口
* 前端程序员需要用到的每一个接口的名称和调用地址
* 每一个接口的参数是什么(前端要传递给后端的数据有哪些)
* 每一个接口被调用后后端要返回给前端哪些结果
* ...
后端程序员的工作内容就是一个个实现这些接口,提供前端程序员想要的数据、执行前端程序员想要进行的操作。
后端程序的主要功能是:
* 接收前端的调用
* 向前端返回操作的结果或所需的数据
* 从数据库中读取数据或写入数据到数据库
* 与其他系统交互(例如接受支付宝支付成功通知)
相对于前端程序员,后端程序员可以选择的语言和技术有很多,目前比较主流的是:
* Java
* PHP
* Python
* JavaScript(Node.JS)
* C#
* ...
1.3.4 系统架构师
在前面,我们提到了「前端工程师」和「后端工程师」,他们使用不同的语言和框架来开展工作。
他们是在「系统架构师」的领导或指导下开展工作的。「系统架构师」一般是具有多年经验的老鸟,他们甚至是「全栈工程师」——简单来说就是前端后端都会的人。
系统架构师根据系统的功能需求,把系统划分成功能模块,规划好系统的技术架构、分配好前后端的开发任务,同时也规定和协调好各个接口的接口方式。然后程序员们就各自开展工作了。
成为系统架构师不是小白们目前的职业目标,因为这需要相当的经验和技术覆盖面。
1.4 为什么学习C语言?
在所有的语言中,C语言的学习是最让初学者痛苦的。不少人自学学到「i++与++i的区别」的时候就脑子发晕(比如我)。更别提什么指针、指针的指针、数组的指针、函数的指针了。
但是,我仍然坚定的要求大家从C语言开始,这并不是因为我认为大家学完这门课程以后可以去从事C语言开发的工作,而是因为:
* 学习C语言的沉没成本是最低的
* 学习C语言会被迫学习计算机原理知识,有利于长远发展
1.4.1 学习C语言的沉没成本是最低的
到目前为止,C语言的基础语法广泛应用于主流的编程语言中,包括我们之前提到的C++、Java、C#、PHP、JavaScript以及用于iOS开发的Objective
C。
所以,熟练掌握C语言的语法,并在实践项目中了解面向过程、面向对象是怎么一回事丝毫不会浪费时间,因为这些技能和知识未来在别的语言里全部用的到。
在C/C++的程序员看来,所有的编程语言都是一样的。
1.4.2 学习C语言会被迫学习计算机原理的知识
如果在一开始的时候就使用一些很「高级」的语言,你可以快速得到结果,并获得一些成就感。
然而在整个过程中,你并不知道你的代码到底做了什么,是怎样做的,为什么是这样做的。当程序遇到问题时,你很难找到症结,你可能只能和你的经理说「我是按照demo敲的代码,我不知道为什么会出问题」,在未来的工作中,换一种工作语言对你来说将是一件很困难的事。
而C语言的学习是较为麻烦的,它没有现成的强大和丰富的库(什么是库现在可以不用了解),很多功能都需要自己动手编码实现。有些功能即使在C的标准库中有,我也会要求你自己动手实现,在动手实现的过程中,你将被迫学习计算机运作的底层知识,同时训练你的编程思维,这对你未来的学习和工作无疑是有益的。
一些「培训班学员」只是在培训学校里学了一些「高级」的语言和流行的框架,不了解计算和程序的本质,也没有经历过编程思维的训练,所以导致他们只能在特定的语言和框架下开展工作,受到很大限制。
所以我们计划了两个月来学习C语言,去研究程序和计算机的细节,不要怕麻烦,越怕麻烦的人麻烦越大。
1.5 小结
我们把程序员简单地分为「前端工程师」和「后端工程师
」,在实际的项目开发中还会有更细致或者更粗犷的分类方法,视不同项目、不同公司的开发模式不同而不同。而且一个软件的开发完成还需要产品经理、系统分析师、系统设计师、运维技术人员、测试人员等参与。