caoz的心得与分享,只此一家,别无分号.

算法是如何体现价值的

发布日期:2018-08-28 00:00:00 +0000

开篇必须跟我的读者坦白,这是一篇软文,但我想说,我这里发的每一篇文章,都是认真的,希望对读者有所帮助,即便刨去广告部分,我希望这篇文章仍然是可以帮助到走技术路线的年轻人,正确理解职场技能。


以我的年龄而言,我属于我们同龄人中接触编程和算法比较早的,在初中就开始接触苹果电脑,APPLE II型电脑,是的,那个年代的苹果机属于不入流和低端电脑,能跑一点简单的basic语言,需要插入软盘引导工作。


高中接触到pc机,在同龄人中已经属于少有的际遇,上了学校的计算机竞赛班,还拿了一个市里的计算机竞赛二等奖,学了一些诸如递归,回溯的算法。


大学的专业不是计算机,但也有一些关于编程和算法的课程,成绩马马虎虎,毕业后基本都忘光了。


啰嗦几句,在同龄人中,我算是很幸运,很早就接触了编程和算法,但高中的时候,是为了竞赛成绩好获得高考加分(然而并没有),而大学的时候则是为了混学分好毕业,浑浑噩噩的学算法,浑浑噩噩的去考试,然后浑浑噩噩的忘掉。


刚工作的那几年,才意识到数据库是非常重要的,大部分常见的应用,网站,社群,背后都是数据库在支撑,但那时候也都是最基本的使用而已,对背后的原理和机制一无所知,也因此犯了相当多的错误。直到后来,对性能,负载的要求越来越高,处理越来越复杂的数据问题的时候,才开始恶补这方面的知识和内容,不怕你们笑话,都一把年纪了才把数据索引效率的问题搞清楚,还不敢说精通。而数据索引效率的理解,btree这样的结构,说来也是算法。到后来用到redis的有序数组,就已经有意识主动的去看数据结构的逻辑和背后的算法,并基于此去评估其开销和应用场景。


那么,算法,说到底是什么?


算法背后其实是一种技术实现效率的认知,我们可能可以通过很多方式去实现一个解决方案,去处理一个需求问题,但我们在处理和解决的时候,是怎么判断这个方案的开销和可行性的。所以学习任何一个具体算法之前,要首先有时间复杂度,空间复杂度的概念,要知道在有限的计算资源条件下,在对系统开销有明确约束的前提下,如何有效的解决所需面对的计算问题。


中国的程序员数量庞大,已经成为一个社会存在感极为明显的职业,但其中水平层次差距之大,也是相当惊人的,郝培强老师在他最近的文章(好吧,是同一篇主题的软文)里提到说,光一个二分法(入门级的算法吧)就能筛掉很高比例的面试者,讲真,我深有同感,因为我前几年招聘,也喜欢用这个来做面试题目。但话说回来,我刚工作那些年,其实也属于被筛掉的那个阵营。即便是今天,偶尔遇到一些名校计算机系的学霸小鲜肉们在某些群里谈论各种算法的时候,我也是插不上话的,默默的后悔自己当年为啥浑浑噩噩的混学分,不说努力学习一下。


我工作最初几年,也总觉得,算法其实不实用,理解业务就够了,理解业务并实现,似乎也不是多难的事情,但那时候确实年少无知,后来才意识到性能,效率,资源紧缺是非常要命的事情,而且会极大制约一个创业企业的发展,有时候一个人黑暗中摸索,终于绞尽脑汁想出一个可行策略,觉得自己真是天纵英才,然而这种自以为是的状态过不了多久,某个机缘巧合的机会才发现,原来有个什么什么算法,跟我想到的思路类似,但是比我自己瞎琢磨的其实更简洁,更有效率,通用性更好。 举个真实的例子,当初遇到需要高效屏蔽词过滤问题的时候,我苦思冥想,自以为找到了合适的方法,后来发现有个AC自动机算法,明显比我想到的方法更高效简洁。这样的例子其实还有一些。


一些国内和国际互联网巨头都喜欢考算法,刷算法题是硅谷华人程序员最常见的求职通路,有时候你会觉得他们是不是吹毛求疵,至于么一个基层程序员也要学那么多算法,有时候我也会这么觉得,但反过来说,就算达不到那些巨头的要求,但能对时间复杂度,空间复杂度有明确的认知和概念,写出一段代码来,能立即评估其效率和性能瓶颈,这种思想意识,我认为,是每个程序员都需要具备的,而达到这一点,其实并不需要多么高深和复杂的知识。


一个程序员的价值,有几个关键的体现方式。


1、对业务的理解力。


能够正确理解业务诉求,能够从业务中发现问题和甄别问题,这其实是很重要的,技术人员的职场宽度会得到极大扩展,实际上我也认识很多技术出身,但后来成为成功创业领袖的人。也有一些技术出身但转型投资,运营管理的高手,这些都可以说是业务理解力很强,而利用技术人员特有的逻辑分析能力对业务诉求进行拆解和归纳,让自己拥有更多优势,从而让自己的职业道路变得宽阔。


2、沟通交流的能力。


很多技术人员欠缺这一点,这块我觉得怎么强调都不过分,闷头做事,大量无用功,分不清主次重点,以及莫名其妙成为背锅侠,还有就是自己的职场权益无法保障,说到底这里很多都是沟通交流能力欠缺导致的。


3、技术理解力。


技术理解力决定了你能达到的技术的高度,决定了你在技术团队中不可或缺的位置。


而技术理解力里面,很关键的就是时间复杂度,空间复杂度的认知,和在现实研发过程中的体现。这里,其实就涉及了大量的算法基础。


我反思自己当年读书的时候,浑浑噩噩的学算法,其实并没有从时间复杂度,空间复杂度去思考,只是因为老师讲了,书上写了,代码实现了,就以为自己懂了,后来自然也就忘了。在职场为了补回这些课,花了数不清的时间,而由此,可能也错过了数不清的机会。


其实,技术理解力在其他领域也是互通的,你有这样的一些认知,你对处理业务诉求,运营诉求的时候,也可以使用到这样的思想,如何降低复杂度,提升效率。


那么下面,是我最近超过一年半的时间,第一次付费软文广告。



为什么发这样的广告,因为我认为它对我的读者有用,我也会要求我公司的研发同学去学习(嗯,学完回来要考试的)。(很遗憾课程并不是开在我们自己的平台。)


比如旧文, 一个至简推荐系统的实现(附源代码) 这个是我自己实现的土法推荐系统,那么有没有更经典的推荐算法呢,其实是有的,这个课程里有一讲就是。


alphago 横空出世后,人工智能已经是非常重要的前沿领域,那么这个领域的核心技术要求,就是算法。


区块链这个概念被太多骗子和炒作者玩坏了,我有点不愿意提,但假设区块链存在真实落地发展的机会,那么核心技术是什么?还是共识算法。


好吧,最后,即便你忽略掉广告,我希望我的文章也能让你对自己的职场发展,对你的技术发展有帮助。


学习算法是手段,职场提升是目标。记住一点,你每站的高一阶,你的竞争者就会少一大批,职场上最紧缺的,永远是最优秀的那一小撮。


特别是研发领域,top 1%的薪酬,可能比top 5%的高一倍不止,top 5%的比top 20%的高一倍不止,top 20%的比top50%的高一倍不止。而很多企业老板经常提及的,要求不高,就想招个能用的程序员,这个所谓能用的标准,据我观察,基本上要求是 top 20%的水准,那么,你想站在哪里?


点击原文链接,直接进入课程。