Always Be Cap Deploying (ABCD)

To be successful, in a fast moving startup we must move away from maintenance windows, and scheduled downtime. The team I am currently working with has been beaten into submission, and now deploys multiple times a day. This has allowed us the peace of mind to fix, iterate, change, and break production all in minutes. The idea of continuous deployment is not a new thing, nor a fully conquered problem.

You must decouple your services from your database, you must have lots of tests, and you must code review like a boss.

Sharpen Your Focus

As developers, we have keep too much in short term memory. When was the last time we integrated with master? When was this feature supposed to be turned on in production? Where are we? Who are we? With all of these questions, the addition of social networking we are far too distracted to be as efficient as we should be.

Since the introduction of ‘Do Not Disturb’ across the iOS/OS X framework I have come to know, and love it. It has freed us from the bounds of push notifications and the binding chains of e-mail. Turning it on, you are now notified quietly in the background about what is going on in your eLife. Before this functionality, we were bombarded with Facebook/Twitter/Instagram/LinkedIn/iMessage/Email notifications that are distracting more times than not.

Please allow yourself to break free from the hell that is synchronous notification. All of the tools we use are only as good as how we use them. You simply cannot bring yourself to deleting your eLife, so we have to learn to live with them inside the workflow of our daily life. ‘Do Not Disturb’ is one such way we can all do this successfully.

‘Do Not Disturb’ should have been named ‘Do Not Distract.’ We speak a lot about context switches as a bad thing in our software, so why could it be a good thing in our minds? Stopping these context switches will allow you to sharpen your focus on what matters. Perhaps right now email matters, which often times it can, you won’t be distracted by Twitter telling you that you’ve been followed by a cat.

Do ourselves a favor, work less distracted for a day. Silence all notifications and simply focus on your tasks. We will find out that perhaps push notifications weren’t such a great idea when it comes to productivity.

Keep in mind that your mileage may vary with this. I’ve come to find that it is so useful to allow me to sit and be focused on the task at hand, and then when I am ready I can switch my context to either the next notification that is waiting or something else entirely. My productivity has gone up since utilizing this tool. Many others like it exist, but my iPhone is my information hub so ‘Do Not Disturb’ is exactly what I use and love.

Simplification

As a consultant, I have to track my time. I have to track the amount of time that I work on every project in a single day. On days that I am not on-site with a client, I will jump from project-to-project across six active, busy projects. Tracking time is a solved problem. There are a plethora of apps, web apps, and tools that you can use. I won’t list them here, but search for ‘time tracking.’ I’ve titled this blog post ‘Simplification’ because I’d like to talk about how I track time.

The tools that I’ve successfully used to track time for the last year and two months listed: iOS Clock.app. That is right! I only need a single, built-in app on my iOS device to track my time. A simple, one function stop watch has allowed me to track all of the required information correctly, and accurately.

Stopping the clock, jotting down that information in our billing software before switching to a new task also gives a few needed minutes of respite from thinking. It is like eating ginger between sushi pieces. Cleanse the palate of your mind, figuratively.

But I digress, this post really isn’t about how I track time, or cleansing your palate but how we can all simplify our tools and still be successful, albeit less distracted day-to-day. Do we need a super-duper tricked out ZSH, or can a well appointed Bash do the same job? Is managing an entire directory of vim configurations better than using just the default code highlighting?

Progress will tell you that we’ve come to find that simplification isn’t needed. Amazon will sell you anything made, and have it at your door within 24 hours. While this an incredible service, does selling everything make them the best at selling everything? Is a greater scope of service conducive to greater quality? I argue, maybe. iTunes for instance is an example of something that is one-stop shopping, but it really doesn’t do all of those stops perfectly. Search for instance is a constant issue. Discoverability is also a problem.

What if iTunes was broken into iApps, iBooks, iVideos, iMusic, and each was given the directive to perfect that field. I would be willing to bet that simplifying each project, without affecting the overall feature set would allow Apple to create better, more useable products. As a side note, I realize that Apple has figured this simplification out at the hardware level, but not the software level.

Simplification is hard. It is difficult to do less. It is easy to add more features that will attract more customers, and in turn generate more revenue. I propose that we stop thinking of simplification at the macro-level, but at the micro-level. This will allow companies, like Apple, to have five pieces of software, which each is perfectly suited for it’s task instead of a single piece of software that misses the mark across the board.

Circling back to consulting, I see this conundrum often. We have ten features, and five developers to build them. Each developer is then required to build two features. This means that they will only be able to devout fifty percent of their time to each feature. Would it be better to do five features, across five developers so each can focus fully on each feature? From the macro level, you’d see that half of the work was done in the same amount of time, but from a micro-level the quality of work could potentially be twice as great.

We must simplify everything. Whether it is the tools we use, the features we must complete, or the products we are building, simpler is harder upfront but with the long-tail gains — success should be synonymous with simplification.

Fix It Later

Here is a mindset I’ve come across recently: ‘fix it later.’ In a culture of resourcing, waterfall-ing, and lackluster performers, fixing it later is exactly status-quo and is exactly what is wrong with your software project.

If they, reasons nefarious or not, don’t want the project to be workharder to make the project better they should be removed post haste. Pushing back because it is hard, or the task is annoying should be grounds for removal. Keeping in mind that the change should be well intentioned, and actually beneficial to the team. An example that I’ve come across recently is adding our internal gems to the continuos integration server. These gems are internal to the entire organization, not just our team. This code is shared, and these other teams have a right to know where the code stands.

Stepping off of my high horse for a moment to talk about my shortcomings, I will say that sometimes I don’t want to work on building out new infrastructure, or refactoring all of the view tests to run on webkit instead of Firefox but I do it. I grit my teeth, bite the belt and pull it together. This is why I am paid as a senior developer, this is why I am put in technical leadership positions. People trust me to do the right thing regardless of cost to my persons. Not pulling it together is a failure as a developer personally, and a failure as a team member. You fail, and the team will fail because of it.

No one really wants to work on technical debt. No one wants to put aside a shine-y new feature using all the coolest toys to make the CI server run better, but if no one does it it will not get done. It is your job Mr. Senior Developer to do it. A junior developer probably doesn’t have the skills either interpersonal, or technically, so it falls to us to swallow that pride and get it done.

This is a mindset I learned as a front-end developer that I carried over into the world of DevOps, and technical leadership. Internet Explorer sucks to write CSS for, but we have to. You have no choice. We must, as people, get our mindsets in line with doing what is best for ourselves, for the project, and for the team. They must align. You will grey, you will have high blood pressure, and you will suffer blows to your will to live but at the end of the day you’ve made things better for the entire project, the entire team, and you’ve gained important experience.

Code Like It Is For A Blog

Be hard on your own code.

Your job, as a programmer, is to write ‘good’ code. Regardless of if it is working or not, human beings will need to read it to understand what it does. This means that you should follow convenstions, remove extra whitespace, and apptly name things.

You should write code just like it is going to be reviewed by the entire world. You should feel embarrased if you commit whitespace errors. You should be shunned by your teamates, and you should in turn shun your teamates. It is not just for the aesthetics. Imagine if your diffs were littered with various changes that didn’t have a lot to do with the commits intent.

Please join me in writing code like it will end up on a blog, and that blog has unfiltered commenting with everyone in the world invited to comment.

Speculation

Direct quote:

It’s speculation, but I’d look for the re-enable event when creating a new user in our DB rather than un-deleting the existing one.

Please stop speculating when talking about an issue. Please take ten minutes of time to track down the source, and see what it could be.

Ready? You can find the actual, non-speculative answer in this many keystrokes in Textmate on a pretty large project:

  • Cmd + T → sche.rb → Return
  • Cmd + T → alreg.rb → Return
  • Cmd + F → unreg → Return

Twelve keystrokes and you are looking at the literal source of the issue.

Speculation is not to be confused with educated guessing. Educated guessing is when, after looking at the source, the developer says that it could have to do with this instance method. Huzzah! Let us dive in and see if that is the issue.

Adding to the confusion of the hunt by speculating only makes me wonder why you are on the team, let alone being trusted to debug issues timely in the future.