你所理解的程序员与我所理解的·下

书接上文

你好,我是 Haiyung。

书接上文,在《你所理解的程序员与我所理解的·上》中,我为“程序员”正了名,他们不维修电脑,也不做外挂,他们不是只会写代码的“农民”,他们既不卑微,也不高贵,他们就是他们,一个职场人,一个员工,一个市场经济的参与者和受益者。

就像盖一幢二层小楼,总得有人画图纸(技术总监),总得有人施工(软件研发人员),总得有人琢磨物料够不够、人够不够、时间来得及来不及(项目经理)。他们这一群人组成一个集体,集体干成一件事- -把这二层小楼盖起来,卖出去。

职业划分

请问你是做什么工作的?你的行业是什么?假如有个小朋友有志于进入你所在的行业,你会如何介绍你的行业,你会推荐什么职业给他?

比如娱乐业,从横向来看,他们分为影、视、歌三个板块;纵向来看,每个板块又存在各种各样的分工。拿电视来说,有摄、录、监、采、编、播、管、存等等。

当然了,对别的行业我说的也许并不专业,我只是想通过上面的例子,告诉你在进入某个行业前一定争取对它有个整体上的认知。俗话说“换行穷三年”,你千万别入行好久了才幡然醒悟“原来自己不适合这个行业”。

接下来,我就从一个普通的软件研发人员的角度说说这个行业以及这个行业的职业划分。

小型公司的技术人员配置

假如你现在有个新的点子 - -通过软件的方式解决生活中的某某痛点。你手里攥着 50 万现金,开了一家公司。现在最紧迫的是要把你的点子落地,变成产品,提供给消费者。

想想看,你将会怎样配置你的软件研发队伍?

你自己就做产品经理吧,再配两个活儿不错、踏实、勤奋的前端开发、后端开发,三个人,够了。

你也许会觉得寒酸,不过以我和我不少同事的面试经历,很多初创公司基本就是这配置。其实成本已经不低啦,仅算发工资的话,你的 50 万,一年下去一大半就没了。

前端是什么?

你的产品是给用户使用的,对吗?就像 PPT 一样,你做出来的 PPT 是给别人看的,对不对?

那么这时候,你就要考虑,在将产品展现给用户时:

你一定想让你的产品亮瞎用户的双眼。那么就需要你这个产品经理做深入的调研,并在用户体验方面下大功夫,给出一个能亮瞎用户双眼的方案。这之后,前端开发就会用他们掌握的技术将你的方案落地,到网站上,到 Android app 上,到 iOS 上。

很多人觉得前端不就是美工吗?前端不就是页面的设计者吗?不对。前端不是设计者,前端是实施者。前端负责把展现给用户的页面,按照设计图纸,做出来。因此,对前端的美学要求、设计感其实并不做限制,从职责上讲,他们不需要知道为什么选这张图片而不选那张图片,为什么这里是深蓝色而不是绿色,他们要做的是在合适的时间、合适的地点,用合适的代码将合适的内容,合适的展现给用户

很多人觉得前端简单,我也不这么认为。诚然,前端的工作可能不太需要计算机理论的深层次知识,不过,它可是距离用户最近的工作。这年头,用户是爸爸,可不好伺候啊。从用户一加载页面开始,前端同学就肩负重任,按钮的下拉菜单、弹出框的展示方式、表格数据的渲染,这些都需要大量的前端代码支持,工作量巨大,且细节点非常之多,来不得马虎,稍有差池,要么功能就不能用,要么浏览器展示不出来对应效果,投诉就纷至沓来了,一点都不简单。

后端是什么?

有人形容软件应用程序就像冰山一样。暴露出来的部分是前端展示给用户的,而大部分却隐藏在水底,那是后端开发人员的领地。

你的产品一定在解决某个或某些问题。这些问题原本处理起来非常复杂、啰嗦,需要耗费大量的人力。你希望自动化解决他们,从而解放人。

在你的产品里,前端负责将这些功能展示给用户,等待用户触发。一旦触发,后端就负责在背后默默的将这些问题妥善的解决。

你明白了吗?我举个例子,大家都放过炮仗吧。

那么请问引线的作用是什么?

对于放炮仗的人来说,他不需要知道炮仗实现爆炸效果的基本原理。过年的时候好多小孩子都喜欢放炮仗,你拉过来问他为什么炮仗会爆炸,一万个小孩子里,有几个知道的?

他只知道点燃引线,引线“嘶嘶拉拉”的就往后跑,引线燃尽后,炮仗就会“bang”的一声被炸的稀巴烂。

在真正的开发工作中,引线的名字叫做“API”,这是后端提供的。前端做的工作是把这个 API 包装的漂漂亮亮的,最起码不要让用户讨厌。

比如某个网站有很多功能性按钮,这些按钮就是引线…的前端包装版,你点击了按钮,就等于触发了引线,信号最终传到后端,后端负责后续的“引爆”处理。

所以后端是什么?

后端就是用户要做的任务的最终执行者

后端的复杂性就在于:用户要做的任务是多种多样的,任务的复杂性、难度都不尽相同

举个例子,你在你的操作系统中对某个文件点击右键,执行删除。“删除”这两个汉字其实并不会执行删除操作,它仅仅起到了引线的作用- -向操作系统发送“删除”的信号。然后呢?后端开发人员必须提前就写好相关的代码。等“删除”的信号传递到后端,后端会执行那提前写好的“删除”操作相关代码,从而真正的把文件从系统中删除。

这是个相对简单的例子,仅仅这个例子,后端开发人员就需要了解操作系统的理论和应用实践的相关知识,这些知识在大学里至少得半个学期的课程。

如果例子的范围再扩展些,比如淘宝 APP 在双十一的时候,一天要承受几十亿人次的访问量,就好比一个热门景点十月一的场景一样,好比周末晚上黄金时间你去海底捞排队一样。难道也要让用户在网络上手里攥着钱苦苦的排队等待吗?当然不可以,这个问题后端开发人员必须解决,用到的知识就更多了。

中型公司的技术人员配置

恭喜你,你的产品在市场上站稳脚跟了,挣了不少钱,公司逐渐壮大,用户也越来越多,更多的功能需求紧跟着也来了,你需要扩展你的技术队伍了。

前端、后端都从 1 个增加到 10 个,你的前后端开发就有 20 人了,仅仅这 20 口人,每个月的研发成本就大概 30 万。我想你这时候压力不会小。

不过这还不够。

后端因为它自身承载知识的广泛、厚重的特性,所以可以进行更加细致的划分,比如各种计算机编程语言的后端开发(golang 开发 / Java 开发 / Python 开发),针对各种设备的后端开发(Android 开发 / iOS 开发)等等。

这依然不够。

随着你软件服务的用户越来越多,产品质量就越发重要,这不仅关系到产品的竞争力,还关系到产品的声誉,甚至公司的声誉。

所以你还应该配备专业的“测试”队伍。

测试是什么?

人如其名,“测试”当然就是测试你司的产品的啦,在“出厂”前对产品做最后的把关。

相关测试人员可以说是你们产品的第一批用户。他们会对该产品上上下下的功能逐一的“试用”。他们需要对产品各个功能点烂熟于心,只有这样,他们在“试用”的过程中才能知道某个功能是否满足用户需求,有没有出错的地方。

测试人员天生带着尚方宝剑。他们有资格就产品功能提出任何疑惑,当功能不满足需求时,他们亦可以雄赳赳、气昂昂的将该功能打回到前端/后端的开发手上,改!

嗯,测试人员最开心的时候就是测出 bug 的时候,往往这是最能体现这些同学存在感的高光时刻,当然了,这也是前端/后端开发人员被打脸的惨淡时刻。这时候,测试同学是浑身发光的,前端/后端人员则是低眉耷拉眼的。

测试人员平常不仅仅是点点鼠标、打打字、测试软件是否能正常使用这么简单,里面学问也大着呢。

他们有自己做事的方式方法,用来保证测试覆盖率足够高;也有自己的方法论,用以更快、更便捷的发现软件功能、性能上的缺陷;等等等等。

其他

到这里就够了吗?

我觉得仍然不够。

你们公司服务的用户那么多了,服务器怎么样?会不会三天两头的当机?你需要一个运维工程师

你们公司的数据库系统怎么样,需不需要一个 DBA(数据库管理员)?

需不需要售前工程师?软件出故障了,需要不需要售后工程师?

太多了,我就不一一列举了。

此时,我真的替你捏一把汗。这个工程师,那个工程师,推广运营人员也得到位吧。总的下来少说也得七八十口子人,此刻的你,即便月入百万,请问还剩钱吗?

基础技能

我认为造原子弹这事儿挺难的。

这不是一般人能进入的行业,门槛高,难度大,需要经年累月的做物理、数学方面的研究。

很多人认为软件研发人员的工作内容跟造原子弹差不多。

扯淡!我们只有面试的时候才造原子弹好不好:)

当然我是在开玩笑。

事实情况是,如果只是想入门这个行业,大概只需用到小学生的数学以及初中生的逻辑思考,你就足以应对在这个行业前两年的工作了。

不过,你仍需要大量的刻意练习。

编程语言

三次技术革命的发展轨迹

蒸汽机的改良引发了第一次工业革命,人类从此能够更加可控的将热能转化为动能。

第二次工业革命是电力技术革命,人类进入了“电气时代”。

第三次工业革命多称为第三次科技革命,始于上世纪五十年代,目前正在进行中,未来到哪个时间点结束我们还无从知道。

这是三次技术革命的发展轨迹。

这三次技术革命奠定了我们今天的生活:房子、车子、电冰箱、计算机、手机…

很早很早之前,还有一件重大的技术革命:人类驯化了小麦。自从驯化了小麦,人类得以春种秋藏,不用再过有上顿没下顿的日子。这个观点好像是来自于尤瓦尔·赫拉利的《人类简史》一书。

我们能发现些什么呢?

从种小麦,到工业时代、电气时代,再到现如今的信息时代,人类得以迅速的发展,并不是靠自己身体的健壮性有了多大的飞跃,而往往是用智慧巧妙的借助了外力。

计算机、手机都是第三次科技革命的产物。他们是机器,需要人操作,这是跟汽车、挖掘机的相同之处;但是,计算机、手机支持算数运算、逻辑判断,同时还具有存储功能,这是跟其他机器不同之处。

很简单,1 + 1 = 2 这事儿你交给挖掘机,无论如何它都干不了;1 + 1 是不是大于 2 呢?这个问题挖掘机也无法回答。

什么是编程语言?

编程语言是人希望能通过更高级的方式操作机器的手段。

你左打方向盘,汽车左转,右打右转,这种就是用简单的机械方式操作了汽车这一机器;不过如果是辆自动驾驶汽车,遇到某种情况,它会自动的左打方向盘,这就高级了,为什么?因为机器做了判断,判断的过程是:

当前方 1000 米内无人:
    挂四档;
    加速;
前方遇到行人:
    刹车;
行人消失:
    慢起步;
发现限速牌照:
    现在的速度 >= 限速吗?
        如果是:
            减速;
        如果不是:
            保持;

你能明白这其中的区别吗?

机器是人的延伸,但机器用起来还是笨拙,能不能赋予机器一点“逻辑”?

“笨拙”的机器是第一二次工业革命的产物,随着科学技术水平的提高,人类并不满足现状,希望这些机器能更聪明一点,这是第三次科技革命的使命。

而给机器编写程序,是这次革命中重要的组成部分。

什么是程序?

程序不是专门指代码。你在生活中没有遇到过这个词吗?比如工作有工作程序,司法有法律程序。

程序,就是做一件事情的流程和顺序。我们做任何一件事,都有一个流程,包含一些步骤,而这些步骤之间往往有一个确定的顺序。比如我们要出门,得先穿衣服、穿鞋、穿袜子,但你不可能先穿鞋子再穿袜子,一定是先穿袜子再穿鞋。这样的流程和顺序合在一起,就是程序。

– 来自张砷镓文章《学编程到底有啥用?》

软件程序也一样,只不过是把本来用中文写就的流程和顺序翻译成机器能看懂的语言。

软件程序在做什么?

仍以刚才举的自动驾驶汽车为例,你刚刚看到了汽车收集到了什么样的信号,然后对信号做了判断,从而最终导向到了某种决策。这就是逻辑,程序中写满了类似于这样的逻辑。表面上看是机器自己做出了选择,其实不然,是程序的开发人员在“背后”教他这么做。

推荐的编程语言

Python 是一门非常适合初学者的计算机编程语言。

其实世界上有非常多种的编程语言,不过很多编程语言哪,一开始配置开发环境的时候就让人搞得头大。比如 Java,是一个非常优秀的编程语言,不过自学的话,并且是刚刚入门,学习的难度挺大的,要是有个人手把手教,就好了。

我还是推荐 Python。学习 Python 你不需要报这个培训班那个培训班,网上有很多免费的视频教学资料,一个课时一个课时跟着来,课后勤加练习,如此两个月,持续精进,入门一定不是问题。

操作系统

我们每个人都用过电脑,电脑里都有安装操作系统,Windows 或者 macOS,大家不仅会用,还非常熟练。

假如你将要成为一名正式的软件研发人员,仅仅懂得这两个操作系统的正常使用还不够,还有一个:

Linux

不要求你有多精通(如果真要精通的话,可能真得闭关修炼个几年呢),但求能熟悉命令行操作计算机的方式,一些基本的命令能掌握,就够了。

以后有用到更深的知识,再慢慢学习就好了。

这里我还是以推荐视频为准,鸟哥的《Linux私房菜》固然好,但专业书籍对初级选手来说并不太友好,读不了一会儿就困了,我推荐“马哥教育”做的 Linux 培训课程,不用全上完,上一半就基本够用了。

Git命令行使用

21 世纪的第二个十年,绝大多数的软件项目都在使用 Git 作为版本管理工具。

还是那句话,假如你志于将来从事软件研发的行业,操作系统、Git 最好学一学;如果你只是想满足一下软件研发的好奇心,你就老老实实的把 Python 学习好,其实就够了。

推荐的视频教程是:

《玩转 Git 三剑客》–极客时间 APP

英文文档阅读能力

这项能力大家都知道非常重要。

可事实却是:

我的笔记本操作系统是英文的,我的 Android 系统是英文的,我强迫自己看英文新闻,比如 SCMP、Reddit…

一开始肯定不适应啊,逼一逼自己,再逼一逼自己,习惯了就好了。

参考书籍:

《把时间当作朋友》《人人都能用英语》–李笑来·著

上下游同事

任何一个行业的人都不是孤立存在的。

拿格力空调为例。格力集团,大厂商、大牌子,产、供、销非常复杂,它一定有自己的上下游关系。

上游:为格力提供原材料的厂商,比如铝、塑料、压缩机等等

下游:你肯定去商场买过电器吧,那商场就是格力零售商,还有各个按区域划分的一二三级代理商。

搞好上下游关系非常重要,甚至有公司专门设置了这样的岗位:供应链经理。负责供应链最出名的人是Tim Cook(苹果公司继乔布斯后的现任 CEO)。

随着软件工程越来越庞大,我们这个行业也越来越需要跟不同岗位的人打交道。

今天我先把这些职位放在这里,有些职位上一篇文章或者本篇文章已经讲过了,有的则没有涉及到,有兴趣的话,可以自行 Google 或 Baidu。

好了,就到这里了,希望你能有所收获。


本系列完