<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alex Yelenevych</title>
    <description>The latest articles on DEV Community by Alex Yelenevych (@alexyelenevych).</description>
    <link>https://dev.to/alexyelenevych</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F638726%2F5964c374-35d1-46ac-ae97-0d03345089b9.jpeg</url>
      <title>DEV Community: Alex Yelenevych</title>
      <link>https://dev.to/alexyelenevych</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexyelenevych"/>
    <language>en</language>
    <item>
      <title>Expert Guide on Trends in Software Development for Beginners</title>
      <dc:creator>Alex Yelenevych</dc:creator>
      <pubDate>Thu, 02 Dec 2021 17:03:57 +0000</pubDate>
      <link>https://dev.to/alexyelenevych/expert-guide-on-trends-in-software-development-for-beginners-4nbl</link>
      <guid>https://dev.to/alexyelenevych/expert-guide-on-trends-in-software-development-for-beginners-4nbl</guid>
      <description>&lt;p&gt;One problem that should be familiar to the majority of programming beginners who are looking to find their own path in the tech industry is the abundance of trends. The field’s boiling development constantly gives birth to dozens of new niches, technologies, and business models, which can be truly overwhelming.&lt;/p&gt;

&lt;p&gt;And this problem isn’t simply rhetorical in nature, as feeling overwhelmed with options and possibilities makes choosing what to focus on when learning software development and which technology stack to pick as their main career specialization incredibly difficult.&lt;/p&gt;

&lt;h2&gt;
  
  
  Too many tech trends
&lt;/h2&gt;

&lt;p&gt;Popular tech websites and developer communities aren’t always much of a help. Specialists love to debate about popular trends, advocating for those technologies and solutions they use or believe are superior. With all this informational noise out there, digesting it all to form your own opinion would take considerable time and effort.&lt;/p&gt;

&lt;p&gt;So, we conducted a survey of well-known software development experts and industry influencers, asking them to share their opinions on the most popular software development trends and give some tips to programming beginners who are starting their careers in tech.&lt;/p&gt;

&lt;p&gt;After all, as we said, developers like to talk and argue about trends. And everyone loves to give others advice. So, we managed to gather a lot of interesting insights and valuable tips.&lt;/p&gt;

&lt;p&gt;Based on the results of insights we’ve got from the tech expert survey, as well as some input from our friendly and helpful user community, we put together a guide on current trends in the software development industry and areas of knowledge beginners in the field should prioritize.&lt;/p&gt;

&lt;p&gt;Thanks to everyone who helped with answers and participation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech industry trends
&lt;/h2&gt;

&lt;p&gt;The experts we interviewed specified the number of general tech industry trends they consider to be the most significant and full of long-term potential.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. AI and Machine Learning
&lt;/h3&gt;

&lt;p&gt;Unsurprisingly, AI is number one on this list. Artificial intelligence is probably the most well-known tech trend of today. Even people who are far from the tech industry should’ve noticed how AI has turned from something specialized into an everyday technology that augments our devices, services, and websites.&lt;/p&gt;

&lt;p&gt;AI keeps getting better and better at understanding what users want, as well as influencing their choices with more relevant ads and commercial offers. And it will keep trending in 2021 and beyond. All the technologies that are parts of the AI field, such as machine learning, deep learning, image recognition, speech recognition, and others will continue to evolve, becoming even more common and omnipresent in our daily lives.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://twitter.com/omniprof"&gt;Ken Fogel&lt;/a&gt;, Java expert, and Computer Science Technology Professor at Dawson College in Canada agrees that AI/ML is the top tech trend today: “If I needed to define one trend, I’d have to say AI/ML. I do not know if this will result in better software. What I do see is that in the general population of software users, I call them human beings, AI/ML is the buzz phrase that many believe will solve all our problems. Of course, it will not, but customers are clamoring, from what I read, for solutions that employ this technology.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Big Data
&lt;/h3&gt;

&lt;p&gt;Big data is another major technology trend that isn’t going away anytime soon. In fact, the opposite is true. The market shows an overwhelming demand for big data, and it keeps growing. By 2025, businesses are projected to create about 60 percent of all global data. Companies across various industries generate almost continuous streams of information and require technology solutions that can efficiently collect, store and use large amounts of data.&lt;/p&gt;

&lt;p&gt;The demand for big-data professionals will keep growing in the coming years, creating countless opportunities. According to the U.S. Bureau of Labor Statistics, this field &lt;a href="https://www.bls.gov/opub/btn/volume-7/big-data-adds-up.htm"&gt;will grow&lt;/a&gt; about 27.9 percent through 2026. Some researchers predict that the most successful and well-paying jobs in the coming decade will be data-related.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You might have heard that ’data is the new oil.’ That’s true. In particular, I would pay attention to data engineering, because for two reasons. One, it is booming. Two, there is a massive shortage of skilled data engineers. Except for data-related jobs, another huge trend is developing in the cloud, which is an increasingly popular option for many companies,” said &lt;a href="https://www.youtube.com/channel/UCAxnMry1lETl47xQWABvH7g"&gt;Karolina Sowinska&lt;/a&gt;, an experienced software developer, and tech industry influencer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. SaaS and PaaS
&lt;/h3&gt;

&lt;p&gt;Many development experts consider SaaS and PaaS models, as well as microservices, to be extremely promising. Even better, these models are also open to developers specializing in different programming languages. As interaction takes place according to REST, which is a de facto standard, the specific language you use isn’t very important, whether Java or Python.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Cloud computing
&lt;/h3&gt;

&lt;p&gt;Even though cloud computing was a hot, new trend around a decade ago, it still deserves a spot on this list. It’s become a common and important part of software functioning processes.&lt;/p&gt;

&lt;p&gt;Today, people use cloud services all the time without even realizing it, from booking hotels online to ordering food delivery to check for new posts on social networks. Businesses all around the globe are increasingly adopting cloud computing as it allows them to reduce costs and make their products more accessible to consumers. So, cloud computing is another major niche that will see rising demand for highly qualified experts in the coming years.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Mobile development
&lt;/h3&gt;

&lt;p&gt;Mobile development is a market that will, without a doubt, keep growing at an accelerating pace for several reasons. The upcoming deployment of Starlink, a global satellite system that should bring high-speed broadband internet access to areas where it used to be poorly accessible, is one. If the system is deployed as planned, more people will be able to access the Internet on their phones worldwide, which will accelerate the mobile development market. According to a report by IDC, Android-based smartphones had almost 85 percent of the global market in 2020. Since Java and Kotlin are the two main languages in Android development, the demand for developers coding in these languages will remain consistently high and may even rise in the coming years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software development and Java trends
&lt;/h2&gt;

&lt;p&gt;Software development itself has no shortage of interesting trends and innovative technologies our experts suggest keeping an eye on as well.&lt;/p&gt;

&lt;p&gt;Here are five major trends that we perceive to be the most important ones. This is true for software development in general, but we focused particularly on the Java ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Functional programming
&lt;/h3&gt;

&lt;p&gt;Many of the software development experts we surveyed pointed to functional programming as one of the major trends with potentially big futures ahead. Even though the concept of functional programming has been around for a while, its popularity has started to flourish again. Functional programming is also a great fit for many other accelerating fields such as global web services and parallel computing, allowing developers to deal with many current problems in software development a lot more effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Microservices
&lt;/h3&gt;

&lt;p&gt;With flexibility as one of the most important requirements today, microservices will also be a booming trend. These allow engineering teams to reduce development costs, testing complexity, and development time. Using microservices, however, increases the infrastructural complexity of systems. And the consequence of that is the growing demand for DevOps professionals, which is also a field of specialization that is worth attention for beginners.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. GraalVM Native Image
&lt;/h3&gt;

&lt;p&gt;The rise of GraalVM Native Image, which allows you to compile Java code to a standalone executable application and does not require a JVM and accompanying libraries for its work, is another interesting trend. And it serves as a great addition to the microservice architecture and serverless approach, allowing developers to create self-contained executable images that can run incredibly fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Spring framework
&lt;/h3&gt;

&lt;p&gt;Even though Spring is the most popular Java framework in the world, its ever-evolving ecosystem means that it’s still a trending topic. Project Reactor and r2dbc, which were originally subprojects of Spring, are examples of how the Spring ecosystem gives birth to new technologies and approaches.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’d recommend paying attention to frameworks and technologies that are on the rise within that field. Try them out yourself, understand why people are switching to them, and if it makes sense for you, learn them yourself,” said &lt;a href="https://www.codingblonde.com/"&gt;Masha Zvereva&lt;/a&gt;, an entrepreneur and the founder of the Coding Blonde blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  5. Java and its new features
&lt;/h3&gt;

&lt;p&gt;Of course, Java itself, with all its ever-developing ecosystem, remains relevant, despite the language being almost 26 years old now. Thanks largely to the six-month new release cycle, Java is walking in step with the times and acquiring new features that make this language even more applicable for various tasks and projects across industries and suggest a bright future for Java and Java-based technologies for years to come.&lt;/p&gt;

&lt;p&gt;Many powerful features were introduced to Java in versions 14 and 15, including sealed classes, records, text blocks, and hidden classes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/ErikHellman"&gt;Erik Hellman&lt;/a&gt;, mobile programming expert and the author of &lt;em&gt;Android Programming: Pushing the Limits&lt;/em&gt;, who was one of the experts participating in our survey, recommends that you should also take a look at asynchronous programming.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Asynchronous programming, in general, is something everyone struggles with. Regardless of programming language, this is a concept that is crucial to understand. Other trends are functional programming, declarative UI, and basic Machine Learning. Tools every developer needs to grasp are Docker, Git, and all the keyboard shortcuts in the code editor you’re using,” he said.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Everlasting trend: never stop learning and start with basics
&lt;/h2&gt;

&lt;p&gt;But we should also bring to your attention that the majority of experts that we have interviewed underlined that learning fundamentals of programming and computer science, in general, is much more crucial than trying to follow the right trend, if you’re willing to have a successful career in software development.&lt;/p&gt;

&lt;p&gt;Here are a few notable quotes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Learn to manage innovation and changing requirements..”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is advice from &lt;a href="https://www.linkedin.com/in/markuseisele/"&gt;Markus Eisele&lt;/a&gt;, Java Champion and founder of JavaLand. “Our industry is constantly reinventing itself. We went from mainframes to pizza-style Intel servers to the cloud. We had bash scripts, continuous integration, and now GitHub actions. Investing time to understand the core concepts behind the technology we are using is crucial to stay relevant. Always aching to use the latest and greatest technology is not. Think about the functional and non-functional requirements that exist and map them to the technologies you think could be a good fit. Our toolbox grew massively over the last decade and it will continue to do so. Learn to manage innovation and changing requirements as part of your technology portfolio,” recommends Markus.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“In the long run, those programmers who truly understand the basics will be in higher demand..”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://twitter.com/lukaseder"&gt;Lukas Eder&lt;/a&gt;, famous Java and SQL expert, has the same stance: “While following the latest and greatest seems tempting, I think in the long run, those programmers who truly understand the basics will be in higher demand than the ones that followed marketing. This includes learning data structures and algorithms (no need to be an expert, but understand them). Learn the relational model, normalization, SQL. Learn about programming paradigms including imperative, object-oriented, functional programming. Learn a few different programming languages to appreciate the differences and ecosystems,” recommends Lukas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Fear of missing out is there even when you are a senior..”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;“In times when there are more JavaScript frameworks than days in a year, it might be daunting to start learning and to know what exactly you should focus on. The FOMO (fear of missing out) is there even when you are a senior. There is no way to know everything in our industry. Focus on the fundamentals first and make sure you have a solid base. These are skills like problem-solving, algorithms and data structures, etc. When you have solid fundamentals, it is going to be pretty easy to pick any new trend that there might be,” added his five cents &lt;a href="https://www.youtube.com/channel/UCYSa_YLoJokZAwHhlwJntIA"&gt;Vadim Savin&lt;/a&gt;, an experienced full-stack developer and programming blogger.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Pick something you enjoy. Then explore all of it..”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And don’t forget to enjoy, reminds us &lt;a href="https://www.youtube.com/channel/UCG7EBd-JrRZehNv9e5m1fQQ"&gt;Filip Grebowski&lt;/a&gt;, an experienced software engineer and the author of a popular programming tutorials channel on YouTube: “Once you learn the fundamentals, it’s important to pick something you enjoy, whether it is frontend, backend, or more specifically a tech stack that you enjoy. Then explore all of it. Dive into the latest advancements and stay on top of the game. That’s how you will become the best in what you do.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Learning the fundamentals is the everlasting trend in programming and the key to achieving long-term success in this field. Even following the industry and where it’s going certainly is advisable as well, and can help you better position yourself as a specialist on the software development job market.&lt;/p&gt;

&lt;p&gt;If we had to extract one key piece of advice that virtually all our experts have for programming beginners, it would be quite predictable, we’re afraid. It’s to never stop learning all the way throughout your career, as accumulating knowledge is the natural state of a good developer. We at CodeGym couldn’t agree with this more and hope that this information will help you to make the right choices and avoid some traps along this road.&lt;/p&gt;

&lt;p&gt;First published at &lt;a href="https://medium.com/codex/expert-guide-on-trends-in-software-development-for-beginners-7e1e68192ee9"&gt;CodeX&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Common behavioral mistakes of novice programmers and how to avoid them</title>
      <dc:creator>Alex Yelenevych</dc:creator>
      <pubDate>Wed, 24 Nov 2021 12:56:55 +0000</pubDate>
      <link>https://dev.to/alexyelenevych/common-behavioral-mistakes-of-novice-programmers-and-how-to-avoid-them-3j4k</link>
      <guid>https://dev.to/alexyelenevych/common-behavioral-mistakes-of-novice-programmers-and-how-to-avoid-them-3j4k</guid>
      <description>&lt;p&gt;The mistakes of novice programmers, those who are just learning or just starting to work, are very similar to each other. Many of them can be called not mistakes, but behavioral features, stages all beginners go through. We as Java course creators are interested in this topic, so we interviewed opinion leaders and collected the most common, in their view, examples of such behavioral errors in order to … shorten their duration for future software developers. If you start noticing such behavioral mistakes early and try to fix them, your path to mastery will be shorter and your work will be more efficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using wrong tools
&lt;/h2&gt;

&lt;p&gt;The most common mistake everyone can observe among people starting programming is using the wrong tools, or not using the tools correctly. Sometimes they choose tools but ignore the task they need to solve with it. They heard something in advertising, or read reviews. Complete beginners are sometimes afraid to expand their toolbox. They can stubbornly ignore Git, the basics of which can be learned very quickly, use the first code editor they come across, an outdated IDE, the wrong framework, and so on.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“One example I’ve seen a few times is when beginners are not aware of VCS tools like Git, but instead use something like DropBox to store their code.”, &lt;em&gt;&lt;a href="https://twitter.com/ErikHellman"&gt;Erik Hellman&lt;/a&gt;, Freelance Software Developer&lt;/em&gt;, said, “I have also seen beginners use MS Word for writing code, which can be quite funny to watch.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Ignoring debugging
&lt;/h2&gt;

&lt;p&gt;This mistake, of course, is a part of the previous point. A debugger is a tool too after all. Nevertheless, given the importance of this point and the fact that the debugging process is an important and valuable skill for any programmer, we took it out separately.&lt;/p&gt;

&lt;p&gt;So … You work with statically typed languages like Java, C++, etc. Hence, there isn’t much to say here other than debugging your code! Try it right after writing your first programs. This is an extremely healthy habit and a must in your work. Moreover, at the time of starting your very first work, it is desirable that this skill is already confident. All modern IDEs (and, having solved the mistake of the previous paragraph, you will use modern IDE, right?) have excellent built-in debuggers with all the necessary functions. You can debug an entire program, its module, a single function, and so on. Read docs, watch youtube tutorials or ask your experienced friend to help. In any case, explore the debugger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copying without checking
&lt;/h2&gt;

&lt;p&gt;Googling and copy-pasting someone else’s code isn’t really a crime. Quite the opposite: this process significantly speeds up the work and helps the developer in his constant learning. However, here is an important point: copy-paste should be thoughtful. Learn from it, try to get how this code works, modify it according to your task.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Once beginners get past the challenge with all the tools, it tends to be a problem of not knowing how to find information. Copying code from the first StackOverflow answer they found or using outdated libraries is very common among new developers”, &lt;em&gt;the software developer Eric Helman said&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Ignoring unit testing
&lt;/h2&gt;

&lt;p&gt;Very often, newbies are not actually writing tests for their code and don’t test their code. Some novice developers check their code, but they do it in a very specific way. For example, they manually change the data in the program and output the result to the console. In fact, you need to start unlearning this method right after you have mastered the basic syntax.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Thoroughly oftentimes people do manual tests but not of the cases. Getting comfortable with unit testing, getting comfortable with understanding all the edge cases of your code, and working through them. That’s one of the more likely snares of people are going to mess up on and then if you’re really getting your career started consistently”, &lt;em&gt;&lt;a href="https://www.youtube.com/c/CodingTutorials360/videos"&gt;Dylan Israel&lt;/a&gt;, software developer, and YouTube Content creator&lt;/em&gt; commented.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Falling in the tutorials hell trap
&lt;/h2&gt;

&lt;p&gt;Newbies often get lost and don’t know exactly where to learn new information and how to learn it. Instead, they watch video after video, looking for more and more new stories. Here’s what &lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=O7XLG090QTA&amp;amp;t=1s"&gt;Vadim Savin&lt;/a&gt;, Software engineer, and Youtube content creator&lt;/em&gt;, says.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The most common mistake I see newbie programmers do is falling in the tutorials hell trap. How many udemy courses have you bought, and how many of them have you finished? The problem is not with tutorials, because you can learn a lot from them, the problem is the lack of practical experience. If you want to be the best at basketball, you wouldn’t watch tutorials all day and read books for a year, you would get on the court and start practicing. That’s the same with learning programming. Start building projects. When following a tutorial, don’t just watch, but do the same thing as the tutor is doing. Then, try again, but this time from memory. After you get the basics, start implementing the new knowledge in real projects. Start building that website/app/game that you have always wanted to build. This way, you will be motivated to practice because you will work on something you are excited about, and you want to feel the burden of learning”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Fear and overreaction on code review
&lt;/h2&gt;

&lt;p&gt;One of the obvious mistakes novice programmers make is a sharp reaction to code review. Very often, newcomers perceive the remarks of colleagues as harsh criticism, get upset, offer resistance, trying to prove that they were wrong. In fact, code review is a procedure for improving code, and not only for a newbie. For a beginner programmer, this is a great opportunity to learn on the job. Think of the process this way. Nobody wants to offend or humiliate you (well, most likely nobody, some people are strange when you are a stranger). Everyone is trying to ensure that your overall project is of the highest quality possible. Of course, the reviewer is not a saint and can also be wrong. It is important that you argue these points without emotion, try to look at your code with detachment and calmness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Too much or not enough efforts
&lt;/h2&gt;

&lt;p&gt;This problem is like a double-edged sword. On the one hand, many developers put in too little effort and abandon a difficult task that they can do, because they are not sure they can solve it. On the other hand, there are those who, on the contrary, can torment themselves for a very long time over a task that should have long been abandoned. As a result, the former does not develop fast enough, and the latter loses motivation. Here’s what our experts have to say about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.youtube.com/c/KarolinaSowinska/about"&gt;Karolina Sowinska&lt;/a&gt;, a data pro and a YouTube content creator&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I think the largest mistake that new programmers make is not trusting yourself enough to stick with a problem to solve it. That’s certainly the mistake I was making at the beginning. I thought that I don’t have enough knowledge or experience to be able to solve a difficult issue. In reality, facing unknown problems is exactly what experienced software engineers do on an everyday basis. You will not feel comfortable 70% of the time. So it’s paramount to shift your mindset from “I can’t solve it yet” to “I will solve it no matter what” regardless of how much experience in coding you have”.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.youtube.com/c/CodingBlonde/videos"&gt;Masha Zvereva&lt;/a&gt;, founder at Coding Blonde YouTube channel&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“One of the biggest issues I see newbie programmers struggle with is a combination of impatience, comparing themselves to others, and self-doubt. Learning how to program is hard and requires a different type of logic than what we’re used to in our day-to-day life, so it takes time to properly understand certain concepts. And different people will learn different aspects of programming quicker than others, but that doesn’t mean anything about their intelligence or future opportunities. Everyone is on their own timeline and has their unique learning style. Be patient with yourself and use additional materials if the ones in front of you don’t make sense to you”&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.youtube.com/channel/UCl5-BV9aRaeDVohpE4sqJiQ"&gt;Saldina Nurak&lt;/a&gt; software engineer and YouTube channel autor&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The main mistake that new programmers make is either self-doubt and thinking that they are not smart enough, or the complete opposite of that, thinking that they know everything, when in fact they don’t.&lt;br&gt;
Looking back to my university days I can say that I was in the first category. I could understand the code during the lectures when professors explained it, but I had problems solving those same tasks alone, so I was wondering if I just wasn’t smart enough.&lt;br&gt;
Now I know that it is because I didn’t spend enough time practicing. It’s the same when you are learning a new language, most people are able to understand it before they can speak it.&lt;br&gt;
Some of the tips that helped me to overcome that issue and become better at programming are naming variables and functions according to their purpose, using diagrams and pseudo code when I couldn’t understand the code itself, writing comments for later reference, being consistent, and trying to learn a little bit every day, building a solid foundation and filling all the little gaps that I had in my knowledge.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Overengineering
&lt;/h2&gt;

&lt;p&gt;Ask a newbie programmer, what in their opinion the ideal code should be. The common answer would be “optimal, of course!” This usually means “optimal” in terms of performance and resource consumption. It’s a logical answer, isn’t it? Yep, this is so in an ideal world, but, alas, we don’t live in one.&lt;/p&gt;

&lt;p&gt;Therefore, this answer is fundamentally wrong, especially when it comes to large projects that will be used and supported for many years. Experienced developers will choose the latter between optimality and readability. They know that, while optimally, Junior’s over-engineered code is so difficult to read and maintain that it will likely need to be rewritten completely soon. And if you see in front of you an even formatted code without frills, you can say it is boring, most likely it was created by an experienced programmer.&lt;/p&gt;

&lt;p&gt;By the way, such code will most likely contain comments. And they will be exactly where they are needed. Moving on to the next error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where are your comments, dude?
&lt;/h2&gt;

&lt;p&gt;Comments … Newbies and comments are just an ancient tragedy. Comments could be literally everywhere and explain the obvious things, or vice versa, code without comments at all. Don’t be like this, please. Explain what isn’t readable in an easy way or is referencing other modules.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“One of the common mistakes is the “We don’t need no stinkin’ comments” with apologies to The Treasure of the Sierra Madre where the original version of this line came from. Just last week while discussing this issue it was suggested that comments are worthless because when code is updated or refactored the comments are rarely updated so we might as well do away with them.” — &lt;em&gt;&lt;a href="https://www.linkedin.com/in/kenfogel/"&gt;Ken Fogel&lt;/a&gt;, Java Champion, CS teacher at Dawson College&lt;/em&gt; shares, “I once had to remove comments from submission to an open-source project. Comments represent the technical manual complex systems required. Imagine having to repair a modern automobile without the shop manual.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sure, competent commenting is a special science. However, if you master it, your colleagues will be very grateful to you. Remember the times when you had to understand someone else’s code. I think someone’s literate comments helped you, right? If you find it difficult to understand how to correctly place comments, look at the libraries of your programming language that you use, read, comments on their code … Learn from the best.&lt;/p&gt;

&lt;h2&gt;
  
  
  Messy code formatting and frustrating names
&lt;/h2&gt;

&lt;p&gt;Sometimes novice developers don’t understand the importance of standardizing their coding. They have not yet realized how difficult it is to navigate someone else’s code, and don’t understand that they write code not only and not so much for themselves.&lt;/p&gt;

&lt;p&gt;Each language has a set of rules that describe the correct formatting of the code. Some IDEs already know how to format the code in a standard way on a wave of hotkeys. Take the time to find out how to do it in your case. However, there are many things you still need to keep track of yourself.&lt;/p&gt;

&lt;p&gt;Even more dramatic is the naming of variables and functions. If in the learning task &lt;strong&gt;int p;&lt;/strong&gt; looked quite adequate, in a module of a large project it’s not! &lt;strong&gt;persentOfYearIncome&lt;/strong&gt; looks terrible, but it is much clearer what we are talking about. By the way, don’t try to use short names and write transcripts in the comments. Better not be lazy and pick up your variables. functions, classes have friendly names. Even if they are not the most elegant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“I would actually consider mistakes to be very healthy. It’s what teaches you the most as you try to solve a problem that you did not plan for. I think if I was to name an action that a programmer might do and call it a “mistake” it would be when we come across an issue in the code and we simply give up,” &lt;em&gt;software developer and YouTube author &lt;a href="https://www.youtube.com/channel/UCG7EBd-JrRZehNv9e5m1fQQ"&gt;Filip Grebowski&lt;/a&gt;&lt;/em&gt; said.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And I definitely agree with him. Mistakes are something that we cannot avoid as programmers. Everyone makes them, even the most proficient experts. Try not to repeat the same mistakes all the time and you become a better programmer faster.&lt;/p&gt;

&lt;p&gt;First published at &lt;a href="https://medium.com/geekculture/common-behavioral-mistakes-of-novice-programmers-and-how-to-avoid-them-286624cb4866"&gt;Geek Culture&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>How We Entered the Chinese Red Ocean EdTech Market And Survived</title>
      <dc:creator>Alex Yelenevych</dc:creator>
      <pubDate>Fri, 19 Nov 2021 14:20:46 +0000</pubDate>
      <link>https://dev.to/alexyelenevych/how-we-entered-the-chinese-red-ocean-edtech-market-and-survived-2go8</link>
      <guid>https://dev.to/alexyelenevych/how-we-entered-the-chinese-red-ocean-edtech-market-and-survived-2go8</guid>
      <description>&lt;p&gt;Expanding into a new market is always a risk, especially if your niche in this market is already a red ocean and the market itself is very different from those you’ve already mastered.&lt;/p&gt;

&lt;p&gt;The Chinese market has always been a tough nut to crack for Western and European companies. The probability of bringing a successful EdTech company here is very small since this market in China is already occupied by local players.&lt;/p&gt;

&lt;p&gt;In addition, there are a lot of nuances in China that are not obvious to Western marketers. We have always loved to take on challenges, so we started trying to expand to a wide variety of markets including the Chinese. In this article, I’ll share with you how we did it.&lt;/p&gt;

&lt;h2&gt;
  
  
  New markets. First (failed!) try
&lt;/h2&gt;

&lt;p&gt;Due to the success of and interest in CodeGym in the Western Europe market, it was logical to expand our local online product to other countries. However, our first attempts were unsuccessful. In 2014, we were interested in the Indian market. Since India is a country where IT outsourcing is developed, the potential audience is very large, and the salaries of software developers are significantly higher than the national average, which makes them kind of rock stars. It’s also important to note that, in India, most people can speak and understand English.&lt;/p&gt;

&lt;p&gt;We didn’t do marketing research; instead, we decided to try an inside approach: we left for India for six months with our entire small office. It turned out to be a really smart decision, though we faced difficulties very quickly. As of 2014, India had mostly mobile internet, but it was slow and of poor quality. Only 15 of 250 million Internet users had a decent internet connection. In addition, it turned out that online payment systems were in their infancy in India, making payment difficult. As a result, we saw interest in our course, but much less than we expected. Unfortunately, there were no sales at all.&lt;/p&gt;

&lt;p&gt;We retreated and began research, learned the US market, and launched contextual advertising. There was interest in the course, but we, unfortunately, did not take into account some local peculiarities, making the English translation of the course subpar.&lt;/p&gt;

&lt;h2&gt;
  
  
  New markets. Next steps
&lt;/h2&gt;

&lt;p&gt;Although the first attempts were unsuccessful, we drew valuable conclusions from them and built a circuit that worked as a result. To begin with, we used an approach based on testing risk assumptions. The main idea was to get user feedback as quickly as possible and test the idea even before creating the product.&lt;/p&gt;

&lt;p&gt;Using this approach, we checked the markets we were planning to enter, and realized that they were growing. We hired a localization team and prepared the first local English language CodeGym. After that, we ran tests to ensure our product fits into the market. We have highlighted several important metrics associated with learning(passing the beginning of the course, solving the first problems) and the convenience of registering on the website. After a while, we sent out a questionnaire to clients in which we asked how disappointed they would be if they could no longer use CodeGym. There is a generally accepted estimate for this question: if 40% or more are disappointed, then there is product-market fit. Our estimate was 63%.&lt;/p&gt;

&lt;p&gt;The next step was to search for different distribution channels; PPC, PR, SEO specialists appeared and we found channels that work for us. Ultimately, we received a lot of positive feedback about the course from non-English-speaking countries, so we thought it would be nice to launch a localized CodeGym in these markets.&lt;/p&gt;

&lt;p&gt;At the moment, we’ve developed a system of “accelerated testing” of the market, where, with minimal effort, we’ve been able to check whether a new market is suitable for us in one to two months.&lt;/p&gt;

&lt;p&gt;The following are the most important criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Market size&lt;/li&gt;
&lt;li&gt;Level of competition&lt;/li&gt;
&lt;li&gt;Demand for Java in the job market&lt;/li&gt;
&lt;li&gt;Product market fit pre-assessment&lt;/li&gt;
&lt;li&gt;Team expertise&lt;/li&gt;
&lt;li&gt;Market complexity in terms of legal, financial, and bureaucratic issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We translated the interface of the CodeGym website as well as the first two levels of the course into the language of the countries in which we planned to launch, and then checked a few more parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translation quality&lt;/li&gt;
&lt;li&gt;User activity in the product&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Launch in Europe and problems with distribution in China
&lt;/h2&gt;

&lt;p&gt;We launched 12 local versions and found that the mini-versions of CodeGym are best perceived in Poland, Germany, France, and China. We also learned that China was the leader in all metrics of engagement in learning. However, the markets of European countries were relatively similar to our own, while in China, we immediately faced some difficulties.&lt;/p&gt;

&lt;p&gt;We began our journey to Tianxia along a seemingly proven path: launch advertising, look at metrics, conduct surveys, and draw conclusions. However, even launching ads in China is not that easy.&lt;/p&gt;

&lt;p&gt;So, what difficulties can an experienced marketer have when creating an advertising office? With Google, Facebook, Quora, or LinkedIn, there really were no problems. However, to create an advertising account in Chinese products Baidu, WeChat, Weibo, Douyin, QQ, or Tencent, oh, how difficult it is if you are out of China!&lt;/p&gt;

&lt;p&gt;On some advertising platforms in China, foreign companies cannot create an advertising office, especially if your company is related to education. On others, this can be done, but you need to go through countless checks, confirmations, calls, prepare tons of documents that need to be signed with hieroglyphs, take a photo with completed questionnaires, and much more. In short, only a very serious company can do this.&lt;/p&gt;

&lt;p&gt;Unsurprisingly, these features weakened our enthusiasm. Since there were other promising areas, we decided that the obstacles in China were too high and the market was difficult; we decided to postpone the work in China for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  And yet, China!
&lt;/h2&gt;

&lt;p&gt;Six months have passed since the successful launch in Europe, but we still did not lose focus on China. Within the framework of collecting information, we realized that it is Asia, in principle, that is the current market driver for Ed-Tech’s growth, mostly China and India. There are about 900 million Internet users in China. Users spend an average of 3 hours per day browsing content online and actively researching educational opportunities abroad.&lt;/p&gt;

&lt;p&gt;According to a study by the Chinese media platform JMDedu, the majority of parents in major cities in China spend at least $ 7,000 per year on &lt;a href="https://medium.com/@EdtechChina/decoding-2018-chinas-education-market-where-did-chinese-parents-money-go-in-2018-f54a1c1dda84"&gt;children’s education&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;China’s EdTech market sector provides stable venture capital flows. China is the leader in investment in EdTech.&lt;/p&gt;

&lt;p&gt;Also, it can be noted that online education is one of the fastest-growing industries in China. In 2015, the number of online education users in China was 110 million, with a market value of 114 billion yuan.&lt;/p&gt;

&lt;p&gt;By 2018, the number of online students grew by 63% to 179 million, and the market value doubled to 300 billion yuan ($45.6 billion). This trend is expected to continue in the future; UBS estimates the market will grow to 714 billion yuan ($108 billion) by 2025.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nh1GyaTd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eiaz93gvgr27dgm6q7jv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nh1GyaTd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eiaz93gvgr27dgm6q7jv.png" alt="Image description" width="700" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The size of the online education market in 2020 was $203 billion. In 2021, it is likely to be $223 billion, and in 2025, the online education market will grow to $341 billion (average annual growth of 9.23%).&lt;/p&gt;

&lt;p&gt;According to forecasts, due to COVID-19, these numbers may change, and in 2025, we will receive not $350 billion but &lt;a href="https://www.holoniq.com/notes/global-education-technology-market-to-reach-404b-by-2025/"&gt;$404 billion&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  This market is already taken! Are you sure?
&lt;/h2&gt;

&lt;p&gt;The statistics looked very promising, especially considering the positive response we received from our test course. However, as part of the Market Research of the programming market in China, it turned out that there are already a significant number of companies and products that have completed insane rounds of investments and have grown to a scale that is difficult to imagine. The main players in the online education market in China are Yuanfudao, Zuoyebang, Xue’ersi, and Baicizhan. Higher education and vocational training account for 75% of the total market share.&lt;/p&gt;

&lt;p&gt;It would seem that we shouldn’t even think about competing with local companies. However, our research has shown that almost all Chinese EdTech is targeted at schoolchildren. Even college students had very few of these products, let alone adults who are considering a career change and considering becoming a software developer. Our product is aimed primarily at adults who want to change jobs, as well as students. At the same time, the Chinese are much more inclined to change jobs than, say, the Japanese or Koreans. For example, in a 2018 report, online recruiting company Zhaopin reported that more than half of its employees plan to change jobs in three years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do you speak Java, China?
&lt;/h2&gt;

&lt;p&gt;Next, we began to investigate an important issue for us. At the moment, our platform is focused on learning only one programming language, Java. Therefore, we had to find out how popular this language is in China. We found that according to various estimates, 26.67% of all developers in China are Java developers and they have the highest salaries in the industry. It also turned out that the number of Java developers is growing by 20–30% annually, and demand often greatly exceeds supply, though these are not exact figures.&lt;/p&gt;

&lt;p&gt;We haven’t found many interesting products to help adults learn Java. Among them were such services as Huke88 (it is somewhat similar to Udemy with a subscription), a free Alibaba course, and free video courses on Bilibili. According to reviews on Zhihu and Baidu Tieba (the Chinese counterparts of Quora), they are not very high quality and do not solve problems related to learning Java. The feedback on them was very weak, and requests from students for learning assistance were often unanswered.&lt;/p&gt;

&lt;p&gt;We also found out that help is needed for people who have already found a job as a Java programmer. First, developers in China are a relatively young profession. The majority (56.7%) of developers in China have between 0 and 3 years of experience. Second, 71.8% of Chinese developers were trained in this profession at university, and, according to surveys, this training did not give them the appropriate skills and knowledge. Therefore, they often learn while working independently. Naturally, this category speaks English quite well, but nevertheless, a good Chinese course will not be superfluous.&lt;/p&gt;

&lt;h2&gt;
  
  
  First 3,000 users and registration problems
&lt;/h2&gt;

&lt;p&gt;Summing up all the information received, we decided to continue our tryings for the Chinese market. However, due to the problems described above, we could not fully concentrate on it and instead decided to work with it on a leftover basis. So, we wrote several answers mentioning CodeGym on Zhihu, published a number of articles about the product on popular Chinese platforms, and sent out press releases to the Chinese media. During the first week, there were no reactions from the media and few transitions to the site, so we decided to postpone the idea of ​​expansion for a while and think about other approaches. However, 4 months after the events described above, I looked at the metrics for various products. When I looked into the Chinese version of CodeGym, I found about 3,000 registered users there. Most of them have already passed free localized levels and solved all the problems. In the comments, there were many requests for access to the rest of the course.&lt;/p&gt;

&lt;p&gt;We monitored local websites related to learning programming, and it turned out that CodeGym was mentioned quite often. At the same time, there were many complaints on the forums about difficulties with registration and a lot of popular “life hacking” posts about how to create an account on CodeGym. There was a problem that we had no idea about: when registering via email, we opened Google-captcha, but it was banned in China, so we had difficulty using email for registration. All social networks that can be used for login also do not work in China (sure, we knew this, but decided to leave this method just in case). In short, of all the possible ways in the country, only registration through GitHub worked.&lt;/p&gt;

&lt;p&gt;Of course, we immediately removed the Google captcha and localized 18 more course levels. Fortunately, the process has already been debugged.&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s alive…but really risky!
&lt;/h2&gt;

&lt;p&gt;The audience’s response was impressive. Reach up to level 20 of the course, the time users spend inside the product, and other metrics were exactly two times higher than similar CodeGym metrics in any other regions of the world.&lt;/p&gt;

&lt;p&gt;At that moment, we realized that we could try to tackle this area more seriously.&lt;/p&gt;

&lt;p&gt;We identified a set of risky assumptions in which, with each subsequent failure, the rest of the work with China would not make any sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The list of risky assumptions was something like this:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We won’t be able to provide Chinese users with a really convenient way to register on the website (as a foreign company, we won’t be able to implement registration through WeChat or other convenient registration methods).&lt;/li&gt;
&lt;li&gt;We won’t be able to pass verification and access at least one advertising network in China (for example, Baidu, WeChat, Douyin, etc.).&lt;/li&gt;
&lt;li&gt;Metrics from other channels (such as paid ones) will show lower results than traffic from Zhihu and articles that users wrote themselves. If the metrics are significantly lower than in Poland, Germany, and the United States, but the cost of advertising is about the same, then the unit economics will not converge.&lt;/li&gt;
&lt;li&gt;Since we are a foreign company, we won’t be able to accept payments from China (for example, we won’t have some kind of license and we simply will not be able to connect WeChat Pay, AliPay, and UnionPay).&lt;/li&gt;
&lt;li&gt;China users won’t buy our paid product.&lt;/li&gt;
&lt;li&gt;We won’t be able to scale our distribution channels and grow rapidly in revenue.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;In the end, we tested all the risky assumptions, and given that all this was done without using many resources, it was not easy. We can write an entire guide to test each one and tell many fascinating stories.&lt;/p&gt;

&lt;p&gt;For example, just like when registering a developer account on WeChat, every day for 2 weeks at 5 am I was woken up by calls from China with new requests to send photos with documents and questionnaires. Or, there’s a story about how we added payment through Chinese payment services, turned on Paymentwall, and were surprised that there were no payments at all with excellent engagement rates.&lt;/p&gt;

&lt;p&gt;However, the most important thing is that we coped with these difficulties, and the product began to work successfully. Well, the main thing that pleases us is that the metrics of the Chinese locale of CodeGym walkthrough are, on average, twice as high as in other locales. For example, the first level of the course is passed by approximately 52% of registered Chinese users, 24% for US users, 34% for Russian users, and 25% for the Polish CodeGym version.&lt;/p&gt;

&lt;p&gt;Of course, the real expansion is still very far away, but the first results are already pleasing to us. We currently have 23,400 registered users in the Chinese locale on our website. This number is constantly growing; we sell subscriptions to Chinese users every day. Chinese users write great reviews about us, and we plan to develop further in this market.&lt;/p&gt;

&lt;p&gt;First. published at &lt;a href="https://entrepreneurshandbook.co/how-we-entered-the-chinese-red-ocean-edtech-market-and-survived-e33b39d26f92"&gt;Entrepreneur's Handbook&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>How We Created a Mobile Tool to Write Code and What We’ve Got</title>
      <dc:creator>Alex Yelenevych</dc:creator>
      <pubDate>Fri, 12 Nov 2021 16:02:14 +0000</pubDate>
      <link>https://dev.to/alexyelenevych/how-we-created-a-mobile-tool-to-write-code-and-what-weve-got-2b6a</link>
      <guid>https://dev.to/alexyelenevych/how-we-created-a-mobile-tool-to-write-code-and-what-weve-got-2b6a</guid>
      <description>&lt;p&gt;Is it possible to write programs on a mobile phone without experiencing pain, hatred, and powerlessness? When we created &lt;a href="https://codegym.cc/"&gt;CodeGym&lt;/a&gt;, a practice-oriented online course for learning Java programming, we doubted it. However, times are changing, and technologies are changing. In this article, we are going to talk about how we created the mobile version of CodeGym and what it’s led to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lack of mobility was a problem
&lt;/h2&gt;

&lt;p&gt;We constantly received feedback from users. They were satisfied with the course, but somewhere in the 4–5 years of CodeGym’s existence, users started to request for the mobile application. There were not so many such requests, but enough to start the research. According to it, a lot of CodeGym students read lectures on their way to work or to study. Later at night, they log into the system from a computer, most often for coding tasks. It was our first hint but we doubted that it’s possible to code from a mobile phone with convenience. So we postponed this idea for a couple of years.&lt;/p&gt;

&lt;p&gt;However, microlearning has become more and more part of our lives. Thus, the MarketsandMarket agency assumes that by 2024 the global microlearning market will increase by 13.2%, which will amount to $ 2.7 billion.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Microlearning is a format for presenting course information, where the course program is divided into modules according to the formula “1 module — 1 thought — 1 skill”. Each lesson is a concentrate of useful information, calculated on average for 10–15 minutes of a student’s time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By the way, when CodeGym lectures were first created, they were quite suitable for the microlearning format and were considered brief. Now, to be honest with you, micro-lectures is understood as an even more concentrated format.&lt;/p&gt;

&lt;p&gt;Trying to be in trends we also released a few brief videos that cover some Java topics, but that was not enough. The requests for the mobile application continued, and after a while, we began to slowly explore this market.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s on the market for mobile programming courses?
&lt;/h2&gt;

&lt;p&gt;We knew that it’s easy to read lectures from a mobile on the web, so it’s not worth developing an application just for lectures. So the main question was: is it possible to create a really convenient mobile development environment for learning programming? One that would help not waste time, and use your free 5–10 minutes on the road to write code in a convenient way, so that the student wouldn’t want to smash the cellphone into the wall out of disappointment.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IDE or Integrated Development Environment is an application that includes a set of tools programmers need for their work. It is used to write code, compile or interpret it, run it, debug it, and automate the build. In the case of the educational mobile IDE, we were interested in writing and compiling code, launching a program, and issuing validator comments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To begin with, we explored the solutions that other programming courses had. Basically, at that time, there were multiple-choice tests. Since we are a course about practice, we considered such tests to be purely optional. However, we found some decent mobile IDE, such as Grasshopper and several others.&lt;/p&gt;

&lt;p&gt;There were exciting ideas for ​​hints in this app: you don’t write letter-by-letter code, but have some pieces of puzzles with pieces of code in them, and they have to be assembled in the correct order. The idea is really interesting, since it allows you to code with one finger, but we were embarrassed that there were only suitable pieces for a specific task. This approach doesn’t help to learn programming well enough: it’s a puzzle, but not a real program creation. You know, programming is still a process of creation that demonstrates not only knowledge but also creativity and ingenuity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile IDE: what should it be?
&lt;/h2&gt;

&lt;p&gt;So if we come up with a mobile IDE and it will be convenient from the UX point of view, it makes sense to develop the whole CodeGym application. It will be much easier to adapt to the rest of the course, such as lectures and tasks, and we’ve got how to do this.&lt;/p&gt;

&lt;p&gt;We considered that code typing from the virtual keyboard letter by letter is still needed. It just shouldn’t be the main mode but complement the puzzles mode. However, the pure puzzles we described above didn’t suit our course, and we figured out how to improve this approach. First, parts of the code were split into groups (punctuation marks, operators, methods, and so on). Secondly, not all “puzzles” were suitable for the solution. Of course, if you load all possible code elements according to this principle, it will be inconvenient to search for the desired element. Hence, the set that the student sees on the mobile screen differs from task to task. The important thing is that not all the options were correct, there were more pieces of code than needed to solve a specific task, so the student needed to scratch the back of the head a little.&lt;/p&gt;

&lt;p&gt;Well, if suddenly a student learned some new way of solving a coding task before reading about it in lectures, and the shown code elements did not cover it, they can always switch to the usual letter-by-letter input mode. So switching from one mode to another gives a user both flexibility and convenience. Thus, theoretically, students could, in 10 minutes during a trip or in a queue to the dentist, reflect on the problem and solve it using one finger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YzpZmZ-k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cx86v6lpmg01trlvm13p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YzpZmZ-k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cx86v6lpmg01trlvm13p.png" alt="Image description" width="186" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prototype development and testing
&lt;/h2&gt;

&lt;p&gt;This approach seemed promising and we developed a clickable prototype for testing. This prototype had no design, just clickable cards with explanations of what was going to be located where. We selected a group of CodeGym students from different levels and prepared a questionnaire for them. For example “you need to open a task in the application, what will you do?”. After collecting their answers, we corrected the prototype and began to create a UI based on it, and also tested it for a month and a half.&lt;/p&gt;

&lt;p&gt;I’ll go back a bit and say that we expected the application to be just part of the ecosystem of the course, and it will be used by people who are already familiar with the web CodeGym. So we created the first UI keeping this in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choice of technologies: Android
&lt;/h2&gt;

&lt;p&gt;When development started, we still considered the mobile application to be purely an add-on, so we couldn’t afford to allocate many people to develop it. Moreover, we were in no hurry and still working on improving the idea for our mobile IDE. So we decided to develop only an Android application, and later, if successful, tackle iOS.&lt;/p&gt;

&lt;p&gt;Why Android? It’s simple. First, we already have a ready-made team of Java developers who also know Kotlin and Android well. Secondly, according to Statista and many other analytical companies, as of 2018, when we started developing the app, the market share of Android mobile phones exceeded 80%. Thirdly, a testing ground for the app was the Eastern European Russian language version and the percentage of Android users in this version was even higher. So we hired another Android developer, brought in a UX/UE designer, and got down to work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fFI0Dx-_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ttqy4s1z78rz9ku38v55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFI0Dx-_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ttqy4s1z78rz9ku38v55.png" alt="Image description" width="630" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Development and testing of the first version
&lt;/h2&gt;

&lt;p&gt;It took a little less than a year to develop an app from the rendered layouts to the launch of the test version on Google Play. The first mobile CodeGym contained neither lectures nor other sections of the website. There was the only access to coding tasks and a mobile IDE. For closed testing, we selected about 2,000 CodeGym students, created a special group on our website, and posted a list of questions about UX, UI, convenience, etc. They actively used the application and answered questions, communicated with each other and the developers. Two weeks later we collected all the questionnaires, aggregated them into a table, and talked with the most active participants in person. We also collected crash data across devices using Firebase Crashlytics, a lightweight crash reporter from Google.&lt;/p&gt;

&lt;p&gt;In addition, we tracked the percentage of people who opened a task, solved it, and sent the solution for review. According to our internal metrics, this number turned out to be higher than we expected, and this process took place quickly enough, which is undoubtedly a good indicator. We had a fear that using a mobile application would be too tedious and significantly slow down future programmers in achieving their goals. Fortunately, we were wrong.&lt;/p&gt;

&lt;p&gt;After collecting all this data, comments on UI, UX, bugs, we categorized and prioritized it, and started working on improvements and bug fixes. After that, we launched an official release of CodeGym Mobile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other aspects of the mobile app
&lt;/h2&gt;

&lt;p&gt;The second most important task after Mobile IDE was the adaptation of the Help section. We needed to make it convenient for the user to ask a question from the phone in one click. That is, just like on the CodeGym website, if users can’t solve a task, they could click on the Help button. This action leads to the creation of a topic with their code and task condition attached. So the user should only write a heading question and press the Send button.&lt;/p&gt;

&lt;p&gt;After solving this task, we gradually transferred the entire course to a mobile format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our mistakes
&lt;/h2&gt;

&lt;p&gt;In fact, there were not so many serious mistakes at the strategy level, since we acted deliberately and were in no hurry. We did not have a task to quickly release the application, to occupy some niche, or something like that.&lt;/p&gt;

&lt;p&gt;However, at first, we were clearly too clever with statistics. In order to understand whether the interface is effective, we did a number of UX tests, but since we had a very small sample, we decided to use analytical tools for all possible user scenarios, literally for every click on a button, every scroll. We sent everything into the database and stored it there. The mistake was that we made all this data very complicated, collected a bunch of statistics, and didn’t quite understand how to use it. We didn’t think beforehand about how to summarize the information received.&lt;/p&gt;

&lt;p&gt;Of course, there were a lot of technical bugs. It would be weird if they were not there :).&lt;/p&gt;

&lt;p&gt;Well, a pleasant mistake was that we somewhat underestimated the capabilities of the mobile application: it turned out that not only those who already know our website but also new users who find it through Google Play are trying to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recent improvements
&lt;/h2&gt;

&lt;p&gt;We thought that an app without a website had no value in its own right, that it was an add-on to an ecosystem. However, it turned out that there are users who liked our approach and they learn ONLY in the application. Since the interface was tailored for people who know CodeGym, we began to research what might be incomprehensible to newcomers.&lt;/p&gt;

&lt;p&gt;There were quite a few people who figured out everything and used CodeGym for free (for a long time in the application it was possible to study for free). As it turned out, some users didn’t even know that there was such a website.&lt;/p&gt;

&lt;p&gt;Nevertheless, we slightly changed the interface and developed an onboarding tour: a user enters the application, a pop-up window appears with explanations of locations and how the course should be taken, and tested different versions of it. In a word, we tried to improve the product itself to make it easier for a person at the very beginning.&lt;/p&gt;

&lt;p&gt;One of the most recent and most ambitious changes is the introduction of a user-responsive course. This feature appeared on the “big” CodeGym a little bit earlier. When users enter the application for the first time, they are asked what language they want to study in, what is the goal of the learning (to become an android developer, Java developer, etc.). Now, the user is proposed to take a small theory test, which can be skipped if they have never studied Java before. After this procedure, the user clicks on the “Get a course” button and a conditionally personal version of the course is generated.&lt;/p&gt;

&lt;p&gt;Also, we recently introduced an “app-only” subscription that costs less than a website subscription (website subscription, of course, includes access to a mobile app). As it turned out, many students are ready to study in mobile format only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results and plans for the future
&lt;/h2&gt;

&lt;p&gt;The trends in mobile learning and microlearning are inextricably linked. Mobile learning is the fastest growing trend in EdTech (growing 23% annually), so we made the right choice when we listened to our users and started developing the CodeGym app.&lt;/p&gt;

&lt;p&gt;We managed to develop a really convenient mobile application for learning Java by doing. Considering that programming is a sea of ​​code, we think this is just a great result. Mobile CodeGym has really accelerated students and increased product satisfaction. It is very important that the mobile application has led to the fact that there are fewer long (at least two weeks) breaks in learning. As we’ve researched, long breaks are one of the biggest enemies of online learning and the root cause of most potential programmers’ failure.&lt;/p&gt;

&lt;p&gt;We constantly support the Android application, listen to users, fix bugs, and think about improvements. We are currently developing a version of CodeGym for iOS, now it is at the prototyping stage. Perhaps in the future, we will develop a short video format and think about organizing effective voice input in the IDE.&lt;/p&gt;

&lt;p&gt;First published at &lt;a href="https://medium.com/geekculture/how-we-created-a-mobile-tool-to-write-code-and-what-weve-got-d77fa4757d1d"&gt;Geek Culture&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>android</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>java</category>
    </item>
    <item>
      <title>Every Java Junior does it: Common Java mistakes made by newcomers</title>
      <dc:creator>Alex Yelenevych</dc:creator>
      <pubDate>Tue, 15 Jun 2021 16:11:24 +0000</pubDate>
      <link>https://dev.to/alexyelenevych/every-java-junior-does-it-common-java-mistakes-made-by-newcomers-12c1</link>
      <guid>https://dev.to/alexyelenevych/every-java-junior-does-it-common-java-mistakes-made-by-newcomers-12c1</guid>
      <description>&lt;p&gt;Everyone makes mistakes, not just beginners, but even professionals. This article goes over a dozen common mistakes that Java newbies and newcomers make and how to avoid them. Have you or your colleagues made any of these common Java mistakes early in your career?&lt;/p&gt;

&lt;p&gt;Everyone makes mistakes, not only learners or beginners, but professionals. As a programming course, CodeGym team often collects mistakes of newbies to improve our auto validator. This time we decided to interview experienced programmers about mistakes in Java they made closer to their careers start or noticed them among their young colleagues.&lt;/p&gt;

&lt;p&gt;We collected their answers and compiled this list of dozen popular mistakes Java beginners make. The order of errors is random and does not carry any special meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  #1. OOP: Incorrect construction of the object hierarchy. In particular, a misunderstanding of where to apply an interface, and where an abstract class.
&lt;/h2&gt;

&lt;p&gt;An abstract class lets you create functionality that subclasses can implement or override. In an interface, you just define functionality, but not implement it. Although a class can only extend one abstract class, it can use multiple interfaces.&lt;/p&gt;

&lt;p&gt;The choice between interface and abstract class depends on many factors.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java does not support multiple inheritance, so each class can inherit only one superclass. However, any class can implement multiple interfaces.&lt;/li&gt;
&lt;li&gt;If you decide to write many methods, then an abstract class is the best solution for you, because you can provide default implementations for some of the methods that are common to all subclasses.&lt;/li&gt;
&lt;li&gt;If you need to add or remove a method from the interface, it could be a problem, because you can’t declare additional methods in an interface without changing all classes that implement this interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s look at the example below. Here we have incorrect construction of the object hierarchy. In particular, a misunderstanding of when to apply the interface, and when should be an abstract class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;amp;nbsp;
public interface BaseEntity {
    long getId();
    void setId(long id);
}

public interface NamedEntity extends BaseEntity {
    String getName();
    void setName(String name);
}
public class User implements NamedEntity {

    private long id;
    private String name;
    private String avatarUrl;

    @Override
    public long getId() {
        return id;
    }
    @Override
    public void setId(long id) {
        this.id = id;
    }
    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    public String getAvatarUrl() {
        return avatarUrl;
    }

    public void setAvatarUrl(String avatarUrl) {
        this.avatarUrl = avatarUrl;
    }
}

public class Group implements NamedEntity {

    private long id;
    private String name;
    private String description;

    @Override
    public long getId() {
        return id;
    }

    @Override
    public void setId(long id) {
        this.id = id;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

public class Comment implements BaseEntity {

    private long id;
    private String content;

    @Override
    public long getId() {
        return id;
    }

    @Override
    public void setId(long id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here the beginner uses an interface, in spite of the fact that class is much more appropriate for this task. The reason is that you can keep duplicated code into a class. If it is necessary, you can add Interfaces on top of parent classes. So here is the right decision (using abstract classes instead of interfaces):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;amp;nbsp;public abstract class BaseEntity {

    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}

public abstract class NamedEntity extends BaseEntity {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class User extends NamedEntity {

    private String avatarUrl;

    public String getAvatarUrl() {
        return avatarUrl;
    }

    public void setAvatarUrl(String avatarUrl) {
        this.avatarUrl = avatarUrl;
    }
}

public class Group extends NamedEntity {

    private String description;

    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}
public class Comment extends BaseEntity {
    private String content;

    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  #2. OOP: mess with order of calling constructors
&lt;/h2&gt;

&lt;p&gt;Newbies often forget about the order that constructors are called when objects are created. The rule is simple: constructors are called in inheritance order. When you think about the logic, it becomes clear that executing constructors in order of inheritance makes some sense.&lt;/p&gt;

&lt;p&gt;The superclass knows nothing about its subclasses. Thus, any initialization must be done in the superclass completely independently of any initialization performed by the subclass. Therefore, this should be done first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;amp;nbsp;
public class Animal {
   public Animal() {
       System.out.println("Animal constructor has worked off");
   }
}

public class Cat extends Animal {
   public Cat() {
       System.out.println("Cat constructor has worked off!");
   }
   public static void main(String[] args) {
       Cat cat = new Cat();
   }
}

The Output is: 
Animal constructor has worked off
Cat constructor has worked off!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, when creating child elements, the base class constructors are implicitly called first.&lt;/p&gt;

&lt;p&gt;In addition, it is important to remember to call the correct parent constructor, otherwise the parent default constructor will be called, as in the following example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public abstract class AbstractToken {


    private final Collection&amp;lt;Object&amp;gt; authorities;


    public AbstractToken(Collection&amp;lt;Object&amp;gt; authorities) {

        if (authorities == null) {

            this.authorities = Collections.emptyList();

            return;

        }

        for (Object a : authorities) {

            if (a == null) {

                throw new IllegalArgumentException("Authorities collection cannot contain any null elements");

            }

        }

        ArrayList&amp;lt;Object&amp;gt; temp = new ArrayList&amp;lt;&amp;gt;(authorities.size());

        temp.addAll(authorities);

        this.authorities = Collections.unmodifiableList(temp);

    }

    public AbstractToken() {

        this.authorities = Collections.emptyList();

    }

}

public class MyToken extends AbstractToken {



    private int userId;



    public MyToken(User user, Object... authority) {

        this.userId = user.getId();

    }

}

public class User {

    private int id;

    public int getId() {
        return id;
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The constructor of the parent class is not explicitly called in the constructor of MyToken. So the constructor of AbstractToken with no parameters will be called. This constructor is missing the required object initialization part. Don’t forget to call a particular constructor you really need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MyToken extends AbstractToken {


    private int userId;


    public MyToken(User user, Object... authority) {

        super(Arrays.asList(authority));

        this.userId = user.getId();

    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  #3. OOP: Mess with overriding and overloading
&lt;/h2&gt;

&lt;p&gt;Overriding and Overloading are two very important concepts in Java. They could be really confusing for Java novice programmers.&lt;/p&gt;

&lt;p&gt;Simply put, overriding allows you to take a method of the parent class and write its own implementation of this method in each inherited class. The new implementation will “replace” the parent in the child class.&lt;/p&gt;

&lt;p&gt;Here is an example. We have Animal class with voice() method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Animal {

   public void voice() {

    System.out.println("Speak!");
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s say we need to override the behavior of the method in the derived classes. For example, we will implement 4 inheritor classes, which will have their own implementation of the voice method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Bear extends Animal {
   @Override
   public void voice() {
       System.out.println("Grrr!");
   }
}
public class Cat extends Animal {

   @Override
   public void voice() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void voice() {
       System.out.println("Bow-wow!");
   }
}


public class Snake extends Animal {

   @Override
   public void voice() {
       System.out.println("Hiss-hiss!");
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let’s check how it works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();

       animal1.voice();
       animal2.voice();
       animal3.voice();
       animal4.voice();
   }
}

The output is: 
Bow-wow!
Meow!
Grrr! 
Hiss-hiss!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In addition to overriding, in the program we can use methods with the same name, but with different types and/or number of parameters. This mechanism is called method overloading.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Program{

    public static void main(String[] args) {

        System.out.println(sum(2, 3));          // 5
        System.out.println(sum(4.5, 3.2));      // 7.7
        System.out.println(sum(4, 3, 7));       // 14
    }
    static int sum(int x, int y){

        return x + y;
    }
    static double sum(double x, double y){

        return x + y;
    }
    static int sum(int x, int y, int z){

        return ukx + y + z;
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three options or three overloads of the sum() method are defined here, but when it is called, depending on the type and number of parameters passed, the system will choose the version that is most suitable.&lt;/p&gt;

&lt;p&gt;There is another option where a newbie can make a mistake when overriding. You can simply remember in which case which method is called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MyParent {
    public void testPrint() {
        System.out.println("parent");
    }
}

public class MyChild extends MyParent {

    @Override

    public void testPrint() {

        System.out.println("child");

    }


    public static void main(String[] args) {

        MyParent o1 = new MyParent();

        MyParent o2 = new MyChild();

    MyChild o3 = new MyChild();

//      MyChild o4 = (MyChild) new MyParent(); // ClassCastException



        o1.testPrint();

        o2.testPrint();

        o3.testPrint();

    }

} 
The output is:
parent
child
child
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  #4. Wrong work with exceptions
&lt;/h2&gt;

&lt;p&gt;Very often novice programmers don’t know how to work with exceptions correctly. To begin with, they simply ignore them, especially those that have moved from other programming languages. However, exceptions are thrown for some reason, so don’t ignore them.&lt;/p&gt;

&lt;p&gt;There are also cases of careless handling of exceptions. For example, a newbie writes code, and their IDE starts underlining it in red and explains that certain exceptions may be thrown during its execution. In this case, an inexperienced programmer often prefers to wrap all the code in a try-catch and do nothing in catch block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void main(String[] args) {
    try {
        String urlString = new Scanner(System.in).nextLine();
        URL url = new URL(urlString);
        String content = new Scanner(url.openStream(), StandardCharsets.UTF_8).useDelimiter("\\A").next();
        System.out.println(content);
    } catch (IOException ignored) {
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem is that in this case, we will not know what kind of exception happened, for what reason, and whether it happened at all.&lt;/p&gt;

&lt;p&gt;There are different options for how to fix the situation. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;display the stack trace:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void main(String[] args) {

    try {

        String urlString = new Scanner(System.in).nextLine();

        URL url = new URL(urlString);

        String content = new Scanner(url.openStream(), StandardCharsets.UTF_8).useDelimiter("\\A").next();

        System.out.println(content);

    } catch (IOException e) {

        e.printStackTrace();

    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;throw the exceptions above:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void main(String[] args) throws IOException {

    String urlString = new Scanner(System.in).nextLine();

    URL url = new URL(urlString);

    String content = new Scanner(url.openStream(), StandardCharsets.UTF_8).useDelimiter("\\A").next();

    System.out.println(content);

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;handle each exception separately:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void main(String[] args) {

    URL url = getUrl();

    String content = getContent(url, 3);

    System.out.println(content);

}

private static String getContent(URL url, int attempts) {

    while (true) {

        try {

            return new Scanner(url.openStream(), StandardCharsets.UTF_8).useDelimiter("\\A").next();

        } catch (IOException e) {

            if (attempts == 0) {

                throw new RuntimeException(e);

            }

            attempts--;

        }

    }

}

private static URL getUrl() {

    while (true) {

        String urlString = new Scanner(System.in).nextLine();

        try {

            return new URL(urlString);

        } catch (MalformedURLException e) {

            System.out.println("URL is incorrect. Please try again.");

        }

    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  #5. Problems with choosing the right Collections
&lt;/h2&gt;

&lt;p&gt;Beginners are often confused about choosing the right collection. Sometimes they choose this or that collection by mistake, because they do not deeply understand data structure. The wrong choice can affect the effectiveness of your program. On the other hand, if the collection is selected correctly, your program will look simpler and more logical, and the solution will be more efficient.&lt;/p&gt;

&lt;p&gt;To find out which type of collection is right for your task, find out the characteristics and behavior of each one, as well as the differences between them. You need to be clear about the pros and cons of each specific implementation (ArrayList vs LinkedList, treeMap vs HashMap and so on).&lt;/p&gt;

&lt;p&gt;I recommend for the first steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Explore not just Сollections framework, but theoretical data structures.&lt;/li&gt;
&lt;li&gt;Create a table with all the collections. Give a brief definition of what data structure is at its core, what are its features.&lt;/li&gt;
&lt;li&gt;Ask yourself some basic questions. Should your collection allow access to items by index? Is null accepted in it? Is it allowed to duplicate elements? Do quick elements addition and quick removal important for your solution? Should it support concurrency?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  #6. Ignorance of Java libraries, reinvention of wheels
&lt;/h2&gt;

&lt;p&gt;A huge number of libraries have been written for Java, but beginners often do not notice all these gems. Don’t try to reinvent the wheel, first learn the existing developments on the issue of interest. Many libraries have been perfected by developers over the years, and you can use them for free. For example, Google Guava, or Log4j.&lt;/p&gt;

&lt;p&gt;Let’s have an example. This is what the code looks like without using libraries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private static Map&amp;lt;String, Integer&amp;gt; getFrequencyMap(Set&amp;lt;String&amp;gt; words, List&amp;lt;String&amp;gt; wordsList) {
    Map&amp;lt;String, Integer&amp;gt; result = new HashMap&amp;lt;&amp;gt;();
    for (String word : words) {
        int count = 0;
        for (String s : wordsList) {
            if (word.equals(s)) {
                count++;
            }
        }
        result.put(word, count);
    }
    return result;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we use Collections.frequency() library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private static Map&amp;lt;String, Integer&amp;gt; getFrequencyMap(Set&amp;lt;String&amp;gt; words, List&amp;lt;String&amp;gt; wordsList) {

    Map&amp;lt;String, Integer&amp;gt; result = new HashMap&amp;lt;&amp;gt;();

    for (String word : words) {

        result.put(word, Collections.frequency(wordsList, word));

    }

    return result;

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, here we’ve got just a short example, so the complexity of the code has changed only slightly. However, the readability of the code has significantly increased. In large projects with many classes, using built-in and third-party libraries can significantly speed up development, improve readability, and testability. So don’t forget to explore Java libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  #7. Ignoring JUnit and wrong testing of your own code
&lt;/h2&gt;

&lt;p&gt;Very often, novice programmers “test” their code incorrectly. For example, using System.out.println(), substituting and printing different values to the console. Seriously, from the very first steps, you should learn how to use the excellent JUnit library and write tests for your programs. Moreover, you will definitely need it in your work. Unit testing your own code is a good practice for developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  #8. Forgetting to free resources
&lt;/h2&gt;

&lt;p&gt;Every time your program opens a file or sets a network connection, you need to free up the resources it uses. It is also true for cases of exceptions when working with resources. Of course, FileInputStream has a finalizer that calls the close() method to collect garbage. However, you can’t be sure about the beginning of the build cycle. Thus, there is a risk that the input stream may consume resources indefinitely.&lt;/p&gt;

&lt;p&gt;The problem for beginners is that not freeing resources does not lead to compile-time or run-time errors. So it’s easy to forget about it. Let’s give an example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private void populateConfigs(Path propertiesPath) throws IOException {
    assert propertiesPath != null;
    DirectoryStream&amp;lt;Path&amp;gt; directoryStream = Files.newDirectoryStream(propertiesPath, "*.properties");
    for (Path entry : directoryStream) {
        Properties properties = new Properties();
        properties.load(Files.newBufferedReader(entry));
        validateAndSave(properties);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The program works, but we’ll better do it the right way. Let’s close the resource as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private void populateConfigs(Path propertiesPath) throws IOException {

    assert propertiesPath != null;

    try (DirectoryStream&amp;lt;Path&amp;gt; directoryStream = Files.newDirectoryStream(propertiesPath, "*.properties")) {

        for (Path entry : directoryStream) {

            Properties properties = new Properties();

            properties.load(Files.newBufferedReader(entry));

            validateAndSave(properties);

        }

    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  #9. Equals and hashcode problems
&lt;/h2&gt;

&lt;p&gt;The Object class is the parent class for all Java objects. This class has methods equal() and hashCode (). The equals () method, as its name suggests, is used to simply check if two objects are equal. hashCode() method that allows you to get a unique integer number for a given object.&lt;/p&gt;

&lt;p&gt;Often newbies don’t feel like these methods need to be overridden for their objects.&lt;/p&gt;

&lt;p&gt;The default implementation of equals() method simply checks the two objects by reference to see if they are equivalent.&lt;/p&gt;

&lt;p&gt;For example, you need to compare two points on the coordinate plane, let’s try to override the equals method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Point {
    private int x;
    private int y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, without overriding the equals() method for the Point class, let’s try to compare the points. To do this, let’s create a PointDemo class and in it there are three points, two according to the logic of Cartesian coordinates — equal (with the same abscissa and ordinate) and the third, which differs from them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class PointDemo {
   public static void main(String[] args) {
       Point point1 = new Point(2, 3);
       Point point2 = new Point(2, 3);
       Point point3 = new Point(2, 5);

       if (point1.equals(point2))
           System.out.println("1 and 2 are equal");
       else
           System.out.println("1 and 2 are not equal");

       if (point1.equals(point3)) System.out.println("1 and 3 are equal");
       else System.out.println("1 and 3 are not equal");
   }
}
The output is: 
1 and 2 are not equal
1 and 3 are not equal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More often, a practicing beginner forgets not to override equals(), but to override it correctly. For example, they forget that the object can be null or that it needs to be checked for equivalence to itself. Let’s write the correct equals() method to compare two points on the plane:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public boolean equals(Object obj) {
        if (obj == null)   return false; // checking if the passed object is null
        if (obj == this)   return true; //checking if the passed object is equal to itself 
        if (obj.getClass() == this.getClass()) { // checking if the passed object has the same result of the getClass () method as the current one, on which the equals method was called
            Point point = (Point) obj;  // now we can definitely convert the passed object to type Point
            if (point.x == this.x &amp;amp;&amp;amp; point.y == this.y) // if the coordinates match, then return true, otherwise false
                return true;
        }
        return false;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if we run the main() method of the PointDemo() class we get the following result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 and 2 are equal
1 and 3 are not equal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  #10. Working with uninitialized objects
&lt;/h2&gt;

&lt;p&gt;This newbie mistake leads to a NullPointerEception that is thrown when they try to use an uninitialized object. Don’t be confused about declaring an object variable, this does not mean that it is initialized.&lt;/p&gt;

&lt;p&gt;So if you write something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private static String name;
    public static void main(String[] args) {
        System.out.println(name.length());
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you’ll get an exception when you try to call the length method because the name field is null. You should always initialize them before working with variables.&lt;/p&gt;

&lt;h2&gt;
  
  
  #11. Wrong work with Wrappers
&lt;/h2&gt;

&lt;p&gt;You need to be careful to remember that Wrapper classes such as Integer or Boolean are reference data types and the type of variable can be null. In this case, it is better to avoid operations in which null doesn’t work well.&lt;/p&gt;

&lt;p&gt;Often newbies work with uninitialized variables of type Integer or Boolean somewhere as with int or bool, which can cause NullPointerException errors. For example, if we have any Boolean s, which is Null by default, and they try to call it in some if (s), we will get an error.&lt;/p&gt;

&lt;p&gt;Also, autoboxing of variables of primitive types requires an exact match of the type of the original primitive — the type of the “wrapper class”. Attempting to autopack a variable of type byte into Short without first explicitly casting byte-&amp;gt; short will cause a compilation error.&lt;/p&gt;

&lt;p&gt;Here is an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static class Man {
        private String name;
        private Integer age;

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }
   public void setAge(Integer age) {
            this.age = age;
        } 
        public static void main(String[] args) {
            Man man = new Man();
            System.out.println(man.getAge());
        }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, when we run the main method, we will receive a NullPointerException error. This happens because we return int instead of Integer in the getAge getter. As we said before, int can’t be null and auto-unboxing occurs, in such cases you need to be careful and pay attention that the field is not null or the getAge method returns Integer.&lt;/p&gt;

&lt;h2&gt;
  
  
  #12. Work with asynchronous code
&lt;/h2&gt;

&lt;p&gt;Experts said that the most common mistakes among developers in general is dealing with asynchronous code (concurrency, threads, etc.).&lt;/p&gt;

&lt;p&gt;If in a real project it becomes necessary to work with code asynchronously, you don’t need to use low-level multithreaded programming. It could be beneficial for learning issues or some kind of experimentation. However in a real project this leads to unnecessary complexity and many potential errors. Therefore, when working with multithreading, it is better to use classes from the java.util.concurrent package or other ready-made third-party libraries (Guava, etc.)&lt;/p&gt;

&lt;p&gt;Here is an example of the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class MyTask implements Runnable {

    private int monitoringPeriod;
    private boolean active;

    @Override
    public void run() {
        // do work
    }

    public int getMonitoringPeriod() {
        return monitoringPeriod;
    }

    public void setMonitoringPeriod(int monitoringPeriod) {
        this.monitoringPeriod = monitoringPeriod;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }
}

public class Solution {

    public static void main(String[] args) {

        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(8);

        Collection&amp;lt;MyTask&amp;gt; tasks = generateTasks();

        for (MyTask task : tasks) {

            if (task.isActive()) {

               scheduler.scheduleWithFixedDelay(task, 0, task.getMonitoringPeriod(), TimeUnit.SECONDS);

            }

        }

    }

    private static Collection&amp;lt;MyTask&amp;gt; generateTasks() {

        Collection&amp;lt;MyTask&amp;gt; result = new HashSet&amp;lt;&amp;gt;();

        // tasks generation

        return result;

    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you try to do the same, but manually start the threads, you might end up with hard-to-read and difficult-to-maintain code. It’s also about the invention of the wheel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We tried to describe the most popular mistakes made by Java newbies, according to experts, experienced programmers. Many examples are intended in the article so that it is convenient for beginners to get rid of these errors as soon as possible.&lt;/p&gt;

&lt;p&gt;In fact, these are not really errors. These are certain stages of the practical use of the language, through which most of the beginning Java programmers go. Errors of the very first stage (for example, incorrect placement of curly braces or semicolons we will omit) and start with those that Java Trainee and Java Junior often do. Sure, it is advisable not to prolong this stage of “popular mistakes” for a long time. This is exactly what we wish you for in your Java developer way.&lt;/p&gt;

&lt;p&gt;First published on (JaxEnter)[&lt;a href="https://jaxenter.com/java-mistakes-174395.html"&gt;https://jaxenter.com/java-mistakes-174395.html&lt;/a&gt;].&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
    </item>
    <item>
      <title>15 Tips from Pro Developers for Programming Beginners</title>
      <dc:creator>Alex Yelenevych</dc:creator>
      <pubDate>Mon, 31 May 2021 15:05:08 +0000</pubDate>
      <link>https://dev.to/alexyelenevych/15-tips-from-pro-developers-for-programming-beginners-26h2</link>
      <guid>https://dev.to/alexyelenevych/15-tips-from-pro-developers-for-programming-beginners-26h2</guid>
      <description>&lt;p&gt;The global technology industry keeps growing at an incredible pace, seemingly unstoppable and immune to road bumps other economic sectors are suffering from. Even the mighty COVID-19 crisis didn’t manage to stop the soaring tech industry as it managed to grow in 2020 and is now on a &lt;a href="https://connect.comptia.org/content/research/it-industry-trends-analysis"&gt;path to reach $5 trillion by the end of 2021&lt;/a&gt;, which would indicate a 4.2% per year growth trend.&lt;/p&gt;

&lt;p&gt;As the tech market keeps expanding, its appetite for talent is growing as well. Tech businesses worldwide are hungry for qualified software engineers, and this increasing demand stimulates more and more people to learn to program and join the profession. It is estimated that today there are around &lt;a href="https://www.statista.com/statistics/627312/worldwide-developer-population/"&gt;24 million software developers around the world&lt;/a&gt;, and this number will grow to 28.7 million by 2024.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demand for software developers is accelerating
&lt;/h2&gt;

&lt;p&gt;People all around the world are choosing software development as their profession. In terms of growth in the number of software developers, the Asia Pacific region shows the strongest development, which is mainly attributed to countries like China and India. China is the top nation for annual developer population growth, while India’s pool of programmers is expected to overtake the United States by 2023.&lt;/p&gt;

&lt;p&gt;But even this will not be enough, as the number of jobs in the tech industry is growing faster than the developer population. The U.S. Bureau of Labor Statistics projected that the number of jobs in computer and information technology occupations in the U.S. would grow &lt;a href="https://www.bls.gov/ooh/computer-and-information-technology/home.htm#:~:text=Employment%20in%20computer%20and%20information,add%20about%20531%2C200%20new%20jobs."&gt;11 percent from 2019 to 2029&lt;/a&gt;, much faster than the average for all occupations.&lt;/p&gt;

&lt;p&gt;When rising demand outstrips the growth of the developer population, it makes a great employee market. So it’s no wonder so many people today are already learning how to code or just considering this career path for the future. But as much as can be done to make this knowledge easy and accessible, software development is a demanding discipline. It is typical for beginners to hit multiple road bumps on the way to becoming professional software developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  15 programming tips that you might benefit from
&lt;/h2&gt;

&lt;p&gt;Recently we at &lt;a href="http://codegym.cc/"&gt;CodeGym.cc&lt;/a&gt; conducted a survey of well-known software development experts and industry influencers, asking them to share the most valuable advice and guidance they can give to programming beginners. I compiled this list of the most essential and valuable recommendations for coding beginners based on what they have told me.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Practice is the key
&lt;/h3&gt;

&lt;p&gt;It should come as no surprise that number one advice from most of the experts I surveyed was to practice as much as possible. All the best and proven online programming courses are practice-focused, as this is the way to teach people how to code with utmost effectiveness.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K1MLcHwx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trjaqbcc7538p278okij.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K1MLcHwx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trjaqbcc7538p278okij.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Practice writing code as much as possible. Do all codelabs and tutorials you can find,” recommends &lt;a href="https://twitter.com/ErikHellman"&gt;Erik Hellman&lt;/a&gt;, mobile programming expert and the author of ‘Android Programming: Pushing the Limits.’&lt;/p&gt;

&lt;p&gt;&lt;a href="https://javarevisited.blogspot.com/"&gt;Javin Paul&lt;/a&gt;, a renowned Java blogger, has pretty much the same recommendation to give: “Code daily, read blogs and books, and do projects.”&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Don’t get trapped in theory-learning
&lt;/h3&gt;

&lt;p&gt;Learning theory is the second crucially important component of learning how to code after practicing. And even though the theory is important, beginners often make the mistake of devoting too much time and effort to reading tutorials without enough practice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--utwued6l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yiikzqq1nv3yw4z2bkyb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--utwued6l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yiikzqq1nv3yw4z2bkyb.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Try to avoid the tutorial trap. Doing structured courses and tutorials is obviously very useful at the beginning, but eventually, you must start building the real thing,” recommends &lt;a href="https://www.youtube.com/c/KarolinaSowinska/"&gt;Karolina Sowinska&lt;/a&gt;, an experienced software developer, and tech industry influencer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Join a community of developers
&lt;/h3&gt;

&lt;p&gt;Social communication is also an important factor in learning how to code. This is why it is highly recommended to find yourself a community of developers that you can join to ask questions, discuss programming-related topics and support each other. These communities can be both offline, which is always better for establishing personal relationships and contact with others, and online. Codegym, for instance, has a Java developers community, where our users can discuss everything about Java software development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hOpWVMcy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3u5mruh8ui7x78onki7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hOpWVMcy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3u5mruh8ui7x78onki7.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Programmers love to debate methodologies and trends. Is OOP dead? Are scripting languages the future? Is functional programming just cycling back to structured programming? A beginner should immerse themselves in the community associated with the language or environment they are working in. They should join user groups. A beginner needs to know the pulse of the industry. This year it’s functional programming and, much to my regret, untyped languages. Trends come and go, so the responsibility of every developer is to follow current trends and those on the horizon. They need to find an environment or group where they can be discussed,” explains &lt;a href="https://twitter.com/omniprof?ref=hackernoon.com"&gt;Ken Fogel&lt;/a&gt;, Java expert and Computer Science Technology Professor at Dawson College, Canada.&lt;/p&gt;

&lt;p&gt;“Find a community of developers where you feel comfortable asking questions. Don’t worry if you feel your question might be too simple. You’ll get past that quite soon,” adds Erik Hellman.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Learn to search for and find the solutions
&lt;/h3&gt;

&lt;p&gt;Being able to search and find solutions to your programming problems and ways to solve coding challenges is almost half the success when it comes to software development. Even if you are lacking technical knowledge or skills, searching can be that meta-skill that will get you through the difficulties of professional programming. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ym1U564Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rxysmg2p51ysbn9p05vf.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ym1U564Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rxysmg2p51ysbn9p05vf.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Many like to say that programmers are just professional googlers. I would take that as a compliment. How you use what you learn is what defines you as a professional rather than a duffer,” said Ken Fogel.&lt;/p&gt;

&lt;p&gt;Erik Hellman also thinks searching is the key: “Learn how to search for solutions. Even if you know the answer to something, google it and see what else comes up to compare.”&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Take the time to stop and celebrate a new milestone
&lt;/h3&gt;

&lt;p&gt;Even though to become a professional programmer, you will most likely have to push yourself pretty hard. You should also know when to let it go, relax and celebrate a new milestone in this journey, even if it isn’t a big one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w62acLdh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gi54dlup4ilug25k2qv1.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w62acLdh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gi54dlup4ilug25k2qv1.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At least, this is what &lt;a href="https://www.youtube.com/c/CodingTutorials360/?ref=hackernoon.com"&gt;Dylan Israel&lt;/a&gt;, a senior frontend engineer, coding mentor, and YouTube blogger, recommends to programming beginners. “The first piece of advice I would have is: celebrate your mini-milestones. When you learn something new, appreciate that you spent the time to learn something new; when you build something, appreciate that you built something and challenge yourself. Often we are so afraid that we want to be a hundred percent ready, and that’s a really poor attitude to have in our field because you are never going to know everything. You are never going to be a hundred percent ready. So be afraid and do it anyhow,” he told me.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Start applying for jobs and doing interviews early
&lt;/h3&gt;

&lt;p&gt;When it comes to applying for actual programming jobs and having job interviews, it makes sense to start doing that as early as possible, even if you don’t feel ready for it yet. The fact is, jobs for software developers always have a lot of requirements, and feeling a bit under-qualified when you are reading them is quite normal for beginners. But that shouldn’t stop you from actively trying to get them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SAFFfVKx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f13u2ihjpmwxi8wnk1my.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SAFFfVKx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f13u2ihjpmwxi8wnk1my.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“When you’re applying for a job, and you only meet about 50 percent of requirements, apply, see it start interviewing way earlier, get out of your comfort zone, be afraid and do it anyhow. This is something I want you to remember because that is the thing that will propel you faster. That’s the thing that will make you grow. More growth is challenging. It’s difficult, it’s stressful, but like anything else, when you grow, you get better, and you’ll be a better programmer in the long term,” said Dylan Israel.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Follow your passion more
&lt;/h3&gt;

&lt;p&gt;Another good piece of advice when it comes to applying for jobs in software development is to follow your interests and intuition instead of making choices based on current trends or a potential salary size. Being genuinely interested and passionate about what you do will be extremely helpful along the way, keeping your motivation high and giving you the strength to go on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VWW-KCDp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ijzole7diud8ho6p34n.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VWW-KCDp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ijzole7diud8ho6p34n.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“The most frequent advice I hear from experienced software developers is to follow your passion when it comes to choosing the direction in which you want to take your career. You’re going to spend a large proportion of your life working, so you want to make sure that this activity still lights you up and motivates you when things get tough. And you want to enjoy your day-to-day life in general, so take your time to identify the best pathway forward for you right now – don’t just follow the path that pays the best, for example. Follow your passions right now, don’t think of it as the final decision for the rest of your career though. The beauty of tech is that you can grow in different directions later and switch fields pretty easily as you gain experience,” recommends &lt;a href="https://www.codingblonde.com/?ref=hackernoon.com"&gt;Masha Zvereva&lt;/a&gt;, an entrepreneur and the founder of Coding Blonde blog.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Take time to learn fundamentals
&lt;/h3&gt;

&lt;p&gt;Even though the practice-first approach is highly advisable when it comes to learning how to code, you shouldn’t neglect fundamental knowledge and underestimate its importance. Knowing basic CS skills and disciplines, such as algorithms, computational thinking, data structures, and more will prove itself useful and help you advance faster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KR72_pMG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9dbdmbdobvszqww5lrhu.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KR72_pMG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9dbdmbdobvszqww5lrhu.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Our industry is constantly reinventing itself. We went from mainframes to pizza-style Intel servers to the cloud. We had bash scripts, continuous integration, and now GitHub actions. Investing time to understand the core concepts behind the technology we are using is crucial to stay relevant. Always aching to use the latest and greatest technology is not,” said &lt;a href="https://www.linkedin.com/in/markuseisele/?ref=hackernoon.com"&gt;Markus Eisele&lt;/a&gt;, a reputable Java expert and founder of JavaLand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCYSa_YLoJokZAwHhlwJntIA?ref=hackernoon.com"&gt;Vadim Savin&lt;/a&gt;, an experienced full-stack developer, and programming blogger has similar advice to give: “In times when there are more JavaScript frameworks than days in a year, it might be daunting to start learning and to know what exactly you should focus on. The &lt;a href="https://techacute.com/why-we-cling-to-the-smartphone/?ref=hackernoon.com"&gt;FOMO (fear of missing out)&lt;/a&gt; is there even when you are a senior. There is no way to know everything in our industry. Focus on the fundamentals first and make sure you have a solid base. These are skills like problem-solving, algorithms and data structures, etc. When you have solid fundamentals, it is going to be pretty easy to pick any new trend that there might be.”&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Learn several programming languages
&lt;/h3&gt;

&lt;p&gt;Besides learning the basics of computer science and other fundamental disciplines, it would be a good idea to invest time into learning several programming languages, as it will help you understand how they are different from each other.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NClCvTLt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ylpplvg7g3vsu7h8i9xk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NClCvTLt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ylpplvg7g3vsu7h8i9xk.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“While following the latest and greatest seems tempting, I think in the long run, those programmers who truly understand the basics will be in higher demand than the ones that followed marketing. This includes learning data structures and algorithms. No need to be an expert but also understanding them. Learn the relational model, normalization, SQL. Learn about programming paradigms, including imperative, object-oriented, functional programming. Learn a few different programming languages to appreciate the differences and ecosystems,” recommends &lt;a href="https://twitter.com/lukaseder?ref=hackernoon.com"&gt;Lukas Eder&lt;/a&gt;, renowned Java and SQL expert.&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Embrace communication
&lt;/h3&gt;

&lt;p&gt;Professional programming is almost always a team effort, so developing your communication skills and practicing them is also a part of the road to success.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xmbC-5Ok--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8thvbaeg2134fc4xirht.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xmbC-5Ok--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8thvbaeg2134fc4xirht.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is what Markus Eisele has to share with us on the matter: “The number one lesson I learned when I became a developer was to embrace a different communication style. I met many new people, some of them very senior and experienced, and as you might expect, I wasn’t exactly seen as a productive part of the team because I was still learning. Don’t let yourself down over experiences like this. Read a little about the &lt;a href="https://en.wikipedia.org/wiki/Four-sides_model?ref=hackernoon.com"&gt;four-sides model&lt;/a&gt; and always remember that the most important part of being a programmer is to create valuable business solutions and put them into source code. This is a team effort.”&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Learn to manage innovations and to change requirements
&lt;/h3&gt;

&lt;p&gt;And here is another valuable insight from Markus Eisele, advising beginners to get used to ever-changing trends and requirements in the software industry as they are unavoidable, focusing on key skills and fundamental knowledge instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2lRnwn76--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmv5ows95tht5xyhzo8d.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2lRnwn76--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmv5ows95tht5xyhzo8d.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Think about the functional and non-functional requirements that exist and map them to the technologies you think could be a good fit. Our toolbox grew massively over the last decade, and it will continue to do so. Learn to manage innovation and to change requirements as part of your technology portfolio,” he said.&lt;/p&gt;

&lt;h3&gt;
  
  
  12. Learn to plan your work
&lt;/h3&gt;

&lt;p&gt;Being able to think strategically and plan your work ahead is another important skill for a software developer. Experimenting and looking for new ways to solve existing problems is also a part of it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D4qcLGZs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rpk2x4ri9hl2olq2ogtt.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D4qcLGZs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rpk2x4ri9hl2olq2ogtt.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“I tell anyone who asks about being a programmer that this profession is akin to experimental science. If you enjoy learning how something works and if you like to run experiments to further your understanding, then you should consider becoming a programmer. You should also be an organizer of whatever work you do now. You need to be able to plan out your work before you start,” said Ken Fogel.&lt;/p&gt;

&lt;h3&gt;
  
  
  13. Prepare to learn all the time
&lt;/h3&gt;

&lt;p&gt;Another trait that makes a really good and successful software engineer is learning all the time throughout the career. So if you want to be one, better prepare yourself that learning will never stop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bZ-W_YF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5w6e99ci4rfb8om7bfij.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bZ-W_YF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5w6e99ci4rfb8om7bfij.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As Ken Fogel has put it, “Being a programmer means a lifelong commitment to learning. It is likely that every project you work on will require you to learn a new skill or technique.”&lt;/p&gt;

&lt;h3&gt;
  
  
  14. Stay consistent and don’t give up
&lt;/h3&gt;

&lt;p&gt;And of course, it is always good advice to view programming as a long journey because it is and it will take many steps, with all sorts of trouble and challenges along the way. And if you want to make it, you better stay consistent and don’t let road bumps stop you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V4OhLDH1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7czytd0o5yoaqkab63nq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V4OhLDH1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7czytd0o5yoaqkab63nq.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“This is a very broad industry, and it is very easy to get lost in the ocean of information and possibilities, so my advice is to look for something that you really like. That will help you to stay motivated and enjoy what you’re doing. You can make applications for medicine, music, art, science, sports, games, fitness, anything you can think of. You can change and affect other people’s lives with your work. You can earn a lot of money and become famous as a programmer, but you’ll have to be consistent because learning programming is a marathon, not a sprint. You didn’t learn to walk when you made your first step, and you didn’t learn to talk when you said your first word. The same applies to learning programming – stay consistent and don’t give up because of many – and there will be many – obstacles that you come across.” said &lt;a href="https://www.youtube.com/channel/UCl5-BV9aRaeDVohpE4sqJiQ/"&gt;Saldina Nurak&lt;/a&gt;, a software engineer and YouTube blogger.&lt;/p&gt;

&lt;h3&gt;
  
  
  15. Try to have fun along the way
&lt;/h3&gt;

&lt;p&gt;But even if it is difficult sometimes, no one said that software development should be a somber journey. There are many opportunities to enjoy it and have fun along the way, and you are strongly advised to do exactly that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jLn0F2CP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ywnplig8l4wt30rbjkbd.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jLn0F2CP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ywnplig8l4wt30rbjkbd.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Stay smart. Be proactive about the way you learn, and always try and make it fun. Keeping it fun will keep you motivated, and motivation builds success. Once you learn the fundamentals, it’s important to pick something you enjoy, whether it is frontend, backend, or, more specifically, a tech stack that you enjoy. Then explore all of it,” recommends &lt;a href="https://www.youtube.com/channel/UCG7EBd-JrRZehNv9e5m1fQQ?ref=hackernoon.com"&gt;Filip Grebowski&lt;/a&gt;, an experienced software engineer and the creator of popular programming tutorials on YouTube.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;These are fifteen fundamental recommendations that multiple experts found to be the most essential and valuable for programming beginners. You can use them as a set of strategic guidelines to becoming a professional software developer. And I hope that these tips will help you to avoid hurtful mistakes and unexpected traps along the way, making this journey easier and increasingly filled with excitement rather than struggle.&lt;/p&gt;

&lt;p&gt;Previously published at &lt;a href="https://techacute.com/15-programming-tips-beginners/"&gt;TechCute&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
