浅谈程序员的工作

匆匆间时光飞逝,惶惶然不知所终。再有几个月本科就要毕业了,回顾过往点滴,在大学这个熔炉中真的学到了太多,然而对本专业的学习却是浅薄得很。

想当初选专业时也算是阴差阳错,实际上,刚毕业的高中生在填报志愿时哪里懂得专业到底是学什么做什么的,全凭一个脑海中勾勒出的印象罢了。软件工程,跟计算机打交道的,程序员,仅此而已。课程慢慢学下来,发现大多都是入门课、基础课、通识课,并没有学到深入的理论。其实本科阶段并不是术业专攻的时期,而是大学生完善人格,确立价值观的所在。任一门学科,每一个专业,其类目方向何其庞杂,或许大学课程的意义就在于帮助学生由浅入深地认识这门学科。三年多来,磕磕绊绊,借师问道,我一点点地认识所学而后学,了解程序员的工作。

现如今计算机的发展一日千里,随着各行业自动化的演进,计算机已不再是独立的行业技术而是成为各行业的基础工具。不仅仅是互联网公司,银行、研究机构、政府机关单位等组织和公司,都有着做网站、分析数据、开发管理系统、开发办公工具、维护数据及系统等等的需求,于是程序员遍地开花,成为一个新涌现的大群体。那么程序员的工作如何分门别类,又如何归纳统一呢?

看过知友对相关问题的回答,很受启发,我想结合自己的经验谈一下自己对问题的理解,也是对本科阶段学习认识的总结。

『程序员』是指从事程序开发、维护的专业人员,本是个很明确的概念,不过在中国当下的环境下不知怎的成了一个富有色彩的词,或许『软件从业人员』更加明确和贴切。软件从业人员的工作分为这五类:

  • 结构性工作
  • 效率性工作
  • 逻辑性工作
  • 仿真性工作
  • 物理性工作

1、结构性工作。 『结构性』,会联系到软件工程的『工程』,还记得大一刚开学时,院长在迎新生院会上讲解『软件工程』这个专业,一番形而上学的抽象的阐释听来云里雾里,『软件工程』这个词印在我脑海中的印象是种透着金属气息的厚重的感觉,偏工科而非理科,同时又需要文科的创作感。后来三年级修了『软件工程』这门课程,更加对用工程化的方法构建和维护高质量软件这样的工作有了认识,其实现在大多的程序员岗位都是这种工作,比如网站前端开发、移动应用前端设计开发、后台服务端开发和维护等,就是在工程化的框架下按照需求对一些软件功能模块的设计、编写、实现、测试、维护,这大概也是大部分人对程序员的工作的理解吧。这种结构性的工作需要的最重要的就是程序员的经验,有读写代码的基础,了解需要的数据结构和程序逻辑,能想清楚实现功能的步骤,便可以完成编写,难度不高,像一个网页的设计就是所见即所得的编写过程。这类工作难易的区分度不在数学上,而是在结构性上,最复杂的大概就属计算机操作系统了(操作系统就是一个软件),但和一个简单的小软件相比其并没有更高深的理论而是难度体现在工程的复杂度上。往往一个软件是团队协作的产物,因为系统的需求庞杂,程序的结构复杂,这也是工程化的开发理念管理在这里的必要性。

2、效率性工作。计算机相关专业的学生都要修的基础专业课有数据结构、数据库、操作系统这些,所有基础类的课程都是理论的奠基,也就有着研究性的拓展方向。效率性的工作就是计算机方面对理论的研究工作,当然理论的工作大多是为应用而服务,这类工作就是把特定的工程问题抽想成数学问题,然后用数学化理论研究,进而通过发明数据结构发明算法、优化操作逻辑优化算法优化搜索方法等提升解决问题的效率。拿淘宝网举例子,每日有那么多访问量,遇到双十一更是会井喷,服务器面对同一时刻的访问量如何承担负载,如何实现内容分发同步保证用户优良体验,如何存储海量信息和记录?只是结构性的工作只能实现功能而已,背后还有相当复杂的技术来支撑其性能,淘宝网的负载均衡系统、分布式文件系统绝对有着很大的分量。因此,这类效率性工作需要程序员较高的数学能力,尤其是需要掌握数学分析、离散数学、图论等,同时要对大部分数据结构有深刻的理解,擅长进行严格的理论分析。其实我一度觉得这才是正统计算机专业学生的工作,不过我感觉确实比较枯燥…有一套很有名的书《The Art of Computer Programming》贯通古今,以高屋建瓴的视角数学化的语言将计算机方面的理论分析和最优形式加以阐释讲解,我就是见到此圭臬才开始认识我认为真正的计算机理论的。

3、逻辑性工作。计算机的应用当然不至于呈现在眼前的网站、客户端、手机软件,结合到热门的『人工智能』、『大数据』这些词,我们会打开一扇令人兴奋不已的窗户,这里面是语音识别、语言文字处理、图像识别、信息检索、数据分析等等激动人心的应用,这也就是逻辑性工作研究的内容。这类工作同样需要丰富的数学知识,贝叶斯模型、函数降维、相关性分析、拓扑变换……需要线性代数、概率论、图论、拓扑学等数学理论。这类工作的应用可谓硕果累累,从扫描文本识别软件,到亚马逊、淘宝等网站的推荐和预测系统,再到sari、cortana等语音识别系统,一个比一个闪亮,目前最巅峰的产物要属IBM的计算机waston,其实Waston在人工智能史上的地位远远超过当年击败国际象棋大师的Deep Blue。然而,实际上在这方面的研究才是起步阶段而已,我曾学习过Andrew Ng在coursera上的机器学习公开课,里面讲到的模型算法就是问题导向建立起来的,并不是很高深,但是映射到现实情境中竟有很神奇的效果,就比如神经网络模型形式简单而内涵丰富,作为百度首席科学家的Andrew Ng也坦言当参数增大维度增高时的神经网络他也不理解,也就是说理论还深奥得多呢(难怪一些领域专家一直在提醒人类警惕人工智能)。 大数据听起来玄乎,实则不然,我研究生阶段的方向将是数据挖掘,其实还是要回归到基础的数据库的理论,在根基之上依需求玩数据猜结果,要相信没有一步登天只有步步为营。

4、仿真性工作。除了上面这些,计算机还在动画和游戏领域有着重要的应用。绚丽的动画和精美的游戏已经广泛地渗入我们的生活,以至于我一直都以为其存在理所当然,直到看过简单3D场景的制作才了解到其艰涩。看起来简单的画面,需要的是繁复的数值分析相关的知识,包括线性代数、微积分、微分方程、差分方法、经典力学等等。当然除了动画和游戏,天文、气象等其他需求仿真的行业也是这样的工作,各个行业也都有各自的侧重点和知识领域,但其核心都是计算和模拟。容易看出来,仿真性工作的成果取决于设备的计算能力,常常听到的超级计算机就是在这个领域能派上用场,据说08年北京奥运会期间的气象预测就是靠采购的超级计算机完成的。根据摩尔定律,电脑的性能每隔18-24个月翻一番,正是由于硬件的发展才使得计算机的计算能力飞速提升,仿真方面成果迭出,看了微软新公布的Holograms技术,也许虚拟现实离我们真的不远了呢,一起期待吧。

5、物理性工作。最后还剩下一类,是用产生的代码直接与物理世界相接触,这部分工作的产物大都是硬件相关的,从简单的元器件到复杂高级的智能汽车,大部分的硬件设备基本都是由熟知的传感器和执行器组成。这样也就能理解这类工作所需的理论了,传感器实际就是用电子元件观测和描述物理世界,电子元件的语言不是别的,就是0和1,用一种开或关的状态来表示一位数据,就以这样的方式一点一点堆积出元件显示出数据,何其壮观。除了数字逻辑电路、嵌入式系统这样的基础知识,还需要信号处理、概率统计、系统建模这些学问。传感器描述出来了,剩下的就是执行器进行控制了,这方面就需要力学和运动学等物理知识,同时还需要系统理论、控制论这样的严格的数学理论。如此,将传感器和执行器有机结合起来就足以产生很多复杂的系统,比如手机内部的重力感应器、惯性导航元件,更高级的如智能机器人,非常有前景。

这样条分缕析下来,程序员的工作终于清晰了许多,但似乎还很不周到,的确,这样隔离式的分割并不正确,因为5个类别之间的交叉联系又是那么密切,拿物理性工作举个例子,其对软硬件的耦合度要求很高,而其应用在航空航天这样的工业中又很难测试,那么往往就需要与仿真性工作同步展开。因此,虽说术业有专攻,但同时又要有一定的宽广的视野,总之,知识无限,学海无涯,路漫漫其修远兮。

关于这个话题,我想这只是我现在这个阶段的理解,随着继续深入的学习,我的理解程度也会一步步加深完善。