Ooo boy, this one is going to make a lot of people mad.
But I know that it’s true.
How do I know that it’s true?
Because I have written three books on software development, I have been a software consultant for over 10 years, I have worked with some of the top developers in the PHP world, I worked on one of the largest email platforms at the time, I’ve MCed ZendCon twice, I’ve been on the Zend Certification Board, I’ve been a member of the Magento Expert Consulting Group and developed several courses for both Zend and Magento.
And I have almost ZERO training (beyond high school… where I was the only person in my computer class to NOT exempt the course. My teacher had to, literally, create the final exam ONLY for me and I think they passed me on pity alone). In fact, it wasn’t until 7-8 years into my career that anyone but myself invested any time in anything resembling a training course.
Back around 1996-1997 I had this silly idea that I would get into graphic design. I loved movie effects and I signed up for a course in Winnipeg that taught how to do 3D animation on Alias/Wavefront. I even got approved for a student loan.
Well, the course got cancelled due to lack of interest and there I was.
But I still liked graphic design and so I started practicing creating websites.
And, boy was I bad at it.
But not so bad that I couldn’t get hired. A local businessman had advertised in the newspaper that he had a few extra computers lying around and they were for sale. I scrounged around some money I had earned from building chain-link fences with my uncle and bought one of the computers. When I went in to pick it up I asked the owner if he needed a website designer. I had learned a little bit of HTML, had a pirated version of Photoshop, and could build not-ugly websites sometimes. He said he would hire me.
I was probably a middle-of-the-road designer in a very low end agency. I was pretty bad at what I did.
Back in those days, if you wanted to have a contact form you would use a program called formmail.PL which you would download from Matt’s Script Archive and, as is true today, every client wanted it to behave a little differently.
Normally the lead developer at the company would make those minor changes, but he was busy with a multi-media project (he actually had been trained in multi-media) and so I was asked to take a look. It was simple enough. I made the change and the changed worked.
This happened a few times and so I asked the owner if he would be interested in doing more advanced work if I learned some programming. He said yes.
And so I bought this book.
All that stuff I talked about that I’ve done at the beginning of this article? It is all because of that book.
As a result of my efforts my boss landed one of his biggest clients at the time and I built the website, running my own very small, very underpaid, team.
I also wrote really, really crappy code. But I was paid to do it and I learned more and more.
Eventually I left that job and started freelancing. I called myself the CEO of my own business at 22. But, really, I was freelancing with a load of hubris.
But I kept on learning.
If there was a new technology I wanted to learn, I would find a client who wanted to do something in it.
PHP (I thought it was the stupidist thing the first time I worked with it), Java, MySQL, msql, Perl, Java, JSP, ASP, XML, SQL Server, Oracle. I found ways of having other people pay me to learn the technology. That, or I would be upfront with the client and say that I was familiar, but that I would learn it better to deliver what they wanted. They almost always agreed
So, do you need to have some kind of training in order to do software development? No. How do I know that? Because I did it.
Is this how everyone should do it?
Goodness, no. No such all-encompassing statements should ever be made.
But this approach worked for me because I would have flunked out of Computer Science, or any degreed program for that matter. Had I gone to school for CompSci I would never have been a programmer because nobody would have hired someone with such poor grades. Sometimes I tell people my story and their response is “that’s just you” or “you’re just unique” and I honestly hate those responses. There is not really all that much that is special about me beyond the fact that I’m a truly horrible student.
But I think that there are some lessons to be learned from the crapshoot called my career. (I hate the term career. How boring to work at something your whole life only so you can stop doing it when you get old enough. Don’t ask me how to not do that, though. I haven’t figured that out yet.)
- It is more important to know your weaknesses than to know your strengths. Oh, don’t get me wrong, you must know your strengths so you can play to them. However, if you know your weaknesses you can manage them better. Say, for example, that you are a good runner, but that you have a weak knee. If you do not know about the knee you will blow it out the moment you leave the starting blocks. But if you know about the knee you can manage both the event you’re in and the training you do. Then, once you’ve made it healthy enough, you can run in the leagues you want to run in.
- Practice what you’re bad at. This obviously comes from item #1. If you’re bad at database design, practice database design. If you’re bad at OOP, do OOP.
Make people laugh. Or Have an agreeable demeanor. I am quite certain that this is the secret to whatever mediocre success I may have. Laughter, first of all, brings down people’s defences. It makes people healthier, largerly, in my mind, because it allows people to have a more personal connection with you and you were designed to be a connected being. If you are gruff or anti-social people will have less of a problem getting rid of you. Find the humor in things. Enjoy people. Conduct yourself so that it will hurt when you leave. Honestly care for the people you work with. Listen. Doing this won’t just make you a better employee or contractor. It will make you a better person. I have tried to be easy to work with for most of my career. People notice it when you work on being easy to work with. They want to work with you. I don’t always get this right, and I have had projects that have suffered because I have done this wrong. But I have made an honest effort to simply be likable and it has paid off more often than it has not.
Point 3 is also important because it provides more room for you to fail. If nobody likes you where you are working, those people may be looking for reasons to get rid of you. If not on a conscious level, on a subconscious level. Your failures, at best, make it harder to justify keeping you on, and at worst, provide opportunity for your detractors to highlight those failings. However, if you have worked for the respect of others, and treat others with respect, people will do their best to retain you. And it’s not because you’re so good, it’s because you’re so unusual.
Now, being agreeable does not mean being a carpet, allowing others to walk all over you. In fact, the opposite is probably true. If you are generally agreeable, when you do have a conflict, you have actually set yourself up to be able to handle those conflicts better. In one case I was on a phone call with a potential client when I discovered that they were a type of business that I had significant moral concerns with. Enough so that I was prepared to lose my job over it. I stayed on the phone call and asked the typical questions that I would ask. As soon as the call was over I spent an hour or two crafting an email that said that I appreciated the opportunity but I would not be able to work with this client. I sent the email and 5-10 minutes later I got a call from my boss who asked how serious I was about all of it. I said I was serious. My boss thanked me, hung up, got someone else to do it, and I continued to work there with, as far as I could tell, no tarnish on my reputation.
There was another time when I was on a phone call for my employer to sell some consulting services and I made the wrong joke at the wrong time. 10 seconds after we hung up I got a call from my boss who started to rightfully lay into me. At the first pause for breath I said “You’re right. I shouldn’t have done that. I will never do it again.” And I never did. Oh, I still tell jokes to make people laugh. But I’m more mindful of the context. And I didn’t get fired.
The same thing goes in software. If people like you, they are more willing to take some flack as a result of your mistakes. Care about your mistakes. People notice that. Then when you catch their XSS vulnerability they’ll know that you already took care of the SQL Injection in your own eye. Jesus said something to that effect.
And all of this helps you to grow as a developer. You ARE going to make mistakes. Set yourself up to fail well.
Why do you NOT need a college degree or even long-term training to be a software developer?
Because software development is not about software development. It is about people and problems and software is the tool that you use to resolve their disconnections. Find out what you need to learn to advance, learn it, and practice it.
But what about all the stuff you have to learn?
I can tell you truthfully that for the super-concepts in software development you need almost no hands on experience to understand them. For example, the SOLID principles can be learned by any moderately intelligent adult and some teenagers. Say that a person only knows the keywords
new. That person has enough knowledge to, with a little guidance from a mentor or a blog, to write an example that exhibits the Single Responsibility Principle in under an hour.
Can they do that in an enterprise? Goodness, no. You would not have the experience to work on something with that level of complexity (which, half the time, is done wrongly or ignored anyway).
However, say that you are that person and you are building a formmail-like program for a small web dev agency? Why not use that opportunity to practice the Single Responsibility Principle on a smaller scale?
That, in my mind, is why I don’t think you need any significant training to get started in software development. Still, to this day, a month shy of the age of knowing the answer to the life, the universe and everything, I still do this. I find ways to integrate the things I want to learn (#1) into the projects that I do (#2) having genuinely established personal rapport and trust with those whom I work (#3). If I don’t have a #3 that matches, I make a project for myself.
Does this mean that people wanting to get into software development shouldn’t get a CompSci degree? I don’t mean to imply that. But I don’t think that I would be off the mark in saying that, depending on what software you’re working on, you can get a low-paying job where the employer is willing to give you experience to learn some of these things in return for a willingness to be lowly-paid.
At least, temporarily.
It has been stated that having a college education is one of the biggest predictors of “success”, whatever that means. I think that’s wrong. A more likely explanation is that a college education is one of the biggest filters of success. In other words, it doesn’t make you a success; it filters you out if you’re destined for failure. I didn’t come up with that thought. I found it in one of the books in my library.
Honestly, I think that most software development could be kicked off via trade school instead of a university.
In relation to software, part of this comes from, in my view, mischaracterizing all software development as something that requires a degree. You will find no argument from me that if you are building the guidance system for ballistic missiles you should be in some kind of credentialled program. Nor if you are working on building a self-driving car. Or visualizing cancerous cells in 3D. But a vast amount of available coding work is not doing those things. My rule on the matter is that if lives would be lost if you failed, you should be credentialled or trained in some fashion. But even there, you do not need to start by being credentialled. You may not get to work for NASA, but you might get to work for one of NASA’s many contractors and work your way into it.
Right now I’m reading through Scott Adams’ book “How to Fail at Almost Everything and Still Win Big: Kind of the Story of My Life“. One of the things he notes is that successful people (again, whatever THAT means) tend to have systems, not goals. His observation, which I found quite astute, was that if you are goal-oriented you are a failure up to the point of reaching that goal (if you reach it). And after you reach that goal you have no purpose. People with systems, on the other hand, are in a continual process of growth. And in his experience, he has met more successful people who follow patterns of practice than those who set their sites on a Big Hairy Audacious Goal.
A college degree is a goal. A system for learning/advancing your knowledge is a… system.
I find myself agreeing with that.
Does that mean that you don’t need a 4 year degree and 5 years of experience to build a Magento website? Definitely not the degree (again, I don’t have one) but you do need the experience. Find a place where you can get the experience where you can build up to that. Or make your opportunities yourself. But whatever you do, know what you’re bad at, practice the things you are bad at, and be good to work with.
You are a software developer if you develop software. It doesn’t matter if it’s good software, bad software, quality software, or crap software. More important than where you are is the direction you have set yourself. Are you crap at software development? Then make yourself better. Honestly, we’re all simply different levels of crappy when it comes to our skills. If you are willing to temporarily work for less money while you learn those things then you will find companies will to pay you to learn them. You may not have the pedigree of a degree, but you will have learned grit, self-determination, and customer-facing skills. And those are more important than if your code passes a mess detector test.
I have more to say, but that’s enough for today. I have deliverables to deliver.