文档开发者中心
我的

谈编程中最重要的技能

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万倍的差别:



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


——————————————————————


BY:HW-WH

点赞
收藏
回复
6
分享
举报
浏览758 编辑于2019-10-21 03:26未知归属地
全部评论
最多点赞
最新发布
最早发布

顶一个啊


5楼编辑于2019-10-22 06:38 未知归属地

关联阅读:编程语言的流行趋势

4楼回复于2019-10-21 03:48 未知归属地

关联阅读:软件行业角色和技能趋势:对软件人员能力提升的启示

3楼回复于2019-10-21 03:48 未知归属地

作者的其它帖子也可以看一下哦


2楼回复于2019-10-21 03:45 未知归属地

文章很不错,希望对大家有帮助!

1楼回复于2019-10-21 03:27 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。