看到危地马拉在丛林高处建的树屋,我对“爬上床”这个短语有了新的认识,目睹了玻利维亚完全拿盐块建造的旅店,耳闻了阿根廷畜牧场的奶牛哞哞叫到深夜,在我背包到国外旅行的过程中,我发现了一条住宿的真理 :越偏僻的地方,可能越需要注意与外界的通信交流。
旅途中没有信号也是可能会发生的事情,但与其说是苦行者的选择,不如说是被 迫的,因为现在的网络连最偏远的住所和场所都覆盖了。背包旅行的互动性越来越强,因此,从某种意义上来讲,在国外比在家里更容易与他人互动。背包客看起来好像必 须要保持Skype、Facebook、Twitter、Instagram、Snapchat及邮箱的在线状态,随时上传照片和视频,以向他人证明你过得非常愉快。
但是有些通信交流并不仅仅意味着游客在社交媒体上获得愉悦感。
我在危地马拉碰到了几个欧洲人。之后,我们发现自己在相同的时间内分别会在其他 3个不同的国家,相互通过信息联系,最后在秘鲁会面。
查看电子邮件后,我发现通往哥伦比亚背包客栈的山路被冲垮了,所以我重新预订了其他地方的酒店,避免了自己在泥水中跋涉。
查看了 Facebook 之后,我知道一个朋友刚刚生了孩子,因此,我在厄瓜多尔给她买了一件手工毛毯。
我在秘鲁的阿雷基帕遇上了大雾,错过了去往复活节岛的航班,因此,我到酒店取消了预订的房间,决定继续去智利旅行。而且,当在布宜诺斯艾利斯查看了银行账户之后,我决定放弃继续冒险,选择如期回家。
■■■
在背包旅行中,如果未能与他人进行通信交流,我可能会错失许多机会,遇到很多危险,总之,我可能会被现实世界遗忘。如果没有通信交流,我的旅行可能不会这样圆满,在某些情况下,通信交流使旅行的价值得到了最大体现。
通信交流使我们能够发送一封电子邮件即可预订哥伦比亚的背包客栈,20 分钟就能在网上订一张机票。软件通常将参数传送给 SAS宏和程序以提升功能性,如果没有这些行动命令——机票或参数,我们就不会开启冒险之旅。
另外,通信交流都是双向的,通常能提供一个确认功能。预订成功的电子邮件会让我知道自己已经成功地完成预订,可以放心地做其他事情了。软件中的返回码能证明程序的顺利进行,让父进程知道子进程顺利启动并成功完成任务。
在其他情况下,通信交流带来的可能是“不幸的”消息——某条路被冲垮了,或者连续几天会有大雾,但这些“不幸的”消息是非常有价值的。在生活及软件中,借助前摄的交流模式,我们可以规避、降低或消除一些风险。当故障或能够导致故障发生的一些情况被检测并发送出去之后,软件有时依然能借助动态异常处理例程实现全部的商业价值。
但如果故障是突然发生的、毫无征兆的,例如,你无比伤心地发现自己一个周末都不能玩 Rapa Nui,那么交流会帮助你找到其他的替代品。我错过了现场观看摩艾石像的机会,但偶然在智利的瓦尔帕莱索考古学博物馆中看到了一个。另外,软件中的通信交流能指示何时终止某个程序或操作,以避免资源浪费。
每一个背包客都不是孤立的,因为会有更多的人源源不断地加入背包旅行中,他们相互交流信息,几周或几个月后再次相聚,相互分享所见所感之后继续上路。同样的,平行处理包括独立的处理过程,这些独立的处理过程在达成共同目标时可能会采用分散或协调的路径,因此,各个处理过程之间的交流是非常有必要的,它能安排进度,协调结构,排解问题以保证进程有序进行。
尽管以上案例主要介绍内部交流,但外部交流同样也是非常重要的。银行业务活动、求职活动及购买毛毯活动等让我从自我陶醉的状态回到现实世界中,而且这些活动确保我没有返回到杂乱的生活中。软件并不只是内部的交流——它也需要外部交流,需要将程序的效果、故障及性能指标告知利益相关者。
返回码
返回码是软件记录和传输性能指标的首选方法。BaseSAS语言能生成反映常态或非常态(或异常)功能的返回码,若SAS代码语法结构正确,但在运行过程中遇到异常情况,通常,日志中就会记录一条提示、警告或“运行时错误”,一个或多个自动返回码就会自动更新。例如,如果 LIBANME 语句提示一个无效的逻辑位置,那么日志中会生成一条提示,SAS自动宏变量 &SYSLIBRC 就会设置为一个负值。
当SAS代码遇到语法错误时,日志会显示“运行时错误”,同时一个或多个返回码更新。如果 LIBNAME陈述中包含一个语法错误,如遗漏了定义Library的引号,那么日志中就会记录一个“运行时错误”,&SYSLIBRC值会设置为正值。在生产型软件中,上述语法错误在开发和测试阶段就应该纠正,从而避免在软件操作过程中再遇到此类错误。因此,在生产型软件中,返回码主要用于检测环境及其他可能会发生的异常情况,以及验证软件的性能及完成情况。例如,异常情况的处理和传递能有效提升自动防故障装置路径的性能(第 11章会讲到)。
就像 SAS自动宏变量作为 SAS程序、函数、计算机程序指令及 DATA步骤的返回码一样,用户生成的返回码所起到的作用是沟通交流、验证SAS宏。通过在宏中创建一个通用的宏变量,与该宏性能相关的信息会传送回调用该宏的父进程中。验证 某个宏或其他 SAS 程序准确完成能够表明该程序的顺利进行,之后程序可以相继启动。当返回码用于异常情况处理框架时,它便能够促进动态的、数据驱动型的程序, 在运行过程中灵活应对运行环境。