软件工程

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

5
避免使用命名空间进行Smurf命名类的问题
我从这里取消了“蓝精灵命名”一词(21号)。为了省去不熟悉的人的麻烦,Smurf命名是为一堆相关的类,变量等添加通用前缀的行为,因此您最终将“ a SmurfAccountView传递SmurfAccountDTO给SmurfAccountController”,等等。 我通常听到的解决方案是创建一个smurf名称空间并删除smurf前缀。通常,这对我来说很好,但是我遇到了两个问题。 我正在与一个图书馆一起Configuration上课。它可以被调用,WartmongerConfiguration但是在Wartmonger命名空间中,因此它被称为Configuration。我同样有一个Configuration可以调用的类SmurfConfiguration,但是它在Smurf命名空间中,因此是多余的。我的代码中有些地方Smurf.Configuration出现在旁边,Wartmonger.Configuration并键入完全限定的名称比较笨拙,并且使代码的可读性较差。处理一个SmurfConfigurationand 会更好(如果这是我的代码而不是一个库)WartmongerConfiguration。 我Service在Smurf命名空间中有一个可能称为的类SmurfService。Service是运行Smurf作业的复杂Smurf库顶部的外观。SmurfService似乎是一个更好的名字,因为Service没有Smurf前缀是非常通用的。我可以接受的是,这SmurfService已经是一个通用且无用的名称,而去除蓝精灵只是使这一点更加明显。但是它本来可以命名为Runner,Launcher等等,但对我来说仍然会“感觉更好”,SmurfLauncher因为我不知道a的Launcher作用,但是我知道a的SmurfLauncher作用。您可能会争辩说a的Smurf.Launcher行为应该与a的行为一样明显Smurf.SmurfLauncher,但我可以看到`Smurf.Launcher是某种与安装相关的类,而不是启动smurfs的类。 如果有一种开放和封闭的方式来处理这两种情况,那将是很好的。如果不是,有什么常用的方法可以减轻他们的烦恼?

3
如何为当今(复杂的)Web环境培训初级程序员?
目前,我们公司主要在Ruby on Rails Web服务器和大量不同的REST客户端中开发应用程序,从Java的信息亭系统到C / C ++的嵌入式设备(标准Web浏览器的接口除外)。我们需要扩展我们的团队,但由于未能找到优秀的高级程序员,我们决定付出一些努力来培训与公司一起成长的初级程序员。 我们已经给了他们一些Ruby和Rails书籍,并要求他们构建一些玩具程序,但是我现在意识到对于Web编程当前状态的学习曲线有多陡峭。 15年前,当我开始编程时,我仅使用Delphi和Source Safe,并且能够从一开始就生产可用的软件。它们都是简单的工具,很容易探究环境的内部运作。慢慢地,我开始使用第三方框架,切换到CVS,SVN,最后是Git,学习了构成当今Web的内容,例如HTTP,JavaScript,CSS,REST等。今天,即使经过多年的经验,我也不知道关于Ruby on Rails的内部工作原理与过去有关Delphi的工作一样重要,对我而言,这很重要,因此我可以将基本的学习模块与所使用的工具连接起来。 在我看来,我正在招聘的程序员将需要很长时间才能与团队整合并产生有用的东西,因为要使用单一框架(Rails)需要学习很多东西:Ruby,HTML,CSS,JavaScript, REST,测试用例,数据库访问(在框架内神奇地构建了SQL!),MVC,三种不同的程序包管理器(适用于Ubuntu,gem和bundler用于Ruby),ssh,git,Apache和Phusion Passenger进行部署等。 因为这是我第一次直接与初级程序员打交道,所以我感到迷茫。如果选择太多,什么是培训初级程序员采用当今Web开发最佳实践的最佳方法?

13
在不允许下划线使用整数常量的语言中,创建10亿个常量的好习惯吗?
在不允许在整数文字中使用下划线的语言中,创建一个十亿常量是个好主意吗?例如在C ++中: size_t ONE_BILLION = 1000000000; 当然,我们不应该为小数(例如100)创建常量。但是对于9个零,可以很容易地忽略零或在代码中添加一个额外的数字,如下所示: tv_sec = timeInNanosec / 1000000000; tv_nsec = timeInNanosec % 1000000000;

2
对纯函数式语言的误解?
我经常遇到以下语句/参数: 纯函数式编程语言不允许有副作用(因此在实践中很少使用,因为任何有用的程序的确有副作用,例如,当它与外界交互时)。 纯函数式编程语言不允许编写维护状态的程序(这使编程变得很尴尬,因为在许多应用程序中您确实需要状态)。 我不是功能语言方面的专家,但是到目前为止,这是我对这些主题的了解。 关于第1点,您可以使用纯函数式语言与环境进行交互,但是必须显式标记引入副作用的代码(函数)(例如,在Haskell中通过单子类型)。而且,据我所知,即使不是首选工作方式,也应该可以进行副作用计算(破坏性地更新数据)(使用monadic类型?)。 关于第2点,据我所知,您可以通过几个计算步骤(在Haskell中,再次使用monadic类型)对值进行线程化来表示状态,但是我没有这样做的实践经验,我的理解还很模糊。 那么,以上两个陈述在任何意义上是正确的还是仅仅是对纯函数式语言的误解?如果是误解,它们是怎么产生的?您能写一个(可能很小的)代码片段来说明Haskell惯用的方式来(1)实现副作用和(2)实现有状态的计算吗?

6
开发与研发之间有什么区别?
一位同事请我清楚地解释普通开发与研发之间的区别,但无法做到。看完维基百科后,我仍然没有确切的答案。 根据维基百科(略作修改): 有两种主要模型: 在一个模型中,主要功能是开发新产品。 在另一个模型中,主要功能是发现和创建有关科学技术主题的新知识,以发现并促进有价值的新产品,过程和服务的开发。 第一个模型令人困惑。这是否意味着开发(而非研发)仅包含向产品添加新功能,解决错误并进行维护?如果以前作为新功能开发的产品变成单独的产品怎么办? 第二种模型不那么令人困惑,但是仍然如何确定是重新发现的是新知识还是现有知识? 后来,维基百科补充说,普通开发与R&D有所不同,因为它具有以下特点: 几乎立即的利润或立即的改善。 还不够清楚。如何获得“近乎即时的利润”?如果一项任务可以立即获利但需要大量研究怎么办?还是说它是基本的但有不确定的利润,例如在代码库上实施通用样式? 例如,它是否属于以下领域的开发或研发: 开发一个引擎来抽象化对数据库访问的引擎,从而极大地简化和缩短应该访问数据库的其他应用程序的代码(现有或将来将要编写的代码)? 为公司资源的整个组织建立一个新的面向服务的体系结构,以便从一堆独立的自治应用程序迁移到一组组织良好,相互联系的Web服务,例如Amazon使用的服务? 设计新的通信协议以允许在公司的两个数据中心之间更快地复制数据吗? 知道特定类型的测试会改善/简化测试过程,同时构想针对特定产品的新型软件测试吗? 基于证据,逻辑和先前的经验,是否证明函数式编程比OOP更适合于特定应用? 在进行了研究和测试后发现,这些手势可以将用户的生产率提高至少1.4倍,以完成一组精确任务,从而在触摸屏上添加手势来增强现有的应用程序? 是否找到一种方法来大大增强数据中心的电源使用效率(PUE)? 创建域特定语言(DSL)? 简而言之,如何确定在做某事时我是否在进行研发?

5
不变性是否完全消除了多处理器编程中对锁的需求?
第1部分 显然,不变性可以最大程度地减少多处理器编程中对锁的需求,但是它消除了这种需求吗?还是存在仅不变性还不够的情况?在我看来,您只能推迟处理和封装状态,直到大多数程序必须实际执行某些操作(更新数据存储,生成报告,引发异常等)之前。这样的动作能否始终不加锁地进行?扔掉每个对象并创建一个新对象而不是更改原始对象(对不变性的粗略看法)的纯粹行动是否提供了对进程间争用的绝对保护,还是有些仍然需要锁定的情况? 我知道很多函数式程序员和数学家都喜欢谈论“无副作用”,但是在“现实世界”中,所有事情都有副作用,即使这是执行机器指令所需的时间。我对理论/学术答案和实际/现实答案都感兴趣。 如果不变性是安全的,那么在给定某些界限或假设的情况下,我想知道“安全区”的边界到底是什么。可能的边界的一些示例: 输入输出 异常/错误 与其他语言编写的程序的交互 与其他机器(物理,虚拟或理论上的机器)的交互 特别感谢@JimmaHoffa 的评论,这开始了这个问题! 第2部分 多处理器编程通常用作优化技术-使某些代码运行更快。什么时候使用锁和不可变对象更快? 考虑到阿姆达尔定律所规定的限制,与可变对象锁定相比,什么时候可以实现更好的整体性能(考虑或不考虑垃圾收集器)? 摘要 我将这两个问题合并为一个,以尝试了解边界不变性在哪里作为线程问题的解决方案。

4
空值存储在哪里,或者根本存储在哪里?
我想了解空值或空引用。 例如,我有一个名为Apple的类,并创建了它的一个实例。 Apple myApple = new Apple("yummy"); // The data is stored in memory 然后我吃了那个苹果,现在它需要为空,因此我将其设置为空。 myApple = null; 打电话之后,我忘记了吃了它,现在想检查一下。 bool isEaten = (myApple == null); 通过此调用,myApple在哪里引用?null是一个特殊的指针值吗?如果是这样,如果我有1000个空对象,如果我们认为指针类型为int的话,它们会占用1000个对象存储空间还是1000个int存储空间?
39 memory  null 

14
在现实世界中如何使用Python?[关闭]
我正在寻找一份Python程序员的工作。我知道该语言的基础知识,并使用pygame使用它创建了一些游戏。我也开始尝试使用Django。 但是,从就业市场来看,似乎没有多少Python职位与网络相关。在桌面方面,似乎没有多少公司使用流行的GUI库,例如pyQt或wxPython。 公司实际如何使用Python?应该寻找哪些领域的Python程序员职位?
39 python 

9
只有静态成员的实用程序类是C ++中的反模式吗?
我应该在何处放置与类无关的函数这个问题引发了一些争论,即在C ++中将实用程序函数组合到类中是否有意义或者只是将它们作为自由函数存在于命名空间中。 我来自C#背景,后者不存在该选项,因此自然倾向于在我编写的C ++小代码中使用静态类。该问题的最高投票答案以及一些评论都说,自由函数是首选,甚至暗示静态类是反模式。为什么在C ++中会这样?至少从表面上看,类上的静态方法似乎与命名空间中的自由函数没有区别。为什么要选择后者呢? 如果实用程序功能的集合需要一些共享数据,例如可以将其存储在私有静态字段中的缓存,情况会有所不同吗?

11
通常是从UML生成代码吗?[关闭]
因此,当我上大学时,就接受了UML的好处及其在代码开发中的未来的教育。 但是从我的行业经验中,我发现虽然我们确实使用图(从ER图,类图,状态图到工作流程图),但它们都是出于通信目的。 也就是说,我从来没有从图表中自动生成过代码,从沟通的角度来看,我通常会尽量使图表尽可能简单易懂。 但是,当我查看Visio和Enterprise Architect时,似乎它们具有许多不同类型的图形,形状,属性对象,而其中大多数我都不使用。 人们是否使用UML做更多复杂的事情,例如代码或数据库生成?
39 uml  diagrams  visio 

6
首选类成员还是在内部方法之间传递参数?
假设在一个类的私有部分中有一个供多个私有方法使用的值。人们喜欢将其定义为类的成员变量还是将其作为参数传递给每个方法?为什么? 一方面,我可以看到一个论点,即减少类中的状态(即成员变量)通常是一件好事,尽管如果在类的所有方法中重复使用相同的值,那似乎是一个理想的选择。表示为类状态的候选对象,以使代码看起来更清晰(如果没有其他内容)。 编辑: 为了澄清提出的一些评论/问题,我不是在谈论常量,这与任何特定情况都没有关系,而只是与其他人谈论的一种假设。 暂时忽略OOP角度,以下是我想到的特定用例(假设通过引用传递只是为了使伪代码更整洁) int x doSomething(x) doAnotherThing(x) doYetAnotherThing(x) doSomethingElse(x) 所以我的意思是,多个功能之间存在一些共同的变量-在我看来,这是由于较小功能的链接所致。在OOP系统中,如果这些都是类的所有方法(例如,由于通过从大型方法中提取方法进行重构而导致的结果),则该变量可以全部传递给它们,也可以是类成员。

20
是否存在在以下类中性能大大优于实际的算法?[关闭]
昨晚我正在与另一位程序员讨论,即使O(1)可能是O(1),如果O(1)算法中存在一个较大的常数,则O(n)的运算也可能会胜过它。他不同意,所以我把它带到了这里。 是否有一些算法示例大大优于其下面的类?例如,O(n)比O(n)快或O(n 2)比O(n)快。 在数学上,当您忽略常数因子时,可以针对具有渐近上限的函数证明这一点,但是这样的算法在野外是否存在?在哪里可以找到它们的示例?它们用于什么类型的情况?
39 algorithms  big-o 

8
在C ++中,程序员花了多少时间进行内存管理
习惯于垃圾回收语言的人通常会害怕C ++的内存管理。有工具,如auto_ptr和shared_ptr将处理许多适合你的存储管理任务。许多C ++库早于这些工具,并拥有自己的方式来处理内存管理任务。 您花多少时间执行内存管理任务? 我怀疑它在很大程度上取决于您使用的库集,因此请说出您的答案适用于哪些库,以及它们的优劣之处。
39 c++  memory 


13
我是否应该在自己的应用程序中包含自毁方法?
最近,我有一个负面的经历,客户从账单中获得担保,但是我的中间人已经将我们的软件和设计上传到了客户服务器。客户原来是一个已知的罪犯,他当然更改了服务器的所有可能的密码。 但是,我仍然可以访问CMS的管理面板。不幸的是,事实证明,我的软件非常安全。。尝试过SQL注入,伪造图像上传等。但是,我无法破解自己的软件。。无论如何,我准备起诉这个人,所以不是问题..我现在在想,也许应该有一些后端selfdestruct方法。因此,如果发生类似情况,我可以选择终止该软件。 我自己的想法是在核心文件中隐藏一些功能。使用base64对其进行编码,因此不会很明显。所以像这样: eval(base64_decode('ZWNobyAnSGVsbG8gd29ybGQhJzs=')); // echo 'Hello world!'; 并基本上制作一个小脚本,该脚本将获取软件的所有文件,并确定chmod的文件,然后将其删除。 我的CMS较新版本都具有文件管理器,可以用来更轻松地进行黑客攻击。但是,如果对管理面板的访问受到限制,该怎么办。 非常清楚,这仅适用于我个人服务器或客户端服务器中的开发阶段软件(最后一部分在道德上值得怀疑。)因此,如果我的客户端应该盗用我的软件。。 -软件。 更明确地说,我们正在谈论那些罕见的自由职业。我认为这样做很合乎逻辑,因为合同工作不需要这种方法。因此,我们仅在开发模式下谈论这些跳高的客户-当项目准备就绪时,显然这在您的软件内部将是非常非常不道德的后门。 从伦理上讲,这是个好主意吗?(请记住,当项目已达到100%并且已支付所有费用时,显然我会删除它) 你们是否曾经因为客户端的类似问题而不得不破解自己的软件? 关于这个想法,代码和方法明智的建议吗? 自毁脚本可能有哪些弊端或后果? 我对此的结论 遗憾的是,所有答案都针对合同规定的案例。确实,这是我的错,我没有在问题中更清楚地说明……。只是,很清楚,当您受到合同保护时,终止开关没有意义。 但是,如果您正在执行合同工作..则应在合同中注明-即使在客户自己的服务器内部,这也合法。但是,在我自己的个人服务器中使用kill-switch确实是小菜一碟(这是我真正想知道的事情)。 我决定为CMS制作kill-switch脚本。主要是因为这似乎是一个有趣的挑战。而且,如果客户是朋友的朋友,我可以将其用于我的非承包作品。.我可能不会在客户服务器上使用它,但是..对于客户或某些客户中间人可以访问我的服务器..并且我的软件被盗,或“在我不知情的情况下被移动”,然后我没有得到报酬,他们切断了对该软件的访问。 我在这里阅读了很多主题,他们建议在其中发送警告,然后删除该页面。好吧,我看到了一个问题,例如当我与某人打交道时,他会将其复制到其他地方(也许将其重新贴上标签并出售)并告诉我,该记录已被删除。而且,我不会“关闭站点”,而是将其删除。但是,我认为访问我的客户端服务器并将其删除仍然是非法的。或者至少通过后端而不是从FTP访问它。为此,我感谢所有回答的人。

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.