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.
It’s a great idea to educate yourself.
I fully subscribe to the idea of lifetime learning–and you should too.
But, in the software development field, sometimes there are so many new technologies, so many things to learn, that we can start to feel overwhelmed and like all we ever do is learn.
You can start to feel like you are always playing catch-up, but never actually getting ahead–not even keeping up. The treadmill is going just a few paces faster than you can run, and you are slowly losing ground, threatening to drop off the end at any time.
Trying to learn too much
The problem is trying to learn too much. There are 100 different technologies you have to work with or want to work with at your job. You might feel that in order to be competent, in order to be the best you can be, you need to learn and master all of them. The problem though, is that you feel like you haven’t even mastered one of them.
It can be a pretty disparaging feeling. To counter that feeling–which sometimes demonstrates itself as impostor syndrome–you grab books, video courses, and all kinds of resources on all the technologies you feel that you need to master.
You spend your nights and weekends reading books, going through online training, and reading blog posts.
But. is it really effective, or does it just stress you out more?
Do you even remember half of what you read?
Will you actually ever use it, or are you storing it away for a someday-I-might-need-this-bucket?
My point isn’t that you shouldn’t be learning, it’s just that perhaps you are placing too much pressure on yourself and trying to learn too much.
I’m only saying this, because I’ve been there. I’ve done that. I know how it feels.
I also know that this forced pace of learning isn’t very effective. I don’t remember much of the majority of books I read about technologies I didn’t end up using or barely ended up working with.
I know that the technologies I learned the best were the technologies that I actually put into practice. In fact, some of my most useful, and retained learning, came from learning I did on the spot, right when I was working on a problem I couldn’t solve and had to go find an answer.
It may seem strange that someone like me who makes a decent portion of their living creating learning materials for software developers would tell you to not try and learn too much.
It probably would make much more sense for me to preach that you should absorb all the information that you can; that you should be continuously watching my Pluralsight courses while you eat, sleep and commute to work.
But, the truth is, I don’t think that is the most effective way to learn. I don’t think you’ll get much out of one of my courses, or anyone else’s, if you just repeatedly watch them.
Instead, I think the best way to improve your skills and to learn what you need to do is to do the learning as close to the time you need the information as possible–just-in-time learning.
Now, this doesn’t mean that you should just start working with a technology before you know anything about it. You’ll waste a lot of time flopping around trying to get started if you just dive right in without any prior knowledge. But, I’ve found you only need to learn three things before you can dive in and start working with a technology:
- How to get started
- What you can do with the technology–how big it is.
- The basics–the most common things you’ll do 90% of the time.
It is no coincidence that I structure most of my online courses in that way. I try to tell you how to get started, show you what is possible and then give you the very basics. I try to avoid going into details about every little aspect of a technology, because you are better off learning that information when you need it. As long as you know what you can do, you can always find out how later.
Often the hardest part of learning a new technology is learning what is possible.
I’ve found that the faster you start actually using a technology and trying to solve real problems with it the better. Once you’ve covered the three bases I’ve mentioned above, your time is much better spent actually working with the technology rather than learning about it further.
It’s difficult to break away and jump in though. Our instincts tell us that we need to keep reading, keep watching videos and continue to learn, before we get started.
You might feel compelled to master a technology before you start using it, but you have to learn to resist the urge. You have to be willing to fail and learn your way by making mistakes and hitting roadblocks. Real learning takes place when you use information for a purpose, not by trying to acquire it ahead of time.
If you know what can be done in a technology and you know enough of the basics, it won’t be difficult to figure out what search term you’ll need to come up with in order to answer any questions you have along the way. This just-in-time learning will be more effective in the long run and save you many wasted hours consuming information that you won’t fully digest.
You can’t know everything
Even if you had all the time in the world to learn, and even if you apply just-in-time learning techniques, you still won’t ever learn a fraction of what there is to learn in the software development field. New technologies are popping up every day and the depth of existing ones increases at an alarming rate.
It is important to face the reality that you just can’t know it all. Not only can you not know it all, but what you can know is just a tiny fraction of what there is to know.
This is one of the main reasons why I talk about specializing so much. You are much better off picking a single technology that you can focus on learning in-depth than spreading yourself too thin trying to be a master at everything.
That doesn’t mean you shouldn’t expand your skills in many different directions; you should definitely try to have a broad base. Just don’t expect to be an expert in more than one or two main areas of focus. Try to focus your learning on two main areas:
- A single specialty that you will master
- General software development skills that will apply to more than one technology. (For example, a book like Code Complete falls in this category.)
Don’t try and spread yourself too thin. Rely on your ability to learn things as you need them. If you have a solid base, with time and experience, you’ll find that you can learn whatever you need to know when you need to know it. Trust yourself.
Sometimes it can seem like there are super-programmers out there who seem to know everything and can do everything, but it is only an illusion. Those super-programmers are usually programmers that have one or two areas of expertise and a large amount of general knowledge that they apply to a variety of different domains.
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.
One of the worst traps we can fall into as software developers is discontentment.
It’s really easy to become discontented with our current situation and to want to seek greener pastures elsewhere. I’m not saying that there aren’t necessarily better situations you could seek out, but finding a better job may not be your problem.
Learn to be content with what you have first…
It may seem strange, coming from me, especially when I actually sell a product to help programmers find better jobs, that I am telling you to be content with your current job. But, I’ve found, in life, that it is impossible to be happy with something new or better until you have learned to be happy with what you already have.
It almost seems paradoxical. If you can be happy with your current job or situation, why would you seek out a new one? You are obviously discontent with your current situation, because a new situation would be better, right?
In order to answer this question, we have to go back a bit into the past and look at where we are now from the perspective of where we were.
Chances are the job you have now was a job that you were excited and enthusiastic about when you first got it. Chances are you left some other situation that was worse than the situation you are in now, searching for greener pastures.
I made many transitions in my early career, from company to company, from job to job, always trying to find a better opportunity. But, each time I drove my little dune buggy over the next sand dune, I found the oasis I had seen from afar was a mirage.
I spent a good deal of my career never really being happy with my current situation and always looking for a better opportunity that would finally give me the rewarding, fulling, job that I desired.
I always had some reason why my current job was not good enough.
Perhaps it was the technology I was working with–I want to use that latest and greatest framework, not this crufty crap.
Sometimes it was the code base itself–if only I could work on a greenfield project, then I wouldn’t have to maintain this stupid legacy code.
Once or twice it was the coworkers–these idiots are doing things all wrong. I need to work on a team that appreciates writing good code.
The list goes on and on and on…
If only I could work from home…
If only I could use ASP.NET MVC instead of Web Forms…
If only I could follow a Kanban process…
Even when I started working for myself, I started coming up with my own “if onlys.” No matter how good our present situation is, we can easily become accustomed to it and take it for granted.
If you can’t ever be content with your present situation or job, you’ll just find that when you find something “better”, you are eventually discontent with that as well. It is really easy to trick yourself into thinking that a parallel or downward movement is an upward one, because you’ve grown so discontent with your current situation.
I’m not saying don’t find a better job or don’t improve your situation, but I am saying that before you do, find a way to be content with what you already have so that you don’t ruin the next endeavor you set out on.
How to be content
The first step towards contentment is realizing that being content is a choice–just like happiness is. Your present situation doesn’t determine your contentment–you do.
Contentment comes from a positive mind that is thankful for what it has. If you want to start being more content with what you have, start “counting your blessings.”
I know this sounds a bit silly and trite, but truly recognizing what you have that is already good and being sincerely thankful for it, goes a long way towards cranking that internal happiness gear a few rotations.
Happiness and contentment are very relative things. You are happy with your car until you see your neighbor buy a new one. You are happy with your current salary, until your brother tells you about the new job he got where he is making twice what you make.
If you are constantly looking at outward comparisons to define the worth of what you have, the value of what you have will decrease in your mind. Instead, focus on what is good about your present situation.
Chances are, if you are reading this blog post, you are already in a better situation than more than 90% of the world. If you have access to a computer and an internet connection, you are “blessed” compared to the millions of people who are living well below what we would consider poverty and working much harder for a living than you are.
There are hundreds of things to be thankful for. You just have to be willing to start recognizing them and truly appreciate them. If you want to be a happier, more content person, make it a daily habit to go over everything in your life that you are thankful for each and every day. Not only will you be happier, but so will the people around you how have to deal with you each day.
(If you are looking for a good book to help you come up with things to be thankful for, check out 14,000 things to be happy about.)
Another way to be content is to work hard
One of the most rewarding things in life is a job well done.
Your present job might not be the one you want. You may be working on a completely crappy code-base. You may not be using the technologies or frameworks that you are excited about. But, if you put your head down and start working hard at your current job, you’ll find it to be much more rewarding.
I’ve found in life that the biggest satisfaction is not what you do, but how you do it. Painting a fence can be just as rewarding as building a skyscraper, if you work hard at it and put your full energies into the task.
If you aren’t happy with your present job, try shutting down Facebook, closing down Twitter and focus on doing the best possible job you can do, each and every day.
Sure, you can still look for a better job. Sure, you can still dream of starting your own consulting business or getting out there on your own. But, in the meantime, you might as well be content with the situation you are in now. Then, when you are ready, and the next opportunity presents itself, you’ll have the ability to truly appreciate it.
The grass may look greener on the other side of the cubical wall, but that doesn’t mean it is. Be content with what you have, but always strive for more and you’ll live a much happier life and make fewer stupid mistakes.
If you liked this post and want to hear more about topics like this one, sign up here to join the Simple Programmer community, and I’ll send you a weekly email and some exclusive content that I only share with the Simple Programmer community.
I spend a lot of time doing two things: blogging and telling other developers the benefits of doing things like starting their own blog. (Occasionally I squeeze in a little bit of time to code as well. And my wife says I spend too much time answering emails and checking my phone—she wanted me to add that to this post.)
So, I can tell you that one of the major pains I am well acquainted with is that of writing when you don’t feel like writing or you just don’t have anything to say.
I experience this frustration myself—heck I am experiencing it right now. I decided to write this blog post because I couldn’t come up with anything else to write about. And, to top it off, I don’t feel like writing either.
But, let me jump ahead and give you a little secret: by the time I’m halfway through this post, not only will I know what to write about, but I will feel like writing.
I know this from experience, and it is part of what keeps me going on days like these.
Writing is difficult
Writing isn’t an easy thing to do.
It is hard to spill your brains onto a blank piece of paper and not make it look like spaghetti.
It’s difficult to constantly come up with new ideas, week after week.
But, by far, the hardest part of writing is just sitting down in front of the keyboard and typing. Even now, as I am typing these very words, a million other things are vying for my attention, calling me away from the task at hand.
Most software developers who start a blog, end up abandoning that blog, because they never learned how to grit their teeth, glue their ass to a seat and write.
Sure, it starts out fun. When you first throw up your blog on the internet, you are full of ideas. You could write a blog post each and every day—not because you are more creative when you first start, but because you are more motivated. The whole process is still very new and enjoyable.
But, fast forward a couple of months—or a couple of weeks for those of us with ADHD—and that shiny-newness of blogging wears off. That little fairy that was sitting on you shoulder telling you what to write is gone—it’s just you and the keyboard.
This is exactly when you have to search deep down inside of yourself and find the grit beneath your soft cushy exterior. You have to decide—that’s right, make a decision—that every week you are going to write a blog post and nothing is going to stop you from doing it.
You’ll want to start over and give up
Even as I write this very sentence, I want to go back to the beginning of my post and delete everything. It’s no good. My thoughts are scattered; my analogies are crap; no one cares about what I have to say on this subject.
I’ve been writing blog posts just about every single week for over 4 years, and I am still smacked in the face with the stick of doubt just about every time I sit down to write. So, I can tell you from experience, that part doesn’t get any easier.
But, you can’t let that stop you. Your face might be swollen, some of your teeth might be missing, you might have to squint to see out of one of your eyes, but as soon as you care that what you are writing is no good, you’ll stop writing—permanently. You’ll fall right off the wagon.
By the time you’ve gotten this far into my own essay, it doesn’t matter if it is good. I’ve got your attention already. I can’t embarrass myself any further, because if you didn’t at least sort-of like what I have said so far, you wouldn’t be reading this sentence to begin with.
I’ve come to the realization that you can’t always hit homeruns. Sometimes, you write crap. Sometimes, what you think is your best blog post turns out to be so terrible that no one makes it past the first paragraph.
But, sometimes what you think is terrible, turns out to be the most popular thing you’ve ever written.
The point is, you can’t know until you hit that publish button and even if you could, it doesn’t matter, because you can’t write for other people, you’ve got to write for you.
Not because you are writing something that you’ll someday read later and say “oh, yes, that is how I solved that problem in the past”—although, that does happen from time to time. Instead, you have to write because you made a commitment to yourself and the commitment wasn’t to string marvelous words into sentence on paper, but instead just to write—it doesn’t have to be any good.
The secret is to keep going
I’m sure you’ve noticed by now that I haven’t really told you what to do when you don’t feel like writing and you have nothing to say, so, here it is: write.
Yep, that’s it. It’s that simple.
Take some duct tape, put it over your mouth, shut up, stop whining, pull up a chair, sit down at the keyboard and start moving your fingers.
You can’t sit there and type and have nothing to say. Now, what you have to say, you might think isn’t any good—and it may be utter crap—but there is no reason that has to stop you from writing. Just do it.
There are a million ideas bouncing in your head, but some of those ideas will only come to the surface when you have decided you are going to sit down and do the work.
Don’t believe me?
Try this exercise on. Right now I want you to close your eyes, and think about nothing. That’s right, think about absolutely nothing—I’ll wait.
How’d that go for you? Were you able to think about nothing?
So, don’t tell me you don’t have something to write about. Of course you do. Your problem—and my problem—isn’t writing, it’s typing it out.
P.S. – By the time this post goes live, I’ll be in the middle of launching my How To Market Yourself as a Software Developer program. If you liked this post, go check out the program. It has a whole video course on creating your own developer blog and making it successful.
Well, the day has finally arrived.
A HUGE amount of work went into creating this package and many sleepless nights were spent getting everything ready, but…
How To Market Yourself as a Software Developer is now LIVE!
If you have any questions, don’t hesitate to ask.
And a special thanks to everyone that gave me the support to put this package together and helped me with feedback on it.
For software developers, there is no guidebook that tells you how to advance from one stage of your career to the next.
Many programmers start out quickly in their careers, advancing up the ranks, only to find that they have hit the proverbial glass ceiling which caps their earnings and gives them the choice to either jump tracks to the management career plan or stay stagnant where they are.
It doesn’t have to be this way though.
In this article, I’m going to tell you how you can shatter that glass ceiling and keep on advancing.
Why the glass is there
Before we talk about how to break the glass, let’s talk about why the glass is there in the first place.
The big reason most software developers hit an imaginary ceiling on their income and career advancement is because they stay with the pack.
Most people have what I call the herd mentality. It means that you stick with the herd and you value yourself based on where you fit in the herd. If you are at the front of the herd, you are doing good. If you are at the back of the herd, things aren’t looking so good for you—you are in danger of becoming a hungry lion’s next meal.
The developers at the front of the herd make more money and have nicer offices, and the ones at the back make less and live in tiny cubicles, but they are all part of the herd. So, even though there is a difference in pay from the junior developer to the senior one, there isn’t much of a difference in pay from one senior developer to another one, even if one of the senior developers is more valuable and has more advanced skills.
Now, there are a few developer animals out there that break away from the herd. These developers have figured out that they don’t have to try and compete to be at the front of the pack, instead they can run on their own where they don’t have to worry about their position in the pack, because they can just outrun it.
This is, of course, easier said than done. In fact, I have quite a bit to say about how to go about doing this and what exactly this means, but let’s not get into that just yet.
First, I want to break up this example a bit more and apply it to real life.
As software developers, we are acutely aware of our position within the pecking order. We know which developers are higher up than us and which ones are lower. We have titles at our jobs which help us to know our place.
But, it is important to remember that the rest of the world has no idea about which developers have greater skill and can do a better job, and for the most part, they don’t care—they just see a pack. They see a pack with some developers at the front and other developers at the back.
When an employer hires you for a job, they just want to know where you are in the pack. Are you at the front? The back? The middle? They pay you accordingly based on your ranking within the pack.
If you aren’t explicitly standing out far beyond the pack, you are going to be grouped right in with the pack and paid accordingly. And once you make it to the front of the pack, you’ve got nowhere to go in their eyes—you’re already the best.
So, the glass ceiling isn’t there because someone mandated that software developers shall only make so much money and live in 5 by 5 cubicles. Instead, the glass ceiling is there, because unless you are doing something extreme enough to differentiate yourself from the pack completely, you are part of the pack and the pack is always going to stick together. That means that the average salary of software developers will be used to determine what the developers at the front of the pack will be paid, as well as what the developers at the back of the pack will be paid.
Breaking away from the pack
So, if you want to increase your value as a software developer, your goal should be to break away from the pack. But, how do you do it?
Let’s start by looking at an example outside of the software development world—the restaurant business.
Suppose you are a cook. There are quite a few cooks in the world. In fact, each restaurant in the world, whether it be a fast food joint or an elegant upscale restaurant, needs at least one cook of some sort.
Cooks run in packs. There are low level cooks who don’t make much money at all. Some of these cooks work at McDonalds or another fast food restaurant. Some of these cooks work at more reputable places, and we typically call them chefs instead.
But, you’ll probably find that most high level cooks also cap out around the same level. That is except for a few that end up having their own television shows, write books and make millions.
The same is true for musicians. There are quite a few musicians who are really good and talented, but only a small number of them break away from the pack to become rock stars. The rest are relegated to the pack.
If I asked you why you honestly think Gordon Ramsey, or Rachael Ray, or Wolfgang Puck make so much more money than other chefs, what would you say?
You might be first tempted to reply that it is because they are so much better than other chefs, but we both know that isn’t true. Sure, they are probably in the top tiers of skill level, but the real reason these celebrity chefs make so much money is precisely because they are celebrities.
They are primarily being paid for their names. There are hundreds of chefs in the world at a similar skill level, but those hundreds of chefs are relatively unknown. The same applies for musical talent and even software development.
Now, I’m not saying you need to become a celebrity to break away from the pack and advance your career as a software developer, but what you do need to learn how to do, which most celebrities and famous people already know how to do, is to market yourself.
Unfortunately, there isn’t a guidebook for software developers on marketing themselves either.
But, that is precisely why I wrote one.
Well, more than just wrote one. I put together a complete package on marketing yourself as a software developer.
I’ve been in the industry a pretty long time and I’ve made my share of mistakes. I got stuck for a pretty long time at my own personal glass ceiling, until I started to notice how the developers I would read articles from and see speaking in front of thousands at conferences, had figured out a way to break away from the herd.
I talked to many of these ultra-successful developers, (I won’t use the term rock star here, since it is so overused,) and I found out how they were doing it.
I started applying what I was learning and discovering to my own career, and it didn’t take long before I was able to really break through my own glass ceiling and see that there actually was no limit to the earning potential of a software developer who knows how to market him or herself.
Since then, I’ve been hired for dream projects at my own price. I’ve been on numerous podcasts and publications. I’ve created a successful and popular blog that gets over 100,000 visits a month, and I’ve gotten countless other opportunities.
Now I want to share the information with you.
I’ve put together the guidebook that I said didn’t exist. The one that will help you break away from the herd and put your head right through that glass ceiling.
Only it will be more than just a simple guidebook. I’ve put together a complete package which includes two complete video courses; several eBooks on topics like how to market yourself, social networks, professional resume advice, networking; and even some video interviews with top developers who have already broken away from the herd themselves and will share their secrets with you.
This isn’t a scam or some marketing mumbo-jumbo, it is real tried and tested career advice from myself and other software developers who have figured out how to make their names stand out. The fact that you are reading this post proves that what I am offering works.