Author Archives: Matt Warren

Truly innovative ideas are supposed to come to us in an “A-HA!” moment.  That rarely happens though.  Most good ideas are simply cross application of other ideas.  Great ideas on the other hand require hard work and time to develop.

Sir Isaac Newton was a brilliant man to be sure, but when asked how he invented calculus his response was that he had simply taken the time to think deeply about it for long enough to figure it out when others just simply hadn’t thought about it before.

This seems to be a theme for many difficult tasks.  Taking the time to really wrap your mind around something and go deep enough that you can fully understand things opens up new doors.

Discovery also happens when you take the time to explore with an open mind.  I have worked on many projects where we have learned so much about how to build a particular type of system during development that by the time it was finished we wanted to go back and re-implement everything with what we had learned.  There are technical choices that cannot be fixed easily with simple re-factoring.

Some aspect of ‘wandering’ to try to feel out a particular idea can really help nail down a stronger direction for a project.  Maybe you consider this a prototype stage (but all too often I’ve seen prototypes turn into production systems).

Wandering promotes more risk taking, more throwing out of bad ideas.  I think wandering allows you to be more critical of the ideas you come up with and that in turn leads you to better innovation.

 

 

Settling for the status quo in life or in business is a sure fire way to disappointment and obsolescence.  Without growth there is stagnation.  It is therefore important to always look for ways to improve things – everything.

Challenging the status quo is easy.  You just need to look for answers to questions:

  • How can we make this easier/faster?
  • How can I find more time?
  • How can I make this better?
  • How can I communicate better
  • Is there something new that I should learn to make solving this better

In each case you want to evaluate what other people have already figured out for these types of questions. And then take a further step.  Can things be improved beyond what anyone else has figured out?

When it matters, it is important to take the time to think outside the box and try to really go deep into finding a better way to accomplish something in a new way.  These are chances to make a zero to one leap with your business or your life.

Sometimes I think I work too hard.  Code all day, come home and code for a few more hours at night, and occasionally read a book about coding.  I do this because I really enjoy solving problems on a computer and creating new things.

However this sort of single minded pursuit can lead to burn-out.  A short vacation just isn’t enough to reset and relax.

With that in mind I started to read a few things and landed on this book by Matthew Crawford:

The book espouses the benefits of hands on manual labor as a way to feel good about what you can accomplish and get back to basics to do something good for yourself and your community.

It got me thinking about something I always wanted to learn how to do: weld.  Growing up I had access to a wide range of tools; everything from table saws to gold plating to soldering.  But welding equipment was something we never had, and none of my friends had access to.  So there was a certain mystery to it.

That mystery has stayed with me for 20 years and the thought of being able to weld my own fitness equipment, jungle gym or swing set or a custom built trailer has a certain appeal.  One that I’m finally going to satisfy by taking a welding course this fall.

I’m hoping that having a hands-on weekend project will provide a way to detach from the stress of work and create something fun.

My recent experience with daily freecoding taught me a lot about learning programming and about how you learn new skills.

There were several types of freecoding sessions that I did and each of them proved useful for different reasons.

I had a handful of memorized programs one of which was to program a deck of cards, shuffle the deck and print them all out.  I memorized this and practised several times recalling the whole program and typing it as fast as I could.  Getting fast at this reinforces basic syntax, it improves your muscle memory for typing and helps add to a repertoire of coding patterns that can be recalled quickly.  Since the bulk of programming day to day is loops, string manipulation and parsing, this type of practice can greatly improve your productivity.  However, it doesn’t help with your ability to solve problems.

Other days I would seek out a problem.  Rosetta Code is a good resource for coding problems that can usually be solved in just a few lines of code.  I’d find something that sounded interesting, implement my solution and then compare to the published one. This process helps with your ability to produce code that can do what it needs to do, but also by then reading other people’s solution you often learn about nicer or more concise ways to implement it.

The final type of freecoding I did was to find an interesting library or package I wanted to try out, and implement some examples with it.  From a learning to code perspective this doesn’t help a lot.  Much time is spent going though documentation and the temptation to copy and paste is high.  It did, however, let me explore a lot of variety and learn about some specialized things – such as what you can do with special non-printable terminal characters)

Some ideas I have to make the experience better going forward would be to add a scheduling component.  We remember things better if we try to recall them just before we forget them.  This is the concept used in Spaced Repetition Systems (SRS).  Applying this to a learning system for coding might include a development phase where you create a new piece of code that introduces new concepts and then a handful of recall sessions where you try to re-implement one of those previously created programs at a later date.

My recent camping vacation is what broke an epic 253 day streak of github commits.  Overwhelmingly this activity was a daily practice of freecoding to see first hand just how effective it could be at getting better at programming.

Freecoding is based on a writing technique called free-writing which is supposed to get the juices flowing and eventually lead to you developing a faster thought to fingers connection for getting your ideas out.  It is a popular practice for authors, but has never become something that programmers took up.

With a bit more extensive experience now with the process and it’s effectiveness I can draw some conclusions about how it works and where the difficulties are.

By far the biggest difficulty is trying to think of something original to write every day.  Unlike story writing where you can ramble out words with markov chain like inspiration, the strict syntax of programming forces you to think ahead about what you want the program to do.  I also found it psychologically difficult to finish a program that had syntax errors.  Finally, writing a script is not always easy to to linearly and jumping around the code provides an interruption that can stop the flow of thoughts.

There were a lot of positives though.

  • Finding interesting things to program everyday inspired me to keep a list of interesting projects and try them out
  • It gave me an excuse to test out things like how threading is limited by the GIL in python which I hadn’t run into with my job
  • was able to scour through the standard library and uncover some features that I now incorporate often into my code.
  • got a much better handle on parts of the language that I didn’t use often such as functional programming
  • took time to try some popular libraries in areas I don’t usually get to deal with (mathematics, graphing, and machine learning)

Through this practice I feel like my knowledge of Python was able to reach a new plateau.  Learning by doing and practising everyday is a tremendously good way to improve.

if you are curious what kind of code I wrote everyday for 253 consecutive days it’s all on my github account.

2861575686_146752a32e_zOne of the best ways to improve your business is to manage the expectations your customers have with you.  This is easy to do.  You just tell your customers what you are going to do, and then follow through while communicating often about the progress to meeting those expectations.

The best way to develop and sustain these in a business is to create systems to ensure that all customers receive the same experience.  If you just wing it with every customer there will be times when you forget to follow up or fail to mention something important.  A system can be as simple as a calendar reminder to send an update email, or a template.  These systems reduce what would be decision making and turn it into something that can be outsourced, or done very quickly.

Once your system is in place you have the opportunity to iterate and improve it.  Can emails be automated?  Can you pre-empt objections? Are there opportunities to ask for feedback, provide more information, or request referrals?  With a good system you can track and monitor these messages to make sure customer communication is regular and up to a given standard.

With templates it becomes worthwhile to invest just a little bit of time to make the messaging visually appealing.  Providing reports as a PDF that include some personalization and graphics will make you stand out among competitors who are less organized.

Taking the time to to create a system for communicating and managing customer expectations is one of the lowest cost and highest reward things you can do for your business.  Emails and phone calls are cheap but can be used effectively to multiply your business.

Since Apple announced Swift was going open source and coming to Linux by the end of the year, my interest was peeked again to dive in and start learning it.

With Swift running on Linux servers the race is on to create a compelling web framework so that it will be possible to write iOS apps and server applications with the same language.  A modern type safe systems language that’s still fast and easy to write is pretty appealing.

Working through the Swift book and code examples, I’m finding it to be quite a nice language – especially with the new Swift 2.0 improvements.

Unlike other modern languages Swift still has some short comings:

  • lack of a first class package manager (like pip for python, go get for golang, gems for ruby etc)
  • a comprehensive standard library (Python and Go have tremendous built-ins)

Swift feels quite new and the team at Apple is still making breaking changes to the language syntax.  I’m hopeful that open sourcing the language and bringing it to Linux will open the door to allow other developers outside of Apple’s ecosystem to start learning it.

Play is one of the more undervalued activities we can undertake as an adult, yet it is one that differentiates many of the worlds top performers from the rest of us.  Playtime could be considered to be the pinnacle of Maslow’s hierarchy of needs.  When you are intrinsically motivated and enjoy what you’re doing  you might considering it playing.  It’s fun.

Play is an activitiy which can promote dramatic shifts in learning.  When you are exploring the boundaries of your understanding through play it becomes ok to try and fail, to do thing that might be crazy.  Stretching yourself often enough results in leaps in your skills.

With physical skills the benefits of play are particularly well appreciated.  We go to the playground and become ever more confident with our balance, strength and co-ordination.  These basics translate into other physical skills with bikes and skateboards, and those of us who continue to play like this through into adulthood can reach a professional level.

For mental skills the idea of play is a lot more varied.  It could include anything from board games, to trivia nights to personal challenges to building something or just thinking.

Over the last 227 days I have been committed to writing code every day. Sometimes this is a chore and other times it is one of the highlights of my day.  This daily goal of writing a little bit of code every days is my chance to play with software in a way that I don’t normally get to do with my job.  I have been writing python code for this and as a result of all this play my depth of knowledge has increased dramatically.  It’s code that I enjoy writing and as a result of that fun the positive emotions carry over to my work when I write code there.

Richard Feynman was one of the foremost physicists of the 20th century.  He never stopped enjoying himself or having fun with the work he did. In the book Surely You’re Joking Mr. Feynman it was quite apparent just how much benefit he got in work and in life from being playful and curious with everything and everyone he interacted with.

I don’t believe you can be a top performer in your field unless you can find the joy and the play in what you do. As adults we easily lose sight of this aspect of life.  Play is not only a chance to improve ourselves it is also part of the spice in our lives that can make it worth living at all.

The space to create new innovation is dearly missing from today’s work environments.  Creating a space to really encourage great leaps in innovation requires a few things:

  1. Space and time to think.
  2. Freedom to implement or test an idea quickly
  3. Collaboration to help get over hurdles

Recently I had the opportunity to work in a lab.  It was a bit of a mess – wires strewn everywhere, breadboards, toolboxes, soldering stations all around and within reach.  The mess actually encourages quick testing of crazy ideas. It creates an environment where there’s no limits and its easy to bend the rules to get something working.  If you want to drill a hole in your desk to attach something, go ahead. Run a wire into the next room – poke a hole in the wall.

This lab was in stark contrast to the IT management in which PCs were locked down. In the software world computers are our entire space in which to invent and create. Yet within the constraints of corporate IT the freedom to innovate can be severely restricted.  Without the ability to install software, tweak settings, plug in new devices our hands can be tied. Rather than call and IT admin to get a password to install something we avoid the confrontation and continue on with the status quo.

3507422366_c85fc9b9e2_zIn many ways the modern office is too restrictive to create truly game changing innovation.

I encourage everyone to strive to turn their office into a lab. Create a space where anything is possible!

 

What do you believe is the single most important thing that will affect your productivity?  Time management? Software tools? Calendars? ToDo Lists?  No.  The most important thing that will affect your productivity is your expertise.

Knowledge is the baseline for almost all work that we do in today’s information economy.  We simply cannot produce good information products without the knowledge to do it. And gaining the knowledge as you go is akin to assembling the tractor before you can use it to plow the field. To be maximally effective you should strive to have the knowledge for how to do what you need to do.

There are two aspects to knowledge that can be looked at as it pertains to your productivity.

  1. Relevance – The more relevant your knowledge is to the task at hand the more efficient you will be
  2. Competence – how easily you can apply your knowledge.

When you have relevant knowledge and have competence with it then you have an expertise that allows you to be productive at a much higher rate.

The four stages of competency will give you a sense of how effective you knowledge is towards your productivity. Simply having the knowledge is not enough to being extremely productive.

  1. Unconscious incompetence – you do not know how to do something and haven’t yet recognized that
  2. Conscious incompetence – you realize that you don’t know something
  3. Conscious competence – you have the knowledge but it requires concentration to execute
  4. Unconscious competence– through extensive practice your skills have become second nature and can be performed without effort

It has been said that the best programmers are 10,000x more productive than an average programmer. While this claim is outlandish it exemplifies that people with experience hiring programmers see as truth. The right programmer with expertise can implement quickly while the wrong programmer may not even recognize that they don’t have the knowledge required to do so.  In the worst cases incompetence is a liability – incorrect knowledge applied incorrectly can pose a significant threat to your business.