软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答


11
我应该停止使用术语C / C ++吗?
我了解C和C ++是不同的语言,但是当我学习C ++时,总是被告知C是C ++的子集,或者C ++是带有类的C。在C ++ x0,C ++ 11(或现代的C ++ 11/14/17)问世之前,这都是事实。实际上(特别是在嵌入式系统上工作时),很可能会发现用C ++编写的代码,但是很多部分完全是用纯C语言编写的。这里我有几个问题: 我应该停止使用术语C / C ++吗? 如果对#1的回答是肯定的,那么我将如何调用混合使用C和C ++的程序? 鉴于这两种语言都是“不同的”语言,C ++编译器很可能在某些时候停止支持用C语言编写的代码(因为现代c ++在指针,动态内存处理等基本内容上与C思维方式有所出入) 现在制定C / C ++标准的人员之间是否存在任何协作以保持兼容性 如果#4是肯定的,那么这种合作可能会在不久的将来随着现代c ++的出现而结束(11/14/17) 我知道已经有类似的问题,但是我敢肯定,很多人都会分享这些问题,因此我非常有兴趣获得良好的答案,尤其是在不久的将来与C ++趋势有关的观点。
140 c++  c  terminology  c++11 

6
具有单个引用的私有方法是否不好?
通常,我使用私有方法来封装可在类中多个位置重用的功能。但是有时我有一个大型的公共方法,可以将其分解为更小的步骤,每个步骤都使用自己的私有方法。这会使公共方法更短一些,但我担心强迫任何读取该方法的人跳到不同的私有方法会损害可读性。 对此有共识吗?拥有较长的公共方法,还是将它们分解成较小的块(即使每个块都不可重用)会更好吗?

8
我如何让人们停止骑车流洒(专注于琐事)?
我的任务是教其他团队一个新的代码库,但是我一直遇到问题。每当我真正与人一起阅读代码时,在整个练习进行到无谓骑车(组织成员对琐碎问题的重视不成比例)之前,我们就走得很近。由于他们不了解代码库,但是认为他们需要帮助改进代码库,因此他们将重点放在可以理解的方面: Why is that named that? (2分钟以解释为什么如此命名,10分钟以内辩论一个新名称) Why is that an abstract base class rather than an interface? (2分钟的解释时间,超过10分钟的时间辩论该决定的相对价值) ...等等。现在,请不要误解我的意思-好的名字和好的,一致的设计很重要,但是我们永远也不会讨论代码的实际作用或如何以任何有意义的方式设计系统。我做了一些会议裁判,以使人们摆脱这些切线,但是他们走了-对固定琐碎琐事的代码将会/应该的注意力分散了,他们错过了更大的前景。 因此,我们稍后再试一次(或在代码库的其他部分进行尝试),由于人们没有足够的知识来克服自行车脱落的影响,因此重复进行。 我试过更小的群体,做大组,密码,白板,Visio图表,文字的巨墙,让他们只是把它认为死刑,立即切断短...参数帮助一些比别人多,但没有任何作品。地狱,我什至试图让团队中的其他人对此进行解释,因为我认为这可能是我不善于解释事物。 那么,您如何对其他程序员进行足够的教育,以使他们不再专注于琐碎的事,并可以对设计做出有意义的贡献?

11
有太多的单元测试吗?
我的任务是为现有应用程序编写单元测试。完成第一个文件后,我有717行测试代码和419行原始代码。 随着我们增加代码覆盖率,这个比率会变得难以管理吗? 我对单元测试的理解是测试类中的每个方法,以确保每个方法都能按预期工作。但是,在请求请求中,我的技术负责人指出我应该专注于更高级别的测试。他建议测试该类最常使用的4-5个用例,而不是详尽地测试每个功能。 我相信我的技术主管的评论。他比我拥有更多的经验,并且在设计软件时具有更好的直觉。但是,多人团队如何针对这种含糊的标准编写测试;也就是说,我怎么知道我的同龄人和我对“最常见的用例”有相同的想法? 对我来说,100%的单元测试覆盖率是一个崇高的目标,但是即使我们只达到50%,我们也知道那50%的覆盖率达到了100%。否则,为每个文件的一部分编写测试将留出很大的作弊空间。
139 unit-testing  tdd 

15
为什么像Java,Javascript和C#这样的内存管理语言保留了“ new”关键字?
newJava,Javascript和C#等语言中的关键字会创建类的新实例。 该语法似乎是从C ++继承的,在C ++中该语法new专门用于在堆上分配类的新实例,并返回指向该新实例的指针。在C ++中,这不是构造对象的唯一方法。您还可以在不使用new-的情况下在堆栈上构造一个对象,实际上,这种构造对象的方式在C ++中更为常见。 因此,来自C ++背景,newJava,Javascript和C#等语言中的关键字对我来说似乎很自然并且很明显。然后,我开始学习没有new关键字的Python 。在Python中,只需调用构造函数即可构造实例,例如: f = Foo() 最初,这对我来说似乎有点不对劲,直到我想到Python没有理由拥有它new,因为所有内容都是一个对象,因此无需区分各种构造函数语法。 但是后来我想new-Java 的真正意义是什么?我们为什么要说Object o = new Object();?为什么不只是Object o = Object();呢?在C ++中,绝对需要new,因为我们需要区分在堆上分配和在堆上分配之间的区别,但是在Java中,所有对象都在堆上构造,那么为什么还要使用new关键字呢?对于Javascript,可能会问同样的问题。在我不太熟悉的C#中,我认为new在区分对象类型和值类型方面可能有一些用途,但是我不确定。 无论如何,在我看来,C ++之后的许多语言只是“继承”了new关键字-并不需要它。它几乎像一个残余关键字。我们似乎出于任何原因都不需要它,但是它在那里。 问题:我对此是否正确?还是有一些令人信服的理由new需要以C ++启发的内存管理语言(例如Java,Javascript和C#)而不是Python?

14
什么时候不进行单元测试?
我在一家小公司工作,担任单人开发人员。实际上,我是该公司唯一的开发人员。我有几个(相对)定期编写和维护的大型项目,但是没有一个项目可以支持它们。在开始新项目时,我经常想知道是否应该尝试TDD方法。这听起来是个好主意,但老实说,我永远无法证明所涉及的额外工作。 我努力工作以在设计中具有前瞻性。我意识到,肯定有一天另一位开发人员将不得不维护我的代码,或者至少要对其进行故障排除。我将事情保持尽可能简单,并评论和记录难以掌握的事情。而且事实是,这些项目没有那么大或太复杂,以至于一个体面的开发人员很难理解它们。 我看到的许多测试示例都涉及细节,涵盖了代码的所有方面。由于我是唯一的开发人员,而且我非常接近整个项目中的代码,因此遵循写后手动测试模式的效率要高得多。我还发现需求和功能的变更足够频繁,以至于维护测试会给项目增加相当大的阻力。原本可以用来解决业务需求的时间。 因此,我每次都得出相同的结论。投资回报率太低。 我偶尔会进行一些测试,以确保我正确编写了算法,例如根据员工的聘用日期计算他们在公司的工作年限。但是从代码覆盖率的角度来看,我已经涵盖了大约1%的代码。 在我的情况下,您是否仍会找到一种使单元测试成为常规做法的方法,还是我有理由避免这种开销? 更新: 关于我的情况,我遗漏了一些东西:我的项目都是Web应用程序。为了覆盖我的所有代码,我必须使用自动化的UI测试,在这个领域中,与手动测试相比,我仍然没有太大的收获。
138 unit-testing  tdd 

7
搜索如何适合RESTful接口?
在设计RESTful接口时,请求类型的语义被认为对设计至关重要。 GET-列表收集或检索元素 PUT-替换集合或元素 POST-创建集合或元素 DELETE-好吧,erm,删除集合或元素 但是,这似乎没有涵盖“搜索”的概念。 例如,在设计一套支持求职网站的Web服务时,您可能具有以下要求: 获取个人招聘广告 GET来domain/Job/{id}/ 创建招聘广告 发布到domain/Job/ 更新职位广告 PUT到domain/Job/ 删除招聘广告 删除到domain/Job/ “获得所有工作”也很简单: GET来domain/Jobs/ 但是,工作“搜索”如何落入这种结构? 您可以声称这是“列表集合”的变体,并实现为: GET来domain/Jobs/ 但是,搜索可能很复杂,完全有可能产生一个生成长GET字符串的搜索。也就是说,在这里引用SO问题,使用GET字符串的长度超过2000个字符存在一些问题。 一个示例可能是多面搜索-继续“工作”示例。 我可能会在以下方面进行搜索-“技术”,“职位名称”,“学科”以及自由文本关键字,工作年龄,位置和薪水。 凭借流畅的用户界面和大量技术和职务,搜索可以包含大量方面的选择是可行的。 通过将此示例调整为简历而不是职位,可以带来更多的方面,您可以很容易地想象出搜索时选择了100个方面,甚至只是40个方面(每个方面50个字符)(例如,职务,大学名称,雇主名称)。 在那种情况下,可能需要移动PUT或POST,以确保将正确发送搜索数据。例如: 发布到domain/Jobs/ 但是从语义上讲,这是创建集合的指令。 您也可以说这将表示为搜索的创建: 发布到domain/Jobs/Search/ 或(如下面的燃烧语法所建议) 发布到domain/JobSearch/ 从语义上看,这似乎很有意义,但是您实际上并没有创建任何东西,而是在请求数据。 因此,从语义上讲,这是一个GET,但不能保证GET支持您所需要的。 因此,问题是-尝试尽可能地遵循RESTful设计,同时确保我保持在HTTP的限制之内,最适合搜索的设计是什么?

25
人们不工作是“正常的”吗?
大学毕业后,一年多以前,我被聘为初级程序员。我很快注意到我比其他所有程序员都快了几个数量级。这似乎是因为我根本不浪费时间“一般”。但是,大多数其他人似乎喜欢凝视天花板,浏览YouTube,Facebook和随机网站,并且通常一天之内就能完成我通常在一个小时内完成的工作。我100%确信,如果他们集中精力,他们也将能够在一小时内完成这项工作。 我已经迅速晋升为高级开发人员,最近又晋升为团队负责人,现在我以新员工取代了很多这样的人(还有几个人要去)。现在情况可以接受,但我仍然认为情况会好得多。 但是我不禁注意到,每个人的举止似乎都是“正常的”。我所有的老板都不在乎这一点,他们似乎也几乎没有工作。我一直很难找到它们,它们到达的时间比预期的要晚得多,并且要提早离开。显然,在这种情况下我无能为力,因为它们凌驾于我之上,但这是所有公司的“规范”,还是我只是以非常糟糕的经历而告终(这是我的第一次工作经历)? 另外,几年后我会“变得像他们一样”吗?
137 productivity 

2
Python文件命名约定?
我已经看到了PEP-8的这一部分https://www.python.org/dev/peps/pep-0008/#package-and-module-names 我不清楚这是否指向模块/类/包的文件名。 如果我每个都有一个示例,文件名是否应该全部使用小写并带有下划线?或者是其他东西?

10
关于发展深厚的编程知识
有时,我会看到有关堆栈溢出的边缘情况和其他怪异的问题,这些问题很容易被Jon Skeet和Eric Lippert之类的人回答,这显示出对该语言及其许多复杂性 的深入了解,例如: 您可能会认为,要使用foreach循环,要迭代的集合必须实现IEnumerable或IEnumerable<T>。但是事实证明,这实际上不是必需的。所要求的是,集合的类型必须具有称为的公共方法GetEnumerator,并且必须返回具有称为的公共属性getter Current和MoveNext返回a 的公共方法的某种类型bool。如果编译器可以确定满足所有这些要求,则将生成代码以使用那些方法。仅当不满足这些要求时,我们才会检查对象是否实现IEnumerable或IEnumerable<T>。 这是很酷的事情。我能理解为什么埃里克知道这一点。他在编译器团队中,所以他必须知道。但是那些表现出如此深厚的知识而不是内部人的人呢? 凡人(不是C#编译器团队成员)如何找到类似这样的东西? 具体来说,这些人是否使用方法来系统地扎根此类知识,对其进行探索并对其进行内部化(使其自己拥有)?
136 code-quality 

13
设计模式会皱眉吗?
我与从事此业务20年的一位高级开发人员进行了讨论。他在安大略省以撰写博客而闻名。 他告诉我的事情很奇怪:他说,有一段代码是一场噩梦,因为它是从一本教科书中编写的,并不说明现实世界。将新字段添加到UI /数据库/数据层需要2-3个小时,而在他的代码中则需要30分钟。 另一件事是,他避免使用设计模式,因为大多数程序员都不了解它们,并且从维护的角度来看它们也不是很好。 还有一种想法是,加拿大的大多数Web开发人员都希望其数据模型继承自Data Layer类,而不是保持隔离状态。我问他:“将模型与数据层分开不是行业标准吗?” 他有时说,但是这里的大多数人不愿意这样做,因为这工作太多。 听起来他之所以不使用最佳实践进行编码,是因为这是一场维护噩梦,很少有员工了解(除了我自己),如果您需要在几天内推出新功能或新领域,工作起来会很慢。时间。 考虑到Stack Overflow主要鼓励人们遵循行业标准,听到这样的意见真是太奇怪了。我们是否被迫在几天之内不断推出新的领域和功能,以至于无法推断出足够灵活的坚实模式呢?这似乎是我从中了解的要点。 您如何看待这些陈述?

10
什么时候强制垃圾回收是个好主意?
因此,我正在阅读一个有关强制C#垃圾收集器在几乎每个答案都相同的地方运行的问题:您可以做到,但您不应该这样做-除了一些非常罕见的情况。可悲的是,那里没有人详细说明这种情况。 您能告诉我在哪种情况下强制垃圾回收实际上是一个好主意吗? 我不是在询问C#的特定情况,而是询问所有具有垃圾收集器的编程语言。我知道您不能在所有语言(例如Java)上强制使用GC,但让我们假设可以。

17
从不存在返回值的函数/方法中返回NULL或空值更好吗?
我在这里寻找建议。我正在努力在不存在返回值或无法确定返回值的情况下从方法返回NULL还是返回空值更好。 以以下两种方法为例: string ReverseString(string stringToReverse) // takes a string and reverses it. Person FindPerson(int personID) // finds a Person with a matching personID. 在中ReverseString(),我会说返回一个空字符串,因为返回类型是字符串,因此调用者期望得到。同样,通过这种方式,调用方将不必检查是否返回了NULL。 在中FindPerson(),返回NULL似乎更合适。无论是否new Person()返回NULL或空的Person Object(),调用者都必须在对其进行任何操作(如调用UpdateName())之前检查一下Person对象是否为NULL或为空。因此,为什么不只在此处返回NULL,然后调用方只需检查NULL。 还有其他人为此感到挣扎吗?任何帮助或见解表示赞赏。

8
C ++比D有什么优势?
我最近一直在学习D,并且开始对这种语言有所了解。我知道它提供了什么,我还不知道如何使用所有东西,并且我对D习语等不了解很多,但是我正在学习。 我喜欢D。这是一种很棒的语言,以某种方式对C进行了巨大的更新,并且做得很好。似乎没有一个功能可以“实现”,但实际上是经过深思熟虑和精心设计的。 您会经常听到D是C ++ 应该是的(我要问的是每个人都应该自己决定是否这样做,以避免不必要的火焰战争)。我还从几位C ++程序员那里听说,他们对D的喜欢远超过C ++。 我自己,虽然我知道C,但是我不能说我知道C ++。如果有人认为C ++比D 作为语言要好,那我想听听他们都知道C ++和D的东西(这不是通常的“它具有更多的第三方库”或“有更多的资源”或“需要C ++的工作多于D”。) D是由一些非常熟练的C ++程序员(在D社区的帮助下)由Walter Bright和Andrei Alexandrescu设计的,旨在解决C ++所遇到的许多问题,但是到底有没有真正变得更好的东西?他错过了什么吗?您认为不是更好的解决方案吗? 另外,请注意,我所说的是D 2.0,而不是D 1.0。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.