Dem*_*emi 281 methodology
我正在研究初级(也许是高级)软件工程师的常见错误和不良假设.
你最久以来最终纠正的假设是什么?
例如,我误解了整数的大小不是标准,而是取决于语言和目标.国家有点尴尬,但确实如此.
坦率地说; 你有什么坚定的信念,大致你维持这个假设多久了?它可以是关于编程,编程语言或计算机科学的算法,语言,编程概念,测试或其他任何内容.
Joh*_*nFx 545
很长一段时间,我认为其他人都掌握了所有编程概念(设计模式,最新的新语言,计算复杂性,lambda表达式,你的名字).
阅读博客,Stack Overflow和编程书籍似乎总让我觉得我在所有程序员必须直观地了解的事情上落后于曲线.
随着时间的推移,我意识到我有效地将我的知识与许多人的集体知识进行了比较,而不是一个人,这对任何人来说都是一个相当高的标准.现实世界中的大多数程序员都拥有完成工作所需的知识库,并且他们有一些以上的领域,他们要么很弱,要么完全不知道.
Ins*_*oup 308
人们知道他们想要什么.
在我认为我会与人交谈的最长时间内,他们会描述一个问题或工作流程,我会把它放入代码并自动化.每当发生这种情况时,他们认为他们想要的并不是他们想要的.
编辑:我同意大多数评论.这不是技术上的答案,可能不是提问者所寻求的.它不仅适用于编程.我敢肯定这不是我最长时间的假设,但这是我在过去10年中所学到的最引人注目的事情.我确信这对我来说是纯粹的天真,但是我的大脑是这样的,并且我进入商业世界之前的教学和经历让我相信我会做我所回答的事情.我将能够使用代码和计算机来解决人们的问题.
我想这个答案类似于Robin关于非程序员理解/关心我正在谈论的内容.它是关于将业务学习为敏捷,迭代,交互的过程.它是关于学习编程代码猴子和软件开发人员之间的区别.它是关于意识到两者之间存在差异,并且在该领域非常好,它不仅仅是语法和打字速度.
编辑:这个答案现在是社区维基,以安抚人们对这个答案感到不满,给我代表.
lot*_*har 292
我知道性能问题在哪里没有分析
Dug*_*Dug 232
我应该只有一个函数/方法的退出点.
Rob*_*Day 228
非程序员明白我在说什么.
Jar*_*Par 219
那个无错误的软件是可能的.
Dav*_*ebb 199
私有成员变量对实例是私有的,而不是类.
edr*_*lph 166
我认为静态打字在你的键盘上非常稳定.
Jef*_*nes 162
在开始开发之前,您可以完全理解问题.
Rob*_*per 158
聪明人总比我聪明.
当我犯错误时,我真的可以打败自己,并经常被告知要自我贬低.我曾经对很多开发人员敬畏,并且经常认为,因为他们在X上比我更了解,所以他们比我更了解.
随着我不断获得经验并结识更多人,我开始意识到,虽然他们在特定主题中比我更了解,但他们并不一定比我/你聪明.
故事的道德:永远不要低估你能带到桌上的东西.
Sam*_*Axe 131
在最长的时间里,我认为糟糕编程是发生在边缘的事情......正确地做事是常态.这些天我不是那么天真.
Eve*_*ert 113
我想我应该尽可能地抽象.由于太多交织在一起的功能,我受到了主要的打击.
现在我尝试尽可能保持简单和分离.重构以使抽象的东西比预测我需要抽象的东西容易得多.
因此,我从开发统一它们的框架开始,转向完成工作的功能片段.从来没有回头,除非我想起我天真以为我会成为下一个大事的人.
小智 103
女人觉得计算机程序员性感......
Ian*_*ose 100
软件的质量将导致更大的销售额.有时它会但不总是如此.
Ove*_*hed 82
所有语言(大多数)都是平等的.
很长一段时间以来,我认为选择的语言并没有对开发过程的难度和项目成功的潜力产生太大的影响.这绝对不是真的.
选择正确的工作语言与任何其他单一项目决策一样重要/至关重要.
Cla*_*ols 81
大评论/代码比率是一件好事.
我花了一段时间才意识到代码应该是自我记录的.当然,如果代码不能更清楚,或者有一个重要的原因,为什么要做的事情,这里和那里的评论是有用的.但是,一般来说,最好将评论时间用于重命名变量.它更清晰,更清晰,注释不会与代码"不同步".
Óla*_*age 66
编程是不可能的.
不开玩笑,我一直认为编程是一件不可思议的事情,我总是远离它.当我接近代码时,我永远无法理解它.
然后有一天,我坐下来阅读一些基本的初学者教程,并从那里开始工作.今天我作为程序员工作,我喜欢它的每一分钟.
另外,我不认为编程很容易,这是一个挑战,我喜欢学习更多,没有什么比解决一些编程问题更有趣了.
Pau*_*des 65
"On Error Resume Next"是一种错误处理方式
Chi*_*oft 64
该编程软件需要更高的数学基础.
在我开始编码之前的几年里,我总是被告知要成为一名优秀的程序员,你必须擅长高级代数,几何,微积分,三角等.
十年后,我只有一次不得不做八年级学生不能做的事情.
dan*_*nio 63
优化==用汇编语言重写.
当我第一次真正理解汇编(来自BASIC)时,似乎使代码运行得更快的唯一方法是在汇编中重写它.花了不少时间才意识到编译器可以非常擅长优化,特别是对于具有分支预测等的CPU,它们可能比人类在合理的时间内做得更好.此外,花时间优化算法可能会比花时间从高级语言转换为低级语言更有利.此外,过早的优化是所有邪恶的根源......
Tra*_*irk 63
Mik*_*keJ 58
我会说将日期的年元素存储为2位数是一个折磨整整一代开发人员的假设.在Y2K上吹来的钱非常可怕.
Rob*_*Day 57
插入/冒泡排序以外的任何东西都非常简单.
Ale*_* S. 50
该XML将是一种真正可互操作且可读的数据格式.
Bin*_*ier 48
那个C++本质上比其他所有语言都要好.
这是我在大学提前几年从朋友那里收到的.我和我一起度过了一段令人尴尬的时光(我现在脸红了).只有在与它合作2年左右之后才能看到它们的裂缝.
没有人 - 没有 - 是完美的,总有改进的余地.
Aar*_*ron 47
我相信创建程序就像课堂上讲的那样...你和一群人坐下来,解决问题,提出解决方案等等.相反,现实世界是"这里是我的问题,我需要它解决,"十分钟后你会得到另一个,让你没有时间有效地规划你的解决方案.
ega*_*aga 42
当他们被引入CS课程时,我认为主流设计模式非常棒.在此之前,我已经编程了大约8年的业余爱好,而且我对如何创建良好的抽象我真的没有充分的理解.
设计模式感觉像魔术; 你可以做真正的东西.后来我发现了函数式编程(通过Mozart/Oz,OCaml,后来的Scala,Haskell和Clojure),然后我才明白许多模式只是样板,或者是额外的复杂性,因为语言不够表达.
当然,几乎总有某种模式,但它们在表达语言中处于更高的层次.现在我一直在用Java做一些专业编码,当我必须使用访问者或命令模式等约定而不是模式匹配和高阶函数时,我真的感到痛苦.
gno*_*ice 38
在最初几年我编程时我没有注意到1 Kbyte在技术上是1024字节,而不是1000.我的数据文件的大小似乎与我的预期略有不同,我总是有点困惑.是.
Use*_*ser 36
那个条件检查如下:
if (condition1 && condition2 && condition3)
Run Code Online (Sandbox Code Playgroud)
以未指定的顺序执行......
Pra*_*are 30
我没有评论就能理解我自己的代码!
MrV*_*dez 28
我以为我需要它.
Fog*_*ird 25
像Python或Ruby这样的动态类型语言在某些方面不太适合在大型项目中使用.
MrH*_*Hus 22
这真的很尴尬但是当我开始学习如何编程时,什么都不能让我满意.我想写电子游戏.所有这些书都要我写的不是那些琐碎的小程序.所以我决定我可以轻松地跳过10章而忽略基础知识.
所以我基本上忽略了变量!
问题是我没有识别约定中的关键字:
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
Run Code Online (Sandbox Code Playgroud)
我这样做了一年多,甚至做了3000行的tic-tac-to游戏!那时我非常高兴,直到我在互联网上找到了150行的井字游戏.然后意识到我是个白痴,重新开始.
mik*_*e g 20
Unix和Linux操作系统设计得很好......我应该有资格这个(!)
首先,这种观点得到了以下反反对的强化:
可能更确切地说,它们设计得很好/做得很好,而且肯定是它们的一部分,但即使这只是一个相对判断,相对于一些可怕的Windows版本.以下是一些做得很差的例子:
总的来说,他们需要不必要的专业知 或者说很多知识只有适度的理解.
这并不全是坏事.Linux在政治上更好,而且没有受到业务需求的破坏,但遗憾的是,在很大程度上,许多技术领域已经失去了.
nes*_*983 19
好的,我很早就学会了编程.我14岁左右.我持有各种疯狂的信念,但不要问我精确的时间,因为那是......很久以前.
好的,所以,我相信一段时间,如果你在Java中使用术语同步,那么Java为你解决这个同步的问题
我相信至少半年,可能更多,静态打字会提高性能.
我相信释放一些东西会将内存返回给操作系统.
我相信malloc调用可以归结为检查操作系统上是否有足够的可用空间,因此malloc会很便宜.
我想很长一段时间,Java的构建充分考虑了其他语言的所有优点和缺陷,成为一种"完美融合",可以获得其他语言的最佳属性并拒绝错误.
我极为高估了LinkedLists胜过ArrayLists的案例数.
我认为NP-hardness是一个证据,证明无法有效地解决INSTANCE,这在一段时间内是微不足道的.
我认为在旅行社网站上找到最好的飞行计划需要很长时间,因为"旅行推销员问题",因为我自豪地向我的亲戚笑了(当我小的时候,好吧?!)
可以拿出更多.不知道我坚持了多久.抱歉.
PS:
啊,好吧,这个问题得到的解决不是那么缓慢,但是我看到新手时不时地这样做,所以我觉得你可能会感兴趣:我还认为要存储不确定数量的东西,你需要为每个声明一个新变量.所以我创建变量a1,a2,a3,...,而不是使用一个变量a,我将其声明为一个向量.
Mar*_*ark 19
当我从大学毕业后第一次开始时,我预计更多的高级开发人员会知道他们在做什么.男孩我错了....
Ati*_*son 18
我曾经相信应用程序的大多数工作实际上都是编程.我确信在某些情况下这是正确的,但根据我的经验,我花费更多的时间来研究,记录,讨论和分析,而不是实际编码.(我研究的是运行基于激光的传感器的软件,确定如何最好地控制硬件比编写代码更具挑战性.)
我也常常认为开放的环境是程序员可以看到他们的肩膀,并问他们(通常)旁边的人一个问题是一个程序员团队制定解决方案的最佳环境.事实证明,一个黑暗的孤独的房间更有效率,团队或没有团队.
当我毕业时,我认为专业编程就像在大学编程一样,这意味着我将获得输入和预期输出,并要求填写进行转换的黑盒子.实际上,我必须弄清楚输入,输出和黑匣子.
我不习惯认为营销和销售人员是人类的祸害,如此天真.
TSt*_*per 17
在上线之前没有缺陷是可能的.
这绝对不是真的,即使P2缺陷有时会被打开.
Jam*_*mes 17
代码审查是浪费时间.
从一家完全可选的公司搬到强制性公司(甚至是经过审计的公司)后,我开始了解它们的用处.对代码有第二眼,即使是最琐碎的部分,也可以:
A)当你搞砸了一些微不足道的事情时,你会感到尴尬(例如,一个简单的代码审查会阻止我们在我以前的工作中向我们的客户发送数百封电子邮件)
B)可以教你一开始就不知道的事情(我现在正在学习新图书馆 - 不可避免地在一家大公司,有人已经无意中遇到了你所遇到的问题并且做得更好它 - 只是知道在哪里看的问题)
C)至少要确保自己以外的人知道事情是如何运作的.
最后,我对我提交的代码感到高兴,而不是我以前的工作,尽管那时我认为我知道一切:)
Mif*_*Fox 16
如果条件是每行评估的,如果你编写这样的代码:
Dim a as Boolean = True
If a Then
Console.WriteLine("1")
a = False
Console.WriteLine("2")
Else
Console.WriteLine("3")
End If
Run Code Online (Sandbox Code Playgroud)
然后输出将是:
1
3
Run Code Online (Sandbox Code Playgroud)
Mar*_*wig 16
与UNIX相比,NT操作系统的设计存在缺陷.事实证明,NT内核和设计决策与任何类似现代UNIX的系统都非常相似,而且你在内核中遇到的大多数问题都是由有缺陷的公司编写的第三方错误驱动程序造成的.
Bin*_*ier 15
.NET结构(C#和VB.NET)是引用类型,就像类一样.
在.NET 1.0到达现场之前或之后的某个时刻,我"收到"了那段智慧(我不知道从哪里来,它可能从我脑海中浮现出来,就像宙斯的眉头上的雅典娜一样),以及保持它直到大约4个月前Jon Skeet对概念的消除.
谢谢乔恩.
PS没有相关的编程,但我也相信(直到大约5分钟前)"阿波罗从宙斯的眉头中蹦出来".
Kri*_*son 12
这个:
SomeClass object(initialValue);
Run Code Online (Sandbox Code Playgroud)
还有这个:
SomeClass object = initialValue;
Run Code Online (Sandbox Code Playgroud)
保证在C++中是等效的.我认为第二种形式被保证被解释为好像它已被写成第一种形式.不是这样:请参阅C++初始化语法.
Ben*_*ter 11
我仍然遇到麻烦的一些事情是以下误解 - 即使我知道更好,我仍然试着坚持下去:
Chr*_*utz 11
当我在TI-83上编程时,我以为你无法为自己分配一个变量.所以(忽略这是C代码,而不是TI-BASIC)而不是写作
c = c + 1;
Run Code Online (Sandbox Code Playgroud)
我会写的
d = c + 1;
c = d;
Run Code Online (Sandbox Code Playgroud)
当我了解+=并且++它引起了我的注意.
我的错误假设是:虽然总有一些改进的余地,但就我而言,我和我一样好.
当我第一次上大学的时候,我已经为C编程了6年,对"结构化编程"一无所知,认为"OO"只是一种时尚,并认为"男人,我很好!"
10年后,我在想"好吧,那时候我离我想象的那么远...... 现在我得到了多态性的想法以及如何编写干净的OO程序...... 现在我真的很好" .
所以在某种程度上,我总是真的很好,但也总是得到这样比我之前更好.
在那之后,便士不久就下降了,我终于有了"一些"的谦逊.总是有更多需要学习的东西(尚未用像Haskell这样的纯函数语言编写适当的程序).
在C++中,在很长一段时间,我tkinking该编译器拒绝你给一个当定义为纯虚方法.
当我意识到自己错了时,我感到很惊讶.
很多时候,当我告诉别人为其抽象类提供纯虚拟析构函数的默认实现时,他/她会用大眼睛回顾我.我从这里知道,随后会进行长时间的讨论......似乎一种普遍的看法在C++初学者中有所传播(我也认为自己也是如此......我现在还在学习!)
至少6年来,我确信每个问题都有一个解决方案.
完全没有意识到具有不同复杂性,空间/时间权衡,OOP与功能与命令,抽象级别和不可判定问题的多种算法.当那幸福的天真破灭时,它开辟了一个充满无限可能的世界,只是坐下来建造东西,猛烈砸门.花了很长时间才弄清楚如何选择一个并运行它.
作为一个古老的程序程序员,当我第一次开始用Java编写业余爱好项目时,我并没有真正理解OO.在没有真正理解接口点的情况下编写了大量代码,尝试通过将所有内容强制转换为继承层次结构来最大化代码重用 - 希望Java在事物不适合清理到一个层次结构时具有多重继承.我的代码工作正常,但我现在对那些早期的东西感到畏缩.
当我开始阅读关于动态语言并试图找出一个好学习的语言时,阅读Python的重要空白让我失望 - 我确信我会讨厌它.但是当我最终学习Python时,它变成了我真正喜欢的东西.我们通常使用任何语言来努力以获得一致的缩进级别,但不会得到任何回报(视觉可读性除外).在Python中,我发现在缩进级别方面我没有比以前更多的努力,并且Python处理了我在其他语言中使用大括号或其他任何东西时所做的事情.它让Python现在感觉更干净.
从来没有遇到整数提升...并认为'z'在这段代码中将保持255:
unsigned char x = 1;
unsigned char y = 2;
unsigned char z = abs(x - y);
Run Code Online (Sandbox Code Playgroud)
z的正确值是1
OO不一定比非OO好.
我认为OO总是更好..然后我发现了其他技术,比如函数式编程,并且意识到OO并不总是更好.
那个goto是有害的.
现在我们继续或休息.
我是一个年轻的初出茅庐的开发人员,希望能够做到这一点,因为这是我喜欢的,这是我曾经认为我通过我的简短经验学到的一系列观点是错误的
当你根本没有从逻辑中分离用户界面时,你最终得到的可怕混乱是可以接受的,也是每个人写软件的方式
没有太复杂或抽象的东西
一级一级的责任 - 我从来没有真正拥有这个概念,它对我来说非常有用
当我在卧室里编码时,测试是我不需要做的
我不需要源代码控制,因为它对我所做的项目来说太过分了
开发人员会做所有事情,我们应该知道如何设计图标并制作出令人敬畏的外观布局
处置并不总是需要终结者
发生任何类型的错误时都应抛出异常
例外是针对错误情况,并且很多时候只返回指示失败的值是可以的.我最近才明白这一点,我一直在说它并且仍然会抛出异常更长时间
我写了一个没有bug的应用程序
更多评论更好.我一直试图让我的代码尽可能可读 - 主要是因为我几乎可以肯定是那个能解决这个问题的人.所以在过去的几年里,我曾经在评论段落之后有段落.
最终我突然意识到,有一点需要更多评论 - 无论结构如何整洁 - 没有增加任何价值,实际上变得很难维持.这些天,我采用目录+脚注的方法,每个人都更高兴.
我以前认为Internet Explorer 6盒子模型是一个邪恶的愚蠢想法MS想出来只是为了打破与其他浏览器的兼容性.
很多CSS确信我更合乎逻辑,并且可以使页面设计维护(更改块填充/边框/边距)变得更加容易.
想想物理世界:改变A4页面的填充或边框宽度不会改变页面宽度,只会减少内容的空间.
唯一的本地化/国际化问题是翻译消息.
我以前认为所有其他语言(我没有语言环境的概念)在所有方面都像英语,除了单词和语法.因此,要对一个软件进行本地化/国际化,您只需要让翻译人员将显示的字符串翻译给用户.然后我开始意识到:
即使在今天,我有时也会读到让我感到惊讶的国际化问题.
订阅许多RSS提要,阅读许多博客并参与开源项目非常重要.
我意识到,真正重要的是我花了更多时间进行编码.我有阅读和关注许多博客的习惯,虽然它们是丰富的信息来源,但却无法吸收所有内容.平衡阅读非常重要,更重视练习.
注册.开源,我恐怕不会受欢迎.我曾尝试参与开源,其中大多数都是在.NET中.我很震惊地看到许多开源项目甚至没有遵循适当的架构.我在.NET中看到一个系统没有使用分层架构,而且数据库连接代码遍布整个地方,包括代码背后,我放弃了.
字节码解释语言(如C#或F#)比那些直接编译为机器代码的reset - button-hog慢.
好吧,当我开始相信(在80年代),这是真的.然而,即使在C#中,我有时也会想知道"将内循环放入.cpp文件会不会让我的应用更快").
幸运的是,没有.
可悲的是,几年前我才意识到这一点.