软件工程

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

5
没有中央数据库
我有一个客户正在寻求构建处理非常敏感的数据(比银行/卡详细信息更敏感)的网站/移动应用/桌面应用。由于数据的敏感性,他们不想将其保存在中央数据库中,但他们仍然希望其应用程序进行同步(假设我将一些数据添加到了移动应用程序中,然后我希望能够转到我的移动应用程序中。桌面应用程序并看到相同的数据)。 我想不出一种不错的,可靠的方法来做到这一点,我不确定是否有一种方法。这就是为什么我在这里。有谁知道我该如何处理这些数据? 我正在考虑的一种解决方案是在每个应用程序上都有一个客户端数据库,该数据库将以某种方式在应用程序之间进行同步,我可以看到这是非常不可靠的,而且变得混乱。

6
为什么Python在迭代列表时仅复制单个元素?
我只是意识到在Python中,如果有人写 for i in a: i += 1 a实际上,原始列表的元素根本不会受到影响,因为该变量i原来只是中原始元素的一个副本a。 为了修改原始元素, for index, i in enumerate(a): a[index] += 1 将需要。 我真的为这种行为感到惊讶。这似乎很违反直觉,似乎与其他语言不同,并且导致了我的代码错误,而今天我不得不调试了很长时间。 我之前阅读过Python教程。可以肯定的是,我刚才再次检查了这本书,它甚至根本没有提到这种行为。 这种设计背后的原因是什么?难道它会成为许多语言的标准做法,以便本教程相信读者应该自然地获得它吗?以后我应该注意哪些其他语言的迭代行为?
31 python  list  iterator 


6
如果它允许更轻松地解决另一个问题,是否可以散发出代码的味道?[关闭]
我和一群朋友在过去的一段时间里一直在从事一个项目,我们想发明一种很好的面向对象的方法来表示特定于我们产品的方案。基本上,我们正在开发东方风格的 子弹地狱游戏,我们希望建立一个系统,在其中可以轻松表示我们可以梦想的子弹的任何可能行为。 这就是我们所做的;我们制作了一个非常优雅的架构,使我们可以将项目符号的行为划分为不同的组件,这些组件可以随意附加到项目符号实例上,类似于Unity的组件系统。它工作得很好,易于扩展,灵活并且覆盖了我们的所有基础,但是存在一个小问题。 我们的应用程序还涉及大量的程序生成,即我们以程序方式生成项目符号的行为。为什么这是个问题?好吧,我们的OOP解决方案虽然表现优雅,但是代表人的举止却很复杂,如果没有人使用它,工作起来会有些复杂。人类足够聪明,可以想到既合理又明智的问题解决方案。程序生成算法还不那么聪明,我们发现很难实现一个充分利用OOP架构的AI。诚然,该体系结构的一个缺陷是并非在所有情况下都直观。 因此,为了解决此问题,我们基本上将不同组件提供的所有行为都推到了bullet类中,这样我们可以想像到的一切都直接在每个bullet实例中提供,而与其他关联的组件实例不同。这使我们的过程生成算法更容易使用,但是现在我们的bullet类是一个巨大的上帝对象。到目前为止,它很容易成为程序中最大的类,它的代码量是其他任何代码的五倍以上。维护也有点麻烦。 可以让我们的一个类变成一个上帝对象,只是为了使其更容易处理另一个问题吗?通常,如果它允许更轻松地解决其他问题,代码中是否会有代码味道是可以的吗?

10
假设任何物理量都可以用64位整数表示而没有上溢或下溢是否合理?
如果(low + high) > INT_MAX(http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html),则JDK中的原始二进制搜索算法使用32位整数,并且存在溢出错误。。 如果我们使用(带符号的)64位整数重写相同的二进制搜索算法,是否可以假设它low + high永远不会超过INT64_MAX,因为实际上不可能有10 ^ 18字节的内存? 当使用(有符号的)64位整数表示物理量时,是否假定不会发生下溢和溢出是否合理?

4
如何防止Web应用程序中的竞争状况?
考虑一个电子商务网站,其中Alice和Bob都在编辑产品清单。爱丽丝(Alice)正在改善描述,而鲍勃(Bob)正在更新价格。他们开始同时编辑Acme Wonder Widget。鲍勃首先完成并用新价格保存产品。爱丽丝花了更长的时间来更新描述,完成后,她用新描述保存产品。不幸的是,她还用原先的价格覆盖了价格,这是不希望的。 以我的经验,这些问题在Web应用程序中极为常见。某些软件(例如Wiki软件)确实对此具有保护作用-通常第二次保存失败,并显示“页面在编辑时已更新”。但是大多数网站都没有这种保护。 值得注意的是,控制器方法本身就是线程安全的。通常,他们使用数据库事务,从某种意义上说,如果爱丽丝和鲍勃试图在同一时刻进行保存,就不会造成损坏,这使它们变得安全。竞争条件是由Alice或Bob在浏览器中拥有过时的数据引起的。 我们如何预防这种比赛条件?我特别想知道: 可以使用哪些技术?例如,跟踪上次更改的时间。各自的优缺点是什么。 什么是有用的用户体验? 此保护内置哪些框架?

3
代码缩进的起源
我有兴趣了解谁引入了代码缩进,以及引入的时间和地点。 对于代码理解来说,这似乎至关重要,但这并不是通用的。大多数Fortran和Basic代码是缩进的(?),Cobol也是如此。 我敢肯定,我什至看到过旧的Lisp代码都写成连续的,换行的文本。您只需要在脑子里数一下括号就可以解析它,不要介意理解它。 那么,如此巨大的进步从何而来呢?我从未见过有关其起源的任何提及。 除了使用它的原始示例外,我还在寻找有关缩进的原始讨论。

6
我们需要在64位Windows中测试32位软件吗?
我正在软件开发团队中担任软件开发人员。我已经在同一个项目上工作了三年。该软件是.NET 4中基于32位桌面的C#应用​​程序。Windows7是我们的目标平台(直到去年我们都必须支持Windows XP)。该软件与编写了定制驱动程序的各种定制硬件进行通信。硬件制造和驱动程序软件由我们的客户编写。当然,对于32位和64位Windows,有不同的驱动程序。 在系统测试阶段,我们将同时在32位和64位Windows 7中执行所有/大多数测试用例。我不记得我们的软件中是否存在只有一种Windows风格的错误。有了这种经验,我开始怀疑,我们真的需要在64位Windows上测试32位软件吗? 行业标准是什么?

6
在无法到达的代码中抛出新的RuntimeExceptions是否不好?
我被指派去维护一个由更熟练的开发人员编写的应用程序。我遇到了这段代码: public Configuration retrieveUserMailConfiguration(Long id) throws MailException { try { return translate(mailManagementService.retrieveUserMailConfiguration(id)); } catch (Exception e) { rethrow(e); } throw new RuntimeException("cannot reach here"); } 我很好奇投掷RuntimeException("cannot reach here")是否合理。知道这段代码来自经验丰富的同事,我可能会漏掉一些明显的东西。 编辑:这是一些答案所指的扔尸体。我认为这个问题并不重要。 private void rethrow(Exception e) throws MailException { if (e instanceof InvalidDataException) { InvalidDataException ex = (InvalidDataException) e; rethrow(ex); } if (e …

9
向非程序员介绍MVC [关闭]
我需要向非程序员解释MVC。即,在进度报告的范围内,致其他部门的经理。我要做的一件事是将我们的代码库重构为MVC分离。 他们可能会问什么是MVC分离?他们可能会问为什么需要它? 在阅读了这样一个相当技术性的答案之后: 真正的MVC是什么?,我并不完全满意,因为我将与非程序员交谈。他们可能会点头,但他们可能不明白这是什么以及为什么需要它。 实际上,除了“为了提高对软件进行更改的灵活性而将关注点,职责,功能,类,块,任务,事物分开)之外,我还没有完全掌握MVC的含义。我认为使用DI和OO工具和技术将数据库从视图中分离出来,并将视图从业务逻辑中分离出来,我认为这是MVC分离。 因此,下一次您向具有销售和会计背景的非程序员讲解MVC时,您会告诉他们什么?
31 mvc 

8
直接使用Make做过时了吗?[关闭]
因此,我遇到了很多有关直接创建makefile的评论/帖子/等等,以及在2015年如何做是一件愚蠢的事情。我知道诸如CMake之类的工具,实际上我经常使用CMake。事实是,CMake只是为您创建Makefile,并帮助消除了您自己做的乏味。当然,它还添加了许多其他强大的功能……但是最后它仍然是一个Makefile。 所以我的问题是,关于make的“过时”讨论是指整个Make实用程序,还是仅仅是手动编写自己的Makefile的想法?我根本不使用IDE进行C / C ++开发(只是emacs),所以我总是写Makefile。 如果Make被认为已经过时,那么C / C ++开发人员应该使用什么来构建小型个人项目?
31 c++  c  builds  make  cmake 

10
如何在程序中隐藏我的签名?[关闭]
我们有一所大学的编程课程,并且同学们正在我们的Facebook组中提出一些编程问题。我有些犹豫,不愿分享我的所有程序,尤其是对于其中一项任务来说很酷的时候,因为这些内容是由技术顾问查看的,他们可能会注意到有人是否拥有相同的程序,并开始询问程序的来源从。不过,有时候我还是想分享自己的代码来帮助他人,但是我不希望人们只是抓住我的工作。(澄清:我们被允许与任务协作)这当然是一条很短的路线。虽然我想帮助一些人,但我担心他们可能没有学术上的诚实来自行编写代码。 我的大多数同学在技能上都不是很熟练,所以我想说的是,将我的名字隐藏在精心制作成离散位置的Base-64编码字符串中。尽管如此,对于随机的字符串来说还是坐着太明显了。 有哪些选项可以隐藏我的名字而不使其看起来可疑? 我在CodeGolf上看到,他们在评估时将ascii艺术转化为其他东西。我可以利用类似的策略吗?理想的解决方案是看起来很适合的东西,但实际上具有证明我从一开始就对其进行编码的功能。 澄清:(对不起,应该早点说)我们可以合作,但必须向TA解释我们的计划以获取积分。如果某些复活节彩蛋泄漏出去,这是很令人满意的,特别是因为它可能很想交换程序来检查它们产生的问题的答案是否相等,或者看看其他人如何解决该问题。
31 copyright 


7
业务逻辑是否可能不会潜入视图?
在过去的三年中,我已经为多个Web应用程序项目进行了开发,无论是个人的还是工作的,我似乎都无法弄清楚是否有可能至少某些业务逻辑没有出现在应用程序的视图层中。 在大多数情况下,会出现类似“如果用户选择了选项x,那么应用程序必须使他能够提供y的信息,否则,他/她应该提供信息z”之类的问题。或执行一些AJAX操作,该操作应将一些更改应用于模型,但除非用户明确要求,否则不要提交更改。这些是我遇到的一些最简单的问题,我无法弄清楚如何避免视图中的复杂逻辑。 我读过的大多数有关MVC的书通常都展示一些非常琐碎的示例,例如CRUD操作,它们仅更新服务器上的数据并显示它们,但在大多数功能丰富的应用程序中,情况并非如此。 是否可以实现完全没有业务逻辑的视图?

9
如何在没有“为什么”作为答案的情况下问程序员一个问题
我们都有这种经验。您去找一个知道答案的人,问那个人这个问题,他们会以典型的回答回答:“为什么?” 您解释了为什么需要知道,他们试图解决您的问题。 将对话引导回原始问题并获得该死的答案需要时间,手臂弯曲和耐心。 为什么程序员会不断地这样做,为什么程序员变得越高级,行为就会变得更糟? 您如何以最有效的方式向程序员提出问题,以提取原始问题的答案?

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.