This is a translation of the success story from our global Java community. Alex learned Java on the Russian-language version of the course, which you study in English on CodeGym. May it become the inspiration for your further learning and maybe one day you’ll want to share your own story with us :)

Introduction

A little bit about how I got into programming. I am a teacher and psychologist by training, and for 5 years I have been practicing my profession successfully. But for various reasons, I am increasingly thinking about moving to another country. And because the language and regulations are different in other countries, I could not become the same sort of professional without serious retraining. So I started looking for simpler, interesting ways to move and be successful. How was it? Or my first project - 1I tried my hand as a tattoo artist (this requires essentially no knowledge of the language), but that's a story for another day. Then my coworker friend introduced me to CodeGym. I was initially skeptical of the promises to make me a full-fledged programmer by playing a game and at such a modest price. But then I got some birthday money (not subject to "family tax"), and faced the choice between WoW and CodeGym... Well, thanks to a timely discount, the scales tipped in the right direction, and here I am. As we should all already know, CodeGym is 90% pure practice. You learn to solve tasks. You learn to find the knowledge you lack on the Internet. All this is good, but for 15 levels I couldn't shake the feeling that I was missing something that would complete the picture for me. I thought about joining GeekBrains, but (probably fortunately) the same friend stopped me in time and introduced me to Udemy. When I opened this repository of knowledge, I went along with the appeals: "Psst, friend. Are you a newbie?" There's a discount for you... for only 3 days — Don't miss this opportunity!" Later it became clear that there are always discounts, but that's not the point. I immediately purchased a package with two courses: Java from 0 to Pro and something similar for Android. And this is where our story begins.

Success or failure?

As I worked through the Android course, I got homework to make a project based on my new knowledge. I'm the kind of person who believes that doing something in a simple or ordinary way is like not doing it at all. So, I immediately began to complicate my life. I turned to the person that I know who has the most developed and vivid imagination. This is my dear wife (yes, she will also read this article). She suggested making an app with pictures of animals, which make corresponding animal sounds when they are clicked on. It was a great idea, but still pretty simple. Taking this suggestion as the foundation, I began to reason:
  • This app must be more than fluff (something to laugh at and forget). I want it to have value. For example, by teaching something.
  • Let it be the alphabet with animals. But not just any alphabet, but the English alphabet!
  • And not just animals, but rare animals that few people know, in order to expand their horizons!
  • And there should be animation, audio reproduction of the names of the letters, and the names of animals in English and Russian!
Now that's what I call homework (I forgot to mention that before CodeGym I was basically unfamiliar with programming. And less than 3-4 months passed from the moment I started actively using the website until the moment I started the project. So, if you're a veteran in this area and you're thinking, "Pff... Did something change from the original version?", I assure you, yes, it changed)! The first difficulty I encountered was, oddly enough, starting the project. As it turns out, authors aren't the only ones who experience "writers' block"... But because I'm a psychologist, I knew the solution to my problem. You just need to start doing something. Take at least a small step, and then just don't stop. So I started with an abstract Letter class. This class had a couple of fields and subsequently would have to have various methods. In reality, I had no idea what I would do with it, but I had to do something. Then, I created classes for each letter, making them inherit the abstract class. It took a lot of time, and on this my first day of work came to an end. The next day I deleted the project and started again. I just opened the project to remember what has changed since the moment I described above. And I would like to say that everything looked better when I finished, but no. There really are still classes for each letter... This was specifically due to the fact that I was assigned this homework almost at the very beginning of the Android course, and on my own I had to figure out the intricacies of the relationship between an activity (the active window, or something like that) with a class. And I didn't find or think up anything other than this clumsy way of associating a specific class with a specific activity. Anyway, one of the principles of programming (avoid repetition) was violated 26 times. First, I completely (it seemed to me) implemented the first two letters, made a rough UI consisting of two menus (a general menu that might be necessary when expanding the functionality, and a table of contents, from which you could jump to any of the letters). I didn't really encounter much difficulty in programming. As I implementing my independent project, many things, such as the relationships between classes, methods, etc., became clear and the project itself became excellent practice for consolidating all the knowledge I had gained not only about Android, but also about Java. The second difficulty was that the letter switched at the same time that its name was heard. The smooth transition (shading) made it seem like the sound preceded the picture. But when I put a delay on the sound, the entire thread froze — the transition was simply postponed by the amount of the delay, producing the same undesirable effect, only later. Then I made the bold decision to make my program multithreaded! I moved sound playback to a separate thread, with a delay that was long enough for the picture to load. This was as far as the multithreading went, but I was proud to say that I was writing a multithreaded app. The final difficulty was selecting suitable materials. Did you think that English has no animal for the letter X (it turns out that it does)? I had to identify 26 animals and find their images and sounds, and record the names of 26 letters and 26 animals. If I had been working on a team, I obviously would have left this part of the work for someone else. Such monotonous moments kill the desire to work, and when there is no desire, there are excuses. Anyway, this stage took about 2 weeks (I did the project in my spare time and when I had no excuses). The project was declared complete approximately 3-4 weeks after it began.

Is it worth it to continue to study programming?

Disillusionment followed. First, I wasn't allowed to publish my homework on the course. I did the work and put in a ton of effort to show off, but I wasn't allowed to. Second, my app worked perfectly well in the emulator and on my phone. Of what I planned to do, I didn't implement animation, because I spit and decided I would finish it when I had gone through the relevant lessons in the course. But when I started thinking about distributing the application, I came across an interesting problem. After using another phone and a tablet to check whether my app was optimization for different screens and different versions of Android, I ran into an unknown error. The program simply shut down when switching to a letter. I tried to find the root of the problem, reviewed the logs, which, compared to concise Java exceptions, seemed even more like hocus-pocus. The Internet didn't help me. On the one hand, I made a working app that my children like to play. On the other hand, it only works on my phone. This makes me laugh. Of course, I was upset, but reflecting on it, I concluded that I had gained more than I had lost:
  • I got better at dealing with criticism of my work.
  • I realized the value of knowledge and experience in software design.
  • I boosted my programming self-esteem.
  • I realized the need to study design patterns and the basics of refactoring.
  • And as I said, now I have my own app, which no one else has and probably will never have. =)
"I know that I know nothing". By implementing educational projects like this, you have a great opportunity to analyze what you know where you have gaps in your knowledge, and identify ways to progress further. Is it worth it to continue to study programming if you understand that all of your efforts over a long stage of your life have moved you from 0 to +0.001? For me, the answer was yes. What about you?