软件工程

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

7
在旧版代码库中,我如何快速找出正在使用的和未使用的?
我被要求评估似乎是一个实质性的旧代码库,作为签订维护该​​代码库合同的先驱。 这不是我第一次遇到这种情况。在目前的情况下,该代码适用于相当引人注目的和相当高负载的多玩家游戏站点,一次可支持至少数千名在线玩家。与许多此类站点一样,该站点是前端和后端技术的组合。 从内向外看,站点结构是一团糟。到处都有后缀为“ _OLD”和“ _DELETE”的文件夹。许多文件夹似乎毫无用处,或者具有非常神秘的名称。即使在看起来合法的文件夹中,也可能有任意数量的旧的,未使用的脚本摆在附近。不仅如此,即使在其他情况下运行的脚本中,无疑也有许多已失效的代码节(紧迫的问题要少得多)。 这是从现有维护者到站点的原始开发者/维护者的移交。可以理解,在这种情况下典型的情况是,任职者除了与合同和法律要求将移交给新当选的维护人员的合同和法律要求外,与移交无关。因此,从现有运营商那里提取有关现有站点结构的信息完全是不可能的。 进入代码库的唯一想到的方法是从站点根目录开始,然后慢慢地但一定要在链接的脚本中导航……这可能有数百种正在使用中,有数百种没有使用。鉴于该站点的很大一部分都位于Flash中,因此这甚至不那么简单,因为尤其是在较旧的Flash应用程序中,指向其他脚本的链接可以嵌入二进制文件(.FLA)中,而不是文本文件(.AS / ActionScript)中。 因此,我想知道是否有人对如何评估整个代码库的可维护性有更好的建议。如果有某种方法可以查看网络服务器操作系统(我可以访问)上文件访问频率的图表,那将是很棒的,因为这可能会提供一些洞察力,让您了解哪些文件最关键,即使不是能够删除那些从未使用过的文件(因为某些文件每年只能使用一次)。

17
开源对开发人员本身不利吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 关闭 7年前。 为什么程序员甚至喜欢开源的想法?我不是在谈论那些项目的创建者,当然他们是成名的,但是我在谈论的是整个行业,为什么当开源概念给行业带来如此多的负面影响时,我们为什么如此喜欢开源概念? 首先,在诸如wordpress和其他CMS之类的项目中,它们剥夺了许多自由职业者的工作,客户需要博客或简单的网站。其次,在诸如Rails以及其他库和API之类的项目中,它们使很多程序员无法工作,并使对程序员的需求减小,因为现在有了这些开源API,一个程序员可以做10个程序员曾经做过的事情。最后,使用诸如Notepad ++之类的开源软件,现在,当人们要求他们购买软件时,人们会感到很有趣。 所以,问题是,如果这会使我们变得贫穷,为什么我们仍然喜欢开源?可能,我作为程序员的生活会更艰难,但至少我可以靠它谋生。但是现在,它更像是机器在代替人类,有趣的是,我们正在创造那些取代我们自己的“机器”。 假设,如果您发明了一种工具,则不必共享它,它将仍然对您和您的公司有所帮助。即使没有这些开源工具,其他程序员也会活着,因为他们仍然有一份赚钱的工作。

6
我们应该将视图绑定到模型属性还是ViewModel应该具有它自己的属性?
我正在使用以下技术环境启动一个项目:.Net 4.0,Entity Framework 4.0,带有MVVM体系结构的 WPF 我在网上看到了很多例子,有些书就是关于这种环境的。在某些示例中,作者有以下想法: Viemodel将具有Model类的实例(实体框架实体,例如Person) 将WPF视图控件绑定到Model的属性 虽然有些作者这样做: Viemodel将公开模型的所有属性。 将WPF视图控件绑定到ViewModel的属性,而不是直接绑定到模型。 那么,让视图绑定模型的属性而不是让视图模型公开自己的属性是一个好主意吗?还是更优选?

8
是否有一部分程序可以避免停顿问题
我只是在阅读有关停止问题的另一种解释,这使我想到我所看到的所有示例中涉及的问题都涉及无限序列。但是我从不在程序中使用无限序列-它们花费的时间太长。现实世界中的所有应用程序都有上限和下限。甚至实数也不是真正的实数-它们是存储为32/64位等的近似值。 因此,问题是,是否存在可以确定程序是否暂停的子集?对于大多数程序来说足够好了吗?我可以建立一套可以确定程序的“可暂停性”的语言结构吗?我敢肯定,这已经在某处研究过,所以任何指针都将不胜感激。语言不会完全完成,但是是否有几乎完全完成这件事呢? 很自然地,这样的构造必须排除递归和无边界的while循环,但是我可以编写一个没有那么容易的程序。 作为示例,从标准输入中读取内容必须是一定范围的,但这很容易-根据问题域的不同,我将输入限制为10,000,000个字符,以此类推。 tia [更新] 阅读评论和答案后,也许我应该重申我的问题。 对于所有输入都受限的给定程序,您可以确定该程序是否暂停。如果是这样,语言的约束是什么,输入集的极限是什么。这些构造的最大集合将确定可以推论为停止或不停止的语言。是否对此进行了一些研究? [更新2] 答案是肯定的,可以回溯到1967年,网址是http://www.isp.uni-luebeck.de/kps07/files/papers/kirner.pdf 明斯基已经在1967年提出论点,认为至少可以在理论上解决有限状态系统的停顿问题[4]:“ ...任何有限状态机,如果完全留给自己,最终将陷入一个完美的周期重复模式。这种重复模式的持续时间不能超过机器内部状态的数量……” (因此,如果您坚持使用有限的图灵机,则可以构建一个oracle)

5
如何在ASP.NET应用程序背后的客户端Javascript和C#代码之间传递数据?
我正在寻找在ASP.NET应用程序背后的客户端JavaScript代码和C#代码之间传递数据的最有效/标准方式。我一直在使用以下方法来实现此目的,但是它们都感觉有些偏软。 要将数据从JavaScript传递到C#代码,是通过设置隐藏的ASP变量并触发回发: <asp:HiddenField ID="RandomList" runat="server" /> function SetDataField(data) { document.getElementById('<%=RandomList.ClientID%>').value = data; } 然后在C#代码中收集列表: protected void GetData(object sender, EventArgs e) { var _list = RandomList.value; } 回到另一种方式,我经常使用ScriptManager来注册一个函数并在Page_Load期间将其传递数据: ScriptManager.RegisterStartupScript(this.GetType(), "Set","get("Test();",true); 或在回发之前,初始化或预渲染阶段添加属性到控件: Btn.Attributes.Add("onclick", "DisplayMessage("Hello");"); 这些方法很好地为我服务并完成了工作,但感觉并不完整。在客户端JavaScript和C#后端代码之间传递数据的方法是否更标准? 我见过像一些帖子这样一个描述的HtmlElement类; 这是我应该研究的东西吗?

3
“微型ORM”有哪些好处?
我一直在研究像Dapper这样的所谓的“微型ORM”,并且(由于它依赖于.NET 4.0,所以程度较轻),因为自我们当前的系统以来,这些方法在工作中可能比成熟的ORM更容易实现它高度依赖存储过程,因此需要大量重构才能与NHibernate或EF之类的ORM一起使用。与功能齐全的ORM相比,使用其中之一有什么好处?这似乎是围绕一个数据库连接只是薄薄的一层仍然强迫你写原始SQL -也许我错了,但我总是告诉了奥姆斯的原因首先是,所以你没有写SQL,它可以自动生成;特别是对于多表联接和表之间的映射关系,这在纯SQL中是很困难的,但是对于ORM来说却是微不足道的。 例如,看一个Dapper的例子: var connection = new SqlConnection(); // setup here... var person = connection.Query<Person>("select * from people where PersonId = @personId", new { PersonId = 42 }); 这与使用手动ADO.NET数据层有什么不同,除了您不必编写命令,设置参数并且我想使用Builder将实体映射回去外。看起来您甚至可以使用存储过程调用作为SQL字符串。 在使用Micro ORM有意义的地方,我还缺少其他明显的好处吗?我真的没有看到它如何通过使用ADO.NET的“旧”方式来节省任何东西,除了可能的几行代码外-您仍然必须写出找出需要执行哪些SQL(这可能会变得麻烦)以及您仍然必须映射表之间的关系(IMHO ORM最有帮助的部分)。
21 .net  orm 

3
存在哪些替代数字食谱的现代方法?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 过去,《数字食谱》一书被认为是数值算法的黄金标准参考书。最早的Fortran版本紧随其后的是C,C ++和其他版本,从而使它更新了。通过这些,它为当今的最新算法提供了参考代码。 较早的版本现在可以在线免费获得。 不幸的是,我认为它现在仅作为一个历史性的书集才最有用。在我看来,“软件工程”实践已经过时了,实际内容并没有与文献同步。 现代程序员应该看什么类似的全面而平易近人的参考书呢?

3
Node.js是否真的增加了可伸缩性?
我一直在阅读有关C10K问题的信息,特别值得注意的是引用异步服务器I / O的部分。http://www.kegel.com/c10k.html#aio 我相信,这可以通过允许线程处理用户请求,同时依靠I / O中断(事件)通知线程已完成的工作,而不是由线程负责完成工作来总结Node.js在服务器上的工作。完整的CPU工作。线程可以继续执行其他操作(非阻塞),并在完成工作时得到通知(例如,找到文件或压缩视频)。 因此,这意味着套接字更“可用”线程,因此服务器上的用户也可以使用该线程。 然后我发现了这一点:http : //teddziuba.com/2011/10/straight-talk-on-event-loops.html 这里的作者声称,尽管事件驱动框架(中断线程)可以释放线程,但实际上并没有减少CPU要做的工作量!这里的基本原理是,例如,如果用户请求压缩他们上传的视频,则CPU仍然必须实际执行此工作,并且在执行该操作时将处于阻塞状态(为简单起见,请在此处忘记并行性-除非您更了解!)。 我是一个简单的编码器,不是服务器管理员或类似的人。我只是想知道:Node.js是来自“云计算”之神的礼物还是全是热销的东西,实际上不会通过改善可扩展性来节省公司的时间和/或金钱吗? 非常感谢。

12
“一件事情”范例何时会变得有害?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 为了便于讨论,下面是一个示例函数,该函数逐行打印给定文件的内容。 版本1: void printFile(const string & filePath) { fstream file(filePath, ios::in); string line; while (std::getline(file, line)) { cout << line << endl; } } 我知道建议函数在一个抽象级别上做一件事。对我来说,尽管上面的代码几乎做一件事,而且是原子的。 一些书(例如Robert C. Martin的Clean Code)似乎建议将上述代码分解为单独的函数。 版本2: void printFile(const string & filePath) { fstream file(filePath, ios::in); printLines(file); } …

5
我该怎么做才能防止进行不道德的发展项目?
规范指出,在我自谋职业的日子里,我曾经从事一个小型且报酬丰厚的项目:“新闻通讯系统”。 一切都很好,在达到每个里程碑时都支付了发票,我是一个快乐的开发人员……直到Client先生开始要求邮件标头欺骗和其他一系列功能,最终使我得出的结论是,我正在构建相当复杂的垃圾邮件。 简而言之:财务方面的考虑使我完成了刚开始的工作。到目前为止,我一直很讨厌最初担任这份工作–如果我打扰了google我客户的名字,就会被警告。 我可以使用什么策略来避免编写不想在别人手中看到的东西?

5
使用静态类作为名称空间
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 8年前。 我看到其他开发人员使用静态类作为名称空间 public static class CategoryA { public class Item1 { public void DoSomething() { } } public class Item2 { public void DoSomething() { } } } public static class CategoryB { public class Item3 { public void DoSomething() { } } …


6
添加单元测试对知名的旧版代码有意义吗?
我说的是TDD意义上的单元测试。(不是自动的“集成”,或者您喜欢称之为测试的东西。) 遗留代码,如:(C ++)没有测试的代码。(请参阅:Michael Feathers的“ 旧版代码有效工作”) 但是还有一些遗留代码,例如:我们的团队在过去10到5年中一直在使用的代码,因此我们通常对将事物放置在何处可以改变事物有一个很好的认识。 我们确实对某些模块进行了单元测试(通过Boost.Test),这些模块后来出现或很自然地适合单元测试(常见的应用程序特定容器,字符串填充,网络助手等)。 我们尚未进行适当的自动化验收测试。 现在,最近,我很高兴地实现了3个新的面向用户的功能。 每个人花了我大约1-2个小时来快速掌握我需要更改的代码部分,花了1-2小时来实现我需要更改的(小)代码,另外花了1-2个小时来确保应用程序之后正确运行,并且确实应该这样做。 现在,我确实添加了很少的代码。(我认为每个功能都有一个方法和一些调用行。) 分解出这段代码(通过WEwLC中建议的任何一种方法),以使单元测试变得有意义(而不是完整的重言式)将很容易又花费2-4个小时,甚至更多。这将为每个功能增加50%-100%的时间,而没有立即的好处,因为 我不需要单元测试即可了解有关代码的任何信息 手动测试的工作量是相同的,因为我仍然需要测试代码是否正确集成到应用程序的其余部分中。 当然,如果,以后,“有人”走过来,碰到的代码,他理论上可以有从单元测试的一些好处。(仅从理论上讲,因为经过测试的代码孤岛将生活在未经测试的代码海洋中。) 因此,“这一次”,我选择不做添加单元测试的艰苦工作:对代码进行更改以使要测试的东西要比对代码进行更改(要正确(清晰地)实现功能)复杂得多。 这是强耦合旧代码的典型代表吗?我是不是很懒?我们是否将团队的优先顺序设置错了?还是我谨慎,只测试开销不太高的东西?
21 c++  tdd  legacy  unit-testing 

7
自筹资金休假后,您如何解决简历上的空白?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 8年前关闭。 关于Programmers.SE,有很多问题,关于延长休息时间是否是一个好主意,以及在这段时间中如何保持技能水平: /software/31536/will-take-two-years-off-for-school-in-a-related-field-destroy-a-mid-level-devel /software/102009/can-i-take-a-year-off-without-hurting-my-career 如果您从开发人员中抽出一两年的时间,难道要重新投入开发真的很困难吗? /software/91176/is-take-a-break-in-career-to-learn-stuff-a-bad-idea 他们确实很有帮助,但我仍然对自费休假的后勤细节有疑问。 我已经结束了一年的软件开发工作(在该领域工作了7年)。今年我要让自己去探索自己从未有过的兴趣:烘烤,缝纫,摄影以及结识新朋友。在这段时间里,我也一直在从事宠物开发项目,涉及技术和学科,而我本来没有机会去探索的。此外,我已经读了所有我从未有时间阅读的软件开发书籍,并紧跟编程新闻和博客。 开发项目都希望成为Micro ISV的一部分,但是只有一个项目使其进入了任何生产阶段。该项目令人印象深刻,但还不是很成功(还!) 我有一个相当活跃的编程博客,我认为这反映了对软件开发的高度奉献,并表明我不仅将我的编程技能搁置了一年。 我的问题是:在履历表/求职信层级上将此信息传递给潜在雇主的最佳方法是什么? 我有足够的信心可以在面试中解释这个放假假。我知道,虽然在履历方面,招聘经理会以一切可能的借口将我的履历表扔掉(我已经完成了招聘,如果这段时间办得不好,我可能会丢掉自己的履历表,因此,我觉得简历/求职信是获得新工作的真正棘手的部分。 我对应该做什么有一些想法,但是我不确定较大的社区认为可以接受什么。这是我正在考虑的方法: 在我的简历上放一个特殊的部分,以便在假期中概述个人项目。如果执行此操作,标记它的好方法是什么? 创建一个个人公司名称,并将这些项目放入我在该公司下的简历的工作经验部分。这似乎是最简单的方法,但是我担心进入面试阶段可能会被认为是骗术。另外,如果我这样做,该怎么称呼我? 保持我的履历不变,并在求职信中解释所有内容,并提供指向活跃博客的链接。 可能有些我没想到,我愿意接受其他任何想法。 我知道我已经包含了许多有关我的个人情况的特殊雪花信息,但是对于更一般的情况,我希望选择答案。这里的个人详细信息仅作为示例,而不是要求为我专门设计的答案。

7
不由自主地成为程序员:如何正确地做?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我的背景是电气工程,更精确地说是DSP。我目前工作的公司从事许多不同的项目,主要用于构建模拟硬件。与这里的其他人相比,我离计算机更近一些,我通常是同时为嵌入式设备(我非常满意)和Windows或Linux OS编写代码的人。在我看来,后者是外国领土。 我可以编码,并且我知道几种语言(C / C ++,Java,某些VB.NET),但是我仅将它们用于信号和图像处理,神经网络以及其他类似应用程序中的算法仿真。对我而言,编程已成为一种计算工具,比什么都重要。但是,我有越来越多的项目需要编写适当的功能完善的软件,而且我真的不知道该怎么做,因为我从未必须做过,而且我也从未真正感兴趣。我自己看到有很多工程师由于工作需要而在一定程度上转换为编码器,而大多数工程师的工作并不那么出色。我敢肯定,很多人也遇到过同样的情况。 如果我要学习编写具有良好用户界面,良好内部架构等的合适软件,我该怎么做?我们没有人可以告诉我什么是好的做法,什么不是什么。鉴于我可以用最原始的方式编写代码,那么关于编写好的软件还有什么要知道的,以及如何独自实现?

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.