精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Rec:一個項目的誕生

開發 開發工具
Rec是一個用來驗證和轉換數據文件的Java應用。從第一行代碼到v1版本成形,僅僅經歷了一個半月的時間,作為一個開源項目,在很多方面都有著各種各樣的糾結。

Rec是一個用來驗證和轉換數據文件的Java應用。從第一行代碼到v1版本成形,僅僅經歷了一個半月的時間,作為一個開源項目,在很多方面都有著各種各樣的糾結。

[[194531]]

需求

Rec的需求源自于我們團隊所做項目的特殊性:遺留系統遷移。在工作中,我們需要跟各種團隊打交道,每天處理各種來自ETL(Extract、Transform、Load)過程中的數據和程序問題,而整個ETL程序運行起來過于笨重,并且還要考慮準備后端數據和各種驗證問題,非常不方便。

其實在此之前,只要有一些簡單的程序跑起來、能夠進行一些簡單的檢查,比如唯一性(uniqueness)、關聯關系等等,就可以在很大程度上減少我們在ETL過程中花費的時間。并且,這半年多來的實踐也證實了這一點。

最初,同事的建議是寫一個腳本文件來解決這個問題,這對于程序員來說當然不是什么大問題。但隨著使用次數的增加,我漸漸發現一套Python腳本并不能勝任:一方面,面對復雜的業務場景,很難有一套靈活的模式去匹配所有的數據格式;另一方面,隨著數據量的增長,性能也成了一個大問題。

于是我開始著手設計和實現Rec。

[[194532]]

設計

Rec第一個可用版本的設計共花了七天的時間,基本上具備了我期望的各種能力:

  • 可以自定義數據格式
  • 能夠進行簡單的唯一性和關聯關系驗證
  • 支持一些擴展的查詢語法:比如,可以驗證多字段組合的唯一性
  • 性能上基本能夠勝任

Rec面向的數據文件格式是類CSV的文件,包括其他的一些使用分號(;)或者豎線(|)來做分隔符的文件。出于習慣,文件的Parser并沒有選取現成的庫,而是我自己按照Wikipedia和RFC4180的規范寫出來的,基本上能夠解析所有類似的文件。而且還有一個意外的發現:用空格做分隔符的文件(比如,某些日志)也是可以支持的。

對于每一條數據,Rec提供了兩部分組件,一部分是數據本身,另一部分是該數據的訪問器(accessor)。訪問器提供把字段名轉換成對應數據項下標的功能:跟Spring Batch中的FieldSetMapper很像,當然在其之上還多了一層語法糖。

一個典型的accessor format如下:

  1. first name, last name, {5}, phone, …, job title,{3} 

其中,“…”表示中間的字段全部可以忽略,{3}和{5}是占位符,表示在這些字段之間有如此多個字段也是可以忽略的。而由“…”分割成的兩部分也是有差異的:在其后的字段使用的是類似Python的負數下標;換句話說,我并不需要知道本來的數據有多少個字段,只需要知道我要獲取的倒數第幾個是什么就可以了。

[[194533]]

Rec的驗證規則也是從簡設計。由于最初的需求只有唯一性檢查和關聯關系檢查,所以第一個版本里面就只加入了這兩個功能,語法如下:

  1. unique: Customer[id] 
  2. unique: Order[cust_id, prod_id] 
  3. exist: Order.prod_id, Product.id 

每一行表示一個規則,冒號前面是規則的名字,后面是規則所需要驗證的數據查詢表達式。對于查詢表達式,這里需要提一點,本來是設計了更多的功能,比如過濾和組合等等,在后面擴展的時候發現在語法上很難實現得更直觀而且方便使用,于是就決定改用嵌入腳本引擎的方式來解決。

另外Rec第一個版本發布只有Kotlin運行時的依賴,所以完整的Jar文件只有2MB。同時,只要給對應的數據文件提供.rec格式的描述文件,再在同一目錄創建一個default.rule來加入各種檢驗規則,就可以運行、然后得到你想要的結果了。

擴展

Rec的第一個版本在某些方面是達到預期結果了的。但在那之后就發現了一些很重要的問題:首先,我們另一層的需求并沒有得到滿足:Rec能夠幫我們驗證并且找到有問題的數據,但是不能夠按需來選擇我們想要的內容;其次,在檢查數據的同時,我們也隱含地有集成和轉換數據的需求,Rec也不能夠滿足。

于是第一個星期以后我開始考慮對Rec進行擴展。首先是在同事的建議下把亂成一坨的代碼分成多個module;其次考慮加入前面提到的過濾和格式轉換的功能。

[[194534]]

第一個步驟勉強算是完成了,但是卡在了第二步上:對于轉換的規則,要不要和驗證的規則放在一起?如何對這兩種規則做區分?如何在過濾器中設計變量引用等細節?每一個問題都讓我糾結了很多,直到最后決定放棄這一步,直接通過引入腳本引擎來實現:從最初hack Kotlin編譯器的嵌入版,到決定用JavaScript,到放棄Nashorn轉而用Rhino,中間雖然輾轉幾次又遭遇了不少坑,但畢竟有成熟的社區經驗輔以指導,還是順利地走了下來。

Test Driven Development vs Test Driven Design

其實直到現在Rec的測試也只有少量的一些。而且在拆分模塊的時候,因為測試代碼之間的依賴比較多,并沒有做拆分,所以基本上還是集中在一個模塊中。當然這也是很多時候我自己做項目時的一個習慣:并不會完全以TDD的方式來開發,而是把單元測試作為一個驗證設計思路的手段。因為很多時候思路轉變的太突然,不實現的話估計下一秒鐘就完全變了。而且,作為一個簡單的工具類程序,并不需要重度面向對象的設計,如何規劃和設計流暢易用的接口就成了必須考慮的一個問題。這個時候測試的設計性變得更明顯。

另外,對于Parser這種東西,測試是必不可少的,但是要TDD一個Parser出來,基本上就是在給自己找活干了。所以這種時候,我會先加一些基本的case,來確保能夠正常的實現功能,然后再引入一些比較corner的case來確保實際的可用性。對我來說,這是完全沒有問題的:當然后面的實踐驗證了這一點,Rec沒在解析文件方面出現過任何問題。

[[194535]]

Kotlin vs Java(Script)

最初采用Kotlin就是因為它有很多優點,而且這些優點也確實影響了Rec的設計,但是因為各種原因,還是被替換了兩次。首先遲遲不發布的1.1版本和編碼兼容性的諸多問題,導致我決定用原生Java換掉Kotlin。當然,這也導致了不得不強行舍棄很多好用的編譯期檢查和語法糖,以及一個用來做bean mapping的組件。

至于采用JavaScript,則是另外一個問題。

眾所周知,JSR223定義了一套JVM平臺的腳本引擎規范,但是作為一個強靜態類型的編譯型語言,Kotlin想要契合這套規范還是很困難的,于是無論是官方的實現還是Rec的解決方法,都不是很好:

首先你要啟動一個JVM來執行這個腳本的動作;在這個動作里面,啟動第二個JVM要調用Kotlin的編譯器來將該腳本編譯成class;然后這個編譯器會再去利用自定義的classloader來加載和執行這個class文件。當所有的功能都集中在一個Jar文件里面的時候,每次都要選擇指定classpath等選項,實現非常復雜。而且,由于第二次執行的Kotlin編譯器是識別不到你已引入的kotlin-reflect類庫的(因為已經統一包裝到rec的jar包里面去了),就會導致腳本中bean mapper的一些功能根本不能使用。萬般無奈,選擇采用更成熟的JS引擎。

當然選擇JS帶來的一個好處就是,有更多人可以拿來就用了,而且,最新的Rhino提供了CommonJS擴展,能夠順手require所需的JS文件,在復用和模塊化方面也能夠有不少提升。

技術抉擇

除了部分Parser相關的代碼外,Rec采用的基本都是不可變的數據結構:一方面是因為使用Kotlin;另一方面,在整個模型里面并沒有特別的需求會涉及更改數據。

唯一的擔心是內存占用,但是后來發現這部分擔心也是不必要的,因為所有內存的瓶頸只在數據文件的Parser上,項目中的數據條目動輒數十個數據項,幾十萬條數據,再加上每次parse都會把一個字符串分割成多個,最后再合并到一個大的集合里面,在最開始設計的時候沒有考慮這一點,輕輕松松就爆了JVM堆。這也是后期需要著重優化的一個方面。

[[194536]]

另外一個點是關于異常處理。對于Java應用來說這是個巨坑:異常本身并沒有問題,但是由于checked和unchecked的區分以及眾多設計哲學的不同,所以就成了爭議點所在。在這里我參考了Joe Duffy的做法。對于嚴重的不可重試的錯誤,比如文件找不到,空指針異常,下標錯誤等,直接讓程序die(沒錯,就是PHP中的那個die),至于數據格式錯誤等問題,更多的做法是做一條記錄然后選擇繼續。當然這一套東西并不依賴Java的異常系統,只是作為一個設計原則來應用,畢竟這不是一個App server,并不需要高可用的保障,相反這種fail fast的直接反饋更有助于發現和解決問題。

在類型系統上,最初實現Rec的語言是Kotlin,它提供了一套比Java略微高級一些的類型系統。當然主要的點還是在于nullable:在功能上,nullable與Java 8的Optional類似,用來容納可以為空的值,同時能夠有效避免空指針異常;在實現上,比Java略微高出了一點的是,非nullable的對象必須被初始化并且不容許為null。這直接解決了Optional對象為空的尷尬問題。

當然,由于運行時的依賴還是無法避免地使用JVM,而且沒有自定義值類型的支持,在使用Kotlin,特別是跟Java標準庫和其他框架結合使用的時候,還是會遇到空指針的坑。但是在這一點上,Kotlin給我們開了個好頭,比如在后面convert到Java的過程中,我也盡量保證各種對象都是final并且被非空初始化了的。

結語

當然也許很多人會說,Unix那套工具用的很順手的話,上面說的這些都不是問題,其實Rec本來的思路也是來自于它們:accessor來自于awk的列操作模式,scripting中的過濾器來自于sed和grep,鏈式調用源于管道。Rec也只是在這些思路之上加了一些方便的操作而已。但是對于我個人來說,這種折騰其實是在檢驗我自己的理論和思考,更別說還提升了項目的生產力。也許哪一天實在受不了了,還可以拿C++和Lua重寫了呢。畢竟,生命不息,折騰不止。

【本文是51CTO專欄作者“ThoughtWorks”的原創稿件,微信公眾號:思特沃克,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2013-07-24 15:26:57

MOCO

2011-08-25 09:03:40

2012-11-29 09:49:17

軟件項目項目

2014-08-11 16:32:04

架構項目

2014-08-27 10:20:10

項目項目分析

2018-09-13 14:18:20

C語言Java程序員

2017-11-07 11:36:57

開源項目代碼

2021-02-24 13:58:07

區塊鏈比特幣安全

2022-02-28 08:23:02

開源項目重構

2020-08-13 17:59:20

區塊鏈區塊鏈項目數字貨幣

2019-08-06 13:37:55

微服務架構數據

2020-11-15 23:23:21

JavaScriptAPI開發

2019-01-15 10:02:06

Kubernetes開源工具微服務

2009-04-20 23:29:12

Oracle收購Sun甲骨文

2012-06-27 10:16:12

開源項目CodePlex

2013-07-30 14:06:30

Google中國殺手

2019-04-15 11:00:46

框架Node.JS開發

2019-11-26 16:06:59

區塊鏈去中心化

2019-05-27 08:29:32

啟動項目PMP
點贊
收藏

51CTO技術棧公眾號

一区二区在线免费观看| 国产在线一卡二卡| 日批视频免费在线观看| 精品国产亚洲一区二区三区| 裸体素人女欧美日韩| 91精品国产色综合久久| 欧美日韩亚洲免费| 精品国产乱码一区二区| 日本免费一区二区视频| 国产精品午夜久久| 国产v综合v亚洲欧美久久| 超碰在线免费av| 自拍视频在线| 你微笑时很美电视剧整集高清不卡| ...中文天堂在线一区| 国产精品白嫩初高中害羞小美女 | 国产美女喷水视频| 免费污视频在线| 国产乱子轮精品视频| www国产精品视频| 亚洲天堂2018av| 成年人免费在线视频| 久久亚洲影院| 一区三区二区视频| 鲁一鲁一鲁一鲁一av| 丁香花在线影院| 成人黄色小视频在线观看| 精品自在线视频| 台湾佬美性中文| 成人超碰在线| 最新国产精品久久精品| 奇米影视首页 狠狠色丁香婷婷久久综合| 日本在线视频免费| 亚洲第一福利社区| 91国在线观看| 一区二区三区四区欧美日韩| 国产又粗又猛又黄又爽无遮挡| 91亚洲国产成人久久精品| 欧美日韩免费不卡视频一区二区三区| 亚洲精品一区二| 国产精品国产精品国产专区| 国产精品女主播一区二区三区| 亚洲精品色婷婷福利天堂| 黄色一级一级片| 福利视频在线播放| 激情欧美日韩一区二区| 欧美高清无遮挡| av网页在线观看| 成人私拍视频| 国产精品视频在线看| 欧美激情一区二区三区在线视频| 成人av手机在线| 国产视频久久| 午夜剧场成人观在线视频免费观看 | 深夜福利在线观看直播| 雨宫琴音一区二区三区| 亚洲精品一区二区三区精华液| 国产免费观看高清视频| av中文字幕在线| 久久久午夜精品理论片中文字幕| 69久久夜色精品国产69乱青草| 久久久久久久久久久久久久久| 91精品亚洲一区在线观看| 亚洲国产aⅴ成人精品无吗| 欧美日韩精品中文字幕一区二区| 天堂在线资源库| 美女视频黄免费的久久 | 国产99在线播放| 欧美精品亚洲精品日韩精品| 日韩电影免费网站| 亚洲成人1234| av在线网址导航| 男女在线视频| 亚洲高清免费观看高清完整版在线观看 | 最新国产精品久久精品| 久久免费看毛片| 免费av网站观看| 日本一不卡视频| 欧美激情网友自拍| 国产精品酒店视频| 欧美调教视频| 日韩午夜激情av| 中文久久久久久| 国产美女高潮在线观看| 亚洲欧美另类小说视频| 青青草成人网| 91免费在线| 一区二区三区四区亚洲| 国产av麻豆mag剧集| 在线观看完整版免费| 亚洲日本电影在线| 欧洲一区二区日韩在线视频观看免费| www.亚洲免费| 一区二区三区在线视频观看| 日韩精品视频在线观看视频 | 丁香天五香天堂综合| 国产精品久久久久久久久男 | 在线一区二区三区四区| 免费网站永久免费观看| 男女啪啪在线观看| 国产欧美一区二区精品性 | 天海翼精品一区二区三区| 欧美一区二区三级| 呦呦视频在线观看| 久久久精品区| 亚洲另类xxxx| 黄色国产在线观看| 久久国产精品免费精品3p| 欧美成人a视频| 无套白嫩进入乌克兰美女| 亚洲欧美电影| 色综合久久综合中文综合网| 精品这里只有精品| 国产综合色在线观看| 91久久奴性调教| 久久久无码人妻精品无码| 欧美女优在线视频| 久久久亚洲国产| 国产精品suv一区二区| 欧美日韩亚洲一区二区三区在线| 久久成年人免费电影| 午夜精品福利在线视频| 久久国产精品毛片| 国产精品免费区二区三区观看| www.国产欧美| 欧美国产亚洲另类动漫| 黄色一级在线视频| 日韩影片在线观看| xxx成人少妇69| 日韩黄色片网站| 日本欧美大码aⅴ在线播放| 成人在线免费网站| 国产精品刘玥久久一区| 亚洲激情在线播放| 中文字幕第88页| 奇米色欧美一区二区三区| 久久久久久久激情视频| a视频免费在线观看| 国产 日韩 欧美大片| 国产精品sss| 国产一区久久精品| 欧美日韩免费不卡视频一区二区三区| 中国美女乱淫免费看视频| 亚洲香蕉网站| 国内精品小视频| 国产高清第一页| 亚洲桃色在线一区| 91视频这里只有精品| japanese国产精品| 美日韩精品免费观看视频| 中文字幕手机在线观看| 亚洲精品免费观看| 国产精品久久久亚洲| 男女网站在线观看| 自拍偷拍国产精品| 三级性生活视频| 久久激情av| 国内精品视频在线| 在线观看xxx| 日本一二三四高清不卡| 欧美 激情 在线| 国产美女亚洲精品7777| 亚洲国产成人精品女人久久久 | 亚洲一区中文在线| 男人天堂网视频| 青青操综合网| 日本国产一区二区三区| 国产情侣自拍小视频| av激情亚洲男人天堂| 日韩.欧美.亚洲| 青青在线视频| 欧美精品一区二区蜜臀亚洲| 国产精品第56页| 久久亚洲春色中文字幕久久久| 黄频视频在线观看| 在线观看涩涩| 亚洲午夜久久久久久久| 久久中文字幕无码| 麻豆久久久久久| 国产一区高清视频| 国产cdts系列另类在线观看| 欧美性极品xxxx娇小| 一卡二卡三卡四卡五卡| 欧美亚洲不卡| 免费看成人午夜电影| 久草在线视频网站| 日韩麻豆第一页| 中文字幕乱码人妻无码久久 | 亚洲最大的黄色网| 老司机精品福利视频| 综合国产精品久久久| 第四色中文综合网| 粗暴蹂躏中文一区二区三区| 成人爽a毛片一区二区| 国产精品久久久久久妇女6080 | 成人在线观看av| 毛片免费看不卡网站| 精品国产拍在线观看| 四虎在线视频免费观看| 在线亚洲高清视频| 欧美日韩免费一区二区| wwww国产精品欧美| 亚洲精品美女久久7777777| 国产精品99久久免费| 久久久日本电影| 在线激情免费视频| 日韩av在线网页| 全部毛片永久免费看| 中文字幕高清不卡| 国产十八熟妇av成人一区| 免费成人在线观看视频| 无码熟妇人妻av在线电影| 欧美日韩水蜜桃| 国产精品一区在线播放| 91成人小视频| 国产不卡av在线免费观看| 亚洲色图美国十次| 欧美一级专区免费大片| 中文字幕第四页| 成人av免费观看| 天天综合网日韩| 国产最新精品| 国产精品极品美女在线观看免费| 色呦呦在线视频| 这里只有精品视频| 亚洲高清视频免费观看| 国产精品视频一二三区| 国产成人精品视频免费看| 国产suv精品一区| 国产精品午夜国产小视频| 日本天堂影院在线视频| 欧美一区二区国产| 中文区中文字幕免费看| 欧美日韩国产精品一区| 国产特级黄色录像| 美女免费视频一区二区| 国产成人在线免费看| 欧美精品国产一区二区| 成人手机视频在线| 久久伦理在线| 水蜜桃一区二区三区| 四虎视频在线精品免费网址| 美女少妇精品视频| 蜜桃视频网站在线| 最近免费中文字幕视频2019| 国产伦理一区二区| 欧美性xxxxxxxx| 美国黄色小视频| 亚洲另类在线一区| 亚洲熟女www一区二区三区| 中文字幕在线视频一区| 亚洲欧洲综合网| 成人一区二区三区视频在线观看| 亚洲色图欧美自拍| 黄页网站大全一区二区| 欧美成年人视频在线观看| 日本欧美大码aⅴ在线播放| 超碰在线播放91| 久久国产日韩| 超碰在线97免费| 久久综合综合久久综合| 亚洲综合20p| 国产精品538一区二区在线| 男人天堂1024| 亚洲综合不卡| 视色,视色影院,视色影库,视色网| 日韩精品欧美大片| 蜜桃av久久久亚洲精品| 女厕嘘嘘一区二区在线播放 | 日韩电影在线视频| 在线观看日韩羞羞视频| 婷婷久久国产对白刺激五月99| 国产综合av一区二区三区| 日韩伦理一区二区三区| 日韩三级电影| 天天揉久久久久亚洲精品| 视色,视色影院,视色影库,视色网| 韩日欧美一区| 麻豆av免费在线| 看国产成人h片视频| 亚洲欧洲日韩综合| wwww国产精品欧美| 亚洲精品一区二区三区在线播放| 91美女片黄在线观看| 一区二区三区在线观看免费视频| 成人网页在线观看| 性久久久久久久久久久| 国产欧美日韩另类视频免费观看| 永久免费看mv网站入口| 亚洲国产精品综合小说图片区| 国产精品suv一区| 亚洲成a人在线观看| 搜索黄色一级片| 日本一区二区三区国色天香| 来吧亚洲综合网| 天天影视网天天综合色在线播放| 五月婷婷一区二区| 欧美日韩中文字幕在线| 曰批又黄又爽免费视频| 欧美在线free| www.色日本| 亚洲丝袜av一区| 六十路在线观看| 超碰91人人草人人干| 超碰aⅴ人人做人人爽欧美| 91老司机在线| 国产 日韩 欧美| 欧美精品亚洲| 欧美日本一区| 污片在线免费看| 99久久精品免费看| 91丝袜在线观看| 亚洲日本丝袜连裤袜办公室| 黄色av网站免费观看| 欧美岛国在线观看| 亚洲乱熟女一区二区| 国产亚洲精品美女久久久久| 九色91在线| 91精品综合视频| 黑丝美女一区二区| 2022亚洲天堂| 成人a区在线观看| 欧美爱爱免费视频| 欧美色手机在线观看| 一级黄色片在线播放| 欧美日本一区二区| 男生女生差差差的视频在线观看| 欧美激情综合亚洲一二区| 外国成人毛片| 亚洲ai欧洲av| 久久综合伊人| 朝桐光av一区二区三区| 亚洲国产一区二区a毛片| 国产精品伦一区二区三区| 曰本色欧美视频在线| 欧美专区福利免费| 成人网在线观看| 成人激情自拍| 国产综合18久久久久久| 欧美体内she精视频在线观看| 污污网站在线观看视频| 国产精品丝袜黑色高跟| 进去里视频在线观看| 国产亚洲xxx| 第四色男人最爱上成人网| 成人免费午夜电影| 色综合久久网| 亚洲36d大奶网| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产精品污www一区二区三区| 欧美成人国产| 国产精品沙发午睡系列| 99久久国产综合色|国产精品| 麻豆国产尤物av尤物在线观看| 精品国产户外野外| 日韩中文字幕免费观看| 久久久噜噜噜久噜久久| 99a精品视频在线观看| 欧美极品少妇无套实战| 丁香啪啪综合成人亚洲小说| 亚洲精品在线观看av| 亚洲国产高清福利视频| 韩国精品一区| 日韩电影免费观看在| 丝袜美腿一区二区三区| 国产欧美一区二区三区在线观看视频| |精品福利一区二区三区| 国产乱淫av片免费| 欧美美最猛性xxxxxx| 精品精品国产毛片在线看| 久久9精品区-无套内射无码| 国产亚洲欧美日韩俺去了| 久久久久久久九九九九| 亚洲大尺度美女在线| 亚洲性受xxx喷奶水| 日韩精品一线二线三线| 久久成人免费日本黄色| 一卡二卡三卡四卡| 欧美亚洲图片小说| 黄色网在线免费看| 国产欧美日韩亚洲| 日韩中文字幕一区二区三区| 久久久久成人精品无码中文字幕| 丁香五六月婷婷久久激情| 国产日本在线视频| 91在线精品视频| 中文在线不卡| 999福利视频| 亚洲国产精品电影| 日本精品在线一区| 菠萝蜜视频在线观看入口| 狠狠色狠狠色综合| 欧美成人aaaaⅴ片在线看| 国产亚洲精品美女| 亚洲一区二区三区在线免费| 一区二区三区四区五区精品 | 国产在线观看不卡| 亚洲视频分类| 天天做天天干天天操| 欧美日韩亚洲激情|