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是鷹,不是綿羊或麻雀,酒吧的酒保不會因為你善良,就不會去坑你的。我的地盤,所以要聽我的。而且我還要抓緊時間趕路。
祝大家用軟件用的愉快,歡迎隨時給我反饋。大家共同改進。
恩,以上。
(濃濃而又腦殘的知乎風結尾)