费劲心思却走向编程地狱的4个陷阱

本文探讨了四种常见的编程陷阱,包括过早或过晚优化代码、错误地使用抽象概念、不当利用编程工具以及跨平台应用开发的问题。这些陷阱看似无害,却常常让程序员陷入困境。

优化你的代码、创建编程抽象、编写跨平台的应用程序,几乎所有遵守这些戒律的程序员不出意外都拿着一等票去往了一个没有休憩时间,项目总能准时完成,代码库永远不会过时,而且他们也不必写任何文档的天堂——你懂的。

但是,要是情况不是这样的呢?要是那些技术将你带往的不是天堂,而是地狱呢?要是并非死后到达地狱,反而是现在呢?要是地狱充满了无数的不眠之夜,超出的最后期限,破碎的自尊心和狂怒的项目经理呢?我们更多地将到达地狱的原因归咎于这样一个事实,当涉及到一些具体——和常见——的情况时,那些戒律将成为坑死程序员的陷阱。更糟的是,你甚至不会意识到这一点。稀里糊涂,游戏就over了。

这些陷阱之所以阴险,是因为它们让你觉得你正在往正确的道路上走。但其实不然。这些坑死程序员的陷阱,简而言之就是,当你做一些你认为应该做的事情时,但却没有用你应该做的方式。

这篇文章探讨了可以把程序员的生活变成人间地狱的4个正确做法。

  1. 优化代码
  2. 创建软件抽象
  3. 使用编程工具
  4. 创建跨平台的应用程序

良好的意图1:优化代码

优化代码本身没有错。相反:表现力强的,高效的,和资源节约型的代码是一个成熟大师的标志。不过……希望你不会掉进任何优化的陷阱。

陷阱1:过早优化

过早优化是一个典型的程序员陷阱。即使是最博学和最有经验的程序员也会掉入这个陷阱。了解处理器是工作的以及知道强大的算法,可以帮助编写出高效又有效的代码。然而,那并不总是必要的:有时它甚至是一件坏事。因为你很难猜出薄弱点会在哪里,这意味着在得到它如何工作的详细经验证据之前,试图优化代码会导致问题复杂、有bug的代码。更不要说浪费在优化中的时间了。

陷阱2:过晚优化

有时候,程序员为了避免过早优化,反而掉进了过晚优化的陷阱,过晚优化通常发生在认为优化是项目最后阶段的地方。还等什么呢?过晚的优化可能会让你不得不重写至少三分之一的代码。更糟糕的是,你可能还没法写出另一块干净的,可工作的代码。浪费了时间,错过了截止期限,迷失了自己。

补丁

但是何时优化太早何时优化又变得太晚是不容易弄清楚的。所以睁大你的眼睛,随时保持警惕!

  • 不要立即对代码进行优化,想一想以后有没有其他更好更合适的时间
  • 没有正当理由不要推迟优化
  • 记住20/80法则:专注于那些虽然只占代码的20%,却对结果有着80%影响的代码(可以使用分析器)

良好的意图2:程序抽象

要是你仍然不得不使用goto语句来设置周期呢?或者,要是你不能够改变你的集合大小呢?试想一下,要是你需要预留一些内存,复制老集合到内存中,添加新的元素,并释放未使用的内存。完全是一个噩梦!

抽象可能是编程中最好的礼物。但是如果涉及我们将要讨论的这些情况,就另当别论了。

陷阱1:过于复杂

有些人认为,专门的函数是弱者所为,这就是为什么他们要编写不管情况如何都可以完成任务的最大化的广义函数。在着手于主要功能之前,他们先写了一个通用框架。这样做为什么不好?这么说吧,他们的代码只有30%被使用,而且没有人会需要一个通用的功能。所以这样费心费力值得吗?

为了制作俄罗斯方块,加载20个类、采用12种不同的图案、使用你自己的DSL来解析其他的DSL、创建一个跨平台的框架来可视化周期性图形,这便是过于复杂的典型例子。那些有这个美国时间坚持走这条路的程序员肯定以为自己是长生不死的。

陷阱2:忽视抽象

相对有经验的程序员更容易被受过度复杂这个陷阱的诱捕,那么他们经验不足的同行们则更容易完全忽略抽象。

往往在程序员刚开始使用一种新的编程语言来工作的时候,就是这个陷阱虎视眈眈最容易捕获猎物的时候。由于判定学习新语言的抽象会花费太多时间,所以就降低了其在优先事项清单上的地位。另一方面,举个例子,当你从C转移到C ++,或当你从一种操作语言转移到Haskell语言时,忽略迭代器会严重限制你。内置的语言工具和第三方的库和框架,实际上通过使得代码更短,更简单,更高效而改善了代码。

补丁

这里有一些需要谨记的事情。

  • 研究你的编程语言用于执行的抽象
  • 不要为了使用抽象而使用抽象
  • 保持简单愚蠢(KISS原则)——在设计工作中,这意味着系统的主要目标和价值在于它的简单,所以如果不会丢失任何重要的东西的话,那么请忘记抽象
  • 你将不需要它(YAGNI原则)——在你开始工作于一个新功能之前,先好好想想你是否真的需要它

良好的意图3:使用编程工具

现在有无数的工具和库,要么它们本身可以帮助完成任务,要么可以让工作变得更轻松。了解如何使用这些工具是技能集合的关键因素。当然,这里也有一些陷阱是需要警惕的。

陷阱1:“我需要的一切已经有人写好了”

那些觉得一切都已经有人写好了的程序员,喜欢使用他们那套现成的第三方工具。有时,而且特别是那些有经验的程序员,总是伴随着盲目地迷信于其他人的代码(他们下意识地认为在某个地方有一群高智商的家伙编写了毫无瑕疵的库)。但是,这是否真的值得你下载一个30+MB的库只因为一个小小的梅森旋转算法?你是否真的需要boost、Qt和STL来写“Hello, world!”?其他人写的代码并不一定好,并且我也不愿意去调试别人写的代码。如果你发现自己在IDE中没有自动更正就无法写好一行代码,那么说明你已经身陷这个陷阱而不自知。

每隔一段时间,程序员必须能够推倒重来,虽然……这也会成为陷阱。

陷阱2:重新发明轮子

重新发明轮子的通常是那些缺乏经验或正在学习新语言半途中的程序员。他们重新写了很多函数,忘记了第三方库中已有的相同功能的函数。他们相信,他们的语言和标准库已经具备了所有他们可能需要的东西,而自动更正工具,例如IDE则是为那些天才准备的,调试器和分析器则时刻等待着那些不记得自己的代码是如何工作的人。

还需要我提一提这个陷阱出现的次数吗?不仅如此,重新发明的轮子往往新不如旧:新的解决方案比标准方案要差得多。这和测试和教育项目无关,当然,有时候重新发明轮子是必不可少的,甚至是有益的:这适用于不需要常规项目的地方。

补丁

你必须知道如何使用最新的工具,以及如何正确使用这些工具。但另一方面,你不能完全依赖他们。

良好的意图4:跨平台

理想的应用程序应该在许多操作系统和设备上都工作良好,对吧?是的,只要这个标准不会给你带来麻烦。

陷阱1:过度跨平台

“不要坐在这把椅子上:它是给大家看的,不是让你坐的”(在一家现代艺术博物馆中,其椅子艺术品上的告示上如此写道)。那椅子就是“超级万能跨平台”应用程序的形象比喻。它不会正常工作于任何原先计划设计的操作系统上,在电脑、平板电脑和智能手机上同样如此。那么,为何会如此呢?类似于这样的应用程序是一些经验不足或过于自信的开发人员所编写的,他们相信自己创建的代码可以工作在所有的平台上而无需任何自定义。它们也是由一些懒惰的开发人员编写的,自以为可以运行在尽可能多的操作系统和平台上,而不必花时间移植。

可能也会有例外。但是,大多时候试图迫使应用程序可工作于所有的操作系统和所有设备,只会让你看着森林而找不到树木。最后,你只能茫茫然地带着上面一段我们提到的那把跨平台椅子离开。

陷阱2:只适用于WIN 32

另一个要避免的陷阱是发布只能和特定操作系统、特定鼠标、特定键盘和特定虚拟现实头盔一起工作的软件。你想要为每个目标平台重写所有或大部分的代码吗?有人强迫你为你的编译器/解释器使用不同寻常的扩展吗?你是故意编写很难转移的代码吗?那么你被困在了这个陷阱中。

补丁

  • 花时间搞清楚你的目标操作系统和平台是什么
  • 准备修改部分代码,或者甚至写一个单独的版本
  • 不要太执着于任何特定的平台

有没有可能避免每一个陷阱呢?我不确定,但我知道的是,总有办法让你走出这些陷阱。凡事预则立,对吧?

最后,请允许我以一个“程序员的天堂与地狱”的故事结尾。

开发人员梦到天堂里的程序员:每个人都坐在自己的电脑上,一口一口灌着咖啡,眼带血丝……最后的时间限制正在逼近……开发人员惊醒过来,继续睡,又梦到了地狱中的程序员:每个人都在自己的电脑前敲键盘(因为截止时间的逼近),在谩骂客户的同时,大口大口喝咖啡,眼睛里同样布满血丝。沉睡中的开发人员于是问恰巧出现的天使:“既然如此,那么,天堂的程序员和地狱的程序员之间的区别是什么呢?”“区别在于,”这个天使回答,“天堂里的程序员能够按时完成任务。”

编程陷阱会浪费时间。如果你想在最后期限前完成任务的话,那么请避免这些陷阱!

转自:http://www.codeceo.com/article/4-good-intention-to-programming-hell.html

译文链接:http://www.codeceo.com/article/4-good-intention-to-programming-hell.html
英文原文:FOUR GOOD INTENTIONS PAVING THE ROAD TO PROGRAMMING HELL

### 光流法C++源代码解析与应用 #### 光流法原理 光流法是一种在计算机视觉领域中用于追踪视频序列中运动物体的方法。它基于亮度不变性假设,即场景中的点在时间上保持相同的灰度值,从而通过分析连续帧之间的像素变化来估计运动方向和速度。在数学上,光流场可以表示为像素位置和时间的一阶导数,即Ex、Ey(空间梯度)和Et(时间梯度),它们共同构成光流方程的基础。 #### C++实现细节 在给定的C++源代码片段中,`calculate`函数负责计算光流场。该函数接收一个图像缓冲区`buf`作为输入,并初始化了几个关键变量:`Ex`、`Ey`和`Et`分别代表沿x轴、y轴和时间轴的像素强度变化;`gray1`和`gray2`用于存储当前帧和前一帧的平均灰度值;`u`则表示计算出的光流矢量大小。 #### 图像处理流程 1. **初始化和预处理**:`memset`函数被用来清零`opticalflow`数组,它将保存计算出的光流数据。同时,`output`数组被填充为白色,这通常用于可视化结果。 2. **灰度计算**:对每一像素点进行处理,计算其灰度值。这里采用的是RGB通道平均值的计算方法,将每个像素的R、G、B值相加后除以3,得到一个近似灰度值。此步骤确保了计算过程的鲁棒性和效率。 3. **光流向量计算**:通过比较当前帧和前一帧的灰度值,计算出每个像素点的Ex、Ey和Et值。这里值得注意的是,光流向量的大小`u`是通过`Et`除以`sqrt(Ex^2 + Ey^2)`得到的,再乘以10进行量化处理,以减少计算复杂度。 4. **结果存储与阈值处理**:计算出的光流值被存储在`opticalflow`数组中。如果`u`的绝对值超过10,则认为该点存在显著运动,因此在`output`数组中将对应位置标记为黑色,形成运动区域的可视化效果。 5. **状态更新**:通过`memcpy`函数将当前帧复制到`prevframe`中,为下一次迭代做准备。 #### 扩展应用:Lukas-Kanade算法 除了上述基础的光流计算外,代码还提到了Lukas-Kanade算法的应用。这是一种更高级的光流计算方法,能够提供更精确的运动估计。在`ImgOpticalFlow`函数中,通过调用`cvCalcOpticalFlowLK`函数实现了这一算法,该函数接受前一帧和当前帧的灰度图,以及窗口大小等参数,返回像素级别的光流场信息。 在实际应用中,光流法常用于目标跟踪、运动检测、视频压缩等领域。通过深入理解和优化光流算法,可以进一步提升视频分析的准确性和实时性能。 光流法及其C++实现是计算机视觉领域的一个重要组成部分,通过对连续帧间像素变化的精细分析,能够有效捕捉和理解动态场景中的运动信息
微信小程序作为腾讯推出的一种轻型应用形式,因其便捷性与高效性,已广泛应用于日常生活中。以下为该平台的主要特性及配套资源说明: 特性方面: 操作便捷,即开即用:用户通过微信内搜索或扫描二维码即可直接使用,无需额外下载安装,减少了对手机存储空间的占用,也简化了使用流程。 多端兼容,统一开发:该平台支持在多种操作系统与设备上运行,开发者无需针对不同平台进行重复适配,可在一个统一的环境中完成开发工作。 功能丰富,接口完善:平台提供了多样化的API接口,便于开发者实现如支付功能、用户身份验证及消息通知等多样化需求。 社交整合,传播高效:小程序深度嵌入微信生态,能有效利用社交关系链,促进用户之间的互动与传播。 开发成本低,周期短:相比传统应用程序,小程序的开发投入更少,开发周期更短,有助于企业快速实现产品上线。 资源内容: “微信小程序-项目源码-原生开发框架-含效果截图示例”这一资料包,提供了完整的项目源码,并基于原生开发方式构建,确保了代码的稳定性与可维护性。内容涵盖项目结构、页面设计、功能模块等关键部分,配有详细说明与注释,便于使用者迅速理解并掌握开发方法。此外,还附有多个实际运行效果的截图,帮助用户直观了解功能实现情况,评估其在实际应用中的表现与价值。该资源适用于前端开发人员、技术爱好者及希望拓展业务的机构,具有较高的参考与使用价值。欢迎查阅,助力小程序开发实践。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值