Except, rather than just talking about the IDE and telling us about its features (as awesome as those features might be!) - he instead delved a lot deeper into the architecture and problems they faced when building it. We all know and love their ReSharper product, which of course is a Visual Studio extension. Matt's talk discussed the problem of taking ReSharper out of Visual Studio so that Rider can hook into all that awesome functionality.
With ReSharper just being a Visual Studio extension sitting in-process, it's very tied to Visual Studio's various constraints - eg. virtual memory, 32bit-ness, etc. It also means that it can't be anything more than just being a Visual Studio extension.
Their solution was to make ReSharper a headless language server that sits outside of Visual Studio, and acts as the brains. This then allows other user interfaces (eg. Rider) to utilize all of ReSharper's loveliness.
Then there's the problem of how do they build the Rider IDE itself? One of the core requirements is of course that it's cross platform. Well, as Matt rightly pointed out - they're Jetbrains! They build IDE's for breakfast! The obvious choice of course was to build ontop of their existing IntelliJ Platform, which incidentally anyone can use to build an IDE themselves!
So they had a plan for the user-interface and to use R# as a headless language engine - so how about communicating between the two? Matt discussed their various options - JSON, Protobuf, etc. They even added Protobuf support (you may have seen this appear in R# because of them trying it). However, they instead decided to go with their own protocol using plain sockets.
Matt explained how they went with the MVVM pattern so that there was a view model in the middle of IntelliJ and the headless Resharper. This meant that a lot less boilerplate code was required, and they didn't need to concern themselves with every little RPC call, requiring request and response models, etc, etc. They just need to change data in the view-model, and the other side can reactively respond to that change. This is bi-directional - so for example, if a user loads a C# file into Rider, the file will get added to the view-model, then Resharper will pick this up, process the file, and update the view-model with various inspection information - eg. errors or warnings, etc. Then the UI can pick those up and display them in the IDE accordingly. All of this is done in a very re-active way - similar to how Rx works using observables, except that they wrote their own implementation. Matt shows examples of their interfaces and explains how the publish and subscribe works, and also goes into how the lifetime is managed.
I'm sure most people reading this have been hearing a lot about Kotlin lately. If not, it's Jetbrain's new programming language built on-top of the JVM. Matt explains how they use Kotlin to create their DSL (Domain Specific Language), which can then be compiled and used by each side (ie. IntelliJ and Resharper). He then goes onto showing the Kotlin language and explaining some fundamentals, and also showed some example bits of their code to add a bit of context.
Finally, he wrapped up explaining some of the challenges they faced - eg. duplicate language implementations that are in both IntelliJ and R# already (CSS, C++, etc). Also, plugins - these have of course now become more complicated - as if the plugin involves both UI and R# stuff - authors will have to write both sides.
A really great talk, going quite deep into code, which is of course what we all love! I was very impressed with Matt - he did a fantastic job!
As usual, our amazing sponsors Corriculo Recruitment were on hand being awesome as usual! This time they made it a themed beer night, and decided to go with Dutch beers! They put a poll on Twitter asking which Dutch beers people preferred, and Heineken won by just one percent! Do remember to get in touch with them if you have any ideas for different beer themes for upcoming events! I know they're definitely looking for feedback and ideas on this. On-top of this, they also covered the venue cost as usual, and did a great job making everyone feel very welcome on the night.
Our secondary sponsor is my own company, Everstack Ltd, providing software development and consultation services. Whilst, we can't take on more work at the moment, I'm always happy to discuss future requirements and to network with both like-minded individuals and other companies.
As usual, the event started with my intro talk where I went through the news and did the prize draws (see below). I also discussed my past disappointment with the low quality of pictures that we had from past events: I'd been taking photos with my mobile phone, and it was in a low-light environment - so the pictures weren't great! So to resolve this, I (or more accuracy, my company Everstack as a sponsor) invested in a new Digital SLR camera for these events. So I was really looking forward to coming out of this event with a lot of very high quality shots!
Before the purchase I knew nothing about DSLR cameras - so I did quite a bit of reading before-hand so that I felt I had a good understanding of aperture, shutter speed, and ISO. However, it turns out that reading wasn't enough, and I need more experience actually practicing with the camera! When I got home afterwards and looked at the photos on my laptop, most of the photos where either too dark, or quite blurry. So that was obviously very disappointing. I think next time, I'm going to try and get a tripod so that I can slow down the shutter speed and let in more light without the risk of handshake.
As usual, we covered a few key news picks as part of the the intro talk ...
This first one was perfectly timed and obviously very appropriate to the meetup's topic that night! A week before the meetup, Jetbrains announced that their Rider IDE hit RTM ...
I deliberately didn't go into too much detail, as obviously Matt was about to spending an hour or so talking about Rider. It certainly felt a very well timed announcement though!
Another recent announcement was Azure Container Instances. This basically allows you to spin up containers in Azure without having to worry, or even think about, infrastructure.
Running Docker locally is easy, but running containers in the cloud is more involved. For larger applications, you need to think about orchestrators and tools like Kubernetes, DC/OS, or Docker Swarm - and / or managing your own VMs. With Azure Container Instances, you can now just spin up a container, just like you'd spin up an app service.
It's that easy to do, I decided to demo spinning one up from the command line. This really showed me the ultimate power that the demo gods actually possess! I did this numerous times from home, and also showed it working to Matt before the event started, it all worked fine! Then during the intro talk itself, the container span up, but nothing in the browser window! I had decided use a Neo4j Docker image, and view the Neo4j Browser - so in fairness, it might have been something related to the Neo4j image itself, rather than Azure Container Instances - but STILL!
If anyone's interested in trying it for themselves, here are the commands I used to demo it ...
az container create -g AzureContainerInstancesTest --name neo4j --image neo4j --ip-address public --port 7474
az container show --name neo4j --resource-group AzureContainerInstancesTest
az container delete --name neo4j --resource-group AzureContainerInstancesTest
Even trying it now as I type this - it works perfectly! Thank you demo gods! :-/
The next news item is a big one! Both .NET Standard and Core 2.0 were announced as being final!
Now that .NET is pretty much everywhere, dependency compatibility headaches that we've all seen in the past have the potential to get so much worse! So the introduction of the .NET Standard has come at the perfect time. This past year, we've had the 1.x versions, but there's still been lots of issues as they didn't cover enough of the .NET APIs. Version 2 promises a much higher API coverage - even allowing you to use older full-framework libraries when targeting .NET Core!!
The last news section item was about a couple of upcoming conferences ...
First there's DDD East Anglia on the 16th September. The Developer Developer Developer conferences tend to always be on a Saturday so as to not conflict with people's work schedules, and they're also always FREE! I'm most certainly going to be there, and it would be very cool if we can get quite a strong .NET Oxford presence there!
The second is the PROG .NET conference, which is a 3 day conference from the 13th to the 15th September. This isn't free, but they have given us a 20% discount code to our members (
OXFORD_PROGNET_20). This one has some really big names, including the .NET Rocks guys (Carl Franklin and Richard Campbell), Jon Skeet, Jon Galloway, and many more!
I actually made a bit of a boo-boo when doing the prize draws! The WPF prize-draw app I wrote that we use downloads a list of all the RSVPs and profile images from Meetup.com using their Meetup.com API. The current
event-id is a setting, which I completely forgot to update after last month's meetup! It was only halfway through the giveaways, that the mistake was realised as someone queried why they weren't in the list! This was easily resolvable by updating the event-id and doing the draw again. This did however mean that a couple of the prizes were doubled up. We obviously had to honour the winners from before the mistake was realized. I was going to cover this mistake myself, but luckily Manning very kindly said they'd give both of the ebooks, so it all worked out in the end!
Remember that we have our special Manning coupon code (ug367) which gives all of our members a 36% discount on any of their e-books!
At each of our meetups we try and be in a position to also announce the next meetup. This time, whilst we're not in a position to announce our September event, we actually jumped ahead and announced our October meetup! We are very pleased to be having Christos Matskas who will be telling us all about going Serverless using Azure Functions and Azure Logic Apps! This will be on the 24th October, and you can RSVP on our Meetup event page. Hopefully we'll be in a position to announce the September event soon!