安全算法对于JAVA网站运维程序员的重要性


       程序员到底需要不需要学算法?这个问题和“Java是不是最好的语言”一样被争论了很多次"VIM和Emacs的最佳编辑是谁?"“程序员需要学数学吗?”。为了避免陷入这样的争论,我们先对“算法”这个词做一个转换性的定义。什么是算法?以下是我个人经历的一些例子。有一次我们发布了一个APP,要求用户注册时输入真实姓名,但是粗心的工程师忘了让用户填写自己的性别。更可怜的是“欢迎XXX先生注册XX。”但是app已经发布到AppStore了。我该怎么办?一个工程师提出了一个方法。我们使用现有的用户名和性别作为训练集来预测新用户是男性还是女性。为了尽快修正这个错误,我们使用了最简单的朴素贝叶斯分类算法,在最终测试集上的预测准确率达到了93%,这意味着我们解决了93%用户的体验问题。这种算法我称之为专业算法,即算法工程师在招聘网站上要求的算法,比如图像处理工程师、数据挖掘工程师。


曾经我们有过相似性搜索的需求,数据量小,只有几万条数据记录,所以不需要使用ES这样的搜索引擎。比如进入“长沙市”,希望找到“我爱湖南长沙”、“沙市小吃”等。,更不用说这个要求是否合理,我们将简单地讨论这个问题的解决方案。工程师实现的第一个版本是列出所有单词的组合,然后在数据库里做类似的操作,性能无法接受。于是我们提出了另一种解决方案:把数据库中的每个单词都破成单个单词,做成集合,保存在缓存中。接下来只需要对集合做交集运算,用词来计算词与词之间的相似度,性能问题马上就解决了。这种解题思路在《程序设计》中并不少见,不足以称之为具体算法。几乎总是在梳理我们的逻辑,训练我们解决问题的能力。我称这种算法为逻辑算法或技巧算法。


另一次,我们需要帮助用户制定旅行计划。情况比较复杂,因为除了地理位置,还需要包括对目的地过往用户的评价,需要的时间,以及在不同城市的住宿费用。但如果仔细分析,可以根据产品设计来拆分问题。在线部分可以使用基于距离的最短图路径算法,或者基于价格的贪婪算法,或者在综合排序中为用户选择使用变形加权的最短图路径算法。在离线部分,由于图中节点和边很少,可以用穷举法为用户找到几种不同类型的最优解。这些算法将在算法和数据结构导论中详细讨论。书中的每一个算法和数据结构都是作者多年来抽象总结的一个总体思路,我称之为通用类算法。


先说一个最基本的。我们制作了一个网站,允许用户发布他们的状态。高峰时并发太大,数据库不堪重负。因此,我们需要将用户的插入记录存储在消息队列中,以确保用户的正常使用,然后将它们放在MySQL数据库中。大家都会想到先入先出的数据结构,这也是一种算法。通过以上例子,你是否感觉自己被算法包围了?那么到底什么是算法呢?我们来看看标准的定义:对于某个标准输入,能够在有限时间内得到所需输出的一系列指令,称为算法。这个定义太抽象了。简单来说,算法其实就是解决问题的方法。所以从这个角度来说,你会说算法不重还是不重?那么为什么很多学生,甚至是工作很久的朋友,都说自己大学学的东西没有意义,算法没有用呢?说到底是因为人们不知道自己为什么学习,还是缺少算法的场景。大学的时候经常做一些简单的网站,用的技术就是数据库最简单的增删改。当时最大的感受就是算法没用。后来随着工作的深入,逐渐开始意识到算法的重要性,也逐渐拿起了算法。

分享: