关于方法论:长期存在的错误的编程假设

Long-held, incorrect programming assumptions

我正在对初级(可能是高级)软件工程师的常见错误和不良假设进行一些研究。

你最长期坚持的最终被纠正的假设是什么?

例如,我误解了整数的大小不是标准,而是取决于语言和目标。说起来有点尴尬,但确实如此。

坦率地说,你有什么坚定的信念,你大概坚持了多久?它可以是关于一个算法、一种语言、一个编程概念、测试,或者其他关于编程、编程语言或计算机科学的东西。


很长一段时间以来,我一直认为其他人都非常精通所有编程概念(设计模式、最新的语言、计算复杂性、lambda表达式,等等)。

阅读博客、栈溢出和编程书籍似乎总是让我觉得我落后于所有程序员凭直觉必须知道的事情。

随着时间的推移,我意识到,我正在有效地将我的知识与许多人的集体知识进行比较,而不是单个人,这对任何人来说都是一个相当高的标准。现实世界中的大多数程序员都有一个知识库,这些知识是他们完成工作所必需的,并且他们有许多薄弱或完全不了解的领域。


人们知道他们想要什么。

在我认为我会和人们交谈的最长时间里,他们会描述一个问题或工作流程,我会将其放入代码中并自动化。事实证明,每次发生这种情况,他们认为他们想要的并不是他们真正想要的。

编辑:我同意大多数意见。这不是一个技术性的答案,也可能不是发问者想要的答案。它不仅适用于编程。我相信这也不是我最长期坚持的假设,但这是我在短短10年里学到的最引人注目的事情。我确信这对我来说是纯粹的幼稚,但是我的大脑是如何连接起来的,在进入商界之前我的教学和经验让我相信我会做我回答的事情;我能够使用代码和计算机来解决人们的问题。

我想这个答案类似于罗宾关于非程序员理解/关心我所说的。它是关于将业务作为一个敏捷、迭代、交互的过程来学习的。它是关于学习成为编程代码猴子和成为软件开发人员之间的区别。这是为了认识到两者之间存在着差异,要想在这个领域表现出色,不仅仅是语法和打字速度。

编辑:这个答案现在是社区维基,以安抚人们对这个答案的不安。


我不需要分析就知道性能问题在哪里


我应该只有一个函数/方法的出口点。


那些非编程人员明白我在说什么。


那个无bug软件是可能的。


私有成员变量对实例是私有的,而不是类。


我以为静态打字在你的键盘前很安静。


在开始开发之前,您可以完全理解一个问题。


聪明人总是比我聪明。

当我犯错误的时候,我真的可以痛打自己,而且经常因为自嘲而被训斥。我曾经敬畏地看着很多开发人员,并且经常假设,因为他们在X上比我了解得多,所以他们比我了解得多。

随着我不断积累经验和结识更多的人,我开始意识到,虽然他们在某个特定主题上比我了解得更多,但他们并不一定比我/你聪明。

故事的寓意:不要低估你能带来什么。


很长一段时间以来,我认为糟糕的编程是发生在边缘地带的事情。做正确的事是正常的。我这几天没那么天真。


我认为我应该朝着尽可能抽象的方向前进。我被这门主修课击中了,因为太多的功能交织在一起了。

现在我试着让事情尽可能简单和分离。重构使某个东西变得抽象要比预测我需要如何抽象某个东西容易得多。

因此,我从开发一个管理它们的框架,转向完成工作的功能片段。永远不要回头,除非当我想到我天真地以为自己会成为下一件大事的时候。


女人觉得电脑程序员很性感…


软件的质量将带来更大的销售量。有时会,但并非总是如此。


所有的语言(大部分)都是平等的。

很长一段时间以来,我认为选择的语言在开发过程的困难和项目成功的潜力上并没有太大的区别。这绝对不是真的。

为工作选择正确的语言与任何其他单个项目决策一样重要/关键。


大的注释/代码比率是一件好事。

我花了一段时间才意识到代码应该是自记录的。当然,如果代码不能更清晰地表达,或者有一个重要的原因需要做一些事情,那么这里和这里的注释是很有帮助的。但是,总的来说,最好将注释时间花在重命名变量上。它更干净、更清晰,并且注释不会与代码"不同步"。


那个程序是不可能的。

不是开玩笑,我一直认为编程是不可能学的东西,我总是远离它。当我接近代码时,我永远无法理解它。

然后有一天,我坐下来,读了一些初级教程,并从那里开始工作。今天我作为一个程序员工作,我喜欢它的每一分钟。

另外,我认为编程并不容易,这是一个挑战,我更喜欢学习,没有什么比解决一些编程问题更有趣的了。


"on error resume next"是一种错误处理


这种编程软件需要在高等数学中有很强的基础。

在我开始编写代码之前的几年里,人们总是告诉我,要成为一名优秀的程序员,你必须擅长高等代数、几何、微积分、三角函数等。

十年后,我只做过一次八年级学生做不到的事情。


优化==用汇编语言重写。

当我第一次真正理解程序集(来自基本)时,似乎唯一能使代码运行更快的方法就是在程序集中重写它。花了好几年时间才意识到编译器可以很好地进行优化,特别是使用具有分支预测等功能的CPU时,它们可能比人类在合理时间内所做的工作做得更好。另外,花时间优化算法可能比花时间从高级语言转换为低级语言更能让您赢得胜利。同时,过早的优化也是万恶之源…


  • 公司管理人员关心代码的质量。
  • 越少的线越好。


我会说,将日期的年份元素存储为2位数是一个困扰着整整一代开发人员的假设。在千年虫上爆炸的钱是相当可怕的。


除了插入/气泡排序之外的任何东西都是非常简单的黑暗魔法。


该XML将是一种真正的可互操作和人类可读的数据格式。


C++在某种程度上本质上优于所有其他语言。

这是我大学几年前从一个朋友那里收到的。我把它随身带了很长时间(我现在脸红了)。只有在用了2年左右的时间之后,我才能看到它们的裂缝。

没有人——也没有什么——是完美的,总是有改进的空间。


我相信创建程序就像课堂上教的一样……你和一群人坐下来,讨论一个问题,提出一个解决方案等等。相反,现实世界是"这是我的问题,我需要它解决,走",十分钟后你得到另一个,让你没有时间有效地计划你的解决方案。


当主流设计模式被引入到一个CS类中时,我认为它们很棒。在那之前,我有8年的编程作为业余爱好,我对如何创建好的抽象没有很好的理解。

设计模式就像魔术一样,你可以做一些非常整洁的事情。后来,我发现了函数式编程(通过mozart/oz、ocaml、后来的scala、haskell和clojure),然后我明白了许多模式只是样板,或者说是额外的复杂性,因为语言表达能力不够。

当然,几乎总有一些模式,但在表达语言中,它们的层次更高。现在我在Java中做了一些专业编码,当我不得不使用一个约定,如访问者或命令模式,而不是模式匹配和高阶函数时,我真的感到痛苦。


在我开始编程的前几年里,我没有注意到1千字节在技术上是1024字节,而不是1000字节。我总是有点困惑的事实,我的数据文件的大小似乎有点偏离我的预期。


这种情况检查如下:

1
if (condition1 && condition2 && condition3)

以未指定的顺序执行…


如果我单独执行它,我的编程会更快更好。


"项目将在2周内完成"

"这需要2个小时才能实现"


我可以不加评论地理解我自己的代码!!!!


我想我需要它。


当我还是新手的时候,有一个假设是,在这个领域工作多年的人会自动成为更好的开发人员。


像python或ruby这样的动态类型语言在某种程度上不适合用于大型项目。


这很尴尬,但很长一段时间以来,我并没有真正理解引用类型和值类型之间的区别。我想你必须使用ref关键字来改变一个不同方法中的对象。

这是我应该知道的最基本的概念之一。


这真的很尴尬,但当我开始学习如何编程时,没有什么能让我满意。我想写电子游戏。不是所有这些书都要我写的那些小程序。所以我决定我可以很容易地跳过10章而忽略基础知识。

所以我基本上忽略了变量!

问题是,我无法从约定中识别关键字:

1
2
3
4
5
Car car = new Car(); //good
Car test = new Car(); //wrong must be lowercase car!

for (int i = 0; i < 10; i++) //good
for (int test = 0; test < 10; test++)//wrong must be i

我这样做了一年多,甚至做了一个井字游戏,游戏3000行!当时我对自己的惊人感到兴奋,直到我在网上找到了150行的井字游戏。然后意识到我是个白痴,又重新开始了。


Unix和Linux操作系统设计得很好…我应该把这个限定为!!)

首先,这种观点被如下反真理重新灌输:

  • 随后开发的每一个操作系统最终都对Unix进行了糟糕的重新设计(据说Lisp也是如此,在这里它更为真实)。
  • 构成"Unix哲学"的规则列表。这并不是说它们是错误的,这意味着Unix本身密切关注它们。

也许更确切的说法是,它们设计得很好/做得很好,而且它们的某些部分确实是,但即使这只是一个相对的判断,相对于一些糟糕的Windows版本而言。以下是一些做得不好的例子:

  • 配置混乱,临时平面文件配置不好
  • C编程语言早就应该被(像D)所取代了。
  • shell脚本是精神分裂症。它不适合开发,因为它是为快速打字而设计的速记。
  • 目录结构的名称不正确
  • GNU工具链是不必要的奥术
  • 一般目的总是胜过特殊目的的信念

总的来说,他们需要不必要的专业知识来操作。或者更确切地说,很多知识中只有适度的理解。

这并不都是坏事。Linux在政治上更好,并且没有被业务需求破坏,但遗憾的是,在很大程度上,许多技术高地已经丧失了。


编程很简单。


好吧,我很早就学会了编程。我14岁左右。我有各种疯狂的信仰,但不要问我确切的时间安排,因为那是很久以前的事了。

  • 好的,我相信,如果你使用Java中的术语同步,那么Java为你解决了这个nas-同步的事情。

  • 我相信至少半年,更可能的是,静态输入可以提高性能。

  • 我相信释放一些东西会将内存返回到操作系统。

  • 我相信malloc调用可以归结为检查操作系统上是否有足够的可用空间,所以malloc是便宜的。

  • 我认为Java是用其他语言的所有优点和缺点建立起来的,成为一种"完美的混合",它将采用其他语言的最佳属性并拒绝错误。

  • 我大大高估了LinkedList优于ArrayList的案例数量。

  • 我认为NP硬度是一个证明,在一段时间内,没有一个实例能有效地解决,这是非常错误的。

  • 我以为在旅行社网站上找到最好的飞行计划要花很长时间,因为"旅行推销员问题",我骄傲地轻声笑着对我的亲戚们说(我小的时候,好吗?!)

可能会想出更多。不知道我贴了多久。对不起的。

PS:啊,好吧,这一个清理得不那么慢,但我看到新手不时这样做,所以我认为你可能感兴趣:我还认为,要存储不确定数量的东西,你需要为每个都声明一个新的变量。所以我会创建变量a1,a2,a3,…,而不是使用一个变量a,我会把它声明为一个向量。


当我从大学毕业后第一次开始工作时,我希望更多的高级开发人员会知道他们在做什么。我错了吗?


那是一个9-5的工作


我曾经认为,应用程序的大部分工作实际上是编程。我相信在某些情况下这是真的,但在我的经验中,我花更多的时间研究、记录、讨论和分析,而不是实际的编码。(我在操作激光传感器的软件上工作,确定如何最好地控制硬件比编写代码更具挑战性。)

我也曾认为,开放的环境,程序员可以越过他们的肩膀,问他们(通常)旁边的人一个问题,是最好的环境,一个程序员团队制定出一个解决方案。事实证明,一个黑暗的孤独的房间更有效率,团队或没有团队。

当我毕业时,我假设专业编程就像大学里的编程,这意味着我将得到输入和预期输出,并被要求填写完成转换的黑匣子。实际上,我必须计算出输入、输出和黑盒。

我以前不认为营销和销售人员是人类的祸害,太天真了。


代码审查是浪费时间。

我已经从一家完全可以选择的公司转移到一家强制(甚至是审计)的公司,我开始理解他们的有用性。在代码上有第二组眼睛,即使是最琐碎的部分,也能:

a)当你把一些琐碎的事情搞砸的时候,省去你的尴尬(例如,一个琐碎的代码审查就可以阻止我们在我以前的工作中向我们的客户发送数百封电子邮件)。

b)可以教你一些你一开始不知道的东西(我在目前的工作中学习过新的图书馆——不可避免的是,在一家大公司里,有人已经偶然发现了你遇到的问题,并且做了更好的工作来解决它——这只是知道该往哪里看的问题)

c)至少要确保你以外的人知道事情是如何运作的。

最后,我在这里提交的代码比我以前的工作中提交的代码更快乐,尽管那时我认为我什么都知道。)


在投入使用之前,没有缺陷是可能的。

这绝对不是真的,即使是p2缺陷有时也会被打开。


与UNIX相比,NT操作系统的设计存在缺陷。结果表明,NT内核和设计决策与任何现代类Unix系统都非常相似,您在内核中遇到的大多数问题都是由Buggy公司编写的第三方Buggy驱动程序造成的。


如果每行都对条件进行了评估,并且编写了这样的代码:

1
2
3
4
5
6
7
8
Dim a as Boolean = True
If a Then
    Console.WriteLine("1")
    a = False
    Console.WriteLine("2")
Else
    Console.WriteLine("3")
End If

那么输出将是:

1
2
1
3


字节和字符实际上是一样的-"ASCII"只是一种将字节值映射到屏幕上的字形的方法。

读到Unicode真的让我大开眼界(尽管我还不完全理解)。


我是个好程序员!


NET结构(C和VB.NET)和类一样,都是引用类型。

我在.NET 1.0出现之前或之后不久的某个时候"收到"了这句智慧(我不知道从哪里来的,它可能从我的头脑中突然出现了,就像宙斯额头上的雅典娜一样),并且一直保留着它,直到大约4个月前乔恩·斯基特(Jon Skeet)对这一概念的理解失效。

谢谢乔恩。

P.S.与编程无关,但我也相信(直到大约5分钟前)"阿波罗从宙斯的眉毛上跳了出来"。


总有一天我会有一个现实的想法,那就是构建一些非平凡的代码/系统/任何东西需要多长时间。


我曾经假设它足以编程Win32应用程序。

而且,每个程序都必须有一个GUI,因为命令行"过时了"。


我能读懂它并完成任何工作。


我认为提高数据库性能所需要做的就是将数据库置于第三种正常形式。


对象方向始终是设计源代码的最佳方式,并且永远是。


这就是:

1
SomeClass object(initialValue);

而这:

1
SomeClass object = initialValue;

保证在C++中是等价的。我以为第二种形式一定会被解释成第一种形式。不是这样:参见C++初始化语法。


有些事情我仍然有困难,是以下的误解-我仍然尝试和坚持他们,即使我知道得更好:

  • 所有利益相关者都将客观地做出软件设计决策。那些没有参与编写代码的人做出各种决策完全基于对我们开发人员来说并不总是有意义的情感。
  • 项目预算总是有意义的——我见过很多公司很乐意(例如)多年来每月减少50000美元,而不是支付250000美元在6个月内完成一个项目。政府一个人如果不花掉他们的年度预算,他们就会损失掉——所以他们会花掉的,不管是地狱还是高水位。有多少项目资金浪费在这样的事情上让我吃惊。
  • 你应该总是为正确的工作使用正确的工具-有时这个决定不在你的手中。有时,从高处下来,"你应该使用X技术"这个项目,让你想到"wtf!谁想出了那个可笑的主意?"…付你薪水的那个人,就是那个人,现在把事情办好。
  • 编程思想首先出现,其他一切都是次要的。事实上,为了拿到你的工资支票,最后期限和业务目标都需要得到满足。有时你做最坏的决定是因为你没有时间做正确的决定…就像有时这个词会出现在你的舌尖上,但回忆起来的每一分钟都会让你选择一个不同的、不那么理想的词。不总是有时间去做正确的事情,有时候只有时间去做,不管怎样。因此,所谓有经验的开发人员经常使用反模式,他们必须在软件明天交付给最佳客户的演示截止日期前10分钟找出解决问题的方法。

当我在TI-83上编程时,我以为你不能给它自己分配一个变量。所以(忽略这是C代码,而不是TI-BASIC)而不是编写

1
c = c + 1;

我会写

1
2
d = c + 1;
c = d;

当我了解到+=++的时候,我的脑子里都乱了。


IDES会更快。


我应该总是优化我的代码。这并不是说我在写之前不应该仔细考虑它,而是我应该认真考虑如何从每个语句中挤出每一点性能,甚至牺牲可读性。


我的错误假设是:虽然总有改进的空间,但在我的情况下,我是一个非常好的程序员。

当我刚从大学毕业的时候,我已经用了6年的时间编写了C语言,对"结构化编程"了如指掌,认为"oo"只是一种时尚,认为"伙计,我很好!"

10年后,我在想:"好吧,那时候我还没有像我想象的那样好……现在我了解了多态性的概念以及如何编写干净的OO程序…现在我真的很好了"。

所以不知何故,我一直都很好,但也总是比以前好得多。

在那之后不久,硬币就掉了,我终于有了"一些"的谦逊。总是有更多的东西需要学习(还没有用像haskell这样的纯功能语言编写一个合适的程序)。


我想我10岁的时候,有人说服我有一台计算机能够在3秒内运行一个无限循环。


XML名称空间(或者更糟的是,格式良好)在某种程度上比试图不使用它们更困难。

一个非常常见的错误,即使在W3C!


我确信,至少6年来,每个问题都有1个解决方案。

完全不了解具有不同复杂性的多个算法、空间/时间权衡、OOP与功能性与命令性、抽象层次和不可判定问题。当幸福的幼稚被打破时,它打开了一个充满可能性的世界,砰地关上了门,仅仅是坐下来建造一些东西。我花了很长时间才弄明白如何挑选一个,然后带着它跑。


在C++中,在很长一段时间里,我在编译一个纯虚方法的定义时拒绝编译器。

当我意识到自己错了的时候,我很惊讶。

很多时候,当我告诉别人为抽象类提供其纯虚拟析构函数的默认实现时,他/她都会用大眼睛看着我。从这里我知道接下来会有一个很长的讨论…这似乎是一个普遍的信念有点在C++初学者中传播(我也认为我自己)。我现在还在学习!)

维基百科链接到C++的纯虚方法


  • 我的同事因为他们很差劲而产生了被认为是坏代码。我花了一段时间才知道我应该先看看到底发生了什么。大多数时候,糟糕的代码是由于缺乏管理、客户不想检查他们真正想要的东西并开始改变他们的想法,就像没有明天一样,或是其他任何人都无法控制的循环,比如经济崩溃。
  • 客户要求"昨天"的功能,因为他们很愚蠢:不是真的。是关于沟通。如果有人告诉他们一切都能在一周内完成,你猜怎么着?他们一周后就要了。
  • "永远不要更改有效的代码"。在我看来,这不是件好事。你显然不需要改变真正有效的东西。然而,如果你从来没有改变过一段代码,因为它被认为是有效的,而且它太复杂而无法改变,那么你可能最终会发现代码并不是真的在做它应该做的事情。我看到一个销售佣金计算软件做了两年的错误计算,因为没人想维护这个软件。没人知道这件事。这个公式太复杂了,他们不知道怎么核对数字。


G'Day.

我只是在设计和编写代码。

无需收集、记录或支持需求。

干杯,


作为一个老的程序程序员,当我第一次在Java中为一个爱好项目开始编程时,我并没有真正理解OO。编写了大量代码而不真正理解接口的要点,试图通过强制所有东西进入继承层次来最大化代码重用,希望当事物不适合于一个层次结构时,Java具有多重继承性。我的代码运行正常,但我现在对那些早期的东西退缩了。

当我开始阅读动态语言,并试图找到一个好的学习方法时,阅读关于Python重要的空白区的内容让我感到厌烦——我确信我会讨厌这一点。但当我最终学会了Python时,它成了我真正喜欢的东西。我们通常用任何语言努力保持一致的缩进级别,但没有得到任何回报(除了视觉可读性)。在python中,我发现在缩进级别方面,我没有像以前那样做更多的工作,而python处理了我在其他语言中必须使用大括号之类的东西。它现在让我觉得Python更干净了。


我曾经认为InternetExplorer6盒子模型是微软想出的一个邪恶的愚蠢想法,只是为了打破与其他浏览器的兼容性。

很多CSsing让我相信它更符合逻辑,并且可以使页面设计维护(更改块填充/边框/页边距)更加容易。

想想物理世界:改变A4页面的填充或边框宽度不会改变页面宽度,只会减少内容的空间。


C++是最酷的语言!


我是一个年轻的开发人员,希望能专业地完成这项工作,因为这是我喜欢的,这是一份我曾经认为通过我短暂的经历所学到的观点的清单,是错误的。

当你根本不把用户界面和逻辑分开时,你最终会遇到的可怕的混乱是可以接受的,也是每个人编写软件的方式。

没有太复杂或抽象的东西

一级责任感-我从来没有真正有过这个概念,这对我来说非常强大。

测试是我在卧室里编码时不需要做的事情。

我不需要源代码管理,因为它对我做的项目来说是多余的。

开发人员做每件事,我们应该知道如何设计图标和制作好看的布局。

处置并不总是需要决赛选手

每当发生任何类型的错误时都应引发异常

异常是针对错误情况的,并且很多时候只返回一个指示失败的值是可以的。我最近才明白这一点,我一直在说这句话,而且还在抛出异常的时间更长。

我可以编写一个完全没有错误的应用程序


不要使用高级实现特定的功能,因为您可能希望"某个时间"切换实现。我一次又一次地这样做,几乎总是没有发生过这种转变。


我最近才发现,在一个你好的世界里,有超过一百万条指令被执行!我写的C++程序。我从来没有想到会有这么简单的一句话


以前从未见过整数提升…并认为"z"在代码中可以容纳255个字符:

1
2
3
unsigned char x = 1;
unsigned char y = 2;
unsigned char z = abs(x - y);

Z的正确值为1


OO并不一定比非OO好。

我认为OO总是更好的。然后我发现了其他技术,比如函数式编程,并认识到OO并不总是更好的。


评论越多越好。我一直在努力使我的代码尽可能的可读——主要是因为我几乎可以肯定,我会修复我让它溜走的bug。所以在过去的几年里,我常常有一段又一段的评论。

最终,我明白了,有一点,更多的评论——不管结构多么整齐——毫无价值,实际上变成了维护的麻烦。这些天,我采用目录+脚注的方法,每个人都为此感到高兴。


我们作为软件工程师可以理解用户真正想要什么。


唯一的本地化/国际化问题是翻译消息。

我曾经认为,除了单词和语法之外,所有其他语言(而且我没有语言环境的概念)在所有方面都像英语。因此,要本地化/国际化一个软件,您只需要让一个转换器翻译显示给用户的字符串。然后我开始意识到:

  • 有些语言是从右向左写的。
  • 一些脚本使用上下文格式。
  • 日期、时间、数字等格式的变化很大。
  • 程序图标和图形对某些人来说可能毫无意义或具有攻击性。
  • 有些语言有不止一种"复数形式"。

甚至在今天,我有时读到一些令我吃惊的国际化问题。


那是有害的。

现在我们要么继续要么中断。


我的学校教育能使我为从事这一领域的工作做好准备。


"这次会成功的"


像JAVA和.NET这样的虚拟机架构,除了性能问题外,基本上是没有价值的,除了玩具项目。

(好吧,公平地说,也许在某一点上是真的。)


这是理解语言的字节码(C或F #样#)是比那些将复位按钮,直接编译到机器代码的猪。

好的,当我开始相信有个(80),这是真的。然而,甚至在我有时想C #时报"如果穿成一个内部回路。CPP文件会让我更快的CRP应用程序")。

的NO。

是的,我只是意识到,几年前。


我想我对编程中的某种语言/主题了如指掌。只是不可能。


我以前认为我是个很好的程序员。担任该职位2年。

当你在真空中工作时,很容易填满房间-d


现在流行的$标志作为Java/JavaScript标识符的一部分是非法的。


订阅许多RSS源、阅读许多博客和参与开源项目是很重要的。

我意识到,真正重要的是我花了更多的时间进行编码。我有阅读和跟踪许多博客的习惯,虽然它们是丰富的信息来源,但要吸收所有的东西是不可能的。平衡阅读,更加注重实践是非常重要的。

规则。开源,恐怕我不会受欢迎。我尝试过参与开源,其中大部分都在.NET中。看到许多开源项目甚至没有遵循正确的体系结构,我感到很震惊。我在.NET中看到一个系统没有使用分层体系结构,数据库连接代码到处都是,包括代码,我放弃了。


  • 编程语言==编译器/解释器
  • 编程语言==ide
  • 编程语言==标准库

经理们知道他们在谈论什么。


学习语言只是学习语法,也是标准库中最常见的部分。


假设我将使程序100%完成并且没有错误,并将其报告为"已完成"。有时,当有许多漏洞需要首先获得市场份额时,公司希望发布这个程序。


在早期,大多数个人电脑都有一个盒式磁带接口来装载和存储程序。我现在没有电脑,但我可以阅读所有我能接触到的与电脑有关的东西(主要是杂志)(这是70年代后期,我没有互联网)。出于某种原因,我觉得程序是直接从盒式磁带上执行的,计算机有任何RAM的唯一原因是在程序运行时存储变量。我认为当代码必须执行跳转指令时,它会以某种方式将磁带倒带或前进到正确的位置,然后从那里继续。


当我完成了CS学校的学习后,我就可以开始一份工作,并将我在学校学到的知识用于实际应用。(我真希望我不要浪费4年的时间来学习操作系统和Prolog)


ASCII以不同的方式存储到二进制


在查询性能方面,SQL WHERE子句中整数的位比较实际上是免费的。

事实上,前50万行左右的情况是这样的。在那之后,它被证明是非常不自由的。


这是一个程序开发人员/程序员unfamiliar SQL和关系数据库不需要任何正式训练或理解如何与和或使用一个快速的SQL和SQL读什么样傻瓜足够是足以在与工作的关系数据库SQL Server,Oracle和样条。

远太多的错误处理在一个应用程序的所有数据存储在关系数据库Oracle和SQL Server样是由涂料造成的理解和如何使用关系数据库SQL langauge大学;.

我过去工作的一个软件供应商,谁的心理都是开发者需要SQL傻瓜书或东西similiar和他们将配备到任何关系数据库句柄的问题。现在的客户和供应商有计量在这本学习SQL的知识缺乏是一个字节来围绕在负反馈的方式。它不只是坏的表演查找和插入或更新和问题,但实际是A本身的数据库设计这是一个真正的障碍。

所有的,它已经avoided和进入成本,如果她现在正经受铅处理的发展与关系数据库SQL会在同样的水平,尊重他们,他们是一个langauge与内置的应用程序。

不要因为它的解散sql为不重要。你最终要回到。你也许可以离开它一会儿,但你不想最终击中年破点,在那里你可以的"T的进度没有完全重新设计您的数据库,这是当成本是最高的。


很长一段时间(大约5年),我认为PHP很受欢迎。

我想我知道算法。然后我加入了topcoder.com


总是有一种"正确"的做事方式。大学毕业后,我坚持这个假设太久了。

当然,我开始意识到,完成一项任务的方法总是很多的。每种方法都有优点和缺点。查看可用的信息,做出决定,然后确保你可以向你的老板证明这一点。


我需要定义函数开始时将使用的所有变量(pascal样式)。

我曾经认为我需要考虑到我的函数要使用的所有资源,并在开始编码之前对它们进行定义,这可能是因为我的第一种语言是Pascal,而这正是我的需求所在。然后,当我移到C时,我将定义仅在那些循环外部的循环中使用的临时变量,而不考虑循环范围,这样"所有的东西都将在开始时定义"。

我花了几年的时间才明白,提前定义所有资源并不是一头冬青树,范围界定本身对代码可读性极其重要。


当我第一次听说"鸭子打字"时,我以为"鸭子打字"实际上是"管道打字",就像人们常说的"鸭子胶带"。"duck-typing"听起来有点不对,"duct-typing"有点奇怪(拼凑在一起)。


这个程序是为年轻人设计的,最好的项目经理是那些不能编程的人。


我可以花上几天的时间来减少我的业务层使用的内存量,只是后来才意识到我的项目的WinForms(GUI)使用的内存是应用程序其余部分的4倍。


作为我所写代码的所有者,我是唯一应该理解或触摸它的人。


人们会关心最佳实践,甚至是一致性。


你从来没有完成你没有开始的项目。

看起来真的很愚蠢,但我推迟了这么多项目,因为规模太大了。刚完成一个庞大的项目,我意识到如果我意识到它的范围,我就永远不会开始。然而,在现实中,即使是最复杂的系统,当分解成离散的、定义明确的部分时也是相当简单的。然而,从宏观层面来看,它很快就会压倒一切。


alt text http://images.destrop.com/products/demotivators/teamwork.jpg


每个人都想为一个问题生成最好的最可行的代码…


其他人都在使用最新最伟大的技术,而我的团队是唯一一个坚持使用劣质过时工具的团队。(除了神秘的科博恐龙)


回到我的C++时代(很多头发之前),我被Java学者包围着。当被问到C++优于Java的时候(通常是一个我试图忽略的问题,但你要去的话),我会在我的答案中包含C++给你的引用和指针。Java的人看起来不相信,建议引用是指针,然后把我从房间里嘲笑出来。我坚持C++中的引用和指针是不同的。

公平地说,我是对的。引用和指针在语义和语法上是不同的。不幸的是,我用一个谬论来支持我的主张:底层实现是不同的。

我坚信,通过标准化,引用在语法中是名称别名,就像typedef是没有存储的类型别名一样。

我确信引用不是对象,也没有存储空间,它们只是提供了从"name"到"object"的多个顶级映射。在这方面,我认为它们就像文件系统中的软链接:

1
2
3
4
5
6
7
8
9
10
11
Code: int a = 3; int& b = a;

 Names          Objects           Memory

+-----+     +-------------+     +-------+
|  a  |---->|             |     |       |
+-----+     |             |     |       |
            |     int     |---->|   3   |
+-----+     |             |     |       |
|  b  |---->|             |     |       |
+-----+     +-------------+     +-------+

当然,尽管优化可能会导致这种情况,但引用确实有存储空间。它们是不同的对象,即使语法尽最大努力从程序员那里抽象出来。

可以这么说,我很失望地知道,关闭优化的编译器可能实现一个指针引用,需要一个取消引用操作:我实际上创建了一个文件系统中硬链接的类比:

1
2
3
4
5
6
7
8
9
10
11
Code: int a = 3; int& b = a;

 Names          Objects           Memory

+-----+     +-------------+     +-------+
|  a  |---->|     int     |---->|       |
+-----+     +-------------+     |       |
                                |   3   |
+-----+     +-------------+     |       |
|  b  |---->|     int&    |---->|       |
+-----+     +-------------+     +-------+

标准C++实际上并不指定如何实现引用,所以我的理论对于某些工具链可能成立,但它不在任何主流编译器中。标准中当然没有规定。


在学校里,你被教导编程是"读输入,处理数据,写输出"。实际上,很少有处理步骤——大多数编码只是"读取输入,输出"

一般来说,它要么是"从用户读取,写入数据库",要么是"从数据库读取,显示在屏幕上"。这两个案例涵盖了你将要做的95%的工作。


在不浪费一个字节或一个CPU周期的情况下制作高效的程序是如此重要。

但是有了更多的经验,它不是关于字节或CPU周期的,而是关于思想流的,连续的,不间断的,很像一首诗。

基本上,不要太用力。


上大学时(90年代中期),他们在计算机实验室里只有Windows3.11机器(我知道,怪学院)。

有一段时间,我认为作为一个专业的程序员,只有Windows平台才与我相关,从历史的学术角度来看,所有其他平台都是有趣的。

从学校毕业后,我学习了现代的Unix和Linux环境,我不禁对我的跛脚学校感到愤怒和失望。

我还不敢相信我毕业于一个计算机工程学位,从未见过bash shell,甚至没有听说过emacs或vim。


从大学时代起,我就认为自己是编程大师。因为我可以编码,但其他人不能。但当我加入一家公司时,我对基础知识的无知让我震惊。我对自己的所有假设都是错误的!现在我知道我需要知道什么和不知道什么了!


C/C++中IF语句的评价顺序是编译器特定的。所以写作:

如果(指针!=空)&;(指针->dosomething())

不安全,因为评估顺序可以交换。我最近发现(经过多年的胡言乱语之后)它是ANSI-C规范的一部分,您可以保证订单及其完全安全。

詹姆斯


通过暗示顾客想要什么来满足他-不幸的是,这意味着顾客知道他想要什么。


其他人会像我一样被已知的bug困扰,并且会把修复它们作为项目工作的优先事项。


代码越少越好。现在我知道,如果代码行更易于阅读/理解,那么有时候就有更多的代码行是值得的。


OOP的好处是可以重用对象,而实际上,它是通过创建一个具有相同接口的新对象来重新启动其余代码。

实际上,对象可能是代码的2%,所以重用只会给您带来2%的好处。真正的好处是通过创建一个新的对象来重用其他98%的代码,该对象允许所有其他代码完全不同。现在您可以重用98%的代码。很值得花3倍的时间来写一个物体。

例如,如果您有一个绘图程序,突然有了一个新的形状,您希望能够绘制,只需更改shapeobject(同时保持接口不变)。程序中没有其他内容需要更改。


这些测试只是拖延的另一种方法。


Python是一个不切实际的、令人讨厌的语言(我仍然可以读一些关于我早期代码的评论,抱怨它),C++是唯一真正的面向对象语言。

我错得太厉害了,还是觉得很羞愧。


我将永远成为其他人富有的编程软件


我不需要快速重构面向对象的代码。马丁·福勒终于睁开了我的眼睛。


我教我自己通过阅读C K R &;不幸的是,我没有读它和Word for Word是错过了一些事情。我写我自己的版本的malloc和calloc(我和我周围的人,从工作到工作,因为我不明白,你只是在一个现有的库链接。我做的这几年,有人问我这是什么东西,为什么我carting亩左右,"以……你知道你只是在现有的链接库,对吗?"


我最长的(也是最昂贵的)错误假设是:"企业的需求是健全和合理的,我只是还不理解它们。"

100 green assumptions sitting on the wall,
and if one green assumption should accidently fall,
there'd be 99 green assumptions sitting on wall.

交替地:

Humpty dumpty sat on the wall.
Humpty dumpty had a great fall,
and all kings horses and all the kings men,
said Effim, he's only a tech.


在卡诺地图的编程中,我永远也找不到一个实际的用途。我在计算机科学课程中学习过。


我总是假设任何为任何语言编写代码的人都使用编辑程序。

我正在和我的一个客户合作,他让我主要作为支持,并为他写一些更复杂的东西。好吧,有一天他把文件弄乱了,太棒了。他不小心把自己的工作省了三个多小时,当我问他为什么不经常存钱时,他回答说:"因为我没有完成。"当然,这不是一个可以接受的答案,我戳了戳,再戳了戳。我终于发现他从来没有用过任何编辑程序!甚至连notepad.exe都没有!他一直在使用一个在线的CPanel文件编辑器!它甚至没有"查找"功能。他无法保存,直到他完成,因为他正在编辑现场文件!

不用说我被吓了一跳,他至今仍在使用CPanel编辑器…


结果表明,在Linux下检查内存分配是否返回引用并不重要,因为它实际上是在欺骗您,将来某个时候实际分配内存,或者在没有所需内存的情况下完全中止程序。


通过学习一门精确的科学,我不需要提高我有限的社交技能。


该PHP的mysql_fetch_行是从执行的SQL查询中检索数据的唯一方法。

老实说,我编写了一个完整的Web应用程序,没有使用mysql-fetch-u数组,每次我想更改函数以添加额外的列时,都必须更改一组数字。


学习正则表达式会节省你的时间


我摸索着编程。通过研究SICP的书,我发现我什么都不知道。至少现在我正在深入研究编程。


我以前认为我永远不会像MS开发人员那样像顶级开发人员那样编程,但现在我认为我可以编写相同的干净代码,甚至更好。


这种优雅的编程和自动化相结合,是一种很好的老式测试的替代品。


如果你看不懂我的代码,你就是不懂语言。我做了一些代码审查,试图反驳这一点。

花了几年多的时间来了解你的代码有一个神奇的时间和地点,它在库中,而不是在应用程序中。这个应用程序是为了清晰易读。当隐藏在扩展方法和框架之后时,最好使用magic。


假设我写的代码非常好,并且尽可能没有错误,这是我能做的最好的事情。事实证明,有时候经理们更喜欢那些努力成为自己最喜欢的人,而不是那些做得好的人。


所有OOP语言都有相同的面向对象的概念。

  • 一个Java EDCOX1 0!=方法的接口。
  • Java接口是需要多重继承的特定语言解决方案。Ruby的Mixins试图解决相同的问题。
  • JavaScript中框中继承的继承与Java如何实现继承非常不同。

如果您已经彻底测试了代码,则不需要进行错误处理。


您可以在它的构造函数中使用MeSt集(这个,0,sieOf(对象)),没有负面的后果。


适合系统编程的语言必须支持[可变]变量。


只有程序员才能轻松地创建成功的应用程序。软件还涉及易用性、美观、文档和适当的营销。软件开发是多学科的,一门学科的失败很可能导致应用失败。


营销人员关心你的工作。


您需要一个客户机规范来完成一个项目。从销售会议和记事本开始的次数比没有多。当然,在会议结束时,他们希望有一个最后期限,"只是胡说八道"。


我从来没想过我会成为一名专业的程序员,我以为我会和电子产品一起工作。但最终,程序设计变得容易多了,而且报酬也高了很多,所以从一份兼职开始的工作就成了我的主要工作。


这些变量实际上只是内存中特定区域的名称。


WTF总是一个糟糕的专业人士的证据。

事实上,我最近已经意识到在我的职业生涯中,我投入了多少WTF,但当StackOverflow向我展示它们只是另一个软件度量标准时,我感到欣慰。


总是没有足够的时间在最后期限前完成。


代码行越多,软件就越好。


我最大的先入之见是,我可以按照自己的意愿进行编程。当然,后来我离开了大学,受雇于一家有着荒谬框架、规则和程序的公司,这不仅意味着我没有按我想的方式编程,而且意味着我的编程很糟糕。


常见的错误假设:"代码质量是次要的"。更糟糕的假设是:"代码质量一点也不重要。"

代码质量可以是一个非常广泛的概念。我在这里把它讲得很彻底。


我以为Windows3.1只是一个玩纸牌的平台。DOS是basica的平台。


我可以说服传统的程序程序员为什么OOP经常提供更好的解决方案。

也就是说,描述世界的语言需要能够描述复杂对象及其关系。

争论通常包括关于抽象类的无稽之谈,对此我的回应是"并非所有的OOP程序员都刚从uni毕业,仍然对抽象着迷"。或者经典的"在OOP中没有什么是我不能用严格的过程编程做的",我通常这样回答,"这不是你能做的,而是如果你有一个更广泛的工具集,你是否会做"。

我已经学会接受他们并不是通过我的镜头来看待世界。


这是临时的解决方案是不是永久性的解决方案
或者换句话说:它们是不是永远:))。


这是....who JUnit测试是有效的,当需要设置断点?当测试应用程序在调试模式)。后来我意识到为什么…


这种简单性几乎总是胜过复杂性。吻——保持简单愚蠢的规则。

编辑:正如乔治在下面说的,我把这个颠倒了。我一定是在回答中迷失了方向。如果正确使用,简单性几乎总是使代码更好。


  • 我以为我会连续8小时编码。事实上,我每天有4个小时的编码时间,1个小时的午餐时间,1个小时的咖啡休息时间,2个小时的闲聊时间/闲聊时间/翻来覆去。

  • 在工作之前,我以为所有的客户都是白痴,对电脑一无所知。那个男孩是我错了。有时候,我们得到的项目是那些比我们做得更好的人,他们只是没有时间去做。

  • 我觉得小隔间不好,现在我喜欢它们:我真的从一个有门的办公室搬到了一个小隔间。我喜欢开放。

  • 所有的程序员都不是运动员。我以为我是唯一一个去健身房的人。在我工作的地方,每天早上5点至少有10个人去健身房。

  • 我以为不会有女程序员。我们的几条线索是女士。


一家经营大量高知名度/高流量网站的公司实际上知道他们在做什么。结果,他们大多数时候都是一无所知,而且非常幸运地处在他们所处的位置上。所以我想道德应该是,

扎实的软件工程和最佳实践!=业务成功

或者…

最关键的软件系统==crap


我一直认为,要成为一个好的程序员,必须了解系统的所有内部工作。我为我不知道关于语言的一切而感到羞愧,比如在你开始编码之前它的库、模式、代码片段。嗯,我不再那么天真了。


这是令人尴尬的,但我一直认为嵌套方法调用或进行多个方法调用比创建一个变量来将每个方法调用的值存储在C_中更节省内存。


不是最长举行时间,但在某个时间点和几年内,我:

  • 认为微软Windows是世界上唯一的操作系统(1992年)
  • 了解DOS已经足够拥有"高级"操作系统知识。

这就是为什么我高中没有选择"计算机课程"的原因。我以为我对电脑已经了解得够多了。

后来在大学,出于我的错误:

  • 我认为Unix操作系统/程序是完美的,DOS/Windows永远不会接近它(当时它看起来是如此的真实,我猜在Al的Linus也是这样想的,这就是为什么Linux与Unix非常相似而不是……其他操作系统)

最后,在很长一段时间里,我认为:

  • 只有我的软件烂透了,商业软件也完美无缺,因为…它是"商业"软件
  • 美国的软件/工程师/产品是卓越的代名词,任何外部的东西都只是拙劣的尝试。


Java将对象的副本传递给函数,而不是引用。

换句话说,我认为如果您将一个对象传递到一个方法中,然后以某种方式更改该对象,它不会更改调用范围中的对象。我总是将对象传递到方法中,操纵它们,然后返回它们!


软件工程师总是诚实地知道他们现在在做什么,或者在过去对你的软件做了什么。


我以为这会是一次坐过山车的旅行,有快车、散漫的女人、私人飞机和大胆的越轨行为。等我找到那个职业顾问……


80年代初,当我开始玩电脑时(zx81有1K的内存),我花了几个小时从杂志上输入大量的机器代码(字节,不是人类可读的汇编语言),基本上使用poke指令。

我相信如果我输入了一条错误的指令,那么我就必须回到开始,从一开始就重新开始输入机器代码。


规格齐全、齐全


640K应该足够任何人使用(DOS)。多年来,许多人都普遍相信这一点。

我第一次拥有一个内存为8MB的系统时,我认为这远远超出了我的需要。运行操作系统(Mac)和我使用的所有应用程序(Word、电子邮件、火狐等)。


人们实际上关心正在使用的技术(开源/闭源)。


线程进程


可以互换的HTML元素id和name属性。

结果显示,具有'name'属性的元素是相关的/使用的。posts等引用了'id'属性,dom引用了'id'属性。


理解指针和递归性将非常困难。

vb6中的整数的大小与.NET不同。

VB6可以进行位级操作。

专业的程序员制作的软件很少出错。


运行时性能至关重要。总的解决时间通常是最重要的。

自从学习了python之后,我已经摆脱了对静态输入的依赖。


在可预见的将来,我写的每一篇文章都会在某个时刻失败。

不是说所有的事情最终都不会崩溃,而是在我的编程教育早期,当我发现尝试的时候……抓住障碍……我把所有的东西都包在其中……如果失败了,会比我的程序处理的问题要严重得多(例如,北极和南极已经换了位置)。


我不知道javascript中被0除的东西是无穷大的(IEEE754算术)。最近很难学会。


窗户上的线很便宜。

结果证明这只是有点真实。一个线程有一定的开销,需要自己的地址空间,在那里它可以生存并快乐。因此,如果我发现自己在一个应用程序中处理几十个线程,我会问自己如何简化并将所有内容合并为更少的线程。


分析和性能分析是一样的。

然后我发现,虽然分析人员比什么都没有要好,但包含错误的假设,例如:

  • 只有聚合才重要,而不是细节
  • 在定位性能问题时,统计精度是必要的。
  • 测量时间和定位不必要的耗时操作是一样的。


标识列不能包含重复值:SQL Server中的标识列


我认为编写足够好的软件是一项简单的任务


您无法诊断生产中的"间歇性错误"。重新启动服务器是修复它的唯一方法。

也许在我早期的ASP编码中更真实。但是有很多很好的分析工具可以发现内存泄漏和其他奇怪的问题。Perfmon还提供了许多良好的诊断数据。另外,您应该将诊断日志编码到应用程序中。


我们的开发方法之所以被选择和使用是因为它们是最好的品种。

然后我发现我们使用的工具对我们做了什么、什么时候做以及我们是如何做的影响比我想象的要大得多。


那个OOP已经过时了:(我仍然后悔直到今天。


学习一门全新的语言真的很难。


如果我有一个强大的静态类型系统,比如ml或haskell中的系统,我应该使用它来编码尽可能多的不变量。只有有了经验,我才知道有时候让不变量是动态的更好。


我知道要写一个合适的网络应用程序,当我必须设计出能在所有浏览器中工作的东西时,我很清楚这一点。


完整的Unicode支持是成功地将软件部署到亚洲地区的先决条件。


因为我在我的"标准"环境中构建了软件,它可以在每个人的机器/服务器上工作。结果发现我安装了一些不知名的库和服务,它们实际上正在被使用。然后发现我利用了一个bug,这个bug后来被修补了。


是:

1
for (int i = 0; i < myObj.variable; i = i + 1)

得到了优化:

1
2
int j = myObj.variable;
for (int i = 0; i < j; i = i + 1)

哇,我停在函数调用放在地方的时候,我意识到,他们正在运行的每一次!

原因:

1
2
3
4
5
6
7
for (int i = 0; i < myObj.variable; i = i + 1){
    if (function_argument == NULL){
        myObj.variable++;
    } else {
        printf("%d", myObj.variable);
    }
}

不一样的是:

1
2
3
4
5
6
7
8
int j = myObj.variable;
for (int i = 0; i < j; i = i + 1){
    if (function_argument == NULL){
        myObj.variable++;
    } else {
        printf("%d", myObj.variable);
    }
}

任意的例子,但你可以看到我们如何优化变更执行。


销售人员实际地管理客户期望。(接受承诺不足和交付过度的培训)

软件需求通常来自市场调查。


他说他懂编程,一定是真的!


维度n是维度(n+1)的一个实例,当它们相等时。


一个程序最终可以解决所有的问题。


当然,你可以看看FindBugs和PMD,但这些是我最喜欢的Gojas和Tokes(所有Java):

字段不被覆盖,它们被隐藏。

没有明确的super.super访问。

没有定义构造函数的类具有隐式零参数构造函数。今年我犯了一个实际错误。

要获取对内部类父类的引用,可以使用语法"outer.this"来消除方法调用或同步的歧义。

类是C++中的"自己的朋友",该类的任何实例的私有方法和字段都可以引用同一类的任何方法,甚至静态方法。这将使我早期的clone()和copy构造函数变得更简单。

受保护的方法和字段可以在扩展类的静态上下文中访问,但前提是该类位于同一个包中。我很高兴flex.messaging.io.amf不是一个密封的包。


当我在初中学习算法的时候,我认为npc只是一个非多项式问题,这意味着这个问题的复杂性不比多项式简单。直到我在大学里学习了计算理论,我才意识到我错了。


以为我是唯一一个能写代码的人…当我需要这个程序时,我记不起我做了什么,只需复制/粘贴我自己的代码。

现在,我知道每个人都这么做。


"kyralessa:值得一个处理器是在组装/机器语言中,它可能是一个比其他的函数返回的来电,而在离开堆栈状态良好。事实上,有各种情况,这可以是有用的。我看到一个变化,第一个6502甚至更好,但它是一个Z80,打印消息的文本是在常规的印刷后立即调用指令执行后,会恢复终结者(或零,当作为一个轻微的优化使用Z80的终结者,在零位置,让零。作为一个没有执行字节P是更便宜比试图避免它)。

它是有趣注意,在许多现代语言,函数有一个正常的退出点(这将恢复执行的呼叫,但以下)可以在通过改变异常退出。甚至在C,可以使用setjmp和longjmp的搜索/模拟行为。


我将永远用VB编程,现在我是C。


Java是慢的。那么多Perl Fan Bois on Slashdot Revurgate(SP???)这,它的悲伤。