Just over a year ago, I unveiled our Parallel and Async C# 5 course. It was immediately popular, and I’ve been enjoying teaching it at a number of locations. Today, I’m happy to announce another addition to our .Net offerings – and it’s something a little different to any of our courses so far.
Our existing .Net courses have focused on the C# language, a particular theme (such as TDD or parallelism/asynchorny), or a particular framework (such ASP.NET MVC or WPF). However, there is much more to being an effective developer than knowing tools, frameworks, and languages.
In our day to day development, we have to make all kinds of choices and trade-offs. While the decisions we make may each be fairly small, together they have a large impact on the quality of the software we produce. Large systems stay maintainable mostly through boundaries and abstractions being respected – but this respect is only possible when we can trust what lies beneath an abstraction. And that trust is gained through the code behind an abstraction making all of the little choices correctly, delivering consistent and predictable behavior.
Making good design choices is challenging. Let’s start at the bottom of the stack and work our way up to see some of the reasons why.
- Modern hardware is complicated, and has non-obvious performance behavior both in terms of instruction execution and memory access
- The CLR is not a simple, naive executor of bytecode. For one, the JIT compiler does some potentially surprising things. But more importantly, garbage collection is neither free nor magical, and there are ways it can bite you – not only in hot-path algorithmic code, but also in typical server applications.
- Everyone knows List<T> – but is it always the best choice? When is LinkedList<T>, Queue<T>, Stack<T>, BitArray, or even just a plain old Array, a better choice? How do we use dictionaries well? What are trees and graphs good for? What do those O(…) things in the MSDN actually mean? There’s plenty to know about picking good data structures.
- C# supports object-oriented programming. But much OO code written in C# sucks: it’s full of Manager or Service classes, the only pretense at encapsulation is the use of properties rather than fields, and attempts to test it mostly seem to result in wasting a lot of time updating tests on every refactor. This is not how OO should be, but to do better needs us to re-consider what OO even is. Spoiler: it’s not really about objects!
- We hear plenty about “mutable” and “immutable” – but deciding between them can be tricky. Heck, how do we even apply the ideas of immutable data when we know things in the real world change?
- We often hear that “extensible” or “composable” designs are desirable – but rarely discuss what the two words might mean. When do we pick inheritance, interface implementation, or take a Linq-esque monoid-y approach?
- Time comes into a lot of business domains, but time is gnarly. Humans are wonderfully imprecise about dates and times in almost all their day to day interactions on the subject, relying on context to resolve the ambiguities. Computers lack that context – and sadly the .Net DateTime classes don’t do a great job of making that clear.
Our new Day to day design for .Net programmers course takes on all of these issues – and more. It aims to fill in a bunch of common knowledge gaps and shed some light on a number of areas that are typically under-discussed – thereby helping developers produce better-considered software.
As for prerequisites for this course, we believe anyone who has handled our Intermediate C# course (or has equivalent skills) will be in a good place to take it. Mostly, our requirement is that participants have a good working knowledge of modern C# (that is, including generics, lambdas, and Linq) – since the point of the course is not about learning the C# language, but rather about designing good programs that take C# and the CLR into account. This choice of prerequisite also indicates that we don’t consider this a hugely advanced course; senior developers with a good computer science background and a bunch of years experience may only find so much new. As always, please take the time to read the topic outline, to decide if the course is right for you.
I’ll be sharing the teaching of this course with other Edumenters, who have contributed in various ways to its development. We look forward to getting this new course “on the road!”
Here’s the abstract and how to book the course; as usual, there will be classroom sessions or you can have it at your company.
- Det ger en tydlig riktning för att säkerställa att IT-investeringar stödjer verksamheten
- Det är ett effektivt sätt att hantera förändringar
- Det skapar värde för verksamheten i linje med företagets mål
- Och det adresserar hela livscykeln för IT-investeringar
What is an Event Store?
It is a database for supporting the concept of Event Sourcing. Event Store stores your data as a series of immutable events over time, making it easy to build event-sourced applications.
Projections allow you to react to events as they are written, and to create new events when interesting combinations occur. You can use the same model for writing temporal correlation queries that run over historical data and on into the future.
Event Store Workshop
If you want to learn more about Event Store, we are hosting a workshop in Malmö 2-3 October. During this two-day workshop Greg Young will teach how to use the Event Store as a stream database, both by using the native Atom-based API and .NET client API.
To find booking and more information, see our event Event Store Workshop with Greg Young
The C# Master Class has been one of our most popular and well-rated courses ever since its advent almost 3 years ago. In that time it has seen a number of tweaks in response to feedback, along with a more serious update when C# 5 was released.
By now, I’ve done dozens of deliveries of the C# Master Class, and it has reached hundreds of developers. It’s been a great journey so far, and it has been especially rewarding to meet some course attendees a few months down the line and hear how the course helped. C# has grown into a larger and richer language than it once was. Some wonder if we really need all these features, but I strongly believe the sum of the features is greater than the features individually, and it’s been wonderful to have an opportunity to share that perspective with so many.
Equally, I’ve been growing and learning too. One of the nice things about working at Edument is that it’s simply OK to spend time learning new things. And after 3 years of the C# Master Class, I felt it was time to incorporate some of that learning back into it. Therefore, this summer, I’ve invested a bunch of time into improving the course. Of note, the OO coverage is now a lot deeper and richer, the parallelism section has been streamlined and refocused, and there’s an awesome new walk-through on implementing the event aggregator pattern from scratch by effectively fusing higher order programming, generic programming, and reflective programming.
There’s one other change I’d like to take a moment to mention. To date, I’ve been the only teacher for the C# Master Class. As our range of courses has grown, along with demand for consulting and mentoring, scheduling enough C# Master Class deliveries to meet demand has become challening. Happily, this summer the course has gained a second teacher. Edument’s Eric Lavesson has been working with me on the course updates, and will now also be teaching the class. Eric has great taste in code, and I know he’ll do a great job of teaching this course. All the same, I’m excited about the latest changes too, and look forward to my next chance to deliver a C# Master Class with them!
By the way, for those who took the C# Master Class and are looking to go further, don’t miss our Parallel and Asynchronous C# 5 course! I’ve had a lot of fun teaching it so far all over Sweden – from Malmö to Skellefteå – and we’ll be offering it some more times this autumn. It’s also available through our partner Glasspaper in Norway too – or anywhere in the world you want it, direct from Edument.
Brendan Eich did just that, in 1995. He put this weird Java-Scheme-Self-HyperCard hybrid of his into browsers, and now all the king’s horses and all the king’s men can’t take it out again. I’m not saying Eich is an evil overlord; I’m saying if he were, this would have been a very clever move indeed on his part. Witness me clapping slowly.
Three stages of grief
- Learn the language extremely well, so we can use it well.
- Improve the language step by step (without breaking anything).
- Wrap the language in a nicer language and use that instead.
Option 2 is also underway, and seems to be picking up speed. Not only do we have a mostly-complete transition to EcmaScript 5 behind us, but EcmaScript 6 is looking good and more stable every day. Sometimes when the weather is just right, you even hear soft whispers of EcmaScript 7 in the wind. Evergreen browsers are becoming more common and help speed up adoption of newer features. All in all, given that we’re stuck with this language, it feels like we’re doing a very decent job of fixing it.
Option 3… now there’s a Cambrian explosion for you.
On that list, you’ll find existing languages, original languages, languages with interesting ideas, and languages that won’t ever have 10 simultaneous users. There are behemoths like CoffeeScript and GWT on there. Even Perl 6 is on that list. It’s a long list.
Everyone is helping. The people from option 1 have shown us, across the years, how to emulate classes and interfaces and modules, how to fake it without strong typing, and how to hack the DOM in various ways to emulate features. The result is a lot of so-called “boilerplate” code: a lot of code with a low oomph-per-character ratio. You’re not paid to like it, you’re paid to make it work across all browsers, kiddo.
A bit more in detail:
Try it now
Several Edumenters attended Build Stuff 2013, and two of us gave talks. All of them were recorded by InfoQ, and they’re now starting to appear online! The first one to appear is my invokedynamic talk. The invokedynamic instruction was introduced in JDK7, and was aimed at helping compiler developers targeting the JVM to more efficiently implement a wide range of language features. While the name suggests a role mainly for the things we like to call dynamic languages, invokedynamic has in fact been used as part of implementing lambda expressions in Java 8.
My own application of invokedynamic was implementing JVM support for the Rakudo Perl 6 compiler. While the talk is not just about that – it covers invokedynamic in a much more general sense – I was able to draw on my concrete experiences of using it, which is something I always like to be able to do in a presentation. Also it was nice to do a talk on compiler-related things – an area I greatly enjoy working in.