A Modern Architecture ReviewUsing Code Review Tools
Delivering Awesome Web Applications
@AdamCogan | #vsalm #tee12 #dev324
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
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
About Adam
I Believe
The first things to look out for
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/DoYouHaveTheDesignersFixingUpTheUI.aspx
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
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
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
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.
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)
Figure: You see the problems in the devs environmentNote Prefix e.g. _01Setup-Environment.ps1
PS C:\Code\Northwind> .\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: The script tries to automatically fix the problems
PS C:\Code\Northwind> .\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: Note on 2nd run only 1 script remains – see there is less to fix
PS C:\Code\Northwind> .\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.
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
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
Can you ‘Check In’ and Deploy #L2TFSBuild + Portal
The compile problem….
A team issue?
Does it matter?
No?
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
Methods of compiling [Pain] ?
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
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
Tip: Should you compile? [Pain]
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
Tip: Should you compile? [Pain]
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
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/DoYouReviewTheSolutionName.aspx
Do you review the documentation?
Old School: Heavy, long documents Sequence Diagrams UML
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouReviewTheDocumentation.aspx
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
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)
Vote:
High Level Tools
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
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/DoYouLookAtTheArchitecture.aspx
My Dream
My Dream – instead of this
My Dream – it automatically does this
Ndepend Relationships 101Dependancy 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
Something for the wall
• http://www.ndepend.com/Res/DiagramBoxAndArrowGraphBig.jpg
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
Look at what to refactor
Ndepend Relationships 301Continuing….the matrix
Before fixing understand the scope
Right click | Build a graph representing one of the shortest paths
Ndepend 401The rules
Q: Which ones do you care about?
(use the Metrics view for a picture)
Or…
Great Overview tool and learning toolNot for day-to-day use as a code analysis tool.Note: Don’t be distracted by a colour problem
The Goal for your Code Analysis?
The Goal for your Code Analysis?
Encourage team members to check in their code regularlywith no Code Analysis warnings, and Code Metrics in green.
Eg.
Lets have a look at my Norwegian Ninja
Do you use the best Code Analysis tools?
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouDoCodeAnalysis.aspx
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/DoYouDoCodeAnalysis.aspx
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/DoYouDoCodeAnalysis.aspx
ReSharper
Resharper Custom
Code Analysis
Run
Options to make a Custom set (Hard UI)
Code Analysis
Find the options….
Code Analysis Custom
Code Analysis – Suppress #1Add in ‘Suppression File’ or in code?
?
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
Code Analysis – Create work item #1Add as Bug, PBI or Task...
?
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
ResharperHard ones (1 per PBI)
StyleCop
Code Auditor
Rules turned off
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
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
Our solution is clean now. What next?
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
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
Code Metrics Results
Manual Checking:Getting our hands dirty
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
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/DoYouKnowCommonDesignPrinciples.aspx
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() {}}
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
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) {}}
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
Liskov’s Substitution Principle
Subtypes must be substitutable for their base types
public abstract class Duck { public abstract void Quack();}
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
Another example
public class Rectangle { protected int _width; protected int _height; public int Width { get { return _width; } public int Height { get { return _height; } public void SetWidth(int width) { _width = width; } public void SetHeight(int height) { _height = height; }}
public class Square : Rectangle { public override void SetWidth(int width) { _width = width; _height = width; } public override void SetHeight(int height) { _width = height; _height = height; }}
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)
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
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
Interface Segregation Principle
Don’t create interfaces with lots of methods that don’t necessarily get used in their implementationspublic interface IBird {
public void Chirp(); public void Flap(); public void Fly(); public void Eat();}
public class MockingBird : IBird { public void Chirp() {} public void Flap() {} public void Fly() {} public void Eat() {}}
Interface Segregation Principle
public class Emu : IBird { public void Chirp() {} public void Flap() {} public void Fly() {} public void Eat() { throw new NotImplementedException(); }}
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() {}}
Dependency Inversion PrincipleDepend 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() } } }
Dependency Inversion Principle
public class Employee { public Employee(IDrinkable iamthirsty, IEnumerable<Skills> skills) {} }
Dependency Inversion Principle
var MarkLiu = new Employee( CoffeeFactory.Get(“Skim Cappuccino”), new List<Skills> { new MSAccessSkill(), new SharePointSkill(), new DotNetNukeSkill() });
var EricPhan = new Employee( CoffeeFactory.Get(“Latte”), new List<Skills> { new BusinessIntelligenceSkill(), new MVC4Skill(), new DotNetSkill() });
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/DoYouKnowCommonDesignPatterns.aspx
Do you know the common Design Patterns?
Inversion of Control
Dependency Injection
Factory
Singleton
Repository
Unit of Work
MVC
MVP
MVVM
http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouKnowCommonDesignPatterns.aspx
Abstract factory
Adapter
Bridge
Mediator
Proxy
Flyweight
Chain of responsibility
Command
Memento
Iterator
Visitor
State
Composite
Facade
Observer
Decorator
Null object
Interpreter
Anti-Patterns
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.
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)
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/DoYouStartReadingCode.aspx
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
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
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
Suspend current changes
Request a Review
Assign Reviewer
Reviewer Gets the Request
Check out the changeset
Related work items
Modified files
Shows the changed code
Side by Side (Standard Diff)
#1#2
Finalizing the Code Review
Check the Code Review
Check any comments
View code marked for review
Mark any flagged code as completed
Mark the Code Review as Complete
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
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/RulestobetterArchitectureandCodeReview/
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
Evaluations + 2 things
Include best tip or tool you heard. Plus your tip to me.
Come and visit us (+ Sydney .NET User Group)
Come and visit Damian Brady, Steven Nagy (+ Brisbane .NET User Group)
Delivering Awesome Web Applications
Thank You!
Sydney | Melbourne | Brisbane | Adelaide
www.ssw.com.au
Questions? Take a business card.
Refactoring
Level 1: Minimum
Level 2: Custom
Note: All disabled ones to be documentedeg. http://www.benday.com/2010/03/15/article-static-methods-are-a-code-smell/