大学期间学校经常会举行各种创业比赛,在组队的时候往往会听到:“我们有想法有创意潜力巨大,就差一个程序员了!”而这个时候学计算机的同学们常常十分无语:“你知道要做出这个东西来得花多少时间么?你也太低估写一个软件的难度了吧!”
要想跟非专业人员解释清楚写软件难在哪儿,不容易。但我想试试看,看看能不能在这篇文章里思考明白这个问题。
首先,我们大部分时候看到的软件其实只是一个用户界面。不管是手机app,网页,还是电脑软件,我们看到的都是用户界面。在这个用户界面底下,有一个非常复杂的程序在运行。可能你只是在手机app上用手指滑了一下,这背后的程序可能会收到上百条信息,在每隔一段时间(可能是几毫秒甚至是几微秒)记录下你的手指当时所在的坐标位置。然后这个程序会通过复杂的计算知道你是往哪个方向滑。很有可能你滑的是一条弧线,那到底应该判断往右滑还是往上滑,背后的程序都会去做计算。
以上只是一个非常简单的例子,你可能会想说那手势操作就这么多,这软件也不算特别难写吧。那接下来我就以微信朋友圈为例子,来解释一下它背后涉及到的复杂逻辑。
首先你点开朋友圈,你会发现一些以前看过的内容立刻就展现出来了,甚至不需要联网也能看到它们。这是因为这些内容已经被存到你的手机里面了,这就涉及到了数据存储。朋友圈需要存下来的信息有,谁,头像是什么,在什么时候,在哪里,发了什么文字,什么图片,或者什么视频。这每一个逗号隔开的都是不同的数据,存储的时候必须得用某种方式隔开,因为之后读取的时候得能把它们分开。还有需要想办法让这种方式可扩展,因为我刚发现原来还有一种数据是分享的内容和来源。以后很有可能还得再加其它类型的数据,所以这个数据存储的方式必须得能增加或减少数据类型。研究数据存储的计算机科学分支叫数据库。
在读取本机数据之后,微信准备要把这些数据展示出来给你看了。针对于每一条朋友圈,它都得告诉手机系统,这个头像得画多大,放在哪里,还得能点开连到个人主页;这个名字得写多大,用什么颜色,放在哪里,也得能点开连到个人主页;这个时间......我省略了非常大一部分的内容,但你可以看到这每一条都是这个程序要和手机系统交代好的事情,要是出现一点差错你看到的朋友圈就彻底乱了。
在点开朋友圈的同时,你会发现屏幕上方有一个进度条在转,这意味着它在从网上去读取最新的内容。从哪里读?从腾讯服务器去读。腾讯服务器怎么知道要返回哪些内容?微信会告诉腾讯服务器,我是谁,我的密码是什么(当然不会是你的密码明文),我需要几几年几月几号几点几分几秒之后到当前的所有朋友圈内容。腾讯服务器收到这个消息,先判断一下你的账户是不是有效,密码对不对,然后就会去服务器端的数据库拿你要的数据。首先要知道腾讯有非常大量的数据,几十上百台机器都存不下。你可能听过2tb的硬盘,这个容量在日常生活中已经非常大了。但你听过pb么?pb是1024tb,也就是说你得买512个2t硬盘才是一个pb。而腾讯的数据量肯定远远超过pb级别,大到你根本无法想象。那腾讯的服务器怎么从这么多的数据里面找到你想要的呢?用来管理和维护这些数据库的程序非常复杂,但这涉及到非常专业的数据库知识,这里也就不多做介绍了。
本来希望能在一篇文章当中解释清楚为什么写软件难,可没想到写着写着就写多了。其实在做介绍的时候,我们还跳过了非常多的内容,包括手机端对网络链接的处理(发出请求多长时间收不到回复算没有联网?检测到没有联网应该怎么处理?),服务器端对数据的去重(我发了一条朋友圈,但腾讯并不会把它复制到每一个朋友的数据库里面,那样太浪费硬盘容量了),还有服务器端对连接数的均衡(一台服务器的处理能力是有限的,全世界这么多微信用户不可能全连到同一台服务器上,那谁应该判断哪个用户连哪个服务器呢)等等等等。这些背后的逻辑都很复杂,所以写一个朋友圈这样的软件就已经非常不容易了,更遑论微信支付宝这样包括各种功能的app。