Hawk在发布之后,收到了不少朋友的感谢和使用反馈,沙漠君表示非常开心。软件肯定有很多的问题和不足,还有很多可扩展的空间,因此我希望更多的朋友,能够参与到改进Hawk的计划中来,为开源世界作出努力。

不少朋友询问一些术语的意思,在下面解释一下:

  • ETL:即数据清洗,包含抽取(E),转换(T)和加载(L)
  • 行,列: 在数据表格上的行列
  • 流,子流:一个流代表一组模块构成链条,子流也是流,只不过是被别的流调用的,可以将流理解为函数
  • 模块:构成流中的一个个的组件,分为生成,转换,过滤和执行
  • 合并多列:将多行数据合并到一行
  • 一般的转换器:将一列数据转换到另外一列或多列

在设计上,Hawk不打算提供完整的运行环境,例如定时运行,分布式部署等功能,它仅仅提供一个设计IDE,生成的xml文件交给其他解释器来执行。大家都会用eclipse开发网站,但没人会把它当容器直接部署。

下一步的计划:

  • 完善etlpy,其目前只支持Hawk的一部分子集,尚不能支持子流等功能(急需改进),而且还有一堆问题
  • 开发基于.NET.Core的跨平台解释器,核心代码可原封不动的移植
  • 添加其他数据库的连接器:目前只包含了MongoDB,建议增加MySQL和SQL Server的连接器。下面会简单介绍如何添加
  • 优化Excel导出器:目前使用NPOI的类库,性能较差
  • 软件国际化,将界面改为英文,提供其他语言的本地化支持
  • 进一步优化核心算法,改bug

那为什么没有开发呢?因为没那么多时间啊,急需开源社区的贡献啊...

贡献方法:修改和优化代码后,在GitHub上提交合并请求,我负责将其合并到主分支上。

2. Hawk代码结构

Hawk采用插件式结构,所有的组件都是可分离的。插件系统是沙漠君自行设计的,非常类似于MEF框架。

使用绑定技术,MVVM结构,界面和逻辑分离。
工程文件介绍如下:

  • Hawk.Core 底层基础类库
  • Hawk.ETL 数据清洗和爬虫插件库
  • Hawk.ETL.Controls 界面库
  • HawK.exe 可执行程序和插件容器

核心的需要修改的代码,都位于Hawk.ETL和Hawk.Core中。

实现新的连接器

以实现MySQL支持为例,在Hawk.Core.Connectors目录中,新建MySQLConnector.cs文件,创建对应的类,从DBConnectorBase继承。
在类上添加attribute,结构如下:
[XFrmWork("MySQLConnector")]
public class MySQLConnector
{
//implement interface IDataBaseConnector
}

实现新的ETL组件

如果你想开发新的组件,完全可以参考已有的代码。但一些特别简单的功能,不建议再开发新的插件,而是直接使用Python转换器即可。

3.一些设计上的考量

Hawk开发了四年,之前远远不是现在的样子。源头可参考博客园上关于ITTC数据挖掘工具的文章。
数据清洗和爬虫,本来是这个平台很小的一部分功能,后来被不断强化,而其他功能都被删减掉了。

我现在越来越认可“只做一件事,并将其做好”的理念,没有必要把数据分析挖掘功能添加到软件之中,因为已经有更好的工具完成这件事了。也没必要为其设计过多的策略,如增量,定时等等复杂的东西。

如果真要设计增量更新,完全可以通过读取数据库或网页上的某个字段作为生成器参数,之后按照一般流程进行即可。而定时抓取,这属于运行时的范畴,使用crontab等等即可,只可惜现在还没有一个稳定可靠的Python或C#命令行实现。

比如你真的要对两个主键进行唯一性去重,那完全可以把这两个主键组合起来,然后再使用唯一性去重。工具应当提供地足够原子化,这样才能更好的扩展组合。

Hawk其实定义了一种语言,你不能把它当成厨子,给它指令,它就能做出一道菜来。而应该当成一组顺手的餐具,而真正做菜的那个人还是你。自动化只是解决了部分问题,而巧妙设计的源泉还是来自于操作者本人。

Hawk最大的价值,是将复杂的逻辑链条化了,你可以将代码变得不那么耦合,从而方便地组合和开关某些功能。当然这些都拜于函数式编程的思想所赐。

说起继续维护它,那是肯定的。只是它的核心代码用C#实现,同时维护几种语言的版本是非常恼人的,而我以后的工作语言,可能再也不会是C#了。这一点异常蛋疼。

Hawk本身的界面设计,被很多人,也会被更多的人吐槽。因为我本人不是设计出身,我只能尽量去做出一个能用的东西出来,至于好不好用,那真是没法控制了,哎。

不得不说,开源才是最贵的。大家看到开源,欢欣雀跃,以为在路上捡到了钱,其实不是的,如果你真想用起来,一定会花更多的时间来学习它,因为开源者没有义务像商业软件那样,提供完整的支持。时间和钱总是矛盾的,既想省钱还想省时间,天下没有这样的好事。

如果说我后悔没做什么,是我没有把软件做成英文,曾经有一段时间我个人非常崇尚中文编程,从而酿成了现在软件国际化异常困难的后果;再者,没有直接开发Python或者js这种能跨平台语言的版本,因此只能局限于桌面应用,而不同的社群就风气又不一样了。

当然,市面上还有火车头和八爪鱼这样的采集工具,我自己从来不愿意把Hawk定义为爬虫,火车头之于Hawk,有点像vim和EMacs的关系。Hawk提供的是一组环境,语言和工具。而火车头则专门在爬虫领域完成了一个特定的子集。孰优孰劣,尚难定论。

关于文档的事情,不少朋友都要求提供完整的文档。我实在不喜欢写文档,因为代码就在那里,如果不愿意看代码,那文档自然也是不爱看的。我假定每个用我软件的人都能触类旁通,因此通过一些通用的介绍,他应该就能理解绝大多数的功能。我不把使用者当傻子。那如果真的不懂代码呢?那不好意思,请用八爪鱼,否则Hawk的很多设计,对他来说就变得没有意义。

有朋友说,为什么你要开源,对自己来说是不是有点像代码外泄?我笑了笑说,嗨,我根本不care。谷歌的TensorFlow都开源了。牛逼的人都去开源代码,因为它们知道前面的路还有很远,都要忙着赶路呢,那些傻逼们才抱着自己手里的泥饭碗生怕别人抢走呢。再说一遍,我不care

前一段文字是出发前在机场敲的,后来这些文字是在我刚从厦门旅行归来,跑到泉州的一家寺庙旁边的宾馆敲的,戾气有点重啊,会不会被未来的朋友看到,觉得我本人不够nice呢?有可能吧。Anyway, Hawk是鹰,不是绵羊或麻雀,酒吧的酒保不会因为你善良,就不会去坑你的。我的地盘,所以要听我的。而且我还要抓紧时间赶路。

祝大家用软件用的愉快,欢迎随时给我反馈。大家共同改进。

恩,以上。
(浓浓而又脑残的知乎风结尾)

# Hawk:开源贡献计划,设计,反思的更多相关文章

  1. Rafy 开源贡献中心 - 组织成立,并试运行一月小结

    背景 最近两年,工作中虽然大量使用了 Rafy 框架作为各个产品.项目的开发框架.我是 2015 年的年中加入现在这家公司的,由于我个人工作太忙的缘故,一直没怎么编码,Rafy 框架底层的核心成长也比 ...

  2. 如何成为一名合格的Apache项目Committer,参与Apache开源贡献的正确姿势

    近日,孙金城老师在 "Open Source Promotion Plan - Summer 2020" 开源软件供应链点亮计划做了<如何成为一名合格的Apache项目Com ...

  3. 【重新发布,代码开源】FPGA设计千兆以太网MAC(1)——通过MDIO接口配置与检测PHY芯片

    原创博客,转载请注明出处:[重新发布,代码开源]FPGA设计千兆以太网MAC(1)——通过MDIO接口配置与检测PHY芯片 - 没落骑士 - 博客园 https://www.cnblogs.com/m ...

  4. Erda 开源的迷失和反思

    前言 Erda 是我从2018年初加入上家公司直到今年初离开的四年时间里一直在做的一个云原生 PaaS 平台.在开源之前,Erda 在公司内部的名字代号是 D ,在21年初改名为现在的 Erda 进行 ...

  5. Ranger开源贡献统计

    统计一下自己在Ranger开源社区贡献的Issue数量, 开源社区的Issue主要分为New Feature,Bug,Improvement, 这三种都是和代码相关的,会直接修改开源项目的代码库, 还 ...

  6. 通向码农的道路(enet开源翻译计划 一)

    QQ 324186207群 enet交流技术.主要是为了研究tcp内部执行机制,欢迎大家增加探讨.小弟水平有限.翻译难免有误. . Features: ENet evolved specificall ...

  7. FreeLink开源呼叫中心设计思想

    上一篇大概说了国内外优秀的呼叫中心系统: 国内外优秀呼叫中心系统简单介绍 借鉴上述呼叫中心系统,我们的设计新一代呼叫中心例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY ...

  8. 通向码农的道路(enet开源翻译计划 二)

    QQ 324186207群 enet交流技术,主要是为了研究tcp内部执行机制.欢迎大家增加探讨.小弟水平有限,翻译难免有误. . http://enet.bespin.org 解析enet 双向链表 ...

  9. 基于WeChat的消息存储备份、远程控制、小功能项目开源分享计划

    WeChat+ 关于该项目 起源 该项目的起因是一个比较程(老)序(油)猿(条)的理由,有一天我发现我下班时间比较早,有点尴尬,但是又不想没事干还坐在公司,那么如何解决我的问题呢,初步想法是远程控制电 ...

随机推荐

  1. React-Native需要css和布局-20160902

    import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View, } from 'reac ...

  2. 转载:Hadoop排序工具用法小结

    本文转载自Silhouette的文章,原文地址:http://www.dreamingfish123.info/?p=1102 Hadoop排序工具用法小结 发表于 2014 年 8 月 25 日 由 ...

  3. Flask 重新认识

    总是觉的学习东西有点猴子掰玉米的感觉.今天就重新再掰一次吧. Installation: 安装之前建议先安装virtualenv,这个东东是帮助你在多个python版本之间保持同步,不至于python ...

  4. 喜马拉雅FM抓包之旅

    一.概述 最近学院组织安排大面积实习工作,今天刚刚发布了喜马拉雅FM实习生招聘的面试通知.通知要求:公司采用开放式题目的方式进行筛选,申请的同学须完成如下题目 写程序输出喜马拉雅FM上与"卓 ...

  5. 利用闭包实现多次ajax请求只执行最后一次

    点一个按钮,则向服务器请求资源,不作处理时,多次点击后会有很多个请求在等待.我们知道一般我们用ajax是异步请求,那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能 ...

  6. Xamarin的不归路-生成安卓错误3

    错误提示: 解决方案:升级jdk到8即可. 2016年9月1日14:50

  7. Daily Scrum02 12.14

    大家已经被各种作业折磨得体无完肤了,但是大家还挤出时间完成每天的软件工作啊…… 坚持就是胜利! Member 任务进度 下一步工作 吴文会 调试QuerySetting类函数 调试QuerySetti ...

  8. mui框架中底部导航的跳转1

    mui框架极大的方便了app的开发但是我们在做页面之间的切换时发现不能实现 a 链接的跳转,这是应为mui相关的一些控件是通过拦截a标签上的href来实现的,所以mui.js会阻止a标签上的href跳 ...

  9. 工作总结_sql

    今天客户叫导入数据,因为存在特殊字符,快把我给玩死了,,所以请教...总结 sql 数据导入excel  存在特殊字符引起的数据缺失 利用字符方式    :   select  a.OpenID+', ...

  10. Permission denied user=hadoop access=WRITE inode=root rootsupergroup rwxr

    有段时间没有写了,反正我写的都是跟流水账一样.不为别人看,当然,其中也记录了很多我踩过的坑,可能也能给别人提个醒.最重要的是:这是我学习的记忆 上面的错误是由于我将reducer的输出目录设置在hdf ...