Getting some experience and developing your skills before you start your first startup seems like a good idea.
How difficult it will be in practice, that will depend on your savings, on a support you can receive from e.g. your family, whether you will be able to make more money than you need to survive so you can save some, and whether you will be able to learn new things in your free time.
In my experience, it works like this: When you get a new job, at the beginning you learn a lot. After a few months it gets repetitive, and after a year you mostly do the old stuff over and over again. You probably get more work, but it is the same type of work. Only rarely (in my experience) is there an opportunity to move within the company. If there is a new project, the company will usually hire new people for the new project, and you stay with the stuff you were hired for. It may gradually become more easy, but you will not progress. (If you are strategic, it may be good to keep doing the easy work for the safe income, and learn new stuff in your free time. Or maybe even during your work time, if no one is watching you.)
After more years, you will become responsible for maintenance of all systems you have ever touched while working in the company. You will have to remember thousand little details about these systems, which is mostly an untransferable knowledge that has zero value outside of the current job. Just because you have more work now, it does not mean that your salary will necessarily increase. When you are at such dead end, if you want to optimize for skills, you should change jobs.
(Meanwhile, there are new younger programmers coming from universities. All the new stuff that you would like to know but have no time to learn, they have learned at school.)
Here comes the question of risk aversion, and how good is your safety net; how much would you lose if you quit this job, but can’t find a new one soon enough. In theory, you should find the new job first, then quit the old one. In practice, it may be difficult to do job interviews, to prepare for them, and to study new technologies, while having a full-time job. Also, the new job may fail for unpredictable reasons, or may turn out to be very different from what they told you at the interview.
Poor people can easily get stuck at a job they hate, that is exhausting and pays relatively little. Because of the small pay, they do not have safety net. Because the job takes all their energy, they do not have the energy and time to learn new stuff and do job interviews. If the job requires them to learn stuff that has zero market value, the longer they stay, the harder it will be for them to get another job. -- In theory, programmers should not be that poor. In practice, sometimes your expenses grow faster than your income; e.g. at the moment you move away from your parents. (Or when you want to start a family, and suddenly there are three people supposed to live from one income for a few months; and later it becomes one and half person per income.) Or some unexpected expense happens.
The work that is available right now may not require the skill you want to develop now. Maybe you choose an exotic skill that no one needs. Maybe all companies that need people with some skill insist on employing only people who already have a few years of experience with that skill. Some skills you may have to develop at your free time, at least to the level where you are able to make a working prototype.
Here is some advice, but it may strongly depend on specific country and area of specialization:
After a year, unless you are still learning something new (something that has a value outside your current company), quit the job. Or maybe, right before you quit, ask the company whether you could become a lead developer of at least a small team: that would look impressive on your CV, and would teach you skills you will later need for your startup.
Try to keep a safety net; enough money to survive for six months, preferably a year. Then you will have more freedom changing jobs. When doing something expensive, such as buying a new appartment or starting a family, try to arrange it so that some financial reserve remains, instead of spending all you currently have. Always imagine that tomorrow your job could become insufferable, and you would have to leave to preserve your sanity.
Avoid overtime. Your sleep and free time are critical for your health and professional development. Spend some free time learning new stuff. Learning something new at home, making a prototype and bringing it to the interview, may allow you to get a job with a new technology that wasn’t available to you at university and at previous jobs. Spend some free time with your friends, meeting new people, networking. Networking is great for getting new ideas, motivation, and even good jobs.
Even when not learning anything specific about a job, future employers value X years of experience at doing Y metrics. So far it does not seem to have any diminishing marginal utility in their eyes, despite that it does have in real life. You learn everything you could ever learn about Microsoft CRM in 3 years but they still prefer someone with 7. OTOH somewhere between 10 and 20 years it may get weird for future employers if you did not do anything different nor get promoted.
There is often a lot of undertime i.e. screwing around on the Internet at work, because you were hired to bring a specific skillset inside a company which they did not have before and they don’t always need that. Largely, Firm Theory suggests that hiring as opposed to subcontracting is a way to reduce transaction costs, like you don’t have to negotiate about the price before every single task you give to an employee and we know it from Fukuyama that DISTRUST is a huge transaction cost. For this reason, I see constantly that businesspeople rather hire someone 40 hours a week than to have external consultants do it taking a random amount of time but often just averaging to 5-10 hours, because they don’t trust externals.
I don’t either. I know the shenanigans I was forced to do when I was a consultant and I constantly call them on this shit when I am now the customer and negotiate with them :) For example if they are ERP consultants like SAP, Oracle, NAV, they often do unpaid work like fixing bugs in the standard software because they cannot tell a customer that please pay €2000 for fixing a fault in a product I sold you. The customer will say do it for free and try to bill it to the software “manufacturer” of whom you are a reseller of. Customers often see software having the same kind of warranties as manufactured products, not legally, but ethically. So consultants work 2 days for free to fix a stupid bug, and then the next time you want a bunch of new fields and reports they will sell 2 days for “analyzing requirements”. That is the shit I call them on :) Because I used to do the same.
Anyway, this INSOURCING due to distrust in subcontractors, consultants results in undertime i.e. bored and Redditing at work.
In a high-context culture, employers will often not set up clear rules to that. They will just wink wink let’s pretend you are working here when I can guess you are not. The price is, that when you are overutilized, you do overtime without extra pay as a way to make up partially for the days when you just warmed a seat in the office. Nobody says this openly, but if you complain about overtime, they may be looking into monitoring your internet traffic the next time you are underutilized. And you don’t want that probably.
Obviously, using undertime at work to learn new things and making prototypes is a good solution. Assume that they own it, but if it is mainly a learning project, let them own it, then the value is not in the product but in the experience.
Although I’ve heard the advice to leave after a year, my experience has been different—after three years, I’m still learning a lot and I’m beginning to tackle the really hard problems. Basically, I find myself agreeing with Yossi Kreinin’s reply to Patrick McKenzie’s advice, at least so far. (Both links are very much worth reading.)
Of course, you do need to push for interesting assignments and space to learn. Also, be sure to pick a company that actually does something interesting in the first place—I work on embedded crypto devices for the government market, in a company that’s young enough that there’s still plenty of flexibility.
I was thinking about the programmers unable to do the FizzBuzz test, and the interesting insight that Eliezer linked long ago—that maybe it’s not so many programmers who are extremely stupid; maybe it’s just the fact that the non-extremely-stupid ones sooner or later get a job, while the extremely stupid ones remain in circulation for a long time, thus more recruiters have the misfortune of meeting them.
Maybe it also works the other way round. When a great IT company is hiring, the employees are happy to tell their friends, so the positions are filled quickly. When a crappy IT company is hiring, it takes them much longer to find someone, and meanwhile other programmers are quitting, so they have to keep hiring to replace their positions. Which means: if you apply for a random IT company that is hiring at the moment, you are not going to see an average company; you are most likely to see a crappy one. Of course, you can be lucky. But most people are not.
In a good company you can keep learning even after the one year. But those are rare.
A higher-level advice is to be strategic and find the good company. For this you want to maintain many contacts with programmers who share your values (who recognize the type of job you would like to have). But how do you get these contacts? Keep in touch with your university classmates (I failed to do this, because at university I had no idea how much will I care about this one day), or take a few crappy jobs and keep in touch with the former colleagues (who may change their jobs later and find something better). Alternatively, do something to become famous (e.g. contribute to open-source software, or write a popular programming blog) and then the people will contact you.
Very nice write-up! I’ve suspected that a lot of those things are true, but wasn’t too sure, so your saying them increases my confidence. Especially the thing about avoiding overtime. I’ve brought it up before but most people seem to have the opinion that “you learn at work, so you may as well work late and keep learning (not taking into account the opportunity cost)”.
What do you think about the chances that a good programmer with a few years’ experience could easily find a new job? It seems pretty high to me. a) I here so much about the demand for developers. And b) in my job search it seemed that there was a huge demand for developers with a few years’ experience. But again, this is outside view-y and I don’t understand the components too well.
most people seem to have the opinion that “you learn at work, so you may as well work late and keep learning
Depends. Now that you wrote that, I remembered the time when I was freshly out of university; it did work that way. Thanks for reminding me! Everything was new. I didn’t have internet at home. The computer I had at work was more powerful than the computer I had at home. I even had a few books about programming at work. So when I stayed overtime, I learned a lot. I was a 100% nerd back then, zero social life, no hobbies beyond programming. Thus staying at work late was like staying at Disneyland.
The difference is, back then I was not supposed to do any specific work when I stayed overtime. As a total noob I was not expected to be highly productive; the time I had to do my work was measured in days, not hours. It was understood that learning is a part of my work, and that learning takes time. That is why I was free to learn.
That is completely different from when you are told to stay overtime. It usually means there are specific problems you are supposed to work on, which usually means: the same stuff as always, only more of it. Or that someone in management messed up something, so you have to do something again, just differently. Or that there is a bug in the application that no one can find and the customer is angry about it, so you have to find the bug. There is no time to learn.
Exploration / Exploitation—it is okay to do overtime for the former, but when the overtime is required, it is the latter. Also, make sure the “exploration” is in the direction you want grow, instead of some dead end. (I have spent a few months studying a stupid product that was discontinued a year later.)
Also, being a 100% nerd is not the optimal strategy. For example, I learned a lot back then, but I still had laughably low salary, because I had no friends, didn’t communicate with people, so I didn’t know how much could I expect, and I didn’t know how to sell myself. At that moment, picking the lowest hanging fruit of the social skills (such as calling a few programmers I knew and asking then whether there is a job opportunity where they work, and how much approximately could I ask) was financially more profitable than any increase of my technical skills. Skills and salary are only weakly correlated.
What do you think about the chances that a good programmer with a few years’ experience could easily find a new job?
I think you can always get a programming job; the question is what are your salary expectations. I cannot tell you how high salary is realistic where you live.
At the very beginning, people will ask you how many years of experience you have, which technologies you know, and how many years of experience with their preferred technologies you have. After maybe five years, they will also ask you if you have an experience leading a team. Being able to show your own project that you did in your free time is probably a big advantage: it shows you are able to complete the project (as opposed to many people who only do the beginning that is most funny, and then abandon the project). I guess most people do not have such projects.
Getting some experience and developing your skills before you start your first startup seems like a good idea.
How difficult it will be in practice, that will depend on your savings, on a support you can receive from e.g. your family, whether you will be able to make more money than you need to survive so you can save some, and whether you will be able to learn new things in your free time.
In my experience, it works like this: When you get a new job, at the beginning you learn a lot. After a few months it gets repetitive, and after a year you mostly do the old stuff over and over again. You probably get more work, but it is the same type of work. Only rarely (in my experience) is there an opportunity to move within the company. If there is a new project, the company will usually hire new people for the new project, and you stay with the stuff you were hired for. It may gradually become more easy, but you will not progress. (If you are strategic, it may be good to keep doing the easy work for the safe income, and learn new stuff in your free time. Or maybe even during your work time, if no one is watching you.)
After more years, you will become responsible for maintenance of all systems you have ever touched while working in the company. You will have to remember thousand little details about these systems, which is mostly an untransferable knowledge that has zero value outside of the current job. Just because you have more work now, it does not mean that your salary will necessarily increase. When you are at such dead end, if you want to optimize for skills, you should change jobs.
(Meanwhile, there are new younger programmers coming from universities. All the new stuff that you would like to know but have no time to learn, they have learned at school.)
Here comes the question of risk aversion, and how good is your safety net; how much would you lose if you quit this job, but can’t find a new one soon enough. In theory, you should find the new job first, then quit the old one. In practice, it may be difficult to do job interviews, to prepare for them, and to study new technologies, while having a full-time job. Also, the new job may fail for unpredictable reasons, or may turn out to be very different from what they told you at the interview.
Poor people can easily get stuck at a job they hate, that is exhausting and pays relatively little. Because of the small pay, they do not have safety net. Because the job takes all their energy, they do not have the energy and time to learn new stuff and do job interviews. If the job requires them to learn stuff that has zero market value, the longer they stay, the harder it will be for them to get another job. -- In theory, programmers should not be that poor. In practice, sometimes your expenses grow faster than your income; e.g. at the moment you move away from your parents. (Or when you want to start a family, and suddenly there are three people supposed to live from one income for a few months; and later it becomes one and half person per income.) Or some unexpected expense happens.
The work that is available right now may not require the skill you want to develop now. Maybe you choose an exotic skill that no one needs. Maybe all companies that need people with some skill insist on employing only people who already have a few years of experience with that skill. Some skills you may have to develop at your free time, at least to the level where you are able to make a working prototype.
Here is some advice, but it may strongly depend on specific country and area of specialization:
After a year, unless you are still learning something new (something that has a value outside your current company), quit the job. Or maybe, right before you quit, ask the company whether you could become a lead developer of at least a small team: that would look impressive on your CV, and would teach you skills you will later need for your startup.
Try to keep a safety net; enough money to survive for six months, preferably a year. Then you will have more freedom changing jobs. When doing something expensive, such as buying a new appartment or starting a family, try to arrange it so that some financial reserve remains, instead of spending all you currently have. Always imagine that tomorrow your job could become insufferable, and you would have to leave to preserve your sanity.
Avoid overtime. Your sleep and free time are critical for your health and professional development. Spend some free time learning new stuff. Learning something new at home, making a prototype and bringing it to the interview, may allow you to get a job with a new technology that wasn’t available to you at university and at previous jobs. Spend some free time with your friends, meeting new people, networking. Networking is great for getting new ideas, motivation, and even good jobs.
My experience (3 European countries):
Even when not learning anything specific about a job, future employers value X years of experience at doing Y metrics. So far it does not seem to have any diminishing marginal utility in their eyes, despite that it does have in real life. You learn everything you could ever learn about Microsoft CRM in 3 years but they still prefer someone with 7. OTOH somewhere between 10 and 20 years it may get weird for future employers if you did not do anything different nor get promoted.
There is often a lot of undertime i.e. screwing around on the Internet at work, because you were hired to bring a specific skillset inside a company which they did not have before and they don’t always need that. Largely, Firm Theory suggests that hiring as opposed to subcontracting is a way to reduce transaction costs, like you don’t have to negotiate about the price before every single task you give to an employee and we know it from Fukuyama that DISTRUST is a huge transaction cost. For this reason, I see constantly that businesspeople rather hire someone 40 hours a week than to have external consultants do it taking a random amount of time but often just averaging to 5-10 hours, because they don’t trust externals.
I don’t either. I know the shenanigans I was forced to do when I was a consultant and I constantly call them on this shit when I am now the customer and negotiate with them :) For example if they are ERP consultants like SAP, Oracle, NAV, they often do unpaid work like fixing bugs in the standard software because they cannot tell a customer that please pay €2000 for fixing a fault in a product I sold you. The customer will say do it for free and try to bill it to the software “manufacturer” of whom you are a reseller of. Customers often see software having the same kind of warranties as manufactured products, not legally, but ethically. So consultants work 2 days for free to fix a stupid bug, and then the next time you want a bunch of new fields and reports they will sell 2 days for “analyzing requirements”. That is the shit I call them on :) Because I used to do the same.
Anyway, this INSOURCING due to distrust in subcontractors, consultants results in undertime i.e. bored and Redditing at work.
In a high-context culture, employers will often not set up clear rules to that. They will just wink wink let’s pretend you are working here when I can guess you are not. The price is, that when you are overutilized, you do overtime without extra pay as a way to make up partially for the days when you just warmed a seat in the office. Nobody says this openly, but if you complain about overtime, they may be looking into monitoring your internet traffic the next time you are underutilized. And you don’t want that probably.
Obviously, using undertime at work to learn new things and making prototypes is a good solution. Assume that they own it, but if it is mainly a learning project, let them own it, then the value is not in the product but in the experience.
Although I’ve heard the advice to leave after a year, my experience has been different—after three years, I’m still learning a lot and I’m beginning to tackle the really hard problems. Basically, I find myself agreeing with Yossi Kreinin’s reply to Patrick McKenzie’s advice, at least so far. (Both links are very much worth reading.)
Of course, you do need to push for interesting assignments and space to learn. Also, be sure to pick a company that actually does something interesting in the first place—I work on embedded crypto devices for the government market, in a company that’s young enough that there’s still plenty of flexibility.
I was thinking about the programmers unable to do the FizzBuzz test, and the interesting insight that Eliezer linked long ago—that maybe it’s not so many programmers who are extremely stupid; maybe it’s just the fact that the non-extremely-stupid ones sooner or later get a job, while the extremely stupid ones remain in circulation for a long time, thus more recruiters have the misfortune of meeting them.
Maybe it also works the other way round. When a great IT company is hiring, the employees are happy to tell their friends, so the positions are filled quickly. When a crappy IT company is hiring, it takes them much longer to find someone, and meanwhile other programmers are quitting, so they have to keep hiring to replace their positions. Which means: if you apply for a random IT company that is hiring at the moment, you are not going to see an average company; you are most likely to see a crappy one. Of course, you can be lucky. But most people are not.
In a good company you can keep learning even after the one year. But those are rare.
A higher-level advice is to be strategic and find the good company. For this you want to maintain many contacts with programmers who share your values (who recognize the type of job you would like to have). But how do you get these contacts? Keep in touch with your university classmates (I failed to do this, because at university I had no idea how much will I care about this one day), or take a few crappy jobs and keep in touch with the former colleagues (who may change their jobs later and find something better). Alternatively, do something to become famous (e.g. contribute to open-source software, or write a popular programming blog) and then the people will contact you.
Very nice write-up! I’ve suspected that a lot of those things are true, but wasn’t too sure, so your saying them increases my confidence. Especially the thing about avoiding overtime. I’ve brought it up before but most people seem to have the opinion that “you learn at work, so you may as well work late and keep learning (not taking into account the opportunity cost)”.
What do you think about the chances that a good programmer with a few years’ experience could easily find a new job? It seems pretty high to me. a) I here so much about the demand for developers. And b) in my job search it seemed that there was a huge demand for developers with a few years’ experience. But again, this is outside view-y and I don’t understand the components too well.
Depends. Now that you wrote that, I remembered the time when I was freshly out of university; it did work that way. Thanks for reminding me! Everything was new. I didn’t have internet at home. The computer I had at work was more powerful than the computer I had at home. I even had a few books about programming at work. So when I stayed overtime, I learned a lot. I was a 100% nerd back then, zero social life, no hobbies beyond programming. Thus staying at work late was like staying at Disneyland.
The difference is, back then I was not supposed to do any specific work when I stayed overtime. As a total noob I was not expected to be highly productive; the time I had to do my work was measured in days, not hours. It was understood that learning is a part of my work, and that learning takes time. That is why I was free to learn.
That is completely different from when you are told to stay overtime. It usually means there are specific problems you are supposed to work on, which usually means: the same stuff as always, only more of it. Or that someone in management messed up something, so you have to do something again, just differently. Or that there is a bug in the application that no one can find and the customer is angry about it, so you have to find the bug. There is no time to learn.
Exploration / Exploitation—it is okay to do overtime for the former, but when the overtime is required, it is the latter. Also, make sure the “exploration” is in the direction you want grow, instead of some dead end. (I have spent a few months studying a stupid product that was discontinued a year later.)
Also, being a 100% nerd is not the optimal strategy. For example, I learned a lot back then, but I still had laughably low salary, because I had no friends, didn’t communicate with people, so I didn’t know how much could I expect, and I didn’t know how to sell myself. At that moment, picking the lowest hanging fruit of the social skills (such as calling a few programmers I knew and asking then whether there is a job opportunity where they work, and how much approximately could I ask) was financially more profitable than any increase of my technical skills. Skills and salary are only weakly correlated.
I think you can always get a programming job; the question is what are your salary expectations. I cannot tell you how high salary is realistic where you live.
At the very beginning, people will ask you how many years of experience you have, which technologies you know, and how many years of experience with their preferred technologies you have. After maybe five years, they will also ask you if you have an experience leading a team. Being able to show your own project that you did in your free time is probably a big advantage: it shows you are able to complete the project (as opposed to many people who only do the beginning that is most funny, and then abandon the project). I guess most people do not have such projects.