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

机器越聪明,程序员就容易变懒

充分理解业务上的知识也是非常重要的,这些自动化的东西就是为了避免重复造轮子,避免陷入底层代码的海洋。如何制造一个世界上最好的轮子,和如何最出色的使用这个轮子完全是两个不同的领域,世界上最出色的建筑师可能并不知道如何制作一把世界上最好的锤子,那是世界上最好的造锤师傅干的活。

计算机相关产业的进化速度总是让人咋舌,如今随便一个手机的运算能力就超越了少几年前一般台式机的能力,这对使用者来说是好事,对程序员来说更是好事。倘若计算机性能强大到让开发者不用顾忌时间、空间复杂度,一切算法、优化什么的也就完全没了意义,毕竟这些东西都是为了我们能更划算的完成尽可能多的任务。但写出能让人长期维护扩展下去的程序比写让机器高效运行的程序难度大的多,机器性能的增强也不会直接促使程序员写出更优雅的代码,不然怎会看到专门收钱帮项目做设计模式、软件工程的顾问公司却没有做算法顾问的。

记得我曾经做一个项目有一个c文件有5000行,后期在解决跨编译器移植性问题时TC竟然都不能完全加载整个文件,更别谈顺利编译,不得不放弃这个编译器。想来c/c++通过包含头文件以c/cpp为编译单元,再将所有编译单元生成的目标文件连接为可执行文件的编译方式应是受制于计算机早期性能有限,特别是内存资源珍贵无比,一个小点的项目还好,把大项目的所有源码或其AST、符号表等东西都加载进内存就不现实了,于是无奈的只能划分成单个c/cpp编译单元进行操作。因为使用头文件包含做语法分析和部分代码生成,便随之可能产生循环包含、引用的问题,当然,这些都是可以避免的。

现代的高级编程语言环境一般都伴随很多较早期高级语言更智能的特性,比如功能更强大的IDE,代码着色,代码自动完成,类型提示,类型自动推导,注释文档提示,无头文件包含编译等,哦对了,把所见即所得的界面编辑也姑且算进去吧。需要付出的开销,或者说代价就是更大的内存占用,编译器/IDE将内存用于存储整个工程所有源码的AST、符号表,甚至是注释信息,即使程序员还没有点任何编译按钮。

我们希望机器更聪明,这也是一代代从业者努力的目标;更希望机器能摆脱人的干预自己就可以聪明的解决一些问题。语言越来越智能,编程貌似越来越简单,但正如刚才说的,只要像Java、C#这些较新(一般还都是在智能IDE中敲代码)的高级语言给了程序员只要import/using后就可以使用作用域内全盘任意的东西的能力,经验欠缺的程序员用它们写出循环引用、静态变量过多的代码的障碍就会较使用c/c++小很多。我不得不说自作聪明的高级语言会惯坏初级程序员,如果想学编程,先用功能看起来笨些的语言入门吧,用的久了自会分辨出大巧与真拙的区别。无边界效应的函数式编程语言也许能在编程范式上较指令式编程语言更有益于程序员养成好的习惯,可惜这类国外的基础甚至入门实践在国内乏人问津。

语言本身并无功过是非,可是越是智能的语言越是难以让程序员领会到怎样写出更好更易维护的代码,除非写程序的你不甘计算机的真相被埋没在它聪明的背后。

充分理解业务上的知识也是非常重要的,这些自动化的东西就是为了避免重复造轮子,避免陷入底层代码的海洋。如何制造一个世界上最好的轮子,和如何最出色的使用这个轮子完全是两个不同的领域,世界上最出色的建筑师可能并不知道如何制作一把世界上最好的锤子,那是世界上最好的造锤师傅干的活。

唯一的区别在于,做底层做框架的人的客户就是上层业务的开发人员,而上层业务的开发人员的客户就是最终购买产品的消费者。无论你在哪一层,你的最终目的就是要让你的用户觉得你的产品好用,如果你的用户还需要来学你的产品是怎么做的,那还要你干什么?

其实,并没有谁比谁更高端~有的只是无尽的虚荣心和优越感。

本文地址:http://www.nowamagic.net/librarys/veda/detail/1536,欢迎访问原出处。


推荐阅读
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 在给定的数组中,除了一个数字外,其他所有数字都是相同的。任务是找到这个唯一的不同数字。例如,findUniq([1, 1, 1, 2, 1, 1]) 返回 2,findUniq([0, 0, 0.55, 0, 0]) 返回 0.55。 ... [详细]
  • 本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • 深度学习理论解析与理解
    梯度方向指示函数值增加的方向,由各轴方向的偏导数综合而成,其模长表示函数值变化的速率。本文详细探讨了导数、偏导数、梯度等概念,并结合Softmax函数、卷积神经网络(CNN)中的卷积计算、权值共享及池化操作进行了深入分析。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
author-avatar
東臨天下2502892423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有