软件工程

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

3
Clojure与Java有多独立?
我对Clojure世界很陌生。我很欣赏一个事实,即可以通过Clojure互操作功能轻松访问所有Java库,但是我想知道Clojure靠自己站了多少。 当然,有些平台(例如Android)始终需要与Java互操作,因为核心库是用Java编写或公开的。此外,由于Clojure字符串是Java字符串,因此我希望字符串操作库可以作为Java String方法的包装。 但是对于其他任务,我看不出为什么无法开发本地Clojure库的原因。考虑一下Http,日期处理,XML解析,模板,JSON序列化和反序列化,OAuth,数学库等。 所以我的问题是: Clojure在多大程度上变得独立于Java生态系统?它是否具有自己的惯用库来执行大多数这些任务和其他任务?

3
有什么好的方法来组织输入文件(Makefiles,SConstruct,CMakeLists.txt等)以构建自动化软件?
我喜欢对我的代码做的一件事是确保将其重构为可管理的部分。但是,在构建软件时,我发现无论我最终使用的构建自动化软件(最近是GNU Make或SCons)最终都变得一团糟。输入文件看起来像长脚本,似乎不容易重构。我希望能够以某种方式对其进行重构,但是“功能”的概念在某些构建自动化软件中的行为与编程语言中的行为并不完全相同,因此我发现很难编写可管理的代码任何中等复杂项目的Makefile文件或SConscript文件。 在编写用于构建自动化软件的可管理输入文件方面,有任何建议吗?与软件无关的建议是最好的,但是即使是关于特定构建自动化工具的建议也将有所帮助,尤其是Make或SCons,因为这就是我在项目中一直使用的。 编辑:正如Thorbjørn所指出的,我应该添加一些上下文和用法示例。我正在完成化学工程博士学位,并从事计算科学方面的研究。(我是SciComp.SE上的一名程序员,对于那些访问的人来说。)我的项目通常涉及混合编译语言(C,C ++,Fortran),它们执行某些繁重的脚本语言(Python) ,Perl)用于原型制作,偶尔也可以使用特定领域的语言进行原型制作或技术用途。 我在下面添加了两个示例,大致在250行范围内。对我来说,问题通常是缺乏模块化。这些项目中的一些可以组织成模块化的单元,并且最好按照这些思路抽象出构建的各个部分,以使我和将来的维护者更容易跟踪。将每个脚本分解成多个文件一直是我脑子里一直在想的一个解决方案。 第二个示例特别重要,因为我很快将不得不处理大量文件。 这是一条265行Makefile对我来说的样子,取自一个实际项目,并尽我所能组织: #!/usr/bin/make #Directory containing DAEPACK library folder daepack_root = . library = $(daepack_root)/lib wrappers = $(daepack_root)/Wrappers/DSL48S c_headers = parser.h problemSizes.h f77_headers=problemSizes.f commonParam.f f90_headers=problemSizes.f commonParam.f90 includes = -I. -Iinclude -I/usr/include/glib-2.0 \ -I/usr/lib/glib-2.0/include -I/usr/include/libxml2 \ -I/usr/include/libgdome -I/usr/include/gtest/ #Fortran 77 environment variables f77=gfortran fflags=-ggdb -cpp …

5
魁北克是否要求所有输出(包括内部日志)都使用法语?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 我曾经听过一位Microsoft架构师说过,在魁北克,程序输出必须是法语,包括自定义日志输出,其他不讲法语或魁北克省的国家/地区的服务技术人员将使用该日志输出。 显然,这是在101号法案 第5条中。如果您正确阅读了文档(感谢Matthieu),第5条说 5.商品和服务的消费者有权以法语获知和服务。 1977年 5,秒。5, 微软技术人员所说的正确吗? 这会影响程序的所有输出,还是仅影响法语用户的输出(例如,这种情况下的日志将不适用)? 它仅适用于政府机构(包括为其完成的合同工作),还是会影响私人使用和销售?
13 law 

4
文档是用户故事吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我们需要为过去几次冲刺中一直在开发的产品做一些用户文档。我们现在在下一个冲刺中开始一个新项目,采购订单正在将先前生产的产品的文档用作该冲刺的用户故事。 我只是想知道您对这种方法的看法。就个人而言,我不同意文档是Scrum中的用户故事,因为它不会产生任何代码。 编辑:谢谢您的意见。我的脑海里有一个冲刺是要实现一系列正在运行的软件,但是您的看法改变了我的看法。感谢您的所有答复。
13 scrum  user-story 

2
如何在GitHub上控制项目的版本
如今,我试图在GitHub上花费尽可能多的时间(即使我是团队中唯一的团队成员),以真正感受到现实世界中企业应用程序的情况。 我要解决的一个问题是控制版本。假设我们开始了一个项目。然后,团队成员创建了一些分支并在那里发展。准备好进行生产时,我们将所有分支与master分支合并。最后,我们开始使用version 1.0。 现在该版本1.0已发布,并且该软件的该版本存在一些问题。我们希望开始开发版本1.1,以解决由于匆忙执行项目而引入的问题。 现在,问题是这样的: 我们应该如何在这里控制版本控制? 我们是否应该为此创建一个新分支,v1.0并在其中保留1.0软件的版本,并在某些分支上(或不进行)开发,与之合并master,一起使用version 1.1? 是否有针对此类情况的约定?

3
例如,局部变量和参数变量的命名约定
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我正在与高级开发人员讨论编码约定,以适用于我们的项目(主要是Java / JEE项目)。我不同意他提出的一项约定: 实例变量名称应以“ _”开头,局部变量应以“ loc”开头,方法参数应以“ par”开头,因此很容易识别变量的来源和范围。 尽管他提出了关于短期内存和可读性的观点,但我不同意这样的事实,即它会降低可读性,IDE像Eclipse格式变量一样根据类型的不同而不同,并且通过良好的类和方法设计可以避免此问题。 您是否有任何观点,论点或研究支持我的观点(或反对)?
13 java  naming  variables 

2
使用Memcached:在更新数据库时更新缓存是一种好习惯吗?
这个问题是关于架构的最佳实践。 我们目前的架构 我有一个PHP类,可访问MySQL获取用户信息。叫它User。 User可以多次访问,因此我们实现了缓存层以减少负载。 第一层是我们所谓的“每个请求”缓存。从MySQL检索数据后,我们将数据存储在的私有属性中User。任何后续的数据请求都返回该属性,而不是从MySQL重新请求数据。 由于Web请求是根据每个请求生存和终止的,因此此缓存仅阻止应用程序在单个请求中多次访问MySQL。 我们的第二层是Memcached。当私有属性为空时,我们首先检查Memcached中的数据。如果Memcached为空,我们向MySQL查询数据,更新Memcached,然后更新的private属性User。 问题 我们的应用程序是一个游戏,有时必须使某些数据尽可能最新。在大约五分钟的时间内,对用户数据的读取请求可能会发生10到11次;那么可能会发生更新。随后的读取请求必须是最新的,否则游戏机制将失败。 因此,我们要做的是实现在数据库更新发生时执行的一段代码。此代码使用更新的数据在Memcached中设置密钥,因此所有后续对Memcached的请求都是最新的。 这是最优的吗?在尝试维护此类“活动缓存”时,是否应注意性能问题或其他“陷阱”?

2
逗号作为分隔符vs.逗号作为分隔符
在此视频中,演讲者说: “有些人对逗号的工作方式感到困惑。他们认为它们应该是定界符而不是分隔符。现在您可以以任何一种方式来考虑它们。” 我不明白分隔符和分隔符(如果有)之间的区别。视频中的含义是,现在(尾随逗号是有效的),人们可以将它们视为定界符,而不是分隔符... 顺便说一句,该语言是JavaScript。据我了解,逗号令牌有两个含义: 作为操作员(很少使用) 作为分隔符(在参数和参数列表,数组和对象文字等中) 我不确定逗号分隔符如何适合这个...
13 javascript 

4
内部与软件开发环境[已关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 在行业中,在软件开发人员编写将由公司自己使用的代码的“内部开发”环境与构建要出售/分发的软件的适当“软件开发”环境之间存在区别。对公众。 其中,两者之间的一个明显区别是,面向软件开发的公司通常会遵循某种软件开发生命周期,例如规范编写,测试,构建等,而面向内部的商店通常会坚持因为他们自己是最终用户,并且总是可以修复未正确完成的操作,所以可以更轻松地完成操作。 作为一名学生(像其他大多数学生一样),我有点希望自己能在软件开发环境中工作,但最终我在一家以内部运作方式运作的公司中获得了第一份职位。 有时,我想知道我是否错过了成熟的软件开发经验。有这种感觉的依据吗?我是否应该寻求加入适当的软件开发环境?

6
SVN使用不佳-Mercurial是答案吗?
在工作中,我们使用SVN,但仅是名称。我们不分支或合并。我们保留该存储库的两个副本,其中一个充当“标签”分支,在进行部署时会被复制,并保留用于错误修复和立即“必须尽快上线”的功能。我们必须记住将一个副本中所做的更改复制到另一副本(“主干”)中。我们在存储库中的一个文件夹中有十二个项目,而不是将它们分开。简而言之,我们使用SVN的唯一目的就是能够提交。其他所有操作都是手动完成的。 我一直在评估Mercurial;我过去曾经使用过Git(我是团队中唯一使用过DVCS的人),而且我正在迅速接手Mercurial。我正在讨论将Mercurial作为一种“更好的做事方式”介绍给团队的其他成员,因为分支很容易,合并更容易,而且我们可以将内容本地化为我们的核心内容,而只将它们推送到中心准备好后分支。我们将获得SVN的所有好处(而且由于没有人真正了解SVN,我们现在并没有得到太多好处),而且对于新功能,我们不必拥有大量未版本化的文件,因此,如果我们必须回滚我们搞砸了。工作流程似乎更简单-我们只需要记住“ Commit”是本地的,“ Push”就像SVN的提交, 这是一个好方法吗?请记住,团队非常灵活,将与一切能够改善我们的工作质量并使我们的工作变得更轻松的事情一起工作-CIO甚至问我,当我提到我们不充分利用SVN的潜力时,有更好的东西可以使用吗?” 所以他也同意。

7
我可以在没有工程师的情况下申请“软件工程师”职位吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 我来自某个国家/地区,在该国家/地区中,“工程师”或“工程”一词的使用受到严格的法规管制。这意味着您必须拥有工程学学位并通过考试才能加入工程师专业协会才能使用该头衔。我对全球行业中使用的“软件工程师”一词有些困惑。 我读了关于软件工程师维基百科页面和链接部有关术语的使用,它提供了深入的讨论页面。但是我的问题更具体。 知道我没有工程学学位(但是,我想认为我生产的是功能齐全,设计良好的软件!),当我看到某跨国公司的软件工程师的职位时,我是否适合申请?我应该以某种方式强调我没有工程学学位吗?

4
优化CPU缓存(在C中)时重要的是什么?
阅读这两个问题,我发现了解CPU缓存行为在处理内存中的大量数据时可能很重要。我想了解缓存的工作方式,以便将其他工具添加到优化工具箱中。 关于CPU缓存工作方式的核心点是什么,以便我可以编写明智地使用它的代码?相关地,是否有一种方法可以对代码进行概要分析,以查看缓存使用不当是否会减慢速度?

2
部署脚本是否应该是构建的产物?
这是一个用Java编写的Web项目。 因此,我正在编写构建和部署脚本。为了创建构建,我使用了ant。詹金斯(Jenkins)完成了连续构建。 构建生成3个不同的工件: 战争档案 带布局的拉链 带图片的拉链 到目前为止,一切都很好,但是现在我需要编写部署脚本,该脚本应该: 将战争(工件1)部署到在服务器1上运行的tomcat 将工件2放置在服务器1的特定目录中 将工件3放置在服务器2的特定目录中 因此,我正在与我的同事交谈,他说我们还应该生成一个工件(也许是deploy.xml),当将其放置在正确的服务器上时,就可以部署这些工件。 因此,将有另一个脚本,它将是: 下载詹金斯文物 scp到每个服务器,并将deploy.xml放在此处 远程调用deploy.xml 使我有些不舒服的是将deploy.xml作为构建工件的行为。其背后的动机是能够进行部署而无需访问VCS存储库,因此构建将是自包含的,即,任何构建只能使用Jenkins生成的内容才能投入生产。 部署脚本应该放在哪里?它们应该只在VCS还是应该是构建工件?

3
域驱动设计中的域对象是否应该仅是写操作?
我已经阅读了近两年的关于域驱动设计的文章,并且一直在谨慎地将一些概念引入我的日常工作中,或者至少计划了如何在域驱动设计中定期完成工作的计划。 我开始得出一个结论,尤其是在阅读了有关事件源和命令查询责任隔离(CQRS)的更多信息后,域对象可能仅用于写目的。更清楚地说,在我阅读的许多文档中,人们似乎巧妙地暗示了域对象负责进行以域为中心的操作/计算,验证,然后在那里主要是为持久化提供了一条途径存储库实现中提供的基础结构。尽管我喜欢这样的事实,因为它可以大大简化领域模型,因为它消除了公开状态的责任。 如果确实确实将域对象主要用作只写对象,那么这对我提出了一些问题,希望有人可以回答。 如何对具有setter的对象或修改对象状态但不提供向外公共接口以从诸如C#中的属性获取器读取状态的方法执行单元测试?仅仅为了使该对象可测试就可以公开状态吗? 如何向用户显示在域中完成的计算或运算的结果,而不必持久存储它们,然后将结果从持久存储中拉出到域的上下文之外?仅出于显示结果的目的而公开状态是否可以? 根据经验,唯一的属性获取器(获取访问器)应该是在域中也可写的属性吗?还是换句话说,只读属性应该唯一避免,因为它们仅出于读取目的存在,因此在实际的域模型中不发挥必要的作用? 相关资料: TDD,DDD和封装

4
您如何在多租户系统中管理可扩展性?
我现在有一些基于Web的大型多租户产品,很快我就会发现会有很多针对租户的自定义设置。 这里或那里的额外字段,可能是工作流程中间的额外页面或某些额外的逻辑-诸如此类。 其中一些自定义项可以纳入核心产品,这很棒。其中一些是非常具体的,并且会妨碍其他人。 我有一些想法可以解决这个问题,但是似乎没有一个很好的扩展。显而易见的解决方案是引入大量的客户端级别设置,从而允许基于每个客户端启用各种“功能”。这样做的缺点当然是庞大的复杂性和混乱性。您可能会引入大量的设置,并且随着时间的流逝,各种类型的逻辑(演示,业务)可能会失控。然后是特定于客户的字段的问题,这比起在现有表中添加一堆可以为空的字段来讨价还价。 那么人们在做什么来管理呢?Force.com似乎是可扩展性的主人。显然,他们已经从头开始创建了一个超级可扩展的平台。您可以使用其基于Web的用户界面添加几乎所有内容。FogBugz做了一些类似的事情,他们创建了一个健壮的插件模型,考虑到它,可能实际上是受Force启发的。我知道他们在上面花了很多时间和金钱,如果我没记错的话,目的是在内部实际使用它来进行未来的产品开发。 听起来像我可能会尝试构建的那种东西,但可能不应该这样做。:) 在可插拔架构上进行大量投资是唯一的方法吗?您如何处理这些问题,并且看到了什么样的结果? 编辑:看起来FogBugz确实通过构建一个相当健壮的平台,然后使用它来组装屏幕来解决了该问题。要扩展它,您将创建一个包含实现ISearchScreenGridColumn之类的接口的类的DLL,该DLL成为一个模块。考虑到他们拥有大量的开发人员,并且他们从事了几个月的开发工作,我确信构建起来非常昂贵,而且它们的表面积可能是我应用程序大小的5%。 现在,我很想知道Force.com是否是处理此问题的正确方法。我是ASP.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.