Never Stop Learning

If I could change one thing about education in America, it would be summer vacation. It's a hold-out tradition of a bygone era that not only wastes time, but reverses progress every year in our children. 

Worst of all, the sunny view of summer vacation is hardly universal and actually makes life harder on people relying on the education system to support their already thin resources.

I realize there would be immense logistical challenges in re-structuring the system - it would literally be cheaper and easier to put a classroom of children on the moon than to change the system to teach children in America for three more months - but I believe it's the most obvious public policy change in the history of this country and it's never going to be mentioned once this entire election.

So, what can we do about it?

In the world of software, there are thousands of hours of free materials out there. The only thing stopping a student from learning the skills of my job, is dedication and time. From seminar-based learning on Coursera to interactive learning on Codecademy, there are a lot of resources. I do think these are valuable - pretty much the whole world should take the JavaScript module on Codecademy - but I do think they are disconnected from career-oriented learning.

Most of my own professional development actually happens on Microsoft Virtual Academy, which is completely free.

While largely focused on Microsoft-based technologies, the site does a good job mixing in other technologies and is largely responsible for my optimism that Microsoft has come fully out of the mindset of the 90s.

For anyone interested in diving into web technologies, I would recommend signing up for MVA, downloading Visual Studio Community 2015, and making a "Learning Path" (IE, Playlist) of classes in MVA to dive into software development:

  1. Getting Started with Web Technologies - Tries to start at an actual 10,000 foot view of building web software, rather than starting with languages (the CS degress approach).
  2. HTML5 & CSS3 Fundamentals: Development of Absolute Beginners - It's always confused me that we send people out to learn JavaScript before actually getting to know HTML or the browser's purpose and behavior. 
  3. JavaScript for Absolute Beginners - A 21-part course that dives into JavaScript, jQuery, and AJAX.
  4. The Modern Web Platform Jump Start - Cuts across HTML, CSS, and JavaScript in a nice primer on how they go together to build applications. Anyone who doesn't understand the leap from making a website to building a web application should come away seeing the obvious difference with this course.
  5. Using Kanban Boards Jump Start - This is the best example of how getting good at building an app doesn't always mean getting better with code. Project management is a skillset for the entire software team.

After taking the Kanban course, you're fully prepared for the rest of your summer:

Make a kanban board for learning - make a card for every topic you want to cover - then spend the rest of the summer getting through it.

The board can be either a physical board or virtual one on Trello. When you find another topic, add another card. You now have an endless stream of learning and discovery, which is exactly what life should be.

25 Years in Tri-Cities - LiveTiles & Beyond!

In the last two years, I've talked a lot about how Tri-Cities needs to leave its 20th century identity behind. I want Tri-Cities to redefine itself as a place where privately-held, growth-oriented companies can take root in the 21st century and change not only the economy, but the culture of this place. This year, 2015, marks 25 years since I hopped out of a mini-van that had just cross the United States to arrive here in the desert, and it's going to be a big one.

First, at the encouragement of friends and the incentive of finally being able to lead a team, I have joined LiveTiles, a software startup based out of New York and started in Australia that builds UX design tools for Microsoft platforms. I will be the "Team Lead & Technical Architect" for the LiveTiles Tri-Cities office in Richland, building up the internal software development team for the company and returning to the land of C#, Visual Studio, and Windows.

As I'm sure every economic development office in Tri-Cities would tell you: LiveTiles was attracted by the lower cost of living (see chart on the right), time-zone difference from Asia (more forgiving than US East Coast), and the availability of technical expertise in the area. Combine that with the generosity of time and resources from Port of Benton and Washington WorkSource in helping an out-of-town Australian step off a plane, open an office, and hire two employees in a month, and you've got a great story about how Tri-Cities is ready for international business to take root and flourish.

My unique perspective that has shocked a number of people that I've related my new job to is that they also chose here because they consider us "close to Microsoft". Three hours in a car might seem like a while to us, but compared to a cross-country (or trans-pacific) flight, we are next door neighbors.

Being down the street from the largest software maker in the world (by revenue) gives us a unique advantage we need to seize. Not instead of completely independent business efforts, but in addition to them. I believe the tech community at large has never really embraced this proximity to Seattle - since a lot of Tri-Citizens spend a lot of time redefining ourselves versus "them" - and I do hope to nudge us more toward accepting our geographic happenstance, as we were so able to in the last century, to take a new strategy in attracting and building something new in this desert.

Flex Mobile

I once met a man in Room to Think who had a lot of crazy ideas. Chief among them was having me make something new for him and his company - a way to make the lives of roadies easier by moving the tedious tracking of their gear from the desktop to their pocket - and building a software team in the middle of the desert. His name was Jeff Payne and he wanted me to make an iOS app for his company Flex Rental Solutions.

Life at Flex Rental Solutions

After a small misadventure in Node.Js, he hired me full-time in November 2013 to build the new Flex Mobile application in Objective-C. By and large, it involved sitting in my windowed office and convincing an esoteric combination of CocoaPods from the web and Objective-C from my fingers to make life in the warehouse easier. Rather than teams of people pushing a cart with a computer on it, or moving equipment past a station on the way to a truck, they can simple pull out their iPhone and scan away.

The more interest stories involve the people encountered along the way. Too numerous to mention. Flex hired Maria Barker, at the time a city of Richland employee with a background in accounting, to do QA. Under the tutelage of Courtney von Nieda, she waded through spreadsheet after spreadsheet of test cases to become the new head of QA by the time I left. Erin Schmidt was hired for UX design and helped not only solve the problems introduce by iPhone 6+ (AKA "Clown Phone"), but also generally relieved me of having to make my own art assets. The world is better for it.

The app hit the iTunes store in December 2014 and is the industry's only mobile solution for helping roadies spend more time with gear and less time with computers. We felt like a team of rock-stars helping the people who help rock-stars make the world a little less difficult one pocket at a time. It was a unique opportunity to help a small team grow and Tri-Cities proved to have everything needed to build something new. It was a once in a lifetime experience in many ways, and I will miss the Flex team as I move on to my next challenge in my career. 

But it didn't stop there...

Guns of Ireland

Jeff Payne is not just a Java developer who spends all day stroking his chin and wondering how to make inventory systems more like accounting systems. He is trained in theater and has a background in professional performing arts. He can write code, but he can also write a lot more.  In my time at Flex, I got to not only see a new team of Tri-Citizens redefine what iPhones can do for roadies, but also a new team of Tri-Citizens redefine what Tri-Cities can do for Irish history with Guns of Ireland.

Jeff has a trunk of terrible and beautiful ideas that he carries with him every day and he's not afraid to throw it open and start shuffling through them like Carrot Top in line to get on an airplane. One day he pulled out and blew the dust off of one of his better ideas in front of Mike Speegle, writer extraordinaire and the finest beard in Eastern Washington: an Irish jukebox musical. Mike, being more Irish than a whiskey-soaked potato on St. Patrick's day, leapt on the idea.

The Flex team got to watch their hair-brained schemes transition from conversation, to rough drafts, to a lot of mysterious time away from the office, to a workshop production, and finally, a real world premiere performance on Friday, May 1st. I've been watching with great anticipation and must say it blows my mind every morning to wake up to something like this in my Facebook feed...

A bunch of kids are about to make history in May, the final effort of hundreds of hours of work that all started in the Flex office. I am hopeful this will be Jeff Payne's enduring legacy for Tri-Cities and a chance for all of us to be reminded that there is no limit not only to what you can do, but to what others will help you do. All you need is a bunch of people and a crazy idea.

PS: I said one of Jeff's "better ideas". His best idea? I guess we'll have to wait and see, but it involves yet more music and beverages. Prepare for Tony acceptance speeches!

The Voltron Theory

Something happens when a group gets "too large" and suddenly it all transforms from a conversation into a cacophony and a team into a mob. Yet, going it alone is usually impossible if the task at hand is at all complicated. Assembling IKEA furniture is probably best done as an individual, but things like raising a family, having a stand-up meeting, or shipping a product is definitely a team sport...

If you want to go fast, go alone.

If you want to go far, go together.

-African Proverb

...so, what should be the limit for a team in a creative endeavor?

One person is a loner, prone to fizzling out. A loner is not a team.

Two people are technically a team, but too likely to devolve into a loner.

Three is the start of a team, well and surely.

Four means a possible 50/50 stalemate on key decisions.

But Five. That's the perfect size for a team. How do I know this? Well...

Five is what I like to call "A Voltron".

A Voltron is the maximum number of people that I intuit can organically form a team without sacrificing the autonomy necessary to perform creative tasks, brainstorming an idea, or building something that requires expertise mixed with improvisation. In my opinion, it is the apex of the sum being greater than its parts, before diminishing returns on the number of minds and hands on the project drags you down.

I have arrived at this number after a myriad observations - none of which necessarily compute into an airtight, fallacy-free articulation of the idea. Here are some consideration:

  1. A table of five people tends to have one continuous conversation, where as six is where an ebb and flow between two or more trains of thought. This is the beginning of what I would call a "Congress", not a "Team".
  2. Five means diverse disciplines for tackling diverse tasks (like 3 and 4), but also the raw numbers to apply more than one person to complex tasks
  3. When watching sports with large teams (Footbul, American Football, etc), they always have to squander resources on players who do not interact with the ball, yet in small team games where they have almost 100% active players with the ball (Basketball, Hockey, etc), they only allocate about five people, which makes me think that's an optimal number.

I believe sticking to a Voltron is optimal in numerous situations, such as: any meeting where you require the consultation of all attending (rather than just to inform those attending), teams for organizing events, and teams for shipping new products. Best case scenario, a group of people larger than a "Voltron" can aspire to be a "Tribe". Tribes have a shared set of values, are allowed to be individuals, and can have leeway to make unique contributions, but in the end, they are more likely to pick berries than land a wooly mammoth.

If we really want the Tri-Cities Creative/Tech/Startup/Bootstrap Community to start taking control of its destiny, then I would propose we do it by focusing on building many Voltrons. We can be one tribe, but a tribe must form into teams if they are to solve a single problem efficiently, stick to a single course of action, and ship a single product. Now that we've found our people, we each need to find our Voltrons.

Now that we've found our people,

We each need to find our Voltrons.

Inspired Questions: Simple Social Sharing in iOS

While building Inspired Questions, I needed a way to share content on Facebook, Twitter, E-mail, and via Messages, basically, the whole suite of easily integrated items since iOS 6+. To make it easy for myself in the future, and anyone else seeking to make a more social app, I captured a standalone class called SimpleSocia as a GitHub gist. Here is a brief introduction:

Simple Social

SimpleSocial is an Objective-C class that provides a means for finding if services are available. To check if a service is available, just call one of the class functions:

Twitter and Facebook are only available if the device is iOS 6.0+ and the user has logged into the service using the Settings app. Mail depends on being logged into some Mail provider. I never found a permutation where SMS was not available; it just redirects to Messages on the device.

It's always best to conditionally show the sharing feature if the service is available. For instance, if you have a "Share to Facebook" button, you can set the hidden field based on the value returned by the "isFacebookAvailable" function. Once you have confirmed a service is available, you can simple make an instance of the SimpleSocial class, then call the relevant dialog function.

For instance, let's assume we have a UIViewController subclass that wants to show a Facebook dialog when a button is pressed:

While this is certainly one of the more terse gists I've saved for Objective-C, it is probably one of the more likely to be referenced again given the prolific need for social integration in mobile apps. New variations of the dialogs that provide photo-sharing are  likely for the future, assuming I can find an excuse to evolve this simple class a little further.

Inspired Questions: Simple Databases in iOS

Call me a spoiled .Net developer, but I still find iOS APIs to be a bit laborious. When I get to the end of analyzing the documentation, programming samples, and stack overflow threads to solve simple a problem, I have a consistent feeling of "Wow, I had to use every tool in the toolbox just to turn one screw".

To help other developers who might be facing some of these problems, including myself in the future, I've dropped some simple classes into my GitHub Gists to solve recurring problems. While each existed in some form before starting the project, each one was perfected while building Inspired Questions.

Simple Database

CoreData is one of the most powerful libraries in the iOS developer's arsenal. It provides a visual editor for data models and object-relational mapping (or ORM) to Objective-C objects. Unfortunately, the process to get from the shiny editor to real objects in code involves mastery of a small constellation of classes: NSManagedObjectContext, NSManagedObjectModel, and NSPersistentStoreCoordinator. The SimpleDatabase class seeks to abstract away the details of these three classes, plus offer some convenient functionality common to most apps.

It is intended to serve as a base class a more specific "Database" that offers a smoother facade for your application's data. The sub-class must designate the Data Model by setting the "objectModelName" property, then name the file by setting the "fileName" property. Subsequent data access after setting these fields will result in automatic initialization of the CoreData objects and availability of the database to the app.

The SimpleDatabase class is the logical continuation of the Master-Detail project template's CoreData features in the master ViewController, except that is is all refactored into one file instead of egregiously sprinkled throughout the user-interface.

Using SimpleDatabase

To start using SimpleDatabase, I do the usual CoreData design work: make a new Data Model and create the tables and relationships within it for my app, then generate the NSManagedObject sub-classes.

Then I drop-in the SimpleDatabase class. I create a sub-class of SimpleDatabase that is only accessible as a singleton. Usually, the app requires the ability to create, fetch, and delete instances of every type in the data model. Concrete implementations for a type named "Task" might look like:

- (Task *)createTask
{
return (Task *)[self create:@"Task"];
}

- (NSArray *)fetchTasks
{
return [self fetchAll:@"Task"];
}

- (Task *)fetchTaskById:(NSString *)taskId
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"taskId == %@",taskId];
return [self fetchOne:@"Task" withPredicate:predicate];
}

- (void)deleteTask:(Task *)task
{
[self deleteOne:task];
}

It should be evident that importing one class and creating short methods for each type is easier than starting from scratch. In the future, some ability to generate these declarations programmatically might be a convenient time-saver (I would consider making a set of macros...if I were not grappling with a puritanical bias against them).

There are also helpers for building NSFetchRequest instances and conveniently converting them into NSFetchedResultsController objects, where you can easily wire them to your UI.

Best Practices for SimpleDatabase

Always access the SimpleDatabase instance from the main thread. Since the SimpleDatabase only creates one NSManagedContextObject, you MUST only access the data from one thread in your app. It should be simple enough to modify the class to setting up many contexts for many threads; however, I've yet to have an app demand it.

Always make the child class of SimpleDatabase a Singleton. If you do make more than one instance for a Data Model in the app, then you will have competing copies of the database trying to save to disk. It's possible that is desirable for your app, but in most cases, there is only one set of data that is used whenever the app is run.

Always try to add model-specific functionality as a Category to the specific model class (NSManagedObject sub-class). Avoid the temptation to burden your database class with model-specific logic whenever possible. Network serialization for the model and model validation are great examples of methods that belong in a Category.

Book Review: The Lean Startup by Eric Ries

Around here, we're used to the idea that science is business, but rarely do we think that business can be a science. The Lean Startup is about turning business activity into an experiment-driven science, focused on avoiding waste by building products people actually want to use.

A lot has been written about the ideas across the web, so much that even the word "Lean" has that over-saturated ring of alienation. However, upon reading the source material, rather than the echoing of blogs, I can say that Lean Startup does present a lot of potent ideas. They are simple to understand, sometimes difficult to embrace, and perhaps the potent change agent the culture of business needs to move from management to science.

Ideas Worth Spreading

The book itself proceeds with the usual business book process of anecdotes as object lesson, plus direct commentary on the techniques that would sustain the positive stories or correct the negative stories. The motif is always on incrementally testing assumptions in the real world, with simple solutions that attack the uncertain risks in customer behavior rather than the technical challenges of building a solution.

At its core, its techniques are about defeating human syndromes and failings, from overcoming the assumption that you know what people want to looking back and always seeing a result as a success. It dovetails with the programming techniques de jour of Agile/XP/Scrum, where starting and steering in a cycle is emphasized over classical waterfall techniques. From a programmer's standpoint, it looks a lot like the ethos of Agile, just applied to all business activity and customer analysis rather than just programmer activity. Just call it "experiment-driven requirements gathering" and most developers would be on-board.

One Book With (Too) Many Tools

As far as criticisms for the book, I find the only issue is the duality of its audience. It struggles to please two sets of people:

1) Intrepid entrepreneurs looking for a shovel to plant their seedling in the most fertile ground they can find

2) Energized middle managers in large companies looking for a hammer to smash the icons and dogma of the status quo

I do believe the lessons of Lean Startup are relevant to both audiences; however, there is a detriment to crafting an instrument intended to serve dual-purposes, rather than focusing on what a single audience needs. The concepts are so simple that you could make a ninety-page book for each audience, but instead, they have three-hundred for both.

Why Tri-Cities Needs to Think Lean

Growing up in Richland, I've hear of a lot of so called "Research & Development" companies that require huge initial investments just to go from research to development on projects. Their first product is a pitch that must land six, seven, or even eight figures in grants and investments; otherwise, they are almost dead in the water. The person giving you money for the idea is no longer the customer, it's some panel of experts. Unfortunately, that baggage of a big leap, heavy debt entrepreneurship permeates the mind of the employees and stymies them when trying to do something independent.

Also, the book made me realize another dimension on why patents are bad: if you're chasing patents, it means you can't steer a business. You're not worried about adapting to the customer or the market, you're worried about distilling a solution to a legally recognize unit. Immutable perfection is not an achievement, looking for it is a losing strategy for a Lean Startup. Patents have a place, but they are not the goal of a company, they are a side-effect at best.

The Lean Startup is an effective toolbox for the ideas that we really need:  finding hungry customers then making bite-sized progress, rather than serving a feast without checking for food allergies. Our community is slowly coagulating into teams that will strike out for fortune, Lean Startup principles can be a part of ensuring they are building an opportunity and not just an algorithm.

Tri-Cities Startup Weekend 2013

We live in an economic aquarium. A fish bowl started last century, rapidly evaporating in the desert yet never drying out due to regular refreshment by the federal government. Everyone knows the biggest threat to the aquarium is missing too many regular feedings.

I believe the purpose of the community at large is to evolve how to walk on land. I believe we need to start with field trips outside the bubble, getting our feet dry while the water level is still high. Tri-Cities Startup Weekend was a new opportunity to evolve beyond the fishbowl.

The calm Friday before the storm

Ideas Make Teams That Make Community

While I was, according to Startup Weekend HQ paperwork, the lead organizer, it was far from my work alone. Becca Lingley, LoAnn Ayers, Gary Spanner, and Brett Noyes, our facilitator from Spokane. Ty Mulholland was invaluable in orchestrating the event, but technically in a hospital during the weekend itself, working on the final QA before release of his own new productWe also had a great panel of judges, team of coaches, and some very energetic help from WSU grad students.

Teams are the fundamental unit of a community and economy. Only a team could have put on the event and only teams could hope to make the ideas pitched become reality. The community needs to maintain cultivating potential in individuals, but also recognize that potential is only unlocked and applied through the effort of teams.

Everyone looking at the ideas during Friday night voting

It's better to go with a bad choice than wait for a good choice

None of the ideas needed the weekend to succeed, they just needed some motivation and other people to fill in their own lack of expertise.  A lot of entrepreneurs talked about waiting for the right time, right partner, or right detail. They were missing that the right time is always now and the right decisions is always unknown, because new things are always uncertain.

"Make It Happen"

- The TC Startup Weekend Mantra

The time-constrained nature of the weekend forced teams to decide, because time was moving forward even if they were not. Even though I know they were likely loaded with second-thoughts before taking the stage, they each delivered great presentations and were better for not listening to those doubts and just forging ahead. The learning one undergoes during retrospection often feels like shame, but it is truly growth.

The judges Sunday evening, hearing final pitches

Uncertainty + Uncertainty = Courage

 I was most gratified to see those moments where the apprehension people brought into the event was being replaced with motivation, virtually always from the words of another equally uncertain person. As helpful as the mentors were for guiding a business plan, they were not the ones who encouraged the attendees.

Courage isn't a form of currency. It is not transferred from those who have it to those who don't. It can be created spontaneously and independently, by two or more people who choose to make a team.

Derrick congratulating Kris on coming in first place

The Best Victories Don't Come With a Prize

Startup Weekend is a competition with a prize; however, that is only a threadbare plot device to just get people in a room and working.   The people who experienced the biggest impact over the weekend, who attained the most growth, were not all the ones in the winner's circle.

Abigail, 12, and her new friend Octocat

Startup Weekend is a short field trip outside of the fishbowl. Fins can't turn into feet in just 54 hours. It is one of many moments in the life of a community, but one uniquely suited to challenge individuals to form teams, the atomic unit of economic activity. It helps those at the threshold of "what if" discover what can happen when they act instead of wonder, and I hope the discovery continues beyond.

Until next year: Keep Making It Happen!

TriConf 2013

This summer's adventures around the world were exciting, but my favorite perennial adventure is found right right here in Tri-Cities, at a little event that is nothing more than chairs, ears, and experience... 

TriConf is hard to explain.

I could tell you the "Who" (the Tri-Cities creative community) or the "What" (a loosely structured conference by the attendees and for the attendees), but neither of those aspects capture what it is about. My third year in and I still don't quite know how to explain it to people.

I try to say something like: You listen to awesome people talk about awesome things, so you can be better at work and happier in life.

Always sounds like: Join the cult, the Kool-Aid's delicious.

TriConf is unforgettable. 

Year-over-year, TriConf is becoming less about sharing knowledge and more about something deeper. 

In just a few short weeks since, I may already be turning fuzzy on the details about WebRTC or Functional Reactive Programming, but that's why I have the TriConf 2013 Vimeo Channel. I do think the domains of personal and professional are very blurry at this point, but in the greatest way possible. I admit that the content of the stories of struggle and vulnerability are slipping away, but the courage from them and the admiration for people who shared them only grows.

TriConf's permanent effect can be explained...

People will forget what you said.

People will forget what you did.

But people will never forget how  you made them feel.

- Maya Angelou

And in that respect, TriConf is unforgettable.

PS: Shortly after TriConf I was emboldened to write a very personal Pot Luck post to similarly share my vulnerability about being a young father-by-choice. After my wife, sister-in-law, mother-in-law, and oldest daughter read it, through streaming tears in some cases, I realized that TriConf's unlocking of courage and expression through vulnerability is not just for a deeper sense of belonging in a community, but something that can powerfully reach and ripple beyond one weekend in a little library.

Umbraco CodeGarden 2013

I'm belated writing on the conclusion to my trip to Europe in June. There is a lesson on failing to stop and smell the roses, but I haven't time for that:

Umbraco-CodeGarden-2013-Badge.jpg

While in Denmark for the first time this year for Addisolv, I attended Umbraco CodeGarden 2013, the three day conference (or, as they say, festival) for the Danish .Net-based Content Management System (CMS). Umbraco is open source and emphasizes its friendly community, making the personality of CodeGarden extremely different from the usual corporate .Net product conference.

Photo by Doug Robar 

It very swiftly lived up to the "Code" in its name when the keynote only took about ten minutes before jumping into JavaScript. We got a preview of the shiny, new, Angular.js-powered back-end for Umbraco 7, which looks like it will rectify the outdated look of the back-end tools for administrators. By putting the software and developer experience first, the conference immediately took on a tone of knowledge sharing rather than corporate salesmanship.

Umbraco-CodeGarden-2013-Erik-Ralston-Marc-Stocker.jpg

Umbraco really emphasizes its friendly community, and friendly they were. Most people seemed to be from just around the geographic corner. For instance, Marc from Germany was a hybrid devsigner able to talk branding strategy or Umbraco pipeline. Denmark, Holland, and England seemed to be the largest contributing nations. The diversity did force a lot more spoken English, which was a relief after a week of being surrounded by culturally encrypted communication.

Umbraco-CodeGarden-2013-Erik-Ralston-Janae-Weidmeier.jpg

Plenty of other American attendees did make it, such as Janae and her friends from Mindfly who are also from WA. On the final day, recovering from the mind-blowing experience of Umbraco Bingo, a conspiracy formed to bring some of the Umbraco culture to the US. Joining the North American Umbraco Users Group and Umbraco USA LinkedIn Group are two ways to get connected as it happens.

Umbraco CodeGarden was a fantastic experience. The best aspect of open source products is when people can feel like contributors instead of just customers. It was a chance to enumerate group accomplishments and look forward to more, rather than just waiting for the next command from the mothership. I hope I can return to Copenhagen to celebrate another year at the best .Net software festival in the world.

Copenhagen 2013

I've spent this week in Copenhagen, Denmark, getting to know my colleagues at Addition, getting ready for Umbraco Code Garden, and admiring a beautiful city, on my first trip off the North American continent in almost twenty years.

Copenhagen is a beautifully historic place steeped in contrasts. The most obvious is the architecture, baroque brickwork next to global corporate headquarters, but more subtly it's about preserving tradition, but not being bound to it.  An important mindset for the developer.

Other fun facts include:

  • A city really can run on trains and bikes
  • Netflix can help you involuntarily learn foreign languages (due to licensing weirdness, a lot of the movies lock the subtitles on) 
  • Rye bread is serious business
  • When coming to Europe, get a credit card with a PIN code
  • A Macbook, a European power adapter, and your body can be used to make a circuit

Copenhagen's Skyline

A lot of people get confused when I try to explain that Addisolv is the American branch of a Danish company named Addition. Just the name can be a stumbling block: sometimes they think "Edition", sometimes "Audition" - seeing the logic behind the American name change?

A simple perspective on the company is that there is a very successful Danish CMS system, Sitecore, that has global adoption, those with experience in the system are in high-demand. Addition has a ton of experience, not just making it work, but turning it from a tool for making webpages into an enterprise-powerhouse.

I was charged with smuggling my Danish cohort's best practices and good advice back to America. It was great to finally meet the cast of characters on this continent, and finally confirm they weren't just part The Danish Matrix (which runs on human power - bicycling humans).

In a lot of cases, I was able to finally put a face to a voice (and Skype avatar). Chief among them is David, my partner for the last 4 months of my professional life. In the digital age, it's possible to communicate across the world, but it's still so much better to connect face-to-face.

Four months with David's voice and I finally got to meet him

My first week was all about finding my way in the city, getting to know everyone around the office, and getting in site-seeing when I could. I finish out this week at my real reason for coming: Umbraco Code Garden 2013, THE conference for the open source .Net CMS Umbraco (another Danish web creation where Addition shines). As one of the cornerstone technologies for Addisolv, I hope to take back some practical knowledge, perhaps some new contacts, and of course an authentic Danish tech conference T-shirt.

Portland Startup Weekend: ScoutAbout

This past Friday at Portland Startup Weekend I was faced with a choice about what to work on for the following couple days. There were a lot of great ideas and we were approached by a lot of eager hustlers. I chose to join with a positive attitude and, perhaps more practically, ready to utilize familiar Microsoft technologies to build our prototype. I chose ScoutAbout.

What is ScoutAbout?

Scoutabout, as originally conceived, is intended to be a web and mobile application that provides an innovative space for users to create their best day in any city of the world. It would enable users to create a day's itinerary as a shareable object across social media, unlocking the knowledge of local "scouts" willing to share their knowledge.

Naturally, products pivot and drift over the course of the weekend, so what we prototyped and what we presented differed in a number of ways. In the end, it was more like an airbnb, enabling anyone to be a travel agent. For this post, I'll just concentrate on the prototype, which is more like the former idea than the latter.

Resources & Constraints

Our basic prototype is the read-only desktop web experience. It was built by five developers from about noon on Saturday to about 3pm on Sunday (with a healthy 7 hours or less of sleep in-between). It features some marketing fluff: a landing page, basic blog integration, team page, and slideshow of our Windows Mobile wireframes, along with a fully functional prototype of browsing days, viewing their details, and also searching by city.

Despite enabling us to implement quite a lot of features, I do think five developers is perhaps overkill for a Startup Weekend. Likely a team experiences diminishing returns past two devs if they can't work on more than one distinct aspect of the product; however, the five developers seemed to represent 100% of the Microsoft web developers at the event and it enabled us to do a lot of work for real that might have otherwise been faked.

We built it using a host of Microsoft-based web technologies, including: ASP.Net MVC, C#, Code-First Entity Framework on top of SQL Server, MVC Scaffolding, JavaScript with jQuery, and Twitter Bootstrap. It was hosted on Windows Azure with collaboration on GitHub.

Walkthrough

The prototype is available (for the foreseeable future at least) at:

ScoutAbout.azurewebsite.net

The basic user experience when starting from the homepage unfolds in the following steps.

Landing Page

ScoutAbout Landing Page

The user greeted by a description of ScoutAbout and a message about its founder, True North. It's a lot of text to hit them with up-front, but it's a useful preface considering it's not a functional product at the moment. We produced a short video, that was ultimately slimmed down for the presentation, that I believe would be an excellent focus for a real landing page to introduce the product to users.

Best Days

ScoutAbout Best Days Page

The Best Days page is a master list of highly rated days within the system, daytime itineraries for getting around a city. The user simply clicks on an entry to go to its details page. After staring at the screen for a few hours, both Jon and I agreed that it would be better as a denser, more Pinterest-style, grid of pictures that have a more lightweight scheme for displaying meta-data.

Best Day Details

ScoutAbout Best Day Details Page

Finally, the Best Day details page displays the daytime itinerary for the day, describing it with a timeline and pictures, plus allowing users to share the day over social networks. In the real product, days would be a full 24-hours, and they would include varied data such as tips on the day and contact information for the attractions.

Conclusion

While only a simple read-only demo, the ScoutAbout prototype garnered largely positive feedback from the judges. I had a fun time making it with a great team. Perhaps if we had started on Friday night we could have added more interactive "Wow", but I still believe it's best to wait for at least some customer validation has taken place before starting so the product you're prototyping can be as close as possible to the product you're pitching.

Portland Startup Weekend

I've barely recovered from an intense three days at Portland Startup Weekend, my first Startup Weekend Experience and an unforgettable experience of competition, code, and camaraderie.

I was finally induced to go to Startup Weekend because I'm conspiring to bring it to Tri-Cities and you have to go in order to organize one (more on that on a later date). My brother-in-law is in Portland so it was logistically simplest to attend. Finally, I've always been looking for a reason to meet up with a Jon Morales, who I bonded with over an open source project years ago and finally found an excuse to lure over to the west coast.

Friday

Portland State Business Accelerator

I arrived at Portland State Business Accelerator, a tech incubator I would sorely like to see replicated in Tri-Cities. I met with Jon Morales and Chad Downey, who both flew in from DC for a long-awaited meetup in meatspace. We settled in and tried networking amongst the 100+ Hacker, Hipsters, and Hustlers (their titles for Developers, Designers, and Business folks), as best we could in a cacophonous main room. We proceeded listen to about 45 pitches (so, an almost 50% participant-to-pitch ratio, very encouraging) to vote on the best ideas. We then formed teams around the best ideas.

When deciding on your team, it's really important to base your decision not just the obvious cleverness of the idea or ability to work with the desired technology of the founder, but you need to also trust your instinct on the vibe of the group when you approach. You've only had 60 seconds to listen to the "founder", but you get a few minutes to mingle with the team before it's final, so take that time to try to determine if they're going to be a herd of drama lamas.

Jon, Chad, and I chose ScoutAbout, and I believe we chose wisely.

Friday night was basically about getting to know each other, taking an informal inventory of skills, and setting a great expectation for the weekend.

Saturday

Team ScoutAbout

Team ScoutAbout

Saturday began with trying to layout an initial timeline for the day, which immediately starts sliding as every detail starts cascading into conversations about how to best quash the issues. We did "Get Out of the Building" to do some customer validation in the Portland Saturday Market. We then returned and laid out our best guess on an MVP. The 5-person software team, all .Net developers, went to work as quickly as possible.

We tried to use a number of .Net's rapid prototyping technologies, including Code-First Entity Framework and MVC Scaffolding. In the end, it's important to remember that while the weekend does bring together software devs to work on perhaps real first day of a real business, there is a delicate balance between what is faked for the purposes of Sunday's 5-minute presentation and what is potentially foundation for a real product.

Our biggest technical challenge wasn't actually code, it was source control. I had urged the team to use Git, which everyone was more than happy to go along with before the GitHub for Windows client started detaching heads like George R.R. Martin. While Git is good with moving the source around, the merge tools are definitely inferior to the MS dev's experience with TFS. Next time, I guess we should just use Subversion.

In my observation, you only need a real back-end if you plan on offering a demo on Sunday that shows both read and write interaction across more than one client; otherwise, do yourself a favor and just use JavaScript plus LocalStorage to show a pretty version. In the end, we cut our write features, so we ended up with something very heavy for a read-only demo.

Sunday

Sunday is all about the final five minute pitch, plus five minute Q&A with the judges. We had to do a lot of work pulling together the prototype in the morning, but by the afternoon it was just about pulling together the slides and content. The Hipsters and Hustlers were working furiously, the Hackers were just searching for areas to plausibly polish without breaking anything.

Mentors did keep coming by and providing feedback. While it's certainly important to be flexible with your idea on Friday and Saturday, Sunday is all about churning out 5 distilled minutes on the idea you have customer validation and a clear business model around. In the end, feedback on Sunday is better put to use as a vision for the future past Monday rather than trying to incorporate it into the pitch.

The live stream of Sunday night was uploaded to YouTube and our pitch is about 45 minutes in. As you can probably see despite the low quality, the impromptu nature of the pitch means authenticity and energy are, in some ways, more important than quality content. Also, unlike a purely VC-targeted pitch, it's not just about the product it's also about all the effort over the whole weekend.

In The End

After all that hard work, we didn't end up in the winner's circle. The teams who did, Wijjly, LivFly, and my personal favorite, Freezepup, richly deserved it and I absolutely relate that one of the purposes of Startup Weekend is to allocate the resources of a community behind it's members who have focus and promise.

I am so proud of what Team ScoutAbout was able to accomplish in just 54 hours. I'm thankful to have found people who made my first Startup Weekend experience great. I hope our founder True, and perhaps whatever parts of our team are willing to stay on, will keep moving forward with her vision. Ultimately, the judges gave a result, but since I am so eager to do it again, I feel like we all won.

Team ScoutAbout in Action

Output Caching in ASP.Net MVC

When building GotThatGame.Com I tried to avoid making a quest for something useful into a vendetta for perfection; however, some improvements only take moments in MVC so I took a moment to apply them. Output caching in MVC is a simple performance improvement that keeps the HTML output of an action in memory and serves subsequent requests quickly from memory.

To enable it for an action, simply apply the OutputCache attribute to an action and when it's called. When first implementing, I could think of a few complex scenarios that left me with lingering questions. For instance, child actions seemed to obviously be not subject to independent caching, but what about redirect actions?  I put together a demo solution in Visual Studio that is available on GitHub:

Output Caching Demo on GitHub

It contains demos for actions, actions with children, and action with partials, plus redirecting between actions. Spoiler alert: it only caches if the root action is attributed, and only stores everything; except when it doesn't. It's likely the most thorough introduction to output caching a programmer can find on the internet.

GotThatGame.Com: Free Time

Most projects must find a way to cope with limited resources, but side projects most of all. Even if all you have is spare time, no budget, and a good idea, you still need to ship. When I was building GotThatGame.Com, I found my most limited resource was "free time".

Nowadays, money and materials aren't limitations for a little project like this. The Steam Web API does not charge a fee. The GotThatGame.Com About page very briefly lists a litany of technologies utilized on the product, each of which is no cost. It is currently hosted on Windows Azure for free for the next 90 days. The real constraint was time.

Unlike other commodities, time cannot actually be bought or sold. You can have some that is "borrowed" and perhaps you could trade time for money for something you don't want to "spend" time doing. Once it is consumed, it becomes another commodity entirely: experience. Experience cannot be refunded back for time, though it may allow you to "save" some from time-to-time.

Experience is like a tattoo. It's permanent. Ideally, it is beautiful. It can sometimes be regrettable. You can show people the visual, but rarely share the true meaning. There is only so much that one person can accumulate. After a while, it will all start to blur.

Experience is also intensely valuable. It is the only commodity you can mine every hour of the waking day. Oddly enough, I spent more time making GotThatGame in a month than I spent playing video games in that month. I doubt it will ever save me more time than I spent making it; however, I got more experience out of it than the XP offered by any game.

I don't want people to feel guilty about time with family or time with friends, but even a gamer like me starts to feel growing guilt after the 60th minute of gaming in a day. When you're spending your "Free Time", what are you getting for your investment? Do you want that forever?

PS: Most of that time was made free by my wife Morgan and daughter Melodie. My side projects are not just experiments for my professional skills, but also a monument to the personal support of my family.

GotThatGame.Com: Easy Js & CSS Minification in .Net MVC with Combres

One problem that came up when building GotThatGame.com was the issue of minifying JavaScript. The Combres package for ASP.Net MVC was recommended to me by a coworker and turned out to be a fast and easy way to minify, combine, and cache JavaScript and CSS.

As documented on their site, just run "Install-Package combres.mvc" on the package manager console, add Js &CC entries to the XML config file, and you'll be able to easily drop links into your Razor views that magically turns into efficient compact output.

One catch I found: Debugging Js  in Combres can be problematic. During development you can turn off minification in the Combres config file; however, Combres' generated links will keep changing names when you change Js code, which makes debugging in the browser clumsy. I found a simple solution involving changing your Razor view output that could be used for other things.

By adding an extension method to the HtmlHelper class that returns a boolean indicating whether or not the currently build is debug, such as implemented in this GitHub gist, it's possible to dynamically change the output of a view. For instance, you can leave it to the view to decide between vanilla Js links for debug and Combres output for release:

@if (@Html.IsDebug())
{
    <script src="~/Scripts/jquery.tinysort.min.js"></script>
    <script src="~/Scripts/Steam.js"></script>
}
else
{
    @Url.CombresLink("appJs")
}

You can make similar @if patterns for Combres CSS switching. Obviously, other applications likely abound.

Combres cut down load time for GotThatGame after only minutes of configuration. Coupled with MVC output caching, it will save some time for the user without taking a lot of time from this developer.

GotThatGame.Com: Compare Your Steam Games With Friends

Recently I had a LAN party with friends. That's right: a router, a rat's nest of cables, and clicking. We kept coming back to one question...

What Should We Play?

It was a question that usually spawned a few minutes of shouting out games, then ultimately falling back to a handful of stalwarts when we realized we each have managed to accumulate hundreds of games and would rather play than pick through them to find what we had in common.

Since most of our games are on Steam, and that means it's all stored in some cloud somewhere, it should be possible to compare collections automatically. After 15 minutes of Googling and finding nothing, and having been primed by $100 Startup to listen for people's needs, I set off to build what has been dubbed: GotThatGame.com.

Compare Games, Instantly!

GotThatGame.com enables you to find your Steam profile, via browsing by friendly name or logging in with your Steam ID. It then automatically loads up your friends and games. Just click on one or more friends and it will automatically load their collections and rank your common games. You can hover over the game list to see who has each game and who might need to think about buying a copy.

As of today, it's an MVP that fulfills its basic purpose: finding games to play right now. It could be a little prettier, it could be a little more robust, but it's useful now and I'm gonna put it out there and see what people think.

In the future, I'm considering features like shareable comparisons with social integration to help spread the word and the ability to rank games by how much it would cost to get everyone a copy (rather than just by commonality right now). I hope to get other good ideas on how to harness Steam's data to make gamer's lives a little easier.

Give It a Try

If you're a gamer, or know a gamer, with a Steam game collection, please head over to GotThatGame.com and try it out. You can share feedback by commenting on this post or mentioning the @GotThatGameApp on Twitter. Let me know if it worked for you, what might not have worked so well, and how I can make it better.

Running Lean: Innovation Accounting

Today I attended a webcast at Room to Think on Innovation Accounting: How Lean Startups Define, Measure, and Communicate Success by Ash Maurya. It was the first of hopefully many more video-related events at Room to Think, and my second brush with the "Lean Startup" philosophy after the all-day simulcast of the Lean Startup conference in December.

First of all, I'm not of the MBA mindset. "Risk Management" and "Business Model vs. Business Plan" are not natural topics to reside in my mind. Like many programmers, I have a knee-jerk reaction to dismiss a lot of biz talk as useless. However, if you get on a team that doesn't have a playbook at all, you'll quickly discover how chaotic if can get on the scrimmage line. A collection of understandable, even sometimes obvious, tenets is better to have on hand than just assume your common sense is everyone's common sense. In my perception thus far, Lean does the least bad job coexisting with the reality of software, so I am willing to continue risking its acquaintance.

A lot of the content of his talk dwelled on how to physically use his Lean Canvas process, where a structure mind map is developed around a business and their vision, strategy, and product. Despite the lack of riveting delivering, there is something alluring about a paint-by-number system for analyzing a business, making it structured makes it brief and repeatable, like a Design Pattern for business. A lot of the content of the talk was seemingly re-purposed from his two blog posts here: Lean Canvas Part 1 and Lean Canvas Part 2. Read up if you're interested, I'll spare the summary here.

In the follow-up discussion in the group, we more stepped back to how our personal views were affected by the larger implications of a Vision-first approach to a business, rather than the ever-tempting Product-first approach. The core purpose of a new business is not to "get a new product to market ASAP", but to "find what people want and charge for it ASAP", and Ash was persuasive in this argument.