我正在对初级(也许是高级)软件工程师所犯的常见错误和错误假设进行一些研究。

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

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

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


当前回答

在我刚开始学习c++的时候(很多时候),我周围都是Java学者。当被问及c++相对于Java的优势时(我通常会认为这是一个做作的问题,但就是这样),我会在我的回答中包括c++提供了引用和指针。Java的家伙会看起来难以置信,并建议引用是指针,并把我笑出了房间。我坚持在c++中引用和指针是不同的。

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

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

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

Code: int a = 3; int& b = a;

 Names          Objects           Memory

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

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

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

Code: int a = 3; int& b = a;

 Names          Objects           Memory

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

标准c++实际上并没有指定引用应该如何实现,所以我的理论可能适用于一些工具链,但在任何主流编译器中都不适用……当然标准中也没有说明。

其他回答

这种编程是不可能的。

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

然后有一天,我坐下来阅读了一些基本的初学者教程,并从那里开始学习。现在我是一名程序员,我热爱工作的每一分钟。

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

Windows中的线程很便宜。

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

做事总有一种“正确”的方式。大学毕业后很长一段时间,我一直抱着这个想法。

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

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

不用分析我就能知道性能问题出在哪里