10x Software Development
Victor Volkman, Senior Software Engineer at ProQuest (Ann Arbor, Michigan)
Software developer with 30 years of experience, currently working in AWS cloud environment with Python, Linux, MySQL, Lucene/SOLR, and related tools. He has taught Computer Science at community college level. He is also the publisher at LHPress.com having produced more than 100 books in print in the past 13 years.
“The sheer silliness of the idea that one developer is 10 times more effective than another is nothing but a gross exaggeration. That being said, the vast majority of software engineers will do no more than the strict assignment of what is given them.
The “10x” designates someone who is willing to challenge themselves to provide more value. As a full-time employee, you are responsible for more than just coding. You have to think about bigger issues such as “Where will the project end up in a year?”, “What do I have to do to get this other department to do their part of the project properly?”, “How am I managing customer expectations?”....
How fast do 10x programmers really code?
When you’re in the “zone”, no phone calls, meetings, or breaks, you can comfortably maybe turn out about 200 to 300 good lines of code in an 8 hour shift.
Most of this depends on how well you understand the particular problem you are solving and the techniques you are using to get there. Python allows for an improvisational type of thinking. You can gather up information from here and there, and put it in a nested-dictionary-of-dictionaries (JSON style), and then pull it back out as needed, so I no longer obsess about whether I should have used an array, or a set, or whatever. I just take whichever feels closest to the simplest representation of what I’m working on.
Also, and ONLY with practice, your skills will improve in the divide-and-conquer sense. You’ll identify isolatable parts of the problem quicker and solve specific sub-goals along the way to achieving the overall outcome. You can easily spot the programmers who can’t or are too stubborn to do this. They have functions that are hundreds of lines long and use more than 2 or 3 nested loops in any one function. Either is a sign that you are not decomposing the problem into easier and more testable units.
Is there any way to prevent boring-time when coding?
There are a few classic ways to alleviate boredom in doing some kind of rote coding work:
- Really good music will help you stay mentally motivated, make the time pass faster, and drown out the mindless chatter of your co-workers.
- Turn the problem on its head. I faced with an extremely dull task of implementing 27 different database queries in Python, which were all slightly different variants of the same problem. I wrote three or four of those, which have exhaustive test cases that I had to prepare from scratch. At the end of that phase, I decided I could not survive such boredom.
My solution was to invent a mini-query language, which could express the key features of each query in a YAML file. Thus, I had the excitement of developing a new expressive language, which was a genuine intellectual challenge as opposed to tedious cut-and-paste mechanics. The end result was much more pleasing to myself.
- Try an unfamiliar Design Pattern. Look for an algorithm or a problem-solving technique “out of left field”, something that you have never tried before. Or a newer language feature recently introduced in the latest version of the programming language you are using. Or a third-party open source library that you can use as a “helper”.
Should I quit programming as languages are going to be dead?
Naive people think that programming is all about languages. Believe me it’s not. After your first 10 years of experience, you will begin to think only in terms of solving problems and the language is the expression of your pure thoughts to get the problem done. At that level, you can switch languages at any time with about two weeks notice.
Here’s an example: in 2010 I was hired as a contractor at a Fortune 50 company doing smartphone development for iPhone, Android, and Blackberry. However, I had done neither Java nor Objective C on a professional basis — that is, I had taken 3 courses in Java at school.
Within three weeks, I had learned how to write and deploy apps on all three platforms (iPhone, Android, and Blackberry).
This kind of thing happens all the time, you completely change gears and re-learn in about two to three weeks a whole new development system. If you are not willing to suffer this amount of change, then, perhaps, you are not temperamentally suited for this type of career.
What communication skills do you find to be most important as a 10x software developer?
Every time I violate these rules, embarrassment or lost productivity, or both will happen:
- Listening. So much depends on actually hearing what people are saying. How do you do this? By not “preparing your answer” while you are listening.
- Let people finish what they are saying. You think you are doing them a favor by interrupting a question in the middle. In reality, you are “one-upping” them very subtlety. Did you really think that saving two seconds by cutting them off was going to help?
- Ask questions when you don’t understand. Especially each time a keyword or acronym goes by. The longer you wait, the dumber you will seem and it will be psychologically impossible to ask “What does HTTP mean?”, when you are 10, 20, or 30 minutes into the conversation.
- Put it in writing. Always document what you are about to do before you do it. This insures that your manager knows what you are doing and can guide you if you are heading into the weeds. This is much better than spending a day writing code that solves the wrong problem.
- Ask for specific examples. Never start a project without at least what is believed to be an accurate simulation of data.
- Ask for a simpler/simplest example. When you are faced with a complex transaction, fallback and ask for one with fewer pieces to understand or less preparation to see if you can understand how to solve the simplest case. Then increase in complexity.
As a 10x programmer, do you slack at times?
In order to keep your mind sharp, you have to have the ability to take breaks. Even a Forumla 1 racecar has to take a pitstop, get the tires changed and so forth before heading out at a top speed.
The trick is to do things that are at least somewhat work related:
- Catch up on work emails;
- Read news about your programming language or platform. This may even trigger some fresh ideas;
- Ask you co-workers about their daughter’s volleyball tournament (or whatever);
- Ask those who said they were previously stuck whether they found a way around and if so how they did it;
- Do a “circuit” of the building, an entire floor or perhaps two, to get the blood moving and raise your heartrate again.
At what age will a software developer not be able to get a raise?
With 30 years under my belt as a professional software developer, I think it is fair to say that you’ll not get “major” raises above 10 years experience except by joining a new company.
Do you want a real raise? Start working for YOURSELF on nights and weekends. Stretch yourself into an unfamiliar area which will force you to learn a few new skills. You won’t get much more than pennies on the dollar if your wages are all tied to working for The Man.
Joe Francis, Architect at Pull-A-Part (Doraville, Georgia)
56 years old in 2017, 26 years as a military officer, 25 years as a Microsoft platform software engineer for Fortune 500s, 19 of that as a manager or architect.
“I am typically cranking out close to 100,000 lines of code per year, but I feel like I've paid a high price and had ideal conditions to achieve that goal.
At the risk of sounding like a braggart, here are some of my stats:
- Worked an average of 74 hours per week with no vacations;
- Read over 2000 books on computers;
- Typically allowed to focus on the work for days at a time without interruption, often working from home;
- Typically had the luxury of others trying to intercept distractions before they got to me;
- Typically able to achieve good focus in a matter of moments after being distracted.
How do you prepare yourself to work everyday?
I always start the day with a plan, typically setting aside about 30 minutes to review my open tasks and prioritize them. I generally prioritize whatever my boss wanted first, then communications tasks, then start working through them in a priority order.
Is eight hours too short for a 10x software engineer?
If you are developing software in a focused way for 8–9 hours per day, you are offering an employer excellent value.
What distinguishes a great software engineer from a good one?
A terrible software engineer leaves defects in the code that routinely have to be found by others. A good engineer can write code that is reasonably bug free and can accurately estimate how long it will take. A great engineer can do the work of three good engineers, design the system, and work effectively with others.
In software engineering, is it better to focus on one field or try to learn a handful of fields?
In my experience, it is best to master a particular platform, such as .NET or Java, but master the entire stack of fundamental technologies from the user interface level to the database. Maintaining that mastery is best for the working software engineer. Understanding computer science topic in breadth and depth comes second. Mastering specialty technologies like CRM, ERP, content management systems, etc., would come last. This is because if your platform and computer science fundamentals are in a good shape, you can learn other things pretty quickly, and competent employers understand that.
What should a 40-year-old software engineer do to be relevant in the high tech industry when he turns 50?
- I have routinely devoted an average of a couple of hours per day for over 35 years to maintaining and improving my technical skills.
- I typically divide my time equally between learning new things (docker right now), reviewing fundamentals (Java right now), and higher-level stuff (microservice architecture right now).
If you learn all the techniques of writing quality code, learn some DBA skills, and learn some project management skills, that will benefit you later.
I have never gotten tired of learning more about computer programming - for me it was simply very exciting. All day at work, during commutes, at the gym, even just two minutes walking to my car - I am always reading something, listening to something, or watching something.
- I almost always have a set of wireless earbuds around my neck to listen to more things. Some people double or triple the speed of such media, but I typically set it at about 1.5x. For a lot of reading,
- I just scan a topic quickly. I’ll read enough to know where I can look up essentials later on if I need to, only reading in depth if I think I really need to.
- I have completed about 80 college courses, 1500 Pluralsight courses, and can easily help my two college-aged children with any subject at their university.
What do 10X software engineers do in their spare time?
Here is what I do in my spare time, in order:
- Physical Fitness. This is mainly because I am 55 years old and concerned that this should be my top priority now if I want to keep working. I use Marine Corps physical fitness test standards as my guide and typically run 3–4 miles five times a week.
- Time with Family. I have a wife, two elderly parents, and two college-aged children. I probably spend less time with family than others do, as I am kind of work-focused. I know where all my time is going and even keep track of it.
- Home Maintenance. I own a nice home (3600 square foot). A lot of this is done by others, but I do the hard things.
One thing I don’t do - I don’t watch much TV.
Marc Weiner (Founder at Ciro. Formerly Director of Front-End Engineering, UX at Advizr (New York, New York))
15+ years of experience, expertise is in software architecture, full-stack development, technical strategy, R&D, process design, team building, leadership, business analysis, and UI. He has worked across medical, industrial, e-commerce, financial, and entertainment industries.
“If you want to become a great programmer, I would recommend working on your English (this applies to native English speakers as well). A great programmer communicates well with others. Great programmers thoroughly understand the problems that they are trying to solve and to do that, they ask lots of good questions.
Other than lots of time, practice, reading, and experience—communication is what differentiates the junior programmers from senior programmers. So my recommendations are:
- Read. Fiction, non-fiction, programming books, and blogs/articles. This will help with your English and also allow you to keep growing and prevent you from hitting a plateau. Try to understand the theory and take part in the conversation. Growth ensures that you won’t become obsolete and will always have a job.
- Practice and stay curious. Put problems in front of you and rise to the challenge. If you don’t know how something works, you should be curious about how it works. Go find out.
- Try to get a job where you can have a mentor. It’s much easier to have someone help you, and they will push you forward much faster.
- Try to understand the business and product side of things. Why are you building what you’re building? How are people using it and why? What is their mind frame? What is the business model?
Learning how to be a great programmer is a lifelong journey, and only a fraction of it is actually knowing how to write code. Knowing how to write code does not make one a software engineer—much in the same way that being able to speak English does not give one the ability to argue a point, write a novel, or compose a poem.
Programming is a career in learning. Don’t worry about memorizing syntax or the latest framework fad. These things are constantly changing anyway.
In a year, you may be doing something entirely different.
These days I focus on User Experience (UX for short). Much of it isn’t even really programming. It’s a mashup of complementary disciplines (psychology, art, human interaction, logic, etc). For me, programming the most sophisticated algorithm and writing esoteric code isn’t important. Quite the opposite—I want simple looking, pedestrian code that’s easy to read.
The only thing that is constant in software is change. I like to think of myself as a professional student. Don’t worry about what you know today. Worry about what you’ll know tomorrow.
Personally, I’d stick with PHP. It may not be the hippest, coolest language out there today, but it still runs the majority of websites and some of the largest most popular ones! It’s proven that it can scale, is flexible, and is relatively easy to learn. There is a massive community to help you out (bigger than most others combined). For the foreseeable future, you won’t have a hard time finding a job as a PHP programmer, and there is often less ‘hipster shit’ going on within the community. They focus on getting the job done and don’t care too much about what other people think.
You’ll find that PHP (or any language for that matter) has its strengths and weaknesses. You’ll learn how to play to its strengths, and compensate for its problems. You’ll learn that a programming language is just a tool—it’s not what’s important. Problem solving, self-study, collaboration, and domain knowledge is more important.
A great programmer, on the other hand, has the ability to write readable code. I usually spend 1/4 of my time solving a problem, and 3/4 my time making it readable to anyone not myself.
In my opinion, if you learn how to make your code neat, clean and organized, you’ll already be ahead of 90% of the developers out there.
I started programming at a very young age, and have over 15 years of professional experience. I think my abilities simply come from my experience having worked across various industries, and in many roles.
I’ll tell you what worked for me (my last full-time salary and job offers reflect that):
- Get a job that you’re a little under-qualified for, but where you’ll be able to learn or improve at a skill that you’d like to have. This skill should be applicable to your next job. Leave as soon as you feel like you have mastered that skill, or taken as much as you can from the job. It’s probably best to stay there somewhere between 6–12 months, depending on the job.
- Repeat step 1.
That’s what worked for me.
I talked myself into a lead front-end software engineer position at Marvel, building their new “responsive” website, without any “responsive design” experience. I was able to sell myself as someone who likes to learn new things, excels at R&D, and someone who cared about costs and deadlines. Within the following months of hard work and a lot of reading/experimentation, I became a leading expert on the subject of responsive design.
Takeaways are: 1) never stop learning and 2) work at many different companies, never staying long at any one place. If you do this correctly, you also get a substantial salary bump, every step of the way.
You’ll almost always get more money finding a new job, than staying at your current company.
Always go for salary, don’t worry about stock options. Unless you fall in love with the company you’re working for, it’s too risky staying at the same startup, hoping your stock will be worth something someday. It probably won’t—and in the meantime, you’ll be stagnating, and not learning as much as you could. Work hard and furiously at every job, take a break, and then jump into the next. Keep selling yourself, and getting in over your head. If your next job isn’t at least a little scary, then find a scarier one.
You need to enjoy what you’re doing, and you’ll need to keep the rest of your life in balance. Don’t burn yourself out.
60 hour weeks for extended periods is NOT recommended, and is not a good long-term strategy. Also, make sure you have fun once in awhile! Go kayaking, snowboarding, whatever!
What is one quality that separates 10x programmers from the rest?
If I were to choose only one, it would be the ability to predict future problems before they occur.
This kind of developer is able to draw on a vast array of past experience, and intuitively recognize the familiarity of the problem. He/she is able to think about edge cases, both from a technical perspective and a business perspective. The problem may even be outside of his/her scope of purview.
This ability allows the developer to bypass the iterative process to a degree, and save their employers potentially millions of dollars in lost time, effort, and business opportunity.
Again, this kind of developer is leaning heavily on past experience, recognize familiar patterns, and the ability to take off their blinders and think of the bigger picture. This comes with age, maturity, and having worked on a variety of projects and roles.
How to recover from 'programmers burnout'?
It’s proven that working too hard will lower your productivity, with the end result being burnout—which means losing talent and hiring someone new. This is a massive waste, and makes no sense for a company with limited resources.
Most likely, you’ll be burning yourself out for little compensation, while at the same time, not growing in your career. If you were learning new things instead of doing “gruntwork as fast as possible,” I don’t believe you would have burned out so quickly.
Personally, I’ve experienced burnout severely myself. The key is to be social, get away from the computer for a while, exercise, go outside, and enjoy life.
Again, programming doesn’t have to be unhealthy. It’s piss poor management who leans heavily on their subordinates to make up for their incompetence that makes it unhealthy. In a culture of one-upping and backstabbing, nobody wins. Not the company, and not the programmers. So if you see one of these…walk away. It’s just not worth it.
Never stop learning, and never stop moving.
Is it a good idea to take a break from your software job to develop your software skills?
Sometimes you just need to work on something for yourself. Just imagine no deadlines, nobody telling you what to do, or how to do it. You can use any language you want, any technology you want. You can work on all of it; Front-end, Back-end, server architecture, build tools, QA, anything. The results of this can be eye-opening.
Aside from possibly building something that can someday turn into a business, here are a few benefits:
- Since you’re doing everything, you are guaranteed to learn something new.
- You may learn to appreciate your co-worker's jobs, and get a better understanding of what it is that they do. This will help you communicate better with them, and will make you a better engineer, manager, or product owner.
- You can finally learn/test out that new language, technology, or library, without consequences.
- You may discover you like doing x better than y.
- It’s nice to take a break from your job! People work too damn much. Build your project on your own schedule, and have time to relax.
- You will see how fast you can work without dealing with people and documentation. Or, you’ll learn the value of people helping you and documentation.