<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-AU">
  <id>https://david.gardiner.net.au/tags/Software%20Engineering.xml</id>
  <title type="html">David Gardiner - Software Engineering</title>
  <updated>2026-05-14T00:34:52.013Z</updated>
  <subtitle>Blog posts tagged with &apos;Software Engineering&apos; - A blog of software development, .NET and other interesting things</subtitle>
  <rights>Copyright 2026 David Gardiner</rights>
  <icon>https://www.gravatar.com/avatar/37edf2567185071646d62ba28b868fab?s=64</icon>
  <logo>https://www.gravatar.com/avatar/37edf2567185071646d62ba28b868fab?s=256</logo>
  <generator uri="https://github.com/flcdrg/astrojs-atom" version="3">astrojs-atom</generator>
  <author>
    <name>David Gardiner</name>
  </author>
  <link href="https://david.gardiner.net.au/tags/Software%20Engineering.xml" rel="self" type="application/atom+xml"/>
  <link href="https://david.gardiner.net.au/tags/Software%20Engineering" rel="alternate" type="text/html" hreflang="en-AU"/>
  <category term="Software Engineering"/>
  <category term="Software Development"/>
  <entry>
    <id>https://david.gardiner.net.au/2018/06/get-programming-in-f</id>
    <updated>2018-06-11T20:35:00.000+09:30</updated>
    <title>Get programming in F#</title>
    <link href="https://david.gardiner.net.au/2018/06/get-programming-in-f" rel="alternate" type="text/html" title="Get programming in F#"/>
    <category term=".NET"/>
    <category term="Books"/>
    <category term="Software Engineering"/>
    <published>2018-06-11T20:35:00.000+09:30</published>
    <summary type="html">I’m really interested in learning more about functional programming.</summary>
    <content type="html">&lt;p&gt;I’m really interested in learning more about functional programming. It isn’t something I knew much about, but the benefits of reducing mutability (and shared state) promoted by functional languages and functional style are enticing.&lt;/p&gt;
&lt;p&gt;To that end, I recently bought a copy of Isaac Abraham’s new book “&lt;a href=&quot;https://www.amazon.com/Get-Programming-guide-NET-developers/dp/1617293997/ref=as_li_ss_tl?ref_=nav_signin&amp;amp;&amp;amp;linkCode=sl1&amp;amp;tag=davesdayd-20&amp;amp;linkId=fe849543709cb584510d3222fe58a8c2&quot;&gt;Get programming in F#. A guide for .NET Developers&lt;/a&gt;”.&lt;/p&gt;
&lt;p&gt;I have no background in functional languages at all, so I was looking for a “gentle” introduction to the F# language, without getting hung up on a lot of the functional terminology that seems to make learning this stuff a bit impenetrable for the newcomer. This book delivers.&lt;/p&gt;
&lt;p&gt;The structure of the book is in 10 “units”, which in turn are broken down into separate “lessons” (each lesson is a separate chapter).&lt;/p&gt;
&lt;p&gt;Here&apos;s my notes from each unit:&lt;/p&gt;
&lt;h2&gt;Unit 1 – F# and Visual Studio&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Introduces using the Visual Studio IDE for F# development, and recommended extensions. Surprisingly for a book published in 2018, most of the book is based on using Visual Studio 2015. I can only presume this is an artifact of the time it takes to write a book. I understand the initial release of 2017 did have some tooling regressions for F# but I am under the impression those are now resolved, seeing at my time of writing the 7th update for 2017 has just been released, including specific enhancements for F#.&lt;/li&gt;
&lt;li&gt;Throughout the book, comparisons are made to equivalent C# language constructs, and here too, the text is already a bit dated. An unfortunate downside of a printed book I guess.&lt;/li&gt;
&lt;li&gt;One thing to note that is different from many other languages – the file order in F# projects is significant. You can’t reference something before the compiler has seen it, and the compiler processes files in project order.&lt;/li&gt;
&lt;li&gt;The REPL is also a big part of F# development.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unit 2 – Hello F#&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The ‘let’ keyword is introduced. It’s more like C#’s const than var, seeing as F# defaults to things being immutable rather than mutable.&lt;/li&gt;
&lt;li&gt;Scoping is based on whitespace indentation rather than curly braces.&lt;/li&gt;
&lt;li&gt;Diving into how the F# compiler is much stricter because of the way the F# type system works, and how that can be a good thing.&lt;/li&gt;
&lt;li&gt;A closer look at working with immutable data, and how you can opt in to mutable data when absolutely necessary, and how to handle state.&lt;/li&gt;
&lt;li&gt;C# is statement based, whereas F# likes to be expression based.&lt;/li&gt;
&lt;li&gt;The ‘unit’ type is introduced. It’s kind of like void, but is a way for expressions to always return a value (and means the use of those expressions is always consistent).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unit 3 – Types and functions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tuples, records&lt;/li&gt;
&lt;li&gt;Composing functions, partial functions, pipelines,&lt;/li&gt;
&lt;li&gt;How do you organise all these types and functions if you’re not using classes? Organising code through namespaces and modules&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unit 4 – Collections in F#&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Looking at the F#-specific collection types – List, Array and Seq, the functions you can use with those collections. Immutable dictionaries, Map and Sets. Aggregation and fold.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unit 5 – The pit of success with the F# type system&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Conditional logic in F#, pattern matching&lt;/li&gt;
&lt;li&gt;Discriminated unions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unit 6 – Living on the .NET platform&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;How to use C# libraries from F#. Using Paket for NuGet package management&lt;/li&gt;
&lt;li&gt;How to use F# libraries from C#&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unit 7 – Working with data&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Introducing Type Providers. Specific use cases with JSON, SQL and CSV.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unit 8 – Web programming&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Asynchronous language support&lt;/li&gt;
&lt;li&gt;Working with ASP.NET WebAPI 2&lt;/li&gt;
&lt;li&gt;Suave – F#-focussed web library&lt;/li&gt;
&lt;li&gt;Consuming HTTP data&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unit 9 – Unit testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The role of unit testing in F# applications&lt;/li&gt;
&lt;li&gt;Using common .NET unit testing libraries with F#&lt;/li&gt;
&lt;li&gt;Property-based testing and FsCheck&lt;/li&gt;
&lt;li&gt;Web testing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unit 10 – Where next?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Further reading and resources to take your next steps.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <id>https://david.gardiner.net.au/2017/02/richards-technical-debt</id>
    <updated>2017-02-25T11:39:00.001+10:30</updated>
    <title>Richard’s Technical Debt</title>
    <link href="https://david.gardiner.net.au/2017/02/richards-technical-debt" rel="alternate" type="text/html" title="Richard’s Technical Debt"/>
    <category term="Software Engineering"/>
    <published>2017-02-25T11:39:00.001+10:30</published>
    <summary type="html">These are my notes from listening to the recording of Richard Banks’ talk The Technical Debt Prevention Clinic that he gave recently at the Microsoft Ignite Australia 2017 conference.</summary>
    <content type="html">&lt;p&gt;These are my notes from listening to the recording of &lt;a href=&quot;https://www.richard-banks.org/&quot;&gt;Richard Banks&lt;/a&gt;’ talk &lt;a href=&quot;https://learn.microsoft.com/shows/&quot;&gt;The Technical Debt Prevention Clinic&lt;/a&gt; that he gave recently at the &lt;a href=&quot;https://web.archive.org/web/20171017085857/https://msftignite.com.au/&quot;&gt;Microsoft Ignite Australia 2017&lt;/a&gt; conference.&lt;/p&gt;
&lt;p&gt;TL; DR - This is a really compelling talk. Go watch it, and share it with your colleagues!&lt;/p&gt;
&lt;p&gt;My notes and highlights follow. These are not a substitute for watching/listening to the talk, and the best thing (if you ever get the opportunity) would be to see Richard deliver this in person.&lt;/p&gt;
&lt;h2&gt;Technical debt&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Is design complexity + cognitive load. Is NOT quick &amp;amp; dirty code&lt;/li&gt;
&lt;li&gt;Bad code is not technical debt, it’s just bad code&lt;/li&gt;
&lt;li&gt;Quantifying – look at trends over time&lt;/li&gt;
&lt;li&gt;Don’t&lt;ul&gt;
&lt;li&gt;do a “technical debt sprint”&lt;/li&gt;
&lt;li&gt;Rewrite&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Do&lt;ul&gt;
&lt;li&gt;“Boy Scout Rule”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Refactoring&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Micro-refactoring – do anytime&lt;/li&gt;
&lt;li&gt;Macro-refactoring – plan and only do one at a time to limit disruption to team&lt;/li&gt;
&lt;li&gt;Both should have tests in place – ideally behavioural tests (so you’re testing the behaviour not the implementation)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Feature flags&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Really useful&lt;/li&gt;
&lt;li&gt;Still need to be managed properly&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Preventing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Be Professional – you don’t need permission to do your job properly&lt;/li&gt;
&lt;li&gt;Have a Definition of Done and stick to it.&lt;/li&gt;
&lt;li&gt;Automate everything you can&lt;ul&gt;
&lt;li&gt;tests&lt;/li&gt;
&lt;li&gt;code styles/rules&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Change Team Culture&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Code Reviews (suck)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Traditional code reviews often don’t work well for a number of reasons&lt;/li&gt;
&lt;li&gt;Try doing peer refactoring&lt;/li&gt;
&lt;li&gt;Or pair programming when it is “strong-style” where both people are engaged.&lt;ul&gt;
&lt;li&gt;Put the mouse away!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mob programming – maximise team intelligence&lt;/li&gt;
&lt;li&gt;Experiment and find out what works for your team&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Other tips&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Avoid branching if possible. If not possible make it short-lived. This is because merging is costly&lt;/li&gt;
&lt;li&gt;Premature optimisation&lt;/li&gt;
&lt;li&gt;Resist temptations&lt;/li&gt;
&lt;li&gt;Shared learning&lt;/li&gt;
&lt;li&gt;Run hackathons&lt;/li&gt;
&lt;li&gt;Adhere to that Definition of Done&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Technical debt can be a good thing, but bad code never is.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://david.gardiner.net.au/2016/10/adelaide-coderetreat</id>
    <updated>2016-10-23T09:54:00.001+10:30</updated>
    <title>Adelaide CodeRetreat</title>
    <link href="https://david.gardiner.net.au/2016/10/adelaide-coderetreat" rel="alternate" type="text/html" title="Adelaide CodeRetreat"/>
    <category term="Software Engineering"/>
    <category term="Conferences"/>
    <category term="Food"/>
    <published>2016-10-23T09:54:00.001+10:30</published>
    <summary type="html">Earlier this year I’d been contacted by Rachelle (Community Manager at Reinteractive) asking if I could promote a CodeRetreat Event that she was organising in Adelaide to ADNUG members.</summary>
    <content type="html">
&lt;p&gt;Earlier this year I’d been contacted by &lt;a href=&quot;https://twitter.com/RachelleOnRails&quot;&gt;Rachelle&lt;/a&gt; (Community Manager at &lt;a href=&quot;https://web.archive.org/web/20250220121034/https://www.reinteractive.net/&quot;&gt;Reinteractive&lt;/a&gt;) asking if I could promote a CodeRetreat Event that she was organising in Adelaide to ADNUG members. Not only was I was more than happy to do this, but I decided to go along myself and find out what it was all about.&lt;/p&gt;
&lt;p&gt;The day-long event was held in the &lt;a href=&quot;https://web.archive.org/web/20171023235738/http://www.southstart.co/cowork/&quot;&gt;_southstart&lt;/a&gt; (formerly Majoran) office space in Grenfell St. 20 had registered, but somewhat disappointingly only 6 of us showed up (I say “somewhat” as in some ways having a smaller group actually worked better, and not just because there was more food to go around!)&lt;/p&gt;
&lt;p&gt;The day was also facilitated by Adam Davies (who also helps run the &lt;a href=&quot;https://www.meetup.com/adelaiderb/&quot;&gt;Adelaide Ruby Meetup group&lt;/a&gt;). The structure of the day was &lt;a href=&quot;https://web.archive.org/web/20170721151339/http://coderetreat.org:80/facilitating/structure-of-a-coderetreat&quot;&gt;based on the one from Coderetreat.org&lt;/a&gt;. After a welcome and introduction, we paired off with another attendee, worked on implementing &lt;a href=&quot;https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life&quot;&gt;Conway’s Game Of Life&lt;/a&gt; for around 40 minutes, then all came back together as a group for a ‘retrospective’ review and discussion of how we felt that session went. This was then repeated for most of the day, with a few challenges thrown in just to make it interesting, like “only commit code to version control when all tests pass, and use a 4 minute timer that you revert all uncommitted code when the timer expires” (that one was stressful!), “ping pong” (one person writes the test, and the other has to implement the code for the test) or “avoid using a mouse”.&lt;/p&gt;
&lt;p&gt;Most of these sessions operated in pairs and promoted using test-driven development (writing the test first, confirm that the test fails, now write the smallest amount of code to make the test pass). I really do like the practises of pair programming and TDD, and it reminded me that it would be good to use these more in everyday work.&lt;/p&gt;
&lt;p&gt;One rule of the day was “delete all your code at the end of each session”. It was curious how ‘wrong’ that felt. You are so used to saving and keeping stuff. It was probably a bit liberating too – after all while the code had gone, the experience and learning from the pairing session had not.&lt;/p&gt;
&lt;p&gt;Even in such a small group there was a good mix of programming languages – Ruby, Java, JavaScript, C# (obviously) and even &lt;a href=&quot;https://elm-lang.org/&quot;&gt;Elm&lt;/a&gt;. Sitting down with a fellow developer and working in an unfamiliar language was also both a challenge and a highlight.&lt;/p&gt;
&lt;p&gt;Lunch was provided, and was a step up from the usual pizza fare. Very nice!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The most awesome lunch courtesy of Red Star Catering. &lt;a href=&quot;https://twitter.com/hashtag/coderetreat?src=hash&quot;&gt;#coderetreat&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/southstart?src=hash&quot;&gt;#southstart&lt;/a&gt; &lt;a href=&quot;https://t.co/I4NMOb2BYL&quot;&gt;pic.twitter.com/I4NMOb2BYL&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— reinteractive (@reinteractive) &lt;a href=&quot;https://twitter.com/reinteractive/status/789647500802084865&quot;&gt;October 22, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After lunch we did more of a ‘mob programming’ style session lead by another attendee &lt;a href=&quot;https://twitter.com/richiekhoo&quot;&gt;Richie&lt;/a&gt;. Still using the Game of Life problem, it was a great illustration of how important communication skills are, as we worked through coming to consensus on not only how we could approach the problem, but what were good names for things and what did those names actually mean (not surprising, considering naming is one of the &lt;a href=&quot;https://martinfowler.com/bliki/TwoHardThings.html&quot;&gt;two hard things in computer science&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/2016/10/wp_20161022_001%5b4%5d.jpg&quot; alt=&quot;Richie taking us through The Game of Life in Ruby&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Following that we did one more pairing session. This time each pair got to choose from a list of limitations. My partner had commented when we sat down together how much he appreciated his mouse and that was probably what prompted me to suggest we try the “only use your keyboard” challenge. We used Java in Eclipse and apart from an annoying splash screen that we had to resort to the mouse to make go away, we managed the rest of the session to stick to just typing. Not easy though.&lt;/p&gt;
&lt;p&gt;The day ended with a final group review. I really enjoyed the day, appreciated learning some new skills and practising some old ones, and getting to know a great bunch of people.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://david.gardiner.net.au/2016/08/ndc-sydneyday-3</id>
    <updated>2016-08-06T16:10:00.001+09:30</updated>
    <title>NDC Sydney–Day 3</title>
    <link href="https://david.gardiner.net.au/2016/08/ndc-sydneyday-3" rel="alternate" type="text/html" title="NDC Sydney–Day 3"/>
    <category term="Software Engineering"/>
    <category term=".NET"/>
    <category term="Conferences"/>
    <published>2016-08-06T16:10:00.001+09:30</published>
    <summary type="html">Friday, the final day of NDC Sydney.</summary>
    <content type="html">&lt;p&gt;Friday, the final day of &lt;a href=&quot;https://ndcsydney.com/&quot;&gt;NDC Sydney&lt;/a&gt;. I was rostered in Room 2 all day, so got to see these speakers/presentations:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Roslyn is &lt;a href=&quot;https://twitter.com/filip_woj&quot;&gt;@filip_woj&lt;/a&gt;&apos;s middle name &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/cUe4msM4Xr&quot;&gt;pic.twitter.com/cUe4msM4Xr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/761337453114294272&quot;&gt;August 4, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Micro services with &lt;a href=&quot;https://twitter.com/rachelreese&quot;&gt;@rachelreese&lt;/a&gt;. Did she fly here with &lt;a href=&quot;https://t.co/JycJa6pQXP&quot;&gt;https://t.co/JycJa6pQXP&lt;/a&gt; :-) &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/5Fk6Rribz4&quot;&gt;pic.twitter.com/5Fk6Rribz4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/761357605289594880&quot;&gt;August 5, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Micro services are the next big thing &lt;a href=&quot;https://twitter.com/samnewman&quot;&gt;@samnewman&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/xkW3DcoUbc&quot;&gt;pic.twitter.com/xkW3DcoUbc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/761407899134341120&quot;&gt;August 5, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This talk from &lt;a href=&quot;https://twitter.com/JamesNK&quot;&gt;@JamesNK&lt;/a&gt; could make a good serial &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/QYevNUNVDp&quot;&gt;pic.twitter.com/QYevNUNVDp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/761427510227677185&quot;&gt;August 5, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Me, me, me, me with &lt;a href=&quot;https://twitter.com/hhariri&quot;&gt;@hhariri&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/761447382496129025&quot;&gt;August 5, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And then a late flight home to Adelaide Friday night.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://david.gardiner.net.au/2016/08/ndc-sydneyday-2</id>
    <updated>2016-08-04T21:42:00.001+09:30</updated>
    <title>NDC Sydney–Day 2</title>
    <link href="https://david.gardiner.net.au/2016/08/ndc-sydneyday-2" rel="alternate" type="text/html" title="NDC Sydney–Day 2"/>
    <category term="Software Engineering"/>
    <category term=".NET"/>
    <category term="Conferences"/>
    <published>2016-08-04T21:42:00.001+09:30</published>
    <summary type="html">Thursday sees me spending rostered the entire day in room 1.</summary>
    <content type="html">&lt;p&gt;Thursday sees me spending rostered the entire day in room 1. This was actually my preference, as the majority of the talks were already on my wish list. One slightly ‘down’ side of doing room 1 is that the bigger crowds mean counting much larger numbers of eval votes after each session.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Watching &lt;a href=&quot;https://twitter.com/troyhunt&quot;&gt;@troyhunt&lt;/a&gt; getting his son to do all the hard work :-) &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/Nw6tXfcVsA&quot;&gt;pic.twitter.com/Nw6tXfcVsA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760994494648950784&quot;&gt;August 4, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Cloudy in Sydney, but no rain on &lt;a href=&quot;https://twitter.com/shanselman&quot;&gt;@shanselman&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/27yjcfrlCp&quot;&gt;pic.twitter.com/27yjcfrlCp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760996146005184513&quot;&gt;August 4, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Cloudy in Sydney, but no rain on &lt;a href=&quot;https://twitter.com/shanselman&quot;&gt;@shanselman&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/27yjcfrlCp&quot;&gt;pic.twitter.com/27yjcfrlCp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760996146005184513&quot;&gt;August 4, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Cloudy in Sydney, but no rain on &lt;a href=&quot;https://twitter.com/shanselman&quot;&gt;@shanselman&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/27yjcfrlCp&quot;&gt;pic.twitter.com/27yjcfrlCp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760996146005184513&quot;&gt;August 4, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Cloudy in Sydney, but no rain on &lt;a href=&quot;https://twitter.com/shanselman&quot;&gt;@shanselman&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/27yjcfrlCp&quot;&gt;pic.twitter.com/27yjcfrlCp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760996146005184513&quot;&gt;August 4, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;ES6 with &lt;a href=&quot;https://twitter.com/rob_rich&quot;&gt;@rob_rich&lt;/a&gt;. It is not 45 degrees C in Sydney today! &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/GjrNUPLY6a&quot;&gt;pic.twitter.com/GjrNUPLY6a&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/761086197024235527&quot;&gt;August 4, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;He&apos;s being frank, but isn&apos;t his name &lt;a href=&quot;https://twitter.com/shanselman&quot;&gt;@shanselman&lt;/a&gt; ? &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/zTO5LMLRDM&quot;&gt;pic.twitter.com/zTO5LMLRDM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/761106316840439808&quot;&gt;August 4, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The evening finished off with a hilarious talk from &lt;a href=&quot;https://mickens.seas.harvard.edu/wisdom/&quot;&gt;Assoc. Prof. James Mickens&lt;/a&gt;, followed by a social evening of food and drinks in the hotel bar – a good chance to meet and chat with other attendees.&lt;/p&gt;
&lt;p&gt;One more day to go!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://david.gardiner.net.au/2016/08/ndc-sydneyday-1</id>
    <updated>2016-08-04T21:18:00.000+09:30</updated>
    <title>NDC Sydney–Day 1</title>
    <link href="https://david.gardiner.net.au/2016/08/ndc-sydneyday-1" rel="alternate" type="text/html" title="NDC Sydney–Day 1"/>
    <category term="Software Engineering"/>
    <category term=".NET"/>
    <category term="Conferences"/>
    <published>2016-08-04T21:18:00.000+09:30</published>
    <summary type="html">The first full day started with Scott Hanselman’s keynote, then straight into sessions.</summary>
    <content type="html">
&lt;p&gt;The first full day started with Scott Hanselman’s keynote, then straight into sessions. I was rostered to look after room in the morning, with the afternoon free to attend other sessions.&lt;/p&gt;
&lt;p&gt;Here’s my photo tweet stream from the day:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; opening keynote with &lt;a href=&quot;https://twitter.com/shanselman&quot;&gt;@shanselman&lt;/a&gt; &lt;a href=&quot;https://t.co/Wkyl0HAMYx&quot;&gt;pic.twitter.com/Wkyl0HAMYx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760616175793426433&quot;&gt;August 2, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Omnisharp and Script C# with filip_woj at &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/12vuNTl82N&quot;&gt;pic.twitter.com/12vuNTl82N&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760644597479464960&quot;&gt;August 3, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Good to see &lt;a href=&quot;https://twitter.com/alexjmackey&quot;&gt;@alexjmackey&lt;/a&gt; is both performing and stable &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/26dhpsb2DX&quot;&gt;pic.twitter.com/26dhpsb2DX&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760652936514940928&quot;&gt;August 3, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&apos;t think &lt;a href=&quot;https://twitter.com/Aaronontheweb&quot;&gt;@Aaronontheweb&lt;/a&gt; is acting. Talking about &lt;a href=&quot;https://t.co/iR8Xop5OSH&quot;&gt;https://t.co/iR8Xop5OSH&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; :-) &lt;a href=&quot;https://t.co/O1H7BDvk6v&quot;&gt;pic.twitter.com/O1H7BDvk6v&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760688430112247808&quot;&gt;August 3, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Now &lt;a href=&quot;https://twitter.com/Aaronontheweb&quot;&gt;@Aaronontheweb&lt;/a&gt; is doing NBench presses &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/JJGxLBJQoX&quot;&gt;pic.twitter.com/JJGxLBJQoX&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760704456740728832&quot;&gt;August 3, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Automapped &lt;a href=&quot;https://twitter.com/jbogard&quot;&gt;@jbogard&lt;/a&gt; solidly into &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/XSjePDpToB&quot;&gt;pic.twitter.com/XSjePDpToB&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760723247885418497&quot;&gt;August 3, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Enter the &lt;a href=&quot;https://twitter.com/OdeToCode&quot;&gt;@OdeToCode&lt;/a&gt; dragon &lt;a href=&quot;https://twitter.com/hashtag/ndcsydney?src=hash&quot;&gt;#ndcsydney&lt;/a&gt; &lt;a href=&quot;https://t.co/g3y1af0fY7&quot;&gt;pic.twitter.com/g3y1af0fY7&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;— David Gardiner (@DavidRGardiner) &lt;a href=&quot;https://twitter.com/DavidRGardiner/status/760742629562720256&quot;&gt;August 3, 2016&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had a quiet night back in the hotel room, though many attendees went on a harbour cruise. It had been quite wet and rainy, so I didn’t mind missing out on that.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://david.gardiner.net.au/2016/07/the-changing-state-of-installers</id>
    <updated>2016-07-10T22:26:00.001+09:30</updated>
    <title>The changing state of installers</title>
    <link href="https://david.gardiner.net.au/2016/07/the-changing-state-of-installers" rel="alternate" type="text/html" title="The changing state of installers"/>
    <category term="Software Engineering"/>
    <published>2016-07-10T22:26:00.001+09:30</published>
    <summary type="html">I’ve begun to notice that there’s somewhat of a gradual move away from MSI-style installers.</summary>
    <content type="html">&lt;p&gt;I’ve begun to notice that there’s somewhat of a gradual move away from MSI-style installers. This is an interesting change considering for a number of years now I’ve been a keen proponent of creating an MSI to package up your software and drive the installation process during deployment.&lt;/p&gt;
&lt;p&gt;MSI (&lt;a href=&quot;https://learn.microsoft.com/windows/win32/msi/windows-installer-portal&quot;&gt;Windows Installer&lt;/a&gt; – previously Microsoft Installer) started life as the Office 2000 installer. Office was (and still is) quite a large and complex piece of software and I guess the development team realised they needed a slightly more reliable way to install all the bits in the right places.&lt;/p&gt;
&lt;p&gt;This then evolved into a more general-purpose installer technology and was finally built right in to Windows itself as the preferred way to install applications and services.&lt;/p&gt;
&lt;h2&gt;So what’s changed?&lt;/h2&gt;
&lt;p&gt;MSI is great if you just need to install a single instance of an application. It is possible to handle multiple instances – for example SQL Server. If you’ve ever installed SQL you’ll know that you can use the setup program to install multiple instance of SQL Server. I recently learned through &lt;a href=&quot;https://www.reddit.com/r/SQLServer/comments/4qgman/ama_microsoft_sql_server_tools_630/d4tfvny&quot;&gt;a question posed to a Reddit AMA&lt;/a&gt; that they use ‘Transforms’ for this. It is possible, but not super easy.&lt;/p&gt;
&lt;p&gt;Then there’s Nano – &lt;a href=&quot;https://blogs.technet.microsoft.com/nanoserver/&quot;&gt;Nano Server&lt;/a&gt; to be precise. This is the new super cut-down, minimalist edition of Windows Server, and one of the things that has been left out to keep it as lean as possible is MSI support. To build software for Nano, you’ll be packaging it up in an ‘appx’ file (essentially the same package used for Windows 8/10 UWP).&lt;/p&gt;
&lt;h2&gt;So who’s changed?&lt;/h2&gt;
&lt;p&gt;I noticed that JetBrains went to a non-MSI installer with their ReSharper 9.x release. They were already using NuGet packages for managing extensions. I think they’ve kind of gone the whole way with their installer now.&lt;/p&gt;
&lt;p&gt;It also appears that Visual Studio “15” (not to be confused with the current 2015 release which is version 14) is moving to a non-MSI installer as part of reducing the install process.&lt;/p&gt;
&lt;p&gt;ASP.NET for a while now has had the ‘msdeploy’ packaging. It’s what is used when you choose ‘Publish’ from the context menu in Visual Studio.&lt;/p&gt;
&lt;h2&gt;So what now?&lt;/h2&gt;
&lt;p&gt;MSI still has a role, especially for traditional server deployments, but if you want to support deployments to Nano then you’ll need to look at appx. If you have a desktop app that you’d like to feature in the Windows Store, then appx is also a requirement.&lt;/p&gt;
&lt;p&gt;There’s currently a couple of options if you want to move towards appx deployments:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/windows/msix/packaging-tool/tool-overview&quot;&gt;Project Centennial&lt;/a&gt; – aka the Desktop Converter for Win32 or .NET 4.6.1 apps. This is currently in preview (and requires that you run on a preview release of Windows 10).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.firegiant.com/heatwave/build-tools/msix/&quot;&gt;WiX AppX Extension&lt;/a&gt; – a commercial product created by some of the main WiX developers that lets you leverage your existing WiX projects to produce an Appx package.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://david.gardiner.net.au/2016/05/analysing-net-code-dependenciesvisual</id>
    <updated>2016-05-12T20:12:00.001+09:30</updated>
    <title>Analysing .NET code dependencies–Visual Studio Code Maps</title>
    <link href="https://david.gardiner.net.au/2016/05/analysing-net-code-dependenciesvisual" rel="alternate" type="text/html" title="Analysing .NET code dependencies–Visual Studio Code Maps"/>
    <category term="Software Engineering"/>
    <category term=".NET"/>
    <published>2016-05-12T20:12:00.001+09:30</published>
    <summary type="html">This is the second in a series of posts on reviewing tools to help analyse code dependencies in .NET</summary>
    <content type="html">&lt;p&gt;This is the second in a &lt;a href=&quot;/2016/04/analysing-net-code-dependenciesoverview&quot;&gt;series of posts&lt;/a&gt; on reviewing tools to help analyse code dependencies in .NET&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/previous-versions/visualstudio/visual-studio-2015/modeling/map-dependencies-across-your-solutions?view=vs-2015&quot;&gt;Code Maps&lt;/a&gt; is a feature that was first included in Visual Studio 2012 Ultimate. It remains an &lt;a href=&quot;https://visualstudio.microsoft.com/vs/compare/&quot;&gt;Enterprise-only feature in 2015&lt;/a&gt;, though Professional and Community editions can view previously created diagrams.&lt;/p&gt;
&lt;p&gt;Code Maps operate from the cross-project solution level right down to the method level.&lt;/p&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
&lt;p&gt;To generate a map of project dependencies, go to the &lt;strong&gt;Architecture&lt;/strong&gt; menu, and choose &lt;strong&gt;Generate Code Map for Solution&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A new window opens and gradually items appear on the diagram. Usually this will trigger a build of the solution, and then the analysis process will run, eventually displaying the dependencies between the projects.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://david.gardiner.net.au/_astro/code-maps---solution5.KGm5gCrp_Z1H03bv.webp&quot; alt=&quot;Code Maps - Solution&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If your solution uses solution folders to group similar projects, then you’ll see that represented in the diagram (the OLW solution doesn’t currently do this).&lt;/p&gt;
&lt;p&gt;You can then expand this out by selecting all the nodes (Ctrl-A) and choosing &lt;strong&gt;Group&lt;/strong&gt;, &lt;strong&gt;Expand&lt;/strong&gt; from the context menu.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://david.gardiner.net.au/_astro/code-maps---solution-expanded-with-e._j27-voX_1aubq1.webp&quot; alt=&quot;Code Maps - Solution expanded with externals highlighted&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can see two things – the OpenLiveWriter.PostEditor project seems to be the most significant project, and also there’s an ‘Externals’ block with all external assembly references. To just focus on strictly code from the solution, you can select this group and press Delete. This removes it from the diagram.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Editing a Code Map diagram doesn’t mess with your source code, as the diagrams are a bit like a snapshot of your code at the time they were created. In some ways this is a limitation, but one positive aspect is that you can use Code Map diagrams to model or prototype changes to the class hierarchy and dependencies without having to commit those changes in code.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Let’s focus in on the PostEditor project. If we select that node, we can choose &lt;strong&gt;New Graph&lt;/strong&gt; from the context menu. A separate diagram is now displayed with just the contents of the previously selected node. You can use the &lt;strong&gt;Filters&lt;/strong&gt; tool window to select which elements you want to display. I de-selected &lt;strong&gt;Assembly&lt;/strong&gt; so that I can now focus on the namespaces.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/2016/05/code-maps---htmleditor-assembly-clas%5b1%5d.png&quot; alt=&quot;Code Maps - HtmlEditor assembly classes&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Let’s keep going further in. Select the OpenLiveWriter.PostEditor namespace, and open this in a new graph again. To drill down to the class level, select all nodes again (Ctrl-A) and choose &lt;strong&gt;Group&lt;/strong&gt;, &lt;strong&gt;Expand&lt;/strong&gt; again.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../assets/2016/05/code-maps---openlivewriter.htmledito%5b1%5d.png&quot; alt=&quot;Code Maps - OpenLiveWriter.HtmlEditor namespace classes&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Let’s click on that top node – BlogPostEditingManager. Repeating the same process again, and filtering down to just methods, we get the following:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://david.gardiner.net.au/_astro/code-maps---blogposteditingmanager-m.Cl909C_I_20yyMG.webp&quot; alt=&quot;Code Maps - BlogPostEditingManager Methods&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We now have a call graph of the methods inside the class. I also changed the layout for this graph to be ‘left to right’. The two blue nodes represent classes defined inside this class.&lt;/p&gt;
&lt;p&gt;Usually, you’d expect to see public methods on the left, and non-public methods going to the right. Unfortunately there’s no way distinguish between them apart from hovering over a node and reading the tooltip that appears, or by selecting a node and reviewing the details in the Properties window.&lt;/p&gt;
&lt;h2&gt;Debugging&lt;/h2&gt;
&lt;p&gt;You can also display Code Maps while debugging. If you have stopped at a breakpoint, you can right-click and select Show Call Stack on Code Map.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://david.gardiner.net.au/_astro/code-maps---call-stack5.DxGorxZR_1jQlpf.webp&quot; alt=&quot;Code Maps - Call stack&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Basically just a different way see the same info that gets displayed in the Call Stack debugging window, and unless I’ve missed something obvious, I think I’ll stick with the latter.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;That’s a quick overview of some of the things that Code Maps can show you. They are entirely visual, so unlike &lt;a href=&quot;http://www.ndepend.com&quot;&gt;NDepend&lt;/a&gt;, there’s no way to do any custom querying out of the box. On the other hand, the fact that the diagrams use &lt;a href=&quot;https://learn.microsoft.com/previous-versions/visualstudio/visual-studio-2015/modeling/directed-graph-markup-language-dgml-reference?view=vs-2015&quot;&gt;DGML&lt;/a&gt; (directed graph markup language), it would be possible to write code that queried the file directly.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://david.gardiner.net.au/2016/04/analysing-net-code-dependenciesoverview</id>
    <updated>2016-04-29T07:38:00.000+09:30</updated>
    <title>Analysing .NET code dependencies–Overview</title>
    <link href="https://david.gardiner.net.au/2016/04/analysing-net-code-dependenciesoverview" rel="alternate" type="text/html" title="Analysing .NET code dependencies–Overview"/>
    <category term="Software Engineering"/>
    <category term=".NET"/>
    <published>2016-04-29T07:38:00.000+09:30</published>
    <summary type="html">How can you tell if modules/components in your application are loosely-coupled between each other, and tightly cohesive internally?</summary>
    <content type="html">&lt;p&gt;How can you tell if modules/components in your application are &lt;a href=&quot;https://en.wikipedia.org/wiki/Coupling_%28computer_programming%29&quot;&gt;loosely-coupled&lt;/a&gt; between each other, and &lt;a href=&quot;https://en.wikipedia.org/wiki/Cohesion_%28computer_science%29&quot;&gt;tightly cohesive&lt;/a&gt; internally? You could read the code line-by-line, but that becomes difficult once the codebase becomes large.&lt;/p&gt;
&lt;p&gt;It can be very valuable to be able to visualise the the dependencies between the various components that make up your application – both at the class and module/assembly level. These tools analyse code, either by parsing the source code, or by analysing the compiled assemblies to produce various summaries and reports about the state of the code.&lt;/p&gt;
&lt;p&gt;I’m planning to spend a bit of time in future blog posts reviewing a number of these tools that can help with this analysis, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ndepend.com/&quot;&gt;NDepend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/previous-versions/visualstudio/visual-studio-2015/modeling/map-dependencies-across-your-solutions?view=vs-2015&quot;&gt;Visual Studio Code Maps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jetbrains.com/help/resharper/Exploring_Type_Dependency_Graph.html&quot;&gt;ReSharper Type Dependency Diagrams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jetbrains.com/help/resharper/Architecture__Project_Dependencies_Exploration.html&quot;&gt;ReSharper Architecture Graphs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m also interested to hear what you use. Let me know in the comments of your experiences with these or other tools I haven’t mentioned.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <id>https://david.gardiner.net.au/2016/03/how-i-first-heard-about-lean</id>
    <updated>2016-03-15T20:54:00.001+10:30</updated>
    <title>How I first heard about Lean</title>
    <link href="https://david.gardiner.net.au/2016/03/how-i-first-heard-about-lean" rel="alternate" type="text/html" title="How I first heard about Lean"/>
    <category term="Software Engineering"/>
    <published>2016-03-15T20:54:00.001+10:30</published>
    <summary type="html">A quick shout-out to Flinders Medical Centre’s Redesigning Care.</summary>
    <content type="html">&lt;p&gt;A quick shout-out to Flinders Medical Centre’s &lt;a href=&quot;https://www.sahealth.sa.gov.au/wps/wcm/connect/public+content/sa+health+internet/services/hospitals/flinders+medical+centre&quot;&gt;Redesigning Care&lt;/a&gt;. They implemented &lt;a href=&quot;https://en.wikipedia.org/wiki/Lean_manufacturing&quot;&gt;Lean&lt;/a&gt; a few years ago to improve how their hospital functioned. After hearing about what Lean was and what they were doing, I then discovered that Lean had been applied to developing software too.&lt;/p&gt;
&lt;p&gt;If you’re interested in learning more about Lean in a healthcare setting, contact them &lt;a href=&quot;https://www.sahealth.sa.gov.au/wps/wcm/connect/public+content/sa+health+internet/services/hospitals/flinders+medical+centre&quot;&gt;via their webpage&lt;/a&gt;, or check out their overview video on YouTube&lt;/p&gt;
</content>
  </entry>
</feed>
