# Tuesday, July 14, 2015

Two hours after Codestock ended, I sat at a local restaurant enjoying dinner with Tennessee friends. I was tired and mostly listened to the conversation around the table.

I decided only recently to attend Codestock this year - primarily to help manage Microsoft's sponsorship of the event - but I ended up participating in 4 different presentations.

IMG_2511 Scott Hanselman delivered the keynote address at the beginning of Day 1 and we were allowed to introduce him to the audience and speak for about 15 minutes. Jennifer Marsman and I decided to highlight a golf scoring application created by Knoxville developer Wally McClure. We chose this app because it used many features of Azure and ran on multiple devices, including an iPad. Rather than simply talking about the app, we wrote a short skit in which Jennifer and I bragged about how much we knew about golf and Wally patiently explained how much more complicated golf scoring was than we understood. Performing a skit is a different way of delivering a message like this, but based on the feedback I received afterward, most people seemed to enjoy it. DavidWallyJennifer

On Day 1, I was asked to sit on a "Mobile Strategy Panel" because one of the panelists cancelled at the last minute. Sam Basu of Telerik asked each panelist questions about the state of various mobile platforms and took questions from the audience. The session was recorded by Ed Charbeneau (one of the panelists) for his podcast, so this recording should be publicly available soon.

I also signed up to deliver a 20-minute Lightning Talk titled "Microsoft Azure Without Microsoft" in which I described many of the open source technologies and alternate platforms that are supported on Microsoft Azure.

On day 2, I delivered a presentation: "I Did Not Know Microsoft Did That". This presentation was created and submitted by my colleague Bill Fink, but Bill fell ill and could not make it. The organizers liked Bill's topic and asked if I could deliver it. I used Bill's slides to talk about free programs offered by Microsoft, such as BizSpark, Dreamspark, and Microsoft Virtual Academy. Everyone in the audience I spoke with told me they were unaware of more than 2 of the dozen or so programs I covered and wanted to explore at least one of them more.

IMG_2521 The local Microsoft store was on-site with several tables full of PCs, laptops, tablets, phones, and even a 3D printer. This was an idea I pitched to Codestock last year and it was so well-received that the organizers contacted the store themselves this year.

I had a chance to attend a few sessions as well. Jennifer Marsman gave an excellent demonstration in which she used a device to measure EEG brain patterns and fed data into Azure Machine Learning to determine how the brain reacts when lying versus telling the truth; David Neal gave a very good overview of node.js for .NET developers; and Jeff Fritz showed off the features coming in ASP.NET 5.

WP_20150711_14_50_27_Pro_edited-1 I love attending Codestock because it gives me a chance to connect with people in a different part of the country than I normally interact with. I spoke with people about F# and video production and web development and cloud computing. I even captured a few video interviews, which I've already started sharing online.

Attendance nearly doubled this year over last year with nearly 900 developers making the trek. The organizers moved it to a much larger venue and may grow it even more in the future.

I think you can tell now why I was so tired following the conference. Luckily, I’m home now and I’ve already started to re-energize. For next year.



Tuesday, July 14, 2015 10:25:00 AM (GMT Daylight Time, UTC+01:00)
# Monday, July 13, 2015
Monday, July 13, 2015 11:25:00 AM (GMT Daylight Time, UTC+01:00)
# Monday, July 6, 2015
Monday, July 6, 2015 6:22:00 PM (GMT Daylight Time, UTC+01:00)
# Sunday, July 5, 2015

Today I am grateful for impressive fireworks at Navy Pier last night.

Today I am grateful to be an American.

Today I am grateful I attended a very good Pokey LaFarge concert last night.

Today I am grateful for an afternoon in East Lansing, MI.

Today I am grateful for a visit with my mother and sister last night

Today I am grateful for 3 offers on my house the past 3 days.

Today I am grateful to finally have a chance to celebrate Father's Day yesterday with my son Tim.

Today I am grateful for an evening with my classmates at our high school reunion last night in Detroit.

Today I am grateful for a chance to spend a few days back in Michigan visiting family and old friends.

Today I am grateful for the ability to stay in touch with distant friends via social media.

Today I am grateful to Brian, who made himself immediately available to answer my Powershell questions.

Today I am grateful there is a gym in my building - right down the hall from my apartment.

Today I am grateful that I live within walking distance of so many places I want and need to get to.

Today I am grateful to my Dad, who showed me what it is like to be a good father. I pray I made him proud.

Today I am grateful for an evening at Ravinia watching A Prairie Home Companion live for the first time.

Today I am grateful for my new Chicago Public Library card.

Today I am grateful for all the free food I keep receiving at these events.

Today I am grateful for an Architectural boat tour of Chicago yesterday.

Today I am grateful I built my first node.js project yesterday.

Today I am grateful for my balcony, this chair, and nice weather nice enough to sit outside in the morning.

Today I am grateful for 2 different festivals this weekend.

Today I am grateful for a chance to see and hear blues legend Buddy Guy last night.

Today I am grateful for those who worked to make the local Toastmasters club a success this past year.

Today I am grateful for a day with no appointments, so i could catch up on stuff.

Today I am grateful for a successful BuildChicago event yesterday at the Field Museum.

Today I am grateful for a weekend in Michigan.

Sunday, July 5, 2015 4:06:04 PM (GMT Daylight Time, UTC+01:00)
# Saturday, July 4, 2015

I am here today to urge you to use the "Tentative" response in your calendar program when it is appropriate.

Firesign I see too many people blindly accepting every meeting request they receive - even those they know they will not attend. Many of you - and you know who you are - have multiple meetings booked for the exact same time. As the philosophers at Firesign Theater so eloquently put it: How can you be in two places at once when you're not anywhere at all?

There are 3 primary advantages of using the Tentative response:

  • Organize your time better
  • Courtesy to the meeting organizer
  • Assist others in finding free time on your calendar

Organize your time better

This should be enough reason for you to use "Accept" when you mean "Accept" and "Tentative" when you mean "Tentative".

Each morning (and often the night before), I check my calendar to see what my schedule holds for the day. My calendar is often full, but not every event on it requires my attendance. Knowing which ones I need to attend and which ones I might attend makes it far easier for me to plan my day.

Accepting an appointment marks it as "Busy" on my calendar, while tentatively accepting an appointment marks it as "Tentative" on my calendar. In the Outlook calendar, each status displays with a different pattern (solid for Busy; hashed for Tentative). These patterns make it easy to see at a glance where I'm required to spend my time and where my attendance is optional, which helps me to set priorities.


Courtesy to the meeting organizer

Meeting organizers often rely on your response to determine whether or not you will attend. Sometimes, they are counting on you to share your insights with the rest of the group or to answer one or more specific questions. If they expect you to attend and you do not, it may throw off their agenda. They may need to schedule another meeting as a result or get your information via a series of (inefficient) emails or phone calls. It's common courtesy to be honest about whether or not you intend to be at a meeting. If you are unsure, let them know via the "Tentative" response.

Assist others in finding free time on your calendar

I recently tried to find time on a manager's calendar but I was frustrated that her entire calendar was marked "Busy" for every working hour of every day of the next 5 days. Of course, this person wasn't committed to all those meetings and did not intend to attend them all; but she didn't distinguish between required and optional meetings, which made it more difficult for me to find free time on her calendar. Marking your calendar honestly makes it easier to collaborate with others in your organization.

Sometimes, I still double-book time on my calendar. But when I do, I never make both appointment "Busy" or "Accepted".

My company offers a lot of online "meetings" that are actually training sessions, where one of my colleagues will show the rest of us how to use a cool technology. I want to attend as many of these as I can, so I want them on my calendar. But I recognize that a higher-priority meeting may force me to skip a session and watch the recording later.

The "Tentative" status works for these scenarios. Use it. You'll be glad you did. And so will your colleagues.

Saturday, July 4, 2015 11:54:06 PM (GMT Daylight Time, UTC+01:00)
# Tuesday, June 30, 2015

Recently, I interviewed Jeawy Jang and Tae Tongnussock, two students from Thailand who built Den-Lin  - a mobile application designed to test the composition of soil. The application placed in the Imagine Cup competition last year.

Here is that interview on DevRadio.

Tuesday, June 30, 2015 10:39:24 AM (GMT Daylight Time, UTC+01:00)
# Monday, June 29, 2015
Monday, June 29, 2015 2:02:00 PM (GMT Daylight Time, UTC+01:00)
# Wednesday, June 24, 2015

With a mere 135 pages, Orchestrated Knowledge by Peter Leeson doesn't appear very substantial at first glance. But Leeson packs a lot into a small package. The book describes ways that companies can improve their quality and productivity. Leeson distills his decades of management consulting into a set of brief chapters describing the mistakes he has witnessed at various companies and recommendations for correcting these mistakes.

Leeson talks a lot about quality. He writes:

"The first thing that we need to consider in any organization is that quality is the most important thing. The quality of your work defines you. Whoever you are, whatever you do, I can find the same products and services cheaper somewhere else. But your quality is your signature."

PeterLeeson According to Leeson, Quality is achieved by people - not by tools, as so many believe. He urges organizations to empower their employees by listening to their ideas and allowing them apply their own creativity in performing their jobs and directing changes about their area. Employees will be happier and happier employees tend to be more productive and produce higher quality goods and services. Most organizations avoid this because they fear the risk of exposing flaw in their system and because they don't trust their employees.

OrchestratedKnowledge Communication is a large focus of this book. Employees lose motivation when they don't know why changes are implemented, what goals the company hopes to achieve, and what projects are coming in the future. Communicating with employees not only empowers them, but allows them to focus their energies on the best way to solve problems, rather than on performing a set of rote tasks.

The largest chapter describes what Leeson calls the "Orchestrated Knowledge Organization", which breaks the company into cells - each with a specific set of responsibilities and an area of quality on which to focus.

Leeson advocates evolutionary change over revolutionary change - keep what works in your organization and build on it, rather than reconstructing everything - a high-risk strategy that is difficult to adopt.

Orchestrated Knowledge does not provide many step-by-step instructions for your company to follow. But it does provide a lot of guidance that you can apply to your own organization to avoid mistakes and make it more successful.



My interview with Peter Leeson, May 2014

Peter Leeson’s blog

Wednesday, June 24, 2015 3:37:55 PM (GMT Daylight Time, UTC+01:00)
# Tuesday, June 23, 2015

The past few years, I've heard a lot about something called NoSQL. Some people really love it. Those who love it, talk about its lack of ceremony and the speed with which you can develop and the speed with which it reads and writes and its scalability. It sounds all sounds so awesome!

But I grew up on relational databases. My first computer language was FoxPro, which included a relational database and supported a powerful version of SQL. From there, I graduated to SQL Server and I've dabbled occasionally in Microsoft Access. I've even worked with Oracle and MySQL and, as a developer, I find them intuitive. Should I abandon the databases with which I am familiar and travel to this brave, new world of NoSQL? Is NoSQL the best solution for every project? For some projects? How do I know?

Let's start with a definition for NoSQL. This is harder than you might think, because NoSQL databases are basically defined by what they are not. The only real definition is that they are not SQL databases. They tend not to have pre-defined schemas; they tend not to enforce relationships; and they tend to be able to store hierarchical data; and, of course, they tend not to support the SQL language (although some support syntaxes similar to SQL, such as LINQ). These are broad definitions and only address things that NoSQL databases don't do. There is no standard language, syntax, storage mechanism, or API for addressing NoSQL databases.

For purposes of this article, I'll define SQL databases as those in which the database engined provides the following features:

  1. Supports SQL
  2. Enforces pre-defined schemas
  3. Enforces referential integrity among related, normalized tables

This includes database engines supported by large companies, such as Microsoft SQL Server and Oracle, as well as Open Source databases, such as MySQL.

I'll lump all other persistent storage technologies as NoSQL databases. This includes MongoDB, RavenDB, Azure table storage, and DocumentDB.

So when should we choose good old SQL databases and when should we use this newfangled NoSQL thing?

Let's start with SQL databases. They have a few advantages:

SQL databases

Advantages of SQL DBs

First, they are relational, so they make it easy to normalize your database into a set of related tables. This almost always saves disc space and often makes your data more consistent (e.g., you can change the name of a product in one table and it changes throughout your entire application). Databases like this also allow you to create persistent relationships between these tables and these relationships enforce referential integrity, ensuring that we are not left with orphaned records (Who wants an order line without a corresponding order?)  You can set up cascading deletes or force users to create and delete records in an order that will never have inconsistent data.

The SQL language itself is very flexible, allowing users to create either pre-defined or ad-hoc queries against a relational database. This makes SQL databases great for reporting.

The schema in a SQL database helps catch errors in almost the same way that a compiler or a unit test does. If you want to capture a customer's last name and you create a “LastName” column, but one time you accidentally misspell it as "LastNmae", the database will catch this and throw an exception which should be early and obvious enough for you to fix the error.

Disadvantages of SQL DBs

But these features come at a price. There is overhead in enforcing database schemas and referential integrity. As a result, saving to a SQL database tends to be slower.

Also, when developers build an application intended for human interaction, they almost never structure normalize the application's objects in the  way that they normalize the data in their relational database. An entire class of Object Relational Mapper (ORM) software exists simply to deal with this mismatch. It requires code, time, and CPU cycles to map between objects in an application and data in a database.

NoSQL databases

Advantages of NoSQL DBs

Because NoSQL databases don't need to enforce schemas or relationships, they tend to perform faster than their SQL cousins.

Database development tends to be faster because developers and DBAs are not required to pre-define the columns in each table.

The lack of database relationship enforcement also makes it easier to move parts of a database to another server, which makes it easier to support very large data sets. Relational databases can move across servers, but it tends to be more difficult because of their need to enforce referential integrity.

The lack of schema also adds flexibility, especially if you are capturing data in which different objects may have different properties. For example, a product catalogue table may contain some items (such as computer monitors) for which diagonal size in inches is an important property, and other items (such as hard drives) for which capacity in GB is an important property. Mapping these disparate needs to a relational database table would be add complexity to your data model.

Finally, it is possible to serialize and de-serialize objects in the same format that they are used in an application's user interface. This eliminates the need for an ORM, which makes applications simpler and faster.

Disadvantages of NoSQL DBs

When reading data, NoSQL databases tend to be very fast, as long as you are looking up rows by an index or key. If you want to look up a row by any other property or filter your data by a property, this often requires a full table scan, which is very slow. Some NoSQL databases allow you to create index on non-key rows, which speeds up such searches but slows down data writes - decreasing one of the advantages of NoSQL.

Other factors

It's worth looking at the cost of any database solution. For example, Azure provides both SQL and NoSQL databases as a service. If we compare the cost of Azure SQL Database with Azure table storage (a NoSQL option), we can see that the price of table storage is far less than the cost of SQL Server. Table storage might not be the answer for your application, but it's worth examining whether some of your data can work with Azure table storage.


As with most questions facing IT developers, architects and managers, there is no clear-cut answer to whether to use SQL or NoSQL databases. SQL databases tend to be better when ad-hoc reporting is required, while NoSQL databases tend to shine when saving and retrieving transactional data from a user application. Many applications take advantage of the features of both database types by creating a NoSQL database with which their application interacts; then transforming and regularly copying this data into a relational database, which can be queried and reported on.

There are many options for your persistent storage needs. Choose the right one for your application.

Tuesday, June 23, 2015 2:42:00 PM (GMT Daylight Time, UTC+01:00)
# Monday, June 22, 2015
Monday, June 22, 2015 2:24:00 PM (GMT Daylight Time, UTC+01:00)