软件工程

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

12
作为年轻的开发人员,我应该担心在工作中必须使用“过时的”技术吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 我是应届毕业生(去年五月!)。当我还在学校时,我想确保自己在毕业之前有一份工作,而且很早(可能太早)在求职中,我定了一个我希望本科毕业后要搬到的地区。 但是,由于几个原因,我几个月来一直在猜测这个决定。一个是我在工作中并没有受到很大的挑战,而且我觉得自从从这里开始以来,我在编程方面并没有太大的进步。不过,我总是可以抽出时间来从事开源工作(过去有过工作),所以我确实有一个机会来解决这一失望的问题。更重要的是,我担心我的工作基本上是在一个破旧的Perl Web应用程序上工作(使用Mason和一个奇怪的内部ORM)。 我是不是通过使用不再流行的技术来打我自己的脚,将来真的无法帮助我找到工作吗?我很少看到Perl的工作,而当我这样做时,通常是做我不感兴趣的事情(前端Web开发的东西)。 系统编程,可视化,网络编程或至少后端Web开发方面的东西是我真正喜欢的工作类别-似乎我目前的工作经验并没有帮助我完成这些工作。
11 legacy  perl 

6
与单一责任原则作斗争
考虑以下示例: 我有一个网站。它允许用户发布帖子(可以是任何内容)并添加描述帖子的标签。在代码中,我有两个代表帖子和标签的类。让我们称这些类Post和Tag。 Post负责创建帖子,删除帖子,更新帖子等。 Tag负责创建标签,删除标签,更新标签等。 缺少一项操作。标签到帖子的链接。我正在努力与谁应该执行此操作。它在任何一个类别中都同样适用。 一方面,Post该类可以具有一个将a Tag作为参数的函数,然后将其存储在标签列表中。另一方面,Tag该类可以具有将a Post作为参数并将链接Tag到的函数Post。 以上只是我的问题的一个示例。实际上,我遇到了多个相似的类。两者都可以很好地融合在一起。除了实际上在两个类中都包含功能之外,还存在哪些约定或设计风格可以帮助我解决此问题。我假设必须要挑选一个呢? 也许将它们放在两个类中都是正确的答案?

6
什么时候会放弃向后兼容,而支持新的和改进的接口实现?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我在同一家软件公司工作了十多年。结果,我已经使用各种面向对象的编程语言实现了大型代码库。当我刚开始我的职业生涯时,我是一名初学者,对良好的界面和类设计原则了解不多。我想认为我的设计技能已经随着时间的推移而得到了提高,但是由于对后向兼容性的考虑,现在在改进我的早期代码方面面临越来越多的困难。我的代码已被许多客户用作我公司销售产品的一部分。 我的问题是:什么时候应该停止尝试保持旧接口的向后兼容性并硬着头皮去支持实现一种全新的设计? 我认为,保持向后兼容性成为一个沉重的负担,以致无法对接口进行有用的更改。有谁遇到过类似的问题,谁可以提供一些反馈?

4
在提交消息中引用错误/问题是否被视为良好做法?
我正在一个项目中,在该项目中我们设置了源代码控制,可以在Bug跟踪器中自动编写注释。我们只需在提交消息中写入错误问题ID,然后将提交消息作为注释添加到错误跟踪器。 我只能看到这种做法的一些弊端。如果将来某个时候源代码与错误跟踪软件分离(或者报告的错误/问题以某种方式丢失)。或者,当某人正在查看提交历史记录但无法访问我们的错误跟踪器时。 我的问题是在提交消息中包含错误/问题引用是否被认为是一种好习惯?还有其他缺点吗?

6
是否有一个版本控制系统可以显示对特定方法或功能的更改?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 有时候能够说出这样的话会很好: (git|svn|hg|etc) diff Foo.c:main (git|svn|hg|etc) log log Foo.c:main 查看自上次提交以来对源文件中特定功能所做的更改或更改的完整历史记录。我的问题有两个: 是否存在这样做的东西? 这样的工具会实用吗?为了比较该函数的不同版本,它必须对每个修订版本进行一些简单的代码解析;开销是否太高而无法提高效率?

5
有没有语言不可知的单元测试框架?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 我一直对重写工作代码持怀疑态度-移植代码也不例外。但是,随着TDD和自动化测试的到来,重写和重构代码更加合理。 有谁知道是否存在可用于移植旧代码的TDD工具?理想情况下,您可以执行以下操作: 为通过的旧代码编写语言不可知的单元测试(如果发现错误,则失败)。 在失败的其他代码库上运行单元测试。 用通过测试的新语言编写代码,而无需查看旧代码。 另一种选择是将步骤1分为“用语言1编写单元测试”和“将单元2移植到语言2”,这将显着增加所需的工作量,并且很难证明是否要在维护旧代码库之后停止维护端口(也就是说,您无法在此代码库上获得持续集成的好处)。 编辑:值得注意在StackOverflow上的此问题。


10
安全限制是否应导致服务返回null或引发异常?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我在这个问题上与经验丰富的开发人员有些分歧,想知道其他人对此有何看法?我们的环境是Java,EJB 3,服务等。 我编写的代码调用服务来获取事物和创建事物。我遇到的问题是我得到了没有意义的空指针异常。例如,当我要求服务创建一个对象时,我得到空值。当我尝试查找具有已知有效ID的对象时,返回空值。我花了一些时间试图弄清楚代码中的错误。因为我经验不足,所以我通常以为我做错了什么,但是事实证明,返回null的原因是安全性。如果使用我的服务的用户主体对目标服务没有正确的权限,则它仅返回null。这里大多数其他服务的记录也不太好,因此显然这只是您必须了解的内容。 当开发人员编写与服务交互的代码时,这相当令人困惑。如果服务有一个异常,该异常将告诉我用户没有适当的权限来加载此事物或创建该事物,这对我而言将更为有意义。然后,我会立即知道为什么我的服务无法按预期工作。 编写该服务的经验更丰富的开发人员认为,索要数据不是错误条件,并且仅应在错误条件下引发异常,而不是在用户无法访问数据时抛出异常。通常会在GUI中查找这些数据,对于没有正确权限的用户,这些事情简直“不存在”。简而言之:问是没有错的,因此也不例外。Get方法返回null,因为对那些用户来说那些“不存在”的东西。当不允许用户创建东西时,Create方法返回null。 这是正常的和/或良好的做法吗?我更喜欢使用异常,因为我发现更容易知道发生了什么。因此,例如,如果您请求一个具有无效ID的对象,则我宁愿抛出NotFoundException,而不是返回null。

4
复活节彩蛋作为软件中的IP保护
我在嵌入式软件中工作,出于某种原因,管理层希望隐藏一个复活节彩蛋作为IP保护的手段。他们称其为水印,并且由于我们的软件与视频预览供稿(拍摄照片之前在屏幕上显示的图像)进行交互,因此他们希望我实现一个触发器,该触发器将对某些异常的视频输入(视频konami代码)做出反应像黑暗-明亮-黑暗-明亮-等等)。当触发该触发器时,会发生一些奇怪的事情(这超出了软件的正常行为)。 目的是检查我们的软件是否包含在设备中。听起来像个好主意吗?我对此有很多反对意见: 如果konami代码过于敏感并被用户触发怎么办? 这种watermark有法律价值吗? 如果客户发现了这个“功能”怎么办? 由于在小型设备上进行软运行,因此性能损失应该很小。 我就是开发此触发器的人。如果出问题了,我该怎么办? 您对这种方法有何看法?我找不到链接,但我记得在此站点上看到一个答案,提示将复活节彩蛋用于保护目的是个好主意。有没有人尝试过效果很好?

4
如何记录和教导其他人“无法识别的优化”计算密集型代码?
有时候,有1%的代码需要足够的计算强度,因此需要最重的底层优化。通常,示例是视频处理,图像处理和各种信号处理。 我们的目标是记录文档并教授优化技术,以使代码不会变得难以维护,并易于被新的开发人员删除。(*) (*)尽管在某些不可预见的未来CPU中特定优化可能完全没有用,所以无论如何都会删除代码。 考虑到软件产品(商业或开放源代码)通过拥有最快的代码并利用最新的CPU架构来保持竞争优势,软件作者通常需要调整其代码以使其运行得更快,同时为特定产品获得相同的输出。任务,允许少量舍入错误。 通常,软件编写者可以保留函数的多个版本,作为每次进行的优化/算法重写的文档。一个人如何使这些版本可供其他人学习其优化技术? 有关: 干净可读的代码与快速难以读取的代码。什么时候越界?

8
如今,用.NET编写的程序的市场份额是多少?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我们目前正在将Visual Basic 6.0程序迁移到.NET。目标受众只是家里的普通桌面用户。讨论这一点,我们意识到我们无法提出似乎是用.NET编写的主流程序。我们误会了吗?是否有充分的理由呢?
11 .net 

1
评估PHP名称空间
我现在处于开源PHP项目的预发布阶段,我希望其他开发人员可以在自己的项目中使用该项目。该项目当前不支持名称空间,我正在尝试评估它是否应该使用名称空间或Dir_Subdir_Class的PEAR命名约定,这似乎具有所有相同的技术优点,而没有一些缺点。老实说,这不是一个容易的选择。 关于名称空间的一些注意事项: 我的项目试图通过提供比其他类似项目更简单的API来与众不同的方式之一。因为名称空间是新的,而且因为它们比PEAR命名约定更复杂,所以将它们引入代码库会使我的项目使用起来不那么简单。通过实施它们,我在易用性方面失去了一些差异。 虽然我看到了命名空间的一些好处,但它们似乎并没有解决使用PEAR命名约定的现代PHP产品中需要解决的问题。使用项目时,如果不存在命名冲突,则应尽量减少。 这文章给了我在采用的命名空间及其实施已不到恒星一些暂停。 我也很犹豫,跳上一个可能永远不会走的潮流。由于名称空间是PHP的新功能,因此我还不确定它们将成为标准的。 兼容性。几乎所有以前写过的PHP代码都不使用名称空间,因为它是一项新功能。如果不进行转换,其他库将不兼容。 使用名称空间的一些要点: 知觉。如果名称空间成为标准和最佳实践,那么没有它们,我的项目很快就会被视为不专业且过时的项目。 竞争。尽管一些竞争的PHP项目开始在其最新版本中使用名称空间,但许多项目尚未实现飞跃。现在这样做可以使我的项目在其他项目上有优势。 如果我现在在项目公开之前而不是之后进行转换,那以后的工作会更容易,因为我不得不暂时支持它的两个版本。 我想支持最佳实践,如果名称空间成为PHP的最佳实践,则我的项目应使用它们。 据我所知,您必须选择一种方法。你不能两者都做。有没有我没有考虑的观点?是否有任何客观的迹象(请不要烈火)指向或反对命名空间成为PHP的专业标准?我将不胜感激,您愿意分享任何见解或资源,因为我需要尽快做出决定。
11 php  namespace 

8
如果您在诸如敏捷或XP的进化方法中达到设计死胡同,该怎么办?
当我阅读马丁·福勒(Martin Fowler)著名的博客文章《设计死了吗?,我得到的惊人印象之一是,鉴于在敏捷方法论和极限编程中,设计和编程都是进化的,总有一些地方需要重构。 当程序员的水平很好并且他们了解设计的含义并且没有犯严重错误时,代码可能会继续发展。但是,在正常情况下,在这种情况下的地面现实是什么? 通常情况下,产品会进行重大开发,而当需求发生重大变化时,这是否不是我们想要多大的期望就不能修改基本设计方面的约束呢?(而不会丢弃大部分代码)。在设计和要求方面的任何进一步改进方面,人们不太可能走到尽头吗? 我不是在这里提倡任何非敏捷实践,但我想向实践敏捷,迭代或进化发展方法的人们了解他们的真实经验。 你有没有遇到这样的死胡同?您如何避免或逃脱了它?还是有措施确保设计在发展过程中保持清洁和灵活?
11 design  agile 

5
在旧版应用程序中启动一致的体系结构
我负责基于Asp.Net的大型网站。目前,它是一个网站(不是Web应用程序),一些Windows服务和许多类库。 数据层使用LLBLGEN 和Linq To LLBGen 的混合物,以及许多尚未重构的传统内联SQL实例。 有一些管理器类型的实现,但是在许多情况下,该应用程序都具有Smart UI反模式(即,类背后的代码中的业务逻辑过多) 该站点的流量相当大,性能还不错,但是我们正在将开发能力提高到大约10个团队,并且越来越明显的是,我们需要在现有中间件之上进行总体分层设计。 我的问题是从哪里开始?我们有10年的代码(其中有些实际上仍然只是在迁移ASP Classic东西),许多不同的方法和样式。 重构整个代码库是不现实的,并且可能是不希望的 我知道这不是一个新情况,关于如何解决这个问题是否有有用的想法或概念?

3
C#中的各种集合通用接口之间的区别
我已经从事Windows的C#和ASP.net MVC开发工作了一段时间。但是我在一些方面仍然不清楚。我试图了解使用和互换相似种类的通用集合接口之间的基本区别和性能问题。 之间有什么根本区别IEnumerable<T>,ICollection<T>,List<T>(Class)? 我似乎在使用和交换它们时在我的应用程序中没有发现任何问题。另外,还有其他类似的通用集合可以与这三个集合互换吗?

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.