谈编程中最重要的技能

举报
云上有未来 发表于 2019/09/29 15:18:15 2019/09/29
【摘要】 产品中的不合适的算法和数据结构是一种核心坏味道,对于个人,我们每个工程师都要对算法和数据结构有深刻的理解,做到不断积累,见多识广,对代码的算法和数据结构不断优化,要做到这一点我们首先不能满足于搬砖文化,要成为有成长和开放心态,追求极致的工程师

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。(支持高效访问和修改的数据组织、管理和存储格式)说白了就是有序的数据安排,可以根据不同维度分类(原始/非原始,线性/非线性,静态/动态)数据结构就像算法制作食品配方的手。利用数据结构和算法的结合,可以大大提高程序的性能。



数据结构(data structure).png

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 纳秒内执行一条指令)所显示的差别:

常用的Big O分析.png

这就是为啥盖茨认为编程最困难的部分是决定算法是什么,然后尽可能优化和简化它们,他的合作伙伴保罗.艾伦说盖茨热衷于寻求最有效的算法和不多写一行代码。这对微软的代码文化影响深远,例如微软的Paxos算法的实现只有7000+行C++代码,但几乎所有微软的核心云服务在主备倒换时都会用到,你可以看到好的算法和代码的重要性和影响力。


工程师对通用的算法和数据结构应该有深刻的理解,不是简单的生记硬背,因为好的算法和数据结构是有普遍性和不随时间改变,熟练掌握后我们可以举一反三,触类旁通。如果我们对算法和数据结构“见多”,它们常会激发我们的灵感和解决思路,使我们“识广”。


当我们把好的算法和数据结构灵活掌握和应用到我们的产品中,或创造出新的算法和数据结构,就会受到巨大的红利,使我们主导未来,更加有竞争力。最近看到无线的一个产品通过优化算法和数据结构使960万个令人触目惊心的For循环搜索次数减少到256个,近4万倍的差别:

算法和数据结构.png


所以我认为,产品中的不合适的算法和数据结构是一种核心坏味道,对于个人,我们每个工程师都要对算法和数据结构有深刻的理解,做到不断积累,见多识广,对代码的算法和数据结构不断优化,要做到这一点我们首先不能满足于搬砖文化,要成为有成长和开放心态,追求极致的工程师,这是另一个话题,以后再说。


本文来自作者吴昊

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。