[go: up one dir, main page]

0% found this document useful (0 votes)
11 views112 pages

Visualizations For Code Metrics (Neal Ford)

Uploaded by

Shamil Choudhury
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views112 pages

Visualizations For Code Metrics (Neal Ford)

Uploaded by

Shamil Choudhury
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 112

ThoughtWorks

visualizations for
code metrics
NEAL FORD software architect / meme wrangler

ThoughtWorks
nford@thoughtworks.com
3003 Summit Boulevard, Atlanta, GA 30319
www.nealford.com
www.thoughtworks.com
blog: memeagora.blogspot.com
twitter: neal4d
housekeeping
ask questions anytime

download slides from


nealford.com

download samples from github.com/nealford


what was that?
code_swarm

http://code.google.com/p/codeswarm/

point it to a subversion repository

visualization of check-ins over time

useful? cool!
http://www.wired.com/wired/issue/16-07
wtf’s/min
external
perspective

is the software valuable to its users?


internal perspective
how appropriate is the design?

how amenable is emergent design?

how easy is it to understand & extend?

how maintainable is it?

is it salvageable?
30,000 feet ground level

http://opensimulator.org/wiki/Grid_Architecture_Diagram
where are the defects?
which way do the
messages flow?
where do the pictures
come from?
models created up front convey a vision but
usually don’t reflect reality
generating a complete model for large systems
is nearly impossible

systems evolve locally, often uncontrolled

the best picture very much depends on the


question you are trying to answer
need tools to create ad-hoc models more
easily
1. select a meta-model
a model that describes a model

example: meta-model for a class diagram

a class is a box with name, methods, fields,...

available connectors: association,


inheritance, aggregation…

rules: no circles in inheritance, etc.


common meta-models
Metrics (Quantitative) Directed Graph
M1
xyz
Foo Clas M1 M2 M3
s
Bar
M2 Foo 3.4 3.8 6.5
Bar 5.0 0.0 10.0
M1
… … … …

Tree Process Model


(e.g. Petri Net)
2. inspection /
instrumentation
static analysis

source code

byte code

dynamic analysis

profiling, listen to messages, log files,


network sniffer, etc.
3. mapping to the
model
Senders Receivers
example: messaging system Comp. Channel Comp. Channel
A X C X
B Y C Y

capture send/receive actions


Mapper

map onto directed graph Nodes: A, B, C


Edges: X(A!C)
Y(B!C)

Graph Model
4. visualization &...

Graphviz
...validation
don’t simply observe

verify & alert

enforce rules or best practices

detect cycles

islands on a dependency graph


the hawthorne effect
the hawthorne effect

measure and let it be known that


you are measuring
metrics
cyclomatic complexity
measures complexity of a function

V(G)= e - n + 2
V(G) = cyclomatic complexity of G
e= # edges
n= # of nodes
start

1 if (c1)
1

2 f1() 3 f2()

4
4
3
if (c2)

5 6
nodes

5 f3() 6 f4()
edges

7
8
7
end
chidamber & kemerer
object-oriented metrics
shyam r chidamber
chris f kemerer

easy but not terribly useful very useful


easy (but trivial)

dit depth of inheritance tree # levels of inheritance

noc number of children # immediate descendants

number of public
npm # public methods in class
methods
very useful
weighted methods/
wmc ∑ of cyclomatic complexity
class
# of methods executed due to
rfc response for class
method call
∑ of sets of methods not shared
lcom lack of cohesion
via sharing fields
cbo/ ∑ of other classes this class uses
efferent couplings
ce (outgoing calls)
∑ of how many other classes
ca afferent couplings
use this class (incoming calls)
visualizations
source monitor
freeware tool for gathering metrics

metrics:
lines, statements, % branches, calls, %
comments, classes, methods/class, avg stmts/
method, max complexity, max depth, average
depth, average complexity

graphical user interface, windows only!


source monitor:
kiviat graphs
source monitor:
class summary
source monitor w/ c#
looking for...

classes that violate several kiviat graph ranges

really odd shapes


“A project dedicated to making code
metrics so widely understood, valuable, and
simple that their use becomes ubiquitous,
thus raising the quality of software across
the industry.”
panopticode parts
code coverage with emma
1-line change to switch to cobertura
checkstyle
1-line switch for custom rule sets

jdepend code duplication using simian

javancss aggregator & reports

volatility treemaps
complexity treemap
code coverage
looking for...
20,000 foot view along a single dimension

simple view of one dimension

information radiators
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


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
iPlasma + Struts
vuze
looking for...
adherence to industry standards

low number of lines / method


(see composed method pattern)

low cyclomatic complexity / line


GraphViz
e
v d
e o
n t
t
l f
i i
s l
t e
output
generating dot files
untangling
jars

jar analyzer
Kirk Knoernschild
www.kirkk.com
xml output
t
r
a
n
s
f
o
r
m
e
d
graphical

struts 1.0
looking for...
not that!

small number of one-


way dependencies

no “rats’ nests”

no cycles
Vizant
ant task to create a GraphViz
DOT file from an ant build file

http://vizant.sourceforge.net/
ant 1.5
log4j
tomcat 3.3.1
from=“dist”
to=“prepare”
look for...
hot spots

more even distribution

networks around common dependent elements

think about extracting


via macrodef
SpringViz
XSLT => DOT for spring
dependencies
http://www.samoht.com/wiki/wiki.pl?SpringViz
SpringViz
look for...
regularity

symmetry

overloaded dependencies

isolated pockets
toxicity chart

provides easy to compare


overview of quality

created with checkstyle +


excel
30.0
35.0
40.0

20.0
25.0

0.0
5.0
10.0
15.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
DataSourceUtils.java
Velocity View.jav a
AbstractMessageListenerContainer.java
SqlLobValue.jav a

CyclomaticComplexity 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
toxicity chart

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
ParameterNumber MissingSwitchDefault TreeWalker

HessianServ iceExporter.java
Property AccessorUtils.java
InstantiationModelAwarePointcutAdv isorImpl.java
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.05
3.1
11/11/06

Releases
25/11/06

9/12/06

23/12/06

4
6/1/07

20/1/07 5
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
created using unix tools + excel
11 12 13

9/6/07
14
test to code ratio

23/6/07
15

7/7/07
16

21/7/07
17

4/8/07

18/8/07
cc / loc / releases
look for...
notifications along your key dimension

toxicity: high-spikes

test-to-code ratio: higher is better

complexity / loc: trends

deltas more interesting than


raw numbers
“Unveiling the beauty of statistics for a fact
based world view.”

time-based statistical view of chart data

founded in Stockholm by Ola Rosling, Anna


Rosling Rönnlund and Hans Rosling

now realized in the google spreadsheet motion


gadget
the data
motion chart gadget
look for...
time-based trends

odd outliers along


dimensions

symmetry

fluidity
CodeCrawler
www.inf.unisi.ch/faculty/lanza/codecrawler.html
CodeCrawler
CodeCrawler
academic graphical metrics tool

language independent

written in VisualAge Smalltalk

based on the Moose platform

quirky but powerful


x-ray
graduate student project written by Jacopo
Malnati (http://atelier.inf.unisi.ch/~malnatij/xray.php)
open-source software visualization plug-in for
eclipse
provides system complexity view, class &
package dependency view
model of the underlying Java project can be
triggered and used by other plug-ins
x-ray visualizing itself through via system complexity view
using x-ray
install the plug-in

choose the Analyze Current Project action


from the package explorer

x-ray creates textual information and actions

visualizations characterized by entities


positioned according to layouts and criterions
actions show/hide
# packages nodes
# methods
open selected
show
classes
dependencies

lines of code color tag


project name

snapshot image
# classes
show/hide
package content
polymetric views

system complexity view

class dependency view

package dependency view


system complexity view
system complexity view
tries to illustrate disharmonies in the design
and implementation of a system.

identify big nodes (compared to the others)

anomalies of shape (provided by the inheritance


tree)

view provides several different dimensions of


metrics
positional metrics
system complexity view
color metrics
system complexity view
Azureus 3.0
(more than
500,000 lines of
code)

x-ray itself
dependencies

outgoing

incoming
class & package
dependency views
class dependency view
package dependency
Azureus packages
filtering (< 30 weight)
proximity alert
look for...
towers (=> lots of code, lots of methods)

tangled dependencies

exuberant responsibility

natural partitions

balance
10,000 ft view (literally)

CodeCity by
Richard Wettel
http://www.inf.unisi.ch/phd/wettel/codecity.html
CodeCity
integrated environment for software analysis

software systems are visualized as interactive,


navigable 3D cities
written in VisualWorks Smalltalk, atop the
Moose platform

classes => buildings

packages => districts


citylyzer
Citylyzer
written atop x-ray

inspired by CodeCity

building height => number of methods

width/length => number of attributes

packages => districts


look for...
“real” cityscape

buildings that wouldn’t


exist in the real world

overly crowded neighborhoods

abandoned parts of town

would you live there?


metrics + agility
wire metrics & analysis into
continuous integration

manually check often

discuss on iteration boundaries

fail the build with:


xpath expressions & plugins
jdepend-like unit tests
summary
intermediate altitude

information radiators

single dimensions

compelling evidence

cool!
ThoughtWorks

?’s
please fill out the session evaluations
samples at github.com/nealford

NEAL FORD software architect / meme wrangler

ThoughtWorks
This work is licensed under the Creative Commons nford@thoughtworks.com
Attribution-Share Alike 3.0 License. 3003 Summit Boulevard, Atlanta, GA 30319
www.nealford.com
www.thoughtworks.com
http://creativecommons.org/licenses/by-sa/3.0/us/ blog: memeagora.blogspot.com
twitter: neal4d

You might also like