關於xnote
xnote是我在業餘時間開發的一款我的信息管理系統,開始是想作一款智能筆記系統,隨着我本身的使用和工做上的需求,xnote逐漸發展成我的信息管理系統,其中主要的功能是html
- 數據管理
- 日程管理
- 工具整合
相比於傳統的我的信息管理系統,xnote多了一些爲程序員定製的工具,好比腳本管理、代碼搜索、代碼統計、文字對比等。前端
我從大學開始就幻想這作一款本身的操做系統,開始是實體操做系統,後面隨着對web的瞭解,以爲基於web作一層系統封裝更可行一些。當時作了一個簡單的demo,其實主要是web文件管理器。以後精力投入到一個解釋器項目minipy 中。minipy 基本完成後終於有空抽出時間來考慮這件事情了。vue
關於造輪子
如今有不少很好用的CMS工具,因此總會有人問我爲何要重複造輪子。不少人說,模仿是走向創新的第一步,我對此堅信不疑。特別是在創造領域,重複造輪子也是很稀鬆日常的事情,就拿遊戲來講,雖然FPS遊戲都是拿槍突突突的,但是不一樣遊戲公司開發的風格不同,總會收穫忠實的粉絲。我以爲IT行業應該鼓勵生物多樣性,可能聽起來和標準化有所衝突,可是我以爲並不衝突。二者的應用領域不一樣。標準化應用在工業生產環境,追求穩定。而我的或者組織新造的輪子則是偏向於探索新的技術或者模式,這些輪子不只能爲整個行業注入新的血液和活力,並且能夠提升開發者自身的技術水平,何樂而不爲呢。html5
因此我在業餘時間投入了大量的時間造各類輪子,這些輪子不只能鍛鍊個人程序設計能力,還能成爲我本身的生產力工具,爲我避免了不少重複勞動,我以爲仍是很是有意義的。之因此開發xnote,我主要是但願可以更好的理解知識自己的概念,開發出更符合自身需求的知識管理系統,把資料、工具都整合在一塊兒,爲程序員提供更強大的創造力。python
功能展現
v1.0
1.0版本基本上具有了完整的知識庫維護功能,支持搜索、標籤,以及文件管理器和後臺定時任務。git
v1.1
1.1版本主要是後臺功能的加強,兼容了Python2,而且引入了大量的工具,總體界面沒有太大改變,主要是系統功能列表和編輯頁面的修改,引入了新的留言板功能程序員
當前版本(v1.2)
這一版本的改動量比較大,涉及到很是多的後臺優化以及交互優化。首先是主頁改版,做爲管理系統,我打算仍是採起經常使用的側邊欄菜單,這樣能夠展現更多的內容並且在PC上顯示效果更好。搜索開始支持一些搜索選項。github
留言板功能加強爲任務清單,支持狀態標記和分類 web
支持知識分類和富文本編輯器 算法
痛點與思考
知識的分類與標籤
在知識管理中,分類是一個很是重要的概念,分類意味着圖書的歸屬問題,也就是這本書是什麼,通常是排他性的,可是分類下面能夠有子類目。常見的圖書分類方法有按照做者分類的,好比經史子集,分別對於官方欽定的經書、史書、諸子百家著做以及我的文集,經史子集可以讓每本書都能找到本身的位置,雖然分類過於籠統,可是基於權威性這一點很是明確,因此生命力很是頑強一直延續到現代。現代通常根據圖書的學科劃分來進行分類,好比社會科學、天然科學、哲學等等。知識的分類一直困擾着人們,直觀看來,按照學科分類更合理科學,應爲他是根據內容來進行分類的,可是有些書籍內容很是寬泛,跨越了不少學科,很難具體劃分到一個類別中。
標籤和分類不一樣。標籤是對知識的特徵的描述,因此標籤更隨意一些,也不具有排他性,固然,若是標籤必須先定義再添加的話,那我認爲它是一種分類而不是特徵。
在標籤和分類的選擇上面,我經歷了一波三折。
最開始我選擇的是分類,可是並非純粹的分類,而是包含內容的分類,就像confluence那樣,文檔下面還能夠包含子文檔,可是我沒有設計confluence那樣的文件樹,而是使用文件列表模式,這樣沒法直觀的根據類型判斷是否包含分類信息。
考慮到標籤的功能更強大,更具有通常性,並且能夠方便展現在列表中,因此我從新選擇了標籤做爲分類方式,試圖統一分類格式。可是很快我發現,因爲標籤的隨意性,實際上使用時我每每會隨意給資料打上標籤。開始尚未問題,隨着時間的推移和資料庫的擴大,很快我就碰見了標籤爆炸的問題。並且因爲能夠隨意添加,出現了一個意思上面出現了同義詞標籤。這樣一來,標籤基本上失去了分類的做用,我只能使用搜索來定位我想要的文件。
功能越強大的設計每每難以掌握,好比C語言的指針。爲了解決標籤爆炸的問題,有兩種策略,一種是限制標籤的建立,即須要先定義再關聯,第二種是使用傳統的分類。我參考目前的大部分CMS系統,使用了分類結合標籤的方式進行管理,分類代表的是知識的歸屬和本質,標籤則是知識的特徵。
搜索
毫無疑問,搜索是一個很是重要的功能,大部分網站都會在最顯眼的地方放上一個搜索按鈕。xnote開始設想的是一個綜合性的搜索,把全部的結果聚合到一塊兒。如今是經過正則匹配的方式支持一些簡單的語義搜索和計算,可是實現過程當中仍是有一些問題
- 搜索結果過多或沒有,精確度不高
- 支持的數據量有限
- 搜索分頁問題,因爲聚合多種結果,因此須要在內存作分頁,數據量擴大後會增長系統負擔
- 搜索結果優先級問題,因爲聚合在一塊兒,因此搜索的結果展現有限,不一樣類別直接沒法比較,只能採起把一類結果置頂的方式
精度問題是由於沒有作分詞以及近義詞維護,而數據量支持有限則是由於依賴了數據庫的like
操做。因爲技術難度和時間的問題,這一塊在1.0版本暫時沒有大的改進。這將是後續優化的重點。
後面兩個問題,考慮使用高級搜索或者wolframAlpha那種知識引擎在結果上進行分類
技術成長
前端技術
開發xnote以前,我對佈局和交互基本上一無所知,前端技術除了對JavaScript語言熟悉一些,其餘基本上也沒怎麼深刻了解,經過xnote的開發過程,我發現本身還學了很多前端的知識。好比
- 常見的左右佈局,上下居中佈局以及複雜一點的聖盃、雙飛翼之類的有所瞭解
- 學習了基本的html元素樣式和響應式佈局
- html5中推出的新的API,好比攝像頭、麥克風、定位等各類設備的訪問,websocket、canvas等的使用
- 嘗試了新出的前端框架好比vue.js
做爲一名純粹的後端,本着無縫兼容的原則,原本我打算把界面簡單處理的,結果實際使用起來很是不方便,因此最後仍是決定全面擁抱新技術,也花費了大量的精力在這些體驗的優化上面。這裏也貼出一些圖展現一下xnote的版本變動過程(開始選擇了安全的上下佈局,後面以爲實在不方便仍是換成了管理系統經常使用的左右佈局)。
自動化測試
xnote引入了travis集成測試,做爲github插件,每次提交travis都會自動執行測試用例,保障開發質量。目前有37個測試用例,主要覆蓋一些核心功能,後續還須要添加更多的測試用例。
這裏我很感慨,有些公司雖然作着用戶量巨大的工程,軟件質量卻只能靠人肉來保障,對於大的改動每每傷筋動骨,並且吃好幾回虧都不悔改。相比於國內一窩蜂的去作互聯網產品(不是噴,我本人就是互聯網行業,不能否認這跟需求快速變化有關),國外有不少公司堅持作小而美的工具,並且有很是多的粉絲支持。固然,我相信中國的現狀只是暫時的,如今已經有不少優先的工具特別是前端工具如雨後春筍通常冒出來,將來在中國確定有那些憑藉優秀的工具脫穎而出的新興軟件企業。
Python
其實我一直是以玩具的心態來使用Python的,通常也就在本地寫個小工具,作作小實驗,可是經過xnote,我發現Python開發web應用確實大有可爲。相比於Java,Python有這些優點
- 開發速度快,這點應該沒有爭議,python語言方面設計的更簡潔高效,並且因爲GIL,處理併發問題也相對比較簡單
- 佔用資源低,JVM僅啓動內存至少得256M了,而Python拿xnote來講通常在100M如下。
- 性能,不少人擔憂python的性能不行,其實對於非計算型的應用好比常見的web場景,python的性能足夠了
- 解釋執行,這點通常場景用不上,可是對於那種規則多變的業務場景很是有價值,作互聯網產品的技術同窗都應該接觸過規則引擎,Java須要繞一圈使用Groovy等腳本,而Python則能夠直接使用Python做爲規則的語言,統一在一個框架之下很是利於項目的維護和發展。
xnote的將來
到目前爲止,xnote開發了一年多的時間,CMS的功能基本具有,可是個人目標並非一個簡單的CMS,而是一款具備必定智能行爲的計算機輔助系統。因此將來還有大量的工做要作,具體有如下幾點
插件化
從一開始我就是打算使用插件式架構來開發的,可是因爲對插件式理解有限以及開發的優先級問題,這件事情一直擱置着。到如今未知,xnote的基本功能以及趨於完善,代碼範式和自動化測試也初具雛形,下一步的一大重心就是實現插件式的架構,主要實現如下幾個目標
- 插件的註冊,可以經過必定的約定或者配置動態註冊到系統中
- 插件的卸載,可以動態的卸載而且安全釋放所佔用的資源
- 與內核的通訊,可以安全的與內核交換信息
搜索強化
搜索做爲一個統一入口將會提供更多的功能。由於我相信最好的交互是沒有交互。
數據可視化和智能化
數據可視化相對來講比較清晰,主要是基於知識庫的統計報表。
至於智能化,我目前想到的是知識庫的智能管理,好比智能分類,索引等等。索引須要涉及到一些天然語言處理的知識可能比較複雜。搜索引擎擁有大量用戶數據的系統,能夠利用數據的行爲進行分析和預測,可是我的知識引擎可能並無這個特色,首先是用戶行爲數據不足,沒法進行搜索結果排名,因此須要結合同義詞和語義分析對知識自己進行關聯度分析。因此我打算先從分類入手,由於畢業設計也作過簡單的圖像識別課題,樸素貝葉斯、SVM、決策樹等傳統的機器學習算法是我學習的重點,主要是想經過這些學習來了解當前的人工智能熱點,其次是但願能對xnote的優化和我自身的工做有所幫助。