<?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: Vitaly Krenel</title>
    <description>The latest articles on DEV Community by Vitaly Krenel (@vitalykrenel).</description>
    <link>https://dev.to/vitalykrenel</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%2F225753%2F24a972d8-fe1e-419b-85bb-ae99a9493aee.png</url>
      <title>DEV Community: Vitaly Krenel</title>
      <link>https://dev.to/vitalykrenel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vitalykrenel"/>
    <language>en</language>
    <item>
      <title>Online ChatGPT-powered startups hackaton // coding not required</title>
      <dc:creator>Vitaly Krenel</dc:creator>
      <pubDate>Thu, 09 Feb 2023 10:43:58 +0000</pubDate>
      <link>https://dev.to/vitalykrenel/online-chatgpt-powered-startups-hackaton-coding-not-required-3109</link>
      <guid>https://dev.to/vitalykrenel/online-chatgpt-powered-startups-hackaton-coding-not-required-3109</guid>
      <description>&lt;p&gt;Hey folks! I'm looking for support to organize a ChatGPT-powered startups hackathon this or next weekend. &lt;/p&gt;

&lt;p&gt;💡 Hackathon idea so far&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;what&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;build a proof of concept for a problem with ChatGPT&lt;/strong&gt;. 24 hours for you to to come up with a proof of concept of a solution with #ChatGPT for an existing product or a new one. Proof of concept: a Notion paper, a zero-code app, or a bot — anything doable quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;who&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;anyone from startups and product companies&lt;/strong&gt;. Existing product managers, product-minded engineers, etc. Basically anyone who want to apply ChatGPT to product companies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;team or solo&lt;/strong&gt;. You can join together as a whole startup team or just by you-self to pit your wits and innovate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;coding skills not required&lt;/strong&gt;. Just desire to look for ideas or problems and to figure out how to apply ChatGPT to it&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;why&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;built a proof of concept blazingly fast&lt;/strong&gt;. You’ll come up with an AI-powered proof of concept to boost your product or may become a new startup or solution to sell to other companies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;prizes&lt;/strong&gt;. there will be nominations and winner will have prizes. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;intros with accelerators/VC&lt;/strong&gt;. I’m looking for ways to make intros with EU funds / accelerators. Already have 1 fund looking for expansion in EU region and considering exinsting startups for portfolio. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;fun &amp;amp; engaging&lt;/strong&gt;. Look for a solution together quickly — it's not a day to day job. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI literacy leveled up&lt;/strong&gt;. This new type of literacy often referred to as the "3rd literacy," is essential for anyone who wants to take advantage of the many benefits that AI has to offer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;where&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;online, Lisbon / London timezone. Time and date to be confirmed if I actually manage to start this 😄&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>chatgpt</category>
      <category>ai</category>
      <category>announce</category>
      <category>help</category>
    </item>
    <item>
      <title>Do you teach/mentor other people coding? Why?</title>
      <dc:creator>Vitaly Krenel</dc:creator>
      <pubDate>Mon, 14 Dec 2020 09:59:03 +0000</pubDate>
      <link>https://dev.to/vitalykrenel/do-you-teach-mentor-other-people-3e0e</link>
      <guid>https://dev.to/vitalykrenel/do-you-teach-mentor-other-people-3e0e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;If yes, then why do you do that?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hey folks! Being a quite diverse engineer, I decided to start intentionally mentor other aspiring devs 2.5 years ago.&lt;/p&gt;

&lt;p&gt;Recently, I asked myself a question: "Why do I do that?" and found myself having a lot of different answers.&lt;/p&gt;

&lt;p&gt;I decided to think it through to find out what is my motivation in this endeavor? Why do I mentor other developers? &lt;/p&gt;

&lt;p&gt;I took a few hours to think it over and found them quite helpful.&lt;/p&gt;

&lt;h2&gt;
  
  
  I settled on a few facts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I'm not doing it for profit&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;I'm not making a lot of money on this one or even enough money to sustain myself. &lt;/p&gt;

&lt;p&gt;I do not argue here, that mentoring can not be a profitable business or it shouldn't be. I don't have an opinion on this one as it's just not how I use mentoring.&lt;/p&gt;

&lt;p&gt;At the same time, I do think that it is okay to settle with your mentee on some payment. Especially, if you want to help them to discipline themselves. The amount should be reasonable for your mentee, rather than for you. &lt;/p&gt;

&lt;p&gt;I believe, people tend to take things more seriously when money gets involved.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mentoring challenges me to explain things clearly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Less experienced engineers ask sometimes quite straightforward questions. Which occasionally may touch some things, you don't know well or believe you know, but you don't know well enough.&lt;/p&gt;

&lt;p&gt;This is helpful to continue staying humble, even as you get more experience. It also teaches saying "I don't know" and forces you to brush up on the subjects you are not confident with.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connects me with new engineers I may work with in the future.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Someone said to me once: "All the rock stars have already been taken. We should grow our own ones inside".&lt;/p&gt;

&lt;p&gt;It was through the process of looking for new strong engineers for a project.&lt;/p&gt;

&lt;p&gt;The idea is that if you are skillful enough and mentor someone things you know, you are likely to teach them good practices, patterns, and tools you are using.&lt;/p&gt;

&lt;p&gt;If your mentees are working in some companies, they'll continue to evolve the practice you are using and validate them. Through just a couple of years, they'll build new knowledge on the fundament you've given.&lt;/p&gt;

&lt;p&gt;This will make these engineers you've mentored quite suitable to work with you (as they have similar preferences) and at the same time they will also see problems, you may not be aware of (as they validated your knowledge through other workplaces and tech teams).&lt;/p&gt;

&lt;p&gt;Hopefully, this will make the project you'll be working on together a bit better.&lt;/p&gt;

&lt;p&gt;Those were my thoughts. Can wait to hear from you - maybe I'll realize that I'm not the only one who thinks this way.&lt;/p&gt;

&lt;h3&gt;
  
  
  So what are your reasons to mentor other developers?
&lt;/h3&gt;

</description>
      <category>discuss</category>
      <category>mentoring</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Learning resources 📚 for understanding Javascript async nature 🔮</title>
      <dc:creator>Vitaly Krenel</dc:creator>
      <pubDate>Wed, 14 Oct 2020 19:19:50 +0000</pubDate>
      <link>https://dev.to/bandaworks/learning-resources-for-understanding-javascript-async-nature-2g7d</link>
      <guid>https://dev.to/bandaworks/learning-resources-for-understanding-javascript-async-nature-2g7d</guid>
      <description>&lt;p&gt;Over my mentoring practice, I often see the stage of learning, when an aspiring developer starts tackling the asynchronous nature of the Javascript.&lt;/p&gt;

&lt;p&gt;And over the last year, I've built a small, though an unbelievably helpful collection of resources for learning the asynchrony concepts and the concurrency model in JS well enough. &lt;/p&gt;

&lt;p&gt;It should be enough to let you work with asynchronous javascript in your day job (and demonstrate the knowledge in tech interviews before that).&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Specifically, this collection can be helpful in learning: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Promises, callbacks&lt;/li&gt;
&lt;li&gt;Event Loop model and queues &lt;/li&gt;
&lt;li&gt;async/await operators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not obvious as they might seem and sometimes may be difficult to crack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;🔮 &lt;a href="https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/async%20&amp;amp;%20performance/README.md#you-dont-know-js-async--performance" rel="noopener noreferrer"&gt;"Async &amp;amp; Performance" book&lt;/a&gt; from You Don't Know JS series by Kyle Simpson (aka. getify). Specifically, take a look at chapters 1,2, and 3.&lt;/p&gt;

&lt;p&gt;❗🏋  The book is relatively harder than other recommended resources, but it covers the whole theory behind asynchronous concepts in Javascript.&lt;/p&gt;

&lt;p&gt;If you are a junior javascript developer going through interviews, you should explore it, despite the difficulties - with that, you'll ace any async related questions on the interview and will impress the interviewing team.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🤞 &lt;a href="https://web.dev/promises/" rel="noopener noreferrer"&gt;"Javascript Promises: an introduction" by Jake Archibald&lt;/a&gt; -  great explanation of Promises, friendly and not shallow at the same time. &lt;/p&gt;

&lt;p&gt;There are many useful examples (but they take time to understand fully, sometimes) - and I recommend you to play around with them in a Codesandox so you really feel comfortable with them. &lt;/p&gt;

&lt;p&gt;By the way, the article author - Jake - posts quite friendly and interesting articles in general, so you might want to check out those later as well.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;➰ Talk &lt;a href="https://www.youtube.com/watch?v=8aGhZQkoFbQ" rel="noopener noreferrer"&gt;"What the heck is the event loop anyway?" by Philip Roberts&lt;/a&gt; - one of the best talks about Event Loop model which is what is the foundation of the concurrency in JS. It's a must-watch. The talk is both fun and enlightening.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;➿ Talk &lt;a href="https://www.youtube.com/watch?v=cCOL7MC4Pl0" rel="noopener noreferrer"&gt;"In The Loop - JSConf.Asia" by Jake Archibald&lt;/a&gt; (the author of promises introduction at the top) - it's related to the Philip Roberts talk, and is a great follow-up. &lt;/p&gt;

&lt;p&gt;On top of that, it covers aspects of the Event loop that are important to the actual understanding of Promises (which Philip Roberts didn't cover).&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🦄 &lt;a href="https://dev.to/lydiahallie/javascript-visualized-promises-async-await-5gke"&gt;"JavaScript Visualized: Promises &amp;amp; Async/Await" by  Lydia Hallie&lt;/a&gt; - this article should help you solidify the learnings so far.&lt;/p&gt;

&lt;p&gt;The visualizations there are especially helpful to keep your knowledge in the long-term. Those visual images not just ease the learning but also reinforce your memories in the brain, so you are less likely to forget.&lt;/p&gt;

&lt;p&gt;And it also covers &lt;code&gt;async / await&lt;/code&gt; concept - synchronous like syntax to write Promises-based code in a more straightforward way. &lt;code&gt;Async / await&lt;/code&gt; are essential tools for writing readable and maintainable logic based on Promises in modern projects. &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  In what order to learn using this collection?
&lt;/h2&gt;

&lt;p&gt;In the beginning, try to use the default order - as they go in the list above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But&lt;/strong&gt; if you find yourself struggling with the 1st item - as I said, it's relatively harder than other recommendations - use the alternative order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with the article series by Lydia Hallie:  5 &lt;/li&gt;
&lt;li&gt;Go through the 2nd to 4th items: 2, 3, 4&lt;/li&gt;
&lt;li&gt;After that come back to the 1st to deepen your knowledge and help yourself to ace the tech interviews 😉: 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why I don't use the alternative order as the default in my mentoring practice? It's easy: to challenge the mentee. &lt;/p&gt;

&lt;p&gt;The book "Async &amp;amp; Performance" really makes you go through the complex concepts that stay in the basement of JS asynchrony. If you can handle those - there will be fewer subjects in JS that will be able to make you break a sweat, that's for sure 🙂&lt;/p&gt;

&lt;p&gt;And so that's all, my friend. Hope these resources will help you on your Javascript learning path!&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;If you like these resources, you might also be interested in &lt;a href="https://twitter.com/bandaworks" rel="noopener noreferrer"&gt;BandaWorks&lt;/a&gt; twitter community.&lt;/p&gt;

&lt;p&gt;Every day we post valuable content for junior developers there, among those: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily advice to help you become a stronger developer&lt;/li&gt;
&lt;li&gt;Learning resources for web development&lt;/li&gt;
&lt;li&gt;Overview and our own thoughts on the development articles by other authors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1313829364103077890-325" src="https://platform.twitter.com/embed/Tweet.html?id=1313829364103077890"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1313829364103077890-325');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1313829364103077890&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/bandaworks" rel="noopener noreferrer"&gt;Join us&lt;/a&gt; if you are the same as we - focused on continuous improvement! 😉&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Job hunting 101 for junior developers</title>
      <dc:creator>Vitaly Krenel</dc:creator>
      <pubDate>Tue, 13 Oct 2020 21:56:04 +0000</pubDate>
      <link>https://dev.to/bandaworks/job-hunting-101-for-junior-developers-4p8l</link>
      <guid>https://dev.to/bandaworks/job-hunting-101-for-junior-developers-4p8l</guid>
      <description>&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@geerald?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Gerald Schömbs&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/shark?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;. Modified by Vitaly Krenel

&lt;p&gt;It's okay, Shark, I've got you covered.&lt;/p&gt;

&lt;p&gt;The job looking process can be split into 2 stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Preparation&lt;/li&gt;
&lt;li&gt;Job looking&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Preparation stage 👨‍🍳
&lt;/h2&gt;

&lt;p&gt;This is finishing part of your learning path on the way to junior position. Keep in mind, that the actual learning should never end, just you'll be investing some spare time to learning while having an official developer position. &lt;/p&gt;

&lt;p&gt;Usually, together with my mentees, we take around 2-4 weeks (rough estimation, it may vary, depending on your skills) and after that proceed to the job looking (and improving any weak side on demand, after getting feedback from a company).&lt;/p&gt;

&lt;h3&gt;
  
  
  During the preparation stage 🍳
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build your portfolio.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I usually suggest creating a website that features your strongest projects, but these days there's also a GitHub Profile option. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you choose to build your own portfolio website: &lt;a href="https://dev.to/emmabostian/how-to-build-a-great-technical-portfolio-53bb"&gt;https://dev.to/emmabostian/how-to-build-a-great-technical-portfolio-53bb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;For Github Profile, take a look: &lt;a href="https://dev.to/m0nica/how-to-create-a-github-profile-readme-1paj"&gt;https://dev.to/m0nica/how-to-create-a-github-profile-readme-1paj&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start exploring how the interview process looks like.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Find out questions and assignments that you can be asked to answer/solve during interviews.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I strongly recommend exploring the interview handbook during this step - it contains both typical questions (HTML, CSS, JS) and theory you need to know to answer them: &lt;a href="https://github.com/yangshun/front-end-interview-handbook"&gt;https://github.com/yangshun/front-end-interview-handbook&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;For more javascript specific questions, take a look at this collection &lt;a href="https://github.com/ganqqwerty/123-Essential-JavaScript-Interview-Questions"&gt;https://github.com/ganqqwerty/123-Essential-JavaScript-Interview-Questions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Don't forget to practice coding challenges. There's a bunch of resources Chris Choyer gathered here: &lt;a href="https://css-tricks.com/front-end-challenges/"&gt;https://css-tricks.com/front-end-challenges/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I suggest you spend invest some time practicing CSS challenges, as an addition to JS-specific problems. &lt;/p&gt;

&lt;p&gt;This way, you will less likely to struggle if interviewers ask you to stretch elements over the screen or position one small block inside a scrollable container.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set up your profiles on job searching platforms and LinkedIn.&lt;/strong&gt; It increases your visibility for recruiters which may invite you to interviews if you match one of their posting descriptions. &lt;/p&gt;

&lt;p&gt;I do not recommend counting on this strongly, but it may provide few opportunities to get an interview, so it's definitely worth considering the time required to set up accounts there (spoiler: it's not that long 😁).&lt;br&gt;
 &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  2. Job looking stage 🕵️‍♀️
&lt;/h2&gt;

&lt;h4&gt;
  
  
  It takes time
&lt;/h4&gt;

&lt;p&gt;Be ready to persist for 1-2 months if you intend to get an offer tailored for you — this stage is truly about patience and persistence.&lt;/p&gt;

&lt;p&gt;If you hurry too much, you may end up getting an offer in a team you don't want to work with or deal with the projects you aren't thrilled about. &lt;/p&gt;

&lt;h4&gt;
  
  
  Carefully assess the terms
&lt;/h4&gt;

&lt;p&gt;On top of that, employers are often offering you less than you are really worth, as they imply you don't have much experience as thus they will be taking on more risks than with a regular developer.&lt;/p&gt;

&lt;p&gt;While this is true, you still need to assess carefully whether the company offers you a reasonable payroll: it's an investment for them.&lt;/p&gt;

&lt;p&gt;It for sure has risks, but the return on investment may be much quite impressive as well, especially if you are diligent, hardworking, and focused on continuous learning (which, I believe, you are! 🙂).&lt;/p&gt;

&lt;h4&gt;
  
  
  Wait for a few offers to choose from
&lt;/h4&gt;

&lt;p&gt;So, instead of agreeing immediately to the first offer you get, I usually recommend reaching the point when you have a few ones (at least 2-3). &lt;/p&gt;

&lt;p&gt;With that, you will not feel like the job terms were forced on you: you'll be the one choosing and you could also negotiate a little bit as you have a few offers and you will be able to have a more reasonable career start (both financially and professionally).&lt;/p&gt;

&lt;p&gt;But please, don't leverage the company just for the sake of money - if you feel the terms are reasonable enough, don't squeeze from the hiring team a few extra bucks. &lt;/p&gt;

&lt;p&gt;It's wiser to start in good faith and discuss the raise after getting on board when you'll prove your hard work and determination. 😉&lt;/p&gt;

&lt;h3&gt;
  
  
  During the job looking stage 👀
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Everyday screen for job offers on the market and send at least 3 replies&lt;/strong&gt; (the more the better, but send at least 3). &lt;/p&gt;

&lt;p&gt;Why? Because many of your job applications may be easily ignored or declined with a typical message. &lt;/p&gt;

&lt;p&gt;Take a look at the numbers from one of the bootcamp graduates' article: &lt;a href="https://www.freecodecamp.org/news/5-key-learnings-from-the-post-bootcamp-job-search-9a07468d2331/"&gt;https://www.freecodecamp.org/news/5-key-learnings-from-the-post-bootcamp-job-search-9a07468d2331/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is really an important thought to keep in mind so you don't discourage yourself. &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Google Spreadsheet to keep track of all the job postings you applied to.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Store all relevant information there: your thoughts about the company, current status, and so on. It is easy to lose track of them when you reach just 10-15, not speaking of 200 😅&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for companies that are hiring using the job searching platforms, like indeed.com, Glassdoor, and definitely, LinkedIn - a lot of HRs and companies post job offers there.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, take a look at your country's local platforms if there any. For example, in Russia, we heavily rely on hh.ru and I believe in many non-English countries there are also local job search platforms that have a huge market share.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Target a company, not a vacancy.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Look for the information on the company you are applying for and craft a tailored response showing you are actually interested in the company. A few examples of things you might be interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What products company has built?&lt;/li&gt;
&lt;li&gt;What product do you like the most?&lt;/li&gt;
&lt;li&gt;Did the company participate in meetups or confs? Are there any interesting talks for you?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine a situation, when you were researching all that and found that one of your personal projects in the portfolio is similar to one of the company's projects - you should share that when applying. That's exactly how you should use this information. &lt;/p&gt;

&lt;p&gt;Show that you have the relevant experience, can quickly get into the work, and bring fresh thoughts to the product(s) there.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Find real people behind the company.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Instead of (or on top of) straightforwardly applying through job postings on those platforms, find real people that work in the company. Devs, HRs, even CEO - doesn't matter. &lt;/p&gt;

&lt;p&gt;Many companies reward their employees when they bring new people on board, so if you reach out to someone real from the company, you have a higher chance to get an invite to an interview 😉&lt;/p&gt;

&lt;p&gt;It's also that the job posting is managed by an external head hunter that goes over dozens of job applications. If you go to a person from the company, you'll have more chances to grab their attention as they do not deal with that many candidates on a daily basis.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continue practicing.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Specifically, make more projects that showcase your skills.  &lt;/p&gt;

&lt;p&gt;It's much easier to grab a team's attention and to start wanting you onboard when you actually have a relatively complex project that is relying on a modern stack - even better if the tech stack is the same as the one used in that exact team. &lt;/p&gt;

&lt;p&gt;For example, a React project that relies on &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Redux Toolkit/MobX for store management, &lt;/li&gt;
&lt;li&gt;React-router for routing, &lt;/li&gt;
&lt;li&gt;Styled Components as CSS-in-JS solution, &lt;/li&gt;
&lt;li&gt;Integrated with Firebase Cloud Firestore storing the data&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deployed on Netlify or Heroku &lt;/p&gt;

&lt;p&gt;is a good showcase that proves that you can use production-ready tools for building something relatively complex. &lt;/p&gt;

&lt;p&gt;It proves that you have real experience with frontend tools and can solve technical problems using them.&lt;/p&gt;

&lt;p&gt;Moreover, in such a project the team looking for a teammate will be to assess your architecture skills, design patterns, find what coding principles you follow (and what you yet ignore), how you approach testing, and many other relevant aspects.&lt;/p&gt;

&lt;p&gt;Basic applications won't suffice. They don't let you shine, they merely prove you have programming skills and development expertise - but that's not enough. &lt;/p&gt;

&lt;p&gt;You need to make them feel you have reliable hard skills - you are not an expert yet, but do not need your colleagues full-time teaching you. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;By the way, if you don't have any strong projects yet, take a look at &lt;a href="https://banda.works/housework-undoer"&gt;Housework Undoer&lt;/a&gt; - it's a complex project that is inspired by our development experience.&lt;/p&gt;

&lt;p&gt;It's story-based, so you'll be not just practicing how to code, but also practicing how to think about the product and its users in the first place. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  So, what the interview is really all about?
&lt;/h3&gt;

&lt;p&gt;That's an important question. If you think wrongly about interviews, you won't use a proper strategy.&lt;/p&gt;

&lt;p&gt;Always remember: &lt;strong&gt;the interview is not about finding the almighty-problem-solver — it is about finding a reasonable teammate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams are looking for a person that can reason about the problems clearly, investigate them, and can either figure out how to solve those or openly discuss the issues with the team.&lt;/p&gt;

&lt;p&gt;Because of that, you need to show how you think, approach and react to problems.&lt;/p&gt;

&lt;p&gt;So show that: during challenges, talk and explain what are you thinking about, why it is relevant, how you could try dealing with the suggested problem, what caveats do you see, which person you would consult on the question, and so on.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;And that's it with job hunting 101. Hope this guide will help with the challenge of finding a suitable developer position.&lt;/p&gt;

&lt;p&gt;Ganbatte, my friend, and you'll get a great job offer!&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;If you like our articles, subscribe to our &lt;a href="https://twitter.com/BandaWorks/"&gt;@BandaWorks&lt;/a&gt; community on Twitter so you don't miss the next ones 😉 &lt;/p&gt;

&lt;p&gt;On top of our article announcements, we post valuable content there every day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily advice to help you become a stronger developer&lt;/li&gt;
&lt;li&gt;Learning resources for web development&lt;/li&gt;
&lt;li&gt;Overview and our own thoughts on the development articles by other authors&lt;/li&gt;
&lt;/ul&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--QkLRYSMG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1300371917568909317/zUbXHKRk_normal.png" alt="Banda Works profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Banda Works
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @bandaworks
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      &lt;a href="https://twitter.com/hashtag/BandaDaily"&gt;#BandaDaily&lt;/a&gt; #1:&lt;br&gt;&lt;br&gt;When &lt;a href="https://twitter.com/hashtag/coding"&gt;#coding&lt;/a&gt; something, always approach the problem iteratively.&lt;br&gt;&lt;br&gt;That means that as &lt;a href="https://twitter.com/hashtag/developer"&gt;#developer&lt;/a&gt; you go through roughly 5 stages:&lt;br&gt;&lt;br&gt;1. Make a straightforward solution &lt;br&gt;2. Cover edge cases&lt;br&gt;3. Improve the performance&lt;br&gt;4. Improve the design&lt;br&gt;5. Reduce complexity&lt;br&gt;&lt;br&gt;🧵👇
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      13:11 PM - 07 Oct 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1313829364103077890" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1313829364103077890" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      2
      &lt;a href="https://twitter.com/intent/like?tweet_id=1313829364103077890" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      4
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


</description>
      <category>career</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Housework Undoer — a meaningful challenge for aspiring junior developers</title>
      <dc:creator>Vitaly Krenel</dc:creator>
      <pubDate>Sat, 10 Oct 2020 18:48:35 +0000</pubDate>
      <link>https://dev.to/bandaworks/housework-undoer-a-meaningful-challenge-for-aspiring-junior-developers-3gfg</link>
      <guid>https://dev.to/bandaworks/housework-undoer-a-meaningful-challenge-for-aspiring-junior-developers-3gfg</guid>
      <description>&lt;p&gt;Do you remember, the time one of your friends asked you to build a website? What were your feelings? &lt;/p&gt;

&lt;p&gt;Chances are you were excited, as you knew that you would be creating something, not for the sake of practice, but to bring value to someone else. To help someone.&lt;/p&gt;

&lt;p&gt;Your work at that time had a context. You knew why you are doing it, you knew the reasoning behind the project, the problem.&lt;/p&gt;

&lt;p&gt;Have you ever noticed, that is the exact missing piece with most of the project ideas out there on the internet? &lt;/p&gt;

&lt;p&gt;They often are sophisticated, technology-savvy, and full of design delights. But at the same time, they lack context for the project. &lt;/p&gt;

&lt;p&gt;They lack a concrete user problem — which is the exact reason why some projects may be built in the real world!&lt;/p&gt;

&lt;p&gt;You may argue, that you are doing that project to practice engineering - why do you need to know all that stuff in such a case?&lt;/p&gt;

&lt;p&gt;You are right. But now I'm not surprised why many companies devalue personal projects in juniors' portfolios and focus on looking for those that have actual work experience instead.&lt;/p&gt;

&lt;p&gt;Because while you were working on those projects you were just practicing, not concerned with anything in mind, but the code.&lt;/p&gt;

&lt;p&gt;At BandaWorks we like meaningful work. We value helping our community. And we are passionate about professional growth.&lt;/p&gt;

&lt;p&gt;These three were the reason why decided to create our own project. &lt;/p&gt;

&lt;p&gt;It's called &lt;strong&gt;Housework Undoer&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  So, what is Housework Undoer?
&lt;/h2&gt;

&lt;p&gt;Well, it's a project (your captain 😉). More specifically, it's a self-paced challenge split into multiple tasks through which you'll have to build a frontend application using your framework (React, Vue, Angular or Svelte).&lt;/p&gt;

&lt;p&gt;Tasks define what you need to build, why, but not how. &lt;/p&gt;

&lt;p&gt;Each one has a structure quite similar to the one used by development teams. They all include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User story&lt;/li&gt;
&lt;li&gt;Design mockup&lt;/li&gt;
&lt;li&gt;Jack's comments&lt;/li&gt;
&lt;li&gt;Acceptance criteria&lt;/li&gt;
&lt;li&gt;Yoda's tips&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Some of these might be new concepts to you, but as those are used by development teams, we decided to adopt them, even though you may not be comfortable with them in the beginning.&lt;/p&gt;

&lt;p&gt;To flatten the learning curve, we prepared a quick introduction that should help you get a basic understanding of these concepts:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/9lsL3oRKZaM"&gt;
&lt;/iframe&gt;
&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;Housework Undoer is made in a way to let you'll get a similar experience while working on the project that we've been getting through our development careers.&lt;/p&gt;

&lt;p&gt;You'll work in the development workflow that is strongly inspired by the development process in tech teams.&lt;/p&gt;

&lt;p&gt;And as there's a context, it will truly make your work more meaningful, fun and entertaining while still teaching you how to think about your users first. &lt;/p&gt;
&lt;h2&gt;
  
  
  Technical stack
&lt;/h2&gt;

&lt;p&gt;To complete the project you would need to use your UI framework of choice. &lt;/p&gt;

&lt;p&gt;Of course, there's nothing stopping you from implementing using plain JS, but in the real world, it would be unsustainable.&lt;/p&gt;

&lt;p&gt;So we recommend a few stacks, but you may complete the project in your framework if didn't include it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;Angular&lt;/li&gt;
&lt;li&gt;Svelte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But to complete the project, you most likely will need to pick a few more packages on your own: routing, state management, testing, CSS-in-JS solution (or alternatively use a preprocessor), etc.&lt;/p&gt;

&lt;p&gt;These will be left in your hands as you are the code owner of the project — you make the decisions there which later will affect how you build the project.&lt;/p&gt;
&lt;h3&gt;
  
  
  What if I want my own backend?
&lt;/h3&gt;

&lt;p&gt;The project assumes usage of Firebase as a backend. But there's nothing that stops you from making your own backend, let's say using Laravel (PHP) or Ruby on Rails (Ruby).&lt;/p&gt;

&lt;p&gt;There will be a few tasks where you'll need to integrate your project with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://firebase.google.com/products/auth" rel="noopener noreferrer"&gt;Authentication&lt;/a&gt; to provide a sign-in for your users&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://firebase.google.com/products/firestore" rel="noopener noreferrer"&gt;Cloud Firestore&lt;/a&gt; - persistency, i.e. storing data in the database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only keep in mind, that at the time of writing "Yoda's tips" are providing only recommendations and insights on how to improve for frontend (but we may add backend later if there's some interest 🤓).&lt;/p&gt;
&lt;h2&gt;
  
  
  Skills requirements
&lt;/h2&gt;

&lt;p&gt;There are 2 basic requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Be confident in your skills with plain technologies like HTML, CSS, and JS. You need to use Git in your daily work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be familiar with one of the UI frameworks (Vue, React, Svelte, etc.) or be ready to put the hard work and learn it on the way.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you don't match these, we recommend you wait and not work on the project right now: the difficulty may result in frustration which will kill the learning process. &lt;/p&gt;

&lt;p&gt;Instead, continue learning and practice over a few small projects and after those get back to the Housework Undoer.&lt;/p&gt;

&lt;p&gt;This way, you'll get more valuable experience from the project and will have only the necessary amount of frustration 😉&lt;/p&gt;
&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;
&lt;h3&gt;
  
  
  How to start?
&lt;/h3&gt;

&lt;p&gt;There're 2 options to start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A.&lt;/strong&gt; If you are not ready to set up a project locally and just want to give it a try, use one of our Codesandbox templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;B.&lt;/strong&gt; If you already have decided, fork our starting repository on Github and follow our instruction for your framework&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;To pick either one, &lt;a href="https://banda.works/housework-undoer/getting-started" rel="noopener noreferrer"&gt;go to the Getting Started page straight away&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  What if I get stuck or need help during the project?
&lt;/h3&gt;

&lt;p&gt;It's easy: tweet your question with &lt;a href="https://twitter.com/intent/tweet?text=%3CYou%20are%20part%20of%20@BandaWorks%20and%20Banda%20helps%20every%20fellow%20member.%20What%20can%20we%20help%20you%20with?%3E&amp;amp;hashtags=BandaHelps" rel="noopener noreferrer"&gt;#BandaHelps&lt;/a&gt; and your Banda will be right there to help.&lt;/p&gt;
&lt;h3&gt;
  
  
  What to do when I'm done with the project
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First of all, post the link to your repository with @BandaWorks mention on Twitter - we will definitely take a look and may even bring you a few thoughts on how to improve your code!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And don't forget to add the project to your portfolio - it will be a great addition showcasing your development skills to potential employers 😉&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Are there any code review or mentoring on the project?
&lt;/h3&gt;

&lt;p&gt;Right now, we do not provide mentoring on the project, but we offer the code review of your project when you complete it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Where to send my feedback?
&lt;/h3&gt;

&lt;p&gt;If you have any thoughts for us to improve, please send them to us. &lt;/p&gt;

&lt;p&gt;The easiest way would be to use our &lt;a href="https://banda.works/feedback" rel="noopener noreferrer"&gt;feedback form&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But you could use other ways instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Post your thoughts right on Twitter with @BandaWorks mention - this way more people will be able to see your thoughts and this will help us improve even more. Even if the feedback is negative. We strongly respect transparency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can also reach us using our email: &lt;a href="mailto:team@banda.works"&gt;team@banda.works&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Subscribe to our twitter community &lt;a href="https://twitter.com/BandaWorks/" rel="noopener noreferrer"&gt;@BandaWorks&lt;/a&gt; and stay notified on Housework Undoer updates and future project announcements!&lt;/p&gt;

&lt;p&gt;We also post valuable content there: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Daily advice to help you become a stronger developer &lt;/li&gt;
&lt;li&gt;Recommendations and thoughts on development articles by other authors&lt;/li&gt;
&lt;li&gt;Our own articles announcements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1313829364103077890-465" src="https://platform.twitter.com/embed/Tweet.html?id=1313829364103077890"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1313829364103077890-465');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1313829364103077890&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Thank you for your time and have a productive day! 😎&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>challenge</category>
      <category>javascript</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>Principles for a junior developer to succeed in your first development team</title>
      <dc:creator>Vitaly Krenel</dc:creator>
      <pubDate>Wed, 23 Sep 2020 11:19:25 +0000</pubDate>
      <link>https://dev.to/bandaworks/principles-for-a-junior-developer-to-succeed-in-your-first-development-team-5556</link>
      <guid>https://dev.to/bandaworks/principles-for-a-junior-developer-to-succeed-in-your-first-development-team-5556</guid>
      <description>&lt;p&gt;While sitting in the deep nights behind the screen, practicing your craft, building projects, and learning new libraries, you were putting your best into mastering technical skills. &lt;/p&gt;

&lt;p&gt;For sure, those skills are the primary pillar of the developer. The pillar that makes you a great engineer. &lt;/p&gt;

&lt;p&gt;It didn't make you a great team player though.&lt;/p&gt;

&lt;p&gt;To be a great team player means a lot of things. But probably the first one is to be reliable. &lt;/p&gt;

&lt;p&gt;Unfortunately, I've seen many engineers misunderstanding the idea of being "reliable" as being able to solve any technical problem alone.&lt;/p&gt;

&lt;p&gt;And that is exactly the opposite.&lt;/p&gt;

&lt;p&gt;Let me share two principles, that I've been advising junior developers to stick with during my mentoring practice. &lt;/p&gt;

&lt;p&gt;You may find many other principles, but these are a good starting point to make you a little bit better team player. &lt;/p&gt;

&lt;p&gt;Which is what will help you to succeed in your first (and all next) developer job.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Principle #1: don't listen to your ego — talk to your team
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgf2ic7j125mhcky34e2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgf2ic7j125mhcky34e2e.png" alt="Shoot from Star Trek 2009 movie: Captain Kirk and his team are concerned and thinking about something"&gt;&lt;/a&gt;&lt;/p&gt;
You and your team trying to find solution together



&lt;p&gt;Let's say, you got through the onboarding process in your first tech company, started your first task. You created a PR and got approved by your colleagues. &lt;/p&gt;

&lt;p&gt;Enjoyed your first lunch with the team. Maybe got in love with a cool QA girl (or a boy) along the line. 😉&lt;/p&gt;

&lt;p&gt;In the next few weeks, you were successfully closing tickets, finishing tasks with confidence. Had a few One-on-Ones with your manager or team lead. &lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;em&gt;Team lead&lt;/em&gt;&lt;br&gt;
— The team likes you. We believe you are really competent - you solved all the problems without much intervention from your mentor. On top of that, you have a great personality, I believe you are a great match for the team.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You&lt;/em&gt;&lt;br&gt;
— I'm glad to hear that! Thanks!&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
Finally, feeling proud, you start taking on more challenging tasks. And here you stumbled upon a hidden issue.&lt;/p&gt;

&lt;p&gt;During the ticket, you discovered a problem you can't figure out how to solve. You going through it that day. The next day at the morning meeting, you say that "I encountered an issue, but I should be able to solve it today and continue with the rest of the task". Well, how could you not?&lt;/p&gt;

&lt;p&gt;You tried again but couldn't crack it. &lt;/p&gt;

&lt;p&gt;Maybe you found a probable solution, maybe you didn't. But the second day is getting to the end and there's still no clear progress on the task. &lt;/p&gt;

&lt;p&gt;Let's stop here for now, as tomorrow you can just as easily say "I'm almost finished" again.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;The problem in the exaggerated example above lies in your ego. Don't get offended, we all have that.&lt;/p&gt;

&lt;p&gt;Well, it is your first developer job after all. You've finally got appreciated for the efforts you've put so far! For sure, you want to meet the expectations of your teammates. &lt;/p&gt;

&lt;p&gt;At the same time, you likely want to have a successful career with rapid professional growth that shatters the assumptions about career advancement.&lt;/p&gt;

&lt;p&gt;There's nothing wrong with those thoughts. But let them overrule you and you end up losing the ability to think critically in that situation. And we've seen what happens if you lose that ability: you won't ask for advice and instead, you will deal with the problem on your own.&lt;/p&gt;

&lt;p&gt;But the thing is, if you care about not losing the credibility and actually proving that you are exactly who the team believes you are, you need to do exactly the opposite — you need to solve the problem together with your team.&lt;/p&gt;

&lt;p&gt;Speaking from a business perspective, when you do not have a huge piece of responsibility for a product, if you take 3 days to build a feature instead of 1, you will not cause any harm — or at least any unsustainable harm that may make people think you are not right for the job. &lt;/p&gt;

&lt;p&gt;Instead, you will show that in front of a challenge, you don't speak - you wait, hide, and play solo. Not a kind of team player anyone wants.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
Notice, that we do not talk where is the team lead or your senior colleagues and why they do not intervene. We talk about your responsibility here as a team member. &lt;/p&gt;

&lt;p&gt;You have to be reliable. &lt;/p&gt;

&lt;p&gt; &lt;br&gt;
Being reliable means that you address any problem head-on, transparently discussing an issue and sharing your thoughts, especially if you are not sure how to solve the issue.&lt;/p&gt;

&lt;p&gt;The takeaway: try as hard as you can to ignore the ego and always go and talk to your team. Tell about a problem, ask advice or start a discussion — anything to make it clear that you encountered some issue and not sure how to deal with it efficiently. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffrescmb1zwjvmn8mcr4a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffrescmb1zwjvmn8mcr4a.png" alt="Quote by Rutherford B. Hayes that says "&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Don't get yourself to be blindsided by the feeling that asking for help will belittle your professionalism in the eyes of others. It won't.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Principle #2: Be braver — say (nonsense) aloud
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmxwcqk4txamf0zkkvrkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmxwcqk4txamf0zkkvrkz.png" alt="Man standing in front of the group of other men and showing proof of concept"&gt;&lt;/a&gt;&lt;/p&gt;
Share your idea, even if it seems to look like this weird thing



&lt;p&gt;The second principle is closely related to the first one.&lt;/p&gt;

&lt;p&gt;Being part of the team also means taking a part in team meetings. Those may be brainstorm sessions, tech discussion, product meetings — as they say, meetings for everyone on the house!&lt;/p&gt;

&lt;p&gt;Those meetings may be barely 3 people in one place or a room full of different specialists. No matter where you are, you might get afraid of sharing something as you don't want to end up saying a silly thing instead of the next brilliant idea.&lt;/p&gt;

&lt;p&gt;Unfortunately for you, I'm about to say something you might not like: when you have an idea, a thought, or a feeling — even if it seems bold or unusual — say it aloud. &lt;/p&gt;

&lt;p&gt;Yes, you may find yourself saying something obvious, inaccurate or even ignorant. If that's the case, people will say what's the issue with your suggestion and will move to the next thought. &lt;/p&gt;

&lt;p&gt;They may do it roughly or more professionally, explaining what's the issue with the suggestion, but they will.&lt;/p&gt;

&lt;p&gt;No matter how they do it, you end up learning about your product or technology a little bit more. And what's even more important, the chances of you bringing a meaningful and valuable opinion to this and future discussions have increased. That's super great!&lt;/p&gt;

&lt;p&gt;Moreover, your thoughts do not have to miss the target all the time — and they actually will not.&lt;/p&gt;

&lt;p&gt;First of all, you have fresh, bold, and full of raw potential mind of a junior engineer — this something companies are stacking on. This mind enables you to see the problem, without being restricted by knowledge of subtle nuances and tangled technical details of the product or technology. &lt;/p&gt;

&lt;p&gt;You are looking at the "naked" problem, so to speak. It doesn't only mean that you are unaware of edge cases — it also means you are not limited by them.&lt;/p&gt;

&lt;p&gt;And finally, you are closer to the user of the product so far than any more experienced engineer: they have been working in the tech field for quite a while and are super biased. Yes, you're biased too. But immensely less than anybody else. 😉&lt;/p&gt;

&lt;p&gt;So my takeaway here: Don't hold on yourself back - speak up your mind, even if you think your idea might be nonsense. The more you do that, the more valuable ideas you bring to your team and your company. &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;To shine in the workplace, especially in your first tech team, don't just bury your head in the code.&lt;/p&gt;

&lt;p&gt;1. Look out for your team, talk with your colleagues and, when in trouble, ask for help — it does not make you unworthy of your job, it makes you a more mature and reliable engineer which knows how to control his or her ego (which we all have after all, but not all know how to control).&lt;/p&gt;

&lt;p&gt;2. When participating in discussions and meetings (product and technical ones) be brave enough to share your thoughts, no matter how silly they seem. Firstly, you may find yourself sharing an idea which another team member may iterate on and improve it. And secondly, with each thought you share, you are making yourself better through feedback, by learning the product and tools behind it. &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;There's one more primary principle that I usually explain and advise to stick with — take on responsibility proactively. But I'm intending to share it in a separate article.&lt;/p&gt;

&lt;p&gt;In the meanwhile, I invite you to share your own principles, rules, or advice that a junior developer should keep in mind to become a great engineer and a reliable team member. &lt;/p&gt;




&lt;p&gt;I also want to share a project that I and my partner have been working on for a while.&lt;/p&gt;

&lt;p&gt;We came up with a challenging project to help junior frontend developers that need to showcase their skills and want to build a portfolio to ease the problem of getting a job in the industry. &lt;/p&gt;

&lt;p&gt;You can check out it at &lt;a href="https://banda.works/housework-undoer" rel="noopener noreferrer"&gt;https://banda.works/housework-undoer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Houseworkd Undoer&lt;/strong&gt; is a project organized into separate tasks through which you will build a frontend app to help our (imaginary) friend Jack. &lt;/p&gt;

&lt;p&gt;We prepared a nice-looking design and a background story so we hope it should be enjoyable and interesting for you to build, while still providing enough challenges to display your skills to possible employers.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsch3s5qhau74ys51g1wo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsch3s5qhau74ys51g1wo.png" alt="Screens of Housework Undoer app"&gt;&lt;/a&gt;&lt;/p&gt;
Housework Undoer's app screens.



&lt;blockquote&gt;
&lt;p&gt;See this in &lt;a href="https://dev-to-uploads.s3.amazonaws.com/i/sch3s5qhau74ys51g1wo.png" rel="noopener noreferrer"&gt;full size&lt;/a&gt; for more details 😉&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt; &lt;br&gt;
To finish the project, you need some skills in one of the major frameworks/libraries (React, Vue, Svelte, Angular, etc.), though the project can be completed without any of those, just with plain JS (but keep in mind, employers usually expecting you to have knowledge and experience in one of those mainstream technologies).&lt;/p&gt;

&lt;p&gt;In the upcoming future, we want to create a few more projects, including backend and mobile related ones. But we could really use your help as well: if you try on the project, send us feedback, your thoughts, and questions. The project is completely free and we will really appreciate you spending a little bit of time to share with us your thoughts over &lt;a href="mailto:team@banda.works"&gt;team@banda.works&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;See you next time! 😉&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A few more techniques to help you become a self-taught developer</title>
      <dc:creator>Vitaly Krenel</dc:creator>
      <pubDate>Wed, 15 Jul 2020 13:16:16 +0000</pubDate>
      <link>https://dev.to/bandaworks/a-few-more-techniques-to-help-you-become-a-self-taught-developer-30mi</link>
      <guid>https://dev.to/bandaworks/a-few-more-techniques-to-help-you-become-a-self-taught-developer-30mi</guid>
      <description>Cover photo by &lt;a href="https://unsplash.com/@anniespratt?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Annie Spratt&lt;/a&gt; on &lt;a href="https://unsplash.com/@anniespratt?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Self-learning is the skill that changes people's futures. Sounds shocking, I know.&lt;/p&gt;

&lt;p&gt;But jokes aside, being able to consistently and rigorously learn a subject without strict supervision, in my opinion, one of the most helpful skills you can acquire.&lt;/p&gt;

&lt;p&gt;I always admired people who have been able to learn a language themselves, pick up the woodcraft, or learn how to play the piano. It seemed natural for them to stick with their activity for 8 hours straight without taking a break to eat something.&lt;/p&gt;

&lt;p&gt;Unfortunately, I was slightly different. From a young age, I was quite good at "switching activities" or, let's face it, at quitting. I tried swimming, painting, volleyball, athletics, dancing, electrical engineering, piano (and some other classes and courses that dropped after a few trials).&lt;/p&gt;

&lt;p&gt;Whatever course I'd take, I would usually quit it within 2 to 3 months. If I ask my parents, they most likely will admit that they were having bets on what date I would quit a new course.&lt;/p&gt;

&lt;p&gt;Imagine now how my self-learning looked like.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lzgna3kG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f0d1hkfw1zysnoco3mi0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lzgna3kG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f0d1hkfw1zysnoco3mi0.jpg" alt="Homer Simpson at his new job, looking at switches on the panel and having trouble to choose"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Still, I was curious, young, and hungry. I easily could get engaged in new activities. And through exploring new things, I get to know how I can compensate my innate unwillingness to stick with the skill long enough that stoping makes no longer sense - I have already acquired it.&lt;/p&gt;

&lt;p&gt;These days I'm involved in mentoring upcoming junior developers to help them steadily build skills that they feel confident with, no matter what challenges are in front of them.&lt;/p&gt;

&lt;p&gt;In my practice, I noticed that some learners are struggling with the same problem I did when I was young: how to stay consistent, determined, and focused on learning without dropping again and again.&lt;/p&gt;

&lt;p&gt;Today, I'd like to share a few techniques I advise you to adopt to increase your chances of learning the web development successfully and becoming solid self-taught developers, doesn't matter whether it is a frontend, backend, or any other part of the development world.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;The inspiration for the article became a recent post on a similar subject from &lt;a href="https://dev.to/helleworld_"&gt;Desiré&lt;/a&gt;. Make sure to check that one out, there are more valuable recommendations you could try as well.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/helleworld_" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EuVAw6Yp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--hHDKhFmB--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/222379/c22fba25-366f-43bf-9380-97136ae9091b.jpg" alt="helleworld_ image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/helleworld_/my-learning-method-what-worked-for-me-23in" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;My learning method💡: what worked for me. ✍📖&lt;/h2&gt;
      &lt;h3&gt;Desiré 👩‍🎓👩‍🏫 ・ Jul 13 ・ 6 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#codenewbie&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;strong&gt;Set up minimal daily learning time. 30 minutes per day is optimal&lt;/strong&gt;. 📅
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xp1JMo83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qxn2a2u132rbangqjzwh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xp1JMo83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qxn2a2u132rbangqjzwh.png" alt="Quote by Shinichi Suzuki: &amp;quot;You don't have to practice every day... only the days you eat&amp;quot;"&gt;&lt;/a&gt;&lt;/p&gt;
Quote by &lt;a href="https://g.co/kgs/EFPmQR"&gt;Shinichi Suzuki&lt;/a&gt;



&lt;p&gt;One of the most essential rules that I recommend is to practice every day. And I mean it when I say every day. &lt;/p&gt;

&lt;p&gt;The first few months of your learning, especially when you do not have any tech-related background, are fundamental as you are laying down the basis on which every follow-up piece of knowledge will be stacked. &lt;/p&gt;

&lt;p&gt;This rule has a real benefit: it speeds you up in the long run as you rarely need to revisit the old subjects. You may still need to do it occasionally (some things are slipping from the memory, it is natural), but you less likely will need to spend several hours trying to grasp again the details you lost. Chances are high that a quick skimming through your notes or subject's summary will suffice.&lt;/p&gt;

&lt;p&gt;In the beginning, people sometimes freak out hearing this rule. It may be related to the fact we got used to having 2 weekends where normally we can ignore the work. Initially, It may just seem "wrong".&lt;/p&gt;

&lt;p&gt;But this rule is simply an adoption of &lt;a href="https://en.wikipedia.org/wiki/Distributed_practice"&gt;distributed practice&lt;/a&gt; learning strategy that has numerous study based evidence that it is more effective than the massed practice (when you basically learn something in one session for a longer period of time).&lt;/p&gt;

&lt;p&gt;It also does not force you to practice 4 hours per day every single day. Sticking to such a schedule may be extremely difficult, after all, many of us have work, family, or some responsibilities we have to focus on regularly. &lt;/p&gt;

&lt;p&gt;This rule merely requires you to set up a &lt;strong&gt;minimal&lt;/strong&gt; amount of time you will invest every day, including weekends, holidays. And, yes, on grandma's birthday as well.&lt;/p&gt;

&lt;p&gt;Half an hour (30 minutes) in my practice proved to be the optimal number, but it may be as well 20 minutes or 40 minutes. &lt;/p&gt;

&lt;p&gt;It is possible to find that time almost any day almost for everyone. Unfortunately, you may need to wake up a bit early some days or go to sleep slightly later, you may have to skip the lunch with your friend and eat it quickly alone instead. &lt;/p&gt;

&lt;p&gt;And when you feel you have more energy and time reserved, go on and practice longer, the rule should not limit you and your passion to practice more, it only makes you stay disciplined 😉&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;strong&gt;Track the learning time in an app. "Toggl" is a good option.&lt;/strong&gt; ⏱
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--29g0F-Mg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3dpmtkzrghe03sa2fc8i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--29g0F-Mg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3dpmtkzrghe03sa2fc8i.png" alt="Report from the Toggl app by one of my students. She was really determined to learn the frontend"&gt;&lt;/a&gt;&lt;/p&gt;
Report by one of the developers I've been helping to. She's been really determined to master the frontend.



&lt;p&gt;Tracking time may seem controversial. The benefits of this technique may not be apparent, so let me explain.&lt;/p&gt;

&lt;p&gt;It helps you to identify inconsistent learning (see the first rule). You open the timer's report on Sunday and now you have a pretty clear picture of how the week went for you.&lt;/p&gt;

&lt;p&gt;Did you manage to practice consistently? Which days did you put more time? Why? Which days less? Why? What topics were the most challenging? Should you go over them again in the upcoming week? This way you not only make sure you work hard but also guarantee you are working smart.&lt;/p&gt;

&lt;p&gt;But above all, it may stop you from quitting. For someone like me, it is a dealbreaker.&lt;/p&gt;

&lt;p&gt;One day you may get to a point when you feel like you want to quit. It is okay, it's common. In my practice, it often happens when a learner (me included) already gets to some logical "midpoint" of the learning process.&lt;/p&gt;

&lt;p&gt;It is a stage when you already have quite a few knowledge on the subject, for example, frontend development, but it is not enough to let you achieve your primary goal (i.e. find a job, build some specific project, finish a coding challenge, etc).&lt;/p&gt;

&lt;p&gt;On that day, opening the timer app, and seeing how bloody many hours you put into the craft so far can be exceptionally refreshing to the degree that you get a thought like "Screew it! I invested so much time and effort into this, the heck I will make that time wasted for nothing."&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;strong&gt;Find a mentor. Going to local meetups or joining Slack communities (pandemic way) is helpful for that.&lt;/strong&gt; 🧔👱‍♀️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eBj4Fhu---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ypnj0pz6iyduxgd8motl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eBj4Fhu---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ypnj0pz6iyduxgd8motl.jpg" alt="Master Yoda from Star Wars film series"&gt;&lt;/a&gt;&lt;/p&gt;
Do. Or do not. There's no try.



&lt;p&gt;This advice helps immensely. But I would like to say that having a mentor does not make you less or more self-taught. It is true if you properly consider who the mentors are and what they here for.&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;Mentor is not supposed to teach you&lt;/em&gt;. Yes, you still supposed to learn on your own. There are many experienced and qualified teachers for that, and, frankly speaking, your mentor may not have strong skills in teaching itself (though it is helpful when they have). Rather expect this person, when asked, point you to Google if he or she knows that the subject is trivial and you are capable of finding an answer yourself. It is actually a pretty important skill you need and your mentor most likely thinks the same.&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;Mentor is not your curriculum developer&lt;/em&gt;. A mentor can advise you which subjects you should focus on or which to ignore temporarily. They can help you prioritize building some skills beforehand (for example, get a touch of Git after familiarizing with HTML &amp;amp; CSS), but they are not responsible for building your learning plan. They may give you a hand on that, but I wouldn't expect them to do everything here for you. To be self-taught, you need to learn how to plan your learning.&lt;/p&gt;

&lt;p&gt;So, what are the mentors for?&lt;/p&gt;

&lt;p&gt;They are here to help to dissemble challenging concepts after you tried to grasp them through courses, books, or articles. Some topics, e.g. the mentioned Promises or async/await syntax, are harder than the other, e.g. &lt;code&gt;if&lt;/code&gt; statement. The mentor may ask relevant questions to understand how well you understand the subject, figure out where are weak points in your compression, discuss/explain those and provide you useful materials to defy the subject again ⚔&lt;/p&gt;

&lt;p&gt;They also help you to stay engaged. For example, they can discuss with you the Javascript news, share a funny story from work - when they were addressing a recently introduced colleague by the wrong name the whole week... not so funny, actually. Or simply make a harmless joke on you about the last mistake you made during solving a coding challenge (a sense of humor is essential to high self-esteem).&lt;/p&gt;

&lt;p&gt;And the last, but not least. The mentor shares with you his/her experience. It can be strictly related to tech, for example through code reviews and pair programming. Or it can be outside of the tech scope, like self-management traits, seeking for a job, writing articles. &lt;/p&gt;

&lt;p&gt;It also may be related to highly personal things. But you need to trust your mentor with this, and vice versa, the mentor has to demonstrate trustworthiness. Work and your personal life are often so intertwined, that whatever happens in the one, affects the other. We are human beings and it is normal, but sometimes it may affect you quite strongly, so it is worth asking your mentor advice if you feel you trust them.&lt;/p&gt;




&lt;p&gt;I want to share a project that I and my partner have been working on for a while.&lt;/p&gt;

&lt;p&gt;We came up with a challenging project to help junior frontend developers that need to showcase their skills and want to build a portfolio to ease the problem of getting a job in the industry. &lt;/p&gt;

&lt;p&gt;You can check out it at &lt;a href="https://banda.works/housework-undoer"&gt;https://banda.works/housework-undoer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Housework Undoer&lt;/strong&gt; is a project organized into separate tasks through which you will build a frontend app to help our (imaginary) friend Jack.&lt;/p&gt;

&lt;p&gt;We prepared a nice-looking design and a background story so we hope it should be enjoyable and interesting for you to build, while still providing enough challenges to display your skills to possible employers.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A72LWkVR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/sch3s5qhau74ys51g1wo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A72LWkVR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/sch3s5qhau74ys51g1wo.png" alt="Screens of Housework Undoer app"&gt;&lt;/a&gt;&lt;/p&gt;
Housework Undoer's app screens



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.amazonaws.com/i/sch3s5qhau74ys51g1wo.png"&gt;See full size image&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt; &lt;br&gt;
To finish the project, you need some skills in one of the major frameworks/libraries (React, Vue, Svelte, Angular, etc.), though the project can be completed without any of those, just with plain JS (but keep in mind, employers usually expecting you to have knowledge and experience in one of those mainstream technologies).&lt;/p&gt;

&lt;p&gt;In the upcoming future, we want to create a few more projects, including backend and mobile related ones. But we could really use your help as well: if you try on the project, send us feedback, your thoughts, and questions. The project is completely free and we will really appreciate you spending a little bit of time to share with us your thoughts over &lt;a href="mailto:team@banda.works"&gt;team@banda.works&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you for your time and have a productive day! 💪&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>learning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Do you need a portfolio to get a job as a junior developer?</title>
      <dc:creator>Vitaly Krenel</dc:creator>
      <pubDate>Sat, 11 Jul 2020 04:54:17 +0000</pubDate>
      <link>https://dev.to/bandaworks/do-you-need-a-portfolio-to-get-a-job-as-a-junior-developer-gci</link>
      <guid>https://dev.to/bandaworks/do-you-need-a-portfolio-to-get-a-job-as-a-junior-developer-gci</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR.
&lt;/h2&gt;

&lt;p&gt;It depends. There are definitely some paths you could choose to go and start without a portfolio. But by having a decent portfolio (doesn't really matter pet or business projects) you making the task of getting an interesting and well-paid job significantly easier.&lt;/p&gt;

&lt;p&gt;If you don't have any project yet or looking for it, below I have a personal story you may find something to learn from and a nice-looking project you could build to add to your portfolio (don't worry, it's free). See you around.&lt;/p&gt;

&lt;h2&gt;
  
  
  The beginning
&lt;/h2&gt;

&lt;p&gt;Hey. My name is Vitaly. I've been working here and there as a developer for around 6 years. I started as an I-will-do-any-web-related-thing freelancer in my hometown (focusing mostly on design, PHP websites, and CMS engines) and later I moved to a more challenging backend and frontend development.&lt;/p&gt;

&lt;p&gt;Initially, I had basic web development skills. I primarily raised those while making a few game-related websites with my friend (you could earn some money on those, especially when you like games yourself and know well game's audience). We had a few experiments but those weren't particularly successful, we split and I went for freelancing. &lt;/p&gt;

&lt;p&gt;Later on, I found a mentor. The big guy helped me to hone my skills into something more tailored. Having such a person behind my back immensely boosted my determination and the desire to work hard. I wanted to impress him after all.&lt;/p&gt;

&lt;p&gt;When I was starting my "freelancing career", I had neither enough experience nor outstanding projects to prove that I had a decent skillset. On top of that, I was quite young - barely 16 years old. Now you probably can imagine the skepticism people had when I was offering my services. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzdzaxm6vpvy35uez3hkr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzdzaxm6vpvy35uez3hkr.jpg" alt="Skeptical kid meme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Still, I didn't care much and had enough reasons to ignore the doubtful looks. I would say that it is one of the most important lessons - to ignore skeptical people, - even though it sounds pretentious.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lights, camera, action
&lt;/h2&gt;

&lt;p&gt;With all those assets, I had a few strategies to get on the market: either doing random projects providing the best quality I could - I had to dump the price to lure companies in spite of high risks involved with schoolboy doing their projects - or ask people who already knew me (and trusted me) whether they had some work. I tried both. For sure, there were other options as well, but these two I was mostly focused on.&lt;/p&gt;

&lt;p&gt;During that time, I was taking on any project (including design ones, like creating promo wall posters, etc.) that I could reach.&lt;/p&gt;

&lt;p&gt;One day, my mentor introduced me to a guy that was a media website owner that occasionally had side projects with local companies, including web development endeavors. I ended up doing a few projects for him, which helped me to raise credibility in the eyes of local businesses eventually.&lt;/p&gt;

&lt;p&gt;I was working as hard as I could (while still managing to study at school, so that would be I was working at nights) towards quite a reasonable goal for that time. &lt;/p&gt;

&lt;p&gt;All those struggling were dedicated to building a stable source of income. I was trying to gather a pool of clients that trusted me and my work and would be willing to collaborate with me again in the future. I staked on the fact, that they would be willing to introduce me to their partners when those would start any web-related project (and with that expanding my client pool further).&lt;/p&gt;

&lt;p&gt;As it often happens, that idea failed. But not in an apparent way I imagined it would.&lt;/p&gt;

&lt;h2&gt;
  
  
  Couldn't raise the bar
&lt;/h2&gt;

&lt;p&gt;Taking on every possible project and at the same time keeping low prices got me locked into a nasty situation. I was spending my time resources quite inefficiently and even though I built a portfolio of projects, almost all of them were admittedly shitty (pardon me). I couldn't really impress a big company with those.&lt;/p&gt;

&lt;p&gt;I built a client base and earned some status for being trustworthy, started collaborating with local web development studio, learned a lot of things, many of those were beyond development subject, like communication, design and especially common wisdom (you ask for advance payment when you don't know the client).&lt;/p&gt;

&lt;p&gt;Nonetheless, I felt that I couldn't raise the bar. Neither professionally - getting on huge and challenging enough projects - nor financially - significantly increasing my income. &lt;/p&gt;

&lt;p&gt;What's probably even worse, my skills were scattered around all areas. I didn't have any primary area of expertise. I was quite okay at everything but was great at nothing. I invested more than 2 years into that, but the return was not exactly what I expected.&lt;/p&gt;

&lt;p&gt;Anyway, the school finished, I moved to another city, started a bachelor's degree. Next year and a half I'll keep behind the curtains (as they are irrelevant to the subject), but I have to say that throughout that time, I revised my strategy, quitted the university to have as many resources as I could and shifted the focus from the freelance market to tech companies.&lt;/p&gt;

&lt;p&gt;Freelance was great. It still is, especially for people who love to have a lot of autonomy in their work. I'm occasionally taking on projects. &lt;/p&gt;

&lt;p&gt;But at that time, I could find ways I would be able to go on without scaling (to meet my financial expectations) and I still wanted to get more of "hardcore" engineering experiences 🤘.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interviewing process
&lt;/h2&gt;

&lt;p&gt;I had worked for 2 companies so far, the one being a software development outsourcing company and the other being a startup. The startup gave me an especially valuable experience where I had quite diverse tasks to solve. That seems to be the nature of startups - diversity. &lt;/p&gt;

&lt;p&gt;So if you are tolerable to risks (which I happened to be after working as a chaotical freelancer) and want to work with different things (quite often from scratch), I recommend you trying out a startup instead of a huge tech company. Though keep in mind, that I mentioned risks intentionally - there's a high chance of startup failing (they say, 9 out of 10 startups fail, never had a chance to check the stats behind this number).&lt;/p&gt;

&lt;p&gt;In that startup, I have also had a chance to participate in the hiring process. &lt;/p&gt;

&lt;p&gt;It was quite enlightening to see that there are quite a few junior devs that do not really have projects they can share to showcase their skill set. Instead of trying to impress through talking and persuasion, those developers could have taken out a few projects to eliminate the doubt in the looks of interviewers. &lt;/p&gt;

&lt;p&gt;I do not diminish the ability to speak or the fact that you still should demonstrate your personal traits and character through the interview. But to prove your skills, a couple of well-built pet projects would work more efficiently and would more likely to increase your chances than letting interviewers examine you through their own assignments and questions. &lt;/p&gt;

&lt;p&gt;You will be playing on your own field, so to speak, if you open your project and start telling what challenges you had to overcome while building it.&lt;/p&gt;

&lt;p&gt;As I said that experience was quite enlightening for me and I sadly realized that I personally failed to build a decent portfolio at the beginning. I should have done it, but I didn't. And that hardened my life and I repeatedly had to learn how to persuade people, instead of focusing on building projects so companies would not be able to ignore me and would be willing to hire me. &lt;/p&gt;

&lt;h2&gt;
  
  
  Afterthoughts
&lt;/h2&gt;

&lt;p&gt;I can conclude that It turned out well for me after all, but there had been so many trials and errors before I reached the financial and professional levels I was aiming for. It is not that I went the wrong path, but rather I chose the least optimal one if we consider my goal of getting into high paid but at the same time challenging engineering projects.&lt;/p&gt;

&lt;p&gt;These days I'm involved in mentoring junior devs looking for jobs. I'm simply trying to share the experience I've collected so far as in the beginning my mentor did for me.&lt;/p&gt;

&lt;p&gt;I'm again and again seeing the pattern when companies are less willing to hire devs (or even reluctant to invite for an interview) without some projects behind. Some are okay, they usually provide their own assignment as a part of their initial filtering process, but quite a few companies are not.&lt;/p&gt;

&lt;p&gt;I won't bluntly say for HRs and the agency as I have mere experience with their screening procedures, but I believe it is much easier to catch their eyes as well when you have a couple of decent projects in your portfolio.&lt;/p&gt;




&lt;p&gt;As a final note, I want to share a project that I and my partner have been working on for a while.&lt;/p&gt;

&lt;p&gt;We came up with a challenging project assignment to help junior frontend developers that need to showcase their skills and want to build a portfolio to ease the problem of getting a job in the industry. &lt;/p&gt;

&lt;p&gt;You can check out it at &lt;a href="https://banda.works/housework-undoer" rel="noopener noreferrer"&gt;https://banda.works/housework-undoer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is basically a project assignment through which you will build a frontend app (called "Housework Undoer") to help our (imaginary) friend Jack. &lt;/p&gt;

&lt;p&gt;We prepared a nice-looking design and a background story so we hope it should be enjoyable and interesting for you to build, while still providing enough challenges to display your skills to possible employers.&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsch3s5qhau74ys51g1wo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsch3s5qhau74ys51g1wo.png" alt="Screens of Housework Undoer app"&gt;&lt;/a&gt;&lt;/p&gt;
Housework Undoer's app screens



&lt;p&gt; &lt;br&gt;
To finish the project, you need some skills in one of the major frameworks/libraries (React, Vue, Svelte, Angular, etc.), though the project can be completed without any of those, just with plain JS (but keep in mind, employers usually expecting you to have knowledge and experience in one of those mainstream technologies).&lt;/p&gt;

&lt;p&gt;In the upcoming future, we want to create a few more projects, including backend and mobile related ones. But we could really use your help as well: if you try on the project, send us feedback, your thoughts, and questions. The project is completely free and we will really appreciate you spending a little bit of time to share with us your thoughts over &lt;a href="mailto:team@banda.works"&gt;team@banda.works&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you for your time and have a productive day!&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>Pragmatic developer: Learn architecture and design patterns. Using ORM and ActiveRecord</title>
      <dc:creator>Vitaly Krenel</dc:creator>
      <pubDate>Mon, 02 Mar 2020 06:44:38 +0000</pubDate>
      <link>https://dev.to/vitalykrenel/pragmatic-development-learn-architecture-and-design-patterns-using-orm-and-activerecord-15oc</link>
      <guid>https://dev.to/vitalykrenel/pragmatic-development-learn-architecture-and-design-patterns-using-orm-and-activerecord-15oc</guid>
      <description>&lt;p&gt;Table of content:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intro&lt;/li&gt;
&lt;li&gt;What is a domain model?&lt;/li&gt;
&lt;li&gt;Data persistence&lt;/li&gt;
&lt;li&gt;ORM as a layer of abstraction&lt;/li&gt;
&lt;li&gt;
ActiveRecord pattern to persist application data changes

&lt;ul&gt;
&lt;li&gt;Pros and Cons of ActiveRecord&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;ActiveRecord in the wild. Implementation examples&lt;/li&gt;

&lt;li&gt;ActiveRecord pattern in frontend&lt;/li&gt;

&lt;li&gt;Summary&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Intro &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This section is the series introduction. If you want to start with the article immediately, just read last 2 paragraphs to understand the subject and go ahead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Building a digital product is not easy. There are a lot of distinct challenges involved. Among those are code architecture challenges. As engineers, we strive to write beautiful code. As product creators, we strive to write code that immediately resolves the problem.&lt;/p&gt;

&lt;p&gt;Unfortunately, you cannot solely write beautiful code - you will spend so much time polishing one small piece, that the whole sense of creating a product will be lost. Instead of growing a product that eliminates the real problem of your customers, you will focus on discussing all the time whether you need to put a condition outside or inside a function.&lt;/p&gt;

&lt;p&gt;At the same time, you cannot write only code that immediately solves the problem - you will be dragged repeatedly into dealing with small annoying bugs, will have to write a huge bunch of boilerplate code just to introduce something and that's mostly because of your inability to foresee and prepare to scale. I won't even say about the amount of effort needed to maintain such a codebase and, what for me is even more important, the feeling you experience working on something you find ugly.&lt;/p&gt;

&lt;p&gt;Instead, I believe, that to be an effective developer capable of both &lt;strong&gt;creating&lt;/strong&gt; and &lt;strong&gt;maintaining&lt;/strong&gt; a product, you need to write pragmatic code. Pragmatic, as I see it, means sometimes to build a foundation beforehand. Sometimes to introduce a proper solution only on-demand, when you see an actual problem getting back over and over. Sometimes ditch a proper solution, fix the problem straight away and forget it for the time being. Overall, it's about being reasonable, realistic and not doing what is unnecessary, but still, being an engineer that favors elegance and beauty. No matter how controversial this statement sounds.&lt;/p&gt;

&lt;p&gt;And here comes the first trouble. To be a pragmatic developer, you need to know a lot of possible solutions that you can use in specific cases. Otherwise, you'll go with what you have, without any consideration about what would be appropriate in that exact case.&lt;/p&gt;

&lt;p&gt;This article is part of the intended series on architecture concepts and design patterns that I'm interested in, have some knowledge or experience with and would like to share so you could be more pragmatic having extra options to choose from.&lt;/p&gt;

&lt;p&gt;The content of the series, in my mind, is suitable for developers with 2-3 years of relatively diverse development experience. I will assume you tried both frontend and backend web development to some adequate degree. If you are in the industry only for a year or even less but is "ahead of a crowd", you should still be able to follow along.&lt;/p&gt;

&lt;p&gt;I mainly use &lt;a href="https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html" rel="noopener noreferrer"&gt;Typescript&lt;/a&gt;-like syntax for code examples as a compromise between having well-expressed code pieces and those that can be digested by devs with different programming language backgrounds. In some cases, it may not be a completely valid code piece with some required parts being stripped.&lt;a&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The first article is focusing on the domain and data persistence. I cover the ORM concept and specifically the wide-spread ActiveRecord pattern as one of the solutions that may be used to keep the persistence layer (the one responsible for storing and retrieving application data) relatively simple and thus maintainable.&lt;/p&gt;

&lt;p&gt;As I already typed down a small self-composed lyrical essay, we can finally start with domain field and domain model concepts that are, in some sense, an underlying part of any application's persistence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a domain model? &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;In any application, we can find some kind of a domain model - a conceptual model of any specific field represented by entities, their behaviors, and relationships between them.&lt;/p&gt;

&lt;p&gt;To create a domain model you need to explore the domain field. You do not need to understand and know the whole field in the finest details, it is usually enough to understand a part of the field (basically, some of the terms and concepts used there). Sometimes, you may have a domain expert around which you can consult with. Sometimes, you have to look for information yourself.&lt;/p&gt;

&lt;p&gt;Let's consider driver education as an example of the domain field. I assume, that any driving school has several instructors - then, we can say that a driving instructor is a domain entity.&lt;/p&gt;

&lt;p&gt;An instructor has a name, gender, a list of licenses they teach, some information about their driving experience.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DrivingInstructor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;teachableLicenses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;License&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;yearsOfDrivingExperience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;code&gt;DrivingInstructor&lt;/code&gt; class represents one specific entity and is a part of our domain model. &lt;/p&gt;

&lt;p&gt;You are not obliged to use classes to design the domain, simple literal objects with factory functions are okay. Moreover, this approach is quite convenient in FP or FP-like programming styles, as the paradigm encourages usage of pure functions and immutability instead of classes (which favor mutability instead).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;DrivingInstructor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;teachableLicenses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;License&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;yearsOfDrivingExperience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createDrivingInstructor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
&lt;span class="p"&gt;}):&lt;/span&gt; &lt;span class="nx"&gt;DrivingInstructor&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There can be many different entities within the domain - basically, any real-life thing, e.g. an employee, banking account, a cup of coffee, article, etc., can be a domain entity. There can be 5 or several dozens of entities - it depends on the developer's approach and the domain field complexity.&lt;/p&gt;

&lt;p&gt;To practice a bit further designing the domain model, take a restaurant business. There, you would have a reservation as a domain field concept.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Reservation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;seatingAreaId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;guestsCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReservationStatus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, the reservation has relationships with several entities, more specifically "has-a" relationship with Seating Area (probably a table or a room) and belongs to the Reservation Owner i.e. the Owner has a "has-a" relationship with Reservation. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faqsqcf48133c1monzg2l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Faqsqcf48133c1monzg2l.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you are not familiar with "has a" relationship take a look at the &lt;a href="https://en.wikipedia.org/wiki/Object_composition#Aggregation" rel="noopener noreferrer"&gt;"Aggregation" section in this wiki article&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What about behavior? When you book a table in a restaurant, there's usually an option to cancel the reservation in case you have changed your mind (or those, you were planning to go with, did :sigh). So this &lt;code&gt;cancel&lt;/code&gt; operation is the behavior available for the Reservation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Reservation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* ... */&lt;/span&gt;

  &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;cancel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;ReservationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FINISHED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ReservationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CANCEL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behavior is any business-related logic. Usually, it is a method or a function that changes the state of an entity (like &lt;code&gt;cancel&lt;/code&gt; method), calculates something (e.g. &lt;code&gt;.transfer(destinationAccount)&lt;/code&gt; method in a banking app) or performs some validations.&lt;/p&gt;

&lt;p&gt;We discussed what are the domain and domain entities, but those are only the concepts that start to make sense when they have some actual data packed into them. We still need to discuss how to approach storing that data and restoring it when we want. These concerns are covered by the persistence layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data persistence &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;In general, &lt;em&gt;to persist the data&lt;/em&gt; means to retrieve application data after a program execution has started and to store some data after the program has finished.&lt;/p&gt;

&lt;p&gt;In the frontend case, opening a tab with a web app is the start and closing that tab is the end. With backend, it may differ from language to language, but we can assume that receiving an HTTP request is the start and sending the response back (or closing the connection) is the end.&lt;/p&gt;

&lt;p&gt;Usually, you want the application data to be available after the execution is ended. That makes the persistence-related code an important part of the codebase. If it fails often or is bug-prone, you may lose the data. Moreover, asking users to do something twice, may easily annoy them and turn away from our products (which is, you know, undesirable from a business perspective).&lt;/p&gt;

&lt;p&gt;How would you deal with it: how would you organize the code responsible for persistence? The very basic approach may be to use SQL statements throughout our code each time we need to put to or pull from a database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reservation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Reservation&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;seatingAreaId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;guestsCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2019-10-19 17:30&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReservationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PENDING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepareQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
  INSERT INTO reservations (
    Id, OwnerId, SeatingAreaId, GuestsCount, Date, Status
  ) VALUES (
    :id, :ownerId, :seatingAreaId, :guestsCount, :date, :status
  )`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;reservation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach is a way to go in small apps or those that are in MVP state, but, you can guess, it is not scalable.&lt;/p&gt;

&lt;p&gt;A more appropriate solution to the problem can be to introduce an ORM.&lt;/p&gt;

&lt;h2&gt;
  
  
  ORM as a layer of abstraction &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;ORM (&lt;a href="https://en.wikipedia.org/wiki/Object-relational_mapping" rel="noopener noreferrer"&gt;Object Relational Mapping&lt;/a&gt;) is the concept of mapping existent database records to your application. So instead of performing database operations manually (the same way I did in the example above), you would represent different database operations through different objects and method calls.&lt;/p&gt;

&lt;p&gt;ORM is a pattern. But quite often in spoken language when people say "ORM" they mean a specific library (or a tool) that covers database abstraction concern in their language of choice. For example, in PHP there are Eloquent and Doctrine ORMs. In Ruby on Rails - ActiveRecord (it is both the name of the pattern and Rails' ORM). Python has SQLAlchemy and Django ORM.&lt;/p&gt;

&lt;p&gt;So to prevent confusion, I suggest you perceive ORM as a layer that abstracts database-related operations and is a bridge between database records and your domain entities classes (that are called "models" in MVC or MV* architecture styles).&lt;/p&gt;

&lt;p&gt;ORM may be built with the help of different patterns. And there are a few that may change how you would persist the domain entities. In this article, I focus on the ActiveRecord pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  ActiveRecord pattern to persist application data changes &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;an object that wraps a record in a database table, not only carries both data and behavior but also encapsulates the database access. See &lt;a href="https://www.martinfowler.com/eaaCatalog/activeRecord.html" rel="noopener noreferrer"&gt;ActiveRecord's definition by Martin Fowler&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Highlighting the most important from that definition, we can get two main points:&lt;br&gt;
1) your domain objects are mapped to the database records;&lt;br&gt;
2) they [objects] handle the database access themselves.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ActiveRecord&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;tableName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;isInitialized&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;entityProperties&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;defineFields&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;propertyValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entityProperties&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;propertyValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/**
    * Find related table in the database and retrieve its schema (meta
    * information) like column names, their types, nullable or not, etc.
    */&lt;/span&gt;
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tableName&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Guess table name from the class e.g. 'Reservation' class&lt;/span&gt;
      &lt;span class="c1"&gt;// can be converted to 'reservations' table name&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tableName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;guessTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieveTableSchema&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isInitialized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/**
    * Retrieve table meta information that exists in the corresponding table
    */&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;retrieveTableSchema&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retrieveSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tableName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/**
    * Create a new field in the object for each table column,
    * so they can be populated later with real data.
    */&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;defineFields&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;column&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Convert column name to field name and initialize a field&lt;/span&gt;
      &lt;span class="c1"&gt;// on the object, e.g. for 'owner_id' column, reservation object&lt;/span&gt;
      &lt;span class="c1"&gt;// will have 'ownerId' field&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fieldName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;convertToCamelCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;column&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;fieldName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/*
   * Persist the entity object to the database
   */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Covert back from camelCase to syntax that was used in table column names&lt;/span&gt;
    &lt;span class="c1"&gt;// the resulting object can be pushed to the database to an existing&lt;/span&gt;
    &lt;span class="c1"&gt;// record or add a new one&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tableRecord&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mapFieldsToColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertOrUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tableName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tableRecord&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tableName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isInitialized&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchableRecord&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mapParamFieldsToColumns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tableName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;searchableRecord&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;entityProperties&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mapToCamelCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Static methods in JS recieves class itself as 'this' value&lt;/span&gt;
    &lt;span class="c1"&gt;// So this would translate to new Reservation(...entityProperties)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;entityProperties&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/**
    * Count records in the corresponding table
    */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/**
    * Reset the whole table
    */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now any domain entity extending this ActiveRecord class will be able to work with the database on its own.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Reservation&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ActiveRecord&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Entity fields are implicitly declared when a new object&lt;/span&gt;
  &lt;span class="c1"&gt;// is created or pulled from the database&lt;/span&gt;

  &lt;span class="c1"&gt;// id: number;&lt;/span&gt;
  &lt;span class="c1"&gt;// date: Date;&lt;/span&gt;
  &lt;span class="c1"&gt;// seatingAreaId: number;&lt;/span&gt;
  &lt;span class="c1"&gt;// guestsCount: number;&lt;/span&gt;
  &lt;span class="c1"&gt;// ownerId: number;&lt;/span&gt;
  &lt;span class="c1"&gt;// status: ReservationStatus;&lt;/span&gt;

  &lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ReservationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CONFIRMED&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reservation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Reservation&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;reservationOwnerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;seatingAreaId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;guestsCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2019-10-19 17:30&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReservationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PENDING&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Manager confirmed the reservation, but the guest&lt;/span&gt;
&lt;span class="c1"&gt;// has asked to reschedule the reservation time until 19:30&lt;/span&gt;
&lt;span class="nx"&gt;reservation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;reservation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2019-10-19 17:30&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;reservation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With ActiveRecord, all additional database access code required for the entity should be kept within its class. You can add new methods to perform other database operations (e.g. a &lt;code&gt;findAllByOwner&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Reservation&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ActiveRecord&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* ... */&lt;/span&gt;

  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;findAllByOwner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepareQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
      SELECT * FROM &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tableName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; WHERE ownerId = :ownerId`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;In real practice, instead of plain Database calls you would use something like &lt;a href="https://refactoring.guru/design-patterns/builder" rel="noopener noreferrer"&gt;Builder pattern&lt;/a&gt; to dynamically create a query and execute it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You may wonder how to use the approach I've brought up in the first part of the article - those plain domain objects with &lt;code&gt;create&lt;/code&gt; factory function.&lt;/p&gt;

&lt;p&gt;Because of ActiveRecord is an object-oriented design pattern, it is quite hard to adopt it in the context of functional programming. So it won't work straight away.&lt;/p&gt;

&lt;p&gt;At the same time, it doesn't mean that other patterns initially authored in the context of OOP cannot be adopted in different contexts, especially with languages having both FP and OO elements (like JavaScript or Scala). &lt;/p&gt;

&lt;p&gt;I'll cover the approach of building the persistence layer with those plain domain objects in one of the next articles.&lt;/p&gt;

&lt;p&gt;I think, now we can narrow our discussion to ActiveRecord's strong and weak sides. This knowledge directly affects your ability to determine whether you encountered a suitable use case for the pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and Cons of ActiveRecord &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Any pattern is a tool and each tool has its own strong and weak sides. If you are going to implement any pattern or, what happens constantly, use a library that implements one, I suggest you learning those sides. This way you will be more likely to pick a proper solution that fits your needs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are a few strong and weak spots of the pattern I've noticed in my practice. Let's start with strong ones.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;ActiveRecord is self-descriptive. Because of the close relationship between models and database tables, it’s easy to look into a project, examine its database schema, and you will have a decent level of understanding of the project.&lt;br&gt;
Some of the existent ORM libraries let you declare a list of columns (or properties) available in the corresponding table within the model class straight away. This way you'll have a complete definition of the models, relationships and business logic in one place (e.g. Typeorm, Laravel). Other provide external schema file (or at least migrations) where you can discover database tables structure (e.g. Rails).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As this pattern gathers domain data, logic and database access together you can think about them as one conceptual piece that makes your code relatively simple. In most cases, you won't need to inject anything but a domain model to perform some business logic.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On the other hand, some disadvantages are deriving from both those points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;On its own, the pattern encourages tight coupling between domain objects and your database. Every domain object knows about the database, tables, and schemas. This statement also implies that the pattern violates the &lt;a href="https://en.wikipedia.org/wiki/Single_responsibility_principle" rel="noopener noreferrer"&gt;single responsibility principle&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Because the domain objects are mapped to the database schema, project refactoring becomes more difficult as changes in one, either domain or database design, will force you to adjust the other.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It also increases the complexity of the logic in your domain objects as they will have to deal with both business logic concerns as well as database access (persistence concerns). A lot of relationships, inheritance, sophisticated entities and complex queries may make your code quite messy if you do not adapt patterns to tackle those problems.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ActiveRecord in the wild &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;There are many implementations of the pattern in different languages and frameworks of choice. A lot of popular frameworks built their ORM layer with ActiveRecord usage.&lt;/p&gt;

&lt;p&gt;A small list of those with the link to the GitHub repo where you may check out their implementations. I recommend doing that if you're either a relatively experienced developer - your experience most likely precedes theoretical understanding, so it is useful for professional growth to see how other devs solve programming problems - or a developer specifically digs into project design and architecture and likes the subject.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Laravel - one of the most popular frameworks in PHP. Laravel's ORM system is called Eloquent and it provides the ActiveRecord implementation through its Model class.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://laravel.com/docs/6.x/eloquent" rel="noopener noreferrer"&gt;https://laravel.com/docs/6.x/eloquent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sources: &lt;a href="https://github.com/illuminate/database/tree/master/Eloquent" rel="noopener noreferrer"&gt;https://github.com/illuminate/.../Eloquent&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Ruby on Rails - quite old but sexy framework in Ruby. Rails ORM is called ActiveRecord (the same way the pattern is named), so in the Ruby community, you can often hear people referencing ActiveRecord as an ORM instead of a pattern. Don't be confused: those statements are simply context-aware.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://guides.rubyonrails.org/active_record_basics.html" rel="noopener noreferrer"&gt;https://guides.rubyonrails.org/active_record_basics.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sources: &lt;a href="https://github.com/rails/rails/tree/master/activerecord" rel="noopener noreferrer"&gt;https://github.com/rails/.../activerecord&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;There are also ActiveModel and ActiveResource in Rails but those are different concepts, not related to database or ORM.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Typeorm - great ORM written in JavaScript (TypeScript) that can work both on client and server sides (pretty much everywhere where you can run JavaScript). It is quite interesting how it adopts the idea of ES decorators (&lt;code&gt;@decorateSomething&lt;/code&gt;) to declare an entity and to provide information about available properties.

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://typeorm.io/#/active-record-data-mapper" rel="noopener noreferrer"&gt;https://typeorm.io/#/active-record-data-mapper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sources: &lt;a href="https://github.com/typeorm/typeorm/blob/master/src/repository/BaseEntity.ts" rel="noopener noreferrer"&gt;https://github.com/typeorm/.../repository/BaseEntity.ts&lt;/a&gt;.
I recommend starting from there and additionally check out the whole repository folder as well.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  ActiveRecord pattern in frontend &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This section is speculation combined with my general professional experience. I have never used this approach in production so take my words with a grain of salt. The idea of applying development concepts and patterns in different contexts is interesting to me. I encourage you to share ideas and experiences on the subject if you encountered or tried this pattern in your frontend practice. You may share something that will be valuable to other devs and helps them. It will boost your karma 😉.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One interesting moment is that this pattern is not applied frequently in the frontend, even though some frontend applications resemble UI for database CRUD operations.&lt;/p&gt;

&lt;p&gt;One of the ActiveRecord examples I encountered in frontend development practice is BackboneJS, specifically, Model and Collection components. The model or a collection of models can be saved, destroyed, fetched and synced between client and server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Backbone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nf"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
        &lt;span class="na"&gt;authorId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;readStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReadStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOT_STARTED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="nf"&gt;startReading&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;readStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ReadStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;READING&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Backbone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/v1/books&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Fetch list of user's books from endpoint /api/v1/books&lt;/span&gt;
&lt;span class="nx"&gt;Books&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For quite a while Backbone is consider to be a legacy tool (probably for more than 5 years). But it is still worth learning how some problems were addressed with different patterns, even though the Backbone is no longer a tool-of-choice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you are a front-end engineer that cares about architecture, maintainability, and scalability of your solutions, it is worth in general exploring different frameworks like Backbone, React, Meteor, etc. They all adopted different patterns to solve common problems of building an effective web app architecture.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another interesting proof of concept is &lt;a href="https://github.com/nicklandgrebe/active-resource.js" rel="noopener noreferrer"&gt;ActiveResource.js&lt;/a&gt; library. More on the library you can read in &lt;a href="https://www.toptal.com/api-developers/fast-powerful-js-sdks-for-rest-apis" rel="noopener noreferrer"&gt;introduction post on TopTal.com&lt;/a&gt;. I will provide a small summary (that pretty much can be found in the article) of the interface that the library empowers your domain entities with.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Basic methods to retrive either a collection of or only one record&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Get a first record&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Find a record with the specified attribute&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findBy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jackie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Persist user changes to the server or handle the error if edit is not possible&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userEditError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
  * More complex example quering user records.
  * .includes() forces AR to fetch also user-related notifications 
  * (example of relationship).
  * .select() asks API to return only email and notifications 
  * (with message and createdAt) attributes.
  */&lt;/span&gt;
&lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;notifications&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;notifications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;createdAt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;order&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under the hood, these method calls are constructing a request to your API endpoint conforming JSON:API specification.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you are not familiar with JSON:API, it is pretty much just a specification for REST APIs providing concrete rules for structuring JSON-based API responses. Check out &lt;a href="https://jsonapi.org/" rel="noopener noreferrer"&gt;project's documentation&lt;/a&gt; for more information and examples.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quite interesting, that ActiveResource.js originates from Rails' ActiveResource class that provided similar functionality for backend models that are backed by other API providers (and not database). Backbone's Model and Collection have a similar background as they were inspired by Rails ActiveRecord ORM.&lt;/p&gt;

&lt;p&gt;Nonetheless, as I said before, the ActiveRecord pattern is not frequently applied in the frontend world. One of the reasons, in my opinion, is that to implement ActiveRecord in client-side code your API (or APIs in more complex cases) should conform to some specification or convention and be consistent. Otherwise, you won't be able to reliably parse the responses on the client-side without writing &lt;strong&gt;a lot&lt;/strong&gt; of boilerplate code for each entity endpoint.&lt;/p&gt;

&lt;p&gt;Using ActiveRecord would also mean that you (as a frontend engineer) would build domain models on client-side (or at least some form of them) and use them, which raises a question on how to manage those models with conjunction to modern frontend stores like Redux or Ngrx. Especially when libraries encourage FP-like programming style which will force you to serialize them back and forth all the time (which doesn't seem to be sustainable) so the view layer would be notified about data changes.&lt;/p&gt;

&lt;p&gt;Though it's still should be possible to use such domain models with observable-based store system, like MobX. As all model changes will be observed, you can pretty easily watch for those in view layer and, when needed, to perform actions to persist an updated model (or collection of models) through the model instance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;It seems to me, you've read a lot. Starting with the domain model concept being a part of any application (either implicitly or explicitly), we learned that it is represented by entities, their behaviors, and relationships.&lt;/p&gt;

&lt;p&gt;The entities encapsulate application data that has to be persisted, and we need to manage the persistence code complexity to keep it reliable (fewer bugs, more safety) and maintainable. &lt;/p&gt;

&lt;p&gt;To achieve that, we introduced ORM as an abstraction from plain database calls and queries and used the ActiveRecord pattern to provide database access for our domain entities so they could be persisted when needed. We also discussed the advantages and disadvantages of ActiveRecord, to have a slightly clearer picture about cases when it will be appropriate to use the pattern.&lt;/p&gt;

&lt;p&gt;The last section was more like an incomplete study of how one may apply the ActiveRecord pattern in frontend development practice.&lt;/p&gt;




&lt;p&gt;I hope you'll find the content of the article valuable on your path of becoming a pragmatic developer. I intend to continue creating such content and want to explore another part of a developer that can be called a "product creator". In my opinion, that identity should be improved and grown alongside with your engineer side.&lt;/p&gt;

&lt;p&gt;I would appreciate your feedback after reading, whether you find the article content (architecture and design patterns) useful to you and how do you feel about long-read posts on similar subjects.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
