Thursday, 17 November 2011 10 10 20 20 30 30 40 40 50 50 - - PDF document

thursday 17 november 2011
SMART_READER_LITE
LIVE PREVIEW

Thursday, 17 November 2011 10 10 20 20 30 30 40 40 50 50 - - PDF document

Thursday, 17 November 2011 10 10 20 20 30 30 40 40 50 50 60 60 0 0 SessionFactoryUtils SessionFactoryUtils AbstractBeanFactory AbstractBeanFactory BeanWrapperImpl BeanWrapperImpl BooleanExpressionComplexity


slide-1
SLIDE 1 Lines of unit test code per line of production code 1 2 3 3.05 3.1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0.80 1.00 1.20 1.40 1.60 1/4/06 15/4/06 29/4/06 13/5/06 27/5/06 10/6/06 24/6/06 8/7/06 22/7/06 5/8/06 19/8/06 2/9/06 16/9/06 30/9/06 14/10/06 28/10/06 11/11/06 25/11/06 9/12/06 23/12/06 6/1/07 20/1/07 3/2/07 17/2/07 3/3/07 17/3/07 31/3/07 14/4/07 28/4/07 12/5/07 26/5/07 9/6/07 23/6/07 7/7/07 21/7/07 4/8/07 18/8/07 Releases Unit test LOC/LOC 10 20 30 40 50 60 SessionFactoryUtils AbstractBeanFactory BeanWrapperImpl DispatcherServlet SchedulerFactoryBean AntPathMatcher SQLErrorCodeSQLExceptionTranslator HibernateTemplate ReloadableResourceBundleMessageSource PropertiesBeanDefinitionReader StatementCreatorUtils LazyConnectionDataSourceProxy DefaultMessageListenerContainer JdoTransactionManager TopLinkTransactionManager ScriptFactoryPostProcessor TransactionAwareConnectionFactoryProxy NumberUtils HibernateAccessor SpringSessionSynchronization BeanDefinitionValueResolver ExtendedEntityManagerCreator ParameterMethodNameResolver MBeanClientInterceptor BeanFactoryAspectJAdvisorsBuilder CustomizableTraceInterceptor AbstractXsltView GenericCollectionTypeResolver ArgumentConvertingMethodInvoker SharedEntityManagerCreator FreeMarkerConfigurationFactory OC4JJtaTransactionManager MockHttpServletRequest FrameworkPortlet ResourceArrayPropertyEditor AspectJWeaverMessageHandler MethodMapTransactionAttributeSource SingleConnectionFactory MessageListenerAdapter JdoTemplate FieldRetrievingFactoryBean VelocityView AbstractMessageListenerContainer SqlLobValue PortletRequestHandledEvent JdbcOperations TxAdviceBeanDefinitionParser ConnectorServerFactoryBean RefreshablePagedListHolder SqlMapClientTemplate ClassUtils SystemPropertyUtils JmsTransactionManager DefaultBeanDefinitionDocumentReader TransactionAttributeEditor AbstractInterceptorDrivenBeanDefinitionDecorator ResultSetWrappingSqlRowSet HsqlMaxValueIncrementer AbstractSessionFactory AbstractPropertyAccessor LocalSlsbInvokerInterceptor BeansDtdResolver TransactionAwareDataSourceProxy PersistenceManagerFactoryUtils TomcatInstrumentableClassLoader LocalContainerEntityManagerFactoryBean AopNamespaceUtils JpaInterceptor HtmlCharacterEntityReferences JdoInterceptor CciTemplate AspectJPrecedenceComparator AdvisedSupport OpenEntityManagerInViewFilter ScopedProxyBeanDefinitionDecorator ServletRequestAttributes ReflectiveVisitorHelper BeanDefinitionReaderUtils CustomEditorConfigurer AbstractBeanDefinitionReader ScopedProxyFactoryBean AbstractModelAndViewTests HessianServiceExporter MockPageContext CommonsLoggingLogSystem BooleanExpressionComplexity ClassDataAbstractionCoupling ClassFanOutComplexity CyclomaticComplexity FileLength MethodLength NestedIfDepth AnonInnerLength ParameterNumber MissingSwitchDefault TreeWalker 10 20 30 40 50 60 SessionFactoryUtils AbstractBeanFactory BeanWrapperImpl DispatcherServlet SchedulerFactoryBean AntPathMatcher SQLErrorCodeSQLExceptionTranslator HibernateTemplate ReloadableResourceBundleMessageSource PropertiesBeanDefinitionReader StatementCreatorUtils LazyConnectionDataSourceProxy DefaultMessageListenerContainer JdoTransactionManager TopLinkTransactionManager ScriptFactoryPostProcessor TransactionAwareConnectionFactoryProxy NumberUtils HibernateAccessor SpringSessionSynchronization BeanDefinitionValueResolver ExtendedEntityManagerCreator ParameterMethodNameResolver MBeanClientInterceptor BeanFactoryAspectJAdvisorsBuilder CustomizableTraceInterceptor AbstractXsltView GenericCollectionTypeResolver ArgumentConvertingMethodInvoker SharedEntityManagerCreator FreeMarkerConfigurationFactory OC4JJtaTransactionManager MockHttpServletRequest FrameworkPortlet ResourceArrayPropertyEditor AspectJWeaverMessageHandler MethodMapTransactionAttributeSource SingleConnectionFactory MessageListenerAdapter JdoTemplate FieldRetrievingFactoryBean VelocityView AbstractMessageListenerContainer SqlLobValue PortletRequestHandledEvent JdbcOperations TxAdviceBeanDefinitionParser ConnectorServerFactoryBean RefreshablePagedListHolder SqlMapClientTemplate ClassUtils SystemPropertyUtils JmsTransactionManager DefaultBeanDefinitionDocumentReader TransactionAttributeEditor AbstractInterceptorDrivenBeanDefinitionDecorator ResultSetWrappingSqlRowSet HsqlMaxValueIncrementer AbstractSessionFactory AbstractPropertyAccessor LocalSlsbInvokerInterceptor BeansDtdResolver TransactionAwareDataSourceProxy PersistenceManagerFactoryUtils TomcatInstrumentableClassLoader LocalContainerEntityManagerFactoryBean AopNamespaceUtils JpaInterceptor HtmlCharacterEntityReferences JdoInterceptor CciTemplate AspectJPrecedenceComparator AdvisedSupport OpenEntityManagerInViewFilter ScopedProxyBeanDefinitionDecorator ServletRequestAttributes ReflectiveVisitorHelper BeanDefinitionReaderUtils CustomEditorConfigurer AbstractBeanDefinitionReader ScopedProxyFactoryBean AbstractModelAndViewTests HessianServiceExporter MockPageContext CommonsLoggingLogSystem BooleanExpressionComplexity ClassDataAbstractionCoupling ClassFanOutComplexity CyclomaticComplexity FileLength MethodLength NestedIfDepth AnonInnerLength ParameterNumber MissingSwitchDefault TreeWalker

1 Thursday, 17 November 2011

slide-2
SLIDE 2

Software Quality –

you know it when you see it

Erik Doernenburg ThoughtWorks @erikdoe // erik.doernenburg.com

We’re hiring...

2 Thursday, 17 November 2011

slide-3
SLIDE 3

3 Thursday, 17 November 2011

slide-4
SLIDE 4

Software Quality

External perspective

  • Is the software of value to its users?

Internal perspective

  • How appropriate is the design?
  • How easy is it to understand and extend?
  • How maintainable is the software?

4 Thursday, 17 November 2011

slide-5
SLIDE 5

30.000ft and ground level

http://opensimulator.org/wiki/Grid_Architecture_Diagram m.jpg 5 Thursday, 17 November 2011

slide-6
SLIDE 6

The 1000ft view

  • Is at the “right” level
  • Aggregates data and metrics
  • Utilises visualisation techniques
  • Makes every pixel count

6 Thursday, 17 November 2011

http://97things.oreilly.com/wiki/index.php/Get_the_1000ft_view

slide-7
SLIDE 7

Metrics

  • lines of code
  • method length
  • class size
  • cyclomatic complexity
  • weighted methods per class
  • coupling between (object) classes

ckjm

7 Thursday, 17 November 2011

http://www.campwoodsw.com/sourcemonitor.html

slide-8
SLIDE 8

Toxicity chart

0.0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 SessionFactory Utils.java AbstractBeanFactory .java BeanWrapperImpl.jav a DispatcherServ let.java SchedulerFactory Bean.java AntPathMatcher.jav a SQLErrorCodeSQLExceptionTranslator.jav a HibernateTemplate.jav a ReloadableResourceBundleMessageSource.jav a PropertiesBeanDef initionReader.jav a StatementCreatorUtils.java Lazy ConnectionDataSourceProxy .java Def aultMessageListenerContainer.java JdoTransactionManager.jav a TopLinkTransactionManager.jav a ScriptFactory PostProcessor.java TransactionAwareConnectionFactory Proxy.java NumberUtils.jav a HibernateAccessor.jav a SpringSessionSy nchronization.jav a BeanDef initionValueResolv er.java ExtendedEntity ManagerCreator.jav a ParameterMethodNameResolv er.java CallableStatementCreatorFactory.java BeanFactory AspectJAdvisorsBuilder.java CustomizableTraceInterceptor.jav a AbstractXsltView.jav a GenericCollectionTy peResolv er.java ArgumentConv ertingMethodInv oker.java SharedEntity ManagerCreator.jav a FreeMarkerConf igurationFactory.java SelectedValueComparator.jav a MockHttpServ letRequest.java FrameworkPortlet.jav a ResourceArray Property Editor.java AspectJWeav erMessageHandler.java MethodMapTransactionAttributeSource.jav a SingleConnectionFactory .java MessageListenerAdapter.jav a JdoTemplate.jav a DataSourceUtils.java Velocity View.jav a AbstractMessageListenerContainer.java SqlLobValue.jav a PortletRequestHandledEv ent.java JdbcOperations.jav a TxAdv iceBeanDef initionParser.java ArgTy pePreparedStatementSetter.jav a Ref reshablePagedListHolder.java AbstractJasperReportsSingleFormatView.java ClassUtils.java SimpleMailMessage.jav a JmsTransactionManager.jav a TransactionAttributeEditor.jav a Def aultBeanDef initionDocumentReader.java AbstractInterceptorDrivenBeanDefinitionDecorator.java ResultSetWrappingSqlRowSet.jav a HsqlMaxValueIncrementer.jav a CodebaseAwareObjectInputStream.jav a AbstractSingletonProxy FactoryBean.java LocalSlsbInv okerInterceptor.java BeansDtdResolv er.java AbstractMessageSource.jav a AbstractDependency InjectionSpringContextTests.java TomcatInstrumentableClassLoader.java LocalContainerEntity ManagerFactoryBean.java ResourceEntity Resolver.java RedirectView.jav a HtmlCharacterEntityReferences.java AbstractPathMapHandlerMapping.jav a AspectJPrecedenceComparator.java ResourceServ let.java Adv isedSupport.jav a EhCacheFactory Bean.java CustomCollectionEditor.java CommonsMultipartFile.jav a OpenEntity ManagerInViewFilter.jav a TopLinkInterceptor.jav a MethodInv okingJobDetailFactoryBean.java Def aultNamespaceHandlerResolver.java XmlValidationModeDetector.jav a GenericFilterBean.jav a HessianServ iceExporter.java Property AccessorUtils.java InstantiationModelAwarePointcutAdv isorImpl.java BooleanExpressionComplexity ClassDataAbstractionCoupling ClassFanOutComplexity CyclomaticComplexity FileLength MethodLength NestedIfDepth AnonInnerLength ParameterNumber MissingSwitchDefault TreeWalker

Provides easy to compare overview of quality Developed by ThoughtWorks using Excel

8 Thursday, 17 November 2011

http://erik.doernenburg.com/2008/11/how-toxic-is-your-code/

slide-9
SLIDE 9

Metrics tree maps

Shows distribution of metrics Created with checkstyle and InfoVis

9 Thursday, 17 November 2011

http://erik.doernenburg.com/2010/05/metrics-tree-maps/

slide-10
SLIDE 10

Size & complexity pyramid

Developed at Universities of Berne and Lugano Shows key metrics and their relationships Allows comparison to “industry standards” Created by iPlasma tool from source code

5.75 NOP 224 6.13 NOC 1289 5.69 NOM 7905 7905 NOM 2.79 0.26 LOC 44988 22039 CALLS 0.40 CYCLO 11602 8798 FANOUT

10 Thursday, 17 November 2011

http://loose.upt.ro/iplasma/ http://www.intooitus.com/inFusion.html

slide-11
SLIDE 11

System complexity view

Part of Moose Technology Polymetric view of class hierarchy

11 Thursday, 17 November 2011

http://www.moosetechnology.org/ http://www.inf.usi.ch/faculty/lanza/codecrawler.html http://sourceforge.net/projects/java2cdif/

slide-12
SLIDE 12

CodeCity

Also part of Moose Technology Polymetric views in 3D and more

12 Thursday, 17 November 2011

http://www.inf.usi.ch/phd/wettel/codecity-download.html http://erik.doernenburg.com/2009/07/moose-mse-for-java-and-cs/

slide-13
SLIDE 13

CodeCity continued

Might need a license for VisualWorks Smalltalk

13 Thursday, 17 November 2011

slide-14
SLIDE 14

Lines of unit test code per line of production code

1 2 3 3.05 3.1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0.80 1.00 1.20 1.40 1.60 1/4/06 15/4/06 29/4/06 13/5/06 27/5/06 10/6/06 24/6/06 8/7/06 22/7/06 5/8/06 19/8/06 2/9/06 16/9/06 30/9/06 14/10/06 28/10/06 11/11/06 25/11/06 9/12/06 23/12/06 6/1/07 20/1/07 3/2/07 17/2/07 3/3/07 17/3/07 31/3/07 14/4/07 28/4/07 12/5/07 26/5/07 9/6/07 23/6/07 7/7/07 21/7/07 4/8/07 18/8/07

Releases Unit test LOC/LOC

Shows the test to code ratio over time Created with Unix tools and Excel

Test to code ratio

14 Thursday, 17 November 2011

slide-15
SLIDE 15

More metrics

  • duplication
  • check-in counts
  • coverage
  • testability
  • test/code ratio

simian

15 Thursday, 17 November 2011

http://www.redhillconsulting.com.au/products/simian/ http://www.testabilityexplorer.org/report

slide-16
SLIDE 16

Dependency Structure Matrix

Not metrics based Looks at “complex complexity”

16 Thursday, 17 November 2011

http://erik.doernenburg.com/2010/04/dependency-structure-matrix/

slide-17
SLIDE 17

Test coverage

Not as a percentage, shows call graph AspectJ + GraphViz

17 Thursday, 17 November 2011

http://erik.doernenburg.com/2008/09/call-graph-visualisation-with-aspectj-and-dot/

slide-18
SLIDE 18

Buildlines

Not even about code Go + Ruby with RMagick

18 Thursday, 17 November 2011

http://erik.doernenburg.com/2009/11/making-build-pain-visible

slide-19
SLIDE 19

DIY

  • 1. Get metrics
  • SourceMonitor, checkstyle, text tools, etc
  • iPlasma, et al
  • 2. Aggregate data
  • Ruby scripts, unix tools, etc
  • VBA and pivot tables
  • 3. Render graphics
  • Excel is a powerful graphing tool
  • Gnuplot and InfoViz are easy to use

19 Thursday, 17 November 2011

slide-20
SLIDE 20

How do you see quality?

Comparisons

  • industry standards
  • different revisions: trends
  • different parts: outliers

Aesthetics

  • symmetry
  • balance/harmony

20 Thursday, 17 November 2011

slide-21
SLIDE 21

What next?

Measure

  • tech debt
  • effectiveness of training

Guide

  • refactoring
  • clean-up

Celebrate

21 Thursday, 17 November 2011

slide-22
SLIDE 22

http://erik.doernenburg.com/topics/softviz http://97things.oreilly.com/wiki/index.php/Get_the_1000ft_view http://www.moosetechnology.org

Thank you

W e ’ r e h i r i n g

22 Thursday, 17 November 2011