热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HackerNews热议:众多封装库涌现,程序员是否仍需深入学习算法?

在当前各种算法实现和开源软件包层出不穷的背景下,算法对程序员的重要性是否有所减弱?回顾历史,早期程序员必须熟练掌握算法并频繁自行编写。然而,随着技术的发展,算法逐渐成为一种“商品”,现代开发者更多依赖现成的库和商业算法解决方案。有观点认为,机器学习领域中,许多算法已经被高度封装,不再需要深入理解其背后的数学原理。然而,这种趋势也引发了关于技术深度与广度平衡的讨论,强调了基础理论知识在应对复杂问题时的不可替代性。

在各种各样的算法实现、软件包开源可用的当下,算法对于 程序员 而言还重要吗?

Hacker News热议:封装包那么多,程序员还用学习算法吗?

如果你是几十年前的程序员,那你一定精通于算法,并经常需要自己编写算法。但在今天,算法已经变成了一种「商品」,从业者都在使用现成的软件包和购买的算法。甚至有人提出这种观点:「机器学习不需要数学,很多算法封装好了,调个包就行」。

时代真的变了吗?近日,一篇相关主题的文章在 Hacker News 网站引发讨论。

Hacker News热议:封装包那么多,程序员还用学习算法吗?

以下是文章的主要内容:

我刚开始做软件开发时,开发者必须自己实现大部分用到的算法。硬件供应商会提供一些库,但是当时整体的开发氛围就是自己编写算法(除了技术性较强且复杂的数学函数)。

开发者大多都会阅读高德纳(Donald Knuth)的《计算机程序设计艺术》,对于一步一步实现算法,这本书是很可靠的阅读资源。我还记得看到过一个库的副本,是用很小的字母手写了算法的更新,并将其粘贴到页面的上一页文本上。

Hacker News热议:封装包那么多,程序员还用学习算法吗?

那个时候,算法非常重要,因为计算机的计算速度不够快,无法以可接受的速率解决常见问题。普通指令的执行时间和指令时间,以及给定 CPU 上可用的寄存器数量,是开发者经常讨论的话题。内存容量通常是以千字节为单位的,每个字节都算在内。

那是算法的时代。

随着内存容量从以兆字节为单位变成了以千兆字节为单位,开源商业化算法和计算机的存储速度提高了非常多。

在算法的实现方面,现在的开发者拥有大量选择。 有那么多其他问题需要解决,为什么要浪费时间来实现算法呢?

现在,算法就像一座桥上的螺栓,非常重要但无人问津。今天的开发者更愿意讨论故事点、功能、商业逻辑等等。给出一个定义明确的问题,许多开发者现在更倾向于查找已有的包,而不是从头开始编写代码。

仍然会有新的算法被开发出来,研究人员持续对现有算法进行改进。但这是相对小众的。

有些公司的算法不是商品。例如谷歌,以谷歌的规模,即使看似非常小的改进,也可以为公司节省数百万美元(这纯粹是因为巨额数字的一小部分也是很多的)。而对于有些公司,算法开发可能是其核心竞争力的一部分,算法的非商品性让这样的公司在竞争中占据优势,而在非核心竞争力中算法被看作商品。

高德纳的《计算机程序设计艺术》在使算法变得普遍可用方面发挥了重要作用。尽管这本书经常被引用,但是我猜想现在很少有人会读它了。

几年前,我突然发现自己正在看的软件工程书籍竟然没有专门的算法章节。

今天,我们处在软件开发生态系统的时代。

算法还没有完全走向默默无闻,它必须等到人们只需将需求告诉计算机,而不需要关心实现细节时(或遗传算法编程发展得更好时),才能真正退出历史舞台。

开发者们怎么看?

「算法还重要吗?」这个问题由来已久,早已成为开发者讨论的焦点,大家对此的态度也各不相同。

Hacker News热议:封装包那么多,程序员还用学习算法吗?

即使有一天,计算机能够通过语音转代码的形式来编译算法,那时程序员的工作可能就是为计算机朗读待实现的算法。

Hacker News热议:封装包那么多,程序员还用学习算法吗?

如今与 80 年代相比,在绝对数量上,有更多的开发人员在从事算法编写工作,虽然,更高比例的开发人员从不编写任何算法。但如果有「算法时代」,我认为就是现在。今天我们所拥有的算法比以往任何时候都要多。

有人将算法与摄影类比,解释了算法行业正在经历的变革:

Hacker News热议:封装包那么多,程序员还用学习算法吗?

现在这个时代,我们可以在几分钟内找到任何符合自己想象的图片。所以从商业的视角来看,摄影作为一门纯艺术,其价值已经被消解了。但为什么还有人聘请摄影师呢?

摄影师收取的报酬不在于「交付最好的图像」,而在于为客户定制想要的照片主题及效果。我认为这也是软件行业的现状,我们不是在算法的「艺术水平」上登峰造极,而是要针对特定业务和需求给出定制解决方案。这不是宏观层面的创新,而是微观层面的创新。

Hacker News热议:封装包那么多,程序员还用学习算法吗?

时代变了,也意味着程序员必须要调整自己的目标所在。「对于许多人来说,编写纯粹、通用、美妙的东西会更有吸引力。遗憾的是,我们可能没有机会写出像谷歌开源的软件包那么好的东西了。」

Hacker News热议:封装包那么多,程序员还用学习算法吗?

有人表示,要不要自己编写最合适的算法是自己的选择,但如果不影响最后的实现结果,为什么还要浪费时间去做这样简单低级的工作呢?

Hacker News热议:封装包那么多,程序员还用学习算法吗?

也有人认为:封装包的确让他们不需要再做一些低级繁琐的工作,但是实际工作中仍然需要编写一些算法,因为总有一些没有封装好的算法需要开发者自己实现。

Hacker News热议:封装包那么多,程序员还用学习算法吗?

算法技能永远不会过时。的确,目前一些高质量的算法实现具有广泛可用性,可能不再需要手工实现此类算法。但是开发人员不仅需要了解数据结构支持的操作,还必须要了解其复杂性。只有这样,才能够满足应用程序自身的复杂性需求。

「知其然,知其所以然」在当下还是金玉良言吗?便捷可用的封装包是否会使算法衰落?这值得我们思考。

参考链接:

https://news.ycombinator.com/item?id=23746534

http://shape-of-code.coding-guidelines.com/2020/07/05/algorithms-are-now-commodities/


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 我们


推荐阅读
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
author-avatar
________葬情_231
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有