Heck, I’ll even read this to you:

The TL;DR version

I’m building the website software I’ll use to host DevU.com using “all the new stuff” from Microsoft — .NET Core, Azure, Visual Studio Team Services. I’ll be recording my progress in video, giving much of it away for free in the form of blog posts. Some of the video content will be exclusive to paying members. Once I finish the source code, I’ll make some of it available to paying members, as well.

I’ll be working on this over the Christmas break with my son and another college student. We’ll be following the basic tenets of an Agile methodology. We’ll be using Git, creating topic branches, creating pull requests, using automated builds and continuous deployment.

I’ll be releasing the first posts / videos within the next day. Subscribe to this blog (RSS or newsletter) to stay abreast. I’ve already got 25 videos recorded and we’re getting them transcribed, close captioned, and uploaded as I write this.

Want to know when I add new videos on this blog? Sign up below for email updates:

The Long Version

Why Am I doing this?

Early 2016, I decided it was time to change how I do business. Since 2002, I’ve used the domain name LearnVisualStudio.NET. I’ve explained in other posts why I decided to change to DevU.com, not the least of which is that (a) it’s a short URL, (b) no one could remember “Learn Visual Studio dot net”, and (c) “Visual Studio” was trademarked and while Microsoft never complained, I didn’t want to run afoul of their good graces.

Pertinent to this article, it was also an opportunity to re-think how I sell and deliver my video courses online.

The Early Years

When I first started building LearnVisualStudio.NET in 2001, I used some sample code produced by Microsoft for their new ASP.NET 1.0 framework called IBuySpy (which later became the open source software known as DotNetNuke). I bolted on PayPal payment integration to it and that sufficed. As my company grew, my needs grew, and it became more burdensome to write and maintain the software, be responsible for hosting it on dedicated servers and create videos. Other developers wrote code, adding features over time and I trusted them to keep the code base clean. But at some point, I became so intimidated by the code that I was reluctant to change anything in fear that something would break. There was a specific moment of frustration in 2010 when I was on vacation and a server had a faulty network interface card. That was the last straw, and I sought to get out from under that mess.

WordPress was not the right fit for my business

In 2010 / 2011, I moved to a WordPress solution. It was free, and I could purchase a membership plugin (S2 Member Pro) for $75 that would accomplish much of what I wanted. At least, at first. The great thing about WordPress is that there’s a large ecosystem of plugins and themes that can do just about anything you can imagine.

Problems with WordPress for my business

However, there are three significant downsides to a WordPress based content management / learning management / eCommerce solution that very few people talk about:

1) There are a lot of plugins, many of which are free or cheap. But it’s a false economy. There’s no such thing as “free support”. Customer support is either completely non-existent or in the form of “post it in the community forum.”

Furthermore, even talented plugin authors are affected by the realities of the market and life as an entrepreneur. If there’s no financial traction, eventually the developer must move on to focus on other more profitable pursuits. This happens frequently when plugins that fill a niche and have a more narrow appeal.

At some point, something will break that plugin. It could be a new build of WordPress, a competing plugin, or your own stupidity. And when that happens, you are screwed. This happened to me a few times (and it’s why I had to abandon the ‘achievements’ feature on LearnVisualStudio.NET).

2) Besides the fragility of plugins, there’s also the integration dilemma. Unless there’s an explicit integration with other popular plugins, you will pull out your hair trying to provide a seamless end user experience. Most integrations happen at the database table level or the JavaScript level. Occasionally, they happen at the API level. Each of these approaches to integration have drawbacks. Without going into details, I guarantee you will reach a point where you have a dozen or more plugins that each do one thing moderately well but have no idea how to play nicely with your other plugins. You’ll have another half-a-dozen that have not been updated in years and you realize you’re relying on this code for your livelihood, but have no fix it should it ever die.

3) There are a lot of awesome looking WordPress themes, and apparently it’s more profitable to create themes than to create plugins. However, every theme creator creates their own shortcodes and there’s no standardization at all. So, if you ever want to move to a new theme, you have to undertake a massive “search and replace” hoping you can find parity between old and new shortcodes. In retrospect, I would have preferred to just forego the convenience of shortcodes and worked directly with HTML, CSS and JavaScript. Each time I wanted to change to a new template (or platform) I had to employ a small army of people to help me do it.

After five years of hosting on WordPress, I was back to the same moment of frustration: I have all this code I don’t understand and if it breaks, I have no idea how to fix it.

SaaS might be the right fit, if executed correctly

So when I envisioned DevU, I decided it was time for a fresh start. New Software-as-a-Service offerings have popped up in the cabin-industry learning-management-system space. I don’t want to name names, but I tried several of the most popular ones. I settled on the one that seemed to have the fewest downsides.

On the surface, these solutions are nice for those who are just getting started. In fact, most of their marketing material is around recruiting subject matter experts to create their first course. While they aspire to service larger customers in their marketing material, they lack all the features I need to run my business. Some of these features, I can integrate with other Software-as-a-Service offerings for things like marketing automation, analytics, etc. But that leads me to …

You say “integration” like it’s a GOOD thing

I’ve come to despise the term “integration”. By integrations I mean this Silicon Valley start-up mentality that all we need to do is build the best little widget in the galaxy, provide a Web API, and then charge in excess of $25/month for that one piece of functionality. Then, if you use our tool, all you need to do is provide an API Key and we’ll integrate with XYZ service that we know you need. Now, you’re “vendor locked” … you can’t move on to other competitors because you must use XYZ for this small but crucial piece of your business. It’s a scam propagated by those elitist geniuses we know affectionately as “venture capitalists”.

Trust me, I was Web Services before Web Services were cool (I wrote the first book on it way back in 2001 … look it up, brotha. No, it wasn’t on the best seller list.) I think Web Services — JSON, SOAP, RESTful — is a cool technology. But this is not about technology. This is about business strategy.

As a CONSUMER of web services and all these individual expensive little services? It. Sucks.

Most integration implementations are weak. Sure, they implement the “happy path”, but never *ever* integrate the edge cases … which means you’re probably missing out on the value of utilizing a best of breed service in the first place!

Funny, I heard this “best of breed” argument recently from a venture capitalist. He used the argument that as a customer looking for a particular solution, the customer *could* probably find an “all in one” service that did many things, just didn’t do them on par with the company he was touting. In this case, the “all in one” company might implement scheduled social posting, but they don’t have a whole staff working on just that feature like [the company he invested in].

On the surface, that sounds awesome, except, your pre-built integrations really dictate what features you can even utilize. Of course you won’t know that in advance because you trust that “integration” means “REAL integration” and not “happy path integration”.

Integration — REAL integration — will probably require you hire a programmer. So, the built-in integration provides you 20% of what you thought you were getting. Now, your only choice is to hire someone to wire it all up correctly for you. This adds a lot of friction (and a whole other vendor — the developer) to the entire process and now you’re even more locked in to this set of vendors than ever before.

Integration is expensive. First, there’s the monthly fee. I am paying $320/month for the Learning Management System itself (which, btw, ouch). I am paying $350 / month for marketing automation (ouch).

Then I’m paying $50/month for Zapier, an integration tool, that can glue the two together. (To be fair, Zapier is an awesome tool. I’m using it for a few things, like creating coupon codes to move LearnVisualStudio.NET members over to the Learning Management System because … well … it’s a long story. But Zapier is very expensive, and worse, the gradations of packages forced me to push up to the $125/month level because I was barely over the limit at the $50 / month level.)

I’ve integrated a analytics suite ($50/month), and another analytics suite that … um … does different anayltics ($50/month).

And speaking of missing features that I had to find a replacement for …

Furthermore, the Learning Management System SaaS I eventually chose lacked one basic requirement: the ability to create “extra pages”. Now what? I’m back to using WordPress for the blog, SEO pages, etc. So, that’s why DevU is hosted at:


… while my ecommerce-learning-management-system is hosted at …


… so now I’m also paying a WordPress host ($100/month … admittedly, I’m using *the best*), and I’m still paying for plugins and other SaaS’es to do various things.

Consider a well-maintained and marketed plugin like OptinMonster. $29/month. For pop-ups that re-target your audience when they’re about to leave your web page. (I realize I’m being reductionist in the value they provide … which isn’t completely fair. But at the end of the day, it’s some HTML5, CSS3 and JavaScript that I could build for myself in an afternoon and save $360/year. But I’m lazy and it’s more elegant than anything else out there.)

The Learning Management System also lacks things like the ability to run a sale WITHOUT coupon codes. It lacks basic membership functionality. In both cases, they have workarounds that are less than optimal and cause Richard, my customer service guy, to lose what remaining hair he has!

I do have sympathy for the people who are building this SaaS LMS system. They have a growing business (4000 paying customers in about 2 years!) and almost every one of those customers have a slightly different set of requirements. Their private invite-only Facebook group attests to that … over half the posts are feature requests and workarounds.
While I’ve been frustrated with some aspects of the Learning Management System, the main impetuses for a move to creating my own software were:

1) The Marketing Automation system. I quickly grew to 10,000 users / trial accounts / email list sign ups right before Black Friday / Cyber Monday. I could not send any emails because I needed to upgrade my plan … from $350 / month to a whopping $650 / month. I knew this was a possibility when I first decided to use this particular vendor. I didn’t anticipate running up against the ceiling so quickly. And now that’s an ADDITIONAL $3600 / year cost, on top of what I am already paying them … to send an occasional email. I envisioned really using the tagging system and setting up sophisticated sales funnels, etc. However, two problems:

First, I got numerous deliver-ability complaints. “Hey, I didn’t get day 3 of the ‘daily tips you promised to send’.”

Second, again, integration was a hassle. The feature I really liked was the ability to track a user across all their interactions with your site, and use that to trigger automated sequences of follow-ups. It mostly worked. But each page visit produced so many events that the sheer data became overwhelming to make sense of. Perhaps if it were my full-time job, I could tackle the complexity. But while I wanted some more flexibility, I couldn’t take on the complexity.

The other impetus was:

2) Microsoft’s new APIs, services and tooling. I wanted to build something real. Here are all these cool new toys from Microsoft. I didn’t want to build a “Hello World” app. I wanted to build something substantial so I could really learn it.

Furthermore, I wanted to “reward” Conrad and Devyn for their help on the transition from LearnVisualStudio to DevU during the summer and give them some real experience they can put on their resume. Furthermore, they’re helping me get the video content created and published, in addition to helping me understand how to work with Visual Studio Team Services in a team environment. I mean, it’s one thing to read about getting everyone setup and working with these team-focused tools, and it’s another to actually try and use them to get things done.

We’re two days in as I write this and I’ve already learned so much that I would never have learned had I tried to build this by myself.

How This Will Work

Each day we work on The DevU Project, I will record videos that capture those important moments when something interesting is going on. I’m calling these “sessions”. So, we’ll have:

Day 1, Session 1
Day 1, Session 2

Day 2, Session 1
Day 2, Session 2


I’m trying to keep each session as small as possible, and I’m borrowing the title of each video from the sitcom Friends, so that’s why the first session will be called: “The One Where Bob … Explains What the Heck He’s Doing”.

Sometimes, there’s some concept or “special knowledge” required that falls outside of a play-by-play account of building the project. In those cases, I’ve titled those “How Do I”. For example, in session 4, I explain “How Do I: Write User Stories” where I talk about the correct format of a User Story and how we use User Stories to drive the development and user acceptance of the software we build. These “How Do I” style sessions will almost exclusively be reserved for paying members of DevU.

The first two or three days of any new project is the period of time I often refer to as “primordial soup”; there’s a lot of fiddling with the infrastructure and environment we’ll use to develop, build and deploy the application.

At some point, after we get those foundational puzzle pieces working consistently, we can start focusing on adding business functionality. At that point I’ll start recording a “Daily Stand Up”. A “Daily Stand Up Meeting” is the Agile-inspired morning meeting of team members to discuss what is finished and what lies ahead for the team. It’s called a “stand up” to denote the fact that it should be short, casual and light-weight in structure. It will help the project manager (me, in this case) stay abreast of where we are. Admittedly, the Kanban board does this to an extent, but allowing the developers talk about their issues and plans face-to-face is more impactful, both for me and them. This will also serve to keep you in the loop as to what we’ll be working on next.
Project Plan

Getting Started

Most of the particulars of the project will be driven by User Stories, which I begin defining in Day 1, session 3 and explain further in session 4. Often, these will remain at a high level, and I’ll rely on my team mates to fill in the details, doing some analysis on the business need (by interviewing me) and creating actionable tasks required to build the requested features.

In Session 7, I define the dates of the first iteration, including the team members and their workload capacity.

In all, I anticipate we’ll have three iterations. At the end of the third iteration (about the time the guys have to go back to college), I hope to have the new DevU in a “beta” state, meaning that if you’re a member, you’ll be able to log in and look around. I can’t guarantee it will be 100% ready for prime time, but that’s the goal.

Technology Stack

Like I said earlier, we’ll be using “all the new things”, including:

  • ASP.NET MVC Core
  • Entity Framework Core
  • Visual Studio Team Services
  • Azure App Services (particularly Web Apps, Web Jobs)
  • Azure SQL
  • Azure Storage (Queues and Blobs)
  • Application Insights
  • Bootstrap 4

Eventually I hope to include:

  • Azure CDN – content delivery network for static content
  • Azure Redis – caching page and user content
  • Some front-end JavaScript framework … I’m leaning towards Vue.js since I believe the trajectory of all the “cool kids” is headed that way, but most likely I’ll choose ReactJS. While the .NET crowd loves its Angular 2, I feel a great disturbance in the force that many JavaScript developers have moved on to the new reactive style.


My hope is to not rely on any non-Microsoft technologies for this project (besides Bootstrap and JavaScript frameworks).

There are three notable exceptions:

      Email Service
      Credit Card Payment Service
      Video Streaming Service

Email Service

I will be building my own “marketing automation” engine and obviously, tight integration with an email service will be crucial.

On a side note: I wish Microsoft would create their own email service. I would not be surprised if they do have one at some point. That brings up an interesting topic for discussion … what factors into Microsoft’s decisions as to whether to build a cloud service or just allow one of their partners to handle it? Until very recently, the only way to host a WordPress blog on Azure was to use one of their grossly over-priced partners for MySQL hosting (or set up your own Virtual Machine running Linux … or try to get WordPress working with SQL Server … none of which were palatable!)

Amazon Simple Email Service (SES) is probably the least expensive alternative out there. I hear their deliverability is top-notch. Also, they already have a .NET Core version of their SDK available now. From their SDK blog, it seems like they take all of this very seriously.

Having said all of that, as I write this, I’m leaning towards using SendGrid. I can’t explain why other than familiarity of their admin website’s user interface.

As I write this, SendGrid has been dragging their feet on implementing a .NET Core version of their SDK, which is merely a wrapper around version 3 of their Web API. Reading comments on Github, I see there are others who are in the same boat as I am … waiting to make a final decision on who to ultimately use as an email service vendor until the last possible minute giving SendGrid every chance to get in under the wire.

Yes, there are other version 3 Web API wrapper implementations out there in the FOSS community, but I’m a chicken when it comes to these one-man open source projects. I’m scared I’ll be stuck with a steaming pile of code that I’ll have to untangle someday, likely at the worst possible moment. Experience has taught me to stick with the vendor’s version.

Credit Card Payment Service

As a long time PayPal Website Payments Pro user, I switched to Stripe back in the summer. Why? Primarily because of PCI Compliance and integration availability.

When using S2 Member Pro (the WordPress plugin I relied on for membership and payment management) apparently I didn’t read the fine print. I thought I was using it correctly. But one day when searching for something else, I read that, while S2 Member Pro is PCI compliant in and of itself, you are still required to host your WordPress blog on a PCI compliant server. Doh! I was hosting at a sufficiently powered but NOT PCI compliant hosting company. This helped me decide to move to a hosted solution … so I wouldn’t have to worry about this sort of thing any more. The SaaS LMS I’m using had both PayPal and Stripe integration, but I felt that the Stripe integration was smoother.

Now that I’m moving away from a hosted solution, I need to worry about PCI compliance again. This is where Stripe.js comes in. You’ve seen it … the little JavaScript popup window where you type in your credit card details (and little else). If successful, Stripe calls a Web Hook on your server with a ‘yeay’ or ‘nay’, and you respond to your end user accordingly.

I may wind up also integrating PayPal because so many people have a PayPal account already, and it does seem to be more liberal in terms of which credit cards and countries it will accept payments from. However, I think I’ll only offer it as an alternative after a failed payment.

Video Streaming Service

Yes, Microsoft does have it’s own transcoding and streaming services on Azure now. However, they are priced outrageously when compared to Vimeo. For $400 per year, I get unlimited streams. I only have to stay under a certain weekly upload limit (not a problem). I can also upload closed captions (something my current SaaS LMS can’t seem to handle) and restrict access to the videos so that they can only be embedded on certain domains.

I’ve had a handful of complaints through the years that Vimeo isn’t working, and while I know that can be frustrating, it’s simply too good of a deal to pass up.

Furthermore, I already have all my videos up there so there’s no mass migration that could take days or weeks. And there’s an API (although I’m not sure exactly what kinds of things I can do with it … we’ll find out).

Why not use Visual Studio 2017?

As we start the project in mid-December 2016, I am aware that Visual Studio 2017 RC (‘Release Candidate’) is available.

Even so, we’ll be starting out with Visual Studio 2015. I’m not inclined to move to Visual Studio 2017 during these first iterations even if other ‘release candidates’ emerge. The first RC is simply not stable. In some (admittedly, very brief) testing I did, I found that, in particular, the tooling around the Entity Framework in Visual Studio 2017 RC was not ready. I don’t feel particularly compelled to move because that could cause a major disruption in our short schedule should something unforeseen pop up. I might wait until after the boys go back to college before even considering a move to 2017.


We also are using Resharper, which is another reason to stick with 2015 for now. Let’s just admit it: Resharper is the best thing since sliced bread, and particularly useful for a young team learning how to write better C#. It’s also useful in the early days of a project when you’re moving things around a lot and renaming things.

What is The Doppleganger Project?

So, there will be times when I was not recording and something significant just happened on the project. Or, I want to re-produce a solution that took me way too long to record and edit down. In these cases, I’ll use a project named Doppleganger to re-play the events. I hope to minimize it’s use, but it’s the best solution I can come up with to this issue.

For example, yesterday we ran into a few issues trying to get the initial code I committed to Git on to everyone else’s machine. We tried a few things, and the problem got worse! It took the three of us an hour to figure out the solution to the problem. But once we figured it out, the “instructional moment” was gone.

Using Doppleganger, I’ll reproduce both the problem and the steps to solve it. I’ll try to make you aware when we’re in “doppleganger mode”. (Tip of the hat to another sitcom, How I Met Your Mother for the name ‘doppleganger’. Clearly, I watch too many sitcoms.)

Where do we go from there

Hang tight … I’ll be producing these videos and posting them as quickly as possible. Make sure you sign up for our newsletter, follow me on Twitter (@bobtabor) or hook up your favorite RSS reader to be notified when new videos and posts become available.