在另一次压力释放之后,软件工程师会遇到什么?好吧,我们在小组中遇到的第一件事是我们在公开场合发布的错误.我们作为软件工程师在压力释放后遇到的最大问题是意大利面条代码,也称为泥球.
追求完美的时间和金钱很少可用,也不应该.为了生存,我们必须尽一切努力让我们的软件按时运转.事实上,如果一个团队有时间完成一个项目,今天的管理人员很可能会将其作为一个标志,以便在下一次提供更少的时间和金钱或更少的人.
您需要在预算范围内按时交付高质量的软件
成本:架构是一项长期投资.支付账单的人很容易解雇,除非有一些切实的直接利益,如税务注销,或者除非有多余的资金和时间可用.这种情况很少发生.更常见的是,客户需要明天工作的东西.通常,控制和管理开发过程的人根本不认为架构是一个紧迫的问题.如果程序员知道工艺是看不见的,而管理者无论如何也不想为此付出代价,那么就会产生恶性循环.
但如果真的如此,那么每个长期的软件项目最终都会导致一团糟.
我们知道并非总是会发生.怎么会?因为管理者不把架构视为紧迫问题的说法是错误的.至少现在.IT领域的管理人员非常清楚可维护性是业务的关键.
业务依赖于驱动它的数据.企业已经变得严重依赖于他们的软件和计算基础设施.有许多关键任务系统必须每周二十四小时/每周七天播出.如果这些系统出现故障,则无法检查库存,无法支付员工费用,无法路由飞机等.[..]
因此,寻求方法使系统远离泥泞的大球是业务的核心.该系统仍然可维护.系统实际上是有效的,而且你作为程序员可以证明它确实如此.你的经理是否问你今天是否完成了编码,她是否会问你是否可以在今天完成修复A,B和C的版本,或者她是否询问将要发布的软件是否真的有效?你证明它有效吗?什么?
现在我的问题:
我们有什么方法可以向我们的经理和/或利益相关者证明我们的软件有效?我们软件单元测试的那些绿灯是否足够好?如果是的话,那不仅仅证明我们的泥球仍在按照我们的预期行事吗?该软件是否可维护?你怎么能证明你的设计是对的?
[后来添加]
Chris Pebble他的回答是让我的团队走上正轨.质量保证绝对是我们正在寻找的东西.谢谢克里斯.与利益相关方达成一致的QA政策不是我的团队所寻求的合乎逻辑的结果.
后续问题是质量保证政策应该是什么?
更多信息:我领导的团队正在构建其他软件团队所使用的Web服务.这就是为什么破坏网络服务立即花钱的原因.当演示层团队的开发人员或实际的测试人员无法前进时,我们立即面临压力并且必须尽快修复错误,这反过来会导致快速破解.
[稍后补充]
感谢所有的答案.这确实是关于'信任'.如果利益相关者不信任该软件,我们就无法发布,他们正在使用使用我们的网络服务的网站自行测试我们的软件.出现问题时,我们测试人员的第一个问题是:它是服务层问题还是表示层问题?这导致我有一个质量保证政策,确保我们的软件可以用于他们正在进行的测试.
因此,我能够(现在)设想与测试人员建立信任的唯一方法是: - 与当前的测试团队交谈,检查他们能够手动执行的测试(来自他们的测试脚本和场景)并确保我们的团队将这些测试作为单元测试已经检查过我们的Web服务.在我们发布presentationlayerteam必须集成的版本之前,这将是一个"签字"的良好起点.需要花费一些精力来澄清为所有这些场景创建自动测试需要一些时间.但它肯定会有用,以确保我们构建的实际工作.
如果您正在进行min/max/avg查询,是否更喜欢使用聚合表或只是在原始表中的一系列行中进行查询?
这显然是一个非常开放的问题,没有一个正确的答案,所以我只是在寻找人们的一般性建议.假设原始数据表包含时间戳,数字外键(例如用户ID)和小数值(比如购买金额).此外,假设表中有数百万行.
我已经完成了两件事并且被撕裂了.一方面,聚合表给了我明显更快的查询,但代价是增加了额外的表.显示聚合范围的当前值要么完全退回到原始数据表,要么组合更细粒度的聚合.我发现在应用程序代码中跟踪哪个聚合表来查询何时需要更多工作,并且需要进行模式更改,因为原始聚合范围总是不够("但我想看到我们在过去3个工资期内的销售额!").
另一方面,从原始数据查询可能会非常缓慢,但让我对数据范围非常灵活.当范围边界发生变化时,我只需更改查询而不必重建聚合表.同样,应用程序代码需要更少的更新 我怀疑,如果我对我的索引更加智能(即总是具有良好的覆盖索引),我将能够减少从原始数据中选择的惩罚,但这绝不是灵丹妙药.
无论如何,我可以充分利用这两个世界吗?
在我目前的项目中,我们为代码指标"可维护性指数"和"Cyclometic Complexity"设定了一些目标.可维护性指数应为60或更高,Cyclometic Complexity为25或更低.我们知道60和更高的可维护性指数相当高.
我们还使用了很多linq来过滤/分组/选择实体.我发现这些linq查询在维护性指数上得分并不高.将这些查询提取到扩展方法中,可以给我一个更高的可维护性指数,这很好.但是在大多数情况下,扩展方法不再是通用的,因为我将它们与我的类型而不是泛型类型一起使用.
例如,以下linq-query vs扩展方法:
Linq查询
List.Where(m => m.BeginTime >= selectionFrom && m.EndTime <= selectionTo)
Run Code Online (Sandbox Code Playgroud)
扩展方法:
public static IEnumerable<MyType> FilterBy(this IEnumerable<MyType> source, DateTime selectionFrom, DateTime selectionTo)
{
return (IEnumerable<MyType>)source.Where(m => m.BeginTime >= selectionFrom && m.EndTime <= selectionTo);
}
List.FilterBy(selectionFrom, selectionTo);
Run Code Online (Sandbox Code Playgroud)
扩展方法为我提供了6个点的可维护性指数改进,并提供了一个很好的流利语法.另一方面,我必须添加一个静态类,它不是通用的.
关于什么方法的任何想法会对你有利吗?或者可能对如何重构linq查询以提高可维护性指数有不同的想法?
linq maintainability extension-methods abstraction cyclomatic-complexity
我一直在查看我正在使用的开源软件包的源代码.几乎每个函数都使用*args而不是命名参数.我发现很难遵循和使用代码,因为每次我想调用一个函数我都要回去,选择源代码,并确定参数应该是什么,以及它们应该在什么顺序.我的问题是:有没有令人信服的理由在每个函数中使用*args,或者这是对这个概念的滥用?谢谢,-b
我一直致力于文本冒险,一切顺利,直到达到一行代码.我的朋友非常擅长编程无法弄清楚出了什么问题,所以他做了一些测试但仍然没有好结果.我需要你的帮助,因为他不是最伟大的.这是迄今为止的代码.尝试测试它,直到遇到不接受任何输入的错误.首先选择ax,然后选择帮助,然后是,然后继续,然后停止接受.
主类代码:
package main;
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class Main
{
public static String thetext;
public static int test;
public static boolean boo;
public static Scanner scan=new Scanner(System.in);
public static JFrame window = new JFrame();
public static JPanel panel = new JPanel();
public static JTextArea out = new JTextArea();
public static JTextField in = new JTextField(30);
public static boolean debug_mode = true;
public static void main (String[] a)
{
window.setSize(640, 480);
window.setTitle("CtaQuest_A_Text_Adventure");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocation(200, 200);
window.setVisible(true);
window.setResizable(false); …
Run Code Online (Sandbox Code Playgroud) 我一直在浏览帖子和MSDN,但我没有看到如何创建可维护性索引.只有好的和坏的价值观.
http://msdn.microsoft.com/en-us/library/bb385914.aspx
有人知道吗?我们可以参考或探讨他们使用的是什么吗?
我对定义为易于维护的代码感兴趣.其他指标的更多细节将受到欢迎,但作为额外的功劳.对其他指标的探索更容易理解.
是否有可能在PHP获取服务器PHP版本发布日期?
所以,假设我有php 5.3.28
.
比phpdate()
应该回来的东西11 Jul 2013
.
我想将 300 行 build.gradle 逻辑地拆分为多个构建文件,以使其更易于维护和扩展。
正如我所注意到的,可以将 gradle 任务拆分为多个文件并将它们用于:
apply from: "myGradleFile"
Run Code Online (Sandbox Code Playgroud)
遗憾的是,通过这种方法,我无法访问第二个构建脚本中定义的函数。
是否也可以将 Gradle 函数拆分为多个文件?
例子:
假设我的默认 build.gradle带有一个使用函数的任务
task doSomethingWithMyFunction {
myFunction()
}
Run Code Online (Sandbox Code Playgroud)
现在我有functions.gradle
def myFunction(){
}
Run Code Online (Sandbox Code Playgroud)
所以我想从build.gradle访问functions.gradle中定义的myFunction
这个问题似乎非常抽象.我会以一个例子来代替.
假设我有许多类型的游戏对象.
它们是子弹,火箭,敌人,区域......
它们都可以很好地创建,删除和管理,例如
Pool<Bullet> poolBullet ;
Pool<Rocket> poolRocket ;
Run Code Online (Sandbox Code Playgroud)
游戏逻辑将以Pool_Handle <xxx>的形式管理对象,例如
Pool_Handle< Bullet > bullet = poolBullet.create() ;
Pool_Handle< Rocket> rocket = poolRocket .create() ;
Run Code Online (Sandbox Code Playgroud)
现在,我看看重构.
例如,如果我的旧代码是......
Bullet* functionA(Rocket* rocket){
for(int n=0;n<rocket->zones.size();n++){
Zone* zone = rocket->zones.get(n);
Bullet* return_value =zone.functionB();
}
}
Run Code Online (Sandbox Code Playgroud)
......它会变成......
Pool_Handle<Bullet> functionA(Pool_Handle<Rocket> rocket){
for(int n=0;n<rocket->zones.size();n++){
Pool_Handle<Zone> zone = rocket->zones.get(n);
Pool_Handle<Bullet> return_value =zone.functionB();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,它们现在到处都是Pool_Handle.
在阅读和编辑了几千行代码之后,我已经习惯了 Pool_Handle甚至比任何游戏对象都要多.这可能是我现在输入最快的一个词.
如何保持旧代码等级的可读性和可维护性,如果可能的话,如何减少变量模板的键入时间?
我不希望得到一个完美的答案,因为我找到的每个解决方案都有一些权衡.
/** remedy 1 **/
template <class TT> using H …
Run Code Online (Sandbox Code Playgroud) 我有 TreeView,其中包含不同的项目类型。项目样式是通过自定义 ItemContainerStyleSelector 属性定义的。
我的样式都共享一个基本样式,并且每种样式中只定义了特定于项目的内容。它看起来像这样:
<Style x:Key="BaseStyle" TargetType="{x:Type TreeViewItem}">
...
</Style>
<Style x:Key ="SomeSpecificStyle" TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource BaseStyle}">
<Setter Property="ContextMenu" Value="{StaticResource NodeContextMenu}"/>
...
</Style>
<Style x:Key ="SomeSpecificStyle" TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource BaseStyle}">
<Setter Property="ContextMenu" Value="{StaticResource AnotherNodeContextMenu}"/>
...
</Style>
Run Code Online (Sandbox Code Playgroud)
上下文菜单定义如下
<ContextMenu x:Key="NodeContextMenu">
<MenuItem Header="Select Views" Command="{Binding Path=OpenViewsCommand}" />
...other specific entries
<MenuItem Header="Remove" Command="{Binding Path=DocumentRemoveCommand}" />
...other entries common for all menus
</ContextMenu>
Run Code Online (Sandbox Code Playgroud)
另一个上下文菜单还应该包含那些常见的项目,例如删除。每次命令属性等发生更改时,都需要通过复制粘贴来复制这些内容。可维护性简直就是地狱。有没有办法定义一个包含常用项目的上下文菜单,然后“派生”特定的上下文菜单?
编辑:我找到了一个带有此线程提示的解决方案:我定义一个包含常见项目的集合,并在定义菜单时使用复合集合以包含新项目和常见项目集合
<CompositeCollection x:Key="CommonItems">
<MenuItem Header="Remove" Command="{Binding Path=DocumentRemoveCommand}">
....Other common stuff
</CompositeCollection>
<ContextMenu x:Key="NodeContextMenu">
<ContextMenu.ItemsSource>
<CompositeCollection>
<MenuItem Header="Select Views" …
Run Code Online (Sandbox Code Playgroud) maintainability ×10
abstraction ×1
adventure ×1
aggregation ×1
arguments ×1
c++ ×1
code-metrics ×1
contextmenu ×1
gradle ×1
indexing ×1
java ×1
linq ×1
performance ×1
php ×1
python ×1
release ×1
sql ×1
templates ×1
text ×1
unit-testing ×1
version ×1
wpf ×1
xaml ×1