偶尔要写点严肃的显得有专业素养的 Part 1

掐指一算,时间已经过去了6个年头。这不算长也不算短的时间里,也做了不少的项目,虽然没有惊天地泣鬼神,但有关技术方面的神秘面纱已经看起来不再那么神秘。编写软件,并不算太容易的事情,却也不是一件太辛苦的工作,除了长时间面对电脑屏幕的辐射之外,比起风吹日晒雨淋权谋算计勾心斗角来说,还是显得清静很多。

好像有人说过这样的话,所谓软件,逻辑上的本质就是在处理数据。这话即便不是十分准确,也差不多对了七八分。无论有没有互联网,软件的基础首先都在于数据的存储,而随着互联网的出现,数据存储技术的也在这个时代发生了许多变化。

数据存储

关系型数据库在数据存储领域的主宰地位在近十年来第一次出现了动摇。在较早期的时候,针对数据库性能瓶颈的问题,人们多采用反范式的设计和分布式的高效Key-Value缓存来应对。在那时看来,所谓Sharding似乎是一门很高深的技术,而且当需要对数据库做分割的时候,似乎标示着业务和技术都上了一个新的台阶。

如今,在数据存储方面有了更多更方便的选择,比如MongoDB, Cassandra和Redis等等完全不同于传统关系型数据库的数据存储方案。这些方案比较共通的目标都是在保证性能情况下,提供高可扩展性和可用性。NoSQL这样的话题持续了一段时间,但并不意味着关系数据库就已经是过时的产物,在它们适合的领域里,仍然是无可替代的。

数据库曾经是作为许多大学计算机以及软件专业的必修课之一,然而那份教材大多是在讲解符合范式的设计以及SQL语句的使用。如今看来,这份经典教材是到了需要修改一下的时候了。如今如果讲不出分布式数据存储的基本原理,恐怕都不好意思说你懂数据库。

当然新的数据存储方案仍然也是有缺陷的,比如相比之下更多的内存和磁盘空间占用,以及更灵活的数据存储结构带来的维护难度。仍然缺乏相比之下比较成熟的管理工具也是一个问题。

总之,如今在解决数据存储方面的门槛是降低了,但要做的好仍然不是件容易的事情。 内存和分布式是带来改进的关键词,但也别忽视了SSD所带来的改变。

函数式编程和并发

有些不知道什么野路子培训出来的程序员,在他们眼里,程序就是面向对象。在这个对处理并发变得更加常见和重要的时代,函数式编程终于重新被普遍重视起来。其实这并不是什么太新奇的东西,Erlang OTP在处理这类问题上已经提供了一套久经考验和成熟的方案,然而许多人仍然不太适应Erlang,或者用不好,这是因为Erlang里是完全没有面向对象的概念的。这确实对一些实际应用类型的设计提出了挑战。

值得庆幸的是,如今我们也还有其它一些选择,比如Scala和Node.js。Scala中的Actor模型是一个很好的应对并发的机制,在实际应用中,如今大多使用的是Akka中的Actor,其许多机制与Erlang类似,拥有更丰富的特性,也没有完全失去面向对象设计的一些优点。然而Scala最大的问题在于其过于丰富的语法表达,这必会影响到其后续版本更迭的速度。Node.js并非完全意义上的函数式编程,但通过大量callback调用的方式,形成了一套看起来比较自然的异步处理。这二者在未来的一段时间,想必会成为许多服务器端应用的基础选择方案。

Go可能是一个非常有潜力的备选方案,但目前看来,其基础库想比依托于Java平台的Scala和已经比较成熟且有大量第三方package的Node.js而言,仍然不够丰富。没有足够技术储备的团队,还是谨慎采用会比较好。

混乱的客户端

在这个APP大行其道的时代,客户端技术也显得一团乱糟糟。前两年做网站的炙手可热的前端工程师如今处于一个尴尬的地位,潮流总是来了又去,在面向用户的方面,网站已经没有太多的风格花头可以挖掘,设计风格也趋向于成熟和稳定。许多前端工程师都已经提前转型开发Native App,这其中又面临iOS和Android两个平台的选择。无论Cocoa还是Java,都不是太讨人喜欢的语言类型。但如果一定要选一个,还是iOS更好一些,至少Android设备的多样化,其开发测试的痛苦程度不亚于多年前兼容多浏览器的工作。

那么,HTML5呢?在zack看来,当年BS模式挤兑CS模式,浏览器内基于Web的应用取代传统PC客户端软件的潮流在移动设备上是不会重现的,因为这根本是不能拿来类比的体验和需求。而且,iOS和Android这样代表型的移动操作系统,在应用规范和界面设计指导上已经是非常成熟,而HTML5和CSS3这样的东西,发展的脚步反而是落后太多了。而且最重要的,当年的潮流是因为互联网技术的兴起,在那背后是有非常具有吸引力的商业利益在推动,而如今Native App已经在商业上做的足够完整了。应用技术方案的变革,是受商业变革推动的,这是事实。

当然这并不意味前端技术就会过时,这两年来,也出现了像AngularJS, Bootstrap和Backbone.js这些非常出色的框架。然而仔细观察一下也能发现,这是因为云平台商业模式的发展,使得更复杂但却平滑的基于Web的专业管理工具成为了一块新的需要重视的需求。开发这些工具会是一件与开发面向普通用户的Web应用有许多不同的事情,所以,这就取决于个人的喜好问题了。

不要在跨平台,适应性设计方面投入太大的精力,这并不见得就比开发两个版本的客户端节省成本。而平台兼容这件事情,从历史上看,还是交给时间去解决吧,只要不要选择一个没有用户的平台去做开发就行了。