软件工程

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

24
程序员为什么要使用或推荐Mac OS X?[关闭]
我在Mac和Windows上都工作了一段时间。但是,我仍然很难理解为什么程序员会热情地选择Mac OS X而不是Windows和Linux? 我知道有些程序员更喜欢Windows和Linux,但是我要问的是只使用Mac OS X的程序员,因为他们认为Mac OS X最适合程序员。 有人可能会说Mac OS X拥有漂亮的UI,并且基于nix,但是Linux可以做到。尽管Windows不是基于nix的,但是除了Cocoa / Objective-C之外,您几乎可以在任何平台或语言上进行开发。 是仅在Mac OS X上可用的应用程序吗?这真的值得吗? 是开发iPhone应用程序吗? 是否因为您需要每2年升级一次Windows(向后兼容性较低)? 我知道为什么在多媒体/娱乐行业工作的人们会使用Mac OSX。但是,我不知道Mac OS X在Windows上有什么优点。如果您每天在Mac上进行开发,并且比其他任何事物都更喜欢Mac,那么能否给我带来Mac在Windows / Linux之上的优点?也许您可以在Mac上做的某些事情在Windows / Linux上做不到那么轻松? 我不是在这里尝试做另一台Mac vs. Windows。我试图找到可以在Mac上完成但在Windows上无法做到的轻松程度,但我做不到的事情。因此,我正在寻求帮助。

18
人们为什么仍然说Java很慢?[关闭]
在SO和其他地方,Java长期以来一直以缓慢而著称。从笑话到对问题和答案的许多评论,人们仍然认为Java仅仅基于90年代的经验就很慢。 这是我的问题:我们(大多数)不赞成人们认为Java速度慢的原因。除了小事之外,Java相当快。 那么为什么人们仍然拒绝相信Java很快呢?他们的心态一部分就是没有C / C ++的事情进展缓慢吗?是因为人们不随时间检查吗?是因为人们只是有偏见?
61 java  performance 

5
不同微服务之间的共享域模型
想象一下两种不同的微服务的场景。一个负责处理服务中的身份验证,另一个负责用户管理。他们都有用户的概念,并且会通过相互调用来谈论用户。 但是,“用户”的域模型将属于哪里?它们在数据库级别上对用户的身份都有不同的表示吗?当我们有一个UserDTO可以用于API调用时,它们各自的API是否都有一个呢? 对于这种架构问题,公认的解决方案是什么?

2
嵌套指令之间的通信
指令之间似乎有很多通信方式。假设您有嵌套指令,内部指令必须将某些内容传递给外部指令(例如,它是由用户选择的)。 <outer> <inner></inner> <inner></inner> </outer> 到目前为止,我有5种方法 require: 家长指令 该inner指令可以要求该outer指令,该指令可以在其控制器上公开某些方法。所以在inner定义中 require: '^outer', link: function(scope, iElement, iAttrs, outerController) { // This can be passed to ng-click in the template $scope.chosen = function() { outerController.chosen(something); } } 在outer指令的控制器中: controller: function($scope) { this.chosen = function(something) { } } $emit 事件 该inner指令可以$emit一个事件,该outer指令可以通过响应,$on。因此,在inner指令的控制器中: controller: function($scope) { …

21
对于普通的桌面应用程序编程来说,“只雇用最好的人”是否真的有用吗?[关闭]
对于背景,我们正在做桌面工程应用程序,并使用类似AutoCAD的UI,类似于etabs。 让我感到困扰的一件事是,是否有必要聘请最优秀的开发人员?首先,我们在招聘方面遇到了很大的困难;我们看到的大多数简历都在做简单的CRUD应用程序,或者在做SharePoint自定义,我认为这些自定义并不涉及很多核心编程。即使是我们要求面试的人,大多数人也无法进行斐波那契数列和简单的二进制搜索,而且我们足够仁慈地给出提示并明确指出问题所在,从而使考生不必查找字典即可检查“斐波那契数列”是什么意思。 这让我想到:是的,我们在进行计算几何/线性编程时确实需要一定程度的编程才能,在设计软件体系结构或确定要使用哪种软件模式时确实需要一定程度的编程才能。 ,我们的许多代码只是管道代码(我认为),可以由对编程熟悉的人来完成。 鉴于我们现在确实需要编程人才,并且考虑到聘用超级巨星开发人员非常困难,我想降低自己的水准,只聘用一般的人才,这与Joel的主张直接矛盾。 你怎么看? 编辑:您不需要重写整个计算几何/线性编程库;就我的应用程序而言,您需要做的就是能够知道如何将手头的问题转化为适当的计算几何/线性编程术语,并知道何时/如何使用现有库。因此,它并不像看起来那样困难。
61 hiring 

10
我们应该测试所有方法吗?
所以今天我和队友讨论了单元测试。当他问我“嘿,那堂课的考试在哪儿,我只看到一个?”时,整个事情开始了。整个类都是一个管理器(或服务,如果您喜欢这样称呼它),几乎所有方法都只是将东西委托给DAO,所以它类似于: SomeClass getSomething(parameters) { return myDao.findSomethingBySomething(parameters); } 一种没有逻辑的样板(或者至少我不认为像逻辑这样的简单委托),但是在大多数情况下(层分离等)很有用。我们进行了相当长时间的讨论,是否应该对它进行单元测试(我认为值得一提的是,我对DAO进行了完全单元测试)。他的主要论据是(显然)它不是TDD,并且有人可能希望查看测试以检查此方法的作用(我不知道它怎么可能更明显),或者将来有人可能希望更改该方法。实现并向其中添加新的(或更多类似“ any”的)逻辑(在这种情况下,我猜有人应该只测试该逻辑)。 不过,这让我思考。我们应该争取最高的测试覆盖率吗?还是仅仅是出于艺术的缘故?我根本看不出在进行以下测试之后有任何原因: getter和setter(除非他们实际上有一些逻辑) “样板”代码 显然,对这种方法(带有模拟)的测试将花费我不到一分钟的时间,但我想这仍然是浪费时间,并且每个CI都需要花费一毫秒以上的时间。 是否有任何合理/不“易燃”的理由来说明为什么要测试每一行(或尽可能多的行)代码?

10
仅将C ++编译器用于函数重载是不好的做法吗?
因此,我正在针对某个处理器使用C进行软件设计。该工具包包括编译C和C ++的功能。对于我正在做的事情,在这种环境下没有可用的动态内存分配,并且该程序总体上非常简单。更不用说该设备几乎没有处理器能力或资源。实际上,根本不需要使用任何C ++。 话虽这么说,我在一些地方进行函数重载(C ++的功能)。我需要发送几种不同类型的数据,并且不想使用printf带有某种%s(或其他任何一种)参数的样式格式。我见过有些人无法使用C ++编译器执行此操作printf,但就我而言,可以使用C ++支持。 现在,我确定可能会遇到一个问题,即为什么我需要重载一个函数。因此,我将尝试立即回答。我需要从串行端口传输不同类型的数据,所以我有一些重载,可以传输以下数据类型: unsigned char* const char* unsigned char const char 我只希望没有一种方法可以处理所有这些事情。当我呼吁我只是希望它传递出串行端口的功能,我没有很多资源的,所以我不想做几乎没有任何事情,但我的传送。 有人看到了我的程序,问我:“为什么要使用CPP文件?” 所以,这是我唯一的原因。那是不好的做法吗? 更新资料 我想回答一些问题: 解决您的困境的客观答案取决于: 如果使用C ++,可执行文件的大小是否会显着增加。 截至目前,可执行文件的大小占用了4.0%的程序内存(5248字节)和8.3%的数据内存(342字节)。也就是说,为C ++编译...我不知道对于C会是什么样子,因为我没有使用过C编译器。我确实知道该程序不会再增长了,所以对于资源的有限程度,我会说我还可以... 如果使用C ++,是否会对性能产生明显的负面影响。 好吧,如果有的话,我什么都没注意到...但是那又可能是为什么我问这个问题的原因,因为我不太了解。 代码是否可以在只有C编译器可用的其他平台上重用。 我知道,对此的答案肯定不是。实际上,我们正在考虑使用其他处理器,但仅考虑使用功能更强大的基于ARM的处理器(事实上,我所知道的所有处理器都具有C ++编译器工具链)。

14
我们能否就解释代码和编译代码的性能做出一般性陈述?
我正在比较两种技术,以便提出建议,公司应该使用其中的一种。技术A的代码被解释,而技术B的代码被编译为机器代码。在我的比较中,我指出技术B一般而言会具有更好的性能,因为它没有解释过程的额外开销。我还指出,由于程序可以用多种方式编写,因此用技术A编写的程序仍然有可能胜过使用技术B编写的程序。 当我将此报告提交审核时,审核员表示我没有提供清楚的理由说明为什么解释流程的总费用通常会足够大,以至于我们可以得出结论,技术B的性能会更好。 所以我的问题是,我们能否谈谈编译/解释技术的性能?如果我们可以说编译的速度通常快于解释的速度,那么我该如何说服审阅者呢?

4
如果可以提高代码的清晰度,那么调用一个没有效果的函数是否更好?
我的程序(iOS应用程序)中有三个视图。它们中只有一个同时处于活动状态,因此我关闭了其中两个的可见性,并在用户按下按钮时切换可见性。视图被初始化为可见,因此我在显示主视图之前在代码中设置了可见性。 我可以 [view1 setAlpha:0.0f]; [view2 setAlpha:0.0f]; 对于其中两个视图,但现在未解决第三个视图(应在应用程序开始时显示的视图)。我把 [view3 setAlpha:1.0f]; 在前两个视图之后,因为我认为这很清楚,实际上存在三个视图,而不是看到代码时可​​能会想到的两个视图。其他程序员如何做到这一点?纯粹是偏爱还是有一些约定? 如果调用非常繁琐,那么最好不要在不需要时调用它,但是我想知道像我的示例这样的小事情。

7
是否应该检查C中的每个小错误?
作为一名优秀的程序员,应该编写能处理其程序每个结果的强大代码。但是,当发生错误时,C库中的几乎所有函数都将返回0或-1或NULL。 有时很明显,需要进行错误检查,例如,当您尝试打开文件时。但是我经常忽略诸如printf或什至malloc因为我认为没有必要而进行错误检查。 if(fprintf(stderr, "%s", errMsg) < 0){ perror("An error occurred while displaying the previous error."); exit(1); } 仅忽略某些错误是一种好习惯,还是有一种更好的方法来处理所有错误?
60 c  error-handling 

11
我应该在数据库中还是仅在代码中定义表之间的关系?
根据我的经验,我过去阅读的许多项目在数据库中都没有关系定义,而是仅在源代码中定义了它们。因此,我想知道在数据库和源代码中定义表之间的关系的优缺点是什么?而更广泛的问题是关于现代数据库中的其他高级功能,例如级联,触发器,过程...我的想法有几点: 在数据库中: 从设计中纠正数据。防止可能导致无效数据的应用程序错误。 在插入/更新数据时减少网络与应用程序的往返路程,因为应用程序必须进行更多查询以检查数据完整性。 在源代码中: 更灵活。 在扩展到多个数据库时更好,因为有时该关系可以是跨数据库的。 更好地控制数据完整性。数据库不必每次应用程序修改数据时都要检查一次(复杂度可以是O(n)或O(n log n)(?))。而是将其委托给应用程序。而且我认为,与使用数据库相比,在应用程序中处理数据完整性将导致更多详细的错误消息。例如:创建API服务器时,如果您在数据库中定义了关系,并且出了一些问题(例如所引用的实体不存在),则会收到一条带有消息的SQL异常。简单的方法是将500返还给客户端一个“内部服务器错误”,并且客户端不知道出了什么问题。或者服务器可以解析消息以找出问题所在,我认为这是一种难看且容易出错的方式。如果您让应用程序处理此问题, 还有别的事吗? 编辑:正如Kilian指出的那样,关于性能和数据完整性的观点非常误导。所以我编辑来纠正我的观点。我完全理解让数据库处理将是一种更有效,更可靠的方法。请检查更新的问题,并对此进行一些思考。 编辑:谢谢大家。我收到的所有答案都指出,约束/关系应在数据库中定义。:)。我还有一个问题,因为它超出了此问题的范围,我将其发布为一个单独的问题:处理API服务器的数据库错误。请留下一些见解。

6
为什么没有开源项目的代码概述?[关闭]
那里有非常复杂的开源项目,我想我可以为其中的一些项目做出一些贡献,我希望我能做出一些贡献,但是进入的门槛太高了,原因有一个:在同一时间更改一行代码大型项目,您必须了解所有内容。 您不需要阅读所有代码(即使您阅读,也不够用)并了解每一行的内容以及原因,因为代码可能是模块化和分区化的,所以有适当的抽象,但是即使如此,你需要获得一个概述该项目,这样你就可以知道哪里是模块,其中确实有另外一个模块接口,究竟各模块做的,为什么,以及其中的目录和文件均对这些事情的发生。 我称此代码概述为开放源代码项目可以在网站或文档中向外部人员解释其代码的部分的名称。我认为这将使潜在的贡献者受益,因为他们将能够确定他们可以建立的地方,所涉及的实际主要编码人员,因为他们将能够在编写所有内容的同时重组他们的思想,并会像他们那样帮助用户。帮助理解并更好地报告他们遇到的错误,甚至可能成为贡献者。 但是我仍然从未见过这些“代码概述”之一。为什么?是否有类似的事情,我想念他们?与我描述的功能相同的事情?还是这是一个完全无用的想法,因为除我之外,每个人都可以轻松理解具有数千行代码的项目?

8
为什么C在C ++不足的地方提供语言“绑定”?
我最近想知道何时在C ++上使用C,反之亦然?幸运的是,有人已经击败了我,尽管花了一段时间,但我能够消化该问题的所有答案和评论。 但是,该帖子中的一个项目一直不断地被处理,而没有任何示例,验证或解释: “当您想为库提供多种语言绑定时,C代码非常有用” 这是一个释义。我应该指出,有几个人指出,C ++可以通过某种extern功能实现多种语言绑定,但是,如果您完整阅读该文章,则很明显C是可移植性/语言绑定的理想之选。我的问题是:为什么? 有人可以提供一些具体的原因,为什么用C编写库可以简化其他语言的绑定和/或可移植性?

8
客户端编码:如何防止恶意使用?
在过去的几年中,客户端(浏览器)应用程序的趋势确实起飞了。 对于我的最新项目,我决定尝试与时俱进,并编写一个客户端应用程序。 此应用程序的一部分涉及向用户发送交易电子邮件(例如,验证注册,密码重置电子邮件等)。我正在使用第三方API发送电子邮件。 通常,我会让我的应用程序在服务器上运行。我会从服务器上的代码中调用第三方API。 运行客户端应用程序意味着这现在需要在用户的浏览器上进行。第三方API提供了实现此目的所需的JavaScript文件。 我看到的第一个明显问题是我需要使用API​​密钥。通常,这通常可以安全地存储在我的服务器上,但是现在大概需要将这个密钥提供给客户端浏览器。 假设我可以解决这个问题,那么下一个问题就是阻止精通技术的用户在浏览器上加载JavaScript开发人员工具并以他们喜欢的方式使用电子邮件API,而不是坚持我在应用程序中设置的任何规则。 我想我的一般问题是-我们如何防止恶意使用客户端应用程序?

8
修改传入参数是否是反模式?[关闭]
我正在用Java编程,并且我总是使转换器像这样: public OtherObject MyObject2OtherObject(MyObject mo){ ... Do the conversion return otherObject; } 在新的工作场所中,模式是: public void MyObject2OtherObject(MyObject mo, OtherObject oo){ ... Do the conversion } 对我来说,这有点臭,因为我习惯于不更改传入的参数。此传入参数更改是反模式吗?它有一些严重的缺点吗?

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.