Tips for Software Developers Just Starting Out
I brought my 8-year old son Alex to Tampa Code Camp at Keiser University.
Now that Alex is older, I enjoy taking him to these types of events. There's always something for him to learn, and he loves the cool swag! Also, on this particular rainy Saturday, it was a good answer to the weekly question of what to do on the weekend.
In any case, sometime after lunch, we took a break from the sessions, deciding to hang out in the main auditorium. While there, I struck up a conversion with a fellow Software Developer, Jared, and a long-time recruiter friend of mine, Steve Turner. As the three of us were chatting, two nearby attendees, Tatyana and Kelvin, chimed in asking for advice on starting out in the software development industry.
I gave as much advice as I could on the spot, stream-of-consciousness style, while promising to follow-up with a more detailed email response later. As I slowly recaptured and organized my spoken words into an email, I realized this would be better suited as a long blog post.
Several months later, here it is:
- Get a sense for what Code is
- It helps if you are passionate
- Keep learning
- Get comfortable using the Terminal
- Learn Git and GitHub or GitLab
- Learn how to test your code
- Learn how to write resilient, quality code
- Learn Object-Oriented Programming
- Learn the terms and concepts
- Learn about different software design principles
- Learn about anti patterns too
- Google and StackOverflow are your friends
- Become a Polyglot
- Try solving real-world tasks
- Check out the Awesome lists
- Social Media
- Websites / Podcasts / Blogs / Newsletters / Email Lists
- Promote Yourself
- Ignore or minimize imposter syndrome
Get a sense for what Code is
If you haven't done so already, do yourself a favor and read through Paul Ford's 2015 Bloomberg article What is Code?. It's a long, rambling read, but it's full of informative foundational information, and an accurate portrayal of one segment of this industry.
Do not pass Go until you read it.
Okay, now that that's out of the way, on to the rest of my article...
It helps if you are passionate
I've conducted many technical interviews over the years, and each time I've tried to gauge the applicant's passion level. Are they passionate about this vocation? Or, are they more of a 9-to-5'er; where it's just a job to them? I'm not suggesting that they need to work long hours. However, if they were passionate about this, there would be readily identifiable evidence, like: continual learning, attending meetups / user-group meetings / conferences, buying books, reading blogs, watching videos, taking courses, etc.
If you want to be successful at this, it immensely helps if you're also passionate about it. That passion, and a hunger for learning, will keep you engaged and evolving over the years.
Embrace the Japanese concept of Kaizen (改善), or continual self-improvement.
Learning should be a life-long process. Even as a so-called industry veteran, or Senior Software Engineer, there's always more to learn. If you run out of ideas, try learning an ancillary subject, such as: Statistics, Linear Algebra, Data Science, Artificial Intelligence, Machine Learning, Robotics, etc. The options are endless.
"Coding is hard" will discourage some people from attempting it.— April Wensel (@aprilwensel) January 16, 2018
"Coding is easy" will discourage some people who are attempting it and finding it challenging.
Alternative: Learning to code is a neverending journey with a set of challenges and delights unique to each person.
Books are an obvious good way to keep learning. I recommend starting your library of technology books, either physical or electronic. Though understand that most books, especially technology books, will eventually become outdated. This is where ebooks have the advantage since they can be updated. Even so, if you learn one or two things from a book, then the cost of it was worth it, and its obsolescence less of a negative.
Here are two publishers I tend to purchase from frequently:
Be sure to follow Manning on twitter as they will periodically tweet discount codes. PragProg is also on twitter.
My books come from other publishers and sources too though. Books are so inexpensive, that I do not hesitate to buy one if the topic interests me the slightest. I usually get some value out of it. Though there have been a few cases where I bought a dud or two.
Take full advantage of online courses from sources like: Coursera, Udacity, edX, etc. In addition to books, this is probably the best way to continue learning. Free or discounted courses found on sites like YouTube Udemy can be equally as valuable.
Here are some of the courses I've taken and recommend:
- Self-Driving Car Nanodegree at Udacity
- Machine Learning Specialization at Coursera via University of Washington
- Scalable Machine Learning at edX via Berkeley University
- Data Science Specialization at Coursera via John Hopkins University
- Machine Learning at Coursera via Stanford University
When you are first starting out in your career, certifications are a good way to let potential employers know that you know a certain programming language or technology. I also see certifications as tie breakers. If an employer is trying to choose between two mostly similar candidates, the one with the certification will likely have the edge. In a few rare cases, certifications are required for some positions. For example, you would not really be able to get an AWS Solutions Architect position without the corresponding certification. The Networking and Security sub-fields have similar certifications for technologies which are practically required. Project Managers and Scrum Masters have their desired certifications too. Most Microsoft-centric shops look for Microsoft certifications, or at least MVPs.
If you ever take an online course (Coursera, Udacity, edX, etc.) and you are given the option between taking the course for free, or paying and receiving a certification at the end, go ahead and take the certification route. Most of those establishments have the means to display your certification on LinkedIn as well.
I personally started taking certifications early in my career when I grew wearing of taking test after test on interviews. My certifications were a message to interviewers that I knew my stuff. Whenever I take an online course, I always opt for the paid certification version. Why not have something to show for after spending all that time on the course?
Learn Logic and hone your analytical mind. You have to think logically and analytically to do this job.
Try solving real-world tasks
I mentioned this in another blog post. I've never felt that toy examples, like "hello world" et. al., did much to help reinforce learning something new. I recommend trying to accomplish real tasks to help expedite your learning. Maybe you have a computer-based task you perform regularly which could benefit from automation? Try using it in a way which relates to things you know. Many programmers started out by scratching their own itch, so to speak. They wrote their first code trying to avoid doing something the manual, painful way.
Necessity is the mother of invention.
Get comfortable using the Terminal
On macOS and Linux it's called the Terminal, on Windows it's the Command Line window. Sometimes it's referred to as the Console.
Try customizing your PS1.
Learn Git and GitHub or GitLab
Git is a distributed, version control system for your source code. GitHub and GitLab are 3rd-party web product around git. These days most technical employers will want to see your public GitHub or GitLab repos. It acts to supplement your resume, and in some cases it is your resume. You should learn these tools and become familiar with their related functions.
If you are being paid to write software for a company, your code needs to be checked into some sort of company version control repository. No excuses. Source code should be treated as a corporate asset. Many companies cannot operate successfully without their custom software. It needs to be saved and protected.
Here are some resources to get you started:
Google and StackOverflow are your friends
Part of being a Software Engineer or Developer is Googling error messages and scouring StackOverflow for solutions to your problems. Get comfortable with these tools and familiarize yourself with their ins-and-outs.
pic.twitter.com/M5AxBrLlhz— Joseph Woodward (@joe_mighty) May 3, 2018
Sometimes you will run into a dead-end though, where nothing comes up.
The other day I attempted to install a new library I read about, TileDB. During the install, it failed with an error. Sometimes the error message is generic enough that you can Google it and find the solution. Maybe the error is bubbling up from a popular 3rd-party library dependency? Or, maybe the project is so new, or the error message so specific, that nothing comes up via Google or StackOverflow. In that case, I found the project's public GitHub repository and entered an issue. The author later responded, made some change, and closed out the issue. Now I can successfully install it!
Reddit is your friend too
Here are some other sources from reddit:
And useful subject-specific subreddits:
Every popular language or technology should have a corresponding subreddit, just search or browse for it.
Learn how to test your code
Start out by printing variable values to STDOUT) from within your programs. Try using a REPL for the same effect. This is sometimes known as console-based developing or testing.
Later, learn how to use a debugger if your language has one. You can set breakpoints, run your code and inspect the state while paused.
Lastly, learn how to do unit testing at a minimum, and continue on by learning about test-driven development (TDD), Behavior-driven development (BDD), code coverage, test automation.
Each language / framework / sub-domain will likely have their community's preferred tools and techniques for testing.
When traveling down your path of learning how to test software, it's a good idea to keep these points in mind:
- Testing your software should not be more arduous, or time-consuming, than writing the software itself. You shouldn't have more test code than actual code.
- It's okay to make assumptions about system-level code you use but didn't write. For example, you can assume that language-included libraries have already been tested and you don't have to write a test for it. On the other hand, I've written tests to test out how a system library works if I was unfamiliar with it. In order words, to test my assumptions.
- Avoid "mock the world" scenarios where you are creating a mock for everything in your system. Sometimes it's better to test against actual resources if you can.
- Remember that 100% code coverage does not equate to 100% quality software.
- Adhering to testing practices doesn't have to devolve into fanaticism. Test-first (writing tests before writing the code) is just as good as Test-after (writing the code first, then the tests) as long as you test before releasing, or pushing to Production.
Testing can show the presence of errors, but not their absence.
Learn how to write resilient, quality code
Many, many years ago, I stumbled upon Bertrand Meyer's Eiffel) programming language, and his Design by Contract concept of preconditions / postconditions. The idea that each method or function should validate the inputs it requires (preconditions), and the output it returns (postconditions). That concept really stuck with me, and I've strived to use it in every language I write code in. Sometimes a language has built-in support for this, and sometimes you can use a library, or you can write your own code to do this.
Developer: "Here's some water."— Product Hunt (@ProductHunt) May 7, 2018
Learn Object-Oriented Programming
I mentioned this in my previous article. Here are a list of terms and patterns I would encourage looking into:
But then learn Functional Programming too
Learn about different software design principles
- Single responsibility principle
- Open/closed principle
- Liskov substitution principle
- Interface segregation principle
- Dependency inversion principle
Learn about software design patterns
Learn the terms and concepts
There's a lot of terms, concepts, and abbreviations in this industry. Try learning some of them, or look up any you hear but are unfamiliar with. Here's a few to start with:
Become a Polyglot
I've mentioned this in a previous article, over the years I've utilized several programming languages in my software solutions, systems, and deliverables. Here's a snap-shot:
That list grew for several reasons:
- An employer (or instructor) decided upon a language/technology I had no say in
- I learned a new language/technology because I thought it would help my career or marketability
- I learned a new language/technology because I wanted to avoid the pain/tedium of another language/technology
- I learned a new language/technology because I found it to be interesting or fun.
I consider myself a programming language aficionado, and love learning new programming languages. Whatever your reasons end up being, learning more than one language/technology is good for your brain. You'll find that learning a technique in one language will improve your skills with another language. It will round-out your knowledge and make you more desirable to potential employers.
But use what works for you
For your day job, you should strive to work with what makes you the most happy. Life is short. Why waste it working with a language or technology which makes you miserable, or causes you stress. The effects of cortisol are too damaging to your wellbeing and health. Move on to something which gives you satisfaction and less grief.
Checkout the Awesome lists
These are curated lists for various programming languages or technologies, usually found on GitHub. Very useful if you're trying to find out if there's a particular library for the language you're using. You can try starting with GitHub's "awesome" topic, or use this search site AwesomeSearch, or try this site too, Awesome Repos. Here are some I like:
Attend Local Community Meetups
Try attending as many local meetups and events as you can.
The local technology and programming community is thriving here in Tampa. You just have to look around. The Tampa Bay Technology Forum (@TheTBTF) is a big one.
Most communities have a corresponding group on Meetup.com. Meetups are a great way to find user groups and meet new people. Check out the technology meetups here in the Tampa Bay area. Below are the ones I sometimes attend:
- Tampa Hackerspace
- GDG Tampa Bay
- Tampa Bay Data Science Group
- Tampa Bay AWS User Group
- The Tampa Ruby Brigade
- Tampa Bay Tech Events
- Tampa Bay Python
- Suncoast iOS
- Tampa Bay Internet of Things Developer Group
- Barcamp Tampa Bay
- Tampa Bay Hadoop Users Group
- Tampa Bay Apache Spark Meetup
Meetups can come and go over time, so remember to occasionally check the website for new ones. Here are some other good ones:
- Tampa iOS Meetup
- Ignite Tampa Bay
- Pasco Python Meetup
- Tampa Bay UX Group
- Tampa Bay Cocoheads
Tampa is also trying to cultivate a Startup culture. I used to attend a few of the Startup-related meetups.
If you're not from Tampa, check out the meetups and events in your city.
Attend Local Conferences and Events
Lanyrd used to be a great resource for conferences, though I am not sure of it these days. Eventbrite is another good source to find tech events in Tampa. Here are some future events to look out for:
- 2017-Nov-08: Microsoft Power BI: Dashboard in A Day Roadshow
- 2017-Nov-10: 14th Annual Tampa Bay Tech Awards
- 2017-Nov-11: DevFest Florida
- 2017-Nov-12: Visual Studio LIVE!
- 2017-Nov-14: TECH Talk
- 2018-Feb-12: Techstars Startup Week Tampa Bay
- 2018-Feb-24: SQLSaturday
- 2018-Mar-17: Orlando Code Camp 2018
- 2018-Apr-25: Front-End Design Conference
- 2018-Oct-??: BarCamp Tampa Bay 2018
I am always on the look-out for local or nearby conferences and events. Sometimes your favorite programming language may have a nice one-day event nearby. Ruby used to have MagicRuby in Orlando and Ancient City Ruby in St. Augustine. Elixir also hosted ElixirDaze in St. Augustine last year, and ElixirConf in Orlando last year.
Local Job Market
Tampa has many .Net and Java shops. There is also quite a bit of mobile here (iOS / Android). I find it interesting to observe how the local trends change over time. Before Microsoft's .Net hit the scene, Delphi) was very popular in the Bay area. I used to keep track of all of the Delphi shops. Now, they either do not exist, or have transitioned to a different technology.
Sometimes you may feel at odds with the local job market. Especially when you want to get a job in a technology or subfield which is not popular here. Machine Learning for example. You would have to work 100% remote, or move. In any case, that is something to think about when you are deciding what you want to work with.
I recommend you connect with a veteran recruiter or headhunter who knows the local market very well. I have 800+ connections on LinkedIn, and I would wager that 80% of those connections are recruiters or headhunters. Out of that pool, I would say Steve Turner fits the bill; Fritz Eichelberger is another. Send Steve and Fritz a connection invitation and ask them about the local job market. You probably remember Steve from Tampa Code Camp. I frequently see him at other local events all the time.
In the past, I would occasionally meet a recruiter or headhunter for lunch just to hear them talk about the local market and what opportunities were hot at that moment. It is always good to keep in touch.
On a related note, networking is probably one of the most important things you can do for your career. Do not be afraid to introduce yourself, or ask for a business card, or send a LinkedIn connection invitation. Connecting with people is important. In the beginning of my career, I had to force myself out of my comfort zone to do these things. In retrospect though, I recognized that most of my job offers came from people I already knew who I connected with previously. Either they contacted me directly about a job, or they worked at the company I wanted to get a job at.
Treat every technical conference or meetup as an opportunity to expand your network and make new connections. There has been plenty of times I have attended an event where the subject or content was not as valuable to me as the connections I made there. If you make a few connections, then the event was probably worth it!
Here are a few to consider:
Twitter is a fantastic source for developer-centric people or technologies to follow.
Websites / Podcasts / Blogs / Newsletters / Email Lists
Start a blog on WordPress, Medium, Tumblr, or GitHub. I really enjoy following Julia Evan's feed as she learns new things and illustrates her findings. Document your journey as you learn new things. Someone else can learn from you too.
It is also good for potential employers to see. Use social media (twitter, Facebook, LinkedIn) to promote your blog posts.
I started blogging back in 1998. There were a few years where I did not blog at all, and now I regret it. These days, video blogging is very effective too.
Ignore or minimize Imposter Syndrome
I think almost everyone is affected by self-doubt at certain points in their career. This ever fluid industry can seem overwhelming at times.
Try to ignore impostor syndrome, or minimize it as much as possible. Avoid negative people in your life, ignore the online trolls, the "Well, actually..." people. Believe in yourself. Remind yourself that no one knows everything, and everyone had to start from the beginning at some point.
Here are articles which talk about the subject:
- Programmer Imposter Syndrome: 6 Ways to Get Over Yours
- What is Impostor Syndrome? 6 Ways for Designers and Developers to Beat it
- How To Fight The Programmer Impostor Syndrome?
- Overcoming Imposter Syndrome to Become a Software Engineer: Jonas’s Story
- Impostor Syndrome: The One Challenge Developers Don't Talk About
- I'm a phony. Are you?
Also, check out Rob Conery's new book, The Imposter's Handbook.
I hope this helps, good luck!