It seems that I am always in a rush.
I find it very difficult to just do what I am doing without thinking about what is coming next or when I’ll be finished with whatever I am working on.
Even as I am sitting and writing this blog post, I’m not really as immersed in the process as I should be. Instead, I am thinking about the fact that I need to get this post done and ready to be published today.
For some reason, I always feel like the clock is ticking down on me. I always feel rushed and that I need to rush things along.
I don’t think I’ve ever sat down and written something that had more than a single rough draft and a final draft. I can’t imagine having multiple drafts of a thing.
Why am I saying this? Because, lately I’ve been meditating on the phrase “anything worth doing is worth doing right.”
Am I really giving it my all?
I’ve been thinking about that phrase a lot and how much I tend to ignore it. I get a lot done, but what I get done isn’t always as satisfying as it should be, because I often find I’m not applying myself as much as I should be.
This “weakness” seems to permeate every area of my life. As I’m running or lifting weights at the gym, I often realize that I’m not giving it my all. As I am writing a blog post, or writing code, I get the same feeling of not giving 100%. When I’m playing with my daughter, or spending time with my family, I’m often not 100% there—but, it’s not like I’m somewhere else either. I’m often just sort of wandering through life a little bit “checked out.”
The best word I can use to describe this is slothfulness. I’ve been feeling this pressing need to eliminate as much slothfulness from my life as possible.
I’m beginning to realize how much time and effort is wasted on doing things in a half-ass manner. If I sit down to do some work and I don’t know exactly what I am doing, if I’m not focused on a specific task I need to get done, I end up wasting a lot of time.
But, it’s actually more than that. I’ve found ways to make sure I am focused on the task at hand in order to make sure that I don’t waste time by taking too long to accomplish a particular task, but what is more difficult is giving 100% to the task at hand. It’s quite possible to be 100% focused, but not to be giving it all you’ve got.
There is a huge penalty in not giving it all you’ve got. This is the real struggle—at least for me—at least right now.
I know the work I am producing could be better. I know the time I’m spending could be more fulfilling, if, I could just fully subscribe to the belief that anything worth doing is worth doing right.
Fixing the problem
The good news is that I have been thinking about some ways to combat this problem. Here are some of my ideas:
First of all, I am going to try and not do anything unless I know what I am going to do and I am going to devote 100% of my focus to that activity.
That doesn’t mean that I have to plan out every aspect of my day ahead of time, but it means that I have to at least plan out what I am going to do before I do it.
For example, today I decided that I was going to go to a coffee shop and get the intro letter for early readers of my book done, write an email that talked about the revisions to the chapters in my book and write this blog post.
I didn’t plan for reading through my email, checking Facebook or doing anything else during that time. I’m sitting here working on exactly what I had planned to work on and I am putting my full focus into that work.
I’ll also plan out when I’ll do certain things so that they aren’t hanging over my head and distracting me from other things I am doing. I find that I can’t focus on the task at hand when I have some uncertainty about another task that I need to get done. Whenever I feel that uncertainty about something that needs to get done, my plan is to schedule it so that I can take it off my mind.
Next up, I’m going to try to have a bit more rigorous standards for what I am doing before I start doing it. I’ve found that it’s often difficult for me to decide what “doing something right” means. It’s pretty subjective and when I feel like I am done with a task, my judgment tends to be skewed. I’m likely to call something done that is “good enough” rather than “right.”
Sometimes the effort to take something from “good enough” to “right” is very small, so it is worth taking the extra time and putting forth the extra effort to go the last mile. I can spend a large amount of time and effort on a task or project and have this gnawing feeling of discontent if I am willing to accept “good enough.” This acceptance of “good enough” often negates the entire reward of the effort, so I want to strive towards doing things right instead of just “good enough,” even if it takes more time.
That brings me to the next point: stop rushing.
I’m always rushing. Always trying to get things done as fast as possible so that I can be as prolific as possible. While being more prolific might have a higher monetary reward, I’ve found it often comes at the cost of feeling discontent with the work being done.
This one is going to be one of the most difficult ones for me. Even now, thinking about this very subject, my fingers are still frantically striking the keyboard as I glance at the clock, worried about how long it is taking me to write this post.
I think a solution to this problem may be to block out ample blocks of time to work on a thing. To purposely give myself breathing room. For example, I might feel less rushed if I came here to write a blog post, that I figured would take me about an hour, but I gave myself two hours to work on it instead. And, if I forced myself to spend the entire allotted time working on it, I would probably not feel rushed and I’d would produce an overall better product.
The next task I do, I am going to try and block off time and force myself to use the entire allotted time.
Living in the moment
Let’s see what else is left. How about living in the moment—another extremely difficult one for me now. I have a difficult time stopping to smell the roses. I imagine that if I stop rushing, I’ll probably solve this problem as well, but for now, I am going to try to start purposely giving 100% to what I am doing at any given time.
With every activity I am doing, work or otherwise, I am going to try and focus 100% on what I am doing and also give 100% to that activity. This one will be difficult—I am sure of it. But, this might be the most important thing to focus on. Sometimes I feel like my life is passing me by because I’m always looking forward or backward—I’m never taking time to stop and smell the roses.
One aspect of this that I have been thinking about is to actively think about what I am doing at any given moment and to clearly define it. For example, if I am sitting on the couch, I should ask myself what am I doing. Am I having a conversation with someone? Am I relaxing? Am I doing something else? At any given time I should be able to define what it is I am doing. It doesn’t necessarily have to be something productive. It is better to actively decide that I am spending time browsing Facebook than it is to just be sitting at a computer “doing nothing.”
In fact, I just purchased The Power of Now: A Guide to Spiritual Enlightenment. Not sure if this book is good or not, but several people have recommended it to me and it came to mind today.
Drop more stuff
Finally, I think I need to drop anything that I am not going to do right. This is the full interpretation of “anything worth doing is worth doing right.” I simply need to make a rule that if I am not willing to do something right, if I am not willing to devote my full energy to it, if I am not willing to slow down and not rush through it, then I simply should not do it at all.
I often have thought that if I stopped splitting my focus so much that I’d be able to be much more successful at the things I do choose to do. This is another difficult one for me, because I tend to see one of my greatest assets as my ability to do so many different things. It’s scary and dangerous to either drop things that I am used to doing or to recommit to them, giving 100% effort.
At a surface level, I know that it would be better to focus on a smaller number of things and to dive deeper into those things, but at a deeper level, I’m scared to do it. I’m the kind of person that likes to leave as many doors open as possible. The thought of closing some doors scares me, but I know I need to do it.
Well, that is about it. I’m trying to use this time in Hawaii, away from my normal schedule to be as introspective as possible. Expect some big changes in the next few months as I start to get everything figured out and set the course for the future.
On any given day my inbox is full of emails from software developers asking me for advice on all kinds of topics. Even though many of these questions are unique, I’ve found that many of the emails have one root, all-encompassing solution: taking action.
Most people never actually do anything with their lives.
Most people are so afraid to make a mistake that they make the biggest mistakes of all—they do nothing.
If you are completely honest with yourself, you’ll probably find that some of the biggest, most important questions you have, you already know the answer to.
You already know what you should do. You might be a bit unsure of your answer, you might feel like you need to think about things more or get some more opinions, but deep down, inside, when you really look hard, you already know the answer.
So, why don’t you just do what you need to do?
In fact, if you just started doing what you know you should be doing right now, if you would just take action, you’d have a much better life, a more successful career, and you’d probably be a lot healthier as well.
At some level we all know this is true, yet we have such a difficult time doing what we are supposed to do.
Again, the question is why.
There are many different whys, but I think it usually starts with the problem of uncertainty. We can do our best to make a decision, but we can’t ever really know for sure if we are right—at least not till we take some action and move forward.
I get a lot of software developers asking me how to improve their career or whether or not they should invest their time in a particular technology or platform. Most of the time these software developers already know the answer to these questions, but they are unsure of the answers they have come up with. They are looking for an outside party to validate what they already know. They are looking for me to bring some certainty to this uncertain world.
Unfortunately, I can’t. I mean, sure, I can tell you that I think learning mobile development is a good idea and that the approach you have planned out sounds reasonable. But, I can’t know for sure. Neither can you.
Life is too complicated to know for sure that some choice or path will lead to success—even if we imagine that we can define exactly what success is—which is more difficult than it sounds. The truth is that you might have to go down many paths to eventually find success. You might have to make a lot of mistakes and fail many times before you find the correct path.
And—that itself isn’t even accurate. What I actually mean is that the correct path has to be carved out. It doesn’t exist yet. You can’t see far enough ahead of you now to even know what the path looks like. As you walk the path, as you encounter and overcome obstacles, as you make slight course corrections and change directions, you discover and create the path at the same time.
Now, some of us are held back by more than just uncertainty. Sometimes you know exactly what you should be doing, what action you should take, but you just don’t want to do it.
Most often when we are stopped by this barrier, we call it procrastination. We don’t just say we aren’t going to do what we know we should be doing, but instead we put it off until later. Your mind has a much easier time saying “I’ll do it tomorrow” than admitting that you have no intention of doing something—especially when you know it needs to be done.
(For a good book that can help you get past this habit, check out: Eat That Frog!: 21 Great Ways to Stop Procrastinating and Get More Done in Less Time)
Often the correct path is the difficult one. You might find yourself holding out for a simpler solution; waiting for someone else to blaze a path for you; to cut down the overgrowth with their machete and to build a nice smooth road for you to travel.
The reality of the situation though is that there is no one coming to rescue you and give you a simple solution. In fact, the brush may become more overgrown the longer you wait to take action.
Growth is often uncomfortable. Action that leads to growth can be quite painful. When I go into the gym in the morning and lift a heavy weight, it doesn’t exactly feel good. When I sit down to write a long blog post, it doesn’t feel that great either. It’s a bit painful to do something that will improve you or advance you in some way. Don’t waste your effort trying to avoid the pain, just face it head on and realize it is the only path to growth.
And let’s not forget the fear of failure. The reason why I hesitated so much to write the first few sentences of this post is because I thought it might suck. I still do. As I am typing this very sentence, I am tempted to highlight all the text above and push delete.
What finally got me to start writing? Well, I decided that I need to get a post done for this week and that no post is ever going to be as good as I want it to be, but that doesn’t matter. What matters is that I do something. Sure, this post might suck, but I’ve decided I am ok with that. What I am not ok with is doing nothing. I’m not ok with sitting here in this coffee shop browsing Facebook while I think about the perfect post to write and exactly how to word it. I’m not ok with letting a Monday go by that I don’t have a blog post to publish, because I’m too afraid to take action.
Perhaps that is where you are today. Perhaps you know what you should do, you are even willing to do it, but you are just so afraid of doing it and failing that you sit at your desk paralyzed with fear. If that describes your current situation, I want you to consider something: what is the cost of not acting?
The cost of doing nothing
What will certainly happen if you take no action at all? Think carefully about what the consequences of failure are versus the consequences of stagnation. Would it be better to do something and have it turn out less than you expected than it would be to do nothing at all?
Sure, in a few cases it is actually better to do nothing than to risk a critical failure. But, if we are honest with ourselves, we have to admit that those instances are pretty rare. In almost all cases it is much more beneficial to take some kind of action—even if it results in failure—than to do nothing at all.
Besides, usually when we fail we learn something—often, it is the only way to learn something or to make any progress. If we aren’t willing to embrace a few failures, take it on the chin a few times, we’ll never advance. You don’t become a world-class boxer without being punched in the face a few times.
So, bottom line is: if you are wondering what you should do with your life, if you are questioning what you should do with your career or what programming language you should learn, don’t ask me… ask yourself. But, don’t just ask yourself, actually take action and do something. Don’t worry if what you do ends up being wrong. Just don’t sit idle and let opportunity pass you by. I’ve made a lot of mistakes in my career. I’d say I bat at perhaps 25% on average. But, at the risk of sounding cliché, I miss 100% of the shots I don’t take.
Hey, did you like this post? Want to take some action right now? Join the Simple Programmer community by clicking here and you’ll be part of a community of over 5,000 other software developers who want to improve their careers and their lives by taking a holistic approach to software development.
I’m often surprised how many software developers neglect to do any salary negotiations at all or make a single attempt at negotiating their salary and then give up and take whatever is offered.
Negotiating your salary is important—not just because the dollars will add up over time and you could end up leaving a lot of money on the table—but, also because how you value yourself and how you handle yourself in a salary negotiation will greatly influence how you are perceived at the company you are working for.
Once you are part of a company it is difficult to shake the first impression that has been pinned on you. If you handle salary negotiations in a tactful way that indicates your value while still respecting your prospective employer, you’ll likely paint yourself in a more positive light which can have huge implications on your future career with that company.
Negotiations begin before you even apply for the job
Your ability to negotiate your salary will be greatly influenced by your reputation. Think about a famous athlete or movie star, how much negotiation power does having a well-recognized name have for either of these professions? The same is true for software development or any other field. The more recognized your name is, the more power you will have when it comes to negotiations.
So what can you do to build up a name in the software development field?
For some people it will happen by chance, but for most software developers it will require some careful planning and tactics. If you follow this blog, you probably know that I highly recommend building a personal brand and actively marketing yourself as a software developer.
The basic strategy to do this is to get your name out there through as many different mediums as possible. Write blog posts, get on podcasts, write books or articles, speak at conferences and user groups, create video tutorials, contribute to open source projects and whatever else you can do to get your name out there.
Since, marketing yourself isn’t the topic of this post, I won’t go into details here, but if you are interested in learning more about marketing yourself as a software developer, you can check out this post on the topic or if you want a real in-depth treatment of the topic, you can check out my How to Market Yourself as a Software Developer course.
Just remember the better job you do of marketing yourself and building a reputation, the easier it will be for you to negotiate. This might even be the most important factor. I’ve worked with software developers who have been able to literally double their salaries based on nothing but building up a bit of a personal brand and online reputation.
How you get the job is extremely important
The second biggest factor that will influence your ability to negotiate your salary will be how you got the job. There are many different ways to get a job and not all of them are equal. Let’s examine a few different ways you might get a job.
First, you might get a job by seeing a job posting and cold-applying to that job posting with your resume and hopefully a good cover-letter. In fact, many job seekers think this is the only way to get a job. This is in fact the worst way to get a job. If you get a job in this manner, it is difficult to have a good negotiating position, because you are in a much weaker position than the employer. You are the one taking all the initiative and asking for the job.
The person with the greatest need always has the disadvantage when negotiating anything. Ever played monopoly? Ever tried to negotiate with someone who didn’t really need anything from you, but you needed one of their properties to complete your monopoly? How did that go?
Another way to get a job is through personal referral. You know someone who works at a company, they personally refer you for the job and you end up getting offered the job. This is definitely a much better situation than just applying for a job. In fact, you should always try to get a personal referral when you are actively seeking a job. In this situation, the prospective employer might not even know that you are actively looking for a job—so, your need is going to register as less. And, because you got a personal referral, you already have some credibility. You are essentially borrowing the credibility of the person who referred you for the job. I’m sure you can figure out that the higher credibility of the person who referred you for the job, the higher credibility you will have. This credibility will greatly influence your ability to negotiate when given an offer.
Ok, so how else can you get a job? How about the best way possible? When the company who offers you a job finds you and comes after you either directly offering you the job or asking you to apply for it. How the situation presents itself will influence your negotiating power. Obviously, your best situation would be if a company knows of you and directly offers you a position without even an interview. In that case you’ll be able to just about name your own price. But, any time an employer directly seeks you out, you’ll have a very good position to negotiate from.
Now, you might be thinking “yeah right, an employer is not going to directly seek me out, much less offer me a job without an interview.” I’ll admit, it is somewhat rare, but it does happen. The best way to make these kinds of opportunities happen is to build up a name for yourself and market yourself like I mentioned in the first section of this post.
First person to name a number loses
Ok, so now that we’ve covered the preliminaries—which are actually the most important part of negotiating your salary—let’s get into the actual details of negotiations.
One important thing to understand is that the first person to name a number is at a distinct disadvantage. In any kind of negotiation, you always want to act second. Here’s why:
Suppose you applied for a job and you expected that the salary for that job was $70,000. You get offered the job and the first question you are asked is what your salary requirements are. You state that you are looking for something around $70,000. Perhaps you are even clever and say somewhere in the range of $70,000 to $80,000. The HR manager immediately offers you a salary of $75,000. You shake hands, accept the deal and are pretty happy—only there is one big problem: The HR manager had budgeted a range from $80,000 to $100,000 for the job. Since you named a number first, you ended up costing yourself potentially as much as $25,000 a year—whoops.
You might think this is an extreme example, but it isn’t. You have no way of knowing what someone else is expecting to offer until they tell you. Revealing your number first puts you at a distinct disadvantage. You can’t go up from the number you state, but you can certainly be talked down. So, when you name a number first, you have no upside, but a big downside potential.
Oh, but you are more clever than that you say. I’ll just name a really high number. This can blow up in your face as well. If you name too high of a number, you might not even get countered, or you may get countered very low in response. It is almost always to your advantage to have the employer name a number first.
The only exception to this is when an employer is purposely going to low-ball you. This situation is pretty rare, but if you have a good reason to suspect this will happen, you may want to name a number first, to set an anchor point. Why? Because if you get a low-ball number, it may be difficult to get an employer to come up a lot from that number. Of course, in that situation, you probably aren’t going to have much success no matter what you do.
But, what about when you are asked to name a number first?
Don’t do it. Just say “no.”
Yes, I know this is tough advice to follow, but let me give you some specific situations and some ways to deal with them.
First of all, you may get asked about your salary requirements before an interview or as a field on a job application. If you have a field on a job application, leave it blank if possible or simply put “negotiable depending on overall compensation package.” If you have to name a specific number, put $0 and then explain why later.
If you get asked directly in a pre-screening interview about what salary you require or are expecting try to answer the same thing. Say it depends on the overall compensation including benefits. You may get a response stating what the benefit would be or that they just need a general number. In this case, you should try to as tactfully as possible turn the question around and ask a series of questions like the following:
“I’d rather learn more about your company and understand more about the job I would be doing before naming an exact number or estimate, but it sounds like you are just trying to figure out if we are in the right range, so we don’t both waste our time—is that correct?”
Mostly likely you’ll get a yes. Then follow up with something like this.
“You must have a range that you have budgeted for this particular position, right?”
Again, you should get a yes. If you are brave, just pause here and don’t say anything else. You may then get them to answer with the range, but if you aren’t brave or they aren’t volunteering any information, you can follow up with:
“Well, if you tell me what the range is, even though I don’t know enough to state exactly what my salary requirements are, I can tell you whether or not the range matches up to what I am looking for.”
Now, obviously, this isn’t easy to do, but if an employer is going to ask you to name a number, there is no reason why they shouldn’t expect to name one as well—or even first. Try as hard as you can to get them to name one first.
If they absolutely refuse, you still have some options.
If you have to name a number, name a large range and make it conditional on the overall compensation package, but make sure the lower end of the range is slightly above the absolute lowest you are willing to go.
For example, you might say: “I can’t really name an exact figure because it is completely dependent on what the overall compensation package is, but I would generally be looking for something between $70,000 and $100,000—again, depending on the overall compensation package.”
What if you are asked about your current salary?
This is a tough one; technically it’s none of their business, but you can’t exactly say that. Instead, what you want to do is to turn the question around. There are a variety of different ways to do this, but here is one suggestion:
“I’d prefer not to say what my current salary is because if it is higher than what you expect to pay for this job, I wouldn’t want that to eliminate me from being considered for this job—since, I might be willing to accept less for the right position—and, if it is lower than what this job would pay, I wouldn’t want to sell myself short either—I’m sure you can understand.”
This is a pretty honest answer, which will mostly likely avoid the question without causing offense. You can also state that you’d just prefer not to answer that question or that you are under a confidential agreement with your employer to not talk about exact salary numbers.
If you absolutely have to name a number, try to make the number as variable as possible by talking about bonuses or benefits that affect the overall compensation or state it as the overall compensation package is valued at x dollars and add up what any benefits you are getting are worth.
When you have an offer
If you can avoid the salary question, you’ll eventually get an offer and it will have to have a number on it. You can’t really get an offer without a number, because it wouldn’t really be an offer. But, negotiations don’t end when you get an offer, that is unless of course you named a number and they gave it to you—whoops.
(By the way, if you are in this situation, don’t try and pull any stunts. If they give you what you asked, you pretty much have to either take it or leave it. If you name a higher number than you first asked, not only will it be bad taste, but you’ll likely get the entire offer pulled.)
Once you have an offer in hand, you will almost always want to counter. What you counter with is up to you, but I’d highly recommend countering as high as your stomach will allow. You might think that by coming closer to their number, you’ll be more likely to get a favorable response, but in general that approach will backfire. Pick a high number and counter back.
Now, you might be worried that doing this will cause you to lose the offer completely. As long as you do it in a tactful way, it is pretty unlikely that the offer will be completely taken off of the table. Usually, the worst case scenario is they stay firm on their offer and tell you that you’ll have to take it or leave it. If the offer does get pulled, you can always respond by saying that you made a mistake and after weighing everything you realized that their original offer was more than fair. (Not fun, but if you really need the job, you can always go down that road.)
The fact of the matter is that once you are offered a job, you aren’t likely to just get that offer pulled. Remember, an employer that has invested that much time in interviewing you and making an offer isn’t going to want to just start over again, so you can afford to be a little brave.
In most cases when you counter, with your high counter, you’ll get back another response with a slightly higher offer. You can accept this offer, but in most cases, I’d recommend countering just one more time. Be careful here, because you can piss people off. But, one tactful way to do it is to say something like this:
“I’d really like to work for your company. The job sounds great and I am excited to work with your team, but I am still just a bit unsure on whether the numbers will work out. If you can do x dollars, I can be sure and commit to it today.”
If you do this right and don’t ask for something too much higher, you can usually get a yes. Most employers would rather pay you a little bit more rather than lose you. Worst case, usually, is that they will tell you they can’t go any higher.
I really don’t recommend negotiating beyond this point. If you are really brave you can try, but past a second counter-offer, you are really risking losing good-will and souring the deal. You want to appear shrewd, but not greedy. No one likes to feel like they just got worked or taken advantage of.
(For a good book on negotiation, check out: Getting Past No: Negotiating in Difficult Situations)
Some final advice
Know your numbers well. Research as much as possible what the salary ranges are at the company you are applying for and what the salary ranges are for comparable positions. There are some sites online you can use to get salary ranges, although they aren’t always reliable. The better the case you can make for what your salary should be, the easier your negotiations will be. You are in a much better position if you can name exact number ranges and statistics that show why the salary you are asking for is justified.
A reason for the salary you are requesting is never because you “need” that much money. No one cares what you need. Instead talk about why you are worth a certain amount or what benefit you can bring to the table. Talk about what you have done for past employers and why investing in you at the salary you are requesting is a good investment.
Get as many offers as possible at any one time, but be careful playing them against each-other. You are at a distinct advantage in any negotiation if you can afford to walk away from the deal. To be in this position, you may need to get multiple offers lined up, so you may want to apply for several jobs all at once. Just be a bit careful in playing different offers against each other. You can do it in a tactful way by talking about how you have a couple of offers you are currently considering and want to make the best decision, but be careful not to sound arrogant. Confidence is good, arrogance is bad.
Become a Simple Programmer
Like this post? Found it helpful? Leave a comment below or share it and don’t forget to sign up to become part of the Simple Programmer community. Over 5,000 other developers have already joined.
For quite some time now I’ve been putting together, in my mind, what I think are the four distinct levels that software developers can go through in trying to gain their “freedom.”
For most of my software development career, when I worked for a company, as an employee, I had the dream of someday being free. I wanted to be able to work for myself. To me, that was the ultimate freedom.
But, being naive, as I was, I didn’t realize that there were actually different levels of “working for yourself.” I just assumed that if you were self-employed, you were self-employed. It turns out most software developers I have talked to about this topic have the same views I did—before I knew better.
I’ve written in the past about how to quit your job, but this post is a bit different. This post is not really about how to quit your job, but the different levels of self-employment you can attain, after you do so.
The four levels
The four levels I am about to describe are based on the level of freedom you experience in your work; they have nothing to do with skill level. But, generally we progress up these levels as we seek to, and hopefully succeed, in gaining more freedom. So, most software developers start at level one, and the first time they become self-employed, it is usually at level three—although it is possible to skip straight to three.
Here is a quick definition of the levels (I’ll cover them each in detail next.)
- Employed – you work for someone else
- Freelancer – you are your boss, but you work for many someone elses
- Product creator – you are your own boss, but your customers determine what you work on
- Financially free – you work on what you want when you want; you don’t need to make money
I started my career at level one and bounced back and forth between level two and level one for quite awhile before I finally broke through to level three. I’m currently working on reaching level four—although, I’ve found that it is easy to stay at level three even though you could move to four.
Along the way, I’ve found that at each level I was at, I assumed I would feel completely free when I reached the level above. But, each time I turned out to be wrong. While each level afforded me more general freedom, each level also seemed to not be what I imagined it would be.
Level one: employed
Like I said, most software developers start out at this level. To be honest, most software developers stay at this level—and don’t get me wrong, there is nothing wrong with staying there—so long as you are happy.
At this level, you don’t have much freedom at all, because you basically have to work on what you are told to work on, you have to work when you are told and you are typically tied to a physical location. (Throughout this post, you’ll see references to these three degrees of freedom.)
Working for someone else isn’t all that bad. You can have a really good job that pays really well, but in most cases you are trading some amount of security for a certain amount of bondage. You are getting a stable paycheck on a regular interval, but at the cost of a large portion of your freedom.
Now, that doesn’t mean that you can’t have various levels of traditional employment. I think there are mini-levels of freedom that exist even when you are employed by someone else. For example, you are likely to be afforded more freedom about when you start and leave work as you move up and become more senior at a job. You are also likely to be given a bit more autonomy over what you do—although Agile methodologies may have moved us back in that regard.
You might even find freedom from location if you are able to find a job that allows you to telecommute. In my quest for more freedom, I actually made a trade of a considerable amount of pay in order to accept a job where I would have the freedom of working from home. I erroneously imagined that working from home would be the ultimate freedom and that I would be content working for someone else the rest of my career, so long as I could do it from home. (Don’t get me wrong, working from home has its perks, but it also has its disadvantages as well. When I worked from home, I felt more obligated to get more work done to prove that I wasn’t just goofing off. I also felt that my work was never done.)
Now, like I said before, more people will stay at level one and perhaps move around, gaining more freedom through things like autonomy and a flexible working schedule, but there are definite caps on freedom at this level. No one is going to pay you to do what you want and tell you that you can disappear whenever you want to. You are also going to have your income capped. You can only make so much money working for someone else and that amount is mostly fixed ahead of time.
Level two: freelancer
So, this is the only other level that I had really imagined existed for a software developer, for most of my career. I remember thinking about how wonderful it would be to work on my own projects with my own clients. I imagined that as a freelancer I could bid on government contracts and spend a couple of years doing a contract before moving on to the next. I also imagined an alternative where I worked for many different clients, working on different jobs at different times—all from the comfort of my PJs.
When most software developers talk about quitting their jobs and becoming self-employed, I think this is what they imagine. They think, I like I did, that this is the ultimate level of freedom.
It didn’t take me very long as a freelancer to realize that there really wasn’t much more freedom, working as a freelancer, than there was working for someone else. First of all, if you have just one big client, like most starting freelancers do, you are basically in a similar situation as what you are when you are employed—the big difference is that now you can’t bill for those hours you were goofing off. You will likely have more freedom about your working hours and days, but you’ll be confined to the project your client has hired you to work on and you might even have to come into their office to do the work.
This doesn’t mean that you don’t have more freedom though, it is just a different kind. If you have multiple clients, you have more control over your life and what you work on. You can set your own rate, you can set your own hours and you can potentially turn down work that you don’t want to do—although, in reality, you probably won’t be turning down anything—especially if you are just starting out.
Don’t get me wrong, it is nice to have your own company and to be able to bill your clients, instead of being compelled to work for one boss who has ultimate control over your life, but freelancing is a lot of work and on a daily basis it may be difficult to actually feel more free than you would working for someone else.
Given the choice of just doing freelancing work or working for someone else, I’d rather just take the steady paycheck. I wouldn’t have said this five years ago, but I know now that freelancing is difficult and stressful. I really wouldn’t go down this road unless you know this is what you want to do or you are using it as a stepping stone to get to somewhere else.
From a pay perspective, a freelancer can make a lot more money than most employees. I currently do freelance work and I don’t accept any work for less than $300 an hour. Now, I didn’t start at that rate—when I first started out $100 an hour was an incredible rate—but, I eventually worked my way up to it. (If you want to find out how, check out my How to Market Yourself as a Software Developer package.) The big thing though, is that your pay is not capped. The more you charge and the more hours you work, the more you make. You are only limited by the limits of those two things combined.
Level three: product creator
This level is where things get interesting. When I was mostly doing freelancing, I realized that my key mistake was not in working for someone else, but in trading dollars for hours. I realized that as a freelancer my life was not as beautiful as I had imagined it. I was not really free, because if I wasn’t working I wasn’t getting paid.
I actually ended up going back to fulltime employment in order to rethink my strategy. The more and more I thought about it, the more I realized that in order to really gain the kind of freedom I wanted, I would need to create some kind of product that I could sell or some kind of service that would generate me income all the time without me having to work all the time.
There are many ways to reach this level, but perhaps the most common is to build some kind of software or software as a service (SASS) that generates income for you. You can then make money from selling that product and you get to work on that product when and how you see fit.
You can also reach this level by selling digital products of some sort. I was able to reach this level through a combination of this blog, mobile apps I built, creating royalty generating courses for Pluralsight and my own How to Market Yourself as a Software Developer package. (Yes, I have plugged it twice now, but hey this is my blog—and this is how I make money.)
You have quite a bit of freedom at this level. You no longer have any real boss. There is no pointy-haired boss telling you what to work on and you don’t have clients telling you what projects to work on either. You most likely can work from anywhere you want and whenever you want. You can even disappear for months at a time—so long as you figure out a way to handle support.
Now, that doesn’t mean that everything is peaches and roses at this level either. For one thing, I imagined that if I was creating products, that I would get to work on exactly what I wanted to work on. This is far from the truth. I have a large degree of control over what I choose to work on and create, but because I am bound by the need to make money, I have to give a large portion of that control over to the market. I have to build what my customers will pay for.
This might not seem like a big deal, but it is. I’ve always had the dream of writing code and working on my own projects. I dreamed that being a product creator and making money from my own products would give me that freedom. To some degree it does, but I also have to pay careful attention to what my audience and customers want and I have to put my primary focus on building those things.
This level is also quite stressful, because everything depends on you. You have to be successful to get paid. When you are an employee, all you have to do is show up. When you are a freelancer, you just have to get clients and do the work—you get paid for the work you put in, not the results. When you are a product creator, you might spend three months working on something and not make a dime. No one cares how much work you did, only results count.
As far as income potential, there is no cap here. You might struggle to just make enough to live, but if you are successful, there is no limit to how much you could earn, since you are not bound by time. At this level you are no longer trading hours for dollars.
To me, it isn’t worth striving for level two, it is better to just work for someone else until you can reach level three, because this level of freedom is one that actually makes a big difference in your life. You still may not be able to work on just what you want to work on, but at least at this point—once you are successful—all the other areas of your life start to become much more free.
Level four: financially free
I couldn’t come up with a good name for this level, but this is the level where you no longer have to worry about making money. One thing I noticed when I finally reached level three was that a large portion of what was holding me back from potentially doing exactly what I wanted to do was the need to generate income.
Now, it’s true that you can work on what you want to work on and make money doing it, but often the need to generate income tends to influence what you work on and how you work on it. For example, I’d really like to create a video game. I’ve always dreamed of doing a large game development project. But, I know it isn’t likely to be profitable. As long as I am worrying about income, my freedom is going to be limited to some degree. If I don’t have passive income coming in that is more than enough to sustain me, I can’t just quit doing the projects that do make me money and start writing code for a video game—well, I could, but it wouldn’t be smart, and I’d feel pretty guilty about it.
So, in my opinion, the highest form of freedom a software developer can achieve is when they are financially free. What do I mean by financially free though? It basically means that you don’t have to worry about cash. Perhaps you sold your startup for several millions of dollars or you have passive income coming in from real estate or other investments that more than provides for your daily living needs. (For some good information on how to do this or how this might work, I recommend starting with the book “Rich Dad Poor Dad”.)
At this level of freedom, you can basically do what you want. You can create software that interests you, because it interests you—you aren’t worried about profitability. Want to create an Android app, just because, go ahead. Want to learn a new programming language, because you think it would be fun—go for it.
This has always been the level of freedom I have secretly wanted. I never wanted to sit back and not do anything, but I’ve always wanted to work on what interested me and only what interested me. Every other level that I thought would have this freedom, I realized didn’t. I realized that there was always something else that was controlling what I worked on, be it my boss, my clients or my customers.
Now, this doesn’t mean that you can’t still make money from your projects. In fact, paradoxically, I believe, if you can get to this stage, you have the potential to make the most money. Once you start working on what you want to work on, you are more likely to put much more passionate work into it and it is very likely that it will be of high value. This is where programming becomes more like art. I don’t have any proof of this, of course, but I suspect that when you don’t care about making money, because you are just doing what you love, that is when you make the most of it.
Don’t get me wrong, you might be able to focus on doing what you love, even if you aren’t making any money. I know plenty of starving artists do—or at least they tell themselves they do—but, I can’t do it. I’ve tried it, but I always feel guilty and stressed about the fact that what I am working on isn’t profitable. In my opinion, you really have to be financially free to experience true creative freedom.
I’m actually working on getting to this level. Technically, I could say I am there now, but I am still influenced greatly by profitability. Although, now, I am not choosing my projects solely on the criteria of what will make the most amount of money. I am turning down more and more projects and opportunities that don’t align with what I want to do as I am trying to transition to working on only what interests me as my passive income is increasing.
What can you gather from all this?
Well, the biggest thing is that freedom has different levels and that, perhaps, you don’t want to be a freelancer, after all. I think many software developers assume working for themselves by freelancing will give them the ultimate freedom. They don’t realize that they’ll only be able to work on exactly what they want to work on when they are actually financially free.
So, my advice to you is that if you want to have full creative control over your life and what you work on, work on becoming financially free. If you want a high degree of autonomy in most of the areas of your life, you should try to develop and sell products. If you are happy just being your own boss, even if you have to essentially take orders from clients, freelancing might be the road for you. And, if all of this just seems like too high of a price to pay, you might want to just stay where you are at and keep collecting your weekly paychecks—nothing wrong with that.
If you like this post and you’d like to read more posts about topics like these, sign up here to join over 5,000 other Simple Programmers and become part of the Simple Programmer community.
When I first started out my career as a software developer, I didn’t have a degree.
I took my first real job when I was on summer break from my first year of college. By the time the summer was up and it was time to enroll back in school, I found that the salary I was making from that summer job was about what I had expected to make when I graduated college—only I didn’t have any debt at this point—so, I dropped out and kept the job.
But, did I make the right choice?
Do you really need a university degree to be a computer programmer?
The difference between education and school
Just because you have a college degree doesn’t mean you have learned anything. That is the main problem I have with most traditional education programs today. School has become much more about getting a degree—a piece of paper—than it has about actually learning something of value.
To some extent, I am preaching to the choir. If you have a degree that you worked hard for and paid a large amount of money for, you are more inclined to believe that piece of paper has more value than it really does.
If you don’t have a degree, you are probably more inclined to believe that degrees are worthless and completely unnecessary—even though you may secretly wish you had one.
So, whatever side you fall on, I am going to ask you to momentarily suspend your beliefs—well, biases really—and consider that both views are not exactly correct, that there is a middle-ground somewhere in between the two viewpoints where a degree isn’t necessarily worthless and it isn’t necessarily valuable either.
You see, the issue is not really whether or not a particular degree has any value. The degree itself represents nothing but a cost paid and time committed. A degree can be acquired by many different methods, none of which guarantee any real learning has taken place. If you’ve ever taken a college course, you know that it is more than possible to pass that course without actually learning much at all.
Now, don’t get me wrong, I’m not saying that you can’t learn anything in college. I’m not saying that every degree that is handed out is a fraud. I’m simply saying that the degree itself does not prove much; there is a difference between going to school and completing a degree program and actually learning something.
Learning is not just memorizing facts. True learning is about understanding. You can memorize your multiplication tables and not understand what they mean. With that knowledge, you can multiply any two numbers that you have memorized the answer for, but you would lack the ability to multiply any numbers that you don’t already have a memorized answer for. If you understand multiplication, even without knowing any multiplication tables, you can figure out how to work out the answer to any multiplication problem—even if it takes you a while.
You can be highly educated without a degree
Traditional education systems are not the only way to learn things. You don’t have to go to school and get a degree in order to become educated. Fifty years ago, this probably wasn’t the case—although I can’t say for sure, since I wasn’t alive back then. Fifty years ago we didn’t have information at our fingertips. We didn’t have all the resources we have today that make education, on just about any topic, so accessible.
A computer science degree is merely a collection of formalized curriculum. It is not magic. There is no reason a person couldn’t save the money and a large degree of the time required to get a computer science degree from an educational institution by learning the exact same information on their own.
Professors are not gifted beings who impart knowledge and wisdom on students simply by being in the same room with them. Sure, it may be easier to obtain an education by having someone spoon-feed it to you, but you do not need a teacher to learn. You can become your own teacher.
In fact, today there are a large number of online resources where you can get the equivalent of a degree, for free—or at least very cheap.
Even if you have a degree, self-education is something you shouldn’t ignore—especially when it’s practically free.
You can also find many great computer science textbooks online. For example, one the best ones is: Structure and Interpretation of Computer Programs – 2nd Edition (MIT Electrical Engineering and Computer Science)
So, is there any real benefit to having a degree?
My answer may surprise you, but, yes right now I think there is.
I told you that I had forgone continuing my education in order to keep my job, but what I didn’t tell you is that I went back and got my degree later. Now, I didn’t go back to college and quit my job, but I did think there was enough value in having an actual computer science degree that I decided to enroll in an online degree program and get my degree while keeping my job.
Why did I go back and get my degree?
Well, it had nothing to do with education. By that point, I knew that anything I wanted or needed to learn, I could learn myself. I didn’t really need a degree. I already had a good paying job and plenty of work experience. But, I realized that there would be a significant number of opportunities that I might be missing out on if I didn’t go through the formal process of getting that piece of paper.
The reality of the situation is even though you and I may both know that degrees don’t necessarily mean anything, not everyone holds the same opinion. You may be able to do your job and you may know your craft better than someone who has a degree, but sometimes that piece of paper is going to make the difference between getting a job or not and is going to have an influence on how high you can raise in a corporate environment.
We can’t simply go by our own values and expect the world to go along with them. We have to realize that some people are going to place a high value on having a degree—whether you actually learned anything while getting one or not.
But, at the same time, I believe you can get by perfectly well without one—you’ll just have a few less opportunities—a few more doors that are closed to you. For a software developer, the most important thing is the ability to write code. If you can demonstrate that ability, most employers will hire you—at least it has been my experience that this is the case.
I have the unique situation of being on both sides of the fence. I’ve tried to get jobs when I didn’t have a degree and I’ve tried to get jobs when I did have a degree. I’ve found that in both cases, the degree was not nearly as important as being able to prove that I could actually write good code and solve problems.
So, I know it isn’t necessary to have a degree, but it doesn’t hurt either.
What should you do if you are starting out?
If I were starting out today, here is what I would do: I would plan to get my degree as cheaply as possible and to either work the whole time or, better yet, create my own product or company during that time.
I’d try and get my first two years of school at a community college where the tuition is extremely cheap. During that time, I’d try to gain actual work experience either at a real job or developing my own software.
Once the two-year degree was complete, then I’d enroll in a university, hopefully getting scholarships that would pay for most of my tuition. I would also avoid taking on any student debt. I would make sure that I was making enough money outside of school to be able to afford the tuition. I realize this isn’t always possible, but I’d try to minimize that debt as much as possible.
What you absolutely don’t want to do is to start working four year later than you could be and have a huge debt to go with it. Chances are, the small amount of extra salary your degree might afford you will not make up for the sacrifice of losing four years of work experience and pay and going deeply into debt. Don’t make that mistake.
The other route I’d consider is to completely get your education online—ignoring traditional school completely. Tuition prices are constantly rising and the value of a traditional degree is constantly decreasing—especially in the field of software development.
If you go this route, you need to have quite a bit of self-motivation and self-discipline. You need to be willing to create your own education plan and to start building your own software that will prove that you know what you are doing.
The biggest problem you’ll face without a degree is getting that first job. It is difficult to get a job with no experience, but it is even more difficult when you don’t have a degree. What you need is a portfolio of work that shows that you can actually write code and develop software.
I’d even recommend creating your own company and creating at least one software product that you sell through that company. You can put that experience down on your resume and essentially create your own first job. (A mobile app is a great product for a beginning developer to create.)
What if you are already an experienced developer?
Should you go back and get your degree now?
It really depends on your goals. If you are planning on climbing the corporate ladder, then yes. In a corporate environment, you are very likely to hit a premature glass-ceiling if you don’t have a degree. That is just how the corporate world works. Plus, many corporations will help pay for your degree, so why not take advantage of that.
If you just want to be a software developer and write code, then perhaps not. It might not be worth the investment, unless you can do it for very cheaply—and even then the time investment might not be worth it. You really have to weigh how much you think you’ll be able to earn extra versus how much the degree will cost you. You might be better off self-educating yourself to improve your skills than you would going back to school to get a traditional degree.
I get quite a few emails that basically say “how do I become a good / great software developer?”
These kinds of emails generally tick me off, because I feel like when you ask this kind of question, you are looking for some magical potion you can take that will suddenly make you into a super developer.
I suspect that very few people who email me asking this question really want to know how to become a great software developer, but are instead looking for a quick fix or an easy answer.
On the other hand, I think there are some genuinely sincere developers that just don’t even know how to formulate the right questions they need to ask to get to their desired future. I think those developers–especially the ones starting out–are looking for a step-by-step guide to becoming a great developer.
I thought I would make an attempt, from my experience and the best of my knowledge, to offer up that step-by-step guide.
Now, of course, I realize that there is no magical formula and that there are multiple paths to success, but I think what follows is a reasonable outline of steps someone starting out could take to reach a pretty high level of proficiency and be generally regarded as a good–perhaps even great–developer.
Step 1: Pick one language, learn the basics
Before we can run, we have to learn to walk. You walk by learning how to program in a single programming language. You don’t learn to walk by trying to learn 50 million things all at once and spreading yourself way too thin.
Too many beginning programmers try and jump into everything all at once and don’t have the patience to learn a single programming language before moving forward. They think that they have to know all the hot new technologies in order to get a programming job. While it is true that you need to know more than just the basics of a single programming language, you have to start here, so you might as well focus.
Pick a single programming language that you think you would be likely to base your career around. The programming language itself doesn’t matter all that much, since you should be thinking for the long term here. What I mean is you shouldn’t try and learn an “easy” programming language to start. Just learn whatever language you are interested in and could see yourself programming in for the next few years. You want to pick something that will have some lasting value.
Once you’ve picked the programming language you are going to try and learn, try and find some books or tutorials that isolate that programming language. What I mean by this is that you don’t want to find learning materials that will teach you too much all at once. You want to find beginner materials that focus on just the language, not a full technology stack.
As you read through the material or go through the tutorial you have picked out, make sure you actually write code. Do exercises if you can. Try out what you learned. Try to put things together and use every concept you learn about. Yes, this is a pain. Yes, it is easier to read a book cover-to-cover, but if you really want to learn you need to do.
When you are writing code, try to make sure you understand what every line of code you write does. The same goes for any code you read. If you are exposed to code, slow down and make sure you understand it. Whatever you don’t understand, look up. Take the time to do this and you will not feel lost and confused all the time.
Finally, expect to go through a book or tutorial three times before it clicks. You will not get “programming” on the first try–no one ever does. You need repeated exposure before you start to finally get it and can understand what is going on. Until then you will feel pretty lost, that is ok, it is part of the process. Just accept it and forge ahead.
Step 2: Build something small
Now that you have a basic understanding of a single programming language, it’s time to put that understanding to work and find out where your gaps are. The best way to do this is to try and build something.
Don’t get too ambitious at this point–but also don’t be too timid. Pick an idea for an application that is simple enough that you can do it with some effort, but nothing that will take months to complete. Try to confine it to just the programming language as much as possible. Don’t try to do something full stack (meaning, using all the technologies from user interfaces all the way to databases)–although you’ll probably need to utilize some kind of existing framework or APIs.
For your first real project you might want to consider copying something simple that already exists. Look for a simple application, like a To-Do list app and straight out try to copy it. Don’t let your design skills stand in the way of learning to code.
I’d recommend creating a mobile application of some kind, since most mobile applications are small and pretty simple. Plus, learning mobile development skills is very useful as more and more companies are starting to need mobile applications. Today, you can build a mobile application in just about any language. There are many solutions that let you build an app for the different mobile OSes using a wide variety of programming languages.
Regardless of what you choose to build, you are probably going to have to learn a little bit about some framework–this is good, just don’t get too bogged down into the details. For example, you can write a pretty simple Android application without having to really know a lot about all of the Android APIs and how Android works, just by following some simple tutorials. Just don’t waste too much time trying to learn everything about a framework. Learn what you need to know to get your project done. You can learn the details later.
Oh, and this is supposed to be difficult. That is how you learn. You struggle to figure out how to do something, then you find the answer. Don’t skip this step. You’ll never reach a point as a software developer where you don’t have to learn things on the spot and figure things out as you go along. This is good training for your future.
Step 3: Learn a framework
Now it’s time to actually focus on a framework. By now you should have a decent grasp of at least one programming language and have some experience working with a framework for mobile or web applications.
Pick a single framework to learn that will allow you to be productive in some environment. What kind of framework you choose to learn will be based on what kind of developer you want to become. If you want to be a web developer, you’ll want to learn a web development framework for whatever programming language you are programming in. If you want to become a mobile developer, you’ll need to learn a mobile os and the framework that goes with it.
Try to go deep with your knowledge of the framework. This will take time, but invest the time to learn whatever framework you are using well. Don’t try to learn multiple frameworks right now–it will only split your focus. Think about learning the skills you need for a very specific job that you will get that will use that framework and the programming language you are learning. You can always expand your skills later.
Step 4: Learn a database technology
Most software developers will need to know some database technology as most series applications have a back-end database. So, make sure you do not neglect investing in this area.
You will probably see the biggest benefit if you learn SQL–even if you plan on working with NoSQL database like MongoDB or Raven, learning SQL will give you a better base to work from. There are many more jobs out there that require knowledge of SQL than NoSQL.
Don’t worry so much about the flavor of SQL. The different SQL technologies are similar enough that you shouldn’t have a problem switching between them if you know the basics of one SQL technology. Just make sure you learn the basics about tables, queries, and other common database operations.
I’d recommend getting a good book on the SQL technology of your choice and creating a few small sample projects, so you can practice what you are learning–always practice what you are learning.
You have sufficient knowledge of SQL when you can:
- Create tables
- Perform basics queries
- Join tables together to get data
- Understand the basics of how indexes work
- Insert, update and delete data
In addition, you will want to learn some kind of object relational mapping technology (ORM). Which one you learn will depend on what technology stack you are working with. Look for ORM technologies that fit the framework you have learned. There might be a few options, so you best bet is to try to pick the most popular one.
Step 5: Get a job supporting an existing system
Ok, now you have enough skills and knowledge to get a basic job as a software developer. If you could show me that you understand the basics of a programming language, can work with a framework, understand databases and have built your own application, I would certainly want to hire you–as would many employers.
The key here is not too aim to high and to be very specific. Don’t try and get your dream job right now–you aren’t qualified. Instead, try and get a job maintaining an existing code base that is built using the programming language and framework you have been learning.
You might not be able to find an exact match, but the more specific you can be the better. Try to apply for jobs that are exactly matched to the technologies you have been learning.
Even without much experience, if you match the skill-set exactly and you are willing to be a maintenance programmer, you should be able to find a job.
Yes, this kind of job might be a bit boring. It’s not nearly as exciting as creating something new, but the purpose of this job is not to have fun or to make money, it is to learn and gain experience.
Working on an existing application, with a team of developers, will help you to expand your skills and see how large software systems are structured. You might be fixing bugs and adding small features, but you’ll be learning and putting your skills into action.
Pour your heart into this job. Learn everything you can. Do the best work possible. Don’t think about money, raises and playing political games–all that comes later–for now, just focus on getting as much meaningful productive work done as possible and expanding your skills.
Step 6: Learn structural best practices
Now it’s time to start becoming better at writing code. Don’t worry too much about design at this point. You need to learn how to write good clean code that is easy to understand and maintain. In order to do this, you’ll need to read a lot and see many examples of good code.
Beef up your library with the following books:
- Code Complete
- Clean Code
- Working Effectively With Legacy Code
- Programming Pearls - (do the exercises)
Language specific structural books like:
At this point you really want to focus your learning on the structural process of writing good code and working with existing systems. You should strive to be able to easily implement an algorithm in your programming language of choice and to do it in a way that is easy to read and understand.
Step 7: Learn a second language
At this point you will likely grow the most by learning a second programming language really well. You will no doubt, at this point, have been exposed to more than one programming language, but now you will want to focus on a new language–ideally one that is significantly different than the one you know.
This might seem like an odd thing to do, but let me explain why this is so important. When you know only one programming language very well, it is difficult to understand what concepts in software development are unique to your programming language and which ones transcend a particular language or technology. If you spend time in a new language and programming environment, you’ll begin to see things in a new way. You’ll start to learn practicality rather than convention.
As a new programmer, you are very likely to do things in a particular way without knowing why you are doing them that way. Once you have a second language and technology stack under your belt, you’ll start to see more of the why. Trust me, you’ll grow if you do this. Especially if you pick a language you hate.
Make sure you build something with this new language. Doesn’t have to be anything large, but something of enough complexity to force you to scratch your head and perhaps bang it against the wall–gently.
Step 8: Build something substantial
Alright, now comes the true test to prove your software development abilities. Can you actually build something substantial on your own?
If you are going to move on and have the confidence to get a job building, and perhaps even designing something for an employer, you need to know you can do it. There is no better way to know it than to do it.
Pick a project that will use the full stack of your skills. Make sure you incorporate database, framework and everything else you need to build a complete application. This project should be something that will take you more than a week and require some serious thinking and design. Try to make it something you can charge money for so that you take it seriously and have some incentive to keep working on it.
Just make sure you don’t drag it out. You still don’t want to get too ambitious here. Pick a project that will challenge you, but not one that will never be completed. This is a major turning point in your career. If you have the follow-through to finish this project, you’ll go far, if you don’t… well, I can’t make any promises.
Step 9: Get a job creating a new system
Ok, now it’s time to go job hunting again. By this point, you should have pretty much maxed out the benefit you can get from your current job–especially if it still involves only doing maintenance.
It’s time to look for a job that will challenge you–but not too much. You still have a lot to learn, so you don’t want to get in too far over your head. Ideally, you want to find a job where you’ll get the opportunity to work on a team building something new.
You might not be the architect of the application, but being involved in the creation of an application will help you expand your skills and challenge you in different ways than just maintaining an existing code base.
You should already have some confidence with creating a new system, since you’ll have just finished creating a substantial system yourself, so you can walk into interviews without being too nervous and with the belief you can do the job. This confidence will make it much more likely that you’ll get whatever job you apply for.
Make sure you make your job search focused again. Highlight a specific set of skills that you have acquired. Don’t try to impress everyone with a long list of irrelevant skills. Focus on the most important skills and look for jobs that exactly match them–or at least match them as closely as possible.
Step 10: Learn design best practices
Now it’s time to go from junior developer to senior developer. Junior developers maintain systems, senior developers build and design them. (This is a generalization, obviously. Some senior developers maintain systems.)
You should be ready to build systems by now, but now you need to learn how to design them.
You should focus your studies on design best practices and some advanced topics like:
- Design patterns
- Inversion of Control (IOC)
- Test Driven Development (TDD)
- Behavior Driven Development (BDD)
- Software development methodologies like: Agile, SCRUM, etc
- Message buses and integration patterns
This list could go on for quite some time–you’ll never be done learning and improving your skills in these areas. Just make sure you start with the most important things first–which will be highly dependent on what interests you and where you would like to take your career.
Your goal here is to be able to not just build a system that someone else has designed, but to form your own opinions about how software should be designed and what kinds of architectures make sense for what kinds of problems.
Step 11: Keep going
At this point you’ve made it–well, you’ll never really “make it,” but you should be a pretty good software developer–maybe even “great.” Just don’t let it go to your head, you’ll always have something to learn.
How long did it take you to get here? I have no idea. It was probably at least a few years, but it might have been 10 or more–it just depends on how dedicated you were and what opportunities presented themselves to you.
A good shortcut is to try and always surround yourself with developers better than you are.
What to do along the way
There are a few things that you should be doing along the way as you are following this 10 step process. It would be difficult to list them in every step, so I’ll list them all briefly here:
Teach – The whole time you are learning things, you should be teaching them as well. It doesn’t matter if you are a beginner or expert, you have something valuable to teach and besides, teaching is one of the best ways to learn. Document your process and journey, help others along the way.
Market yourself – I think this is so important that I built an entire course around the idea. Learn how to market yourself and continually do it throughout your career. Figure out how to create a personal brand for yourself and build a reputation for yourself in the industry and you’ll never be at want for a job. You’ll get decide your own future if you learn to market yourself. It takes some work, but it is well worth it. You are reading this post from my effort to do it.
Read – Never stop learning. Never stop reading. Always be working your way through a book. Always be improving yourself. Your learning journey is never done. You can’t ever know it all. If you constantly learn during your career, you’ll constantly surpass your peers.
Do – Every stop along the way, don’t just learn, but do. Put everything you are learning into action. Set aside time to practice your skills and to write code and build things. You can read all the books on golfing that you want, but you’ll never be Tiger Woods if you don’t swing a golf club.
Plain and simple, the quickest way to pass a job interview is to make the interviewer like you. You can do it the hard way during the interview, but in this video I talk about how to do it the easy way—before the interview even starts.
My course that shows you how to create a blog and get your name out there:
How to Market Yourself as a Software Developer
I thought I’d write a post this week talking about what it is that I actually do, why I am dong it, and what my overall strategy is with my business ventures and career.
If you started listening to the Entreprogrammers podcast that Derick Bailey, Josh Earl and I just released this week, you probably already have somewhat of an answer to some of these questions, but I thought I’d lay it all out as much as possible here, in this post.
What I actually do each week
Let’s start off by talking about what I actually do. You might be wondering what it is that I do all day since I don’t appear to have a regular job and I’m constantly producing content each week.
Well, a good portion of what I do right now is produce content. Every week I produce:
- A new blog post on this blog
- A video for YouTube
- An episode of the Get Up and Code podcast
- An email to my email list
- And now an episode of the Entreprogrammers podcast
I also do a few other weekly maintenance tasks like handle my social media and ,of course, deal with the endless pile of email I seem to accumulate each day.
I do most of these things as my long-term strategy around my business of growing my audience and continuing to get my name out there. The more content I have out there that people are finding valuable, the more my audience will grow and the more opportunities I will have because of it.
It is difficult to directly say how producing all of this content each and every week benefits me financially, because there isn’t a direct correlation between writing a blog post and collecting a pay check. I, of course, put affiliate links into most of my blog posts and I make a small amount of money each month from the sales those links generate. And I also have some ads on my blog and on YouTube that bring in revenue, but again that amount is not very large–certainly not enough to live on.
(Speaking of which. I need to put an Amazon affiliate link in this post. I couldn’t really think of a book that related to this post, so I’m putting in a link to my favorite tech thing I own right now. My 39-inch 4K monitor. It has a ridiculous 3840×2160 resolution and it is an insane bargain at $499.)
But, like I said, my base strategy here is to grow an audience and continue to serve that audience, knowing that by doing it I’ll have plenty of opportunities to generate income. You are likely reading this post because that strategy is working. I believe by giving out free, valuable, content each week, I am paving a way for my future.
Now, of course, that isn’t all I do each week. Producing all the content for a week usually takes a little bit over a day to do. The rest of the time I spend split between doing some consulting work and working on usually one big project.
I try to minimize the consulting work, because I don’t really like the idea of trading dollars for hours. I would rather work on things that have long-term benefits for me. (Like the weekly content I produce.)
Right now the big project I am focusing on is a book that will be published by Manning Press tentatively titled: “The Software Developer’s Life Instruction Manual: Practical Advice to Boost Your Career and Live a Better Life.” This book will be approximately 80 chapters and I am currently writing roughly two chapters a day. So, combined with all the editing and revisions, I’ll probably be working on this book for the next few months.
Before I started working on this project, I was working on my How To Market Yourself as a Software Developer package. (Which I completed and launched on March 27th.)
And before that, my big project was usually whatever Pluralsight course I was working on. (Although, I’ve temporarily stopped creating courses, so that I can focus on some of my own projects, like the one I am working on now.)
How I make money
But, I’ve got to eat right? So, how do I actually make money?
Well, I have two primary sources of income right now that support me. The first are my real estate investments. I’ve blogged about how I’ve been doing real estate investment since I was about 19 here. I’ve saved up just about all the money I’ve earned over my career and invested it into real estate and now those investments pay me money each month as many of my properties are paid off.
The second primary source of income for me is my royalty stream from Pluralsight. I have 55 Pluralsight courses that I produced over the last 3 or so years that bring me in a quarterly royalty check that I can’t really complain about.
But, I don’t really want to depend on either of those sources of income in the long-term. My real goal is to build my own products and make money selling them through the audience I am building from my blog, podcasts and YouTube videos. I find income that I earn from those sources to be much more rewarding, because it is income that I have been able to produce from something I created entirely on my own.
My first major product that I created to help me with that goal was the “How to Market Yourself as a Software Developer” package. Quite a bit of work went into creating that product, but it has sold very well. I still have a lot of work to do on marketing it better so that I can make more sales from it, but I learned a lot from going through the complete process of creating a product on my own and taking the product to the market. It was an exciting and thrilling experience and it feels great to know that I produced something that is helping many software developers get better jobs and boost their careers. (I also got to interview some of the software developers I admire most in the industry and learn quite a bit from them as well.)
I plan to create other products like this one in the future. Perhaps one or two a year. It is a long and difficult process, but I find it very rewarding.
My focus and goals
To be honest, right now I am writing very little code. Both my How To Market Yourself package and the book I am writing are mostly about soft skills. I’ve been focusing on this area, because I think it is a greatly under-served area for software developers and an area that can have more impact on your career than learning any technical skill. I also happen to be very passionate about these kinds of topics, because I spent so much time exploring them and saw how beneficial this focus has been for my career. (Although, that doesn’t mean I’m not itching to start writing more code. I didn’t realize how much I’d miss writing code until I spent about half a year hardly writing any.)
Next year, I might focus on more technical topics again, but I plan to keep representing myself as a “life coach” for software developers. I found that my holistic approach to software development fits nicely with this calling. I greatly enjoy seeing people succeed not just technically, but mentally, physically and spiritually as well. Life is hard, sometimes we all could use a little help. And, so far it seems that I am connecting with many software developers who appreciate my holistic approach.
In the future, that might change. I’ve often entertained the idea of disappearing from the internet for awhile and either taking some time off to relax and recharge or to do something I’ve always wanted to do, like create a game.
My big goal right now is to get enough products created and market them properly to build a steady stream of revenue off my blog and other audiences. Right now this blog gets about 3000 page views a day. That is a lot of traffic. I should easily be able to generate a living off of that traffic alone. I’m glad that my posts are being read and benefiting people, but the entrepreneur in me knows that I am not maximizing this opportunity. I also am not making any money off of Get Up and CODE–in fact, it costs me money and time to produce that show each week. There are still quite a few opportunities to turn these properties into bigger revenue streams. I need to get some sponsors for Get Up and CODE, and probably produce a fitness related product as well as have more products available to sell to traffic that is coming to this blog.
My main motivation for doing this isn’t really the money. I could probably make more guaranteed money just continuing to create Pluralsight videos. I, of course, want to make money, but more than anything I want to succeed as an entrepreneur. Right now, I don’t really consider myself successful yet. I’ve come a long way, but I feel that I still have a long way to go.
So, there you have it. That is what I am all about right now. This is a pretty honest post telling you exactly what I am doing, what my strategy is and why I am doing it.
It’s been quite a journey getting this far. I never thought I’d be doing what I am doing now for a job and even though some days it isn’t easy, (I don’t exactly feel like creating a new blog post every week or recording a YouTube video or podcast,) it’s worth it. Honestly, sometimes I feel like I have no idea what I am doing. And, honestly, to some degree that is true. But, I am figuring it out and I am trying to make that process as public as possible so that others can benefit by learning from my mistakes and victories.
If you aren’t already on my weekly email list. You can join here. I include some extra content each week that only goes out to the list and I compile everything that goes on here into a weekly email every Tuesday so you don’t miss anything.
The field of software development is somewhat like the stock market. It can feel like you have to anticipate where things are going if you don’t want to end up in the street begging for change.
Unfortunately, just like the stock market, it is impossible to predict the direction technology will take. Sure, we can make some educated guesses, but in the end no one really knows what is going to happen.
Consider Blackberry. Before its collapse, no one would have predicted Blackberry would be in the situation it is now. Focusing on becoming a Blackberry developer would have seemed like a good idea not too long ago.
The same thing happened with Silverlight and Flash. Both of these technologies unexpectedly took a turn for the worse.
So, how can you avoid these kinds of calamities and make sure that you are prepared for the future?
Pick a broad and stable base
The surest way to build a good future for yourself as a software developer is to avoid trends altogether. You can do this by picking a broad and stable base that is the foundation of your career.
Many technologies can be easily labeled as fads, but there are other technologies that have withstood the test of time. For example, consider languages like C or C++ which have been around for a very long time and are still in heavy use today. I’ve written about why C++ is not “back” and have discouraged developers from investing too much of their time in learning C++, but if you want to have a stable base, learning C or C++ can certainly help you do so.
Along with picking a broad and stable technology, you can also invest in developing general skills instead of specific technologies. If you can learn how to solve problems and architect good maintainable solutions to those problems, you will be able to adapt to any programming language or framework that comes along. There are a core set of skills that are at the heart of software development which will always be critical to writing good code.
I recommend this book pretty often, but Code Complete is an excellent book that has generalized knowledge about how to structure code that transcends a single platform or technology. Along with that, Clean Code is another book that I’d highly recommend, due to its timeless principles.
Also, (get ready for a shameless plug here,) of course I would recommend my How to Market Yourself as a Developer package, because the skills I teach in that program are skills that will help you your entire career.
So, while specialization is very important–and I do encourage you to specialize in a particular area of software development–it is also very important to have a broad and stable base to work from so that you can adapt to change in the future.
(Side note here: don’t think that having a broad and stable base doesn’t mean you should specialize or carve out a niche for yourself. The two aren’t mutually exclusive. You should have a broad and stable base, but expand out from there to one or more areas of specialization and you should try to market yourself in a specific niche.)
Keep an eye out for what is gaining traction
You can’t necessarily predict the future, but you can look for indicators that tell you the tides are shifting. If you want to be prepared for the future, it is always a good idea to keep an eye out for what new trends are evolving and what everyone is talking about.
We’ve had quite a few trends pass through the software development industry in the past decade. Remember when Ruby on Rails was the next big thing? How about IoC containers and dependency injection? Agile and Scrum? Lately, at least of the time of this writing, Node.js is still pretty big. But, just today, I was looking at Hacker News and I saw about four articles on Google’s Go programming language.
It is a good idea to track sites like Hacker News and Proggit (the subreddit for programming) to see what technologies are being talked about and get a feel for what might be coming next. Often, the newest trends first surface on sites like these.
Another good way to spot trends is to look at the lineups for popular developer conferences and code camps. Just take a look and see what topics are being spoken about the most and you’ll have an idea of where things are going.
Always be learning
Perhaps the surest way to prepare for the future though, is to make sure that you are always expanding your knowledge by learning new technologies and deepening your knowledge of existing ones.
As a software developer, you should focus on developing the habit of becoming a lifelong learner. Set a schedule each day or each week where you will spend a dedicated amount of time learning. In the past, I’ve made a commitment to walk half-an-hour on my treadmill each day while reading a technical book. Just doing this really helped me expand my knowledge over several years.
Spend some time learning how to learn so that you can be more efficient at learning and so it is a more enjoyable experience. Self-education is one of the most important weapons we have to survive the always changing technical environment.
Remember, there is nothing new under the sun. Sure, new technologies and programming language may pop up, but they are always some kind of rehash or combination of existing things. If you dedicate your time to learning, you will be much better prepared to deal with any new situation you encounter. The more you know, the more you can relate a new thing to something you are already familiar with and cut the learning curve of that new thing in half.
Be willing to change and adapt
It is really easy to just hold on to what you know and ignore the changing landscape all around you. I know, because I’ve done exactly that several times in my career. I fought C# and .NET for a long time when I was primarily a C++ programmer, because I didn’t want to believe high level application programming language could be that easy–there had to be a catch.
But, no matter how much we fight the future, we can’t prevent it. The best thing we can do is to give in and stop resisting new trends. Sure, some of them will fizzle out and die, but we won’t know which ones are promising if we aren’t willing to let down our walls and try them out.
It is really easy to become religious about a technology, but in the end it hurts you more than it helps you. I’ve come to realize that it is much easier and less stressful to bend with the wind than it is to stand your ground and eventually be snapped like a reed.
If you like this post and you want to read more like it,
.. sign up here
and I’ll deliver post like this one to your inbox every week. Oh, also, I’ll give you a free gift as a thank you for signing up.
We all want to make more money and have better opportunities, right?
I know I do. Whatever I am doing, I want to be the best at it–or at least near the top.
So, why do so many software developers choose to be generalists instead of specialists?
The fear of being pigeon-holed
Probably the biggest reason, I hear from most software developers, in regards to specialization, is that they are afraid to specialize, because they don’t want to be pigeon-holed in a specific technology or area.
At a surface level this seems like a good fear to have. No one wants to do something that is going to limit their opportunities in the job market. But, this fear is actually completely unfounded, because in most cases, specialization actually opens up more opportunities than it closes.
Most of us can only hold down one full time job at a time and if you are a consultant, you can only deal with so many clients in a given week. So, we really don’t need to have the whole world of options available to us. If you are looking for a job, for example, you only need to land one job. It does you no good to land 500 jobs. (Although having a few options to choose from is a good thing.) So, you can see right off the bat that it is a bit silly to be worried about closing off opportunities that you can’t possibly cash in on.
Now, consider what happens when you specialize. You cut down your potential opportunities, but you become a much stronger fit for the opportunities that are still available for you. If there are 1 million software development jobs you could possibly get, but your specialization cuts that number down to 500, that’s still quite a few jobs to choose from, but now you are much more likely to get any one of those jobs, because your specialization makes you a better match for them.
The same goes with clients. By being a specialist, you will have a smaller pool of clients that could use your services, but you will have a much better chance of getting those clients to pay you and to pay you a higher rate than you might make otherwise.
Being afraid of being pigeon-holed into a specific technology is a silly fear. It is like going to a buffet and piling as much food on your plate as possible–more than you could possibly eat in two days. Your stomach is only so big, any extra food past what you can fit in your body is a waste. You can only have one full-time job. Don’t worry about the 1000s of other job opportunities you are missing out on. Instead, focus on getting the best one job for you.
The benefits of specialization
Even though specialization may seem like it limits your options, it actually gives you more options, because options that you can’t capitalize on are just an illusion. The more specialized you are, the fewer overall options you’ll have, but the better your ability will be to capitalize on those options.
As a specialist, you’ll find it much easier to find a job or a client, because it is much more likely that people will be seeking you out instead of you seeking them out. If your specialization is specific enough, and there is a high demand for that specialty, you may find that you are actually overwhelmed by potential opportunities.
When people are coming to you, or you are at least offering exactly what they are looking for, you are in a much better position to negotiate. Scarcity drives price up and by becoming a specialist you are able to tap into the scarcity of your particular specialization. Almost all specialists command higher salaries, produce higher bill rates, and are able to find more work.
Being a generalist is only valuable if you have a big name to put behind it. But, in that case, your specialization is being you–you literally are “special.” Not too many people can pull that off, at least not without first building a big reputation by being a specialist of some sort. Think of movie stars and famous actors; Most of them specialized in a specific kind of role, before becoming a big enough of a name to experiment with different roles. Even then, many famous actors still choose to stick with their specialization.
Another major benefit of specialization is a smaller surface area to try and cover. Are you overwhelmed trying to keep up with the latest technologies, new programming languages, and frameworks being introduced at an alarming pace? Perhaps it is because you haven’t chosen to specialize.
A specialist may still have to keep up with general trends in technology, but can focus most of their education and skills development in a single area. A generalist has to stay on top of everything, all the time.
As a specialist, you can develop a deep knowledge in a single area, which tends to be more rewarding than the scatter-shot haphazard way of developing software that is so common today. Mastery is much more rewarding than flying by the seat of your pants. (Although the latter can be quite a thrill.)
How deep do you specialize?
The simple answer is it depends on your market. Most of the time, though, the more specific the better.
The deeper you specialize the smaller your potential market will be, but the more valuable to that market you will become. You have to find the right balance between market size and value.
If you are looking for a job in your small town that only has a few software development opportunities and you don’t want to move to look elsewhere for a job, you might not be able to specialize as deeply as you might want. In that case, it may be better to be a C# developer than an ASP.NET MVC C# developer specializing in Angular.js. There might not be any companies in your area hiring for your specific specialty.
On the other hand, let’s say you are in New York city or you are looking for jobs anywhere in the United States. Now, your specialty of being a Bluetooth-focused Android developer, is probably going to be very valuable.
You’ll have to do a bit of research to figure out how deep you can go with your specialty. But, in general, the deeper the better.
Getting more specific about specialization
Ok, so where do you go from here? How do you actually pick a good specialty and build up a reputation in that particular area so that people actually know who you are?
It would be pretty difficult for me to try and cover all that information in a blog post, or even a series of posts, but I have created a full program called
…that goes into full detail about specializing through building a personal brand and covers many more topics that can help you really boost your income.
I’m also currently in the process of writing a book that specifically deals with this topic and a bunch of other career and life topics for software developers, which will be published by Manning Press sometime around the end of this year or early next year.