谈编程中最重要的技能
1.算法与数据结构的本质是啥?
算法(algorithm)在维基百科的定义: A set of instructions, typically to solve a class of problems or perform a computation.(一组指示,通常用于解决一类问题或执行计算。)说白了算法只不过是所说的解决问题的步骤,它们本质上是一个解决方案,不管你有意识没意识,你或者在引用别人的算法或自己在写“算法”,你如果觉得自己没正规学啥算法,好像编程还可以,那要恭喜你,你的逻辑思维和解决问题的Common Sense 还不错。算法的差别常在于思考的深度,有效性和实践的检验。有些好的解决方法被固化下来给起名为啥算法,如二分查找,Quick Sort, 等。
数据结构(data structure)在维基百科的定义: A data organization, management, and storage format that enables efficient access and modification。(支持高效访问和修改的数据组织、管理和存储格式)说白了就是有序的数据安排,可以根据不同维度分类(原始/非原始,线性/非线性,静态/动态)数据结构就像算法制作食品配方的手。利用数据结构和算法的结合,可以大大提高程序的性能。
2.算法与数据结构的重要性
看到这,你可能会说那编程不是就是用算法加上数据结构来解决问题,实现设计吗?一点没错。算法和数据结构是计算机科学的基础和本质。图灵奖得主,Pascal之父世界著名计算机科学家Niklaus Wirth 就说“Algorithms+Data Structures=Programs”
业界领先高科技公司谷歌,微软,亚马逊,面书等在面试中都重点关注算法和数据结构,他们认为好的开发员的Identity就是算法和数据结构的纯熟掌握,灵活应用和创新产生,Linux 之父Linus Torvalds 也非常强调算法和数据结构的重要性,他认为这就是好坏程序员之间的差别。因为算法和数据结构是解决问题的模式,而雇主们最看重的正是解决问题的思路和能力(HackerRank 2018 软件调研结果)。
那我们不懂算法和数据结构或知之甚少可不可以还是好的开发员?不大可能。这就好像你去打仗,你的武器库里空空如也,想要盖房子,没有材料。没有算法和数据结构的知识积累就我们会成为无源之水和无本之木,眼光思路受限,甚至重复造轮子。
随着科技的进步,算法应用范围越来越广泛也越重要:
互联:Web 搜索、数据包路由、分布式文件共享。。。
生物学:人类基因组计划,蛋白质折叠。。
计算机:电路布局、文件系统、编译器。。。
计算机图形学:电影,视频游戏,虚拟现实。。。
安全:手机,电子商务,投票机。。。
多媒体:MP3,JPG,DivX,高清电视,人脸识别。。。
社交网络:建议,新闻源,广告。。。
物理:N 体模拟、粒子碰撞模拟。。。
好的算法跨行业被应用如 Dijkstra 算法在机器人导引,TCP路由,GPS导航等领域都有广泛应用。
算法的有效性,在时间复杂度和空间复杂度上可以有巨大差别,例如在一本词典中找一个词,你可以一页一页的找,你也可以按照索引去找,时间会有很大差异,像 常用的Big O分析 (假设1 GHz CPU,平均可在 1 纳秒内执行一条指令)所显示的差别:
这就是为啥盖茨认为编程最困难的部分是决定算法是什么,然后尽可能优化和简化它们,他的合作伙伴保罗.艾伦说盖茨热衷于寻求最有效的算法和不多写一行代码。这对微软的代码文化影响深远,例如微软的Paxos算法的实现只有7000+行C++代码,但几乎所有微软的核心云服务在主备倒换时都会用到,你可以看到好的算法和代码的重要性和影响力。
工程师对通用的算法和数据结构应该有深刻的理解,不是简单的生记硬背,因为好的算法和数据结构是有普遍性和不随时间改变,熟练掌握后我们可以举一反三,触类旁通。如果我们对算法和数据结构“见多”,它们常会激发我们的灵感和解决思路,使我们“识广”。
当我们把好的算法和数据结构灵活掌握和应用到我们的产品中,或创造出新的算法和数据结构,就会受到巨大的红利,使我们主导未来,更加有竞争力。最近看到无线的一个产品通过优化算法和数据结构使960万个令人触目惊心的For循环搜索次数减少到256个,近4万倍的差别:
所以我认为,产品中的不合适的算法和数据结构是一种核心坏味道,对于个人,我们每个工程师都要对算法和数据结构有深刻的理解,做到不断积累,见多识广,对代码的算法和数据结构不断优化,要做到这一点我们首先不能满足于搬砖文化,要成为有成长和开放心态,追求极致的工程师,这是另一个话题,以后再说。
本文来自作者吴昊
- 点赞
- 收藏
- 关注作者
评论(0)