From Punch Cards to Git: A Brief History of Version Control

Believe it or not, there was a time before Git. Even longer ago, there was a time before version control. In this conference session, we will discuss version control systems of yesteryear, such as SCSS and RCS, file locking, versioning, the Darcs patch theory, the history of version control, different paradigms, and the future of version control.

Way back in the before times, in the halcyon days of January 2020, I gave my first conference talk at CodeMash. I had spoken publicly at a local user group I used to run, but had never given a professional talk to a crowd of strangers.

Brian Meeker speaking at CodeMash 2020
Brian Meeker speaking at CodeMash 2020

I had hoped to give this talk at other conferences this year, but… well, things happened. Luckily this talk was recorded and is available at Pluralsight. The slides are also available on GitHub. Further good news is that the talk is evergreen, so when conferences start up again in 2022, I won’t be stuck with a talk that is four versions behind whatever tech stack I was talking about.

I’m extremely proud of the content of this talk. The presentation itself though… I look very much the part of a first-time presenter. I practiced a lot by myself in my office, but never recorded. Seeing and hearing the tics of your own speech and pacing is very important. Having this recording available gave me a lot of things to work on for conferences in 2022.

RSI & Keyboards

I’ve suffered from RSI since 2003 and have used a variety of keyboards over the years to varying results. I was originally diagnosed with tendonitis in both wrists. Over the next five years my symptoms moved all the way up my arms into my shoulders. Your nerves branch at the shoulder down your arm and your ribcage. On bad days, my nerves were so inflamed I could scratch my elbow and it felt like somebody was touching my side.

I’ve since gotten more than 90% better through drastic diet changes, but until I reached that point I tried a lot of keyboards. If you have suffered from RSI or just like trying out weird keyboards, read on.

Microsoft Natural MultiMedia

Well-used Microsoft Natural MultiMedia keyboard

Let’s be clear, the Microsoft Natural MultiMedia is trash if you are suffering from serious RSI, but it (or something similar) is what many people start with. It’s about the only “ergonomic” option you can find in brick-and-mortar stores. I got one in college (sometime in the 2004-2005 range) and had good results initially. That is a pattern with many ergonomic devices. It isn’t so much that the device is ergonomic; it’s that you are exercising different tendons/ligaments/muscles around the strain. Different angles and positions stress different ligaments and tendons, so your injuries get some much needed relief. Unfortunately, for many people the underlying cause isn’t being treated and they eventually develop similar problems with the new keyboard.

Kinesis Advantage Pro

Well-used Kinesis Advantage Pro keyboard

I graduated from college in 2007 and my RSI quickly got worse with a 40 hour work week. The Microsoft Natural MultiMedia just wasn’t cutting it anymore, so I swallowed hard and spent $260 on a Kinesis Advantage Pro.

The transition was rough and I was worried I had made a terrible mistake. I remember huddling over my desk in more extreme pain than ever after only a couple days of use. I stuck it out though and, after an adjustment period (and a lot of ice), it served me well for years.

The layout of the Advantage Pro is amazing. Your thumbs are amazing appendages, but the standard keyboard layout wastes them by only using them for the space bar. The Advantage Pro moves a bunch of commonly used keys to two keypads in the center of the keyboard. This lets you use your thumbs for Backspace, Delete, Super, Alt, Home, End, Page Up, Page Down, and Space. The key wells are spaced far enough apart that your arms can stay naturally at your sides and the keys are stacked vertically instead of staggered. This required some adjustment, but was amazing once I got used to it. The keys are Cherry MX low-force, tactile switches, which feel amazing and helped with the impact of bottoming out. You can also remap keys (useful for programmers who make regular use of symbol keys that are seldom used by the general population), setup macros (something I never got in the habit of using), and there is an optional foot switch that is commonly used for modifier keys (never tried it).

At some point (maybe in 2008?) I switched to Dvorak. I’m not sure if this really made any difference, but it was fun. I switched back and forth between QWERTY and Dvorak for a couple of days before fully committing because I was having problems learning by going back and forth. I kept with Dvorak for a couple of years before switching back to QWERTY because I was tired of not being able to type on any other keyboard.

Kinesis Freestyle Ascent

Kinesis Freestyle Ascent keyboard

I used the Kinesis Advantage Pro until sometime in 2011 when my RSI started getting worse. It just wasn’t cutting it anymore. At that point, after years of toying the idea, I bit the bullet and went vertical with a Kinesis Freestyle 2. (The 20″ cable between the sections is necessary if you want to go vertical.)

It took about two weeks until I could type at a reasonable enough speed to be productive. You could probably adapt faster if you can switch over full time immediately. I switched back and forth for a little while so I could actually get some work done.

The Freestyle itself is far inferior to the Advantage Pro, but I can’t use the Advantage vertically. That is the selling point. Otherwise, it’s a pretty average keyboard.

But going vertical made it all worth it. Being able to type with your hands still in a neutral handshake position is amazing and I doubt any horizontal keyboard will ever be able to compete with vertical (at least in my case).

DIY Kinesis Freestyle Ascent keyboard

The Ascent is the vertical mount for the keyboard. It actually can be used at many different angles, but I’ve only used it at the full 90°.It is an extremely well made (and extremely over priced) adjustable steel stand that the Freestyle screws onto. But you don’t actually need it. For the first couple of years I actually used a DIY stand from some scrap wood and attached the keyboard with velcro. I’ve since relented and actually bought the Ascent (it’s much better for travel), but you don’t actually need it.

The Future

Right now, I’m in a good place and don’t feel a need to switch to anything else. There aren’t that many options for vertical keyboards and there isn’t much interesting innovation elsewhere that I have seen. I don’t expect anyone to run out and try a vertical keyboard, but don’t be afraid to try it if nothing else is working. Or if you just want to be the guy in the office who always gets odd looks and has to explain their setup.

Test Driving the Microsoft Band SDK

TL;DR: The Band SDK is currently very much a preview and you should wait if you want to do anything serious with it. You’re very limited in functionality.

Pairing

I use my Band on a day-to-day basis with my Nexus 5. I had never paired it to a Windows Phone. I had to factory reset my Band to get it to sync with my Lumia 635. I’m hopeful this is not a common issue when switching between platforms. I had no problem getting the band to pair back to my Nexus 5 when I was done. If it is an issue, then cross-platform development would be significantly easier if you had a separate Band for each platform. That may be true anyways to avoid constant re-pairing when testing multiple platforms at once.

SDK

I was using the 1.3.10219-preview build from NuGet. Currently, you can

  • Read sensor data in real-time
  • Create tiles and send notifications to them
  • Change themes
  • Change the main tile background image

I was mainly interested in sensor data. My goal was to create a simple app that would post your steps for the day to Slack (I have a lot of Slack code from a Windows Phone Slack client I started and didn’t finish). Ideally, the user would be able to tap a tile on the Band and a message would be sent to Slack. Unfortunately, the SDK does not support anything like that. You can send notifications to a tile, but you can’t trigger code on the phone from a tile. My backup plan was to have a timer background task that read step data from the Band, but that didn’t work either. Apparently, the SDK does not work in background tasks right now . I settled for the user having to tap a button in the app.

PCL Support

While I was working on Windows Phone, a co-worker was playing with the SDK on Android using Xamarin. We were disappointed to see that the NuGet package does not support Profile259, which would include iOS and Android. It only supports net45+win+wpa81. Long-term, I hope to see the interfaces separated into a separate assembly so that they can be referenced by the PCL. Otherwise, I would need to wrap almost the entire SDK myself to use it with MVVM. Or hope that Xamarin does it for them with their component.

Pitfalls

  • Bluetooth is flaky. You will get IO errors. Be ready for them.
  • I was also surprised that the pedometer sensor gives the total number of steps the device has seen overall, not just for the current day. Since you can’t run in a timer background task right now, there is no reliable way to get just your steps for the day.
  • Be careful managing the lifetime of your IBandClient objects. When it gets disposed, all of your open connections to the Band will be closed. This is perfectly reasonable, but I wasn’t thinking about it at first. If you’re wondering why your ReadingChanged event never fires, this is probably why.

Mapping View Model Dependencies with MvvmCross and AutoMapper

AutoMapper is one of those amazing tools that I wish I was better with. It’s incredibly flexible, but I often throw in the towel and map things myself when it starts getting complicated. A recent pain point has been view models in a MvvmCross project.

MvvmCross is a nice C# implementation of the MVVM pattern. I use it on a daily basis to write mobile apps. It’s very common to use it with AutoMapper to map from Model -> View Model. However, my view models often have constructor dependencies, which AutoMapper can’t handle with the default configuration.

Solution (On GitHub)

MvvmCross is able to supply these dependencies. We just need to make sure everything is registered and tell AutoMapper how to get them. My demo is a simple app that displays different types of tiles.

You can see that TileViewModel has a dependency on ITileService. Because of this, AutoMapper can’t instantiate a TileViewModel. We need to let AutoMapper know how to supply this dependency, which we can do through configuration.

The default App.cs for MvvmCross already registers all interfaces that end with “Service”, so we just need to register the view model.

Now, we just need to tell AutoMapper to use the service locator when mapping to TileViewModel

And the magic is complete. Now, we can use AutoMapper as usual.

When we map to TileViewModel, each instance is resolved with Mvx.Resolve, which knows how to supply an implementation of ITileService. You can see a complete demo app at https://github.com/CuriousCurmudgeon/MvvmCrossAutoMapperSample

Startup Founders & Risk

Real Life Sciences (RLS) failed for many reasons. The tech team consisted of me and one of the co-founders. (And for the first few months it was just me.) The tool we built was functional, but not spectacular. We used a lot of tech we weren’t familiar with, which slowed progress. The team was distributed across four cities, and none of us had experience working remotely. Consequently, communication was poor. The only funding came from a family member of one of the co-founders.

But I think the biggest reason for failure was risk imbalance among the founders (and me).

I was initially brought in as a full-time consultant to build the first version of the product. At this point, the four co-founders were all working part-time in various capacities. After a few months, the technical co-founder lost her day job when that startup went under and she shifted over full-time to RLS. Two other founders were working on finding funding and the fourth founder did… something. I never was quite sure what he did.

At this point we had four founders in the following situations

  • The technical co-founder was working with me full-time building the product.
  • The two business/sales co-founders were working with our alpha customer and trying to secure funding, but only part-time.
  • The fourth co-founder was doing… something.

We were now in a situation where the people responsible for securing funding had little to no risk compared to the technical people. Both of them had good jobs and no incentive to quit them. It’s unclear what level of success would have even been required to bring them in full-time. I’m not blameless either. I enabled the situation by continuing to work for equity after the money ran out. It doesn’t matter how much of the pie you own when there is no pie.

I know it is almost impossible to be part of a startup where all co-founders take on an equal risk. There are too many circumstances outside of work for that to be possible, but don’t make the same mistakes I made.  If you see a situation where the risk is extremely lopsided, bring it up. And if nothing changes, look for your exit.