Monday, September 19, 2016

Development teams should be deploying and mainintaining production

Most of the software development shops I've worked at in my career didn't have developers deploy their own code. Typically the developers would create a release and hand it off to QA who would do some combination of manual, automated, and performance testing. When bugs or performance issues were found they'd send the release back upstream to developers who were already working on the next feature.

This creates a culture of fear that the production system needed to be protected from the developers. This is unhealthy in my opinion. Software development teams should be deploying their own software for four main reasons:
  1. Ownership
  2. Accountability
  3. Insight
  4. Continuous Integration/Continuous Deployment
Ownership

Software teams that deploy and maintain their own software in production tend to have a higher level of ownership. This is because they are involved in the full end-to-end software development life-cycle rather than just building the software. They become better aware of the machines (whether physical or virtual) that their software runs on. They're more likely to insist and push for deployment automation as developers tend to hate repetitive manual tasks.

When the developer isn't responsible for deploying their code they move on to the next problem space after they've "shipped" their code to operations. This typically means they've moved on both mentally and emotionally from that release. When a developer is responsible for pushing to production they're invested in the release getting all the way to customers. They become responsible for diving in and solving problems that pop up during deployment.

Accountability

When you're responsible for maintaining software in production, you're more likely to be accountable to what happens in production. Specifically, the dev team becomes more accountable to:
  • Bugs
  • Test coverage
  • Deployment failures
  • Poor performing code
When you work at scale there are often bugs that only show up in production. When developers deploy to production they become more accountable for fixing bugs, performance issues, and deployment failures as they are directly exposed to them during the release cycle. One thing I've seen successful organizations do is, when a release fails, block all further releases until the deployment succeeds. Developers that are accountable for these failures will be encouraged to fix them because they're prevented from moving on to the next new thing until the current thing is successfully deployed. 

Insight

Understanding the health of your system means having the right metrics and validations in place. When software developers own deploying to production they're more likely to instrument their code well because they will need to validate that their deployments are successful. In my experience teams that deploy their own code better understand the performance characteristics and health of their systems. They are also better able to diagnose problems because they're familiar with the differences between their development and test environments and the production system.

Continuous Integration/Continuous Deployment

When a team owns their code end-to-end they are setup for success with respect to continuous integration and continuous deployment. They don't have to jump through hoops in getting their code into production and they can integrate deployment and test tools directly into their development pipeline. This encourages them to ship smaller features more often. By doing this, they decrease the time it takes to close the feedback loop and are better able to adapt to their customers ever changing needs.

Monday, September 12, 2016

Finding happiness at work.

Recently I was watching the film Hector and the Search for Happiness and it got me thinking about how work can either be a source of happiness or contribute to a sense of unease or unhappiness with your life.  There are a few quotes from the movie which I think should be examined in the context of your job and your overall happiness.

Making comparisons can spoil your happiness

Even if you work at a company that stack ranks it's employees, you are not your peers. While looking to others and their accomplishments can be a great source of inspiration, comparing yourself to others can also be an easy road to unhappiness.

Instead of comparing yourself to specific people, who may or may not have the same gifts and talents as you, figure out what achieving and exceeding your goals in *your role* means. This means sitting down with your boss and having a conversation about the expectations of your role and what your goals are. I highly recommend creating SMART goals.

Work towards achieving *your* goals and not towards being better than your peers. If you consistently achieve or beat your expectations it won't matter if you're better than your peers. You'll feel valued and appreciated and likely will be rewarded for your effort.

Many people only see happiness in their future

Are you one of those people that only seems to be happy if you know you're on track to a promotion or a particular set of responsibilities or ownership? Having an aspirational goal is great, but if it's the only source of happiness at work it's getting in your way more than it's helping.

What is getting in your way of being happy right where you are? Make a list of the top five things in your current job that are getting in the way of your happiness. Then create a set of goals for each one to affect real change in your current role.

For example: let's say you have a co-worker who is driving you nuts. They're overly critical of your work and you feel like they're targeting you in an unfair manner. Set a goal to try to dig deeper into the tension and try to see your interactions from *their* side. Be blunt and honest and tell them you feel tension and would like to resolve it. You'd be surprised how much unhappiness in your current situation is resolvable simply by bringing it up.

Fear is an impediment to happiness

What fear is causing you to dread going into the office? Is that fear rooted in reality? The typical work related fear I experience is not feeling like I am on the same par as my peers. I'm afraid that I have to work harder than them to get the same thing or less accomplished. But at the end of the day this fear usually turns out to be baseless.

I've found that the best way to root out fear at work is to work closely with your manager and your stakeholders and define what success looks like. Your manager should be able to paint a picture of what success in your role looks like. Very likely, this will start with a job description or some internal HR document that describes the necessities of your role. Talk with your boss about that and ask for specific examples of meeting those expectations or exceeding them in your current projects. You should do the same with your project stakeholders. Make sure that what you're planning to deliver is what they're expecting you to deliver.


You're likely going to spend 2000+ hours a year at work. Why not make it a source of joy?

Monday, September 5, 2016

Communicating Effectively In Writing

We use writing in all aspects of our lives whether it's an email, a text message, a blog or something else entirely. Writing is one of the most powerful mediums we have in communicating our ideas. Given that, it's important for you to understand how to communicate effectively.

Understand what you are trying to achieve

Before you communicate in writing you should clearly understand what you are trying to achieve. Are you trying to disseminate information? Are you making a call to action? Are you soliciting information? Understanding this will help you better frame your narrative such that you can effectively achieve your goals.

Lead with the call to action

This is akin to putting the most important information first. Your reader shouldn't have to hunt for what you're asking them to do. You should be explicit up front about *what* the call to action is and then provide more information as to *why* you're calling them to act.

For example: "Project X is 8 dev weeks behind schedule and needs 2 additional developers for 4 weeks to meet the original delivery date."

Put the most important information first and layer in the context

Someone familiar with the problem space should be able to stop reading after the first few paragraphs or the first page and grasp the main point of the text. Your reader should only have to dig into the back story if they want. Providing too much context can get in the way of what you're trying to achieve. On the flip side, not providing enough context can leave your reader with more questions than when they started. If you layer in the context you give your reader the ability to choose if they have enough information or if they need to keep reading.

Footnotes: Writing is a unique medium that allows you to point out where your data comes from in such a way as to not distract from the main point. Footnotes give you the opportunity to back up your narrative with facts, but allow you to layer them in such that the reader only has to read what they care about.

Appendices: If you have a lot of context that is important but not primary to the narrative, throw them in an appendix. The curious or skeptical reader can go and dig more into the *why* of your narrative without you having to detract from the flow.

Read it out loud

Proof reading silently make it very easy for your mind to skip over something that you've spent a good amount of time on. Proof reading out loud allows you to find areas where the narrative doesn't flow. It also gives you the opportunity to figure out where you have too much or too little information.

Monday, August 29, 2016

Why you should learn multiple programming languages and platforms

In the first decade of my career I wrote software in C++, Java, C#.Net, Ruby, Python, Objective-C, VB 6 and VB.NET. Additionally I developed for ASP, ASP.Net, and PHP based Web Sites as well as scripted in Powershell and Bash. Learning multiple programming languages was very helpful for me during my career as a software engineer. 

Here are some reasons that you should learn multiple programming languages.

Trains you to separate the engineering from the language

Learning multiple languages teaches you to explore design patterns and engineering best practices that aren't platform or language specific. Being a great software engineer is about being able to identify the correct algorithms to solve your problem and being able to implement that algorithm in the language and platform that best solves the problem. Great engineers are able to build simple software and use design patterns that are language agnostic.

Enables you to learn other languages more easily

Once you've started to learn to identify design patterns learning a new language becomes less steep of a learning curve. Learning a new language is about learning the plumbing of the language, i.e the syntax, the libraries, and the run-time. Knowing what you *should* be building allows you to learn *how* to build it.

Exposure to different tool-sets and platform features

As you learn new languages and platforms you'll also be exposed to new tool-sets for building, debugging and testing your software. Using these different tools will help you to learn different aspects of interfacing with hardware and other software as the languages and platforms will likely have different layers of abstraction for different things. For example with C++ you'll learn better memory management. Whereas with Ruby on Rails you'll learn dependency management with tools like Bundler. 

Become better at picking the right tool for the job

Learning the ins and outs of different languages and platforms will help you learn to pick the right tool for the job. You'll understand what languages excel at what types of problems. For example, you may need to write a script to parse files and find that perl's built in regular expression capabilities  help you to write an efficient and simple script. You may want to build a cross platform game and decide that using C++ will help you port your game to multiple platforms without as much code duplication. 

Monday, August 22, 2016

Creating work life balance

In almost every industry, but especially in the software industry, there's always enough to do that you could work 24/7. But that's not healthy for you or for your company. Not having a healthy work/life balance contributes to burn out, discontent with your employer/boss/team, and often general depression. Obtaining work/life balance is not like capturing a unicorn. It's not a myth. It just looks different depending on what your priorities are.

Different phases in life require different types of work/life balance in order to obtain satisfaction in life, achieve your career goals and prevent you from burn out. For example, when you're single and kid free a lot of your satisfaction in life comes from your day job. You'll want to invest longer hours because you'll be rewarded in both your life satisfaction and in your career growth. Contrast that with someone who is married and has kids. More of their life satisfaction will come from outside of work than from inside. They'll be trying to do a good job with their spouse, their kids, and their jobs.

Here are some tips that have helped me achieve a good work/life balance.

1. Set The Correct Expectations With Your Management Chain and Your Peers

You want your boss and your team to know they can count on you. But that doesn't mean that you have to be available 24/7. Have a conversation with your boss and let them know explicitly what to expect your in office and out of office hours to be. Understand that this is a two-way conversation and your understanding may be incorrect. Having this conversation will make sure that both you and your boss are on the same page.

For example: my son goes to sleep around 7 pm each night during the school year because he has to get up at 5 am. It's important for me to get an hour with him at night before he goes to bed since I don't see him in the morning. So, I sat down with my boss let him know that my goal was to try to leave the office each day between 5 pm and 5:30 pm each day because it takes me 30-40 minutes to commute home. We talked through this expectation and my plan to be in by 8 am each day. I also let him know that I am flexible and can occasionally stay later if the need arises, but that I it has to be the exception to the rule.

Knowing my goal helps me coordinate better with my boss. He knows that if something comes up after 5 pm that I will likely address it the next morning. He also knows that if something exceptional comes up that is important that he can count on me to address it.

2. Be Willing To Jump In As The Exception To The Rule

Most high tech companies have core business hours but the internet doesn't stop because it's 5 pm. Working in an industry which doesn't have an open and a close means you'll need to be flexible in your schedule and occasionally work before or after your normal day begins or ends. If you're working on a project with a tight deadline you're going to need to be flexible and willing to put in additional hours in order to maintain a good work/life balance as the standard rule.

3. Understand The Trade Offs and Be Willing To Accept Them

Different industries require a different level of commitment. For example, retail organizations are likely going to require you to work on or around the holidays. Why? Because that's when some of their core business during the year takes place. It's not reasonable to take a job in retail and expect to take Black Friday, Cyber Monday, or Christmas week off.

That's just one example. Each industry will have different trade-offs. Some will require travel. Some will require work on the weekends. Some will require long hours for a couple weeks out of the year during planning periods or before big products ship.

If you understand the trade-offs of your industry then it won't feel like your work is constantly encroaching on your work/life balance. It'll be a conscious choice you've made where you've deemed the rewards to be greater than the demand. You and your employer will have the same understanding of where the balance between work and life is and what reasonable and unreasonable expectations are.

4. Remove Work Email From Your Phone

This one has helped me significantly. At first I didn't have a choice as my work stopped allowing Android phones to connect to our email servers due to the Stage Fright vulnerability. The first few months I went through withdrawal and was afraid that I was going to drop the ball on something. But as I learned to set expectations with my boss and my peers I slowly started feeling more comfortable being disconnected.

In my case, I've explained to my management chain that I don't have access to email on my phone and didn't plan on VPN'ing in to check it while at home. But I also told them explicitly that if something came up to please feel free to text me. This gives them confidence that I'm not going to just fall off the face of the planet when I leave the office and it helps me to feel okay not being connected 24/7 to my job.

5. Exceed Expectations When You Are At Work

If you exceed expectations while you're at work then you'll build the trust that you need for your boss and peers to understand you will get the job done. Your boss and your peers will believe they can count on you to get the job done and won't feel like they need to micro-manage how or when you do the job.

Exceeding expectations assumes that you know what the expectations of you are. You *must* sit down with your management chain and have this conversation. You *should* have goals that are clearly defined. You *should* also talk to them about how to escalate to you on off hours. For example, if there's an expectation that sending you an email is enough to engage you after hours but you don't check your email after hours, then you're not going to be able to exceed expectations.


Monday, August 15, 2016

How fear is influencing the software development industry

The software industry is largely made up of highly intelligent and highly analytical individuals. It's an industry where experience, ideas, and intuition help set people apart. We celebrate innovation, creativity, simplification, reuse, use of patterns and avoidance of anti-patterns but if not careful we can encourage a culture of fear.

Being Afraid To Be Wrong

Being wrong is often viewed as not being good at what you do. In an industry where your intellect and your intuition are your primary tools to be successful, being wrong can make you feel as though you're not as intelligent or as capable as your peers.

But this is a fallacy. The most intelligent and most intuitive people I've worked with in the industry are able to differentiate and admit when they're wrong. Being able to recognize when you're wrong and pivot to the right path is a skill that sets the highly capable apart. It's a sign that the person is truly looking for the best solution, rather than the best solution they can create.

Being Afraid To Try Something New

The software industry is constantly changing. This can be unsettling to people who feel like they're constantly trying to keep up with the latest and greatest in technologies, frameworks, and platforms. It's often the case that the latest and greatest is really just a passing fad. Getting caught up in one of these fads can have negative impact on your team or your project depending on how much you've embraced the technology.

New technologies and new ideas always come with risks. You risk adoption being so low that the tech will fail, security vulnerabilities, scalability problems, and a whole host of problems that can come with new tech or new ideas.

The problem with over-indexing on the risks is that you'll miss out on the game changing technologies and ideas. You miss out on things like Agile development, CAP theory in distributed computing, Linux, Node.js, native Mobile apps, and much much more.

Being afraid to try something new means you run the risk of being left behind and becoming irrelevant.

Being Afraid To Fail

Failure is a very important part of progress. Being afraid to fail is tantamount to being afraid to make progress. Often, people are afraid to fail because they believe that if they do they're not going to have another chance to succeed.

The real problem isn't failure, it's the scale of the failure. Waiting too long to validate your assumptions is a recipe for disaster. The key to failing well is to limit failures scope and to learn from it. If you can create an environment that leaves room for failure, you're creating an environment that can be successful.

Don't be afraid to fail, be afraid to not be able to fail.

Monday, August 8, 2016

Don't be afraid to admit your career goals.

This is one area that used to be a real struggle for me earlier in my career as a software engineer. If you asked me what motivated me, I would give you the *right* answer. I would tell you that I was motivated by solving interesting problems, which was (and is) very true. But it wasn't the whole truth. I was (and am) also motivated by moving up the corporate ladder and having a bigger and bigger voice at the table (meaning my voice being able to carry a lot of weight).

I thought that admitting that I wanted to move up the corporate ladder would mean that (1) I was greedy or selfish, (2) would only have my actions only interpreted through that lens or (3) would mean that I had an ego or a self-inflated view of my skills or abilities. I didn't want to be construed as having an ego and I didn't want to be viewed as *that guy*. You know, the person who people say "he's only concerned with moving up the ladder and doesn't really care about the people he works with or how many bodies he leaves in his wake". Avoiding that persona was VERY important to me.

I was afraid to admit to myself, my peers, and my bosses that I wanted to get promoted, that I wanted more responsibility, that I wanted to take risks, and that I felt I was as capable or more than my peers to lead a project. I thought that if I just stayed heads down and executed on what I was asked to do that it would lead me down the path I wanted to go.

In some ways it did and in other ways it didn't. My effort did lead to a year over year increase in salary (and bonus depending on the company). I did gain the respect of my peers and have grown a reputation as someone that delivers on what I'm asked to and as someone who is disciplined. But it didn't lead to the leadership opportunities that I wanted.

I've been blessed with some natural leadership talent. I'm able to communicate clearly, I have good intuition and understanding, I generally want to help others succeed and I am able to take complex problems and simplify them. I assumed that other people would recognize that because i had these qualities that I *wanted* to be given opportunities of leadership with more and more responsibilities. 

But those opportunities never came and 10 years into my career I realized that I was not where I wanted to be. At that time, I had been at my company for 5 years and decided that the only way I would move up the career ladder was to quit and find something else. When I did and put in my resignation the VP at my company was shocked. I told her that I wanted to move from an IC (individual contributor) role into a management role. And what she said next surprised me. She said "why didn't you just say so?" and went on to tell me that she thought I would be great at it but since I hadn't expressed interest wasn't ever considered for the roles that would come up.

And that's when I learned, it's okay to ask for what you want. If you don't it's more likely than not that other people *wont* know you want it, even if they think you deserve it. Since that conversation I've been very honest and straightforward with my career goals and I have been able to achieve them systematically (still working on several).

If you haven't already, sit down with your boss and talk about what your real career goals are. Be prepared to hear constructive criticism and be ready to receive it, learn, and grow.