引
最近玩了一个游戏,叫做另一个伊甸:超越时空的猫,一个 RPG 游戏,之所以想说一下这个游戏,并不是说它的剧情多好、画面多精美之类的,想说的是这个游戏机制中非常恶心的一点:
很多任务的完成条件,都需要依赖于大量的“刷怪”,比如任务完成需要获取 “XX晶体” 30 万个,而 “XX晶体” 的来源只能是在特定地图打怪,而打怪一次一般只能拿到 100 “XX晶体”,那么如果想要完成这个任务,就必须打怪 3000 次,就算是一次打怪半分钟,也要不停地刷个 25 个小时。
不过其实我基本理解为什么这个游戏会这样设置,主要是希望能拉长游戏的时间吧,因为这个游戏剧情的量比较有限,如果不穿插这种比较耗时的任务节点,那整体的游戏时间将会大大降低,对于游戏方而言,相比于丰富游戏的剧情,直接粗暴的通过提高“肝”度来提高游戏时间,还是比较合理的。
但是这个机制确实让我有点不爽,对于我这种想要快速推进剧情的人来说,刚看了一个小时的剧情,就得刷上好几天的怪才能继续走剧情,直接就想退坑了。无聊之余,遂去 taptap 上的论坛看看攻略,就发现了一个比较有趣的东西:这个游戏是可以自动挂机的。
所谓自动挂机,就是通过一些自动点击的工具,比如 Android 上的自动精灵,通过一个模版,让一些比较简单的任务,比如自动刷怪,自动运行,再搭配以云手机、虚拟机等,便可以达到让游戏自动刷材料、刷经验的效果,对于这种需要频繁刷怪的游戏,确实十分好用。
比如这里,我就是使用红手指云手机+自动精灵实现了远程自动刷怪,只需要支付一下云手机的费用。
说起云手机,我也花了不少的时间寻找一个合适的云手机,现在市面上云手机是挺多的,价格也还公道,基本都是几十块钱一个月,但是不同平台还是不一样的,比如我这次就试了这么几家:
- 雷电云手机 - 功能比较少,进不去系统设置页面,部分功能实现不了
- 多多云手机 - 功能还行,但是机器性能较差,最重要的是没有客服,用了两天是在太卡了,就放弃了,可惜了几十块的月卡
- 红手指云手机 - 最终的选择,机器性能也比较差,但好像比多多好点,而且客服反馈迅速
感觉最近很多公司都开始做云手机、云游戏之类的产品,像网易云游戏、腾讯 start,随着网络环境的越来越完善,5G 的推广甚至之后的 6G,云确实是一个比较有前景的方向:之前为了即时性而不得不把计算工作放到每一个终端,而之后随着网速的提升,是可以真的做到所有计算都放在云端的。
题
话说回来,进入今天的主题,关于“自动化”,来自维基百科:
自动化是相对人工概念而言的。指的是在没人参与的情况下,利用控制装置使被控对象或过程自动地按预定规律运行。自动控制技术的研究有利于将人类从复杂、危险、繁琐的劳动环境中解放出来并大大提高控制效率。自动化的最大好处是可以节省劳动力,同时,它也可用于节约能源和材料,并改善质量,准确度和精度。
这是一个比较“狭义”的概念,在这个基础上,我再谈一下个人的理解。
在工业上,自动化就是利用机械完成原本需要人力才能做的事情,这个应该是比较常用的关于“自动化”的理解,就如上面所说,通过自动化的机械完成一些比较复杂、繁琐或者危险的劳动工作,就是自动化最主要的目的,所以在一个更广泛的概念上,只要是能够将人,从一个比较复杂、繁琐的工作中解放出来的,使用机械、模版等自动完成这项工作的能力,都可以称作是“自动化”。
开篇花了很多篇幅讲「另一个伊甸」这个游戏,讲它的游戏机制,讲我用来对应这种游戏机制的方法(自动刷怪),其实就可以看作是一个自动化的例子,而我之所以想说一下自动化,也是因为我受到自动刷怪这个事的启发。
那么再发散一下,在日常工作中就有很多利用自动化解决一些问题的例子,比如“自动化测试”。作为互联网公司,软件测试在产品发布流程中处于一个非常重要的位置,可以说,测试的质量直接关系到产品发布的质量,而软件的测试,依赖大量的人力投入,这也就是为什么每个公司都会有很多的软件测试岗位。我平时也会跟测试人员对接,我知道他们每天几乎都在使用软件,通过人工执行测试用例来发现可能存在的问题,而这部分工作量,就是重复地、机械地一遍遍执行测试用例,这就是一个很好的可以“自动化”的场景,而且也确实有很多自动化的实践,我们会引入一些专门的测试开发人力,用于实现一些简单工作的自动化测试,尽可能地将人工操作的用例数量降低,通过引入自动化,也确确实实地提高了人力的使用效率。
在程序开发语言的设计上,也到处透露着“自动化”的气息。比如 C++ 的模版,当我们需要实现一系列功能类似,但参数类型不一样的函数时,比如“加法函数”,我们不需要为 int、double、float 各实现一个函数,只需要写上一个模版,然后去调用它就可以了,具体的函数的生成,则是编译器“自动化”地帮我们完成的。再比如,所有 C/C++ 的开发者都会诟病的事情,就是它的内存管理十分复杂,所有的堆内存的分配、释放都得人手动处理,十分复杂。而相比之下,栈内存的使用则显得更自动化一点,我们只负责分配,不需要关心释放;更加自动化的比如 C++ 11 之后的智能指针,说白了,就是让堆内存也能利用栈内存自动释放的机制,引入引用计数,完成堆内存的自动释放;而更加自动的,就是像 Java 这种自带垃圾回收机制的语言,通过一系列复杂的引用计数、可达性分析等手段,完成了所有内存的自动化释放,从某种意义上真正将程序员从内存分配、释放的复杂逻辑中解放出来,大大提高了书写功能代码的效率。
但是自动化也并不是完全没有坏处的,它虽在在某种程度上提高了处理事情的效率,但是换个角度,可能会有不一样的思考。
在软件开发的自动化测试中,虽然引入自动化测试能解放人力,但是也会在其他方面增加一些成本,比如要实现一个测试的自动化,需要前期人力投入来调研实现方案,需要着手开发自动化测试所需的一些列功能,比如对已有软件进行改造,比如长期的人力维护。最关键的是,“自动化”并不是“智能化”,想要让一个自动化的程序来实现一个人能做的事,在很多场景下是非常复杂的,我们要引入很多的能力来支持自动化,比如引入计算机视觉来帮助自动程序理解图像内容,比如引入大量的计算机来帮助程序完成大量的计算工作;于是大量的人力投入,大量的资源消耗,为了支持某个“自动化”的功能。
在内存管理的自动化中,虽然栈可以自动完成内存释放,但是栈上分配的内存无法长久保留,也对栈的结构有很高的要求;智能指针、垃圾回收虽然能够帮助内存管理,但是也提高了内存释放的复杂度,系统需要提供很多额外的计算,因为不够智能化,我们使用时也需要额外关注内存泄漏、循环引用等问题。
结
以上都是来源于最近搞游戏上的自动刷怪引发的一点思考,总结一下自己的理解,“自动化”,是广大劳动人民为了解决一些繁琐、复杂、危险的事,所提出的一些方案,当一个方案提出来,一定是为了解决某个问题的,当然也有可能带来更多的问题,而下一步就是提出一些新的方案,解决这些新产生的问题,随着一个一个问题的解决,社会就得到了发展,人类得到了进步。