This week I had at least four conversations with people who were young and aspiring developers. I’ve written some personal emails over the last year to others in the same situation and saved their content with the intention of turning them into a more polished blog post. Well, the reality is, the time to polish may never come so maybe it’s better to just get the content out there. I hope it will have value to the few that stumble upon it and, at the very least, means I can point people I talk with to the article and stop creating the same emails over and over again. 🙂
Disclaimer: this is just one guy’s advice, read it with that in mind and get input from other sources. If you have experience and disagree with my advice, please don’t give me a hard time. Write a blog post, preferably with a friendly tone, and give your own advice. If it’s a good article, I’d be happy to link out to it. 🙂
So, here is some advice to new/young/aspiring developers:
Software Development is Frustrating
First, make sure you understand that software development is inherently frustrating, even for the “experts.” You will be frustrated a lot when you start learning how to do development. It’s essential that you learn to become comfortable with and push through this frustration. See our other post, Software Development Frustration, for a more thorough treatment of this topic.
Programming is Terrible, So Learn to Enjoy It
Second, similar to the above, programming is terrible, so learn to enjoy it. If you are “on the net” learning about what programming is like, listening to the voices that get the most attention, you are probably getting the “Hollywood version” of what it means to work with software day in and day out. Now don’t get me wrong, I love programming. My best days are when I can take off the many other hats I wear and just focus on a development project and writing tests to go with it. But, it’s not all roses, and you should be prepared for that. Here is a great article by Ukiah Smith that I recommend: Programming is Terrible, So Learn to Enjoy It.
Go Deep First, Then Wide
I got an email asking if someone who was already learning HTML/CSS/JS should attend DerbyPy to start learning Python. This was my response:
You would be welcome to attend. I’m not sure how much it would really help. It would give you some exposure, but the best thing for code newbies is to just get experience actually coding. HTML, CSS, and JavaScript are a good place to start, especially learning React as it’s in high demand these days. If I were you, and I wanted to learn to code today, I’d get more experience in the technologies you are already learning rather than jump into another new language.
IMO, it’s going to be easier to get a job or internship if you have spent a couple years going deep into one set of technologies that work together than if you have a few months experience in 10 different languages/areas. IMO, if you want to enter software development as a career, focus your attention on gaining as much knowledge as you can in one of the following areas:
- Frontend/Web: HTML/CSS/JS. So many jobs are related to the web these days, you can’t go wrong being familiar with these “backbone” technologies. However, unless you are more aesthetically inclined and want to do more design than development, then I’d recommend after you do introductory work with HTML/CSS, that you focus most of your time on JavaScript and, in particular, React. While JavaScript isn’t my favorite language, it’s everywhere, and is now a frequent choice even for backend work because of NodeJS. The arrival of ES6 and ES7 is making the language better and because of its popularity, there are a lot of good tools in this space. I’ve also appreciated that the community has generally embraced the importance of automated testing and has created tools to ease that process. If you focus a lot of effort on learning JavaScript and become skilled with it, I believe this is the easiest path to your first junior development position.
- SQL: despite the attention given to key/value stores and other non-RDBMS storage platforms over the last 5-10 years, Relational Database Management Systems (RDBMS) like Microsoft SQL Server, Oracle, SQLite, MySQL, and PostgreSQL are prolific. Structured Query Language (SQL) is the heart of interacting with these systems and if you want to be a backend or full-stack developer, spend a good deal of effort learning SQL and how to think about development projects in terms of their data structure and storage. Almost every project I’ve worked on in 15 years of professional development experience has used an RDBMS to store its data. If you have really strong SQL skills, you may find that opens more doors than really strong skills in any one backend language.
- Python: Python is my favorite language. It mostly gets out of my way and lets me be productive with the task at hand. Python is used in so many applications, from web development, to data science, machine learning, AI, game development, quick scripts, and is even an embedded language in many applications including PostgreSQL and soon Microsoft SQL Server. Python is primarily what my son is learning and, Lord willing, he will have about four years of exposure before he hits college. I believe this will serve him well even if he decides he doesn’t want to have a career in software. The only reason I might hesitate to recommend Python has to do with the availability of jobs. In Louisville especially, there are only a handful of companies that I know of that are using Python and that makes it difficult to find work. For a new developer, depending on where they live and what the prevalent technologies are, finding someone local to hire them to work with Python may be very difficult. Remote jobs are an option, but finding a remote job, using Python, that is open to interns or junior devs may be hard to find. From a job prospects perspective, depending on where you live, it may make sense to work professionally for a few years so you aren’t a junior anymore, before you start looking to do Python professionally.
- C#/.NET/Java/Mobile/Whatever…: the underlying principle I’m really trying to get at here is, at the beginning of your career, it is essential to get a deep knowledge in one language or environment so that you can get a few years of professional experience on your resume. So, if your friend’s dad happens to do mobile app development and he’s willing to hire you as junior dev through college and teach you iOS and Android development, take that opportunity! If you are in Louisville, where so much is .NET/Microsoft focused, then learn .NET/Microsoft (preferably the good kind, not the bad kind). Even if you decide later there are other areas of software you want to get into, or different languages you want to work with, having that professional experience and deeper knowledge will help you get a job down the road. The one caveat to this is if you want to enter a field where there are heavy academic principles involved, not just the software development skills. I’m thinking here of things like AI, Data Science, Robotics, etc. If you have an interest in these fields, I’d recommend focusing on them exclusively from the beginning so you get as much focused exposure as possible.
Getting Started and Building Your Network
To a car salesmen who graduated with a business degree and wondered if he should get into programming:
Per our discussion, I think software development is a great field to get into, if you have the natural talent to develop.
There are lots of good resources out there for using Python. Just Google “how to learn python” and you will get lots of great places to start.
For the basics of learning Python, there are a lot of good references here:
http://python-guide-pt-br.readthedocs.io/en/latest/intro/learning/
Once you get a good handle on the language, I’d recommend jumping into an Open Source project like Django or Flask, something big enough that there is “low hanging fruit” that you could learn to troubleshoot problems and help those projects.
Beyond that, look at code academies. This is the only one I know of personally:
https://www.theironyard.com/ (NOW DEFUNCT)
I could connect you with someone who went through it if you are seriously considering it.
There is also a coding academy in Louisville, but I don’t know anything about it personally:
https://www.thesoftwareguild.com/locations/kentucky/
There is also Code Louisville, which isn’t an academy as much as a series of class offerings: https://codelouisville.org/
Finally, if you want a job in Louisville sooner rather than later, you’d probably want to learn .NET and/or JavaScript at first, instead of Python.
If you are seriously interested, it might help to start attending some meet-ups:
We do one once per month on Python: DerbyPy
Some of the above is duplicate advice to what I have already given. But, the main takeaway from this recommendation, is that if you want to get a job in software, meeting other people who are involved in software development is really important. So the advice to start attending meetups so that you can get to know people is essential. This is known as “building your network” and is an important skill to develop regardless of what career you are in.
Bootcamps
While I recommend bootcamps in the email above, and I do know a guy that it worked out well for, there are serious concerns raised by the “bootcamp mentality.” There are others who have spoken on this more eloquently than I have. I recommend for further reading:
- Bootcamps won’t make you a coder. Here’s what will.
- Please Don’t Learn to Code
- Learn to Code, It’s Harder than You Think
- Hordes of Novices
Gifting & Best Practices
From an email exchange. The question:
I think one thing I really need (being a self-taught hacker) is to learn “best practices” or “industry standards” in writing code. Is there a book you could recommend? I’m not looking for anything language specific, just something where I pick up the styles and techniques that professional developers use.
And my response:
Michael,
TBH, there is no set of styles and techniques used by all professional developers. There is just very little standardization in the industry. Having said that, here are three guiding principles that will make a big difference for your development career:
- Of all the people doing software development, my gut is that 65% or better of them don’t really get software. Try not to be one of those people or work on teams that have lots of those people. It’s a craft, learn how to build good software, take jobs with teams that know how to build good software, and with companies who appreciate the unique constraints building good software imposes. Take a job for 1/2 the pay if needed as a junior dev to work for a company that is building software well. It will pay huge dividends and result in higher wages down the road.
- Learn about Agile (https://www.youtube.com/watch?v=Z9QbYZh1YXY, play on 1.5x speed for sanity), how it’s different from waterfall and how Agile principles are different from Agile systems (Scrum, XP, etc.). Be dedicated to the principles but flexible with the systems. Look for companies who not only give lip-service to being Agile, but can point out in all areas of their business, not just development, how Agile impacts them. It rarely possible for a development team to truly be Agile if the organization as a whole isn’t Agile.
- Learn how to do automated testing and, in particular, the benefits (and some drawbacks) of Test Driven Development (TDD). Don’t take a job with any company that doesn’t have a standard for at least 80% of their non-legacy production code covered by tests. The best workflow is that code changes go into a pull request (PR) before it’s merged into master and tests are run automatically using continuous integration servers to verify functionality before that code is merged into master and deployed into production. There is a video about this process on our job description pages.
It will be hard to find companies that practice these things. I believe the majority of people who write software are bad at it or are stuck in organizational processes that don’t allow them to be good at it. If you consider the above as non-negotiable, it will make finding a job much harder, but your working hours (usually) much better.
I’d recommend the following (in order based on what you asked for):
- Clean Code: A Handbook of Agile Software Craftsmanship and the author’s blog.
- Test Driven Development with Python (Obey The Testing Goat): this is Python specific, but the testing ideas and principles will apply to any language and Python is relatively easy to program in
- The Pragmatic Programmer: From Journeyman to Master
- Facts and Fallacies of Software Engineering
- The Mythical Man-Month: Essays on Software Engineering
One last thing, if at some point down the road you find yourself uninterested in the above and/or continue to find yourself struggling to build good software [far enough down the road that you are past the struggle that all new developers face], consider whether or not you are really gifted at it. Software is as much art as science; you can only learn so much. I could take painting lessons for years and I might get better but, overall, I’d still suck at it. I just don’t have artistic talent. I’ve met developers who struggle greatly even with relatively basic programming tasks and it seems clear to me they don’t have “the gift.” There are those who even admit they are mostly in it for the money. I think their overall quality of life would improve by recognizing it’s not something they can do well, and instead, find something they can do well and enjoy doing. So, if you find yourself not liking the challenges and frustrations that come with software craftsmanship, don’t slog through. Feel free to drop it and find something else to do that you are gifted at.
Learning Resources & My Son’s Experience
My second oldest son is homeschooled, but I don’t have the time to teach him daily how to code. I’m certainly involved in helping him with particular problems and occasional troubleshooting, but I needed to find resources that he could use that would teach him to code and provide projects to work on. Since I believe that software development skills are fundamentally self-taught, it made sense to me to find some online resources for him to use.
To give some context, my son will turn 14 in a few months. He has been doing stuff with computers and programming for a couple years now, but it wasn’t very structured. Since he turned 13, I made it part of his schooling and he has been working on learning programming for about 8 hours per school week. In the past he has been somewhat frustrated with computers and was only doing it because I asked him to. In fact, over the past year, there was one time that he came to me very frustrated and upset with a problem he couldn’t solve and said he didn’t want to do programming anymore. I told him he at least needed to finish out the semester. Ironically, not shortly after that, he seemed to turn a corner, and his understanding, skills, ability, and enjoyment have grown.
He can now sit down for 4-5 hours at a time and enjoy working through the programming problems he is facing, despite the frustration. He has finally come to see and believe that he actually can find the answers to his problems if he keeps working on them. He has learned to expect and embrace the frustration, which is one of the most fundamental skills any developer must have.
Here are the list of courses he has been working through and will continue working through:
- Basics of Web Development & Coding: 5 course specialization by the University of Michigan
- Introduction to Structured Query Language (SQL): 2nd of 4 course specialization in web development by the University of Michigan
- Fundamentals of Computing (w/ Python): 7 course specialization by Rice University
Listed below are some resources that are on my radar for him. Some of them are deliberately not programming classes so he can get exposure to areas that intersect with software development that aren’t programming itself.
- Graphic Design: 5 course specialization by California Institute of the Arts
- User Interface Design: 5 course specialization by University of Minnesota
- Interaction Design: 8 course specialization by UC San Diego
- Python for Everybody: 5 course specialization by University of Michigan
- Intro to User Experience Design: one class by Georgia Tech
- HTML, CSS, and JavaScript for Web Developers: single class by John Hopkins
Note: we paid for Coursera classes for a few months, but ultimately found that self-paced study was a better fit.
Finally, here are a few “back burner” resources that I found and just wanted to keep track of. With the exception of the Mozilla tutorial, we haven’t tried any of these yet:
Where to Go From Here?
I really like how Bootcamps won’t make you a coder. Here’s what will ends, so I’m going to recommend you head over there and read at least the last two sections:
- Ask yourself: Are you cut out for coding?
- DIY: Getting there without the bootcamp
If you are ready to get started, the links in the section above would (obviously) be a decent place to start for self-learning.
That’s all I’ve got for now. I hope it will help some of you. I wish you the best on your future endeavors, whether they involve software development or not.