What is the difference between the different roles in software development e.g. Programmer, Developer/Consultant, Engineer & Architect?

In order to not get bogged down in technical aspects of the software industry I’ll use an analogy: to keep it simple, let’s compare the software creation process to that of creating a dining room table and the people required to design and build it:

  • Programmer: this is a basically the apprentice in many ways, the person who knows how to varnish wood, drill holes, use a measuring tape and even a Vernier caliper. However someone needs to provide guidance to him on how to build a table. A supervisor needs to tell him the length of the wood to cut, what screws to use and where to drill into the wood. At the end of the day he will have been able to create a table with his own two hands, but he is not able to do this without guidance and supervision. In the software world this is the guy that knows one or more programming languages and can apply them to write a function or a class but he cannot envision and create an entire application from beginning to end without supervision. Given enough time and hard work he will progress to becoming a Software Developer/Engineer/Architect.
  • Software Developer/Consultant: suppose you want to have a custom dining room table built for your home. As a non-technical person you have an idea of what you’d like the finished table to look like but you don’t know how to build it yourself. So you go out and find someone who can build a custom table from scratch according to your specific requirements i.e. you tell the guy more or less how big your room is and the length of the table, the number of chairs you’d like to make space for etc. The Software Developer is the person that can build a custom application according to a customer’s requirements. Due to him being in charge of the development of the software, he does have some creative freedom but ultimately he needs to make the customer happy by following a specific customer’s requirements.
  • Software Engineer: now suppose that you’re the owner of a company that designs and manufactures furniture. This is a completely different ball game now because you’re no longer trying to satisfy a single customer’s needs but rather and entire market in your entire country perhaps. So instead of getting a single table designed and built you’re looking at getting thousands of tables built. To get the job done you will need a person with a whole new set of skills that go beyond the Software Developer’s abilities. Software Engineering principles need to be applied to the problem. These include design patterns and principles. The Software Engineer has a broader view thinking further ahead asking questions regarding scaling and re-usability. When creating thousands of tables one needs to think about creating an attractive product that will not just please one customer, but that many will love. This person also thinks about which materials are cost effective and the durability. It’s all good and well to create one table, but this person also thinks about how to duplicate the design over and over at ease so that each copy looks exactly the same as the next one and is of the same quality. The Software Engineer is the person that designs and develops software that will be sold to not only one person but many. On the surface the Software Developer may seem very similar to a Software Engineer, but in my opinion of the main differences between the two is their personalities or the circumstances which are imposed on them i.e. it’s not so much about technical abilities. The Software Developer is typically a shortcut kind or person that looks for quick fixes and accrues a lot of technical dept. This is in part due to the rigid time and budget constraints that Software Developers work under because they bill by the hour. Moreover, when you’re developing a product and billing by the hour, that product will only be as good as it needs to be i.e. “do we really need this feature, how much is it going to cost, can we find a quick workaround for that problem by not spending more time and money etc.”. Lastly, a Software Developer typically works on multiple projects at the same time, meaning that their focus is scattered and their priorities change from day to day. A lack of focus and prioritization results in lower quality products being developed. A Software Engineer on the other hand typically works on a single project at a time and gets allocated a larger budget without having to clock hours. A larger budget also allows for more time to focus in strategy and design of the product instead of just working without thinking i.e. running around like headless chickens.
  • Software Architect: continuing with our analogy, the furniture company will not only have a single dining room as a product, but many different types of products. This requires a technical person to oversee the design and creation of every single product which brings about a whole extra set of challenges. This person needs to think about reusability e.g. can we use the design of table A when we’re working on table B by perhaps tweaking it a bit? This person may also be responsible for thinking about overall costs e.g. or which wood suppliers should we use to create the best/cheapest products etc. The Software Architect is the person that thinks about all the products that are being engineered and asks themselves how these products fit into the big picture of the company. In very large companies that have very large products a Software Architect may be assigned to oversee only a single product and engineers could be assigned to components of the large products.

To summarize; the difference between all these people is the scope of their view and responsibilities in the process of designing and developing of software. Of course there are many other titles (especially managerial ones) in this industry but I chose to focus only on the very technical ones.

How do I know if I like my career as a software developer/engineer?

From time to time you may question whether getting into a software career was the right thing to do and whether or not you still enjoy it. It is normal to feel like that at least once in your career, perhaps you will feel like that several times throughout your career. If you’re at the beginning of your career it’s even more normal to feel like. One of the following reasons could be the causes for the way you feel:

  1. Preoccupied: if you’re not completely focused on your work you will never be passionate about it and therefore will not like what you do. It could be:
    1. Other problems in your personal life completely unrelated to your career. Identify what these problems are, get them resolved and push them out of your way. Once you’ve cleared your mind, see if you then feel differently about software engineering and your career.
    2. Other interests/hobbies that are distracting you and pulling you in a different direction. Ask yourself if those other interests are worth it. Can you make a living out of those other interests? Be honest with yourself whether you can balance both your hobbies and your career. If you can’t, then drop your hobbies, get them out your way, focus on your career and then see if you feel differently.
  2. Not being good at what you do: a person only starts enjoying what they do when they’re good at it. If you’re not particularly good at what you do then you won’t be passionate about it. There could be a few reasons of that:
    1. Beginning of your career: obviously if you’re at the beginning of your career you’re probably not going to be good at what you do (relative to your co-workers) and therefore not enjoy your work. In a case like this you need to stop comparing yourself to others that know more than you and start comparing yourself to yourself i.e. am I a better person and more skilled today than I was yesterday? Put in an effort to improve yourself everyday. If you do this, your skills and self esteem will slowly start to improve day-by-day. Before you know it you will be like the rest of your colleagues and other people will start looking up to you, but it takes time and perseverance.
    2. Lack of talent: this is a difficult realisation to come to and to accept if that’s the case. It’s possible that perhaps you don’t have a knack for it. If that’s the case, then no amount of effort and work will make you good enough to get you to the point where you start enjoying what you do. You might feel horrible for a short while about having failed at your attempts, but the good news is that you can stop feeling miserable about your futile attempts and start working towards something that you are talented at. Try your hand at other things to find out what your other talents, then get a direction in your life and stick to it.
  3. The wrong work environment: this could be one of two things:
    1. Assholes: as the saying goes (it might have been Freud or the Twitter user Notorious d.e.b that came up with it) , “Before you diagnose yourself with depression or low self esteem, first make sure you are not, in fact, just surrounded by assholes.” Being surrounded by those kinds of people can act as a drain on your self esteem and therefore if you lose confidence you will lose the ability to produce good work and be passionate about your work. It could be constant criticism or passive aggressive behaviour from co-workers or a horrible manager etc. If that’s the situation you’re in, then get out and find another job with people you can relate to, then see if you feel differently about your career.
    2. Mismanagement: it could be that you have a terrible boss who doesn’t know how to manage people and you find yourself in the middle of chaos everyday. It’s normal to go through stressful times and chaos, but if it’s ongoing it means that people and projects are mismanaged. In this scenario, see if you can correct any mismanagement by you managing yourself and your projects. If that’s not possible, then the same advice applies: get out and find another job before you give up on your career.

The kind of work needed to make money in the tech industry

The fundamental difference between poor people and rich people is that poor people believe that the harder they work the more money they will make, while the rich know that they have to rely on leverage to to make the big money. Leverage means either relying on others to do the work for you or earning interest on investments or earning commission.

  1. Other people’s work: if you’re at the beginning of your career it will take you years to get to top managerial positions where you get to leverage off of other people’s work. Not to mention that not everybody is capable of getting to that level – you have to be the best of the best.
  2. Investments: many makes money, so if you don’t already have a lot of it to invest it will take you years before you earn that kind of money on interest/dividends.
  3. Commission: this leaves you with the last option; start selling IT solutions if that’s what turns you on. If you’re a passionate technologist, then your first obstacle will be suppressing and overcoming your passion for technology (or whatever else you love), meaning that you will have to prioritise money over everything else. It’s easier to do that if you’re not particularly good at what you you’re currently doing. That is typically why they say that to become a salesman you have to fail at everything else first. That’s not to say that sales isn’t interesting or challenging, it is, but you have to have a certain aptitude for it: you have to be a risk taker, good with people and an exceptional strategist to make the really big bucks i.e. that’s the difference between a guy selling sun glasses on the side of the road and a successful corporate salesman. Examples:
    1. Steve Jobs is a prime example of such a man that wasn’t that good as an engineer but he was a genius at sales and marketing. He managed to get others to build solutions for him and he would sell it on to the world.
    2. Ideally you should be both an exceptional engineer and salesman, but that’s very rare. Bill Gates is such an example and because of it he and Microsoft had an almost complete monopoly in the software industry, across the world, while he was in charge.
    3. Linus Torvalds on the other hand was the exact opposite of Steve Jobs; he’s probably the best coder that’s ever lived but he’s never cared about money and is not much of a people person, hence he has not made a fraction of the money that either Steve Jobs or Bill Gates made … but he’s made enough from what I’ve heard.
    4. Mark Zuckerberg is a bit of an anomaly which has made him a hero to pure technologists around the world: he’s an exceptional coder but not a salesman (if The Social Network movie is anything to go by). However he was at the right time at the right place, has a passion for connecting people and very smart to leverage off of exceptional salesman like Sean Parker, Peter Thiel etc. without letting them get the upper hand.

Moral of the story: get into sales if you want to make the big bucks, but if you love technology more than money you probably won’t make that much of it in your life … which isn’t necessarily a terrible thing as long as you enjoy what you’re doing.

What is it like working with extremely intelligent people?

In terms of intelligence, it’s an absolute pleasure working with intelligent people. Everything runs smoothly and everything just works. You should always surround yourself by people that are smarter than you are, because it’s really wonderful to have people that you can learn from and count on. Working with less intelligent people is more difficult because they may not easily grasp certain concepts and you will require more patience and management skills to make up for their lack of intelligence i.e. relative to your own intelligence. However everybody can teach you something, and everybody has different sets of skills, and sometimes perhaps for financial or practical reasons you may need to also work with people that are less intelligent than yourself. You should be kind to these people and learn from them too.

Having said that, one must keep one thing in mind that if you’re working with someone that is less skilled/intelligent, you can always teach this person what they need to know, but you cannot change an a**hole.

So the more important question is not whether or not someone is intelligent, but rather what kind of personality do they have … and more importantly, how wise they are. You will find narcissistic people on both sides of the intelligence spectrum and you need to stay away from them at all costs, regardless of whether they are geniuses or idiots.

  1. First prize: intelligent people that have empathy and wisdom.
  2. Second prize: less intelligent people that have empathy and wisdom.
  3. Third option: intelligent people that do NOT have empathy and/or wisdom. Work with these people only if you’re forced into it, in which case try to limit your interactions with them as well the power you give them. If you cannot limit their power or limit your interactions with them, then rather don’t bother.
  4. Fourth option: less intelligent people that have no empathy and/or wisdom. This shouldn’t really be an option. It’s best to stay clear of these people for the sake of your own mental health.

All of the above “options” should be relative to your own intellectual and emotional intelligence.

Product vs Customer vs Profit

My personal philosophy is that in the software business there are three things that need to be focused on and their priority should be as follows:

Product and its source code: the features of the product and its quality determine how happy you make your customers. If your customer is happy he will purchase the product, which in turn means you have a profitable business. So one should always listen to the customer’s needs. Conversely, the product being yours means you as the founder know more about the product than anybody else, meaning you’re the boss of your own product. Therefore if a customer submits a feature request, it is just that, a “feature request” – not a direct order by the customer i.e. it is up to you as the founder of the product to decide whether the feature will be implemented or not and when it will be implemented because that feature or your prioritization of the feature could negatively impact another customer. That is why I believe the product should be prioritized ahead of the customer, which in the grand scheme of things will prove to be beneficial for both you and all the end customers even if you upset one or two customers along the way.

Customer: always prioritize the customer’s needs over making a quick buck by ripping them off: Many amateur sales people do a “hit & run” with a customer. However I feel that the best sales people have empathy for customers providing them with good deals… but not too much empathy that one gives things away for free or too cheaply.

Profit: personally I believe that money is just a by-product of one’s work and success. Focus on the work; do the work for the work itself because you enjoy it and you have a vision. This in turn will result in the money being made. If you’re going to run the comrades marathon, there is no way you are going to run all those kilometers if your only goal is to win the race so you can get a prize. With that mentality you will quit as soon as you realize you’re not in the lead. Instead if you run for the sake of running because you enjoy it, then you will finish the race and you will feel satisfied with yourself … that’s intrinsic motivation.