我最近被分配到一个新的高性能C++项目(金融学),和其他三个人,比如我,把自己称为“主要是C/C++程序员”,意思是,我们所有人都做过Java和其他东西,我们都有类似的经验(8到10年),并且成功地合作了其他项目(不是C/C++)。
我很快发现,当谈到我们的“母语编程语言”时,我们有着不同的心态,这不仅会危及项目的顺利完成,还会危及团队/办公室的整体福祉。具体地说:
它们来自电气工程/自动化/理工类背景,因此它们的推理与硬件的工作方式、字节的移动方式、处理器的工作方式、指令缓存,通常是底层的所有内容密切相关。他们做了嵌入式编程,ARM编程(我几乎不知道这些是什么)。我很快发现他们的实际经验大多是C,而不是C++。他们从程序上思考,而不是面向对象。
另一方面,我训练自己以一种更抽象的方式思考,应用诸如封装、低耦合/高内聚力等原则来创建可重用的模块化软件。我的专长是C++编程语言,重点是语言结构,它可以帮助您获得快速和可重用的通用代码。我认为设计模式,习语,概念。在开发软件的9年中,我始终看到软件系统的可维护性非常差,这是团队的首要负担。我慷慨地记录了我的代码,编写了仔细的接口。我采用模板元编程作为获得快速和可重用产品的一种方法。我接受新的C++11标准特性。
在我看到可重用性和松散耦合的地方,他们看到了“复杂”。他们想“看到一切”。他们希望看到char*,而不是接口方法中的某些缓冲区类。有一次,有人甚至说:“如果你的实现看起来很复杂,我不在乎你的接口有多简单”。问题是,我们真的在尝试从单一的系统风格过渡到可重用的系统--我们正在编写一个库。然而,他们不希望他们的C风格的结构被模板化的方法、类型防御和c- to所污染,即使它们都不让它们的结构非POD。他们也不希望看到static_assert(std::is_pod<...>)。他们喜欢备忘录和指针,并且通常远离引用。他们倾向于认为打字机是邪恶的。
我真的试着让他们看到一个抽象的东西。它是代码以及它所操作的数据。出于必要,库需要定义一些接口,以便用户能够将其插入到更大的产品中。他们倾向于把这些接口看作是我的代码要求他们的代码按照我的意愿行事/看上去的方式,不允许他们按自己的方式做事,但实际上并没有告诉我他们无法获得的特定功能。
别搞错了,在表演方面,我不是无知的。我了解缓存行、分支预测、方法虚拟化的开销、堆分配、哈希查找。我很擅长算法的复杂性(尽管这在这里并不重要)、数据结构、内联和其他一些编译器优化(比如RVO )。我相信,使用现代编译器,一个可重用、分层的OOP C++产品,只要仔细编写和优化,就可以达到C专用单片产品性能的10%以内。
我真的相信我们会在思想上互相补充。
你的想法是什么?请不要太苛刻,我们需要把这件事做好。
发布于 2014-05-14 05:52:02
好吧,我要对这件事大做文章,因为还没有其他人。
我的经验可能有点相似。一年多前,我从软件部门转到了工作场所的嵌入式软件部门,我肯定听到了你在这里表达的情感的呼应。
下面是我所做的一些观察,这些都是你在这里列出的内容。这些代表了不同群体的观点。
我的一般外卖?嵌入式/EE背景常常带来较低的架构能力(特别是大型系统),而软件背景更倾向于对不重要的事情更敏感,更注重理论上提高性能,而不是衡量和改进性能。你的里程可能会不同。
从团队建设的角度来看,我发现建立对相互观点的尊重是至关重要的。这是我的目标,我认为已经走了很多路。
从C++使用的角度来看,我想提出一些可能是痛苦的建议。请从我注意到的软件和嵌入式软件方法不同的角度来看待所有这些,而不是仅仅作为一篇关于风格的值得燃烧的社论。
当然,你在一个房间里放了两个程序员,你得到了三个意见。我意识到了。但是在嵌入式软件和软件之间的界限上,我注意到了这一点。我希望它们能有所帮助。(但为了以防万一,我已经先发制人地穿上了这套耐热西装。)
最后一件事。从建立相互尊重和敬佩的角度来看,半途而废,或许看看模板寄存器访问之类的事情,并就这样的事情展开友好的讨论,也许不会有什么坏处。
https://softwareengineering.stackexchange.com/questions/238749
复制相似问题