Category: Advice

  • How to Get Things Done When You Have no Time

    This last month or so has been a hell of a busy time for me.  Working long hours, with a 1 year old at home who needs attention while trying to squeeze in social events, exercise, sleep, reading and personal projects is a lot to juggle.

    How have I managed to rock a streak of 53 consecutive days with open source github activity, learned Flask, read 3 books this month and made progress on several side projects?

    The Github streak never would have happened if I didn’t have a script to email me every hour after 5pm that I don’t have activity on my account.  This simple nag makes sure I don’t go to bed and forget to write some code each day.

    Thinking of things to code each day has pushed me to explore new ideas, practice concepts, study APIs and do tutorials. In retrospect it is astounding just how much interesting stuff you can get done when you do a little bit every day.

    A simple nag will actually make you find the time when you don’t have it.  Several times per week I find myself up later than I would have been otherwise trying to write just a couple more lines of code.  Once you start on an idea it’s not easy to let it go unfinished; it’s hard to commit code that won’t even compile.

    Activity has spiralled off from this daily coding.  A couple days of hacking on some stock market analysis algorithms got me checking Amazon for books,   which in turn got me to completely overhaul my personal finances.  On another tangent, trying to think of ideas for things lead me to a tutorial on Flask and more books on that subject.

    Want to get more done?  I’ve improved on the Jerry Seinfeld Productivity Secret with a simple script to make sure I don’t destroy my streak by being absent minded.  The knock on and compounding effects from all this daily activity has been unexpected and amazing.

  • Why is it so Cold

    This week has been a difficult one for biking to work.  On Friday it hit – 35 with snow.

    Biking required the full snow suit including ski goggles.  Despite the slow slog home it still was probably more pleasant than being stuck in a car, gridlocked and worried about all the cars around that still have summer tires on just tempting fate.  I would much rather be safely off the roads.

    Over the past 3 days Calgary police were called to about 1000 collisions in the city of which at least 57 accidents involved an injury.  And that doesn’t include the number of accidents that didn’t require the police.  Trying to get a grasp of the cost of loss to property (and life) as a result of trying to drive around the city would be a very interesting exercise.

    Luckily this cold snap should break next week and the temperature will jump up by 20-30 degrees for a while.

  • Study Open Source Applications

    I came across an excellent resource last week that more people should know about.

    The Architecture for Open Source Applications is a series of books that examines how some of the best software ever written is designed.

    Programmers rarely get the chance to study the work of others in detail.  You learn the fundamentals in school but when it comes to experience building larger applications it’s not easy to pass on that knowledge in a single semester when writing the code for a large application may take years.

    The books are inspired by how architects learn by studying the designs of other buildings. If you’re tasked with designing an office tower there are no doubt countless lessons that have been learned in the past century about dimensions, materials, efficiency, best practices, capacities for everything from floor space, water pipes, air exchangers and elevators. If architects re-invented the wheel each time they took on a new project almost all buildings would be terrible.

    Software developers do often start each new project as a chance to re-invent everything themselves.  Of course this is a massive risk.  Even the best developers cannot implement the optimal solution to each an every sub problem in a large application.

    Studying design patterns get you part of the way there.  Actually seeing them used in different contexts will deepen your understanding of their value.

    Actually studying the great open source applications will give you inspiration to lean on when solving your own application design issues.

    All software developers should read these books.

  • How to Provide a Great Estimate

    Estimating the cost of developing software is difficult.  Very difficult. That’s because with each new project there are always unknowns, mis-interpretations and assumptions that are not communicated.  If the client knew exactly what they wanted then it would just be a matter of typing it up.  They hire you because they don’t know how to do it themselves.

    Agile development realizes how difficult estimations are by attempting to avoid them entirely.  Instead opting to push clients to time and materials which they have a hard time fitting into a fixed annual budgets.

    Creating an estimate that accounts for uncertainty while fitting in with businesses’ existing processes is non-trivial.

    It all starts by taking the project scope and breaking it into smaller pieces that are easier to estimate effort on.  There are risks even at this early first step that your estimate may be off.  Even with a great deal of thought you will likely overlook things.

    Agile approaches would have you break a project up into ‘stories’ and estimate on those.  I have found that stories generally have some overlap, making it difficult to understand as a line item in an estimate.  I prefer to get down to the level of code structure.

    The second thing to consider in an estimate is that with every guess you make there is some understanding of uncertainty that is not often portrayed.  Creating a login page is fairly concrete, you’ve done it 50 times and are very sure how long it will take.  Creating a custom machine learning algorithm for the application may be a bit more fuzzy. Providing a measure of uncertainty to your estimate turns your fixed estimate into a range of estimates with different probabilities.

    Actually, a machine learning algorithm is useful example to explain my next point.  A good ML algorithm can take time to train and tune and a bad one can be quick. You can take more or less time and still get an algorithm that works.  There is not only an uncertainty but also some elasticity since it is unlikely that an RFP (Request for Proposals) included stipulations on the accuracy of the ML feature.  Elastic features should exist as 2 options on an estimate. 1 for basic implementation and an other that provides a better implementation.  That way the advanced option can be explicitly accepted by the client.

    Next thing to consider is that not everyone’s estimates are equally good.  Some people are overly optimistic others tend to assume worst case, sometimes you have better knowledge that can help cut down the estimate while another person considers things more difficult.  By collecting estimates from many people you can average out their biases and with an open dialog hopefully team members can learn from each other.

    This brings up a couple of major factors that can influence a person’s estimate:

    • Anchoring bias – A person’s estimate can be influenced if they see someone else’s estimate first.  You mitigate this by having estimates done blind.
    • Optimism bias – People tend to want to impress.  It may be to stand out from the team as better, or because they haven’t thought of some of the complexity in a solution. There is a tendency to under estimate.
    • Lack of information – All estimates are made without complete knowledge.  The client likely doesn’t have all the information either.  When you don’t have all the information there is more uncertainty in an estimate.

    Anchoring bias can be dealt with through procedures that make estimates independent of each other.  Games like Planning Poker have rules to prevent anchoring bias (everyone turns over their card at the same time).

    Optimism bias is more difficult to account for.  Perhaps the best (though as of yet untested in software development) approach is to use reference class forecasting to provide some insight given historical realized costs on similar tasks.  If setting up a new server has for the last 20 projects taken an average of 2 days, but the team has estimated it will take 1 day then they may be some optimism bias in the estimate.

    Lack of information is accounted for by adding uncertainty to the estimate.  Although we don’t always know what we don’t know so some amount of unknowns should usually be added as a buffer in the final estimate.

    Using this information hopefully you can create better more realistic estimates for your clients.  If you are a client accepting bids on an RFP you should be looking for bids that detail where there is uncertainty.

  • Life to Old Projects

    Maintenance.  UGH!

    We live in a world where software is part of an every evolving ecosystem of other software.  Everything is constantly changing and everything you do needs to keep up or risk falling into disrepair and creating technical debt.

    The maintenance window is a chance to breath fresh life into an otherwise languishing project.

    A little over a year ago I released FreeSlots, a slot machine game for iPhone. It’s a pretty good game, and I’m still happy with the design although I was cut short on developing it fully. The time has come to refresh it for the upcoming iOS 8 release and that has given me the chance to revisit the code and find some other opportunities to make it  better.

    My original plan was to use FreeSlots as a platform to test some bleeding edge features, and then fork the project into a new game that is better branded, and takes the best lessons I learn from doing FreeSlots, while also spinning off some of the services I create for it so others can take advantage of it.

    It seems that strategy is still a good one.

    So this maintenance tune up, has fired me up to develop some newer, bigger, better things.  YAH for maintenance!

  • Adjusting to Fewer Blogs

    A couple weeks ago I drastically downsized my list of subscribed blogs.  Going from skimming 200+ blog posts down to fewer than 10 per day.  It has actually made quite a difference.  The time saved was used to read more books, which I’m happy to say has worked out.

    Being disconnected from the news has left me not being as aware about things going on.  Previously I enjoyed being the first one to hear about interesting things, now I’m finding it better to let others be the filter to bring only the most critical and interesting news to me.

    It’s actually been a bigger change to my daily schedule than I would have expected.  Reading books feels like progress compared to the treadmill of news streams.  I don’t think I will be re-subscribing to anything soon

  • Long Vacation

    For the last 2 1/2 weeks I have been on a long vacation back home to Newfoundland.  This time we seriously lucked out on the weather, getting in two weeks of 25+ degree sunny days.

    We bookended the trip starting with the Tele 10 at the start and the Regatta to finish things off with a couple days before and after for buffer space.

    I do wish I had more time to get some of the things I wanted done while on my days off.  But this vacation has been primarily about getting a break and it definitely has been good for that.  We took full advantage of the willing baby sitters to visit some restaurants, go to a couple pubs and see old friends.

    The mix of amazing weather, family and friends has made this trip a great one.  All good things come to an end at some time, and tomorrow we leave to fly back across the country and get back to work.

  • Think Weeks

    One of the things Bill Gates did was to take a semi-annual ‘Think Week’ retreat. During this week he would extract himself from all obligations and hole up in a hotel somewhere with a stack of books to read. To Bill Gates these retreats were critical to his ability to stay ahead of big picture trends in industry that might have otherwise surprised Microsoft. Sometimes these retreats resulted in major strategy shifts for the company.

    The rules for these retreats were simple, he was not to be contacted except for emergencies. And presumably he had amassed a reading list recommended to him by his peers over the previous 6 months.

    Bill Gates is not alone in the practice of going into seclusion to fully focus on important things.

    Religious people have been practising seclusion for centuries as a way to deeply explore their beliefs. Many writers are known to use retreats, or hotel rooms as ways remove distraction and get a burst of productivity.

    I know many software developers that find they get a lot done on long flights, and have heard of more than one developer that swears by trans-atlantic cruises as a way to avoid the numerous distractions and become productive.

    Taking time to really think about a problem deeply can often benefit from some isolation. When you are alone in your thoughts and have the time to fully develop your ideas it puts you in a unique position. There are so few people who think deeply on topics. Most decisions are made by impulse and intuition – which often is good enough – but for difficult problems which require new concepts or unique approaches we need to invest a bit more time to read, learn and think.

    As an employee your ability to take these sorts of retreats is severely restricted. Bosses want to have something to show for the money they pay you to sit and think quietly can be a difficult sell.

    This is just one of the things that makes being a contractor/consultant so appealing. When you can make your own decisions about how to spend your time, then it’s possible to invest in taking a week to isolate yourself and regroup, or produce something.

    A think week is also something that is difficult to justify when you’re living paycheck to paycheck. Using up a week of precious vacation days, or taking unpaid leave presents a risk, especially given that when you come back to work you may not have the time to follow through on what you did during your retreat.

    Based on the effectiveness of a think week, as reported by several high profile people, it’s unfortunate that they can be so difficult to execute on yourself. Time is a tight commodity and obligations can be hard to wiggle out of. However if you can manage to schedule one there can be good payback.

  • Time Audit Surprise

    When you measure things you can manage them – Words of wisdom from Peter Drucker.

    Every time I have made the effort to measure something whether it be calories, carbs, miles run, heart rate, cash flow, net worth or weight there is always a surprise in what the numbers reveal. Recently I did a one week time audit; writing everything I did to the nearest 30 minute interval.

    Prior to actually measuring things I would be swayed by my perceptive bias.  Things that I don’t like doing would seem to take more time than they actually did, and those things that I enjoy would take more time, and seem like less.  This emotional influence on time perception can deceive you into making poor time management choices.

    Sleep was the biggest single bucket for spending my time.  it consumed 33% of the week.  That is a lot of time I wish I could take better advantage of.  There are other animals in the world that sleep far less often than us humans so perhaps there are some (yet undiscovered) ways to sustainably reduce our sleep requirements.  Until then sleeping will continue to be a big part of life.

    Employment was the second biggest time  consumer. 23% of the week was spent in full-time employment.  An additional 3% was spent commuting to and from work so a total of 26% of my time went towards earning a pay check.

    11.5% was family time.  Taking care of a 8 month old can take as much time as I have to give.  It certainly didn’t feel like I was getting this much family time.

    10% of my time was spent on preparing or eating food.  For me that was a shocking number since I usually have a handful of something quick for breakfast and skip lunch.  Cooking and eating supper was taking a lot more time than I had realized.

    Time dedicated to personal projects on the computer was just 5.5% of my time.  Not enough to make progress and much less than I wanted to  spend on it.

    Rounding out the last few things that took time,  Reading, shopping and housework consumed 3% of my time each and TV was at 2%.

    There are a fixed number of hours in the week (168).  Getting more time to work on my side projects requires taking hours away from something else.  Deciding what to cut is difficult, actually figuring out the logistics to cut out that time is also difficult.  Hours are not easy to re-allocate without major life changes and stressing other things and so it will be a struggle to adjust to a new schedule.

    Change is hard.  Changing how your spend your time, can actually change who you are which can be fundamentally difficult to drive from yourself without an external influence (like having a child).

    This time audit raised some interesting issues. Time is our most valuable resource and yet so few of us understand how to best utilize  the time we have given to us.  A disconnect between your goals and your time  can be a critical underlying issue that prevents your success.  I would encourage everyone to do a time audit.  You may find it as surprising as I did.

  • Thoughts on Swift

    So for an iOS developer like myself Swift is pretty exciting.

    When a new language comes along, especially one that is sure to get traction, there is a lot of opportunity to create some exciting new things.  We all know that Swift will make inroads into the mac and iOS app scene, but as a modern language it also has a chance to become something more than that.

    Because of the native integration with Objective-C and C libraries Swift offers some interesting opportunities for high performance compiled apps on the server as well.  This is a space that until now has been completely empty on the Objective-C side of things.

    The space is wide open to create a Rails inspired web framework for Swift (or Express/Django/Sinatra/etc). All of the key tooling that you have with other languages now can be ported over to Swift.  Things like commandline tool frameworks, APIs for various services, BDD and unit test frameworks.  The space is wide open and everyone right now is on equal footing to deliver the next big thing.

    It’s the chance to make a name for yourself in the open-source community by publishing something cool written in swift.