做程序的人,都知道了算法的5性——可行性,健壮性,有穷性,高效性,可读性。
这15个字谁都会说了,但是,你是否真正的思考过这个对当今程序界最最重要的用户体验的思考。
过去,我也没多做思考,但是,看了mit的算法导论公开课,我却是觉得一个好的算法, 确实严格遵从算法算法五性。
①可行性——算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。算法肯定要可行的,不可行的话,是一坨shit,一般可行性是与硬件息息相关。比如,10年前,你要先像现在的搜索引擎一样能够做视搜索,做各种各样的算法搜索。那时候,不是算法可行的,而是硬件而达不到要求。再比如所说,我们经常写出许多算法都是就会出现这个问题——数据溢出的问题。这也是一般硬件的问题,如果计算机是位数足够的大,程序一般不会出现这样的问题。 那你写一个连可行性都不可行的算法的话,那这样就无用户体验而言了。
②健壮性——就是算法要有足够健壮的,这个性质与一个安全性息息相关了。一个好的程序的好的健壮性,就是你的程序怎么搞就搞不死了。这难道不是与程序的安全的骨肉相随吗?尤其,到了21世纪以后,一个个程序安全尤其重要了。我们看以下案例。(1)2011年,花旗银行披露其北美地区银行网站在5月初受到黑客恶意攻击,21万北美地区银行卡用户的姓名、账户、电子邮箱等信息可能被泄露。(2)2003年的冲击波病毒,2005年的qq尾巴病毒,2007年的熊猫烧香病毒。近这些年,病毒的肆掠。 (3)在公司中,上班打卡一般难不倒我们这些程序员们,主要,我们可以进数据库中篡改我们的上班时间。这些活生生血粼粼的例子,就是因为算法的健壮性做的很不好了。如果,你的健壮性足够强,那真的不会出现这样的事情了。 至于碰到健壮性不够的程序的话,你会不会敢用一个连安全性都不能保证的,你敢使用吗?一个全部使电脑病毒的操作系统,你愿意使用吗?这样也能够看到健壮性与用户体验息息相关。
③有穷性——有穷性(有限性)。任何一种提出的解题方法都是在有限的操作步骤内可以完成的,“哪怕是失败的解题方法。”我们这些初学者写算法与有穷性最背道而驰——就是死循环。死循环存在的意义就是让程序永不停息的计算,然而有得不到我们最终所要的结果。这真是“瞎子点灯白费蜡”。如果一个程序是无穷的,用户只有没办法的白等,最终也只有干瞪眼。这样就会把用户逼疯,这样的程序绝对没有回头客。
④高效性——就是程序运算足够的快了,这与硬件,软件都有蛮密切的关系。与硬件的关系,我们就没有必要再说了,但是,与算法的关系。有必要说一说,同样问题,不同的算法当然实现的效率大相径庭了。比如说,我当年做实习生的时候,完成一个几千万人都是登录的问题时候,效率极其地下了。但是我们的老大(技术总监)——使用了一种常用数据结构链表,将其连起来,比较其中的位数大小的方法,这样,程序就如飞一般的感觉,非常的稳定。即使一个简单的排序,有的人可以做出时间的复杂度是O(n㏒n),有的只人能做出时间复杂度是O(n2),小数据没有多少差别,但是面对海量数据的时候,却又天壤之别。一个高效程序与一个低效程序,用户体验不用自明吧。
⑤可读性——就是源代码可读,意思明了,朗朗上口。这主要是针对于我们这些苦逼的开发人员而言了。做了软件的人都应该明白软件开发的人员都应该明白软件的主旋律就是——变。客户需求,就如小孩子脸说变就变。而软件的升级不断进行,这一定要在原先的源代码上的基础上不断的进行了。但是,你要知道,一个好的算法,必要有一个好的可读性,这样才能不断而且快速满足客户的需求,不断而快速的升级。可读性对一个好的用户体验也必不可少。否则,算法犹如天书,这样会严重影响开发效率,这样的程序鬼才要。
总之,良好用户体验的算法——必须有一个十足的可行性,足够的健壮性,并且是有穷的,性能其高的,并且对开发人员意思明了。