您的位置:首页 > 其它

你到底要实现什么之简易搜索引擎

2017-03-25 23:22 267 查看
过去一个月的时间,和小伍一起完成了一个简易的搜索引擎,这算是我真正意义上的第一部与别人合作完成的作品,其过程曲折坎坷,入坑无数,而这些思维上的,不觉时仿佛前方是一片康庄大道,等到真正往前一步步走的时候,才真正发觉那些被思维的局限性和盲点所遮掩的。所以,我写下这篇博客,希望从这些踩过的坑中,寻找出某些规律或者发现思维的某些惯有的缺陷,从而在之后的路上,能尽可能的避开这些坑,提高自己的学习与成长效率。

弄明白你到底要实现什么

在一开始,我们想做的并不是一个搜索引擎,而是一个自动对话系统,但随着开发的逐渐深入,我们发现无论自己的技术能力还是所选的项目领域(想实现的是针对于学校事务的问答,可是一方面问答系统本身就是很难返回精准答案的,另一方面学校的通知形式和数量都不能为一个对话系统提供很好的数据集)都不适合做一个自动对话系统,所以,我们为了能够最终做出一个作品,妥协成先做一个搜索引擎,后期再慢慢开发其他的功能,然而到了最后,我们只做出了一个简易的搜索引擎(这又是之后要说的问题)

所以,我想,任何项目开始之前或者在初期阶段,一定要反复思考的问题就是:你到底要实现什么?

实质上这只是一个问句,用来警示你不要忘记去思考这样一个问题,那我们该如何有效的思考这个问题?

1. 你能做什么

大部分像我一样项目经验较少的菜鸟估计是很难正确估量自己能做什么的,就像初学者总是不顾时间自不量力的想学习一切东西,刚刚过了初学者阶段的菜鸟们总是不顾时间自不量力的想做高大上的东西,认为只要花时间,刻苦努力就一定能做成,不想就算能做成,你花了多少时间和精力,建造的却是一个空中楼阁,如果不及时建基,终要坍塌,既然这样,为何不先就做好基建工作,我承认大部分的事情只要花时间人人都能做好,但是效率效果却是不一样的。时间的价值往往成为人们放弃的理由。

所以,你能做什么,作为项目开发的菜鸟或者初入某一行的菜鸟,你能做的就是打好与你想做的之间的一级级台阶。项目初定之前,细细考量一下,在完成你想实现的目标之前,你需要实现什么,对于这些你需要实现的,你有清晰的概念吗?如果没有,继续细分,就像递归,而这时候,重点问题是你的堆栈空间有多大即决定了你能做什么,最终发现你能做的只有初次分形甚至二次分形后的一个子集。

2. 怎样权衡你想实现的和你能做的

当你能做的和你想做的不是同一个技术量级时,你还要继续坚持做吗?这时你有两个选择:

选择与你能做的一个量级的你想实现的目标或效果(妥协)

暂时放弃你想做的,去扩展你能做的(放弃)

最终我们在这一阶段的目标是:想法在一开始就是自我估量好了的,做我想做的,既不是放弃,也不是妥协

怎样去实现你的想法

这个问题的详细解释为:你需要用到什么技术和工具以及如何整合从而能实现你的想法?,目前我认为,如何能更好的考虑这个问题正是程序员的价值差别所在

就我自己而言,我在妥协做搜索引擎后,错误的选择了一个站内搜索框架haystack,并不适合做搜索引擎;然后前端开发的小伍也说他选错了 前端框架pure。

其实如何考虑这个问题,更多的是长期开发的经验和难以快速增长的理解力,我只能努力的整合下面几个思考点。

1. 先尽可能的量化你要实现的效果或者要达到的性能

对于我的搜索引擎而言,最核心的是需要能够自由方便的个性化索引、检索算法和排序算法。

2. 考量你选择的技术或工具能达到的效果或者性能

haystack是一个集成好的基于某些索引引擎(如elastcisearch,solr,whoosh)和django的检索api的框架,只是一个框架而已,惭愧我现在才知道框架的含义,这就决定了它是不涉及底层算法的呀,那么又如何满足我个性化索引与检索算法,如何个性化我的排序算法呢?

或许我可以去重写索引引擎的算法或者django的检索源码,但这又有两个不得不考虑的问题:

1. 框架调用的是api,是不是就意味着要改就只能改源码,而不是重写

2. 即使改源码,涉及到索引中的倒排算法、检索的算法以及整个源码结构,完整的不破坏源码结构的让你写,又能否写好?

所以一开始就不该选择haystack,哪怕自己设计,使用索引引擎和django的检索代码构建自己的搜索程序。(当然这又得考虑能否实现的问题,但至少比选择haystack要好)

3. 避免看到网上说某某能够实现某某,并因给出了思路和代码而一时高兴一头入坑,切记要考虑需求之间的差异和实现效果之间的差异

成员合作

网站开发到后期,我和小伍都感到
4000
很是痛苦,除了项目效果远不如我们初期设想导致积极性下降外,主要有两方面:

对于具体实现协商不够,各自对于自己想要实现的和怎样去实现与对方探讨不够,尤其是怎样去实现,在开发经验都不丰富的情况下,不明白对方怎么实现,在涉及到双方代码结合的部分会造成很大的麻烦

对于对方开发的技术不了解,而偏偏代码耦合又较多,双方又没有在一起及时的询问和解答,造成很多时间花在了钻研对方代码上,尤其是相对较弱的我。

对此,我想除了丰富经验与提升能力之外,该有这样一些启发式规则:

多听对方描述他的代码远比自己孤苦伶仃的啃代码啃文档高效

多讨论双方怎么去实现同步开发,不然较弱的一方(我) 会成为木桶的那个短板

进度安排

由于是个人开发,没有公司或者老师的强制时间要求,总会因为自己的拖拉或者精益求精而使得项目的开发进度一拖再拖,那么如何做好自己的弹性进度安排?

之所以叫弹性进度安排,是因为我们作为经验较少的独立开发者,在没有前人经验和同一领域的多次开发经验时,是很难把控项目的具体进度的,尤其作为学生,总是在不断的学习新知识尝试新领域,边学习边开发,这样,就多了很多的不可控因素,所以为了保证进度计划的合理性,我们必须弹性的设置时间范围,保证进度计划的可执行性。具体制定进度计划时:

1. 和合作的队友一起商量进度的安排,考虑各自的不可预测性和个人情况

2. 为进度计划的各小阶段制定弹性的时间范围,每一个小的阶段时间可以稍微宽松,但是项目开发过程中的关键时间点必须完全把控达到

3. 当团队成员有不能及时完成的任务时,应该及时提出讨论,或开拓成员思路或帮助其一起完成

当然这些建议都建立在一个有共同目标的有一定凝聚力的团队的基础上

关于项目

本作品是用django web框架+haystack搜索框架+elasticsearch索引引擎+jieba分词器+scrapy爬虫框架实现,其中各部分其他博客如下:

Django之MVC解析

Django之URL调度与参数传递

后续补充其他文章。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  项目经验
相关文章推荐