xnote是我在业余时间开发的一款个人信息管理系统,开始是想做一款智能笔记系统,随着我自己的使用和工作上的需求,xnote逐渐发展成个人信息管理系统,其中主要的功能是
相比于传统的个人信息管理系统,xnote多了一些为程序员定制的工具,比如脚本管理、代码搜索、代码统计、文字对比等。
我从大学开始就幻想这做一款自己的操作系统,开始是实体操作系统,后面随着对web的了解,觉得基于web做一层系统封装更可行一些。当时做了一个简单的demo,其实主要是web文件管理器。之后精力投入到一个解释器项目minipy 中。minipy 基本完成后终于有空抽出时间来考虑这件事情了。
现在有很多很好用的CMS工具,所以总会有人问我为什么要重复造轮子。很多人说,模仿是走向创新的第一步,我对此坚信不疑。特别是在创造领域,重复造轮子也是很稀松平常的事情,就拿游戏来说,虽然FPS游戏都是拿枪突突突的,可是不同游戏公司开发的风格不一样,总会收获忠实的粉丝。我觉得IT行业应该鼓励生物多样性,可能听起来和标准化有所冲突,但是我觉得并不冲突。两者的应用领域不同。标准化应用在工业生产环境,追求稳定。而个人或者组织新造的轮子则是偏向于探索新的技术或者模式,这些轮子不仅能为整个行业注入新的血液和活力,而且可以提高开发者自身的技术水平,何乐而不为呢。
所以我在业余时间投入了大量的时间造各种轮子,这些轮子不仅能锻炼我的程序设计能力,还能成为我自己的生产力工具,为我避免了很多重复劳动,我觉得还是非常有意义的。之所以开发xnote,我主要是希望能够更好的理解知识本身的概念,开发出更符合自身需求的知识管理系统,把资料、工具都整合在一起,为程序员提供更强大的创造力。
1.0版本基本上具备了完整的知识库维护功能,支持搜索、标签,以及文件管理器和后台定时任务。
1.1版本主要是后台功能的增强,兼容了Python2,并且引入了大量的工具,整体界面没有太大改变,主要是系统功能列表和编辑页面的修改,引入了新的留言板功能
这一版本的改动量比较大,涉及到非常多的后台优化以及交互优化。首先是主页改版,作为管理系统,我打算还是采取常用的侧边栏菜单,这样可以展示更多的内容而且在PC上显示效果更好。搜索开始支持一些搜索选项。
在知识管理中,分类是一个非常重要的概念,分类意味着图书的归属问题,也就是这本书是什么,一般是排他性的,但是分类下面可以有子类目。常见的图书分类方法有按照作者分类的,比如经史子集,分别对于官方钦定的经书、史书、诸子百家著作以及个人文集,经史子集能够让每本书都能找到自己的位置,虽然分类过于笼统,但是基于权威性这一点非常明确,所以生命力非常顽强一直延续到现代。现代一般根据图书的学科划分来进行分类,比如社会科学、自然科学、哲学等等。知识的分类一直困扰着人们,直观看来,按照学科分类更合理科学,应为他是根据内容来进行分类的,但是有些书籍内容非常宽泛,跨越了很多学科,很难具体划分到一个类别中。
标签和分类不同。标签是对知识的特征的描述,所以标签更随意一些,也不具备排他性,当然,如果标签必须先定义再添加的话,那我认为它是一种分类而不是特征。
在标签和分类的选择上面,我经历了一波三折。
最开始我选择的是分类,但是并不是纯粹的分类,而是包含内容的分类,就像confluence那样,文档下面还可以包含子文档,但是我没有设计confluence那样的文件树,而是使用文件列表模式,这样无法直观的根据类型判断是否包含分类信息。
考虑到标签的功能更强大,更具备一般性,而且可以方便展示在列表中,所以我重新选择了标签作为分类方式,试图统一分类格式。但是很快我发现,由于标签的随意性,实际上使用时我往往会随意给资料打上标签。开始还没有问题,随着时间的推移和资料库的扩大,很快我就遇见了标签爆炸的问题。而且由于可以随意添加,出现了一个意思上面出现了同义词标签。这样一来,标签基本上失去了分类的作用,我只能使用搜索来定位我想要的文件。
功能越强大的设计往往难以掌握,比如C语言的指针。为了解决标签爆炸的问题,有两种策略,一种是限制标签的创建,即需要先定义再关联,第二种是使用传统的分类。我参考目前的大部分CMS系统,使用了分类结合标签的方式进行管理,分类表明的是知识的归属和本质,标签则是知识的特征。
毫无疑问,搜索是一个非常重要的功能,大部分网站都会在最显眼的地方放上一个搜索按钮。xnote开始设想的是一个综合性的搜索,把所有的结果聚合到一起。现在是通过正则匹配的方式支持一些简单的语义搜索和计算,但是实现过程中还是有一些问题
精度问题是因为没有做分词以及近义词维护,而数据量支持有限则是因为依赖了数据库的like
操作。由于技术难度和时间的问题,这一块在1.0版本暂时没有大的改进。这将是后续优化的重点。
后面两个问题,考虑使用高级搜索或者wolframAlpha那种知识引擎在结果上进行分类
开发xnote之前,我对布局和交互基本上一无所知,前端技术除了对JavaScript语言熟悉一些,其他基本上也没怎么深入了解,通过xnote的开发过程,我发现自己还学了不少前端的知识。比如
作为一名纯粹的后端,本着无缝兼容的原则,本来我打算把界面简单处理的,结果实际使用起来非常不方便,所以最后还是决定全面拥抱新技术,也花费了大量的精力在这些体验的优化上面。这里也贴出一些图展示一下xnote的版本变更过程(开始选择了安全的上下布局,后面觉得实在不方便还是换成了管理系统常用的左右布局)。
xnote引入了travis集成测试,作为github插件,每次提交travis都会自动执行测试用例,保障开发质量。目前有37个测试用例,主要覆盖一些核心功能,后续还需要添加更多的测试用例。
这里我很感慨,有些公司虽然做着用户量巨大的工程,软件质量却只能靠人肉来保障,对于大的改动往往伤筋动骨,而且吃好几次亏都不悔改。相比于国内一窝蜂的去做互联网产品(不是喷,我本人就是互联网行业,不可否认这跟需求快速变化有关),国外有很多公司坚持做小而美的工具,而且有非常多的粉丝支持。当然,我相信中国的现状只是暂时的,现在已经有很多优先的工具特别是前端工具如雨后春笋一般冒出来,未来在中国肯定有那些凭借优秀的工具脱颖而出的新兴软件企业。
其实我一直是以玩具的心态来使用Python的,一般也就在本地写个小工具,做做小实验,但是通过xnote,我发现Python开发web应用确实大有可为。相比于Java,Python有这些优势
到目前为止,xnote开发了一年多的时间,CMS的功能基本具备,但是我的目标并不是一个简单的CMS,而是一款具有一定智能行为的计算机辅助系统。所以未来还有大量的工作要做,具体有以下几点
从一开始我就是打算使用插件式架构来开发的,但是由于对插件式理解有限以及开发的优先级问题,这件事情一直搁置着。到现在未知,xnote的基本功能以及趋于完善,代码范式和自动化测试也初具雏形,下一步的一大重心就是实现插件式的架构,主要实现以下几个目标
搜索作为一个统一入口将会提供更多的功能。因为我相信最好的交互是没有交互。
数据可视化相对来说比较清晰,主要是基于知识库的统计报表。
至于智能化,我目前想到的是知识库的智能管理,比如智能分类,索引等等。索引需要涉及到一些自然语言处理的知识可能比较复杂。搜索引擎拥有大量用户数据的系统,可以利用数据的行为进行分析和预测,但是个人知识引擎可能并没有这个特点,首先是用户行为数据不足,无法进行搜索结果排名,所以需要结合同义词和语义分析对知识本身进行关联度分析。所以我打算先从分类入手,因为毕业设计也做过简单的图像识别课题,朴素贝叶斯、SVM、决策树等传统的机器学习算法是我学习的重点,主要是想通过这些学习来了解当前的人工智能热点,其次是希望能对xnote的优化和我自身的工作有所帮助。
xnote托管在github和码云上,欢迎有兴趣的同学star和参与。