软件工程

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

8
框架是否放置过多抽象?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我已经进行了不到一年的编程,并且在编写系统应用程序,Web应用程序和用于企业/组织的脚本方面有一些经验。但是,我从未真正完成的一件事是使用Django,Rails或Zend之类的框架。 回顾Django框架,我对框架中提取了多少东西感到沮丧。我了解DRY和最少的代码的核心目标,但是对不同模块的过度依赖以及对核心功能的过度抽象有些感觉是这样的: 由于模块/框架的不断变化的性质,使得程序的过时速度非常快, 由于存在大量可用的框架和模块及其所有特质,使得代码难以理解, 除非您已阅读所有文档,否则使代码的逻辑性降低。也就是说,我可以通读一些列表理解和条件逻辑,弄清楚程序在做什么,但是当您看到需要传入任意字符串和字典的函数时,除非您已经是一位高手,否则事情会变得有些难以理解。给定的模块;和: 使得在框架之间进行切换既困难又乏味。在语言之间进行切换已经是一个挑战,但是如果您对语言的核心功能/理念有足够的了解,这是可以管理的。框架之间的切换似乎更多是死记硬背的问题,从某些方面看,这似乎鼓励了这些框架旨在消除的低效率。 我们真的需要在像MySQL查询这样简单的内容上放置50层抽象吗?为什么不使用类似PHP的PDO接口那样的功能,在该接口中可以处理准备好的语句/输入测试,但是通用的SQL查询仍然是该功能的一部分? 这些抽象真的有用吗?功能膨胀是否会使它们无用,从而使应用程序比没有使用框架编写的类似应用程序更加困难?

4
我什么时候可以发布在工作中编写的软件工具?
我正在处理一个相当通用的软件问题,但是找不到适合解决它的库,所以我正在考虑自己写一个(至少是基本版本)。我将在工作中编写一些(如果不是全部)1.0版本,因为我需要该项目。如果结果很好,我可能想把作品带回去并对其进行完善只是为了好玩,也许可以将其发布为一个开源项目。但是,我担心如果我在工作中编写1.0版本,从法律的角度上可能不允许这样做。显然我可以问我的老板(谁可能不在乎),但是我很好奇其他程序员如何处理这个问题以及法律的适用范围。我的一句话是什么时候可以(合法/道德地)开放您最初为工作而编写的软件工具的源代码?如果您在下班时间大幅扩展了原始资源怎么办? 后续行动:假设我将自己的全部内容都写在家里,然后在工作中简单地使用它,这会大大改变事情吗? 后续行动2:请注意,我并不是想剥夺我的雇主(我知道他们要付钱给我来开发自己拥有的产品)-我只是想知道是否有一种公平的方法来为所有相关人员做这件事...如果将来有一些非营利组织可以使用我的代码并节省一些时间,那就太好了。同样,还有另一个问题在危急中。如果我是为一个非常简单,通用的东西(例如Javascript中的HTML表)编写该库,那是否意味着我永远也不会自己承担法律风险(即使这是全新的重写或较大项目的一部分)。由于工作中的代码可能仍然在我的脑海中影响着我,我是否在我的余生中放弃了为此类项目编写代码的权利(未经该公司的许可)?这似乎与软件专利有关,
24 legal 

1
Github如何计算回购中的语言百分比?
我有一个包含Ruby和PHP代码的仓库。 Github说我的仓库是74.8%PHP和25.2%Ruby 我不知道这怎么可能。当我比较项目中的两种语言时: # Count how many files: # Ruby ls | grep ".*\.rb" | wc -l # returns 10 #PHP ls | grep ".*\.php" | wc -l # returns 1 # Count how many lines, words, chars: # Ruby cat *.rb | wc # returns 229, 812, 5303 # …
24 github 

7
非技术人员如何学习为小型项目编写规范?
非技术人员如何学习编写小型项目的规范? 我的一个朋友正在尝试将统计项目的某些开发外包。 特别是,他在excel中做了很多工作,并且希望将脚本的创建工作外包出去,以手工完成现在的工作。 但是,我的朋友是非技术性的。他不擅长编写技术规范。 当他确实编写规范时,将按照您描述在excel中做某事的方式编写(转到此单元格,然后将值复制到该单元格)。它也太冗长,并且多次进行示例。我不确定他是否恰当地描述了极端情况。 他外包的第一个项目失败了。我认为他过多地描述了一些细节,但未充分说明极端情况。他和/或他雇用的编码人员没有仔细考虑并提出适当的问题。我不确定。我与他进行即时通讯,花了半个小时才找到一个描述,该描述本该花了五分钟或更短的时间来描述。最后,我为他编写了脚本,但没有检查为什么他的编码器处理失败。 他已向我寻求帮助。但是,我拒绝参与,因为按照他的规范并将其转换为明确的要求比执行明确的规范要多十倍的工作量。 他学习的正确方法是什么?他有可用的资源吗?他有什么方法可以和编码员一起从小型低压实践项目中学习? 他的大部分脚本都是面向统计和数据处理的。例如,使用此列并对其求平均值。在这种情况下删除这些行。因此,挑战与指定网络应用程序不同。

5
加载应用程序设置的最佳方法
保留Java应用程序设置的一种简单方法是使用扩展名为“ .properties”的文本文件表示,该文件包含与特定值(此值可以是数字,字符串,日期等)关联的每个设置的标识符。 。C#使用类似的方法,但文本文件必须命名为“ App.config”。在这两种情况下,都必须在源代码中初始化一个特定的类来读取设置:此类具有一种方法,该方法返回与指定的设置标识符关联的值(作为字符串)。 // Java example Properties config = new Properties(); config.load(...); String valueStr = config.getProperty("listening-port"); // ... // C# example NameValueCollection setting = ConfigurationManager.AppSettings; string valueStr = setting["listening-port"]; // ... 在这两种情况下,我们都应该解析从配置文件加载的字符串,并将转换后的值分配给相关的类型化对象(在此阶段可能发生解析错误)。解析步骤之后,我们必须检查设置值是否属于特定的有效域:例如,队列的最大大小应为正值,某些值可能是相关的(例如:min <max ), 等等。 假设应用程序应在启动时立即加载设置:换句话说,应用程序执行的第一个操作是加载设置。设置的任何无效值必须自动替换为默认值:如果一组相关设置发生这种情况,则这些设置都将设置为默认值。 执行这些操作的最简单方法是创建一个方法,该方法首先解析所有设置,然后检查加载的值,最后设置任何默认值。但是,如果使用这种方法,维护将很困难:随着开发应用程序时设置数量的增加,更新代码变得越来越困难。 为了解决此问题,我想到了如下使用“ 模板方法”模式。 public abstract class Setting { protected abstract bool TryParseValues(); protected …

7
只做一件事的类的模式
假设我有一个程序可以执行以下操作: void doStuff(initalParams) { ... } 现在,我发现“做事”是相当复杂的操作。该过程变得很大,我将其拆分为多个较小的过程,很快我意识到在进行填充时具有某种状态会很有用,因此我需要在较小的过程之间传递较少的参数。因此,我将其纳入自己的类中: class StuffDoer { private someInternalState; public Start(initalParams) { ... } // some private helper procedures here ... } 然后我这样称呼它: new StuffDoer().Start(initialParams); 或像这样: new StuffDoer(initialParams).Start(); 这就是感觉不对的地方。使用.NET或Java API时,我始终不会调用new SomeApiClass().Start(...);,这使我怀疑自己做错了。当然,我可以将StuffDoer的构造函数设为私有,并添加一个静态辅助方法: public static DoStuff(initalParams) { new StuffDoer().Start(initialParams); } 但是然后我有了一个其外部接口仅包含一个静态方法的类,这也感觉很奇怪。 因此,我的问题是:这种类型的类是否有公认的模式? 只有一个入口 是否没有“外部可识别”状态,即实例状态仅在执行该入口点时需要?

4
无法理解敏捷宣言原则中的某些观点
我在读敏捷宣言原则。除以下几点外,一切似乎都清晰合理: 简单性-最大化未完成工作量的艺术-是必不可少的。 我不明白这一点。这是否意味着应该以某种方式夸大未完成的工作?如果是这样,那真的没有意义。
24 agile  management 


8
使用分部类实现“模块化”是否很常见?
我最近在我们的代码库中遇到了一个情况,一个不同的团队创建了一个“神类”,其中包含约800个方法,并作为部分类分为135个文件。 我问了另一个团队。尽管我的直觉是从轨道上取笑,但他们坚持认为这是一种好的设计,是一种惯例,并且它促进了“模块化”和“易于实现”,因为新开发人员可以在几乎不了解其余知识的情况下使用功能系统的。 这实际上是常见的做法还是任何一个好主意?我倾向于立即采取措施降低这头野兽的生命(或至少阻止它进一步成长),但我愿意相信自己是错的。
24 c#  .net 

10
如何向团队添加新开发人员
我经营一家只有2个开发人员的小公司。我们正在为我们的一位客户构建非常大的应用程序。这个项目的开发已经进行了1.5年。 现在,该客户已获得了重要的赞助,他们正在组织与此项目有关的活动。所以现在我们有两个月的截止日期,我们不能错过。 我们正在考虑向团队中添加新的开发人员,我想知道我们能做些什么来帮助他整合。 这种情况: 我们正在接近布鲁克斯法则的门槛-添加新的开发人员将适得其反。 该应用程序的设计相对较好,但是在某些方面(尤其是较旧的代码)的实现是混乱的。 仅对最新代码进行单元测试。这个项目开始时,我们没有定期进行测试。 文档和注释不完整。 该应用程序既大又复杂。 客户以一种非常清晰且“程序员友好”的方式写下了有关其项目的几乎所有细节。 现在添加一个人是个好主意吗?如果是这样,我们应该怎么做才能帮助新开发人员融入团队? 编辑: 赞助商将在明年春季组织基于互联网的体育赛事。它必须在一年中的特定日期开始。我们无法更改。 我们的开发人员(我是两者之一)需要做的是: 完成现有的应用程序(大约需要完成的工作的25%)。 创建一个新模块,对于组织此次活动至关重要(大约需要完成的工作的75%)。如果不了解主程序的API,就无法开发此新模块。 我无法准确估算时间,但我们处于危险境地。

3
双向同步的冲突解决
假设连接并不总是可用的,您如何管理“主”数据库服务器和许多“辅助”服务器之间的双向同步,特别是解决冲突? 例如,我有一个移动应用程序,该应用程序使用CoreData作为iOS上的“数据库”,并且我希望允许用户在没有Internet连接的情况下编辑内容。同时,此信息可在设备将连接到的网站上找到。如果/当两个数据库服务器上的数据发生冲突时,该怎么办? (尽管我知道CoreData有点不同,但我将其称为DB服务器。) 是否有处理此类问题的一般策略?这些是我可以想到的选项: 1.始终将客户端数据用作更高优先级 2.与服务器端相同 。3.尝试通过标记每个字段的编辑时间戳并进行最新编辑来解决冲突。 尽管我敢肯定,第三个选项会为破坏性的数据破坏打开空间。 我知道CAP定理与此有关,但是我只想最终保持一致,所以不能完全排除它,对吗? 相关问题:双向数据同步的最佳实践模式。对这个问题的第二个回答说,这可能无法完成。

6
当生产中断时了解问题
场景: 您推动生产 推动打破了多件事 相同的构建没有破坏质量保证或开发 作为开发人员,您没有产品访问权限。 来自上层的压力很大,促使事情不断发展。 细节: 在Zend中由API驱动的PHP / MVC应用程序。 部署到几个服务器。 我的问题: 在调查时,可以说我有种直觉,认为出了什么问题。但是,我不确定。而且,当然,我无法测试生产中的东西。如果我有基于这种想法的建议修复程序,那么在理解问题所在之前,尝试并应用它并查看它是否有效是否明智?
24 bug  production 

4
BDD实际上是非程序员可写的吗?
行为驱动的开发及其标志性的“ Given-When-Then”场景语法最近被大肆宣传,因为它有可能用作软件功能评估的边界对象。 我绝对同意,Gherkin或您喜欢的任何功能定义脚本都是商业可读的 DSL,并且已经提供了这样的价值。 但是,我不同意它是非程序员可写的(就像Martin Fowler一样)。 有人对非程序员编写的场景,然后由开发人员提供的场景有说明吗? 如果确实对缺乏可写性达成了共识,那么您是否会看到一种工具的问题,该工具可以从实际测试中生成业务可读的场景,而不是从场景开始并对其进行检测。 更新:关于“场景生成器”工具,它当然不会神奇地猜测业务语言;)但是,就像我们当前使用正则表达式匹配器以自顶向下的方法(在抽象维度上)创建测试一样,我们可以使用字符串构建器以自下而上的方式创建方案。 “仅给出想法”示例: Given I am on page ${test.currentPage.name} And I click on element ${test.currentAction.element} …

5
重新设计数据库的最佳实践
在为应用程序设计数据库时,我知道一些通用的最佳做法,但是重新设计呢? 我正在一个负责重新设计内部业务应用程序的团队中,尽管尽管我说的是“内部”,但不幸的是,我仍然有很多很多层次的人无法与系统的实际用户联系。 当前程序以Oracle Forms形式存在,散布在许多非规范化表中,有时还有多个几乎重复的表,它们在彼此的数据上略有不同。约束通常以存储过程执行不力的形式出现。甚至类型似乎也没有正确存储。我遇到了各种各样的错误数据,Oracle似乎忽略了这些错误数据,但这些数据适合SQL Server的“导入/导出向导”。(例如,两位整数不构成完整的日期时间!) 原始程序可能要追溯到二十年前,所有原始开发人员都已经退休很久了,以至于这里的老年人也不知道他们是谁。结果,实际上也没有任何干净的要求—我们只应该复制现有应用程序的功能并保留其现有数据。 重写的最终结果将是在ASP.NET上运行的基于Web的版本,后端是MS SQL Server。 我的另外两个开发团队成员都比我大得多,都具有商业/ MIS背景,而我的则是CS。高级成员的经验几乎完全是Oracle表格,而其他成员则主要在Visual Basic中完成业务应用程序工作。尽管我的数据库背景仅限于为MySQL或SQLite中的项目设计新数据库,主要是针对我的本科课程,但我似乎是唯一拥有实际设计数据库经验的人。 我已经用C#编写了一个小程序,该程序将所有现有数据读取为中性格式,可以重新广播并放置到新数据库中。我计划在设计目标数据库之后编写加载代码,以便可以在新的规范化表中正确分割数据,以正确的顺序添加数据以遵循新的约束,等等。然后可以再次运行同一程序将生产数据复制到真正新部署的完成的重新设计中。剩下的主要工作是对数据库进行实际的重新设计。 所以我的问题的核心:从现有应用程序的数据库级别进行重新设计的最佳实践是什么?

7
建立/满足我经常使用不熟悉的平台和框架的截止日期
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我为在线广告领域的产品开发组织工作。我收到的作业几乎总是放在我从未使用过的平台或工具上。最初是android。然后是node.js,然后是Windows Phone,然后是debian打包,然后是python,hadoop,神经节,逆向工程,geo PostgreSQL,列表就这样了。 我很高兴能在工作中学到很多东西。我一直遇到的问题是要按时完成任务。通常,不清楚完成特定任务需要做什么。我将需要设置相关的SDK,开始接触问题,在线阅读,仔细阅读文档,在线研究该平台上的每一项工作。有时给我最后期限,有时我创建那些期限。 我发现很多时候都很难按时完成任务。一个人第二次做某事变得更快,但是我从事某种语言或框架的工作从未超过一两个星期。这是非常压力和痛苦的应对。我错过了截止日期所带来的所有挫败感和公开羞辱。我怀疑这是不正常的。一周内不可能交付7个不了解c#的Windows Phone应用程序。但是我在截止日期的一天后设法做到了。我所有的时间都是Google搜索来指导我。我定制的工具通常很少甚至没有文档。 我有时会停留在某些东西上,有时甚至是数小时甚至数天。这会损害我的健康,并且我不再能够为每项任务燃烧午夜的油。这会引起很多精神上的痛苦和沮丧。 在这种情况下,我是否正确地认为我提供的任何截止日期都是黑暗中的一枪? 这正常吗?您是否为每个工作项目都需要每次学习全新的东西?我不确定我是否表现欠佳,因为我无法按时完成涉及我一无所知的工具的任务。我该如何处理?

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.