以前,开发人员写的汇编代码轻巧而且运行速度快。运气好的话,如果预算充足,他们可以雇佣一些人来帮助完成这些代码的输入。运气不好的话,只能靠自己完成复杂的输入工作。
现在,开发人员要和分布在不同大洲的团队成员一起工作,这些成员使用不同字符集的语言,更坏的情况是有的团队成员可能会使用不同版本的编译器。一些代码是新编的,一些库是从很多年前创建的,源代码已经无法获得。所以,要想成为一个程序员,必须要拥有团队精神和吃苦耐劳的信念。
下面我们就来梳理一下正在改变基本开发工作的15种科技技术。这些技术改变着我们与其他团队成员的合作方式,与客户的沟通方式以及我们的编程方式。
1、持续集成(Continuous integration)
当把代码提交到库中以后,你就有足够的时间休息一下,喝杯咖啡,甚至可以去吃个午饭。这个时候,代码库已经与一个持续运行的编译系统绑定,开始重新编译你提交的代码,仔细检查你的代码结构,初始化多个测试程序,标记你代码中可能的问题。在离你办公桌5英尺的范围内,编译系统就通过邮件或短信将需要修复的问题发到你的手机上。重新回到工作岗位,持续运行的编译系统又有新的任务给你了。
2、架构(Frameworks)
通过复制别人的工作进而站在巨人的肩膀上已经不是什么新鲜事了,但是优势却从来没有像现在这么明显。现在只有很少的编程工作是从头做起了。最好也是最有争议的开发方法是:利用一个正确的框架,研究清楚 API,然后自己写代码使用API完成最核心的功能。网页不再是由 HTML 或者 CSS 生成的了;更多的是开始使用 Ext JS,Express JS 或者其它代码库作为编码的基础。
当然,你也可以创新并且从头开始构建所有的东西,但那是相当痛苦的。你没有办法赶上其他人做的所有工作。你不是一个技工,仅仅是一个框架修理工。在你打算自己编码之前,先了解一下已经正在使用的框架。
3、代码库(Libraries)
和框架类似的是代码库,代码库无处不在,程序员已经离不开它了。写关于浏览器的代码可以不用jQuery 吗?是否有人记得有一个内置函数 GetElementByID?像 jQuery 这样的库现在应用在各个层面。人们会谈论他们喜欢的语言,但是确很少谈论他们是怎么编程的。如果你想雇佣一些程序员,你应该多问他们一些关于代码库的知识。Java脚本的开发人员是从 jQuery 或 Dojo 发展来的吗?游戏开发人员可能会使用 C++,但是实际的问题是这些开发人员是否知道 Allegro,Unity,Corona 或者其他更多的选择。代码库的知识和语言本身的来龙去脉一样重要。
4、应用程序编程接口(APIs)
从前,程序员总需要关注数据结构。他们需要将所有的信息打包成字节块,确保将值放在正确的偏移位置。现在,编译程序为我们做了这些。
现在我们通过非常严谨的接口工作,它有一个发烧友一样的名字:应用程序编程接口。它通常在一个完全不同的机器上或是运行在其他公司的,每次调用都需要收费。你想将一个街道地址和一个邮政编码变成经纬度吗?有专门的 API 接口可以调用,并且使用的费用也相当便宜。
很多情况下,数据不需要这么死板的打包。旧的字节打包方式已经被轻量级的数据交换格式例如JSON 或 XML 取代。你需要确保你的数据格式完全正确,幸运的是有现成代码库可以用。
5、平台即服务(Platform as a service)
谁建立了自己的网站?相反的,如何在别人的网站上创建一个用户账户,并做一些定制呢?所有的这些仅仅需要的是一个网站,这样,你的站点就可以做你想做的所有事情了,比如往 Youtube 上传一个猫的视频或者在 eBay 上竞标一个佩斯饮水机。
当然,这个例子有点夸张。许多 PaaS 选项目前都要求程序员清楚的知道每个 Web 表单上放什么东西。以微软的云服务为例,你可以将用 Java 脚本语言写的用于描述网站如何响应的函数放到上面。然后,这个云服务会将这些函数打包成一个库然后放在js节点上运行。
6、浏览器(Browsers)
曾经有一段时间人们分别写桌面软件,服务器软件和设备上运行的软件,这些软件都是不一样的,软件之间相互传递信息的方式也互不相同。现在,所有的这些都使用浏览器了。当我在家里建立一个本地文件服务器来存放音乐,就可以通过一个网站登录到这个网址上。苹果的桌面窗口程序是用 Java脚本和超文本标记语言写的,已经用了很多年。很多用超文本标记语言和Java脚本写的移动客户端的跨平台应用都和 Apache Cordova 绑定了。
当然,很多应用还在继续使用 C/S 结构。最好的游戏仍然使用客户端模式,没有使用浏览器,但是随着越来越多的 Java 脚本开发者研究在画布上绘图这种情况正在改变。例如,愤怒的小鸟,就即将运行在浏览器窗口上。
7、应用程序容器(Application containers)
专门建立一个服务器来做比较困难的工作。程序员可以从服务器上获取代码然后运行,并且将运行日志发送到服务端。有时候可以得到正确的库,有时候得到的库是错误的,但最终,都会找到可用的代码库。
现在,类似 Docker 这样的应用程序容器允许我们按一个按钮就找到正确的库。如果 这个代码库可以运行在我们的测试机上,它也可以运行在服务器上。所有的东西都捆绑在一起了,那些夹在我们桌面和服务之间不兼容的东西都不存在了。
8、基础设施即服务(Infrastructure as a Service)
我提到过服务器策展人团队吗?这些人喜欢在午餐时间或下班后出去玩,但是现在他们都被聚集到了云上,像是在一个全球的数据中心那样为那些自认为是云世界中的领导者的公司工作。少数开发人员会需要服务团队为他们的新工程搭建一个新的服务。他们只需要登录一个站点,按一个按钮,就可以得到一个为他们服务的机器。特别简单,但是这些 IaaS 管理网页不会在工作结束后为你买一杯咖啡。当然,它能为你节省很多工作。
9、Node.js 和 JavaScript(Node.js and JavaScript)
在你们中的一些人出生以前,网络服务器送出静态的 HTML。后来,有人就开始研究如何构建动态的,可以和数据库交互的服务器。每个团队都需要一个人用 SQL 语言编写数据库程序,一个人用PHP 或 Java 编写服务程序,一个人设计 HTML 模板。一旦每个人都开始喜欢上运行在客户端的AJAX 和 Java 脚本,这个网站就需要一个会这种语言的人。
现在 Java 脚本做了所有的事情。当然,浏览器用 Java 脚本,服务端(Node.js)和数据库(MongoDB 和 CouchDB)也一样。即使是 HTML 也通常是用 Ext JS 或者 jQueryMobile 这样的框架,使用 Java 脚本在客户端生成的。
10、二级市场(Secondary marketplaces)
如果你想构建一个游戏,你可以自己雇佣一些设计人员,创建一个非常棒的模型集。你甚至可以雇佣一些开发人员为你的游戏增加一些视觉效果,让游戏看起来更酷。或者你可以去类似统一资源市场的二级市场购买你需要的所有部分。当我写这些的时候,构建下水道的场景的工具箱正降价30%,可以用来构建小型的或大型的游戏场景。这个销售活动在你看见这则新闻的时候可能已经结束了,价钱可能已经升到45美元了。开发人员和设计人员怎么会有这么低的价钱!
现在有越来越多的提供插件,库和其它附加软件的市场。有这么多的库和框架,开发人员也越来越多的去购买所需要的部分,编码工作越来越少了。
11、虚拟机(Virtual machines)
编写大段代码的时代已经慢慢远去了。现在大部分写出来的运行在虚拟机上的代码都被翻译成芯片可以识别的指令了。Java 虚拟机,C#/.Net 虚拟机,现在的 JavaScript 引擎都是代码的最终运行载体。
虚拟机的流行,使得这个领域吸引了越来越多的东西。过去,如果你想创造一种新的语言,你需要创建从处理器到寄存器的整个流程。现在,新的语言运行在旧的虚拟机上。Clojure,Scala,Jython,JRuby 都参与了虚拟机开发的工作,现在这个虚拟机业务是属于 Oracle 的。
相似的情况也出现在浏览器领域。使得,你可以创建你自己的浏览器和语言,也可以通过价差编译在Java 中模拟。现在很多新创建的脚本语言也是这么做的。谷歌的 Web 工具包也有类似的功能:将Jave 语言转换成 Java 脚本。
12、社交媒体网站(Social media portals)
在互联网的早期,你可以搭建一个自己的网站,然后祈祷人们可以找到它。他们需要记住你的网址。
越来越多的网站被吸引到互联网世界中,涌现出了非常多的社交网站和营销网站。如果你建立自己的网站,很可能门庭冷落,大部分用户都在社交网站和营销网站上浏览、点击。解决这个问题的办法是搭建一个社交网站或销售网站的应用,通过这种方式可以进入并集成到这些网站中。但是最后,你的应用也仅仅是一个附庸,会受到很多限制,还很可能会被轻易停掉。你还有别的选择吗?没有,你要么选择做大型网站的附庸,要门只能接受门庭冷落的现实。
13、开发工具(Devops tools)
很久以前,我们仅仅需要在一个服务器上安装软件就能满足应用需要。但是现在,我们要租用大量的服务器,需要几十,成百,甚至上千台机器,其中很多机器都需要按照需求配置,已经不是一个能用手工完成的工作了。
进入运维模式,就会有一些类似 Chef 和 Puppet 这样的工具帮助你完成这些复杂的工作。将软件推送到云端,在这些工具的控制下,可以保证所有的机器上运行的是相同的代码。这些工具替自动完成了我们以前在一台机器上的工作。
有一些服务,例如谷歌应用程序引擎已经在内部处理了这些,你需要做的仅仅是将你的应用程序告知引擎,并授权它开始工作。你甚至不知道后台到底发上了什么,你能看见的仅仅是 CPU 的占用量。
14、GitHub,SourceForge和代码共享(GitHub, SourceForge, and social code sharing)
代码共享网站可能是开源世界的最大贡献。在 SourceForge 出现之前,软件仅仅是在你的机器上创建并且代码也只属于你。如果另一些人想获得源码,他们需要找你来获得源码,当然必须要得到你的统一。
现在代码共享已经变成了一种共识。类似 SourceForge 和 GitHub 这样的网站发布了所有的代码,供所有人阅读和更新。他们为代码的维护、共享、评论提供了一个易于访问的地方。你可以通过一个入口阅读这些代码,并提出修改意见。很多项目每个星期可能有几十甚至几百万的下载量,这在以前是不可能的。
这种模式非常有优势,很多自营项目都使用这种模式。GitHub 和 BitBucket 这些网站还在一定程度上支持他们售卖自己开发的代码库。
15、性能监控(Performance monitoring)
早期,跟踪代码性能是一件非常容易的事。在代码执行的初始位置打印一个时间,然后在执行结束的位置打印一个时间。如果你想,你还可以把这两个时间做一个差,然后打印出来。很多问题在一台机器上是无法暴露出来。在代码上附加一个分析器可能无法暴露出真正的瓶颈,导致这种瓶颈的的原因可能是内部的一些复杂问题或者是数据库延迟。现在测试网络性能的工具不仅要测试软件本身,还需要测试软件中的每个模块。这是了解内部运行是否正常的唯一方式。当程序从在一个机器上运行演变成通过网络互相连接运行后,这是一种判断程序运行是否正常的非常重要的方式。