Personal software projects (part 1)
An in-depth guide to creating your own software project from scratch
I’m excited to introduce the first part of a new guide to creating your own software project from scratch, released in a multi-part series. Eventually, I’ll combine the series into a single resource and make it available from my coaching site as a downloadable resource.
In working with many software engineers as my coaching clients, I’ve found it to be quite common that few have ever designed nor created an entire software system themselves. Since observing this as a real trend, I’ve made focusing on this an important part of the work I do with most clients. We go hands-on together where I encourage and guide them in the creation of an open source software project that they’re excited to work on. Doing so provides them with this opportunity to experience being fully responsible for every aspect of a software project, which is exactly the kind of experience that is priceless for a real paradigm shift in learning.
What I’ve found is remarkable - the amount and pace of technical learning and experience that we realize together for each engineer increases and deepens rapidly. Yet, this finding shouldn’t be a surprise as software development is largely a craft, and crafts demand frequent hands-on experience. There’s no substitute for getting direct experience building software, and many times, software engineers working for various companies don’t get the spectrum of experience to be a really well-developed software engineer. Without this, an engineer is equivalent to an artist who’s asked to paint a portrait for hire but they’ve never actually painted an entire one before.
There’s really no substitute for creating your own software project, especially if you’ve never built an entire software system before.
If you’re not yet convinced, maybe you will be after reading through this first part of the series where I’ll provide deeper background and motivation of the importance of creating a personal software project and, equally as important, I’ll guide you in discovering a project focus that you are excited and motivated to build.
Subscribe to the Relational Technologist newsletter so you don’t miss any future software engineering career insights, technical software guides and training/workshop opportunities.
Background & motivation
As I mentioned in the intro above, while working with many different software engineering clients, there is one particular theme that continues to stand out among others - if you want to vastly improve your software engineering craft, it’s critical that you practice developing software outside of your day job. Why?
You certainly can and will improve your development skills at your day job, however, for most engineers, historically, this has been a haphazard process. The earlier you are in your career, typically, the less control you have over the types of things you’ll get to focus your development experience on. Yes, you definitely should try and choose a company, role and team that are as good of a fit for what you’re aware that you’re interested in, but you’ll also be asked to do a lot of menial and random tasks.
And this means the language, frameworks, development techniques, test-writing style, schedule, even your teammates, will mostly be left to whatever you’re assigned by the engineering team you’re a part of. You may have chosen where you work based on the potential to utilize some of these things, but this is commonly the extent of what you get to choose.
And what if you want to go in a completely new direction? Finding a good team and project that provides an opportunity to explore your new direction is very unlikely to randomly appear. So, the most effective way to make this happen is to practice your software engineering craft on your own time, creating your own software application, in the direction of your choosing.
Most people can appreciate that a painter has to paint in order to get better, or an athlete has to strength train, practice and play actual scrimmages to grow. It’s no different with a software developer. To get better, you have to develop as much and as often as you can. And you should practice a lot on your own time, but you don’t have to do this without guidance. Finding a friend or colleague to do this with can accelerate your growth and increase the likelihood of sticking with the practice. And working with a coach like myself or another mentor in your life can further increase this.
This is meant to be an in-depth guide that prepares you for developing your own software application. However, that doesn’t mean that you must read through every part in order. Take time to reflect honestly and help yourself become clear on the areas that you need to grow in now versus later. If you try and do too much at once, you’ll overwhelm yourself, lose interest and subconsciously tell yourself that self-practice is too hard.
If the thought of creating your own application is unappealing or not what you need to focus on, there are good alternatives. If you already have some software development experience, consider if it’d be more effective (and equally important, enjoyable!) for you to join an existing open source project.
For some background on how to go about finding and participating in an open source project, consider what I wrote on this subject for my newsletter. And if you’re interested in learning and working with Rust in the embedded and cloud space, consider joining the Rust Never Sleeps community that I founded.
However, if you decide to create your own new software project from scratch, I highly recommend making it open source. There’s a strong argument to be made for most software being open. One of the most compelling reasons to open your project is it becomes something that you can use to track your own progress in becoming a more experienced software engineer. If you keep developing new projects, you’ll see that you’re getting better at it. Another compelling reason is you are creating an open portfolio that you can direct future potential employers to during a software engineer interview process.
Finding a problem to solve
In order to create a new piece of software, you must first think of a problem and focus area that you want it to ultimately solve. The problem doesn’t have to be something innovative and new. In fact, recreating a piece of software for an existing problem that someone else has already solved is an effective way to choose your problem to focus on. It provides you with a tangible model allowing you to focus mostly on designing and creating software instead of having to also act like a product manager fleshing out feature definitions. Try not to get fixated on finding the most creative or the mind-blowing problem to solve. Your task is to find a problem that you feel confident that you can solve, and also feel pretty sure that you’re excited to invest significant time creating it every week.
Getting clear on what problem you want to solve
The following are four questions that should help you get a little more clear on what kind of problem you want to focus on and understand why it’s interesting to you:
Is there a particular problem somewhere in your life or around your home that is exciting when you think about solving it? Or think outside of your home, is there a friend or family member with a problem that you’d be excited to understand and solve? Is there something related to your day job that you want to try solving a different way?
Is there a problem type or domain that you want to explore that excites you (e.g. automation, climate awareness, robotics, data analysis, etc.)?
Is the nature of the software needed to solve the problem web-based, device-based or some combination of both?
Realistically, how quickly will your choice of problem allow you to practice your most needed areas of growth? Are you aware of where you need and want to grow your software development experience?
My example problem
Throughout this series, I’ll use a problem and a software solution that I personally developed by creating an IoT application and full stack web application. It should help by giving you a tangible software example that began as an identifiable problem and evolved into being a useful system that I use on a daily basis in my home.
During the winter months in Chicago, it gets very dry inside my home causing many kinds of annoying health-related issues. For example, my eyes frequently feel dry and tired and my voice suffers in my work meetings struggling to be clear and strong.
I was certainly aware that there were existing commercial solutions that would help me monitor the relative air humidity and solutions to increase the air moisture. But I recognized this as a problem that I would thoroughly enjoy solving myself as a software (and hardware) project because:
The problem is a real and immediate one to solve for both my partner and myself
It would involve both IoT and web application development, both things I’m interested and excited about
It gave me an opportunity to learn Elixir and gain experience with the Phoenix web framework, which was something I needed some experience with to more effectively carry out my day job as an engineering manager
I decided that I’d write an IoT device application and full stack web application, which I now refer to as Ambi.
Conclusion & next
What problem do you have that you’d be excited to solve? What kind of questions do you have after thinking about starting your own software project? Please take this seriously for yourself, I can’t stress how important it is to gain the experience that comes from designing and developing an entire software application yourself.
If you’re struggling to come up with project ideas for yourself, then reach out to someone for help in brainstorming. I’d also love to help you come up with a problem to solve and to be clear on your excitement about it. Please do reach out.
In part two of this series, I’ll continue by discussing another important aspect to consider when creating your own software project - understanding the areas that you need to focus your practice in so that you can prioritize your growth well. This will help you hone your personal software project objectives, language choice(s) and the frameworks and libraries you intentionally choose to incorporate into your project.
Until then, thanks for reading!
Software Engineer Coaching
Interested in working on your software project with my guidance along the way? Please feel free to book a 30 minute 1:1 with me completely free of charge. I’d be excited and honored to meet you and hear about how you want to grow in your career and if I might be of service to you.