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. label 多行显示自适应高度

    //项目中显示 地址:XXXXXXX换行  UILabel *numLable = [[UILabel alloc] initWithFrame:CGRectMake(80, 50, 40, 20)] ...

  2. ASP.NET Razor - html中使用if else

    参考: http://www.runoob.com/aspnet/razor-cs-loops.html <select id="task_isfirst" class=&q ...

  3. / fluxChatDemo / 系列 ——fluxDemoChat 组件编写

    还是用各部分来表示过程吧,没文采,就先这样记着吧 嘻嘻 梳理问题: 编写es6风格的组件时,需要引入import React from ‘react’ 然后页面就华丽丽的展示出了我写的1.2两个字 在 ...

  4. Python 爬虫4——使用正则表达式筛选内容

    之前说过,使用urllib和urllib2,只是为了获取指定URL的html内容,而对内容进行解析和筛选,则需要借助python中的正则表达式来完成. 一.预备知识: 1.正则表达式简述: 什么是正则 ...

  5. 关于 Raphael

    Raphael Javascript 是一个 Javascript的矢量库. 2010年6月15日,著名的JavaScript库ExtJS与触摸屏代码库项目jQTouch,以及SVG.VML处理库Ra ...

  6. iOS Block理解

    以前看到Block觉得也没什么,不就是类似函数的东西,这东西在C#里就是委托,在Java里就是块,有什么稀奇的.但看到一点进阶的内容后,发现这个东西确实有用. 所以做下总结. 一.块的基本用法 块的语 ...

  7. linux下ftp配置文件详解

    # 匿名用户配置 anonymous_enable=YES # 是否允许匿名ftp,如否则选择NO anon_upload_enable=YES # 匿名用户是否能上传 anon_mkdir_writ ...

  8. PHP常用算法

    //二维数组的按某字段来排序(从小到大排序) function number_array_sort_asc($array,$key_name){ $arr = array(); foreach ($a ...

  9. tar 命令

    tar -cf   打包的文件名    打包的文件   ------tar  -cf   db.all   test.txt   (-c  表示建立新的包,-f通常是必选项) tar -tf   打包 ...

  10. Git生成ssh ksy后进行项目管理

    1.首先你要有一个git账号,然后在网站上Create a New Repository,填好名称后就建立了一个仓库,之后即会出现一些仓库的配置信息... 2.然后你要下载一个git客户端,也可以是m ...