`
奥义之舞
  • 浏览: 284401 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

弱爆程序员的特征值

阅读更多
首先说明:

1、以下特征是真实遇到过的,同事犯过的,乃至我自己也犯过的;
2、为了剧情需要,某些例子进行了一些夸张修饰等演绎创作,如无雷同,请勿生气;
3、如果你出现过以下症状之一,并不代表你就是弱爆了,但是如果你一直出现,乃至一说到这个大家就能联想到你,那么你就得小心了;
4、如果你是集这几个的大乘者,恭喜你,你已经找到了离开这个行业的充足理由了。

好了,搞定!

“那个Bug解决了吗?”

“好了,搞定!”

“这么快?”

正当你非常欣喜的时候,就传来了噩耗:刚才还能编译成功的,就失败了。(好吧,我们的集成编译尚未成功配置上,理论上这种事情应该会被退回。)又或者能编译成功,但是呢,原来明明能起作用的一个下拉框,突然发神经的不起作用了。最隐蔽的莫过于,一切正常,但是当你看到代码的时候,你就晕厥过去了。比如我们曾经发现了一个Bug,简单说就是每次用户点击某个东西,就会执行下面的这段C#代码:
controlPropertyPanel.PropertyChanged += this.UpdatePropertyOnChanged;

这个Bug很明显会导致速度越来越慢,因为同一个更新操作会被更新N次,并且这个N会越来越大。其实这个Bug已经够弱了,但是后来居然被修改为:
controlPropertyPanel.PropertyChanged -= this.UpdatePropertyOnChanged;
controlPropertyPanel.PropertyChanged += this.UpdatePropertyOnChanged;

这段代码能编译,能执行,但是就是弱爆了。因为这不仅仅没有从根本上去掉造成问题的逻辑,还会带来更多的困惑:为什么要先减后加呢?

这类特征,请大家看看有趣的《各种流行的编程风格》,我这个例子算是一种撞大运。我觉这吧,这类问题都是因为只想解决一些表面的东西为目的,完全不管底下的其它任何问题而造成的。

那估计是他的Bug

“这个问题为啥还没解决呢?”

“我觉得应该是他那里边的Bug,我调不了。”

“哦……”

这个“他”可以是某一位同事,或者前同事,或者微软,或者别的什么公司,再或者某个开源代码的作者。这些个我都遇到过,比如说是另一位现在在职的同事吧。当你告诉这位同事这个Bug似乎在他那儿,并且问问什么时候解决,他也许会很愧疚的立刻调试,可最后结果却仍然是开头对话主人翁的所写代码的问题。

再比如说是微软吧,那么对话可能就会包括:“啊,SilverLight真是烂,老是内存泄漏、崩溃等……”“是啊是啊!烂死了!早知道用Flash了。”又或者会说:“微软就是烂,Java就是好。”其实,我不想比较什么SilverLight还是Flash,.NET还是Java。因为在讨论这些问题之前,先最好想想,这真的是别人的错么?相信是其他人的错是一件很简单的事情,因为这样推脱之后你就可以啥都不做了,反正不是我的错。

如果真的发现了这是别人的Bug并证明了,那倒好说。但这种特征是一种纯粹的怀疑,并没有丝毫的证明。在仔细找了自己所有可能犯的错之后,如果你怀疑是别人的问题,那请求证一下。

无图无真相!

“楼主,无图无真相啊!”

“楼主,无代码无真相啊!”

“楼主,给翻译一下啊!”

据说Linus在别人询问Linux内存管理的一个什么问题时,回答道“Read the fxxxing source code”,很多时候我也有类似的冲动。我发现在信息发达的时代,不少人的阅读能力、动手能力都严重退化了。这些人最好就是你亲自来帮他把问题解决了,他才不想了解里面到底 发生了什么。这种问题体现在博客里面,就是寄希望于你写得图文并茂,图嘛最好花里胡哨同时言简而意概,文字嘛最好大段大段的代码。其实图不是重要的,只是为了好看,重点是代码,这样他一Copy就可以直接解决他们的问题了。

比方说,Silverlight里面没有各种图像格式的编码器,于是当你希望保存Jpg的时候怎么办呢?Google一下,发现原来有人写过一个FluxJpeg的编码器。下载下来一跑,唉还真能用哎。之后就直接签入,也不捎带看一下有没有什么问题,或者设计不合理的地方。(其实真的有,会很慢,因为有大量毫无必要的数组拷贝。)

又或者说,遇到了某个Bug,搜索一下发现,哎,还真有人遇到过,而且还有代码哎!把代码扒下来一跑,发现好像解决了,至于为什么就不管了。甚至还遇到过根本就不管解决不解决问题,反正代码扒下来了就签入了的。

再比如,写一篇博客讲解如何缩减.NET编译出来的文体大小,其中提到许多概念需要先阅读微软官方的一个文档。结果,还是会有人回复说,你那个文章里面提到那么多的Blob,也不说说Blob里面都有什么,大概是很不满意吧。可是这个文档里面都有啊,难道就不能自己阅读一下?其实即便我连这个文档都没有给出,自己也应该有这个能力去进行思考,去动手寻找。

千万不要退化成一个啥都要别人给你嚼烂了才能够吞下去,吞下去也不会消化吸收的人。这样的人大概别人给的是大便,只要有代码无真相,也会照样吃下去的。若真如此,那你打算如何提高呢?

那是个对象!

“这个ExpressionVisitor,它是用来干什么的?”

“……”

“好吧,或者这么说,他是一个什么东西?”

“他是一个对象!”

“啊?”

“哦,是一个对象的实例。”

大概这样的回答,和那个微软工程师说“你在直升飞机上”差不多——反正你也不能说是错的,但是就是没什么意义。其实不知道没啥问题,人又不是神,怎么可能都知道呢?不去仔细了解和学习问题也不严重,因为你可以改。但是当你习惯性的随便找一个绝对没错但又不说明任何问题的答案,甚至似是而非的东西来对付的时候,你就离弱爆的边缘很近了。

当然,上面的对话也许是比较极端的。一个稍弱一点的对话版本是:

“这个内存泄漏是怎么造成的呢?”

“嗯,会不会是图片放的位置不对呢?”

哈,还是很夸张对吧?没办法,写博客有时候需要夸张的文字,否则你无法理解我的意思是:有时候,大家会倾向于从自己的记忆中寻找一些相似的物品,然后选择相似度自认为比较高的东西出来当作答案,而全然不管两者之间的逻辑是否有哪怕那么一丝的关联。也许很多时候,我们确实需要从相似的东西开始,但请别把他当作终点。程序是需要严谨的逻辑的,所以你也必须非常严谨的去推演。

关于这类的问题真的太多太多了,比如我指着下面这段代码当中的someKey:

var dictionary = new Dictionary<string, string>();
dictionary["someKey"] = “someValue”;


“这句话说明了什么?”

“说明dictionary是一个数组。”

集大成者

最后我举一个集大成者的例子,说,有个任务是要在SilverLight应用上面添加一个“收藏本站点”。好,怎么解决呢?网上一搜,发现有很多这样的代码:

function AddBookmark(Url, LabeName) {
  if (document.all)
  {
    window.external.addFavorite(Url, LabeName);
  }
  else if (window.sidebar)
  {
    window.sidebar.addPanel(LabeName, Url, '');
  }
}

然后直接扒下来就放上去了,通过某种方式在SilverLight中调用这段JavaScript,签入,搞定了!结果到了测试那边发现完全不能用,无论在IE6/7/8/9/10,还是在FireFox/Safari/Chrome上面,都不能使用。我问:

“这是什么原因呢?”

“不知道,反正浏览器报告没有权限,可能是浏览器的安全设置原因吧,或者操作系统的Bug,也可能是浏览器的某种Bug?”

“不可能啊?这些代码存在很多年了,要有问题早就能在网上搜索到了。”

“那也许是SilverLight调用的时候有什么安全问题。哎!SilverLight好烦啊!”

“那怎么还没有解决呢?”

“好,我马上解决它!”

很快,那段Javascript就变成了:
function AddBookmark(Url, LabeName) {
  try
  {
    if (document.all)
    {
      window.external.addFavorite(Url, LabeName);
    }
    else if (window.sidebar)
    {
      window.sidebar.addPanel(LabeName, Url, '');
    }
  }
  catch
  {
    alert("您的浏览器因为安全设置的问题无法收藏,请手动添加收藏!");
  }
}

看到这样的代码,我彻底震惊了。亲自调试了一下,发现确实报告了一个“没有权限”的异常。但是,我还发现,那个Url参数的值是“www.adomainname.com\test\page.html”。那这不废话么!浏览器认为你要收藏的是一个本地硬盘上的路径,怎么可能在一个Internet Zone上允许收藏这种路径呢?我于是指着代码问:

“这个Url是什么?”

“是一个变量”

“啊?”

“哦,不对,是一个参数。”

你是否也有类似的经历呢?

转载自:http://coolshell.cn/articles/5292.html
分享到:
评论

相关推荐

    复数矩阵的特征值分解

    使用GSL进行特征值分解,程序员可以避免手动实现这些复杂的算法,从而节省时间和精力,并确保结果的准确性。 特征值分解的一般形式是: \[ A = P \Lambda P^{-1} \] 其中,\( A \) 是一个 \( n \times n \) 的...

    C语言计算特征值和特征向量

    在计算机科学领域,特别是在线性代数和数值分析中,计算矩阵的特征值和特征向量是一项基础且重要的任务。C语言作为一种强大的编程语言,因其高效性和灵活性,常被用于编写这种数学计算程序。本项目名为"C语言计算...

    用C语言编写的一个求矩阵的特征值和特征向量的程序.zip

    特征值和特征向量的计算通常涉及线性代数中的复杂数学运算,因此程序员需要对线性代数有深入的理解。例如,QR分解将矩阵转化为正交矩阵Q和上三角矩阵R的乘积,从而简化特征值的求解。 此外,该程序可能还包含错误...

    程序员数学3 的源代码

    线性代数的核心内容包括向量、矩阵、线性方程组、特征值和特征向量、行列式以及秩等。这些概念不仅在理论上有深远影响,而且在实际编程中有着广泛的应用。 首先,向量是线性代数的基本元素,可以用来表示具有多个...

    程序员的数学系列.pptx

    还介绍了特征值、特征向量和矩阵对角化的概念。这些知识可以帮助程序员在处理矩阵和向量运算时更高效地进行计算,并且对于理解线性规划和优化算法也非常有用。 离散数学是研究离散对象及其关系的数学分支。本书首先...

    程序员专用 编程输入法

    标题中的“程序员专用编程输入法”指的是专门为程序员设计的特殊输入法工具,旨在提升编码效率。这类输入法通常具有以下特点: 1. **快捷代码输入**:程序员输入法能够通过快捷键、组合键或者自定义短语来快速输入...

    程序员项目交接文档

    程序员项目交接文档概要 IT 项目交接文档概要是程序员在项目交接过程中的重要文件,它对项目的开发、测试和维护起着至关重要的作用。本文档概要将对程序员项目交接文档的主要内容进行概要介绍。 人事模块是程序员...

    java程序员面试交流项目经验

    java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流项目经验java程序员面试交流...

    程序员简历程序员简历.pdf

    程序员简历程序员简历.pdf

    程序员的数学1,2,3

    本书将深入讨论向量、矩阵和线性空间的概念,解释线性变换、特征值和特征向量的含义。此外,还会涉及解线性方程组的方法,如高斯消元法,以及矩阵的运算,如行列式、逆矩阵和特征值分解。这些知识对于理解和实现线性...

    历年程序员考试真题

    2000-2010历年程序员考试真题,对软考程序员的一些试题总结,包含答案;程序员考试上午科目和下午科目的考试形式与考核内容已经趋于稳定,考生应紧扣考试大纲和指南,有针对性地进行学习。

    程序员的八重境界

    ### 程序员的八重境界解析 #### 前言 在IT行业中,程序员的成长与发展路径一直是人们关注的重点话题。《程序员的八重境界》这篇文章以幽默且深刻的笔触,描绘出了程序员职业生涯的不同阶段及其特点。文章不仅对...

    程序员教程(pdf)

    《程序员教程》是一本针对初学者和有一定经验的程序员精心编写的教材,旨在全面介绍编程基础知识和实践技能。这本书以PDF格式提供,便于电子阅读和随时查阅。它涵盖了程序员需要掌握的各种关键知识点,无论你是刚踏...

    程序员-工作日志示例

    程序员工作日志示例管理文档 工作日志是程序员日常工作中不可或缺的一部分,它可以帮助程序员更好地管理自己的时间、提高工作效率、记录工作进度、总结工作经验等。本文档是一个程序员工作日志示例,旨在帮助程序员...

    PHP程序员简历模板 iOS程序员简历模板 Android程序员简历模板 Web前端程序员简历模板 Java程序员简历等等

    iOS程序员简历模板 Android程序员简历模板 Web前端程序员简历模板 Java程序员简历模板 C/C++程序员简历模板 NodeJS程序员简历模板 架构师简历模板 通用程序员简历模板PHP程序员简历模板 iOS程序员简历模板 Android...

    程序员个性电脑桌面壁纸

    【程序员个性电脑桌面壁纸】这一主题,其实涵盖了两个主要方面:一是程序员文化,二是电脑桌面壁纸的个性化选择。这两者都是IT行业中与个人工作环境和精神风貌紧密相关的元素。 首先,我们来谈谈程序员文化。程序员...

    程序员计算器

    程序员计算器能够帮助用户方便地进行这些进制之间的转换,例如将一个十进制数转换成二进制或十六进制字符串,或者将一个十六进制数转换为十进制值。这对于理解二进制数据表示、内存地址、网络协议等至关重要。 2. ...

    程序员教程(程序员考试的相关内容)

    程序员教程和相关考试的一些试题,真题!程序员教程(程序员考试的相关内容)程序员教程(程序员考试的相关内容)程序员教程(程序员考试的相关内容)

    2021年前端程序员的年终工作总结.docx

    2. 团队协作:在团队协作方面,前端程序员学习了团队协作的重要性,明白了人强团则强,人弱团则削的道理,通过团队协作,前端程序员成长了很多,增强了自己的业务素质和工作能力。 3. 个人成长:在个人成长方面,...

Global site tag (gtag.js) - Google Analytics