漫谈编程

# 漫谈编程(一)

今天本来我是打算介绍扫地机器人的一种基础算法实现的,但是回去看了下自己2年前写的代码,感觉有点蒙圈。要再次看明白可能得花不少时间,估计看明白后今天就过去了。所以只好换个话题,来随便聊聊关于编程的事儿,说到哪算哪。编程(programming),是我们在这个时代大家时刻都在接触却在大部分时刻熟视无睹的事情:当你用输入法在Ulysses里打下这段话的时候,当你用微信给朋友发送信息的时候,当你去银行ATM上取钱的时候,你都在享受着编程带来的便利。想象一下没有编程世界会变成什么样子吧!首先,手机和电脑是没有了的;PS4、kindle、MP3,统统不存在;所有的网站,包括你心爱的淘宝、京东、亚马逊,通通消失;ATM,银行卡,信用卡你也别想了,出门在外,你又得带上鼓鼓囊囊的一大堆现金了;想要了解时事消息的话,你可能只能买报纸了。

大部分人对于编程都会有一种迷思,觉得那是很高级的脑力活动,只适合一群穿着格子衬衫戴着眼镜背着书包上下班的Nerd去做。但实际上我们在生活中或多或少都会参与到编程活动里去,你有没有发现,现在很多软件里面设置的选项一大堆,需要你自己去开关,这其实就是程序员、产品经理和设计师为了减少自己工作量而想出来的阴谋。当你把某个人的微信消息设置为不提示,或是修改对ta的朋友圈权限时,实际上,你就是在进行个性化编程了。站在软件的角度而言,你实际上调用了一个函数,并传入了一个参数,它会把你在该好友界面滑动开关的行为理解为你向“消息静默函数”传入了名为“好友A”的参数,进而返回给你要的结果。换而言之,如果你进入控制台,直接在控制台去调用那个“消息静默参数”,并传入你朋友的ID,你可以得到同样的效果,具体的操作大概看起来就是调用类似于这样的命令`call silence_message(id=my_friend_a)`.

另一个大众常见的误区是以为软件的本体就是储存在你手机里的那个app应用,而其实那个其实只是软件的一部分,并且通常是体量较小的部分,它的行业术语叫做前端应用、或者客户端。而在隐藏在它身后的,使得它的功能得以完整发挥的,是另外一个庞大的软件体系,被称作后端应用,或者叫服务端(这个后端应用系统的数据可能会被储存在由成千上万台高性能主机组成的服务器集群里,机房里配有完备的制冷和消防设施)。好比你去一家餐馆去吃饭,那些华丽的桌椅,精美的餐具,热情微笑的服务员,都是前端;而最后不知道从哪把你要吃的菜搞出来的,是后端。所以你和朋友通过微信聊天,信息并不是通过你手机上的微信客户端发给了对方的微信客户端,而是你先把信息用你的客户端发给服务端,服务端接到请求后再决定要不要发送给对方,如果有信息屏蔽和审查的话,那也是在服务端处理你的信息时完成的。

当你的信息发送到微信的服务器时,他们会需要把你的聊天信息存起来,但相信我,他们存的不是中文,而是unicode(业界常用的一种unicode编码方式是utf-8,不过这个补充信息对你而言一点都不重要!), unicode所做的是将世界上主要的符号系统统一成一套“数字-符号”映射表, 比如'你'字在Unicode里对应的编码是20320, 而其他的韩文、日文、希伯来文、埃及楔形文字都可以在Unicode里找到对应的编码。为了让其他的软件能认出这个数字编码是以unicode形式编码的,它会把这个数字转化为十六进制,同时在前面加上'U+'的开头,比如'你'这个汉字的Unicode表现形式就是'U+4F60'。

微信服务器会把这个编码传递给前端的渲染软件,比如微信对话框,告诉它我给你发了一个编码为20320的Unicode,前端的文字渲染软件会根据它们内置的对应表去决定如何展现这个编码为20320的Unicode,在通常情况下,它会显示出一个某种字体的”你“。所以其实你在word文档里看到的不同字体的“你”都是word这个前端软件在对同一个unicode进行不同表现形式的渲染。而你把word文档下一个隶书的'你'和一个楷书的'你'粘贴到浏览器里某个输入框时,你会发现,它们在那儿看起来完全一样。

因为它们本身的unicode都是一样的,只是在前端展现软件里被进行了不同的渲染。

虽然客户端和服务端都在为传递你的信息而孜孜不倦地努力着,但很多情况下,他们使用的编程语言是不一样的,就好像客户端说的是英语,而服务端说的可能是旁遮普土语。这时他们需要一个中间的代理人来传递信息,客户端告诉中间代理人他要什么,代理人再转达给服务器,服务器把客户端申请的东西交给代理人,代理人再把这个东西(信息)带回给客户端。一般而言,最常见的代理人,就是http协议。http协议我们可不陌生,我们每天都在发送http请求,当我们在浏览器里输入“www.taobao.com", "www.jd.com"时,我们实际上就是通过浏览器这个客户端来向服务端发起请求。而点击各种图片,购物车以及付款按钮的行为,最终也会被转化为http请求发送给服务端。比如我刚才点开了自己亚马逊上的一个包裹界面,最后显示在浏览器里的请求是

`[https://www.amazon.cn/gp/your-account/ship-track/ref=oh\_aui\_st\_v2\_btn?ie=UTF8&itemId=jllgprjporkvr&orderId=C01-4369566-0605601&packageIndex=0&shipmentId=DpWq55hLb]`

其中的`ie=UTF8&itemId=jllgprjporkvr&orderId=C01-4369566-0605601&packageIndex=0&shipmentId=DpWq55hLb` 部分是传给服务端的参数,里面有说明我的浏览器的渲染编码是什么(ie=UTF8),我正在浏览的物品的ID是什么(itemId=jllgprjporkv),我申请查看的订单的编号是什么(orderId=C01-4369566-0605601),我查看的是第几页的包裹信息(packageIndex=0),我的快递信息编号是什么(shipmentId=DpWq55hLb),这些带参数的请求被HTTP协议传送到服务端后,服务端就会根据这些请求去查找相应的信息发过来,如果服务器没找到相应信息或者机房出事情了,你就会得到一个诸如”对不起,你所请求的信息无法访问“的提示,而这个提示,其实是客户端在程序员的授意下,根据服务端发给它的信息,为了营造更好的人类体验而渲染加工过的,客户端收到的来自服务端的原始信息,大概是这个样子的:"HTTP request Status: 404". 你可以想象一个程序员在对你的微信客户端偷偷吹耳边风:“下次你再收到404的反馈,你就告诉外面那傻缺—---为了更好提升客户体验,服务器正在进行短暂维护,请稍后再试。”

如果你有关于本文、编程或日常软件使用的任何好奇或疑惑的话,欢迎在本文下留言,下次写编程漫话系列主题的文章时,我会尽力加以解答。

;- ) 好了,朋友们,欢乐的时光总是短暂的,咱们下次再会!

你可能感兴趣的:(漫谈编程)