程序员是一个看似神秘,实则和单纯的职业。记得有一个采访类的节目,有一题是“你心目中的程序员是做什么的”, 答案五花八门, 有“修电脑的”,"有敲代码的", 有“建网站的”。相信不少人很好奇,这个职业到底是在做啥。本文将大致的介绍下程序员的职责以及分类,以便于圈外的朋友对这个职业有一个基本的认识。
计算机的发明带来了第三次科技革命。 早起的计算机笨重且性能低下,但随着科技的发展,计算机已经深入到了生活的方方面面。 从广义上来说,计算机不仅包括我们日常使用的台式机,笔记本电脑, 还包括了智能手机, IPAD以及各种嵌入式设备,可以说无处不在。那么,如何控制计算机做事情呢, 这时候就需要我们的程序员出场了。
程序员(又称软件工程师),他们负责与计算机交互。我们拿常见的计算器来举例。 当你在计算器键盘上按下数字和运算符号时,其实你并不是直接和计算器的核心在交互,而是和程序员设置好的一个软件在交互。你把运算表达式告诉软件,软件把这些逻辑翻译成机器码。 硬件设备根据机器码进行运算,再反馈给软件, 软件再翻译成用户能理解的语言反馈给用户。 这样才是一个完整的运算逻辑。下图揭示了用户,软件,计算核心和程序员4者之间的关系。
image.png
那么,程序员是怎样创作软件的呢?程序员可以分为哪些类型,每种类型的特征又是什么?ru现?带着这些问题,我们来详细剖析一下程序员这个职业。
程序员如何创作软件
我们还是以计算器为例。用户输入了表达式,得到计算结果。软件首先要识别这些表达式,要能够判断表达式的正确与否。 然后,把表达式拆解成一条条的指令,告诉计算机。(计算机虽然计算能力超级强,每秒中可以做上亿次运算,但是理解能力又超级弱。你直接告诉它2+2+2,它都是理解不了的,不得不需要拆成两条加法指令)
程序员需要做的最主要的事情,就是把软件得到的输入翻译成机器能识别的指令呢。 机器能识别的指令大概长这样“1010 0001 1011 1110 1110 1101”。早期的程序员缺乏工具,只好亲历而为,做这样的翻译工作。它冗长而繁琐,导致程序员的生产力十分低下。
好在人们发明了高级语言,高级语言充当了程序员和计算机之间的桥梁。程序员不再需要查询繁琐的指令,而是用一种通俗易懂的语言来描述软件运行的逻辑。例如:
if a > 0:
b = 1
else:
b = 2
这是一段标准的代码,但是我相信即便是外行都能搞懂它的意思(如果a大于0, b就为1, 否则b就为2)书写代码的规格就叫做编程语言。编程语言大大提高了程序员的生产力,它们简洁易懂,不仅方便编写也方便交流,使得程序员这个职业变得不再高不可攀。
编程语言发展至今已经有几百种,主流的编程语言有C, C++, JAVA, PYTHON, PHP, GO, RUBY, PERL等,他们各有千秋,并没有最好的编程语言这种说法。
编程语言种类多,但核心概念上都是差不多的。对于程序员来说,编程语言是一个忠实的工具,但并不能代表软件开发的全部。 如果用好工具, 如何把业务逻辑转换成高质量的“代码”, 才是程序员需要思考的东西。
如何给程序员分类
我们常听到“JAVA程序员”,“安卓程序员”这样的前缀, 就好比“语文老师”,"数学老师", “文科老师”, “理科老师”等等。 那么如何科学的给程序员分类呢,我觉得可以有以下几个方向。
按照编程语言来分
例如“C++程序员”,“JAVA程序员”,“PYTHON”程序员等等。这种分类方式比较适合公司或者团队招到能够快速上手的人,而不需要过渡的培训。如果公司的项目是使用JAVA语言开发的, 却招来一个一直在用C++的程序员,有可能耽误项目的整体进度,因为语言的切换和学习是需要一定成本的。
当然我并不是十分赞同这种分类方法。因为他对于程序员的限制太死了。程序员通常掌握不止一门编程语言, 而且对于一个优秀的程序员来说,切换语言的代价并没有想象中那么高。
根据技术栈来划分
例如“Web前端程序员”,"服务器端程序员", “Android程序员”,“操作系统程序员”等等。 比如说“web前端程序员”,他们需要掌握如何把元素展示到网页上, 如何处理用户上网时的各种操作(单击,双击,拖动,悬停等等),而他们不用特别关心数据如何存储在计算机上, 数据如何运算或进行复杂的处理。 而对于服务器端程序员,他们更多的是考虑数据的存储和复杂处理,如何同时处理多个请求等等。
这是一种比较科学的划分方式,因为不同类别之间的差异较大。让一个前端工程师转成后端,需要额外学习多项技术。
按照业务场景来划分
例如“电商程序员”,“支付程序员”,“大数据程序员”。这种划分方式比较罕见,主要用于企业招聘严格对口人员。 有些业务场景是有门槛的, 比如大数据,它需要程序员具有一定的数据分析和数据处理能力。所涉及的技术栈也比较有特点。
但对于大部分业务场景来说,其本身的门槛并不高。 比如一个做了2年电商的程序员,转去做OA系统,甚至都不需要适应的时间就能上手。
如何实现大型软件
程序员早已过了单打独斗的时代,大型软件往往需要数十人甚至上百人的团队来完成。 那么这些人是怎么分工的呢。
首先我们要知道的是, 程序员往往不能驾驭大型软件开发的全部过程,需要其他类型的职业共同协作。我们考虑一个项目从立项到正式上线的过程, 其中涉及到这么几类人员(当然也存在更精细的划分,本文只给出大型项目必不可少的角色):
- 项目经理 项目经理需要协调后面提到的所有职位的工作,需要给他们拆分需求,安排任务,设置时间点,并在软件开发的各个阶段做好统筹规划的工作。他需要对软件的进度负责。
- 产品经理 产品经理主要对产品负责,他们需要清楚的知道软件需要提供哪些功能,哪些能力。有哪些用户场景,每种场景需要如何展示给用户。
- 架构师 架构师从产品经理那里得到输入,他需要把产品模型抽象成软件模型,并划分好模块,让程序员们能够分工明确,各司其职。比如一个大型电商系统,需要支付,商城,购物车, 收货地址管理等一堆模块, 架构师就是那个搭建整个框架的角色
- 视觉设计 视觉设计主要从用户体验的角度出发,他们更专注于用户交互和体验部分。设计页面的排版,色调,logo的造型等等,为了让软件用起来更舒服。
- 开发 负责在架构师搭好的框架里写业务逻辑,让整个软件能够运转起来。 如果把架构师的作品比作骨架,那么开发做的事情就是填充肌肉和血管。
- 测试 测试人员的主要作用是保证软件的质量,他们用各种手段检测软件的bug,并反馈给开发人员。开发人员进行修改后再由测试人员验收, 直到质量完全合格
- 运维 运维人员主要关注服务器的稳定性和服务器端软件的升级更新。 他们是保证系统稳定运行的安全卫士,为软件的运行保驾护航。
其实一篇文章很难讲清楚程序员相关的方方面面, 这篇文章也讲的比较粗浅,希望能够给大家一个初步的认知。
网友评论