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.

Monday, August 1, 2016

Managing Up

No matter what your profession or what your role is in your company you alone are not going to be able to achieve everything you want or need to without the help of those who are higher on the corporate ladder than you. In the course of your career you're going to need the buy in, sign-off, and/or advocacy of your superiors to fully accomplish your goals. As such, managing up is a key skill to learn to be effective.

Here are some tips to help you be more effective when managing up.

Know what you're audience values

You're more likely to achieve your goals if they are aligned with the goals of those you need buy-in, sign-off, or advocacy from. So the first step in managing up is actually understanding the goals of your superior. Understanding their goals will help you understand how to motivate them to help you accomplish your goals. In trying to understand their goals try to find the answers to the following (in no particular order):
  1. What are their near, mid, and long term plans for their customers?
  2. What are the current challenges they are facing?
  3. What role does your team or project play in their plans?
  4. What trade-offs have they recently had to make?
  5. What are the outside influences to their plans?
  6. What defines success for them?
Be willing to change how you accomplish your larger goals

It's important to understand where your goals align and share commonalities and where your goals are at odds. When your goals are at odds you need to decide if (1) your goal is really crucial to your overall plan or success or (2) your goal is merely a stepping stone that can be achieved in another way which is more inline with the other persons goals.

Help to connect the dots between your goals and their goals

When your goals are complementary you need to bring that to the attention of the other person. Help them draw the lines and see the connections between your two goals. Help them understand that by helping you achieve your goal that they are really moving towards achieving their own goal.

Give options

Decisions are not often black and white. There are usually compromises and/or concessions that can be made that allow you to both deliver enough of what you are trying to accomplish to make it worth while. This is often done by providing options and their various outcomes to your superior. When doing this you want to be clear about what the concessions are and what they are getting and not getting with each option. The main goal is empowering your superior to help you.

Don't just come to a superior with a problem, come with a problem and the various possible solutions and their outcomes.

Make a recommendation that is backed by data

You need to have data that backs up the various options and their outcomes you are laying out. Hard data allows you to help them approach the problem more objectively. This is especially important when what your managing up is not something the person current envisions or thinks they want. It's important to make sure the data your bring is focused on outcomes. Good data speaks to the effects things are going to have on future projects, road maps, moral and attrition, return on investment and opportunity loss costs.

Monday, July 25, 2016

Scaling As a Leader - Learning To Trust But Verify

As a leader, regardless of what industry you're in, mastering the skill of delegation is a must. You cannot scale as a leader unless you are able to delegate the ground work to others. Successful delegation requires a certain amount of trust. But blind trust is the enemy of successful delegation.

Successful delegation means being able to trust that the person you are delegating to is capable, competent, and willing to get the job done. The best way to ensure their success is to follow the trust but verify model. In this model, you follow up with the delegate periodically to determine if:

  1. The task is on track
  2. The delegate is looking around corners. i.e. identifying what's coming up that's not directly in their line of sight
  3. The known unknowns are being addressed
  4. The delegate is working to identify the unknown unknowns

One common problem with people trying to implement the trust but verify model is micromanagement. Here are some tips for practicing trust but verify and avoiding micromanagement.

it's okay for it not to be done your way

In most cases there are many ways to solve a problem. Yours may or may not be the best way. Giving your delegate room to figure this out is important. Your primary role in the trust but verify model is to make sure that they:

  1. Have thought through the problem and aren't just going off the cuff
  2. Aren't making irreversible or hard to reverse decisions
  3. Aren't falling behind schedule
  4. Are aware of the decisions they're making, specifically with regards to long term sacrifices for short term gains

focus on the outcome

When making sure that the person you've delegated to is thinking through the problem it's important to make sure your questions are focused on the outcome of the task and not on the approach. Remember, you're not solving the problem and therefore the approach may not be the same as if you were solving the problem.

Focusing on the outcome of the task makes sure that whatever the approach, the correct result is being achieved.

understand how to measure success

As you delegate tasks or projects to others you need to be clear about what the definition of done is. Additionally, you should talk with them about milestones that can be defined and achieved before the task or project is complete. Use these milestones to measure the success of the task or project. The best way I've found to do this type of measurement is to create SMART goals.

Monday, July 18, 2016

Leading Well

Understand you're part of a larger system, and are not the center of that system

Your team, your software, and your role are crucial for the success of your company or division. But it's important to remember that you're not THE ONLY thing that lets your company or division succeed. You're one part of a larger ecosystem. Knowing this will help you identify:

  1. Your role and your teams role in the ecosystem and how best to contribute.
  2. What inputs/outputs are needed from you and your team to make the larger system better.
  3. Where you may be a bottleneck to the success of the system.

Do the right thing, not because you're rewarded, but because it's the right thing

Good leaders understand that you're not always going to get rewarded for doing the right thing, but you still need to do it (whatever it may be). Doing the right thing may actually mean you have to take on more work. It may mean admitting that you were/are wrong. It may result in not achieving expectations. Whatever the outcome, it's about doing the right thing because it's right in and of itself.

Make time to step away and remove yourself from the problem space

If you're constantly in the thick of things you're going to burn out, you're going to get sloppy, and you're going to miss key things. You need to make sure that you are giving yourself time to pull back and think through problems.

I'm not just talking about vacations (which are important). I'm more talking about making sure you have built in distance from the problem so you can think. For me, this often happens when I'm riding my bike to or from the office. I have 35 minutes where I don't have anyone asking for my help or input. I'm not being barraged with email or phone calls. It's just me, the road, and my bike. It allows me to take time to think through things critically.

Surrounded yourself with advisers

Good leaders understand they don't have all the answers. But they also know how to get to the right answers. They do this by surrounding themselves with advisers who are subject matter experts on problems that they will never have enough time to become an expert in. For example, the President of the United States has his cabinet and the joint chiefs. These are people whose job it is to know the answers to problems that the president is accountable for helping to solve.

Hold strong opinions very loosely

Good leaders have opinions and are willing to express them. This doesn't mean that good leaders are arrogant. Quite the contrary. Good leaders are able to recognize when their opinions are wrong and are able to adjust. But they're not afraid to go out on a limb and express what they believe is right.

Monday, July 11, 2016

Preparing for a software development interview

Software Engineering interviews can be stressful. They're typically 4 - 5 hours long meeting with 4 - 6 different people.  Being prepared can be the difference between getting that job you've always wanted or failing to truly demonstrate your capabilities and skill-set. Here are some tips for preparing for software development interviews.

Make Sure You Understand The Problem, Ask Clarifying Questions

One of the bigger problems I often see in interviews is the candidate just jumping in to solve the problem without making sure they understand what they're being asked to do. Even if you feel like you understand the problem 100%, you should ALWAYS repeat back what you think the problem is before jumping in.

Every problem comes with some level of ambiguity. As you repeat back the problem think about how to remove that ambiguity. Ask clarifying questions that help you understand what is in scope and out of scope for the problem.

Review Your Data Structures

One of the main things that you need to be able to demonstrate in any software engineering interview is how well you 1) know your data structures 2) know when to use certain data structures and 3) understand the systematic complexity for each one (e.x. how long do reads or writes take). Before every interview you should review the following data structures and understand how to apply them to solve real world problems.

  1. Array
  2. Linked List
  3. Hash Table
  4. Binary Tree
  5. Queue

Give An Overview Of How You're Going To Solve The Problem 

To be successful as a professional software engineer you need to be able to communicate well. It's not enough to simply be able to code. Because you're going to work on a team and with people that aren't engineers (product development, program management, design, and etc) being able to communicate effectively is an essential part of the job.

Being able to talk through your solution helps you demonstrate that you're able to communicate effectively. Additionally, talking out loud about a solution often helps you identify gaps or potential bottlenecks before you get into your code. Essentially, it gives you a chance to validate your design and show the interviewer that you can approach a problem systematically.

Focus on Solving The Problem First Then Optimize

Another common mistake I see interviewees make is getting so focused on giving the most optimal solution that they never finish creating a valid solution. You're not likely to get an offer if you can't complete the exercise within the time allotted.

Your goal should be to create a working solution first. At that point, if you have time, you can optimize it. Along the way you can point out potential bottlenecks or un-optimized code.

Keep Things Simple

Simplicity in software is a gift. Complex software typically has problems with readability, understandability, and scale. You should focus on demonstrating that you understand how to keep things simple when solving your problem.

Some easy ways to do this are:

  1. Limiting the number of classes/interfaces you create.
  2. Use meaningful variable names.
  3. Encapsulate the code into short simple methods, rather than one giant method.
  4. Use built in language constructs rather than re-inventing the wheel.

Know How To Test Your Solutions

Professional software engineers test their own software. You need to be prepared to identify:
  1. Test cases when the code should succeed
  2. Test cases when the code should fail
  3. Test cases that handle typical edge cases like NULL values, being passed 0, 1, or many objects, no connectivity, and etc.