Leaving Microsoft…

reseting Microsoft PC

Last Friday, September 13th was my last day at Microsoft. Coincidence was that it was Programmers’ Day = 256th day of the year 🙂

It’s been awesome 5 years! I helped to ship the new Azure Portal, turned hackathon project into Microsoft product announced at //build keynote, helped SeeingAI with a few features, and for last two years helped to grow Azure Search. When I joined the team it was a startup. Now, it’s a mature Azure Service. Along with my everyday job I had awesome opportunities to speak at conferences and meetups around the World about my work. During my time at Microsoft I delivered almost 30 technical talks!

Along that journey I met a lot of awesome and inspirational people. Thanks to them my job was my passion. I was very lucky to have awesome bosses. I want to thank Andrew Birck, Ian Carbaugh, Madhur Joshi, Janusz Lembicz and Pablo Castro for everything they did for me. If you end up working for them, consider yourself very lucky!

Special thanks to Steve Sanderson, Scott Hanselman and Scott Guthrie! Their technical talks made me want to join Microsoft, when I was still in college!

Stay tuned for what’s next!


Azure Search on Azure Friday

Once again I had a pleasure to join Scott Hanselman on Azure Friday. In the past we did a video about Azure Mobile App. This time we talked about Azure Search.

Azure Friday is very casual. You just walk in, and chat with Scott. It just happen to be recorded 😀

In this week’s episode we did a quick overview of Azure Search capabilities. Service, on which, I was working on for last two years.

01:00 – Creating a search index
02:37 – AzSearch.js – Automagical UI and sample React controls
03:27 – Searching the JFK Files
08:00 – Adding search to Scott’s blog

You can deploy JFK Files by yourself. More info in our JFK Files github repo.

Check out AzSearch.js to generate website to search your index!

This is just tip of the iceberg! Check our docs for more! You can start today by creating your first search service. We allow one free service per subscription!


Solution for missing battery icon on Surface Book running Windows 10

Recently I got a Surface Book 2. From the beginning, my battery icon was missing, and I spent hours researching how to fix it. I didn’t even have battery show up in device manager.

To save you hours, here is the solution:

  1. Go to device manager
  2. View -> show hidden devices
    Missing battery icon on Surface Book
  3. Uninstall Surface Serial Hub Driver:
    Missing Battery Icon on Surface Book - uninstall Surface Serial Hub Driver
  4. uninstall all other devices that have warnings*
  5. reboot and wait a few minutes for missing drivers to get reinstalled

(*) – I am not 100% sure step 4 is required, but it won’t hurt and it may help.

After that you should get your battery status back:

Surface Book - battery status

It should also be visible in device manager now:

Surface Book device manager - battery status

 


Domain-Driven Design – tl;dr

Domain Driven Design

After hearing about Aggregates and Bounded Contexts over, and over again, I decided to check out what Domain-Driven Design is all about. There is a ton of DDD resources on the Internet, but this blog post is for my personal reference. I am publishing it so I can google it, and maybe you find it useful as well. This post is about what DDD is, and how it can help you to write better code.

What is DDD?

According to Wikipedia:

Domain-driven design (DDD) is an approach to software development for complex needs by connecting the implementation to an evolving model. The premise of domain-driven design is the following:

  1. placing the project’s primary focus on the core domain and domain logic;
  2. basing complex designs on a model of the domain;
  3. initiating a creative collaboration between technical and domain experts to iteratively refine a conceptual model that addresses particular domain problems.

More pragmatic (and ignorant) definition: DDD is software development approach that focus on business processes over implementation details. This allows developers to work with business people more effectively. It also makes code more maintainable and extendable.

Most important DDD terms (buzzwords):

  • Ubiquitous Language – using business terms for naming classes, methods and variables
  • Domain – functionality of the system
  • Bounded Context – components used to deliver a functionality (AKA domains)
  • Value Object – simple, immutable class representing some business term
  • Entity – class with unique identifier, usually used to represent persistent data
  • Aggregate – group of entities
  • Repository – class used to save and retrieve aggregate (AKA save/retrieve data to/from database)
  • Application Service – your Domain(s) communication layer
  • Anti-corruption layer – layer for interaction with external (or legacy) system
  • CQRS (Command Query Responsibility Segregation) – separates querying for data from modifying data
  • Event Sourcing – storing changes to application state as a list of events, which allows to invoke and process events in producer/consumer fashion

Resources to learn about Domain-Driven Design

There are two DDD bibles: Blue Book and Red Book. I’ve been told to do not read Blue Book as first introduction to DDD, because it’s very “heavy” and hard to understand. People were right. I would also add: it’s not very well written (shoot me for criticizing DDD God AKA Eric Evans).

List of recommended resources, sorted in order that I would recommend to follow if you are new to DDD. I strongly recommend positions in bold!

Notice that I placed Blue Book at the end. It’s hard to absorb. It also suffers from low knowledge/pages ratio.

There is also Domain-Driven Design path on Pluralsight that has nice set of courses around DDD and software design.

My thoughts on DDD

Before diving into DDD I was expecting to learn about something new and revolutionary. After reading about Ubiquitous Language, Aggregates and Bounded Context I still didn’t see much difference between DDD and good, SOLID software design. It feels like DDD is mostly about good object-oriented design presented in particular, formalized way with specific buzzwords (aggregate, bounded context, etc.). In Uncle Bob’s Agile Principles, Patterns, and Practices in C#, there is the Payroll Case Study example that is following clean code, good design and implementation practices. If you were put that example into DDD book…it would fit. If you take examples from DDD books and put it into Uncle Bob’s book…it would fit fine as well.

There are however, some new concepts introduced by DDD. Such as Repository pattern, CQRS or Event Sourcing. Are last two actually DDD? Or they are just related to DDD?

DDD is also enforcing designing system around business domain, not around, e.g. database. That is usually a case when designing architecture from scratch quickly. As 99% of apps are CRUDs, ending up with database driven architectures would be natural. You usually start with file->new project, and go from there. This is not a problem for small apps, but might strike later when evolving the app. DDD solves that problem.

If you are familiar with Clean Code and SOLID design as presented in Agile Principles, Patterns, and Practices in C# then DDD does not bring much new concepts to the table. It may make you think more from a business perspective, and consider using new patterns (Repository pattern, CQRS or Event Sourcing) though.

It’s worth to notice that even if you look at Domain-Driven Design path on Pluralsight, there are non-DDD courses about good/clean design as part of the path. Thus, good design is prerequisite of DDD. On top of that we have mentioned earlier buzzwords, CQRS and Event Sourcing.

Going back to DDD terms (AKA buzzwords), they could be also summarized as follows:

  • Ubiquitous Language – use meaningful names for classes, methods and variables
  • Domain – be aware what problem you are solving
  • Bounded Context – group objects that depends on each other
  • Value Object – simple, immutable class
  • Entity – class with unique identifier, usually used to represent persistent data
  • Aggregate – group of related entities
  • Repository – facade over your persistence layer to make it implementation agnostic
  • Application Service – your system’s API
  • Anti-corruption layer – layer for interaction with external system
  • CQRS (Command Query Responsibility Segregation) – separates querying for data and modifying data
  • Event Sourcing – storing changes to application state as a list of events, which allows to invoke and process events in producer/consumer fashion

What DDD enforces from the beginning is layered architecture that may not always be needed. Should you follow DDD in your projects? The answer is, as always, “it depends”. There are some good ideas there, but being over obsessed with favoring DDD in your design decisions over pragmatism will lead to over-engineering.

After TDD and BDD there is DDD. Should you use DDD in all your projects? No. It’s just a way to design software. Also: using DDD does not mean that you need to use all patterns from Blue Book and Red Book.

It seems like DDD should definitely help in long term, but over-engineering (with CQRS and Event Sourcing) may unnecessary complicate things. Actually, I should say: writing SOLID code would help you…and here we are again: is DDD really something different than just good software design?


Building Cloud Search as a Service with AI

AI Search

It’s been almost a year since I joined Azure Search team. A lot has changed since then. I joined right after team doubled by merge with Text Analytics team with a mission to add intelligence to search. A few months later entire Cognitive Services (Azure Machine Learning APIs) platform team joined us. Then we hired additional developers to build scalable platform for both Cognitive Services and Azure Search. After that we also got a team of data scientists who are building the actual machine learning models. Now, as the Applied AI team, we are in the center of AI and Cloud at Microsoft.

Azure Search is a search-as-a-service cloud solution that gives developers APIs and tools for adding a rich search experience in web and mobile applications. You get for free things like autocomplete, suggestions, synonyms, results highlighting, facets, filters, sorting and paging. Functionality is exposed through REST API or .NET SDK. The biggest pain, which is infrastructure and availability are managed by us.

While having all of that, we also need a great developer experience. Everybody needs to be able to understand how to build that Search AI pipeline without spending hours on reading docs. This is another thing we are working on. Email me or tweet message me if you are interested in that kind of stuff.

Where are we going?

Cognitive Search

We want to build the best Search as a Service platform that enables developers to add Bing-like Google-like search experience to their websites. No need for hiring search experts who know what inverted index is. No challenges with shard allocation and how to implement master election properly. No need for distributed systems expertise to scale this for large amount of data. Last, but not least: no need for setting up, owning and managing the infrastructure. Everything is being taken care of by the platform. By the Cloud.

Our team is also working on market-leading Machine Learning APIs. We are going to utilize these ML models and enable you to search through not only text, but also through your images, audio and videos.

There is a lot of challenges in that journey. From processing large amounts of data, through doing it in reasonable time (performance/parallelization), to providing efficient user experience throughout the process.

Where are we now?

We already have fast, reliable and production-ready system for full-text search. You can provision it in no-time, scale by adding more replicas or partitions, and monitor using metrics we provide. You can query it with .NET SDK or using REST API. We even have Open Source UI generation tool that gets you started with the latter: AzSearch.js.

To learn more about current capabilities of Azure Search check this awesome presentation by Bryan Soltis:

There are two ways to populate your search index: by simply inserting documents (records) into it, or by using indexer – a mechanism that enables you to sync your search index with your data source (SQL or NoSQL Database, blob storage, etc.).

We have already started adding AI to our search pipeline, by enabling you to run text analytics and OCR on your data. If you are using indexer, you can create a skillset, which can detect people, entities, organizations, locations, key phrases, and language on the textual data. On top of that you can use OCR that can recognize text from your images, and enable you to search through that text. You can also run mentioned text analytics on recognized text. We call this approach Cognitive Search. Here is a quick video by Brian and Corom from our team, with a sneak peak of what’s possible:

Last year we created a prototype of Cognitive Search, using JFK files that went public. You can check out our JFK files website, github repo and below video from Connect(); conference in 2017, where Corom explaines how he built a pipeline to achieve what is possible now with just checking the checkbox:

We announced Cognitive Search at the //build conference earlier this year. Together with NBA we built a website that allows you to search through player’s photos. You can search for players, their shoes or correlations between them:

Similar approach can be used for variety of different scenarios. From filtering your family photos, through analyzing medical records data, to deciding which crypto-currency to buy. Now, all these PDFs and doc documents you have on your hard drive can be used to make an informed business decision.

There are a lot of companies using Azure Search in production. It’s super exciting for me that Real Madrid is using Azure Search. It’s my favorite football club since I was a kid.

How’s the team?

My favorite thing about our team are the people. Every single person is bringing something else to the table, and there is something you can learn from each one of them. From distributed systems expertise, through API design, to building efficient monitoring infrastructure that enables to maintain production cloud service. One of our team members is Henrik Frystyk Nielsen who is best known for his pioneering work on the World Wide Web and subsequent work on computer network protocols. Currently he works on encapsulating Machine Learning models into containers. Our manager, Pablo Castro started not only Azure Search, but also OData protocol and LINQ to Entities. Our Project Manager Lance Olson was one of the founders of the .NET! You can check out what people say about our team on blind! Search for “Azure Search” 😉 There is also a blog post written by Pablo a few years ago: Startup at Microsoft. A lot has changed since then. We went through a few rounds of “funding”, and our team grew. However, we still believe in core values expressed there. For example: every engineer from the team still talks to customers on daily basis either through social media or directly over email or Skype.

BTW: We are hiring!