SlideShare une entreprise Scribd logo
1  sur  21
Télécharger pour lire hors ligne
0
                                                                                                                                                                                                                              10
                                                                                                                                                                                                                                   20
                                                                                                                                                                                                                                        30
                                                                                                                                                                                                                                             40
                                                                                                                                                                                                                                                  50
                                                                                                                                                                                                                                                       60
                                                                                                                                                                                                   SessionFactoryUtils
                                                                                                                                                                                                 AbstractBeanFactory
                                                                                                                                                                                                    BeanWrapperImpl
                                                                                                                                                                                                     DispatcherServlet
                                                                                                                                                                                                SchedulerFactoryBean
                                                                                                                                                                                                      AntPathMatcher
                                                                                                                                                                                SQLErrorCodeSQLExceptionTranslator
                                                                                                                                                                                                    HibernateTemplate
                                                                                                                                                                           ReloadableResourceBundleMessageSource
                                                                                                                                                                                       PropertiesBeanDefinitionReader
                                                                                                                                                                                                StatementCreatorUtils
                                                                                                                                                                                     LazyConnectionDataSourceProxy




                                                                                                                                       BooleanExpressionComplexity
                                                                                                                                                                                     DefaultMessageListenerContainer
                                                                                                                                                                                              JdoTransactionManager
                                                                                                                                                                                          TopLinkTransactionManager
                                                                                                                                                                                           ScriptFactoryPostProcessor
                                                                                                                                                                             TransactionAwareConnectionFactoryProxy
                                                                                                                                                                                                          NumberUtils
                                                                                                                                                                                                   HibernateAccessor
                                                                                                                                                                                        SpringSessionSynchronization
                                                                                                                                                                                          BeanDefinitionValueResolver
                                                                                                                                                                                       ExtendedEntityManagerCreator
                                                                                                                                                                                      ParameterMethodNameResolver




                                                                                                                                       ClassDataAbstractionCoupling
                                                                                                                                                                                               MBeanClientInterceptor
                                                                                                                                                                                   BeanFactoryAspectJAdvisorsBuilder
                                                                                                                                                                                         CustomizableTraceInterceptor
                                                                                                                                                                                                      AbstractXsltView
                                                                                                                                                                                       GenericCollectionTypeResolver
                                                                                                                                                                                   ArgumentConvertingMethodInvoker
                                                                                                                                                                                         SharedEntityManagerCreator
                                                                                                                                                                                      FreeMarkerConfigurationFactory
                                                                                                                                                                                         OC4JJtaTransactionManager




                                                                                                                                       ClassFanOutComplexity
                                                                                                                                                                                              MockHttpServletRequest
                                                                                                                                                                                                     FrameworkPortlet
                                                                                                                                                                                         ResourceArrayPropertyEditor
                                                                                                                                                                                      AspectJWeaverMessageHandler
                                                                                                                                                                                MethodMapTransactionAttributeSource
                                                                                                                                                                                             SingleConnectionFactory
                                                                                                                                                                                              MessageListenerAdapter
                                                                                                                                                                                                          JdoTemplate




                                                                                                                                       CyclomaticComplexity
                                                                                                                                                                                           FieldRetrievingFactoryBean
                                                                                                                                                                                                          VelocityView
                                                                                                                                                                                    AbstractMessageListenerContainer
                                                                                                                                                                                                          SqlLobValue
                                                                                                                                                                                          PortletRequestHandledEvent




                                                                                                                                       FileLength
                                                                                                                                                                                                       JdbcOperations
                                                                                                                                                                                        TxAdviceBeanDefinitionParser
                                                                                                                                                                                         ConnectorServerFactoryBean
                                                                                                                                                                                          RefreshablePagedListHolder
                                                                                                                                                                                                SqlMapClientTemplate




                                                                                                                                       MethodLength
                                                                                                                                                                                                            ClassUtils
                                                                                                                                                                                                  SystemPropertyUtils
                                                                                                                                                                                              JmsTransactionManager
                                                                                                                                                                                DefaultBeanDefinitionDocumentReader
                                                                                                                                                                                             TransactionAttributeEditor
                                                                                                                                                                      AbstractInterceptorDrivenBeanDefinitionDecorator




                                                                                                                                       NestedIfDepth
                                                                                                                                                                                        ResultSetWrappingSqlRowSet
                                                                                                                                                                                            HsqlMaxValueIncrementer
                                                                                                                                                                                               AbstractSessionFactory
                                                                                                                                                                                             AbstractPropertyAccessor
                                                                                                                                                                                           LocalSlsbInvokerInterceptor
                                                                                                                                                                                                    BeansDtdResolver
                                                                                                                                       AnonInnerLength

                                                                                                                                                                                   TransactionAwareDataSourceProxy
                                                                                                                                                                                      PersistenceManagerFactoryUtils
                                                                                                                                                                                    TomcatInstrumentableClassLoader
                                                                                                                                                                             LocalContainerEntityManagerFactoryBean
                                                                                                                                                                                                  AopNamespaceUtils
                                                                                                                                                                                                        JpaInterceptor
                                                                                                                                                                                       HtmlCharacterEntityReferences
                                                                                                                                       ParameterNumber




                                                                                                                                                                                                        JdoInterceptor
                                                                                                                                                                                                          CciTemplate
                                                                                                                                                                                       AspectJPrecedenceComparator
                                                                                                                                                                                                       AdvisedSupport
                                                                                                                                                                                       OpenEntityManagerInViewFilter
                                                                                                                                                                                 ScopedProxyBeanDefinitionDecorator
                                                                                                                                                                                              ServletRequestAttributes
                                                                                                                                                                                                ReflectiveVisitorHelper
                                                                                                                                       MissingSwitchDefault




                                                                                                                                                                                            BeanDefinitionReaderUtils
                                                                                                                                                                                              CustomEditorConfigurer
                                                                                                                                                                                        AbstractBeanDefinitionReader
                                                                                                                                                                                            ScopedProxyFactoryBean
                                                                                                                                                                                          AbstractModelAndViewTests
                                                                                                                                       TreeWalker




                                                                                                                                                                                              HessianServiceExporter
                                                                                                                                                                                                    MockPageContext
                                                                                                                                                                                         CommonsLoggingLogSystem




                                   0.80
                                                     1.00
                                                            1.20
                                                                   1.40
                                                                          1.60




                          1/4/06

                         15/4/06

                         29/4/06
                                          1




                         13/5/06

                         27/5/06

                         10/6/06
                                          2




                         24/6/06

                          8/7/06

                         22/7/06

                          5/8/06

                         19/8/06

                          2/9/06
                                          3




                         16/9/06

                         30/9/06

                        14/10/06

                        28/10/06
                                             3
                                          3.05.1




                        11/11/06
    Releases




                        25/11/06

                         9/12/06

                        23/12/06
                                          4




                          6/1/07
                                          5




                         20/1/07

                          3/2/07
                                          6




    Unit test LOC/LOC




                         17/2/07

                          3/3/07
                                          7




                         17/3/07

                         31/3/07
                                                                                 Lines of unit test code per line of production code




                                          8 9




                         14/4/07
                                          10




                         28/4/07

                         12/5/07

                         26/5/07
                                          11 12 13




                          9/6/07
                                          14




                         23/6/07
                                          15




                          7/7/07
                                          16




                         21/7/07
                                          17




                          4/8/07

                         18/8/07
1
Software Quality –
you know it when you see it
          Erik Doernenburg
           ThoughtWorks


   @erikdoe // erik.doernenburg.com

                                      2
3
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
30.000ft and ground level




      http://opensimulator.org/wiki/Grid_Architecture_Diagram

pg
                                                                5
The 1000ft view
     • Is   at the “right” level

     • Aggregates             data and metrics

     • Utilises       visualisation techniques

     • Makes         every pixel count


                                                                 6

http://97things.oreilly.com/wiki/index.php/Get_the_1000ft_view
Metrics
    • lines of code
    • method length
    • class size
    • cyclomatic complexity
    • weighted methods per class
    • coupling between (object) classes



                                               ckjm
                                                      7

http://www.campwoodsw.com/sourcemonitor.html
More metrics
     • duplication
     • check-in counts
     • coverage
     • testability
     • test/code ratio




                                                simian


                                                         8

http://www.redhillconsulting.com.au/products/simian/
Metrics tree maps




   Shows distribution of metrics
   Created with checkstyle and InfoVis
                                                         9

http://erik.doernenburg.com/2010/05/metrics-tree-maps/
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




                                                                                                                  BooleanExpressionComplexity
                                                                                                                                                                                      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




                                                                                                                  ClassDataAbstractionCoupling ClassFanOutComplexity
                                                                                                                                                                                               MockHttpServ letRequest.java
                                                                                                                                                                                                      FrameworkPortlet.jav a
                                                                                                                                                                                          ResourceArray Property Editor.java
                                                                                                                                                                                       AspectJWeav erMessageHandler.java
                                                                                                                                                                                 MethodMapTransactionAttributeSource.jav a
                                                                                                                                                                                              SingleConnectionFactory .java
                                                                                                                                                                                              MessageListenerAdapter.jav a
                                                                                                                                                                                                           JdoTemplate.jav a




                                                                                                                  CyclomaticComplexity
                                                                                                                                                                                                       DataSourceUtils.java
                                                                                                                                                                                                           Velocity View.jav a
                                                                                                                                                                                                                                                                                              Toxicity chart



                                                                                                                                                                                     AbstractMessageListenerContainer.java
                                                                                                                                                                                                           SqlLobValue.jav a




                                                                                                                  FileLength
                                                                                                                                                                                           PortletRequestHandledEv ent.java
                                                                                                                                                                                                        JdbcOperations.jav a
                                                                                                                                                                                         TxAdv iceBeanDef initionParser.java
                                                                                                                                                                                      ArgTy pePreparedStatementSetter.jav a
                                                                                                                                                                                           Ref reshablePagedListHolder.java
                                                                                                                                                                               AbstractJasperReportsSingleFormatView.java




                                                                                                                  MethodLength
                                                                                                                                                                                                              ClassUtils.java
                                                                                                                                                                                                    SimpleMailMessage.jav a
                                                                                                                                                                                               JmsTransactionManager.jav a
                                                                                                                                                                                              TransactionAttributeEditor.jav a
                                                                                                                                                                                 Def aultBeanDef initionDocumentReader.java

                                                                                                                  NestedIfDepth
                                                                                                                                                                       AbstractInterceptorDrivenBeanDefinitionDecorator.java
                                                                                                                                                                                         ResultSetWrappingSqlRowSet.jav a
                                                                                                                                                                                             HsqlMaxValueIncrementer.jav a
                                                                                                                                                                                     CodebaseAwareObjectInputStream.jav a
                                                                                                                                                                                    AbstractSingletonProxy FactoryBean.java
                                                                                                                                                                                            LocalSlsbInv okerInterceptor.java
                                                                                                                                                                                                     BeansDtdResolv er.java
                                                                                                                  AnonInnerLength




                                                                                                                                                                                               AbstractMessageSource.jav a
                                                                                                                                                                       AbstractDependency InjectionSpringContextTests.java
                                                                                                                                                                                     TomcatInstrumentableClassLoader.java
                                                                                                                                                                              LocalContainerEntity ManagerFactoryBean.java
                                                                                                                                                                                               ResourceEntity Resolver.java




http://erik.doernenburg.com/2008/11/how-toxic-is-your-code/
                                                                   Developed by ThoughtWorks using Excel                                                                                                  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
                                                                   Provides easy to compare overview of quality

                                                                                                                                                                                        OpenEntity ManagerInViewFilter.jav a
                                                                                                                                                                                                     TopLinkInterceptor.jav a
                                                                                                                                                                                  MethodInv okingJobDetailFactoryBean.java
                                                                                                                                                                                    Def aultNamespaceHandlerResolver.java
                                                                                                                                                                                            XmlValidationModeDetector.jav a
                                                                                                                                                                                                     GenericFilterBean.jav a
                                                                                                                  ParameterNumber MissingSwitchDefault TreeWalker




                                                                                                                                                                                               HessianServ iceExporter.java
                                                                                                                                                                                                 Property AccessorUtils.java
                                                                                                                                                                            InstantiationModelAwarePointcutAdv isorImpl.java
                                                              10
Size & complexity pyramid


                         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



    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
                                                                                11

http://loose.upt.ro/iplasma/
http://www.intooitus.com/inFusion.html
0.80
                                                                                               1.00
                                                                                                      1.20
                                                                                                             1.40
                                                                                                                    1.60
                                                                    1/4/06

                                                                   15/4/06

                                                                   29/4/06




                                                                                    1
                                                                   13/5/06

                                                                   27/5/06

                                                                   10/6/06




                                                                                    2
                                                                   24/6/06

                                                                    8/7/06

                                                                   22/7/06

                                                                    5/8/06

                                                                   19/8/06

                                                                    2/9/06




                                                                                    3
                                                                   16/9/06

                                                                   30/9/06

                                                                  14/10/06

                                                                  28/10/06




                                                                                       3
                                                                                    3.05.1
                                                                  11/11/06




                                              Releases
                                                                  25/11/06

                                                                   9/12/06

                                                                  23/12/06
                                                                                    4



                                                                    6/1/07
                                                                                    5




     Created with Unix tools and Excel
                                                                   20/1/07

                                                                    3/2/07
                                                                                                                           Test to code ratio




                                                                                    6




                                              Unit test LOC/LOC
                                                                   17/2/07


     Shows the test to code ratio over time                         3/3/07
                                                                                    7




                                                                   17/3/07

                                                                   31/3/07
                                                                                                                             Lines of unit test code per line of production code




                                                                                    8 9




                                                                   14/4/07
                                                                                    10




                                                                   28/4/07

                                                                   12/5/07

                                                                   26/5/07
                                                                                    11 12 13




                                                                    9/6/07
                                                                                    14




                                                                   23/6/07
                                                                                    15




                                                                    7/7/07
                                                                                    16




                                                                   21/7/07
                                                                                    17




                                                                    4/8/07

                                                                   18/8/07
12
System complexity view




    Part of Moose Technology
    Polymetric view of class hierarchy
                                                       13

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




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

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




Might need a license for VisualWorks Smalltalk

                                                 15
Dependency Structure Matrix




   Not metrics based
   Looks at “complex complexity”
                                                                   16

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




   Not as a percentage, shows call graph
   AspectJ + GraphViz
                                                                                     17

http://erik.doernenburg.com/2008/09/call-graph-visualisation-with-aspectj-and-dot/
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

                                                  18
How do you see quality?
Comparisons
• industry standards
• different revisions: trends
• different parts: outliers

Aesthetics
• symmetry
• balance/harmony



                                19
What next?
Measure
• tech debt
• effectiveness of training

Guide
• refactoring
• clean-up

Celebrate

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




                                                                  21

Contenu connexe

En vedette

Лягущенко, Вышегородцева.
Лягущенко, Вышегородцева.Лягущенко, Вышегородцева.
Лягущенко, Вышегородцева.ElenaSam
 
викторина
викторинавикторина
викторинаElenaSam
 
результаты
результатырезультаты
результатыElenaSam
 
Publichnyj otchjot 2012-13
Publichnyj otchjot 2012-13Publichnyj otchjot 2012-13
Publichnyj otchjot 2012-13ElenaSam
 
Шарков Панов
Шарков ПановШарков Панов
Шарков ПановElenaSam
 
презентация на секцию
презентация на секциюпрезентация на секцию
презентация на секциюElenaSam
 
Why b corps matter
Why b corps matterWhy b corps matter
Why b corps matterScott Kregel
 
Создание и пополнение листа подписчиков
Создание и пополнение листа подписчиковСоздание и пополнение листа подписчиков
Создание и пополнение листа подписчиковEMAILMATRIX
 
участники и победители всероссийского конкурса по математике
участники и победители всероссийского конкурса по математикеучастники и победители всероссийского конкурса по математике
участники и победители всероссийского конкурса по математикеElenaSam
 
встпеча со сгупс
встпеча со сгупсвстпеча со сгупс
встпеча со сгупсElenaSam
 
Business Plan Sweetie Bake Shop
Business Plan Sweetie Bake ShopBusiness Plan Sweetie Bake Shop
Business Plan Sweetie Bake ShopJames Wright
 
SUOMIJA - Saimaa University of Applied Siences
SUOMIJA - Saimaa University of Applied SiencesSUOMIJA - Saimaa University of Applied Siences
SUOMIJA - Saimaa University of Applied SiencesKauno Kolegija
 
итоги 2012 2013
итоги 2012 2013итоги 2012 2013
итоги 2012 2013ElenaSam
 

En vedette (20)

Лягущенко, Вышегородцева.
Лягущенко, Вышегородцева.Лягущенко, Вышегородцева.
Лягущенко, Вышегородцева.
 
Ibe group 6
Ibe group 6Ibe group 6
Ibe group 6
 
викторина
викторинавикторина
викторина
 
результаты
результатырезультаты
результаты
 
школа
школашкола
школа
 
Publichnyj otchjot 2012-13
Publichnyj otchjot 2012-13Publichnyj otchjot 2012-13
Publichnyj otchjot 2012-13
 
школа
школашкола
школа
 
Шарков Панов
Шарков ПановШарков Панов
Шарков Панов
 
My mother.
My mother.My mother.
My mother.
 
презентация на секцию
презентация на секциюпрезентация на секцию
презентация на секцию
 
Project
ProjectProject
Project
 
Why b corps matter
Why b corps matterWhy b corps matter
Why b corps matter
 
My town klimovsk(2)
My town klimovsk(2)My town klimovsk(2)
My town klimovsk(2)
 
Создание и пополнение листа подписчиков
Создание и пополнение листа подписчиковСоздание и пополнение листа подписчиков
Создание и пополнение листа подписчиков
 
дот
дотдот
дот
 
участники и победители всероссийского конкурса по математике
участники и победители всероссийского конкурса по математикеучастники и победители всероссийского конкурса по математике
участники и победители всероссийского конкурса по математике
 
встпеча со сгупс
встпеча со сгупсвстпеча со сгупс
встпеча со сгупс
 
Business Plan Sweetie Bake Shop
Business Plan Sweetie Bake ShopBusiness Plan Sweetie Bake Shop
Business Plan Sweetie Bake Shop
 
SUOMIJA - Saimaa University of Applied Siences
SUOMIJA - Saimaa University of Applied SiencesSUOMIJA - Saimaa University of Applied Siences
SUOMIJA - Saimaa University of Applied Siences
 
итоги 2012 2013
итоги 2012 2013итоги 2012 2013
итоги 2012 2013
 

Plus de Kostas Mavridis

GlennVanderburg_CraftAndSoftwareEngineering
GlennVanderburg_CraftAndSoftwareEngineeringGlennVanderburg_CraftAndSoftwareEngineering
GlennVanderburg_CraftAndSoftwareEngineeringKostas Mavridis
 
RoyOsherove_TeamLeadershipInTheAgeOfAgile
RoyOsherove_TeamLeadershipInTheAgeOfAgileRoyOsherove_TeamLeadershipInTheAgeOfAgile
RoyOsherove_TeamLeadershipInTheAgeOfAgileKostas Mavridis
 
PatrickKua_TheBeginnersMind
PatrickKua_TheBeginnersMindPatrickKua_TheBeginnersMind
PatrickKua_TheBeginnersMindKostas Mavridis
 
DanNorth_FromMonthsToMinutesUppingTheStakes
DanNorth_FromMonthsToMinutesUppingTheStakesDanNorth_FromMonthsToMinutesUppingTheStakes
DanNorth_FromMonthsToMinutesUppingTheStakesKostas Mavridis
 
KevlinHenney_PuttingThereIntoArchitecture
KevlinHenney_PuttingThereIntoArchitectureKevlinHenney_PuttingThereIntoArchitecture
KevlinHenney_PuttingThereIntoArchitectureKostas Mavridis
 
BernhardMerkle_StopTheArchitectureErosion
BernhardMerkle_StopTheArchitectureErosionBernhardMerkle_StopTheArchitectureErosion
BernhardMerkle_StopTheArchitectureErosionKostas Mavridis
 
EoinWoods_WhereDidMyArchitectureGoPreservingSoftwareArchitectureInItsImplemen...
EoinWoods_WhereDidMyArchitectureGoPreservingSoftwareArchitectureInItsImplemen...EoinWoods_WhereDidMyArchitectureGoPreservingSoftwareArchitectureInItsImplemen...
EoinWoods_WhereDidMyArchitectureGoPreservingSoftwareArchitectureInItsImplemen...Kostas Mavridis
 
fuser interface-development-using-jquery
fuser interface-development-using-jqueryfuser interface-development-using-jquery
fuser interface-development-using-jqueryKostas Mavridis
 
SiddharthAnand_NetflixsCloudDataArchitecture
SiddharthAnand_NetflixsCloudDataArchitectureSiddharthAnand_NetflixsCloudDataArchitecture
SiddharthAnand_NetflixsCloudDataArchitectureKostas Mavridis
 
NickKallen_DataArchitectureAtTwitterScale
NickKallen_DataArchitectureAtTwitterScaleNickKallen_DataArchitectureAtTwitterScale
NickKallen_DataArchitectureAtTwitterScaleKostas Mavridis
 

Plus de Kostas Mavridis (10)

GlennVanderburg_CraftAndSoftwareEngineering
GlennVanderburg_CraftAndSoftwareEngineeringGlennVanderburg_CraftAndSoftwareEngineering
GlennVanderburg_CraftAndSoftwareEngineering
 
RoyOsherove_TeamLeadershipInTheAgeOfAgile
RoyOsherove_TeamLeadershipInTheAgeOfAgileRoyOsherove_TeamLeadershipInTheAgeOfAgile
RoyOsherove_TeamLeadershipInTheAgeOfAgile
 
PatrickKua_TheBeginnersMind
PatrickKua_TheBeginnersMindPatrickKua_TheBeginnersMind
PatrickKua_TheBeginnersMind
 
DanNorth_FromMonthsToMinutesUppingTheStakes
DanNorth_FromMonthsToMinutesUppingTheStakesDanNorth_FromMonthsToMinutesUppingTheStakes
DanNorth_FromMonthsToMinutesUppingTheStakes
 
KevlinHenney_PuttingThereIntoArchitecture
KevlinHenney_PuttingThereIntoArchitectureKevlinHenney_PuttingThereIntoArchitecture
KevlinHenney_PuttingThereIntoArchitecture
 
BernhardMerkle_StopTheArchitectureErosion
BernhardMerkle_StopTheArchitectureErosionBernhardMerkle_StopTheArchitectureErosion
BernhardMerkle_StopTheArchitectureErosion
 
EoinWoods_WhereDidMyArchitectureGoPreservingSoftwareArchitectureInItsImplemen...
EoinWoods_WhereDidMyArchitectureGoPreservingSoftwareArchitectureInItsImplemen...EoinWoods_WhereDidMyArchitectureGoPreservingSoftwareArchitectureInItsImplemen...
EoinWoods_WhereDidMyArchitectureGoPreservingSoftwareArchitectureInItsImplemen...
 
fuser interface-development-using-jquery
fuser interface-development-using-jqueryfuser interface-development-using-jquery
fuser interface-development-using-jquery
 
SiddharthAnand_NetflixsCloudDataArchitecture
SiddharthAnand_NetflixsCloudDataArchitectureSiddharthAnand_NetflixsCloudDataArchitecture
SiddharthAnand_NetflixsCloudDataArchitecture
 
NickKallen_DataArchitectureAtTwitterScale
NickKallen_DataArchitectureAtTwitterScaleNickKallen_DataArchitectureAtTwitterScale
NickKallen_DataArchitectureAtTwitterScale
 

ErikDoernenburg_SoftwareQualityYouKnowItWhenYouSeeIt

  • 1. 0 10 20 30 40 50 60 SessionFactoryUtils AbstractBeanFactory BeanWrapperImpl DispatcherServlet SchedulerFactoryBean AntPathMatcher SQLErrorCodeSQLExceptionTranslator HibernateTemplate ReloadableResourceBundleMessageSource PropertiesBeanDefinitionReader StatementCreatorUtils LazyConnectionDataSourceProxy BooleanExpressionComplexity DefaultMessageListenerContainer JdoTransactionManager TopLinkTransactionManager ScriptFactoryPostProcessor TransactionAwareConnectionFactoryProxy NumberUtils HibernateAccessor SpringSessionSynchronization BeanDefinitionValueResolver ExtendedEntityManagerCreator ParameterMethodNameResolver ClassDataAbstractionCoupling MBeanClientInterceptor BeanFactoryAspectJAdvisorsBuilder CustomizableTraceInterceptor AbstractXsltView GenericCollectionTypeResolver ArgumentConvertingMethodInvoker SharedEntityManagerCreator FreeMarkerConfigurationFactory OC4JJtaTransactionManager ClassFanOutComplexity MockHttpServletRequest FrameworkPortlet ResourceArrayPropertyEditor AspectJWeaverMessageHandler MethodMapTransactionAttributeSource SingleConnectionFactory MessageListenerAdapter JdoTemplate CyclomaticComplexity FieldRetrievingFactoryBean VelocityView AbstractMessageListenerContainer SqlLobValue PortletRequestHandledEvent FileLength JdbcOperations TxAdviceBeanDefinitionParser ConnectorServerFactoryBean RefreshablePagedListHolder SqlMapClientTemplate MethodLength ClassUtils SystemPropertyUtils JmsTransactionManager DefaultBeanDefinitionDocumentReader TransactionAttributeEditor AbstractInterceptorDrivenBeanDefinitionDecorator NestedIfDepth ResultSetWrappingSqlRowSet HsqlMaxValueIncrementer AbstractSessionFactory AbstractPropertyAccessor LocalSlsbInvokerInterceptor BeansDtdResolver AnonInnerLength TransactionAwareDataSourceProxy PersistenceManagerFactoryUtils TomcatInstrumentableClassLoader LocalContainerEntityManagerFactoryBean AopNamespaceUtils JpaInterceptor HtmlCharacterEntityReferences ParameterNumber JdoInterceptor CciTemplate AspectJPrecedenceComparator AdvisedSupport OpenEntityManagerInViewFilter ScopedProxyBeanDefinitionDecorator ServletRequestAttributes ReflectiveVisitorHelper MissingSwitchDefault BeanDefinitionReaderUtils CustomEditorConfigurer AbstractBeanDefinitionReader ScopedProxyFactoryBean AbstractModelAndViewTests TreeWalker HessianServiceExporter MockPageContext CommonsLoggingLogSystem 0.80 1.00 1.20 1.40 1.60 1/4/06 15/4/06 29/4/06 1 13/5/06 27/5/06 10/6/06 2 24/6/06 8/7/06 22/7/06 5/8/06 19/8/06 2/9/06 3 16/9/06 30/9/06 14/10/06 28/10/06 3 3.05.1 11/11/06 Releases 25/11/06 9/12/06 23/12/06 4 6/1/07 5 20/1/07 3/2/07 6 Unit test LOC/LOC 17/2/07 3/3/07 7 17/3/07 31/3/07 Lines of unit test code per line of production code 8 9 14/4/07 10 28/4/07 12/5/07 26/5/07 11 12 13 9/6/07 14 23/6/07 15 7/7/07 16 21/7/07 17 4/8/07 18/8/07 1
  • 2. Software Quality – you know it when you see it Erik Doernenburg ThoughtWorks @erikdoe // erik.doernenburg.com 2
  • 3. 3
  • 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
  • 5. 30.000ft and ground level http://opensimulator.org/wiki/Grid_Architecture_Diagram pg 5
  • 6. The 1000ft view • Is at the “right” level • Aggregates data and metrics • Utilises visualisation techniques • Makes every pixel count 6 http://97things.oreilly.com/wiki/index.php/Get_the_1000ft_view
  • 7. Metrics • lines of code • method length • class size • cyclomatic complexity • weighted methods per class • coupling between (object) classes ckjm 7 http://www.campwoodsw.com/sourcemonitor.html
  • 8. More metrics • duplication • check-in counts • coverage • testability • test/code ratio simian 8 http://www.redhillconsulting.com.au/products/simian/
  • 9. Metrics tree maps Shows distribution of metrics Created with checkstyle and InfoVis 9 http://erik.doernenburg.com/2010/05/metrics-tree-maps/
  • 10. 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 BooleanExpressionComplexity 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 ClassDataAbstractionCoupling ClassFanOutComplexity MockHttpServ letRequest.java FrameworkPortlet.jav a ResourceArray Property Editor.java AspectJWeav erMessageHandler.java MethodMapTransactionAttributeSource.jav a SingleConnectionFactory .java MessageListenerAdapter.jav a JdoTemplate.jav a CyclomaticComplexity DataSourceUtils.java Velocity View.jav a Toxicity chart AbstractMessageListenerContainer.java SqlLobValue.jav a FileLength PortletRequestHandledEv ent.java JdbcOperations.jav a TxAdv iceBeanDef initionParser.java ArgTy pePreparedStatementSetter.jav a Ref reshablePagedListHolder.java AbstractJasperReportsSingleFormatView.java MethodLength ClassUtils.java SimpleMailMessage.jav a JmsTransactionManager.jav a TransactionAttributeEditor.jav a Def aultBeanDef initionDocumentReader.java NestedIfDepth AbstractInterceptorDrivenBeanDefinitionDecorator.java ResultSetWrappingSqlRowSet.jav a HsqlMaxValueIncrementer.jav a CodebaseAwareObjectInputStream.jav a AbstractSingletonProxy FactoryBean.java LocalSlsbInv okerInterceptor.java BeansDtdResolv er.java AnonInnerLength AbstractMessageSource.jav a AbstractDependency InjectionSpringContextTests.java TomcatInstrumentableClassLoader.java LocalContainerEntity ManagerFactoryBean.java ResourceEntity Resolver.java http://erik.doernenburg.com/2008/11/how-toxic-is-your-code/ Developed by ThoughtWorks using Excel 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 Provides easy to compare overview of quality OpenEntity ManagerInViewFilter.jav a TopLinkInterceptor.jav a MethodInv okingJobDetailFactoryBean.java Def aultNamespaceHandlerResolver.java XmlValidationModeDetector.jav a GenericFilterBean.jav a ParameterNumber MissingSwitchDefault TreeWalker HessianServ iceExporter.java Property AccessorUtils.java InstantiationModelAwarePointcutAdv isorImpl.java 10
  • 11. Size & complexity pyramid 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 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 11 http://loose.upt.ro/iplasma/ http://www.intooitus.com/inFusion.html
  • 12. 0.80 1.00 1.20 1.40 1.60 1/4/06 15/4/06 29/4/06 1 13/5/06 27/5/06 10/6/06 2 24/6/06 8/7/06 22/7/06 5/8/06 19/8/06 2/9/06 3 16/9/06 30/9/06 14/10/06 28/10/06 3 3.05.1 11/11/06 Releases 25/11/06 9/12/06 23/12/06 4 6/1/07 5 Created with Unix tools and Excel 20/1/07 3/2/07 Test to code ratio 6 Unit test LOC/LOC 17/2/07 Shows the test to code ratio over time 3/3/07 7 17/3/07 31/3/07 Lines of unit test code per line of production code 8 9 14/4/07 10 28/4/07 12/5/07 26/5/07 11 12 13 9/6/07 14 23/6/07 15 7/7/07 16 21/7/07 17 4/8/07 18/8/07 12
  • 13. System complexity view Part of Moose Technology Polymetric view of class hierarchy 13 http://www.moosetechnology.org/ http://www.inf.usi.ch/faculty/lanza/codecrawler.html http://sourceforge.net/projects/java2cdif/
  • 14. CodeCity Also part of Moose Technology Polymetric views in 3D and more 14 http://www.inf.usi.ch/phd/wettel/codecity-download.html http://erik.doernenburg.com/2009/07/moose-mse-for-java-and-cs/
  • 15. CodeCity continued Might need a license for VisualWorks Smalltalk 15
  • 16. Dependency Structure Matrix Not metrics based Looks at “complex complexity” 16 http://erik.doernenburg.com/2010/04/dependency-structure-matrix/
  • 17. Test coverage Not as a percentage, shows call graph AspectJ + GraphViz 17 http://erik.doernenburg.com/2008/09/call-graph-visualisation-with-aspectj-and-dot/
  • 18. 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 18
  • 19. How do you see quality? Comparisons • industry standards • different revisions: trends • different parts: outliers Aesthetics • symmetry • balance/harmony 19
  • 20. What next? Measure • tech debt • effectiveness of training Guide • refactoring • clean-up Celebrate 20