这篇文章实际上已经是近一年前的事情了,不过近来有意整理下这几年的作品,也就拿来做一做。

例行废话##

IFTHEN是我们团队第二次参加Segmentfault Hackathon的作品,最后没有拿到任何奖项,但是过程之中有着比前一年更多的收获,也十分值得记录一下。

本次作品是Segmentfault Hackathon 2016 上海站的比赛成果。IFTHEN的设计思路,不得不说有来自IFTTT的影子。当然也有更多我们自己的想法,姑且从头谈起。

实际上,比赛之前的一个晚上,我们就已经在讨论做什么了,当时提出过很多脑洞大开的思路,比如信号感官化、数据呈现技术,还有考虑非编译性代码编码方案等等。这场讨论一直持续到第二天的比赛开始后数小时,我们依然没有确定好自己的课题。

不过,在这讨论之中,我们也确实有了不少深度的思考。刚开始,大家的思路基本上都是从各个方面随机发散的,而后,我们逐步开始聚焦到一些核心的词汇上。本次比赛的题目是“文艺复兴”,所以我们更加专注于考虑人文主义的倾向。所谓人文主义,也就是以人为本,倡导人的核心。所以我们的重点随后聚焦到人这样的课题上。

经过一番考虑,最后留下来的主要方向是两个,其一是做一个物联网服务设备的胶水连接服务,也就是我们最终做出来的IFTHEN项目,而另一个比较好的想法则是做情感追踪干预。鉴于最后没有选择,我也就不展开说了。

所以,IFTHEN项目就这么定下来了。

Describe##

IFTHEN到底是什么呢?我们一开始的想法,是想把网络上各种信息,加上各种服务,在中间做一个沟通的桥梁。假设我们定制一套固定的API架构,通过一定的简单逻辑,将网络上的服务全部转接到这样的API架构上来,那么就像一个通讯中心介质一样,可以构造出更多的连接功能。

对于用户而言,连接不同的功能本身可能就要求很高的编码逻辑水平。然而,我们把这个问题做了极度的简化,IF-THEN结构,这一最简单的逻辑,连接不同的API形式,构成了我们整个项目唯一的界面需求。非常的简单明了。

然而这样的简单背后的代价就是后端设计更为复杂。拿出我们当时的设计方案,我们把API分为了QUERY和ACTION两个不同的类别,各自又规定了返回值解析类型与参数解析类型,同时还包括了提供方,连接方式,URL通讯要求等等。这些服务信息发送到后端服务中心注册,随后便可以在前端显示出来。

而后,前端用React写了一个平台,图像化显示了各个IFTHEN逻辑块结构,用户只需要把自己需要的QUERY API拖动到IF逻辑区,把ACTION API拖动到THEN逻辑区,即可完成这样的一个语句的定制。前端将语句进行格式化后发至后端,后端存储信息。

之后是我们的执行部服务器,这是一个主调度模块,在这台服务器中,视刚才说的后端服务器为一种队列存储服务,而自身则是corn控制的周期服务,实时检测用户设定的QUERY要求,在满足条件下执行特定的ACTION。

最后,第四部分是一个用THREE.js写的模拟家用物联网设备展示。这是一个简单地三维页面,我们在里面构建了窗户,门,电视,台灯等各种设备。并且能够接受API控制,进行自己的操作。

假如说我们在前端指定,【天气检测.下雨】为真,那么执行【物联网.窗.关闭】操作,这样就实现了一个完整的自动化服务闭环。

技术关键词##

我们的构想非常的全面,直接导致了工作量的骤增。现场分工上,cc负责设计一系列模拟API,我用React做前端,并用Django写了一个后端服务,Scientist负责去做调度核心,剩下的同学全身心投入到模拟3d物联网展示页面的开发。

实现关键点上:

  • React各种前端设计
  • 多线程调度核心
  • WebGL使用

在这三个问题上,我们全部采用了新的技术:

  • Ant Design
  • Apscheduler
  • Three.js

平心而论,这三个技术选型从技术角度看是没有很大的缺陷的,AntDesign是一个很不错的前端框架,React也是比较火的技术,Apscheduler属于Python多线程调度的常用库,Three.js是WebGL的不二选择。

然而我们忽视了一点,这三个技术,我们都不熟。

在当时,我因为开发论坛系统,刚刚入门React,对于整个流水线过程还处在刚刚了解的阶段,ES6也不是很熟练。Scientist负责的Apscheduler,其实是我自己比较熟悉的一部分,但是Scientist来说就是全新的了。Three.js更是如此,我也是后半年进了实验室之后才开始尝试接触这个库。

这三个核心技术点的设计分配上的失误,对我们最大的影响就是——最后没有完工。

ok …… 既然没完工,那其他的也没什么好说的了。。。

尽管我依然觉得能做出来的话真是个不错的东西呢。。

RIP, IFTHEN.

Information##

最后我们留了一个半成品,不过已经能够打通整个流程的作品。
(一直没时间整理开源,所以还是Private状态,需加入我们的Organization才能看到。)