Often people get stuck in a place called tutorial hell when teaching themselves how to code. This is a name for a spot where while you can read and understand code, you find writing your own from scratch impossible. Any time you try and sit down and make something without the aid of a tutorial you freeze.
In my opinion tutorial, hell is caused by a few things. First, is a tendency to want to do everything the "right way". You will have to get over this, in programming, there are often dozens of ways to do anything each with a ton of trade-offs. Especially when you are new, your goal should just be to make things that work, don't worry at all about whether its "correct" until you have made a good amount of projects. Next is a misconception about the industry itself. Before I had a job as a programmer, whenever I tried to picture the job I for some reason thought you would always be building apps from scratch. That isn't the case at all, and if you think about it critically you can see that is not true. Google and Facebook obviously have established products, if either of them hired you then you would not be building apps from scratch, but adding features and fixing bugs in existing products. Now expand this, what companies won't this be true for? Even tiny startups likely have a product by the time they would hire you, a new developer no? Ok, well let us think about agencies, maybe an agency is where you want to work. Surely they will have you building new greenfield projects right? As a junior? Unlikely, it would be more probable that some of your first work even at an agency would be adding features to clients who have come back, or need a bug fix, or a small part of an app they are about to ship. It is pretty rare to secure a job building an app from scratch as a junior, so for this reason, it seems pretty wild to expect to be able to do it easily after completing a few tutorials no?
One of the things that think fuels this delusion is the advice some people give to freelance for your first few gigs, finding your clients amoung friends, family, or churches, or non-profits you know. I think some people misconstrue this. I don't think they mean build a custom software for someone you know who has an idea. They mean see if your church needs its WordPress plugins updated for security. Or if their logo could be smaller in file size to increase load times. You could have huge impacts on local businesses just by learning stuff like that and offering services. Thats what people are suggesting, not that you build the next Snapchat for your uncle Steve. So even if you go the freelance route when you are ready (which is questionable advice by the way) you likely still wont be making entire apps.
OK, so if you shouldn't worry about building projects from scratch right away, how do you build all the skills one needs for a job? Like problem-solving, estimating tasks, you know all the things I have been preaching thus far. I have a solution for this.
Try adding a feature to a tutorial or course that you have completed. For example, let's say you made a simple todo-list app for a tutorial once. It lets you make tasks, and mark them as complete. Add a feature that also lets you mark a task as important. If you can mark a task as complete, and change it to look crossed off or whatever, then you have the ability to mark it as important and give it a red border, or whatever you want.
You would be surprised how much you can learn from adding simple additional features like this. It will make you start to problem solve on your own. For instance, should an important task that is done have any difference in appearance from a normal finished task? Should important tasks be moved to the top? If so how would that be done? Pretty quickly you will be putting together your own tutorials using blog post fragments and stack overflow answers. This is normal and good! It is a sign that you are on your way out of tutorial hell. Eventually, if you keep this up your projects will start to look very little like the tutorials they came from. This will boost your confidence, and make them more compelling portfolio pieces.
At a certain point, you will start adding features more rapidly. You will find yourself googling a little less, (but still googling) and dreaming up more ambitious features than slight variants of what you have done before. Suddenly you will be embarking down roads you don't fully understand, you will hack things together, it will be ugly and hardly work, but you will learn a ton. Then the next week you will make it less ugly, then you will make it more reliable. Then you will start to wonder "Can I build something from scratch now?". It's at this point you should probably try an extremely small project from "scratch". And by small I mean SUPER small, like a blog with a static site generator like Next, Gatsby, or Jekyll. Building a blog from scratch is a huge accomplishment, and if you are able to do that, you are in a pretty good spot. Now you technically have a product of your own and you can iterate on it just like the tutorial projects. Try adding a "200 Words" section to your blog with posts that delete on a schedule, or some tangential blog feature like that. Who knows what this could turn into eventually. You could grow this simple blog into something like CSS-Tricks 👇
Beyond using media queries and modern CSS layouts, like flexbox and grid, to create responsive websites, there are certain overlooked things we can do well to make responsive sites. In this article, we'll dig into a number tools (revolving around HTML and CSS) we have at the ready, from responsive images to relatively new CSS functions that work naturally whether we use media queries or not.
I wish I could tell you how long this process will take, but it will be different for everyone. The key to this is the small incremental growth you experience adding these new features. So the way to get out the fastest is to add as many of these new features you can. Again, at this point your goal is just to make the thing, not make the thing the right way. This is an important distinction, this is the freest you will be to make gross code that hardly works, so embrace that and make lots of mistakes. This might seem counter intuitive, you might think "no surely the faster I learn 'the right way' the faster I will get a job right?".
But that ok to be so incredibly wrong, we are making mistakes remember? There are many reasons this is wrong, but perhaps the most important three I can think of are that it will slow you down so considerably that you will lose out on countless learning experiences in a really short amount of time. Second, because you are so focused on doing things "right" you won't be focused on getting things "done" which matters way, way, way more. Especially when it comes to showing people what you can make, since... You know, it should be finished when you show them. Third, you usually only learn and understand the right way after doing it the wrong way a few times. Often you simply have to feel the pain firsthand to understand some of the weirder hoops you will need to jump through for programming
If you are saying "I don't have any projects that I can add anything to" then there is a problem, either you are not thinking about your projects hard enough, or you have not finished enough project based tutorials or courses yet. Go back and find some more free, or paid, project based curriculum that will give you a strong base to expand on. Or if you are having the first problem, do you have a project you did with mock data at some point, that you could now attach to a real API? You should have something you can approve on any given project if you think hard enough.
At a certain point, after you have made enough small projects, and then iterated on them enough you will be able mostly understand all the pieces that would be involved with a very ambitious project. Or at least understand most of the pieces, and have some idea of how to solve for the parts you don't understand. If you reach this level of clarity going into projects you have long been employable and I hope you have been, I waited much longer than I should have. Something that became painfully obvious at my first few programming gigs, which is why I encourage you so much to not worry about your ability to make whatever pops in your head in a whim. That is still very hard even for the most skilled programmers, which is why its a high paying profession after all. Start applying for jobs long before you hit that point. If you can add features to a tutorial project to the point where its not clear its even from that tutorial anymore, then you have useful skills people would like to pay you money for, and that is a fact you can take to the bank.