2018 年 1 月 24 日
您使用 Clojure 或 ClojureScript 多久了?
Swing 教育 自 2015 年初成立以来一直在使用 Clojure 和 Clojurescript。我个人从 2013 年年底开始使用 Clojure。
您有多少人使用 Clojure 或 ClojureScript?
我们目前的工程团队目前由三名全职工程师组成。我们的代码库基本上是 100% 的 Clojure。我们正在积极招聘 2018 年第一季度的人才,并希望将团队扩大到五名工程师和一名设计师/UI-UX 专家,但他们仍有可能最终会使用 Clojure。
您使用 Clojure 或 ClojureScript 开发什么产品或服务?
我们的主要产品是一个在线市场,供学校发布代课教师请求。我们帮助学校获取更多代课教师,并尝试通过软件自动完成与管理代课教师库相关的繁琐工作(招聘、筛选、工资单等)。我们的网络为代课教师提供了更多工作机会,让他们积累经验并建立专业人脉。
您最喜欢使用哪个 Clojure 或 ClojureScript 库?
严格来说可能不是库,但无论如何,Datomic 使用起来非常令人愉快。以下是几个亮点
能够将数据库视为一个值,使我们的大多数代码都变得非常确定性,并消除了许多由于“哦,这个值在执行期间发生了变化”而导致的潜在错误类别,因为数据库值是一致的。
d/transact 在事务完成后返回生成的数据库值,消除了传统上在使用读副本进行写入后进行读取时出现的错误。
tx-data 以简单的向量和映射的形式表示,允许我们优雅地组合事务,并使我们更容易以编程方式生成创建或修改多个实体的代码。
事务监听器队列是一种优雅的方式,用于监听需要触发通知的数据更改,而无需与执行事务的位置紧密耦合。如果我们的通知流程需要关闭或重启,我们可以使用 d/tx-log 从我们最后一次已知通知点开始再次(延迟地)遍历日志。
d/as-of 和 d/since 用于帮助时间旅行,以了解用户在特定时间看到了什么,或者系统在执行时看到了什么。在与将数据库作为参数的代码结合使用时,在生产环境中使用这两种方法可以确认错误和正确行为。
事务元数据允许我们轻松记录谁在何时何地以何种方式做了什么,以及为什么,然后查询元数据并使用相应的 tx-log 实体作为 d/as-of 和 d/since 的参数来了解系统中发生了什么。
通过 d/with 和内存数据库进行的推测性事务极大地简化了测试和开发人员设置,使我们无需管理或设置外部进程。
通过 d/filter 进行的数据库过滤提供了一种优雅的方式来重复使用查询。例如,我们有一些查询用于报告系统上的总活动,然后重复使用完全相同的查询,但应用数据库过滤器,以按地理区域细分或按时间范围(过去 7 天、过去一个月等)内创建的请求进行细分。
请注意,这在效率上不如在单个遍历期间编写单独的函数来执行按区域级别的聚合,但对于我们来说,总数据集仍然相当小,因此 CPU 处理时间无关紧要。对我们来说,更重要的是能够灵活地从查询中过滤掉数据,而且无法超越实现的便利性……
通过 d/datoms 和 d/index-range 进行的延迟迭代,基于数据库值!我们的大多数数据处理一次只操作一小部分数据,或者只需要最少的聚合状态。
使用传统的基于 SQL 的系统来实现这一点很困难,因为虽然您可以编写 Clojure 函数来生成 LIMIT/OFFSET 调用的延迟序列,但您对世界的视图并不一致。
使用 Clojure 或 ClojureScript 的哪些方面为您提供了最大的价值?
对我们来说,最有价值的属性是只有一种编程语言在所有地方使用,并允许我们在数据库(通过加载到事务处理程序类路径上的 jar 或通过事务函数)、Web 服务器和客户端之间共享代码。
您最喜欢的 Clojure 或 ClojureScript 功能是什么?
可能是宿主互操作性。如果需要,通过互操作性利用两个生态系统中现有库的能力,使 Clojure/Script 能够利用这些庞大的生态系统,同时在此基础上提供额外的价值。
使用 Clojure 或 ClojureScript 对您的业务有何价值?
Clojure 允许我们通过 REPL 驱动的开发更快地开发代码。生成的代码通常不易出错,因为所有内容都是不可变的,并且函数是可重入的,这也使测试变得更加容易。宏提供的减少样板代码的功能以及对数据的强调,允许更好地重复使用,并导致代码重复减少和更高阶编程。
由于核心语言和更广泛的 Clojure 开源社区对简洁性和稳定性的强调,我们的代码相当容易维护。
您的技术栈是什么?
在客户端,我们使用 DataScript 和 Reagent 用于 Web 客户端,并且还拥有一个使用 ClojureScript 在 React Native 之上实现的移动应用程序,用于 iOS。
如果您想分享您的 Clojure 故事,请填写此表格。