For any project that is critical to the business, it’s important to do ‘Modern Architecture Reviews’. Being an architect is fun, you get to design the system, do ongoing code reviews, and play the bad ass. It is even more fun when using modern cool tools.
A modern architecturereview–usingcodereviewtools-ver-3.5
1. A Modern Architecture Review
Using Code Review Tools
@AdamCogan | #vsalm #tee12 #dev324
Delivering Awesome Web Applications
2.
3. Agenda
• #1 The 1st things to look out for
• Processes
• Does it work?
• Documentation
• #2 High Level tools
• Architecture
• Code Analysis
• Code Metrics
• #3 Manual Checking
• SOLID Design Principles
• Code Review tools
V9.5
4. About Adam
Chief Architect at SSW
Developing custom solutions for
businesses across a range of
industries such as Government,
banking, insurance
Microsoft Gold Partner
Microsoft Regional Director
VSTS MVP
@AdamCogan
9. Do you evaluate the processes?
Often times this is the source of problems
Are devs getting bogged down in the UI?
Do you have a Scrum Master?
Do you have continuous integration?
Do you have continuous deployment?
Do you have a Schema Master?
Do you have a TFS Master?
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouHaveTheD
esignersFixingUpTheUI.aspx
10. Are they on the latest version?
…of VS
…of TFS
Alternatively for a „Gold Star‟ …
Resharper, add-ins, extensions
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
11. Can you „Get latest‟ and compile? #L1
It's amazing how often you can't simply do a "Get Latest" and
compile
Add _Instructions_Compile.docx
Then run unit tests…
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
12. Can you get latest and compile? #L1
See the Integration.Test project fail
Add _Instructions_Compile.docx
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
13. Can you get latest and compile? #L2
Creation of the
database via
scripts
(incremental)
Tip: use OSQL,
SQLCMD or SSW
SQL Deploy
and re-run the
tests. They will
now pass.
14. Do you want a „Gold Star‟ ? #L3
Streamline setup of a new development environment
Problems to check for:
Windows 8 not supported
Many things to build
Lots of dependencies
Recommendation: All manual work station setup steps
should be scripted with PowerShell
Recommendation: A get + compile should work within 1
minute, and work without a dev being on the domain (to
support external consultants)
15. PS C:CodeNorthwind> .Setup-Environment.ps1
Problem: Azure environment variable run state directory is not configured
(_CSRUN_STATE_DIRECTORY).
Problem: Azure Storage Service is not running. Launch the development fabric
by starting the solution.
WARNING: Abandoning remainder of script due to critical failures.
To try and automatically resolve the problems found, re-run the script with a -Fix
flag.
Figure: You see the problems in the devs environment
Note Prefix e.g. _01Setup-Environment.ps1
16. PS C:CodeNorthwind> .Setup-Environment.ps1 -fix
Problem: Azure environment variable run state directory is not configured
(_CSRUN_STATE_DIRECTORY).
Fixed: _CSRUN_STATE_DIRECTORY user variable set
Problem: Azure Storage Service is not running. Launch the development fabric
by starting the solution.
WARNING: No automated fix available for 'Azure Storage Service is running'
WARNING: Abandoning remainder of script due to critical failures.
Figure: The script tries to automatically fix the problems
17. PS C:CodeNorthwind> .Setup-Environment.ps1 -fix
Problem: Azure Storage Service is not running. Launch the development fabric
by starting the solution.
WARNING: No automated fix available for 'Azure Storage Service is running'
WARNING: Abandoning remainder of script due to critical failures.
Figure: Note on 2nd run only 1 script remains – see there is less to fix
18. Can you „Check In‟ and Deploy #L1
Add _Instructions_Deploy.docx
Alternatively for a „Star‟ …
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/Default.aspx
19. Can you „Check In‟ and Deploy #L2
Use PowerShell scripts as your documentation
build.ps1
deploy_dev.ps1
deploy_test.ps1
deploy_prod.ps1
Alternatively for a „Gold Star‟ … TFSBuild + Portal
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/Default.aspx
21. The compile problem….
A team issue?
Does it matter?
No?
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
22. Methods of compiling [Pain]
?
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
23.
24. Tip: Should you compile? [Pain]
Look at the page…
Alt+Tab to Visual studio
Modify file
Save
F5
Wait 15 sec…
Change the url (sometimes a crazy error)…
Hit F5… Wait 5 sec
Review change… (report)
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
25. Tip: Should you compile? [Pain]
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
26. Tip: Should you compile? [Pain]
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
27. Do you review the Solution and
Project names?
The name of your solution and the names of the project in your
solution should be consistent
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouReviewThe
SolutionName.aspx
28.
29. Do you review the documentation?
Old School:
Heavy, long documents
Sequence Diagrams
UML
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouReviewThe
Documentation.aspx
30.
31.
32. Suggestions for doco
e.g. Enterprise Architect
Use Red for unimplemented stuff
Use the DateTime shape
To see the last time the diagram was modified and by whom
Mark items as „TODO: Adam‟.
For items still pending
33. Do you review the documentation
New School:
4 docs
• Business.docx
• _Instructions_Compile.docx
• _Instructions_Deploy.docx
• Technologies.docx
Unit Tests (low level)
Code and Work Items (low level PBI)
41. Agenda
• #1 The 1st things to look out for
• Processes
• Does it work?
• Documentation
• #2 High Level tools
• Architecture
• Code Analysis
• Code Metrics
• #3 Manual Checking
• SOLID Design Principles
• Code Review tools
42. Do you look at the architecture?
2 Choices:
VS Dependency Graph or … ?
• Ultimate Edition + Take screenshots
nDepend ?
• 3rd Party Tool for a few hundred $ + Take screenshots
• Bad - Attach… Detach…. Noisy UI
• Bad - Complicated
• Good - No need for VS Ultimate
• Bonus: See problems in the „Queries + Rules Explorer‟
• Awesome - Customizable
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouLookAtThe
Architecture.aspx
48. Ndepend Relationships 101
Dependancy Graphs Intro
• Drill into a major relationship
• Edge Thickness: # Types
• [Major] Select Types | That are using me directly or indirectly
Doco:
Relationship | Export to HTML
• Relationship | Export to Graph
• Relationship | Generate a code rule that warns if this dependency
exists
• Relationship | View internal Dependency cycles on graph
49.
50. Something for the wall
• http://www.ndepend.com/Res/DiagramBoxAndArrowGraphBig.jpg
51. Ndepend Relationship 201
• See bidirectional relationships
• Potentially not healthy
• Relationship | Open this dependency on Matrix
About Erosion
• Much more green… then the blue is erosion
• Solution? Adaptive Design… moving towards the way the software has
evolved
• Fix by remove the hard dependency in the wrong direction. Add some
Inversion of Control (aka interfaces) in the middle
63. The Goal for your Code Analysis?
Encourage team members to check in their
code regularly
with no Code Analysis warnings, and
Code Metrics in green.
Eg.
66. Do you use the best Code Analysis
tools?
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouDoCodeAn
alysis.aspx
67. Do you use the best Code Analysis
tools?
Level 1 – ReSharper – All Rules
Level 2 - VS Code Analysis (FXCop) – Default Settings
Level 3 - VS Code Analysis (FXCop) – All Rules
Level 4 – StyleCop – All Rules
Level 5 – SSW Code Auditor – All Rules
?
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouDoCodeAn
alysis.aspx
68.
69.
70.
71.
72.
73. Do you use the best Code Analysis
tools?
Level 1 – ReSharper – campsite scout rule
Level 2 - VS Code Analysis (FXCop) – Default Settings
Level 3 - VS Code Analysis (FXCop) – Custom
Level 4 – StyleCop
Level 4 – StyleCop - Custom
Level 5 – SSW Code Auditor
Level 5 – SSW Code Auditor - Custom
TIP: Have a document with rules that you turn off and the reason
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouDoCodeAn
alysis.aspx
80. Code Analysis – Suppress #1
Add in „Suppression File‟ or in code?
?
81. Code Analysis – Suppress #2
Add in „Suppression File‟ or in code?
Rule No Good – removed from Rule Set
Rule N/A in this case – in „Suppression File‟
Rule is Valid – in this case I am overriding it
82. Code Analysis – Create work item #1
Add as Bug, PBI or Task...
?
83. Code Analysis – Create work item #2
Option 1: German (Neno Loje)
Select 30 in a PBI
Leave as warning
Option 2: Boy Scout
Easy ones (all into 1 PBI) eg. Alt+Enter on Resharper
Hard ones (1 per PBI)
88. Do you check the code coverage?
See if there are unit tests
See if they are any good (~ 80% coverage)
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouLookForCodeCoverage.aspx
89.
90. Report time?
If you are doing a report, gather some more reports…
E.g. Code Metrics, Code Coverage, Code Clones
But lets assume we are continuing to „Probe‟… So from:
SRP
…
…
Naming Conventions
92. Agenda
• #1 The 1st things to look out for
• Processes
• Does it work?
• Documentation
• #2 High Level tools
• Architecture
• Code Analysis
• Code Metrics
• #3 Manual Checking
• SOLID Design
Principles
• Code Review tools
93. Do you run Code Metrics to find
dodgy code?
Use the “Hot Spots” feature to quickly identify smelly code
It measures:
Maintainability Index
Cyclomatic Complexity
Depth of Inheritance
Class Coupling
Lines of Code
97. Manual Review
After using the automated high level tools it‟s time to actually
jump into the code
Look for code that doesn‟t follow SOLID principles… and then
design patterns
Speak to the devs
98. SOLID Principles
Single Responsibility Principle
Open Close Principle
Liskov Substitution Principle
Interface Segregation Principle
Dependency Inversion Principle
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouKnowCom
monDesignPrinciples.aspx
99.
100. Single Responsibility Principle
A class should have one and only one responsibility
public class Address {
// Standard Address Properties
public Image GetGoogleMaps() {}
public decimal GetDistance(Address destination) {}
public bool ValidateAddress() {}
}
101. Single Responsibility Principle
The Address class has too many responsibilities
Showing an image of the address (tied to UI)
Calculations based on the address
Validation of the address
Another UI may use BingMaps instead of Google Maps
Some, if not all of these functions should be moved to other
classes like MapHelper and AddressHelper
102. Single Responsibility Principle
public class AddressHelper {
public decimal GetDistance(Address start, Address destination) {}
public bool ValidateAddress(Address address) {}
}
public class GoogleMapProvider : IMapProvider {
public Image GetMap(Address start) {}
}
public class BingMapProvider : IMapProvider {
public Image GetMap(Address start) {}
}
103.
104. Open Closed Principle
Open for extension, but closed for modification
Use Abstract base classes that specify some base functionality
E.g. In .NET WebRequest allows you to connect servers via
web protocols
HttpWebRequest
FtpWebRequest
FileWebRequest
105.
106. Liskov‟s Substitution Principle
Subtypes must be substitutable for their base types
public abstract class Duck {
public abstract void Quack();
}
107. Liskov‟s Substitution Principle
public class PekinDuck : Duck {
public void Quack() {}
}
public class BatteryPoweredDuck : Duck{
public BatteryPoweredDuck(Battery energizer) {}
public void Quack() {}
}
Can‟t swap PekinDuck with BatteryPoweredDuck because
you need pass it some batteries first
108. Another example
public class Rectangle { public class Square : Rectangle {
protected int _width; public override void SetWidth(int width) {
protected int _height; _width = width;
_height = width;
public int Width { get { return _width; }
}
public int Height { get { return _height; } public override void SetHeight(int height)
public void SetWidth(int width) { {
_width = width; _width = height;
} _height = height;
}
public void SetHeight(int height) {
}
_height = height;
}
}
109. Another Example (cont…)
If we try to use these classes
var shape = new Rectangle();
shape.SetWidth(2);
shape.SetHeight(5);
Console.WriteLine(String.Format(“Area = {0}”,
shape.Height * shape.Width))
// Prints 10 as expected (2 * 5 = 10)
110. Another Example (cont…)
If we try the Square
var shape = new Square();
shape.SetWidth(2);
shape.SetHeight(5);
Console.WriteLine(String.Format(“Area =
{0}”, shape.Height * shape.Width))
// Prints 25 not as expected since we set
the Width = 2 and Height = 5
111. Another Example (cont..)
The Square violates the Liskov substitution principle as
we don‟t get expected behaviour as setting the width will
also modify the height and vice versa
112.
113.
114. Interface Segregation Principle
Don‟t create interfaces with lots of methods that don‟t
necessarily get used in their implementations
public interface IBird { public class MockingBird : IBird
public void Chirp(); {
public void Flap(); public void Chirp() {}
public void Fly(); public void Flap() {}
public void Eat(); public void Fly() {}
} public void Eat() {}
}
115. Interface Segregation Principle
public class Emu : IBird {
public void Chirp() {}
public void Flap() {}
public void Fly() {}
public void Eat() {
throw new NotImplementedException();
}
}
116. Interface Segregation Principle
public interface IBird {
public void Chirp();
public void Flap();
public void Eat();
}
public interface IFlyingBird : IBird {
public void Fly();
}
public class Emu : IBird {
public void Chirp() {}
public void Flap() {}
public void Fly() {}
}
117.
118. Dependency Inversion Principle
Depend on abstractions, not on implementations. Anything
required to create a valid instance of an object, should have those
dependencies passed in as arguments to the constructor
Higher level classes to depend on abstractions of lower level
classes (swappable)
public class Employee {
public Employee() {
FavCoffee = new Cappuccino();
Skills = new List<Skills> {
new MSAccessSkill(),
new SharePointSkill(),
new DotNetNukeSkill()
}
}
}
119. Dependency Inversion Principle
public class Employee {
public Employee(IDrinkable iamthirsty, IEnumerable<Skills> skills) {}
}
120. Dependency Inversion Principle
var MarkLiu = new Employee( var EricPhan = new Employee(
CoffeeFactory.Get(“Skim Cappuccino”), CoffeeFactory.Get(“Latte”),
new List<Skills> { new List<Skills> {
new MSAccessSkill(), new BusinessIntelligenceSkill(),
new SharePointSkill(), new MVC4Skill(),
new DotNetNukeSkill() new DotNetSkill()
}); });
121. Do you know the common Design
Patterns?
?
“Communicate massive amount of data in a few words”
Adam Cogan
“Accepted solutions to well known problems”
Ben Day
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouKnowCom
monDesignPatterns.aspx
122. Do you know the common Design
Patterns?
Inversion of Control Abstract factory Iterator
Dependency Injection Adapter Visitor
Factory Bridge State
Singleton Mediator Composite
Repository Proxy Facade
Unit of Work Flyweight Observer
MVC Chain of responsibility Decorator
MVP Command Null object
MVVM Memento Interpreter
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouKnowCom
monDesignPatterns.aspx
124. Abstractness vs Instability Diagram
Shows the assemblies that are painful to
maintain
i.e concrete and stable, and
which assemblies are potentially useless
i.e abstract and instable
Abstract: The assembly contains many abstract
types (i.e interfaces and abstract classes) and
few concrete types
Stable: The assembly is considered stable if its
types are used by a lot of types of tier
assemblies. In this condition stable means painful
to modify.
125. Do you start reading code?
Comments
Q: Good or Bad?
Comments are a smell
Includes comments that explain the intent (the why rather than
the what)
126. Do you start reading code?
Is clear and easy to read
Has consistent and meaningful names for everything
Has no duplicate or redundant code
Has consistent styles and formatting
Explains "why" when you read down, and "how" when you
read left to right
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouStartReadi
ngCode.aspx
127. Do you know Code Reviews after
check in are bad?
If you are aiming to get the to nirvana of Continuous
Deployment, then you cant *rely* on code reviews after the
fact.
Code Reviews have different status:
* Important
* Nice to have
128. The Scenario
Mark is migrating from DotNetNuke to MVC
He‟s unsure of his code because he doesn‟t know Razor
Add some code with a comment „this could be done better‟
Checks in anyway
129. Use the Code Review tools in TFS
2012
TFS 2012 has built in Code Review tools
Hooks into the check-in/shelving process
This allows code to be manually reviewed before checking in
145. Code Review Summary
Today: Developer does some work and wants to get it
checked before committing to source control
Suggestion to MS: Add a new scenario
No touching of code
Architect „Adds comments‟ during code review
Automatically adds the developers who originally worked on that
section (instead of manually using annotate)
Creates “Code Review” work items
http://www.ssw.com.au/ssw/Standards/BetterSoftwareSuggestions/TeamFoundationServer.aspx
146. Resources
Thanks: Eric Phan and Adam Stephensen
Thanks: Marcel De Vries and Terje Sandstrom
Google: ssw tv architecture code reviews
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterAr
chitectureandCodeReview/
147. Summary
• #1 The 1st things to look out for
• Processes
• Does it work?
• Documentation
• #2 High Level tools
• Architecture
• Code Analysis
• Code Metrics
• #3 Manual Checking
• SOLID Design Principles
• Code Review tools
148. Evaluations + 2 things
Include best tip or tool you heard. Plus your tip to me.
@adamcogan
or
AdamCogan@ssw.com.au
Come and visit us (+ Sydney .NET User Group)
Come and visit Damian Brady, Steven Nagy (+ Brisbane .NET User Group)
149. Thank You!
Sydney | Melbourne | Brisbane | Adelaide
info@ssw.com.au
www.ssw.com.au
Delivering Awesome Web Applications