Distractions are everywhere. Instead of only competing with our inner monologue, doubts, and fears, we are now flooded with external reminders from computers, phones, tablets, and all the software therein. When our phone volume is turned up, we constantly hear the little chime indicating new text messages, new pictures, new notifications. It’s endless. We know how tough it can be to stay motivated while learning to program and create hardware and software for computers.
You might be telling yourself, “Oh, it’s no problem. Motivation isn’t an issue for me. I’ll keep on trucking regardless.” And that might be true for a while. But sooner or later, every person has a breaking point. The more complex a task becomes, the easier it is for our minds to begin to wander into less taxing thought processes.
Even if you’re the type of person that has a one-track mind and can focus endlessly on the task at hand, much of the following advice will still be useful for you.
That’s why we’re writing up this guide. Let’s go.
Find a Focus
If you’re running all over the place to learn a hundred different things at once, chances are that you’re going to get frustrated, fail at all of them, and burn out quickly. It’s easy to get into that stressful scenario when trying to learn programming and software development because the categories are endless, broad, and changing every day. You need to zero in on a specific topic or category to reduce noise in your peripheral vision.
Imagine that you’re driving on a highway at high speeds. Other drivers are blasting by you at various speeds. Construction equipment is littered all over the road. Kids are yelling in the backseats. You’re probably going to have sensor overload which will force you to focus on a few of them at a time. In this scenario, safety reasons dictate that you should probably pay attention to the road. At that moment, you’ve found your focus.
Fortunately, learning about computers doesn’t quite have the same level of safety requirements, so you’re free to select a spotlight as you see fit without the stress of injury.
Let’s start small and simple. Identify what you enjoy about computers. It helps to have a genuine interest in computers, hardware, or software. Sure, you can treat software development as “just another job” and clock out after 5 PM, but you may find yourself dragging when it’s go time.
If you can honestly say to yourself that you enjoy working with computers and technology, follow that up by asking yourself some questions. Write down the answers:
Do I like to play with hardware? This can include: input devices like keyboards, mice, phones; output devices like televisions, monitors, headphones; connectivity devices like Wi-Fi technology, radios, networking; and a lot more. Basically, think of any physical device that you might interact with directly or indirectly. Someone has to make those things work. Is that you?
Do I enjoy using software and applications? Think about operating systems (Windows, Linux, Mac), word processors, video games, movie/music players, browsers, cryptography, security, virus scanners, and the thousands of other possibilities. When we think of programmers these days, software is what most commonly comes to mind. It’s typically easier to learn, quicker to get up to speed, and has fewer barriers to entry than hardware.
Do I have a hobby or other profession that uses computers? Computers are so widespread these days that it’s difficult to find anything that doesn’t involve them. Nearly every job requires at least some sort of skills with a computer (unless you’re involved with 100% manual labor). But even then, you might have a cell phone with a company application that requires you to check in, record your time, or interact with customers. Try to think of anything with which you interact that you’d like to involve or improve.
Is there any specific device or application that frustrates me? Maybe you’re a day trader on the stock market and absolutely hate the website that allows you to execute trades. What about a specific video game genre that you loved as a kid and can’t seem to find any good replacements these days? That’s exactly how Stardew Valley got started, so there’s precedent and inspiration wrapped up in one.
Ultimately, these are personal questions that only you can answer. Work your way through these questions, write down the honest answers, and you’ll quickly realize how prevalent computers are in your life. Honest self reflection will reinforce your passion for computers, programming, and possibly even starting a new career (even if you don’t have a college degree). In the process you’ll realize where you want to start a focus.
Sometimes you won’t be able to answer these questions without at least minimal exposure and experience. After all, how do you know if you want programming to be a hobby if you’ve only just started learning it? Maybe you’ll be so interested and good at it that you want to try it full time. Or maybe you think building a website would be fun but absolutely hate it after trying to build a few.
- Hardware + phones + radio
- Hardware + routers + Wi-Fi
- Software + operating systems + device drivers
- Software + websites + social media
- Software + games + real time strategy
If you survived the onslaught of personal questions above and came out of it with a greater understanding of yourself and where you want to go, then you’re in good shape. You’ve passed the first step: figure out where you want to go. Now you’ll need to take some time to figure out what you want to achieve.
Goals are different from a focus. While having a focus will help you narrow down the paths that you want to take, one or more goals will help you establish the reasons for doing so. In a nutshell, a focus is your path, and a goal is something that you want to attain at the end of that path.
You will again need to ask yourself some questions.
What’s driving you to be a programmer? Money? There’s certainly the potential for a lot of that if you’re willing to negotiate for what you’re worth. Fame? That’s tough unless you build a brand out of yourself like some of the more well known tech evangelists. Knowledge? Hardware and software changes every day. You’ll never be short of learning new things. Community? The economy is increasingly globalized, and that’s especially true for technology. Devices are connected, software has to scale to global proportions, and people have to communicate across many different boundaries.
Do you want more money? Like we mentioned in the previous question block, there is potential here. It’s important to note that salaries and benefits are highly variable between companies, cities, states, and countries. It’s difficult to compare one person’s salary to another due to how many variables there are in the equation. We’ve written previously (here and here) about how to approach the job search process to make sure you’re fairly compensated.
Do you want to be challenged? There’s no shortage of challenges in technology. For many people, computers work by magic. Programmers and engineers know better. The complexity under the hood can be daunting, exciting, frustrating, and rewarding. Yes, that’s a lot of conflicting emotions, but it’s true. You certainly have the opportunity to find high challenge and high reward projects.
Do you want to be involved in communities? With services like Bitbucket and GitHub, there’s no better time than now to get your experiments in front of the public. You can easily publish your work to the rest of the world, track your activity through GitHub’s activity feed, set personal activity goals for yourself, and contribute to other online projects. Sometimes it feels like the general population sees developers as lonely, isolated creatures that live in dark rooms and never socialize. As engineers, we of course know that couldn’t be further from the truth.
Do you want to solve local or global problems? Think about some different applications you use on a daily basis. To-do lists? That’s a solution to a local, personal problem. Twitter? That’s a communication solution relevant across the globe. There are also a ton of different solutions between those obvious ends of the spectrum, but you get the point. Some developers enjoy the more personal control and connection they get with local solutions. Others prefer to enact civilization-scale changes through technology. Which one are you?
Do you want a change in life? Maybe you’re just bored with your current job, you’ve been displaced due to changes in the economy, or you just want a change for no real reason at all. There’s nothing wrong with this approach either. Just remember that this type of goal is vague and probably requires some refinement. It’s OK to start with saying, “I want to change my life,” but you’ll need to eventually visit some of the more specific questions above to narrow in on what exactly you want to change and how you want to achieve that change.
After combining the answers from your focus questions with your goals questions, you should have a better idea of where you want to go and what you want when you get there.
- I currently make $35,000 / year and want to instead make $75,000 / year
- I want to solve problems with local businesses by helping them build branded websites
- I want to change my career because I’m bored and not challenged enough
- I want to have the flexibility to work from home or remotely more often
Even if you know exactly where you want to go and precisely what your outcomes will be, sometimes we all experience writer’s block. That is, how to I get from point A to point B? What vehicle will take me there? My feet? Should I design a fancy car? What about something the entire community can use? Sometimes we all need a little inspiration.
By far the most popular open source community exists on GitHub. There’s an endless number of projects popping in and out of existence with all the source code ready for you to view and contribute to at any given moment.
If you’re not already on GitHub, you probably should be. In fact, any of the projects that you work on while learning should be packaged up and placed into your public portfolio no matter how bad you consider them to be. Yes, you’ll show flaws in your code (you’re still learning, after all), but you’ll show progress and improvement over time. Employers love to see potential candidates that take an active interest in personal projects and community contributions.
There are several sections of GitHub that you should investigate for some inspiration:
Explore: On this page, you’ll see a view of repositories, users, and developers that GitHub thinks you’ll like based on your activity. For example, it might say “Based on your public repository contributions” or “Based on repositories you’ve starred.” This might let you find new communities and applications that inspire you to create something new or start contributing to those communities in an effort to scratch an improvement itch.
Topics: When you create a repository in GitHub, you have the option of applying tags to it. These are useful when you want to categorize the type of repository you’ve created. For example, you created a terminal and want to tag it with
terminal or you’ve created and Android extension and want to tag it with
android. This lets others users find repositories in narrow topics and allows your repository to bubble up into the trending topics section.
Trending: This section shows “trending” repositories and developers in a list view with a few filters around languages and dates of activities. We aren’t really sure how these items are selected or considered to be trending other than the vaguely worded headline indicating “…the GitHub community is most excited about today.” Maybe it’s collecting views, commits, issues, and pull request activity? Regardless, you can check this list now and then to see what others are interested in and what you might be interested in.
Collections: GitHub has a feature that allows you to manually build collections and essentially curate repositories into these collections. Instead of relying on repository owners to properly tag their repositories, you can suggest that a collection be created. This type of organization seems to be more useful for broad categories like “text editors” and “game engines” rather than fine-grained tags. Dive in to GitHub’s collections for some inspiration
Watch Twitch Streams
This community is still small (max viewers at any given time 1,500 to 2,000 compared 100,000+ in other categories), but it seems to have a lot of potential with some talented individuals streaming on a daily basis.
We don’t suggest you sit and watch the full 8 hours that some people stream because there’s a lot of noise and minimal opportunities to truly learn a topic. However, you can get some good ideas or find inspiration in the humor of others. Plus, depending on the streamer, you’ll have the opportunity to chat with others and the streamer personally for an added opportunity of real time question and answer sessions.
Nonetheless, it’s worth checking out if only for the unique experience it provides alone.
Join Local Meetups
Using sites like Meetup.com or Facebook can help you find local groups that are welcoming to whatever programming interest you have. Many local meetups and groups are catered specifically to people starting out. Some people find it helpful to get out there are start socializing with other like-minded individuals on the same paths of progression.
Another benefit to joining these group is that you might find potential employers or teams that are recruiting for new projects. You’ll get real world interaction with other developers, product owners, project managers, and quality assurance testers. This will give you exposure to other areas of the industry, give you practice with crucial social skills, and introduce you to new ways of solving problems.
It’s highly unlikely, but if you’ve exhausted all avenues of finding local groups and still can’t find an interesting meetup, you could even start your own meetup group.
There’s nothing worse than trying to learn something and have your learning materials scattered all over the place. Disorganization is a huge demotivating force, quickly stalls progress, and will more than likely cause you to give up on your learning. Some people are fantastic at maintaining an organized life, but for those of you who just can’t quite keep it together, you would definitely benefit from reading this section and other organizational guides.
The good news is that, like most problems in life, we are able to build tools and establish processes that suppress our inner demons and force us into habits of coordination and control regardless of how chaotic we are by default. Human vices can be difficult to overcome and knowing that we have the ability to automate away many of our bad habits is slightly comforting.
Use Source Control
This one is the most obvious and non-negotiable organization tactic.
Take a minute to consider how easy it is for files, folders, and code specifically to get disorganized and scattered across our hard drives. Applications and the code that makes them work are living documents. The phrase “etched in stone” absolutely does not apply. As such, we need to employ tactics that allow us to keep track of anything that happens to those files for our own sanity and for the health of the application.
With a source control system (aka version control), you can effectively track all changes to your work including:
- When a change was committed
- Who committed the change
- What was included in the committed changes
In addition, source control systems provide some critical functions that can be performed on these changes like:
- Revert to a previous version if a mistake occurs
- View the full history of changes to files
- See who changed specific lines in files
- Work in parallel and merge changes together from different people
You can read more about how to effectively use source control tools like Git, Visual Studio 2019, and Visual Studio Code, and others on our huge tools list to keep your programming experiments neat and tidy.
After you’ve mastered the art of organizing your projects locally, consider taking your skills to the next level by promoting your repositories to something like Bitbucket or GitHub as a means of backing up your code and allowing others to contribute to your projects. Not only do you get a secondary location to show off your organization abilities, but you’ll also have a public portfolio to discuss and display during job interviews.
Not only do you get the benefits of collaboration, public access to your code, and crowd sharing of your knowledge, but you also get a nice user interface to organize and keep track of your repositories. After you create your GitHub account, your profile can be used to organize and view your repositories, followers, packages, and activity.
Keeping a tidy profile helps you remember what you worked on in the past, where you want to go in the future, and what improvements you can make to existing repositories. Other users can look at your code, provide critical feedback, and request their own changes to be merged in to the code in an effort to build and ultimately better product.
Collaboration? Check. Coordination? Check. Organized? Check. There’s literally no downside to taking advantage of this.
As you begin to level up your programming skills, build bigger projects, and eventually collaborate with others, you won’t be able to keep tracking of everything you need to do in your head. There’s just too much information and too many tasks that need to be completed.
That’s why you need an advanced list-making application like Trello (it’s free) to help you collect and organize all the “stuff” you need to get done to succeed. Sure, you could try to settle for a simple to-do list application on your phone, but that would only take you a few steps. With Trello, you’ll have the ability to dip your toes into the world of what we consider to be a criminally underrated skill among software engineers: project management.
To be honest, you could even treat Trello as your own personal study board. You could create lists for each topic you want to study: C#, Python, data structures, memory management, and more. These lists could be broken down into your study cards (complete with learning notes). As you complete the cards, you can archive them away for future reference.
Follow Best Practices
When you’re just starting out, you probably won’t know any better than the strategies introduced to you in the few guides that you’ve referenced. Guides will sometimes have wildly different teaching strategies, and many of them will show you how to do something in a watered-down approach for the purposes of teaching the fundamentals rather than teaching best practices. This isn’t necessarily a bad thing. People need to start out with the fundamentals without getting drowned in the details of optimization, line count reduction, or avoidance of code smells.
And while we understand that you’re still in the learning process while reading this guide, it’s useful to at least point you toward what we consider to be good starting practices.
Branching & Committing Cadence
Imagine a scenario in which you are part of a three person team working on the same file. You make some changes and commit. One of your teammates pulls down your changes and quickly realizes that your changes broke a few things. Now that developer is blocked until you or he can resolve whatever bug you introduced. Now that’s what we call a conflict.
That wouldn’t be an issue if you created a branch and committed your changes to the branch while code review and testing was ongoing. By isolating your changes to a branch and exposing that branch to other developers, you’re encouraging segregated collaboration and reducing the amount of churn caused by team conflicts.
In addition to branching, the cadence at which you merge and commit to your branch is critical.
Committing changes to your local branches as often as possible encourages you to track granular changes and allows you to unwind changes in a more piecemeal manner. Frequently merging from a master branch into your local branch ensures that you won’t get too far behind the master code, reduces conflicts with changes from other contributors, and prevents you from have stale branches that hang out there without ever being released to production.
Don’t Write Clever Code
There’s a universal truth about many complex problems (programming included): there are usually numerous ways in which they can be solved. Yes, that’s certainly true, but that doesn’t mean every solution is acceptable.
Imagine you’re reviewing changes from your coworker. You come across a strange function that makes nearly zero sense. You just can’t understand what it’s doing. Sure, it’s briefly written and gets the job done, but can’t be understood by anyone but the author. Teams certainly don’t function very well if only a single person on the team understands certain lines of code.
That’s why we suggest avoiding “clever code.” But what is clever code? How do you know when you see it? Is it something that we’ll “just know” when see it? Probably not, but there are some guidelines to follow.
- Does the line exceed whatever horizontal width you and your team has agreed to? If it does, you might need to split the line up or refactor it to be shorter.
- Does the line consist of an overwhelming number of operators? Consider:
i > 0 ? i << 2 : ~(i << 2) + 1;as an example.
- Are there zero comments on the function?
- Does it take more than a couple seconds to have a general idea of what the line is accomplishing?
If the answer to any of the above is “yes,” then you will probably need to take some action.
Don’t Worry About Optimization (Yet)
Beginning programmers are going to be writing a lot of trashy code. You won’t know exactly what you’re doing all the time. You’ll be improving with every line that you write. That said, you’ll also be making a lot of performance and optimization mistakes.
Instead of reusing objects, you might be tearing them down and spinning them up repeatedly in a loop. Maybe you aren’t disposing of managed objects. You could even have memory leaks all over the place.
When you’re learning, it’s OK and sometimes even preferable to make these mistakes. By suffering through these problems, you’ll be introducing yourself to real world issues and their solutions.
During your research, you might come across suggestions from people involve complex profilers, debuggers, performance analyzers, and memory dump analysis programs. These are definitely good tools to learn, but if you’re just getting started with programming, they’re probably out of scope and overwhelming.
Try to focus on learning and mastering the fundamentals before tackling the advanced optimizations. That will help you stay on track and motivated to align with your goals from earlier in this guide.
Building anything of importance (or really, anything at all) can sometimes be difficult to envision. Where do we start? How do we start? What if I’m not going fast enough? Have I considered everything? What am I missing?
Fear, uncertainty, and doubt can easily overwhelm us into inaction.
Whenever we fall victim to this mindset, we like to think of a quote in the movie Apollo 13.
Now listen, there’s a thousand things that have to happen in order. We are on number eight. You’re talking about number six hundred and ninety-two.— Jim Lovell, Apollo 13
The point here is that you should keep an idea of the full scope in mind when making decisions, but only worry about the immediate problems in front of you. There’s nothing you can do to control a decision one year down the road. However, you most certainly can make a change to how things are now.
Let’s consider a common software development lifecycle (SDLC) for example. Notice how this process is more than just “Think up idea. Implement idea.” We wish it was that simple, but it’s just not realistic to expect something as complicated as hardware and software to be created in two steps.
However, if you break down the creation process into deliverable tasks, each task could possibly be completed in two steps. Think about it this way: you want to create an application that allows you to create personal reminders.
That’s not a lot of information to work from as a developer. You can’t be expected to run with that and magically create a personal reminder application. You’d have too much room for wrong interpretation, not enough details to make critical decisions, and possibly end up with a completely wrong application.
Instead, you’d break down the tasks into incremental improvements like this:
- Create Git repository for source control
- Create new blank project and commit to source control
- Add menu to allow user to login
- Add menu to allow user to control settings
- Add menu to allow user to add reminder
- Add details to reminders such as who created, when created, when reminder triggers, and notes
Those are just some quick examples of task break downs which allows for incremental changes. Each task is independently deliverable with only a (sometimes) dependency on a previous task. With this approach, we can visualize the application in a more granular manner without having the mental baggage of everything stored in our head at the same time.
If you follow this type of project management, congratulations. You’re on your way to understanding the basics of Agile, Scrum, and Kanban frameworks. Those skills will certainly help you in the real world.
Set a Schedule
All the above advice is a lot to take in. When will you even have the time to read let alone apply those practices to your learning processes? You could easily burn out by trying to do everything at once with minimal progress. The fact of the matter is that you’re still human and have to abide by humanly limits. There’s a reason we’ve settled on the 40-hour work week.
You need a schedule. This will allow you to set aside a time-boxed window of learning in which you can go heads down into learning mode.
Heads Down: A schedule will dictate the times that you’ve agreed with yourself to dedicate to learning. You will be able to consistently transition into a learning mode and back into your personal time mode after the hours have been completed. This basically takes all the guesswork out of your day. You won’t have to ask yourself, “Hmm, how many hours am I going to study today?” Instead, you’ll know that study lasts for exactly X number of hours.
Recharge: Everyone needs a recharge. Your batteries drain just like the electronics on which you’re programming. A schedule will let you and others around you know exactly when you’re on and when you’re off. That off time is important because it’s the time you will use to regain your brain power for the next learning session.
Work-Life Balance: This is arguably the most important one. Let’s say you have a family with kids, and you want to make sure that you have enough time to study, work, and be with your family. Setting the schedule up will let you plan out when you’re working, when you’re studying, and when you’re helping your family. You’ll quickly realize where the lines need to be drawn so that you’re not accidentally bleeding responsibilities into each other.
Here’s a rough example for a 4-hour morning, M-W-F schedule that you will obviously need to cater to your own goals.
|8 AM||Pluralsight||Pluralsight||Personal project|
|9 AM||Pluralsight||Pluralsight||Personal project|
|10 AM||Personal project||Pluralsight||Coursera|
|11 AM||Personal project||Twitch||Coursera|