Advertisement
Advertisement

More Related Content

Slideshows for you(20)

Advertisement
Advertisement

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. 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
  3. 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
  4. I Believe
  5. The first things to look out for
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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.
  11. 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)
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. Can you „Check In‟ and Deploy #L2 TFSBuild + Portal
  18. The compile problem…. A team issue? Does it matter? No? http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
  19. Methods of compiling [Pain] ? http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
  20. 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
  21. Tip: Should you compile? [Pain] http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
  22. Tip: Should you compile? [Pain] http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/CanYouGetLatestAndCompile.aspx
  23. 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
  24. Do you review the documentation?  Old School:  Heavy, long documents  Sequence Diagrams  UML http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouReviewThe Documentation.aspx
  25. 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
  26. 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)
  27. Vote:
  28. High Level Tools
  29. 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
  30. 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
  31. My Dream
  32. My Dream – instead of this
  33. My Dream – it automatically does this
  34. 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
  35. Something for the wall • http://www.ndepend.com/Res/DiagramBoxAndArrowGraphBig.jpg
  36. 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
  37. Look at what to refactor
  38. Ndepend Relationships 301 Continuing….the matrix Before fixing understand the scope Right click | Build a graph representing one of the shortest paths
  39. Ndepend 401 The rules Q: Which ones do you care about? (use the Metrics view for a picture)
  40. Or…
  41. Great Overview tool and learning tool Not for day-to-day use as a code analysis tool. Note: Don‟t be distracted by a colour problem 
  42. The Goal for your Code Analysis?
  43. 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.
  44. Lets have a look at my Norwegian Ninja
  45. Do you use the best Code Analysis tools? http://rules.ssw.com.au/SoftwareDevelopment/RulestobetterArchitectureandCodeReview/Pages/DoYouDoCodeAn alysis.aspx
  46. 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
  47. 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
  48. ReSharper
  49. Resharper Custom
  50. Code Analysis  Run  Options to make a Custom set (Hard UI)
  51. Code Analysis
  52. Find the options….
  53. Code Analysis Custom
  54. Code Analysis – Suppress #1 Add in „Suppression File‟ or in code?  ?
  55. 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
  56. Code Analysis – Create work item #1 Add as Bug, PBI or Task... ?
  57. 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)
  58. StyleCop
  59. Code Auditor
  60. Rules turned off
  61. 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
  62. 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
  63. Our solution is clean now. What next?
  64. 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
  65. 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
  66. Code Metrics Results
  67. Manual Checking: Getting our hands dirty
  68. 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
  69. 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
  70. 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() {} }
  71. 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
  72. 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) {} }
  73. 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
  74. Liskov‟s Substitution Principle  Subtypes must be substitutable for their base types public abstract class Duck { public abstract void Quack(); }
  75. 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
  76. 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; } }
  77. 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)
  78. 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
  79. 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
  80. 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() {} }
  81. Interface Segregation Principle public class Emu : IBird { public void Chirp() {} public void Flap() {} public void Fly() {} public void Eat() { throw new NotImplementedException(); } }
  82. 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() {} }
  83. 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() } } }
  84. Dependency Inversion Principle public class Employee { public Employee(IDrinkable iamthirsty, IEnumerable<Skills> skills) {} }
  85. 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() }); });
  86. 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
  87. 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
  88. Anti- Patterns
  89. 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.
  90. 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)
  91. 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
  92. 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
  93. 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
  94. 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
  95. Suspend current changes
  96. Request a Review
  97. Assign Reviewer
  98. Reviewer Gets the Request
  99. Check out the changeset Related work items Modified files
  100. Shows the changed code
  101. Side by Side (Standard Diff)
  102. #2 #1
  103. Finalizing the Code Review
  104. Check the Code Review
  105. Check any comments
  106. View code marked for review
  107. Mark any flagged code as completed
  108. Mark the Code Review as Complete
  109. 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
  110. 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/
  111. 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
  112. 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)
  113. Thank You! Sydney | Melbourne | Brisbane | Adelaide info@ssw.com.au www.ssw.com.au Delivering Awesome Web Applications
  114. Questions? Take a business card.
  115. Refactoring  Level 1: Minimum  Level 2: Custom  Note: All disabled ones to be documented eg. http://www.benday.com/2010/03/15/article-static-methods- are-a-code-smell/

Editor's Notes

  1. Make more realistic
Advertisement