软件工程

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

19
如何更快地编码(不牺牲质量)
我从事专业编码器已有数年了。关于我的代码的注释通常是相同的:编写出色的代码,经过充分测试,但可能会更快。 那么,如何在不牺牲质量的前提下成为更快的编码器呢?出于这个问题的考虑,我将范围限制在C#中,因为这主要是我编写的代码(出于娱乐目的)或Java(在许多方面都足够类似)。 我已经在做的事情: 编写完成工作的最小解决方案 编写一系列自动化测试(防止回归) 为各种事物编写(和使用)可重用的库 在运作良好的地方使用众所周知的技术(例如,休眠) 在适合的位置使用设计模式(例如,Singleton) 这些都很不错,但是我觉得我的速度不会随着时间的推移而增加。我很在意,因为如果我能做些事情来提高生产率(甚至提高10%),那将比我的竞争对手快10%。(不是我有。) 除此之外,无论是小型Flash开发还是企业Java / C ++开发,我都从经理那里得到了回报。 编辑:关于我所说的快,以及我怎么知道我慢,似乎有很多问题。让我更详细地说明一下。 我曾在多家公司的中小型团队(5至50人)中从事各种项目和各种技术(Flash,ASP.NET,Java,C ++)的工作。我的经理们(他们直接告诉我)的观察结果是我“很慢”。 部分原因是因为我的许多同仁为追求速度而牺牲了质量。他们编写的代码有错误,难以阅读,难以维护,并且难以为其编写自动测试。我的代码通常具有良好的文档记录,可读性和可测试性。 在Oracle,我将始终以比其他团队成员慢的速度解决错误。我知道这一点,因为我会得到对此的评论;这意味着其他(是的,更高级和经验丰富的)开发人员可以以几乎相同的质量(可读性,可维护性和可测试性)在比我花费更少的时间内完成我的工作。 为什么?我想念什么?我如何才能更好地做到这一点? 我的最终目标很简单:如果我今天能在40个小时内制造出产品X,并且我能以某种方式提高自己,以便明天20、30甚至38个小时就可以制造出相同的产品,那就是我想知道的-我如何到达那里?我可以使用什么过程来持续改进?我以为这与重用代码有关,但这似乎还不够。

7
C#、. NET,ASP,ASP.NET等之间的关系
我真的不清楚C#,C#.NET与ASP和其他“ .NET”语言的区别。 据我了解,.NET是...事物的库/框架。我认为他们本质上是在访问Windows数据,例如表单元素等,但这似乎不适用于ASP.NET。 另外,我看到人们称自己为“ .NET”开发人员。这是否意味着他们精通C#,ASP和其他语言? 最后,我从来没有看到没有附加.NET的C#。C#是否与.NET紧密地联系在一起,否则无法使用? 总结:.NET到底提供了什么?它与C#和ASP等有什么关系?“ .NET开发人员”是什么意思?最后,为什么没有.NET就永远看不到C#? [顺便说一句,我意识到这些是多个问题,但是我认为它们之间是非常相关的(或者至少是浏览Programmers / SO等给我的印象))。
143 c#  .net  asp.net 

14
“偏爱组成而不是继承”的概念从何而来?
在过去的几个月中,“偏爱继承而不是继承”的口号似乎无处不在,并成为编程社区中的某种模因。每次看到它,我都会有些迷惑。就像有人在说“青睐锤子”。以我的经验,组合和继承是具有不同用例的两个不同工具,并且将它们视为可互换,并且一个在本质上优于另一个是没有意义的。 另外,我从来没有看到过真正的解释,说明为什么继承不好而组成很好,这让我更加怀疑。是否应该只凭信心接受?Liskov替换和多态性具有众所周知的明显好处,而IMO构成了使用面向对象编程的全部要点,而且从来没有人解释为什么应该丢弃它们以利于组合。 有谁知道这个概念的来历,其背后的原理是什么?

8
“导入模块”与“从模块导入功能”
我一直在使用这种方法: from sys import argv 并argv仅使用argv。但是使用此约定: import sys 并通过使用argv sys.argv 第二种方法使代码自成体系,并且我(确实)坚持执行。但是我之所以偏爱第一种方法,是因为它速度很快,因为我们仅导入所需的功能,而不是导入整个模块(该模块包含更多无用的功能,而python将浪费这些时间来导入它们)。请注意,我只需要argv,而sys中的所有其他功能对我来说都是无用的。 所以我的问题是。第一种方法真的可以使脚本快速运行吗?哪种方法最合适?为什么?
143 python 

14
简单可靠地检测文本代码的方法?
GMail具有此功能,如果您尝试发送它认为可能带有附件的电子邮件,它将向您发出警告。 由于GMail检测到see the attached电子邮件中的字符串,但没有实际附件,因此当我单击“发送”按钮时,它会通过“确定” /“取消”对话框警告我。 我们在堆栈溢出方面有一个相关的问题。也就是说,当用户进入后像这样的: 我的问题是我需要更改数据库,但我不会创建 一个新的连接。例: 数据集dsMasterInfo = new DataSet(); 数据库db = DatabaseFactory.CreateDatabase(“ ConnectionString”); DbCommand dbCommand = db.GetStoredProcCommand(“ uspGetMasterName”); 该用户未将其代码格式化为代码! 也就是说,他们没有为每个Markdown缩进4个空格,也没有使用代码按钮(或键盘快捷键ctrl+ k)为他们这样做。 因此,我们的系统正在接受很多编辑,人们必须进入这些编辑区域,并手动为无法解决该问题的人们设置代码格式。这导致很多肚皮舞。我们已经多次改善了编辑器的帮助,但是由于没有赶到用户家并为他们按下键盘上的正确按钮,我们无所适从,不知道下一步该怎么做。 这就是我们考虑使用Google GMail样式警告的原因: 您是要发布代码吗? 您编写了我们认为看起来像代码的内容,但是没有使用工具栏代码按钮或ctrl+ k代码格式化命令通过缩进4个空格来将其格式化为代码。 但是,提出此警告要求我们检测问题中是否存在我们认为未格式化的代码。一种简单,半可靠的方法是什么? 根据Markdown的规定,代码总是缩进4个空格或在反引号内,因此任何格式正确的代码都可以立即从支票中丢弃。 这仅是警告,并且仅适用于声誉低下的用户提出第一个问题(或提供其第一个答案),因此,只要它们的错误率在5%或以下,就可以接受一些误报。 关于堆栈溢出的问题可以使用任何语言,尽管实际上可以将检查范围限制为“十大”语言。每个标记页面都是C#,Java,PHP,JavaScript,Objective-C,C,C ++,Python,Ruby。 使用Stack Overflow Creative Commons数据转储来审核您可能的解决方案(或仅在Stack Overflow 的前10个标签中选择几个问题),然后查看其效果。 伪代码很好,但是如果您想变得更加友好,我们可以使用c#。 越简单越好(只要可行)。吻!如果您的解决方案需要我们尝试用10种不同的编译器来编译帖子,或者需要一群人来手动训练贝叶斯推理引擎,那...就不完全是我们的初衷。

30
如何成为一个“更快”的程序员?
我最近的工作评估只包括一个弱点:及时性。我已经知道我可以做些改进的事情,但是我正在寻找更多。 在提高其输出速度而又不牺牲其质量的情况下,是否有人对它们进行提示或建议? 您如何估计时间表并遵守时间表?您如何做才能在较短的时间内完成更多工作? 非常感谢您提供任何反馈意见,谢谢,

17
为了清楚起见,编码标准:注释每一行代码?
我曾在一家生产至关重要的软件的商店工作过,还处理过一些注释规则,这些规则旨在保持代码的可读性并可能挽救生命。以我的经验,尽管要求变成了脑筋急转弯的工作,需要从清单中剔除,但这并不能帮助我专注于编写可理解的代码。这也分散了我的同行审阅者的注意力,使我无法就如何使代码更易于理解进行更有意义的对话。 我还对没有注释的学生代码进行了评分,并查看了为什么应将它们标记为忽略它们。 我知道使用好名,使结构简单,函数简短,并关注模块将使代码易于理解,从而可以最小化注释。 我也理解注释应该解释为什么代码会执行此操作,而不是如何执行。 鉴于所有这些,甚至有可能编写出能够抓住这一想法的良好编码标准?与同行评审有关但不会变成漫不经心的清单活动,不会产生比以下内容更有用的注释:“您忘了在第42行发表评论”。 在清单中被视为一行时,此规则可能需要的代码示例: /* Display an error message */ function display_error_message( $error_message ) { /* Display the error message */ echo $error_message; /* Exit the application */ exit(); } /* -------------------------------------------------------------------- */ /* Check if the configuration file does not exist, then display an error */ /* …

10
我们应该为所有事物定义类型吗?
最近,我遇到了代码可读性的问题。 我有一个执行操作的函数,并返回表示该操作ID的字符串以供将来参考(有点像Windows中的OpenFile返回句柄)。用户稍后将使用此ID来开始操作并监视其完成。 由于互操作性的考虑,该ID必须是随机字符串。这创建了一个签名非常不清楚的方法,如下所示: public string CreateNewThing() 这使得返回类型的意图不清楚。我想将此字符串包装为另一种类型,从而使其含义更清晰,如下所示: public OperationIdentifier CreateNewThing() 该类型将仅包含字符串,并且在使用此字符串时将使用该类型。 显然,这种操作方式的优点是类型安全性更高,意图更明确,但是它还会创建更多的代码,并且这些代码不是非常习惯。一方面,我喜欢增加的安全性,但同时也会造成很多混乱。 您是否出于安全原因将简单类型包装在类中是一种好习惯吗?
141 type-systems 

21
当编程的特定方面需要10秒钟以上才能完成时,您如何保持专注?[关闭]
当某件事(编译,启动时间等)花费的时间超过几秒钟时,我很难集中精力在正在做的事情上(在编程方面)。奇怪的是,阈值大约是10秒(我还记得有关研究的内容说的是同样的话,尽管我现在找不到)。所以通常发生的是我进行更改,然后运行程序进行测试。这大约需要30秒,所以我开始阅读其他内容,在我不知道它已经过去20分钟之前,然后(如果我很幸运!)又花了10分钟以上的时间来处理上下文切换,然后返回编程。 。 毫不夸张地说,某些事情应该花我几分钟才能完成。 我很好奇其他程序员如何应对这种趋势(或者如果我很独特并且他们没有这种趋势?)。任何类型的建议都是受欢迎的-从“按下编译按钮后就坐到您手上”到思维技巧,再到“如果花30秒才能启动某个东西来测试更改,那么您的开发过程就出问题了” !”

2
Git分支和标记最佳实践
我目前正在通过阅读Pro Git学习使用Git。现在,我正在学习分支和标签。我的问题是什么时候应该使用分支,什么时候应该使用标签? 例如,假设我为项目的1.1版创建了一个分支。完成并发布此版本后,是否应该离开分支以标记发布版本?还是应该添加标签?如果添加标签,是否应该删除版本分支(假设它已合并到master或其他分支中)?

18
短变量名有借口吗?
对于我目前正在使用的代码库,这已经变得非常沮丧。我们的许多变量名都很简短且没有描述性。我是该项目上剩下的唯一一名开发人员,并且没有关于它们大多数功能的文档,因此我不得不花更多的时间来跟踪它们的含义。 例如,我正在阅读一些更新光学表面定义的代码。开始时设置的变量如下: double dR, dCV, dK, dDin, dDout, dRin, dRout dR = Convert.ToDouble(_tblAsphere.Rows[0].ItemArray.GetValue(1)); dCV = convert.ToDouble(_tblAsphere.Rows[1].ItemArray.GetValue(1)); ... and so on 也许只是我一个人,但实际上它们告诉我的内容并没有告诉我,这使得进一步理解代码变得困难。我所知道的是,它是一个变量,该变量从某个地方的特定表中解析出特定行。经过一番搜索,我发现了它们的含义: dR = radius dCV = curvature dK = conic constant dDin = inner aperture dDout = outer aperture dRin = inner radius dRout = outer radius 我将它们重命名为基本上我在那里所拥有的。它延长了一些行,但是我觉得这是一个公平的权衡。但是,在许多代码中都使用了这种命名方案。我不确定这是来自开发人员的作品,他们是通过使用较旧的系统而学习的,还是背后有更深层的原因。是否有充分的理由以这种方式命名变量,还是我在遇到变量时将其更新为更具描述性的名称是否合理?

8
在软件行业中典型的不良编程习惯是吗?[关闭]
一个月前,我刚开始担任软件开发人员的第一份工作。我所学到的有关OOP,SOLID,DRY,YAGNI,设计模式,SRP等的所有信息都可以丢到窗外。 他们使用C#.NET Webforms并使用很少的外部类(绝对不称为对象)来执行“代码隐藏”中的几乎所有操作。他们确实使用自定义控件并重复使用它们。关于唯一使用的对象是Entity Framework。他们为每个客户端重用代码隐藏。他们有400行长的方法来处理所有类型的工作。对于新客户端,他们采用aspx和aspx.cs并剥离客户端代码,然后开始添加新的特定于客户端的代码。 他们的第一个借口是增加额外的维护,更多的代码就是更多的维护。这是一家包括我在内的三个开发商的小商店。一个开发人员拥有30多年的经验,而另一个则拥有20多年的经验。一个曾经是游戏开发人员,另一个曾经一直使用C和C ++工作。 这在软件行业中有多普遍?我如何确保自己掌握OOP和相关原则?我在业余时间进行练习,我觉得我真的需要在一个经验丰富的开发人员下工作,以更好地使用OOP。

1
模块还是包装?
每当我做什么时,from 'x' import 'y'我都想知道哪个模块被认为是“模块”,哪个模块被认为是“包装”,为什么它又不是?
140 python  packages  modules 

9
在主分支上维护数百个定制分支
当前,我们在共享存储库中为我们的PHP应用程序提供了一个主分支。我们有500多个客户是我们的软件的订户,其中大多数人针对不同的目的进行了一些自定义,每个客户都在一个单独的分支中。定制可以是不同的文本字段名称,全新功能或模块或数据库中的新表/列。 我们面临的挑战是,当我们维护这数百个定制分支并分发给客户时,我们会不时提供新功能并更新我们的主分支,并且我们希望将主分支更改推送到自定义分支以便更新他们到最新版本。 不幸的是,这通常会导致自定义代码中发生许多冲突,并且我们花费大量时间遍历每个分支来解决所有冲突。这是非常低效的,我们发现解决这些冲突时并不少见的错误。 我正在寻找一种更有效的方法来使我们的客户端发行分支与master分支保持最新,这将减少合并过程中的工作量。


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.