<?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: JennyJudova (they/them)</title>
    <description>The latest articles on DEV Community by JennyJudova (they/them) (@jennyjudova).</description>
    <link>https://dev.to/jennyjudova</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%2F282275%2F6cd71e22-ac4d-4a87-9e27-06cc6af520c5.jpeg</url>
      <title>DEV Community: JennyJudova (they/them)</title>
      <link>https://dev.to/jennyjudova</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jennyjudova"/>
    <language>en</language>
    <item>
      <title>Easy fixes for the take home part of your interview</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Sun, 20 Mar 2022 20:54:35 +0000</pubDate>
      <link>https://dev.to/jennyjudova/easy-fixes-for-the-take-home-part-of-your-interview-1pbj</link>
      <guid>https://dev.to/jennyjudova/easy-fixes-for-the-take-home-part-of-your-interview-1pbj</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g8XzzlbQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hioofqiswf6qvs2gibv5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g8XzzlbQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hioofqiswf6qvs2gibv5.jpeg" alt="Image description" width="880" height="550"&gt;&lt;/a&gt;&lt;br&gt;
Recently I've been interviewing a lot of people (still find it hard to believe as &lt;a href="https://dev.to/jennyjudova/how-to-find-a-job-as-a-bootcamp-grad-4fg8"&gt;it feels like it was yesterday that I was job hunting&lt;/a&gt;). Being on the other side of the interview table has taught me a lot I wish I knew when I was interviewing for dev jobs especially the take home part of the interview.&lt;/p&gt;

&lt;p&gt;Take home part of the interview is a common part of the interview process for software engineers. The task usually goes something like: ‘Please build X. X must be able to do a,b,c,d,e’. &lt;/p&gt;

&lt;p&gt;I remember when I did take home exercises my thinking was along the lines of ‘Just do the thing they ask for, as long as it works who cares’. This is true the homework has to run without errors and work. However there are things you can do to make your work stand out. And honestly most of these bonus points are really easy to get.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Readme
&lt;/h2&gt;

&lt;p&gt;Most Readme's I see are the generic auto generated ones. Which always makes me sad as a readme is arguably the most valuable real estate that most candidates ignore.&lt;/p&gt;

&lt;p&gt;This is the place where you can explain what you did and why. And where you can explain what you would do with the project if you had more time to work on it. &lt;/p&gt;

&lt;h4&gt;
  
  
  Things you should add to your readme:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;manual test plan (we will come back to this)&lt;/li&gt;
&lt;li&gt;why you chose to do what you did, no matter how detailed the exercise there will always be creative wiggle room - so this is a great place to explain your reasoning. &lt;/li&gt;
&lt;li&gt;how can this project be improved, what would you have done if you had more time - go crazy, or go rational say you did not test it with voice over accessibility technology and if you had more time you would do that. &lt;/li&gt;
&lt;li&gt;was there something you did not do&lt;/li&gt;
&lt;li&gt;call out bugs - if there is a bug that you have no idea how to solve or don't have the time to solve this is the place to call it out. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tests
&lt;/h2&gt;

&lt;p&gt;If you are applying for a junior role tests are rarely expected. If for a more senior role - you must have tests. If you are a junior and don't know how to write tests then in the read me add a manual test section where you explain how you manually tested your app - what pages you visited what buttons you clicked etc. &lt;/p&gt;

&lt;h2&gt;
  
  
  Semantic HTML
&lt;/h2&gt;

&lt;p&gt;Just because something CAN be a div does not mean it should be a div. The bonus of using semantic HTML is that usually its keyboard accessible. Even if you know nothing about accessibility - semantic html will do most of the heavy lifting for you. &lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;p&gt;In most companies your homework will undergo basic accessibility testing and accessibility is an unspoken requirement.&lt;/p&gt;

&lt;p&gt;The basic test is to make sure that the thing you built is keyboard accessible (can you focus on everything using tab, and click using space). If you have access to screen readers like VoiceOver &amp;amp; Jaws also use those. Write about accessibility testing you did in the ReadMe. &lt;/p&gt;

&lt;h2&gt;
  
  
  Small touches that show care and character
&lt;/h2&gt;

&lt;p&gt;I am a UI engineer, I help hire front end engineers and honestly there is nothing that makes me as happy as a front end engineer who shows that they care about the user. It might be tiny little things that are added to the feature that might have not been part of the assignment that show that the candidate did not just follow a list of 'todos' but thought about the user. A recent example I came across was an error screen and message that where in line with the exercise. &lt;/p&gt;

&lt;p&gt;You can teach anyone to be a software developer, you can turn an okay ui engineer into a great one with enough mentoring and resources. But it's a lot lot harder to teach people to care. &lt;/p&gt;

&lt;h2&gt;
  
  
  Comments that are not meant for anyone who is not the author of the code
&lt;/h2&gt;

&lt;p&gt;Just as a reminder - when you submit your homework make sure it is readable to strangers. &lt;/p&gt;

&lt;h2&gt;
  
  
  Git history
&lt;/h2&gt;

&lt;p&gt;We all write commit messages such as 'chore: fix the thing' followed by 'stupid lint errors', 'committing while it's not broken'. While we are on the topic of git. One big commit for the whole exercise is also not a great look. &lt;/p&gt;

&lt;h2&gt;
  
  
  If its not used it should not be there
&lt;/h2&gt;

&lt;p&gt;In the code if it's not used - delete it. &lt;/p&gt;

&lt;h2&gt;
  
  
  Add comments in the style sheet
&lt;/h2&gt;

&lt;p&gt;If all of your styling is in a long CSS file do add comments that help users navigate the file.&lt;/p&gt;

&lt;p&gt;These peace’s of advice are definitely not guarantees to land you a job but these are all tiny ways how you can definitely make your application stand out. &lt;/p&gt;

&lt;h2&gt;
  
  
  Careful with copy pasting
&lt;/h2&gt;

&lt;p&gt;Let's face it a big chunk of the job is  searching  for examples and copy pasting. Sometimes you copy paste your colleagues work, sometimes your own, sometimes a stranger's on the internet. Thats all kosher we all do it and then we go and clean it up so its not an in-your-face-copy-paste job. If you did copy paste - rename things, alter it make it yours. If your homework exercise asks you to create a weather app and you did something similar for a project for a movie app make sure the copy pasted stuff is renamed from BestMovieOfTheDay to WeatherToday. &lt;/p&gt;

&lt;h2&gt;
  
  
  Consistency aka use prettier
&lt;/h2&gt;

&lt;p&gt;Random spacing and a mixture of single and double quotes for strings just makes the code look messy. &lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid !important
&lt;/h2&gt;

&lt;p&gt;Thats it, thats the advice.&lt;/p&gt;

&lt;p&gt;If you have any advice from 'marking' homework assignments do let me know in the comments.&lt;/p&gt;




&lt;p&gt;This is all from my personal experience &lt;/p&gt;

</description>
    </item>
    <item>
      <title>What makes a website green? A guide for front end devs</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Wed, 30 Jun 2021 08:04:32 +0000</pubDate>
      <link>https://dev.to/jennyjudova/what-makes-a-website-green-a-guide-for-front-end-devs-df8</link>
      <guid>https://dev.to/jennyjudova/what-makes-a-website-green-a-guide-for-front-end-devs-df8</guid>
      <description>&lt;p&gt;A friend sent me a message with a simple question ‘why is this website considered green?’ All I could answer was well I went on &lt;a href="https://www.websitecarbon.com/" rel="noopener noreferrer"&gt;Website Carbon&lt;/a&gt; and it told me that the website is green. &lt;/p&gt;

&lt;p&gt;My own answer was not enough for me so I dug in.&lt;/p&gt;

&lt;p&gt;You’d think that the answer would be a simple ‘Because x, y, &amp;amp; z’ but like everything that tackles complex systems, and human carbon footprint is an incredibly complex system, I had to go with ‘well let me start at the beginning.’ &lt;/p&gt;

&lt;p&gt;&lt;em&gt;So let’s start at the beginning: what makes a website green?&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If the internet where a country and all of us online it's citizens it would be the &lt;a href="https://internethealthreport.org/2018/the-internet-uses-more-electricity-than/" rel="noopener noreferrer"&gt;4th most carbon consuming country&lt;/a&gt; after China, USA and India by 2025, and the wider &lt;a href="https://www.climatecare.org/resources/news/infographic-carbon-footprint-internet/" rel="noopener noreferrer"&gt;IT sector would be the 3rd&lt;/a&gt; (after China &amp;amp; USA). The internet and tech by different calculations account for &lt;a href="https://www.ovoenergy.com/blog/green/the-carbon-footprint-of-the-internet.html" rel="noopener noreferrer"&gt;2&lt;/a&gt; to &lt;a href="https://www.webfx.com/blog/marketing/carbon-footprint-internet/" rel="noopener noreferrer"&gt;4%&lt;/a&gt; of carbon emissions (&lt;a href="https://www.atag.org/facts-figures.html" rel="noopener noreferrer"&gt;the airline industry pre pandemic was responsible for 2%&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Of course one can argue about the overlap and differences between IT and the Internet. But to keep some order and sanity lets narrow this blogpost to carbon emission of the internet. &lt;/p&gt;

&lt;p&gt;So to answer the seemingly basic question 'What makes this website green?' we should first answer the question 'How do we calculate the carbon emission of a website?'&lt;/p&gt;

&lt;h3&gt;
  
  
  How do we calculate the carbon emission of a website?
&lt;/h3&gt;

&lt;p&gt;As a developer I am proficient at copy pasting and the folks at Website Carbon created a handy list of what they consider when they &lt;a href="https://www.websitecarbon.com/how-does-it-work/" rel="noopener noreferrer"&gt;calculate the carbon footprint of individual websites&lt;/a&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data transfer over the wire - amount of energy it takes to load the website&lt;/li&gt;
&lt;li&gt;Energy intensity of web data - "Energy is used at the data centre, telecoms networks and by the end user’s computer or mobile device." &lt;a href="https://www.websitecarbon.com/how-does-it-work/" rel="noopener noreferrer"&gt;Website Carbon calculated an average&lt;/a&gt; of 1.8kWh/GB.&lt;/li&gt;
&lt;li&gt;Energy source used by the data centre - the &lt;a href="https://www.thegreenwebfoundation.org/" rel="noopener noreferrer"&gt;Green Web Foundation&lt;/a&gt; database is checked &lt;/li&gt;
&lt;li&gt;Carbon intensity of electricity - carbon footprint of grid electricity &lt;/li&gt;
&lt;li&gt;Website traffic - if the website has 1 million users it's a bigger polluter than a website that gets 1 visit.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As web developers we have &lt;strong&gt;some&lt;/strong&gt; control over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data transfer over the wire &lt;/li&gt;
&lt;li&gt;Energy intensity of web data- incredibly limited control&lt;/li&gt;
&lt;li&gt;Energy source used by the data centre - if it's a personal project we have full control over this and can choose a 'green' hosting platform. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why should devs be more green?
&lt;/h3&gt;

&lt;p&gt;For one because we live here on Earth and I like to keep my home clean. And second, though developer salaries are good I am not sure we earn enough to get ourselves to Mars when Earth goes belly up. &lt;/p&gt;

&lt;p&gt;Third reason is that becoming a carbon conscious developer makes us better developers (see the 1996 and 2021 SpaceJam websites comparison bellow). More importantly developers don't just have control over our own projects but some control over some of the largest websites on the planet and we are often the group that is heard within corporations (not always but often).&lt;/p&gt;

&lt;p&gt;As a disclaimer I should add that this is by no means an attempt to put responsibility for the current climate mess on the internet. Climate change is essentially a high stakes blame game of who farted where &lt;a href="https://www.youtube.com/watch?v=ipVxxxqwBQw" rel="noopener noreferrer"&gt;everyone farted&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;As a second disclaimer I am a front end developer not a scientist, so this is advice that is meant to be practical rather than preachy. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So what can be done to make a website more green?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Data Transfer over the wire?
&lt;/h2&gt;

&lt;p&gt;Tom Greenwood in his book &lt;a href="https://abookapart.com/products/sustainable-web-design" rel="noopener noreferrer"&gt;'Sustainable Web Design'&lt;/a&gt; put it best:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Most researchers use kilowatt-hours per gigabyte (kWh/GB) as a metric of energy efficiency when measuring the amount of data transferred over the internet when a website or application is used. This provides a great reference point for energy consumption and carbon emissions. As a rule of thumb, the more data transferred, the more energy used in the data center, telecoms networks, and end user devices.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For web pages, data transfer for a single visit can be most easily estimated by measuring the page weight, meaning the transfer size of the page in kilobytes the first time someone visits the page. It’s fairly easy to measure using the developer tools in any modern web browser. Often your web hosting account will include statistics for the total data transfer of any web application.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In other words the more requests, images, videos, music your website has the more data is needed to load it. Back in the early days of the web, developers where conscientious of this as internet speed was really really slow and media heavy websites took forever to load, today speed is not an issue and to be honest we (developers) did get sloppy. &lt;/p&gt;

&lt;p&gt;Possibly the best examples of this are the &lt;a href="https://www.spacejam.com/1996/" rel="noopener noreferrer"&gt;iconic&lt;/a&gt; and the &lt;a href="https://www.spacejam.com/" rel="noopener noreferrer"&gt;new&lt;/a&gt; SpaceJam websites. Just pop over to the network tab of your developer tools and compare the amount of data the old and the new websites use.&lt;br&gt;
3.1kb vs 1.6mb as a reminder 3.1kb is only 0.0031mb (1.6mb is 1,600kb). The old website takes a fraction of energy compared to the new one. &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%2Fuploads%2Farticles%2Fae4wetpnuckds3tt9fz5.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%2Fuploads%2Farticles%2Fae4wetpnuckds3tt9fz5.png" alt="Alt Text"&gt;&lt;/a&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%2Fuploads%2Farticles%2Faodwxpeaq4yw0a5ffvh5.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%2Fuploads%2Farticles%2Faodwxpeaq4yw0a5ffvh5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to decrease Data transfer over the wire?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Video
&lt;/h3&gt;

&lt;p&gt;The advice for video is - avoid video on your website. One study found that streaming videos on YouTube produces approximately &lt;a href="https://www.bristol.ac.uk/news/2019/may/rethinking-digital-service-design-.html" rel="noopener noreferrer"&gt;10 kg of CO2 per hour&lt;/a&gt; or the same amount as Glasgow a city with a population of half a million. &lt;br&gt;
If you really need to use video then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use &lt;a href="https://vimeo.com/539975337" rel="noopener noreferrer"&gt;SD by default rather than HD&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;avoid video autoplay. This is good for the planet and also for the user as the user has to confirm that they actually want to watch the video.(from Sustainable Web Design by Tom Greenwood)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Images
&lt;/h3&gt;

&lt;p&gt;Images are where most of us get lazy. Because internet speed is so good the load time between a 1mb image and a 300kb is unnoticeable to most users. And if it's just one image the climate impact is not that bad but what if it's one image on a website that is visited by thousands of people each day? What if its thousands of images on a website visited by thousands of people. Little things add up quickly. &lt;/p&gt;

&lt;p&gt;In fact the average weight of a website in &lt;a href="https://docs.google.com/presentation/d/1LlmUR0Uoh4dgT3DjanLjhlXrk_5W2nJBDqDAMbhe8v8/edit#slide=id.gc0c4170507_0_7" rel="noopener noreferrer"&gt;2010 was 500 kb in 2020 it was 2mb&lt;/a&gt; that is a 4x increase and 50 % of that increase is because of images.&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%2Fuploads%2Farticles%2Fdcd1es7756h3v01f5iac.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%2Fuploads%2Farticles%2Fdcd1es7756h3v01f5iac.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So what are the ways developers can deal with the image issue:&lt;br&gt;
1.&lt;strong&gt;Don't show&lt;/strong&gt; unless asked for or have a preview image and offer a large image only if the user explicitly asks for it. &lt;/p&gt;

&lt;p&gt;2.&lt;strong&gt;Resize&lt;/strong&gt; - load an image that is the appropriate size for the device that the user is viewing it on. &lt;/p&gt;

&lt;p&gt;As an example you really do not need an 8000px x 45000px (resolution 300px/inch), when the average Macbook Pro is &lt;a href="https://support.apple.com/en-us/HT202471" rel="noopener noreferrer"&gt;2560 x 1600 at 227 pixels per inch&lt;/a&gt; and the largest iPhone is &lt;a href="https://kapeli.com/cheat_sheets/iOS_Design.docset/Contents/Resources/Documents/index" rel="noopener noreferrer"&gt;1284 x 2778 px&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="(https://formafantasma.com/works#)"&gt;formafantasma&lt;/a&gt;&lt;/strong&gt; - a design agency that focuses on art museums uses both of these tactics. Users are not shown the images unless they want to see more information about the project.&lt;/p&gt;

&lt;p&gt;3.&lt;strong&gt;format&lt;/strong&gt; - use an efficient image format&lt;br&gt;
Lets face it most of us usually deal either with JPEG/JPG or PNG so which one is better? &lt;br&gt;
The rule of thumb is &lt;a href="https://thrivethemes.com/jpeg-vs-png/" rel="noopener noreferrer"&gt;for photographs use JPEG for graphics, logos or text heavy images use PNG&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But if we want to be green SVG is better than PNG for logos. And &lt;a href="https://jakearchibald.com/2020/avif-has-landed/" rel="noopener noreferrer"&gt;JPEG is best substituted by WEBP or even better by AVIF&lt;/a&gt;. Avif works like magic and is usually around 10x less than jpeg BUT major browsers like Safari do not support it.&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%2Fuploads%2Farticles%2F4wk6it7jeqbczeku6dy0.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%2Fuploads%2Farticles%2F4wk6it7jeqbczeku6dy0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://convertio.co/jpg-webp/" rel="noopener noreferrer"&gt;convert Jpeg to WEBP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://convertio.co/jpg-avif/" rel="noopener noreferrer"&gt;convert Jpeg to AVIF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4.&lt;strong&gt;compress&lt;/strong&gt; - this is great for website optimisation as well as the environment. Here are some tools that can be used for lossless optimisation:&lt;br&gt;
*&lt;a href="https://shortpixel.com/" rel="noopener noreferrer"&gt;ShortPixel&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://compressor.io/" rel="noopener noreferrer"&gt;Compressor&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://tinypng.com/" rel="noopener noreferrer"&gt;TinyPNG&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://tinyjpg.com/" rel="noopener noreferrer"&gt;TinyJPG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Further listening/reading:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://aneventapart.com/news/post/the-joy-of-optimizing-images-by-una-kravets-aea-video" rel="noopener noreferrer"&gt;“The Joy of Optimizing Images”&lt;/a&gt; by Una Kravets&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Lossless_compression#:~:text=Lossless%20compression%20is%20a%20class,reconstructed%20from%20the%20compressed%20data." rel="noopener noreferrer"&gt;Lossless compression&lt;/a&gt; -  can reconstruct the original exactly&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Lossy_compression" rel="noopener noreferrer"&gt;Lossy compression&lt;/a&gt; - information is lost but (most) users do not notice. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Low tech magazine&lt;/strong&gt; - compression and optimisation can work together as an interesting stylistic choice. For example images in &lt;a href="https://solar.lowtechmagazine.com/" rel="noopener noreferrer"&gt;Low tech magazine&lt;/a&gt; fit really well with the design and vary in size between 100kb and 12kb which is by far smaller than the often advised upper limit for image size of &lt;a href="https://www.jimdo.com/blog/optimize-website-images-for-better-design-seo/#:~:text=Image%20size%3A%20The%20actual%20dimensions,be%20795%C3%97300%20pixels." rel="noopener noreferrer"&gt;1mb (1000kb)&lt;/a&gt; (1mb = 1,000kb)&lt;/p&gt;

&lt;p&gt;5.&lt;strong&gt;avoid special effects&lt;/strong&gt; - even “simple” effects can have a significant impact on the end users’ CPU usage. For example, adding a carousel to an image gallery instead of displaying static images on the page increased peak CPU usage by 7 percent. Adding a simple fade-in effect on page load increased peak CPU usage by 22 percent. (Excerpt From Sustainable Web Design by Tom Greenwood)&lt;/p&gt;

&lt;h3&gt;
  
  
  Good navigation
&lt;/h3&gt;

&lt;p&gt;Every-time a user navigates to a new page - it has to load, and loading a page takes up energy, hence the shorter the user journey - the more energy efficient it is. &lt;br&gt;
And to be honest this is just great user experience advice. As a user I loathe lengthy user journeys or even worse yoyo user journeys (where you pass the same page multiple times creating a bizarre digital Blair Witch project experience).  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching" rel="noopener noreferrer"&gt;Caching&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Caching means temporarily storing data. The best contenders for what you store are things that are unlikely to change or change infrequently. &lt;br&gt;
How you do caching will completely depend on your website, and its' best to google for your specific scenario and tools you are using.&lt;/p&gt;

&lt;p&gt;There is possibly one scenario that most developers will come across - &lt;strong&gt;caching fonts&lt;/strong&gt;. Most websites use third party fonts (specifically google fonts) and most choose their font once and never change it, so it's definitely &lt;a href="https://wpglorify.com/host-google-fonts-locally-levrage-cache/" rel="noopener noreferrer"&gt;worth exploring how to get rid of that unnecessary request call&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://chris.bolin.co/offline/" rel="noopener noreferrer"&gt;Offline website&lt;/a&gt; is possibly the most interesting experimental website that works only offline by caching (check the &lt;a href="https://github.com/chrisbolin/offline" rel="noopener noreferrer"&gt;github&lt;/a&gt;) to show the website only when the user is offline. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Further reading:&lt;/em&gt;&lt;br&gt;
*&lt;a href="https://medium.com/@brockreece/frontend-caching-strategies-38c57f59e254" rel="noopener noreferrer"&gt;Frontend caching strategies&lt;/a&gt;&lt;br&gt;
*&lt;a href="https://dev.to/hazelcast/a-hitchhiker-s-guide-to-caching-patterns-1ghl"&gt;A Hitchhiker’s Guide to Caching Patterns&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Performance/Lazy_loading" rel="noopener noreferrer"&gt;Lazy loading&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A strategy that loads a resource at the point of use/only when its needed. &lt;br&gt;
Think of long scroll blog posts with images, with lazy loading the image at the top of the page loads instantly but all other images load only as the user scrolls down to see them.&lt;br&gt;
There is &lt;a href="https://dev.to/ben/native-lazy-loading-for-img-and-iframe-is-coming-to-the-web-55on"&gt;native lazy loading for img&lt;/a&gt; and iframe tags so really no excuse to not do it. &lt;br&gt;
Also the benefits don't just include a lighter page but it can also be &lt;a href="https://yourmarketingpeople.com/blog/how-lazy-loading-images-can-benefit-your-seo/" rel="noopener noreferrer"&gt;beneficial for SEO&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  API requests
&lt;/h3&gt;

&lt;p&gt;*unnecessary requests - if you have to call an API to get data - you have to call an API there is no way around it. However it might be worth considering reducing API calls that are design rather than utility lead for example using default fonts like Ariel rather than Google Fonts (see caching above).&lt;br&gt;
*break up into small chunks - consider the structure of the API. Do you really need to call all 1000 rows of data when you are planning to show only 10 rows on one page?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Further Reading:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://apievangelist.com/2018/04/20/delivering-large-api-responses-as-efficiently-as-possible/" rel="noopener noreferrer"&gt;Delivering Large API Responses As Efficiently As Possible&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to minimise energy intensity of web data
&lt;/h2&gt;

&lt;p&gt;How much energy does it require for a user to run your website? There is definitely overlap with some stuff above. The more images your website uses, the more videos it streams the more energy your user's device will need to consume to use your website. &lt;/p&gt;

&lt;p&gt;However, there is one thing that does not make a difference to website loading times but if your user is using a device with an OLED it makes a difference - colour. &lt;/p&gt;

&lt;h3&gt;
  
  
  Colour Palette
&lt;/h3&gt;

&lt;p&gt;According to a report from &lt;a href="https://www.zdnet.com/article/google-heres-why-dark-mode-massively-extends-your-oled-phones-battery-life/" rel="noopener noreferrer"&gt;Google&lt;/a&gt; the screen is the biggest single power draw on it's phones and that for devices with OLED displays, darker colours make a significant difference.&lt;/p&gt;

&lt;p&gt;Here you have two choices:&lt;br&gt;
1.create a dark mode version of your website. &lt;br&gt;
2.use darker colours in the design of your website. &lt;/p&gt;

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

&lt;p&gt;Let's not be lazy and actually act on easy to follow small pieces of advice that add up to make a difference (if your website uses images that’s the easiest place to start with). &lt;/p&gt;

&lt;p&gt;This said I should probably practice what I preach and go update my side project website... &lt;/p&gt;

&lt;p&gt;Stay tuned for Part 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://abookapart.com/products/sustainable-web-design" rel="noopener noreferrer"&gt;Sustainable Web Design by Tom Greenwood&lt;/a&gt;&lt;br&gt;
&lt;a href="https://gerrymcgovern.com/books/world-wide-waste/" rel="noopener noreferrer"&gt;World Wide Waste by Gerry McGovern&lt;/a&gt;&lt;br&gt;
&lt;a href="https://manifesto.co.uk/the-impact-of-the-digital-industry-series-intro/" rel="noopener noreferrer"&gt;The impact of the digital industry&lt;/a&gt;&lt;br&gt;
&lt;a href="https://sustainablewebdesign.org/" rel="noopener noreferrer"&gt;Sustainable Web Design&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.sustainablewebmanifesto.com/" rel="noopener noreferrer"&gt;Sustainable Web Manifesto&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.nature.com/articles/d41586-018-06610-y" rel="noopener noreferrer"&gt;How to stop data centres from gobbling up the world’s electricity&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dannyvankooten.com/website-carbon-emissions/" rel="noopener noreferrer"&gt;CO2 emissions on the web&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.websitecarbon.com/" rel="noopener noreferrer"&gt;Website Carbon&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.ecosia.org/?c=en" rel="noopener noreferrer"&gt;A green search&lt;/a&gt;&lt;br&gt;
&lt;a href="https://httparchive.org/reports/page-weight" rel="noopener noreferrer"&gt;Page Weight Report&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.electricitymap.org/map" rel="noopener noreferrer"&gt;Electricity Map&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cool carbon efficient websites
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://lowimpact.organicbasics.com/" rel="noopener noreferrer"&gt;Organic Basics&lt;/a&gt;&lt;br&gt;
&lt;a href="https://solar.lowtechmagazine.com/" rel="noopener noreferrer"&gt;Low Tech Magazine&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>design</category>
      <category>programming</category>
      <category>html</category>
    </item>
    <item>
      <title>Is Brutalist design coming back as Carbon Conscious?</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Mon, 05 Apr 2021 18:19:56 +0000</pubDate>
      <link>https://dev.to/jennyjudova/is-brutalist-design-coming-back-as-carbon-conscious-1c3f</link>
      <guid>https://dev.to/jennyjudova/is-brutalist-design-coming-back-as-carbon-conscious-1c3f</guid>
      <description>&lt;p&gt;Earlier this week the new Space Jam 2021 trailer dropped and of course, the movie needed its own website. As by now the original website from 1997 is an iconic part of living internet history I expected the original website to be somehow incorporated into the marketing campaign. It was not. &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%2Fuploads%2Farticles%2Fdx5wey1xq73gv5b81dql.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%2Fuploads%2Farticles%2Fdx5wey1xq73gv5b81dql.png" alt="tweet about the new space jam website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luckily the original Space Jam website was not completely defaced, just relocated to &lt;a href="https://www.spacejam.com/1996/" rel="noopener noreferrer"&gt;https://www.spacejam.com/1996/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, I am surprised the marketing team decided to ignore the original iconic site. Especially since more and more contemporary websites try to mimic the 90's Brutalist aesthetic which has actually aged quite well.&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%2Fuploads%2Farticles%2F0ync147nu05aay4z9tbk.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%2Fuploads%2Farticles%2F0ync147nu05aay4z9tbk.png" alt="OG Space Jam"&gt;&lt;/a&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%2Fuploads%2Farticles%2Fd1mt2ajkpd8cllukca0e.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%2Fuploads%2Farticles%2Fd1mt2ajkpd8cllukca0e.png" alt="New Space Jam"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Brutalism?
&lt;/h3&gt;

&lt;p&gt;Brutalist web design should not be mistaken with &lt;a href="https://www.designingbuildings.co.uk/wiki/Brutalism#:~:text=Brutalism%2C%20also%20known%20as%20Brutalist,scale%20use%20of%20poured%20concrete." rel="noopener noreferrer"&gt;Brutalist architecture&lt;/a&gt; - a style that became popular primarily in the UK after WWII. It is characterised by a ‘blocky’ appearance with a rigid geometric style and large-scale use of concrete. Brutalism prioritises functionality and structural elements over decorative design.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Brutalist Web design?
&lt;/h3&gt;

&lt;p&gt;There is no one definition of what is Brutalist Web Design. I would argue that it's more a “vibe” than a set of design principles (or lack thereof). Lewis Menelaws' wrote a &lt;a href="https://dev.to/lewismenelaws/brutalist-web-design-a-breath-of-fresh-air-in-the-modern-web-2jk5"&gt;brilliant blog post&lt;/a&gt; trying to explain the design but for my purposes, I think Brutalist Design can be summed as a throwback to the internet of the late 90'ies.&lt;/p&gt;

&lt;p&gt;The internet was the wild west with no existing conventions, patterns or rules. There were no existing solutions to problems like 'What should a navbar look like', or 'How does one present big data' because data was not yet big.&lt;br&gt;
And though the imagination was limitless the developer toolset was very very limited. In fact, in the early 90's it was just HTML. PHP was born in 94, JavaScript in 95, CSS and Flash Player in 96 (if you are interested in web history &lt;a href="https://www.youtube.com/watch?v=41mnNyMxPOA" rel="noopener noreferrer"&gt;How We Got Here&lt;/a&gt; by Richard Campbell is great). So Brutalist websites look either like stripped-down HTML or like they are trying to recreate Flash but on steroids.&lt;/p&gt;

&lt;p&gt;Maybe this is Brutalism - a design that does not follow patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Brutalism is not
&lt;/h3&gt;

&lt;p&gt;Brutalism is sometimes equated with &lt;a href="https://arstechnica.com/gadgets/2019/07/behold-the-most-intentionally-poorly-designed-website-ever-created/" rel="noopener noreferrer"&gt;unusable websites&lt;/a&gt;. Visually the two are similar however they are worlds apart. &lt;/p&gt;

&lt;p&gt;Unusable websites feel like a design exercise that showcases the importance of design. Brutalism - is the design, and it does not equate with the absence of accessibility.&lt;/p&gt;

&lt;p&gt;Arguably the 90's websites were more accessible than contemporary ones, if you needed a button you used the tag &amp;lt; button &amp;gt; not the &amp;lt; a &amp;gt; tag that was then styled to look like a button. My current personal website is HTML only and it scores 100% on accessibility.&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%2Fuploads%2Farticles%2F5l2mmwbtpr7ous1m75d1.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%2Fuploads%2Farticles%2F5l2mmwbtpr7ous1m75d1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Some examples
&lt;/h3&gt;

&lt;p&gt;Brutalism is a “vibe” not a set of rules so it's easier to show. Here is a shortlist of websites that fall under the Brutalist Vibe:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The spectrum is pretty big&lt;/strong&gt;&lt;br&gt;
From the really loud sites that look more like a collage that came to life:&lt;br&gt;
&lt;a href="https://www.toiletpapermagazine.org/" rel="noopener noreferrer"&gt;https://www.toiletpapermagazine.org/&lt;/a&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%2Fuploads%2Farticles%2Fhltpfimaxv0njp96p1gl.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%2Fuploads%2Farticles%2Fhltpfimaxv0njp96p1gl.png" alt="Toiletpaper shop"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://benhalpern.com/" rel="noopener noreferrer"&gt;https://benhalpern.com/&lt;/a&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%2Fuploads%2Farticles%2Fpovss6ss4ghznm32db70.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%2Fuploads%2Farticles%2Fpovss6ss4ghznm32db70.png" alt="Ben Halpern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To those that seem really basic:&lt;br&gt;
&lt;a href="https://x20xx.com/" rel="noopener noreferrer"&gt;https://x20xx.com/&lt;/a&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%2Fuploads%2Farticles%2Fsr3fm03skkapca86ktvo.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%2Fuploads%2Farticles%2Fsr3fm03skkapca86ktvo.png" alt="x20xx"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To somewhere in between: &lt;br&gt;
&lt;a href="http://www.milliondollarhomepage.com/" rel="noopener noreferrer"&gt;http://www.milliondollarhomepage.com/&lt;/a&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%2Fuploads%2Farticles%2Fcevwqdy4ajpbovjv94oj.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%2Fuploads%2Farticles%2Fcevwqdy4ajpbovjv94oj.png" alt="million dollar homepage"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Brutalism dead?
&lt;/h3&gt;

&lt;p&gt;For many, Brutalism is an interesting yet unusable design - fascinating to look at but not commercially viable. The style is relegated to weekend projects and portfolio sites.&lt;/p&gt;

&lt;p&gt;Speaking of personal websites, the creator of Sass &lt;a href="http://www.hamptoncatlin.com/" rel="noopener noreferrer"&gt;Hampton Catlin's portfolio website&lt;/a&gt; is 'chef's kiss' meets 'big flex'.&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%2Fuploads%2Farticles%2F7hdih4nvao7rc0ewrprp.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%2Fuploads%2Farticles%2F7hdih4nvao7rc0ewrprp.png" alt="Hampton Catlin's portfolio website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Brutalism the art world darling?
&lt;/h3&gt;

&lt;p&gt;The only industry that seems to have many examples of Brutalist websites is Art. Why? I can only guess. Maybe because brutalism is perceived as creative, or maybe because it looks like you are cool without trying to be cool; Big Lebowski style. Or maybe because like an ad campaign for Vintage Volga or Gucci Brutalist web design screams ‘90s meets y2k.&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%2Fuploads%2Farticles%2Fmbkakvync5lbevdi4z9l.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%2Fuploads%2Farticles%2Fmbkakvync5lbevdi4z9l.jpg" alt="The Dude from Big Lebowski"&gt;&lt;/a&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%2Fuploads%2Farticles%2Fnt5b5riovsgskzlyev62.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%2Fuploads%2Farticles%2Fnt5b5riovsgskzlyev62.png" alt="Volga Vintage"&gt;&lt;/a&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%2Fuploads%2Farticles%2Fnhrd03zoil9jjcbvhitc.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%2Fuploads%2Farticles%2Fnhrd03zoil9jjcbvhitc.png" alt="Gucci 2020 campaign"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or maybe because many art projects are not interested in selling to mass audiences. Some they are not for profit and others sell out before their work even goes on sale. Thus, their sites do not need to be a streamlined sales funnel. In some cases, the website exists just to showcase past projects.&lt;/p&gt;

&lt;p&gt;Here are some of my personal favourites:&lt;br&gt;
&lt;a href="https://hannahbarry.com/" rel="noopener noreferrer"&gt;https://hannahbarry.com/&lt;/a&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%2Fuploads%2Farticles%2Fgtc1w9dgz9rbh4ije0l9.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%2Fuploads%2Farticles%2Fgtc1w9dgz9rbh4ije0l9.png" alt="Hannah Berry website"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://circa.art/" rel="noopener noreferrer"&gt;https://circa.art/&lt;/a&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%2Fuploads%2Farticles%2Fqg5qh1zzw97oomn6xwi9.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%2Fuploads%2Farticles%2Fqg5qh1zzw97oomn6xwi9.png" alt="Circa Website"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mschf.xyz/" rel="noopener noreferrer"&gt;https://mschf.xyz/&lt;/a&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%2Fuploads%2Farticles%2Fhei88gk0iojizbnjbqt0.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%2Fuploads%2Farticles%2Fhei88gk0iojizbnjbqt0.png" alt="mschf"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.stedelijk.nl/en" rel="noopener noreferrer"&gt;https://www.stedelijk.nl/en&lt;/a&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%2Fuploads%2Farticles%2Fz7rtiaz0ojh52slaxyl3.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%2Fuploads%2Farticles%2Fz7rtiaz0ojh52slaxyl3.png" alt="stedelijk"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://kunsthallezurich.ch/en" rel="noopener noreferrer"&gt;http://kunsthallezurich.ch/en&lt;/a&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%2Fuploads%2Farticles%2Fbwv068p83dofcvacj89s.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%2Fuploads%2Farticles%2Fbwv068p83dofcvacj89s.png" alt="kunsthalle zurich"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.cabinet.uk.com/" rel="noopener noreferrer"&gt;https://www.cabinet.uk.com/&lt;/a&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%2Fuploads%2Farticles%2Fp93ibz0jkcuay9mhxobk.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%2Fuploads%2Farticles%2Fp93ibz0jkcuay9mhxobk.png" alt="cabinet"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.greengrassi.com/" rel="noopener noreferrer"&gt;https://www.greengrassi.com/&lt;/a&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%2Fuploads%2Farticles%2Fdl2qfzgv77m331m3ih4g.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%2Fuploads%2Farticles%2Fdl2qfzgv77m331m3ih4g.png" alt="green grassi"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://nicoletticontemporary.com/" rel="noopener noreferrer"&gt;https://nicoletticontemporary.com/&lt;/a&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%2Fuploads%2Farticles%2Fmixm01kxmqcyctgvioty.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%2Fuploads%2Farticles%2Fmixm01kxmqcyctgvioty.png" alt="nicoletti contemporary"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://new.deappel.nl/nl/" rel="noopener noreferrer"&gt;https://new.deappel.nl/nl/&lt;/a&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%2Fuploads%2Farticles%2F0xtczipcy5ktu67vttv8.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%2Fuploads%2Farticles%2F0xtczipcy5ktu67vttv8.png" alt="De Appel Amsterdam website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And of course my own pride and joy &lt;a href="https://climateart.org.uk/" rel="noopener noreferrer"&gt;https://climateart.org.uk/&lt;/a&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%2Fuploads%2Farticles%2Fjpj10krzb6sbzppdmno2.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%2Fuploads%2Farticles%2Fjpj10krzb6sbzppdmno2.png" alt="climate art"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Brutalism as Climate conscious web design
&lt;/h3&gt;

&lt;p&gt;Let's face it Millennials are a generation that was taught about climate change from primary school, if not kindergarten, and so was Gen Z. As we move from fast fashion to vintage, from cow milk to oat milk, from liquid soap to bar soap it's no surprise that some of us also started looking into the carbon footprint of their website via tools like &lt;a href="https://www.websitecarbon.com/" rel="noopener noreferrer"&gt;Website Carbon&lt;/a&gt;. Millennials (people between 25 and 40) now make the bulk of people currently working in tech and building websites.&lt;/p&gt;

&lt;p&gt;And there are some incredibly high profile organisations that have adopted Brutalist design because it is environmentally friendly.&lt;/p&gt;

&lt;p&gt;Elon Musk (love or hate him) has to always be in the avant-garde and the website of &lt;a href="http://www.muskfoundation.org/" rel="noopener noreferrer"&gt;Musk Foundation&lt;/a&gt; is plain HTML with 7 lines of text. The website is perfectly in line with the climate-conscious mission statement.&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%2Fuploads%2Farticles%2F41c5q42ay8bs7fi0qt3j.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%2Fuploads%2Farticles%2F41c5q42ay8bs7fi0qt3j.png" alt="musk foundation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The art world darlings &lt;a href="https://formafantasma.com/" rel="noopener noreferrer"&gt;Formafantasma&lt;/a&gt; wrote a climate manifesto when they redesigned their website. &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%2Fuploads%2Farticles%2Fb4r5u999wwct87zvesnc.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%2Fuploads%2Farticles%2Fb4r5u999wwct87zvesnc.png" alt="forma fantasma website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So what does this all mean? It means that there is an argument to be made that web design like all other design: fashion, interior, architecture, is cyclical. y2k is back not just in fashion but also in web design.&lt;/p&gt;

&lt;p&gt;On a personal note as a person who knows enough about design to see what looks good and what looks bad but not enough to actually create a beautiful design the fact that we are moving in the carbon-conscious direction of less is more and basic is cool - makes me very very happy. If the Brutalist whimsy comes back repackaged as 'Good for the Earth', well, that's just brilliant news.&lt;/p&gt;

&lt;p&gt;Returning back to Space Jam guess which of the two sites is better for the environment?&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%2Fuploads%2Farticles%2F5pdvcs11pm1zmfv93x1q.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%2Fuploads%2Farticles%2F5pdvcs11pm1zmfv93x1q.png" alt="New Space Jam website carbon results"&gt;&lt;/a&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%2Fuploads%2Farticles%2Fv8rrpcx3hqq1etcb6m0x.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%2Fuploads%2Farticles%2Fv8rrpcx3hqq1etcb6m0x.png" alt="OG Space Jam website carbon results"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>webdev</category>
      <category>html</category>
      <category>javascript</category>
    </item>
    <item>
      <title>SetInterval and EmberJs</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Tue, 05 Jan 2021 23:03:31 +0000</pubDate>
      <link>https://dev.to/jennyjudova/setinterval-and-emberjs-2b4l</link>
      <guid>https://dev.to/jennyjudova/setinterval-and-emberjs-2b4l</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y5mbjQOD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8p13nhc5brk9sfptf29w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y5mbjQOD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8p13nhc5brk9sfptf29w.png" alt="Screenshot of Snake game"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Context
&lt;/h3&gt;

&lt;p&gt;I was working on rewriting a vanilla JS snake game in Ember JS. One of the basic features of the game is that the snake moves continuously even if the user is not pushing any button.&lt;/p&gt;

&lt;p&gt;In vanilla JS the solution to this is straightforward&lt;br&gt;
&lt;code&gt;interval = setInterval(&lt;/code&gt;gameMoves, 1000)&lt;code&gt;&lt;br&gt;
and at the end of the game you just do&lt;/code&gt;clearInterval(interval)`&lt;/p&gt;

&lt;p&gt;My assumption was that Ember would not be much different, and would look like this:&lt;br&gt;
&lt;code&gt;this.interval =setInterval(this.gameMoves, 1000);&lt;/code&gt;&lt;br&gt;
This did nothing.&lt;/p&gt;

&lt;p&gt;Assuming the syntax was off somewhere (I am dyslexic so commas and brackets are my mortal enemies), I tried this:&lt;br&gt;
&lt;code&gt;this.interval = setInterval(this.gameMoves(), 1000);&lt;/code&gt; &lt;br&gt;
&lt;code&gt;this.gameMoves()&lt;/code&gt; ran once and stopped. &lt;/p&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;Digging in I discovered that when I console.log &lt;code&gt;this' in &lt;/code&gt;this.moveOutcomes&lt;code&gt; after running &lt;/code&gt;this.interval =setInterval(this.moveOutcomes, 1000);&lt;code&gt; I  don't actually get &lt;/code&gt;this&lt;code&gt; but &lt;/code&gt;window`.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h9NvVn-j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hdn6zo9prpgp7n7cwkax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h9NvVn-j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hdn6zo9prpgp7n7cwkax.png" alt="Screenshot of what happens when this is console logged in a function that was called by setInterval"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After an evening of googling, asking twitter, assuming that I am losing my sanity, and reminding myself that if I can write something in vanilla JS then it surely can be done in Ember. My colleague had the answer to my conundrum &lt;code&gt;this&lt;/code&gt; needed binding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;this.interval = setInterval(this.moveOutcomes.bind(this), 1000);&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Alternative solution
&lt;/h3&gt;

&lt;p&gt;Someone on twitter suggested to use &lt;code&gt;later&lt;/code&gt; which worked quite well but I felt it was a bit of an overkill. &lt;/p&gt;

&lt;p&gt;Here is a &lt;a href="https://ember-twiddle.com/b6230aab046ec37e43b15334930f0427?numColumns=2&amp;amp;openFiles=components.my-component%5C.js%2Ctemplates.components.my-component%5C.hbs"&gt;twiddle&lt;/a&gt; if you are interested.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why am I sharing this?
&lt;/h3&gt;

&lt;p&gt;Because Ember is awesome, and Ember newbies should be able to google for answers.&lt;/p&gt;

&lt;p&gt;But if googling fails &lt;a href="https://discord.com/channels/480462759797063690/483601670685720591"&gt;Ember Discord channel&lt;/a&gt; is amazing.&lt;/p&gt;

</description>
      <category>ember</category>
      <category>codenewbie</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>What I learnt in my first year as a junior developer</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Thu, 24 Dec 2020 12:15:52 +0000</pubDate>
      <link>https://dev.to/jennyjudova/what-i-learnt-in-my-first-year-as-a-junior-developer-igb</link>
      <guid>https://dev.to/jennyjudova/what-i-learnt-in-my-first-year-as-a-junior-developer-igb</guid>
      <description>&lt;p&gt;In autumn 2019 I went through a Bootcamp, in winter I started job hunting, and in the last week of February 2020 just two weeks before the UK went into lockdown I started my first job as a front end engineer. Here is a mixture of lessons learnt and things that happened that are likely to happen to other junior devs.&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%2Frku9g8dyhfed5nl7suqh.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%2Frku9g8dyhfed5nl7suqh.png" alt="my work mac in a green case with stickers on it"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1 - you will have to learn Git
&lt;/h3&gt;

&lt;p&gt;Bootcamps and I am guessing CS degrees don't really cover Git. &lt;/p&gt;

&lt;p&gt;I realised that my git knowledge is inadequate on day one after staring at a colleague asking 'Cherry what..?'&lt;/p&gt;

&lt;p&gt;The weekend after my first week was spent in git tutorials and researching GUI.&lt;/p&gt;

&lt;p&gt;My favourite resource was this game &lt;a href="https://learngitbranching.js.org/" rel="noopener noreferrer"&gt;https://learngitbranching.js.org/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2 - you will have to unlearn and relearn
&lt;/h3&gt;

&lt;p&gt;No matter how new or how long you've been in an industry, you already picked up some weird habits. Mine was using add all in Git. It took a really bad rebase to unlearn it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3 - you will give the weirdest explanations to the question 'what do you do?'
&lt;/h3&gt;

&lt;p&gt;Mine vary from 'I create buttons' to 'I am the translator between the machine and the human'.&lt;/p&gt;

&lt;h3&gt;
  
  
  4 - you will learn a new framework or language
&lt;/h3&gt;

&lt;p&gt;No matter how many or how few languages or frameworks you know, you will definitely have to learn more.&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%2Fcnvxd1e1052lta46cmzz.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%2Fcnvxd1e1052lta46cmzz.png" alt="Me coding along to an Ember js tutorial"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5 - open source
&lt;/h3&gt;

&lt;p&gt;Open source is something I always wanted to do. I firmly believe in giving back to the community. Also, I have no imagination when it comes to project ideas so helping communities I care about create tools they will actually use is an excellent use of my time and skill.&lt;/p&gt;

&lt;p&gt;Open source, I found is surprisingly hard to get into. There are loads of projects, but the information about them is scattered and really hard to find.&lt;/p&gt;

&lt;p&gt;Here I don't really have advice just a suggestion - if you can do it, do it. And if you run an open-source project and need help - get in touch.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 - "It is a truth universally acknowledged, that a developer in possession of friends, must be in want to create a website for them."
&lt;/h3&gt;

&lt;p&gt;Two of my friends approached me for 'advice' in late spring. I gave the sensible grown-up advice - use Squarespace. They came back with a counteroffer - of me having complete freedom in creating a brutalist website (my weakness) for their non for profit &lt;a href="https://climateart.org.uk/" rel="noopener noreferrer"&gt;Climate Art&lt;/a&gt; pro bono. They had a strong case why they needed a developer (... I know I was suckered in ...)&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%2Fl7qf8zzg7vgoh2qat90j.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%2Fl7qf8zzg7vgoh2qat90j.png" alt="screenshot of Climate Art Website with a message in the developer console that reads "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7 - You will have more control of your product than you expected
&lt;/h3&gt;

&lt;p&gt;I am part of a big team. Any project I work on has a product manager, a programme manager, a UX researcher, a UX designer, and even a UX writer. &lt;/p&gt;

&lt;p&gt;I have no control of the text that is displayed on a button that I create. However, even within a large team, I am still surprised how much say and control I have in every feature I work on.&lt;/p&gt;

&lt;h3&gt;
  
  
  8 - less is more
&lt;/h3&gt;

&lt;p&gt;In a Bootcamp, you will write a hundred lines of code in one day. At work, it's more like a hundred in a month.&lt;/p&gt;

&lt;h3&gt;
  
  
  9 - communication
&lt;/h3&gt;

&lt;p&gt;No matter what is your chosen career or industry, communication is essential. &lt;/p&gt;

&lt;p&gt;Engineering is no different, arguably, communication is even more critical as you have to understand what senior engineers are telling you, and to be able to explain what you are doing to non-engineers on your team.&lt;/p&gt;

&lt;h3&gt;
  
  
  10 - being brave enough to admit that you don't understand something
&lt;/h3&gt;

&lt;p&gt;No one enjoys looking dumb or feeling dumb. &lt;/p&gt;

&lt;p&gt;When someone is explaining something, the knee jerk reaction is to nod along. I am still learning to break that habit and to speak out when I do not understand something.&lt;/p&gt;

&lt;h3&gt;
  
  
  11 - ask for help
&lt;/h3&gt;

&lt;p&gt;It's great to try and figure things out on your own, but at one point you have to be able to ask for help.&lt;/p&gt;

&lt;p&gt;And that's a list that sums up my first year. Onwards and upwards let's bring on year 2.&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>career</category>
    </item>
    <item>
      <title>CyberSecurity acronyms cheat sheet and dictionary</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Tue, 15 Sep 2020 20:50:55 +0000</pubDate>
      <link>https://dev.to/jennyjudova/cybersecurity-acronyms-cheat-sheet-and-dictionary-4ph3</link>
      <guid>https://dev.to/jennyjudova/cybersecurity-acronyms-cheat-sheet-and-dictionary-4ph3</guid>
      <description>&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%2Fv8yu0woqxc7i1xic8ksp.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%2Fv8yu0woqxc7i1xic8ksp.png" alt="Alt Text: A colorful drawing that consists of three circles at the top and a computer under them. The first circle shows a lock, the second a red alarm, the third a stethoscope. The computer monitor shows an open envelope, a red letter is poking out with an image of a skull and crossbones in black"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cybersecurity loves it's acronyms to the point where an acronym can have other acronyms in it. &lt;/p&gt;

&lt;p&gt;This might be a way of saving time if you are one of the industry's old guards but for newcomers this can be frustrating and alienating. &lt;/p&gt;

&lt;p&gt;It's tough enough to wrap your brain around Cloud Security Posture Management&lt;br&gt;
without first having to decrypt what CSPM stands for. &lt;/p&gt;

&lt;p&gt;This is why I am sharing my cyber security acronym cheat sheet and dictionary with the world. It's work in progress so do flag up acronyms/terms I missed, if you disagree on the meaning do let me know - we are all still learning after all.&lt;/p&gt;

&lt;p&gt;I will try to keep this in alphabetical order but I am dyslexic so it's more of a alphabetical-ish order.&lt;/p&gt;

&lt;p&gt;A thing to flag up in many cases the only resources that explain these concepts are blog posts that belong to various cyber security companies. Often these blog posts consist of marketing or sales material if for some reason I link to some blog posts it's because I think it's good at explaining a concept not because I endorse the product. Also as disclosure I work in the industry. &lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;first part&lt;/strong&gt; is the acronym cheat sheet, the &lt;strong&gt;second part&lt;/strong&gt; is the dictionary of terms. &lt;/p&gt;

&lt;h3&gt;
  
  
  Part 1: Acronym Cheat Sheet
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;0day&lt;/strong&gt; - Zero Day vulnerability&lt;br&gt;
&lt;strong&gt;2FA&lt;/strong&gt; - Two factor Authentication&lt;br&gt;
&lt;strong&gt;AV&lt;/strong&gt; - Antivirus&lt;br&gt;
&lt;strong&gt;CVE&lt;/strong&gt; - Common Vulnerabilities and Exposures&lt;br&gt;
&lt;strong&gt;CVSS&lt;/strong&gt; - Common Vulnerability Scoring System&lt;br&gt;
&lt;strong&gt;CSPM&lt;/strong&gt; - Cloud Security Posture Management&lt;br&gt;
&lt;strong&gt;CSRF&lt;/strong&gt; - Cross-site request forgery&lt;br&gt;
&lt;strong&gt;CNA&lt;/strong&gt; - CVE Numbering Authority &lt;br&gt;
&lt;strong&gt;DDoS attack&lt;/strong&gt; - Distributed denial-of-service attack&lt;br&gt;
&lt;strong&gt;CTF&lt;/strong&gt; - Capture the Flag&lt;br&gt;
&lt;strong&gt;EDR&lt;/strong&gt; - Endpoint Detection and Response&lt;br&gt;
&lt;strong&gt;EPSS&lt;/strong&gt; - Exploit Prediction Scoring System&lt;br&gt;
&lt;strong&gt;EPP&lt;/strong&gt; - Endpoint Protection Platform&lt;br&gt;
&lt;strong&gt;FIM&lt;/strong&gt; - File Integrity Manager&lt;br&gt;
&lt;strong&gt;HOS&lt;/strong&gt; - Head of Security&lt;br&gt;
&lt;strong&gt;IOM&lt;/strong&gt; - Indicator of Misconfiguration&lt;br&gt;
&lt;strong&gt;IOA&lt;/strong&gt; - Indicator of Attack&lt;br&gt;
&lt;strong&gt;IOT&lt;/strong&gt; - Internet of Things&lt;br&gt;
&lt;strong&gt;InfoSec&lt;/strong&gt; - Information Security&lt;br&gt;
&lt;strong&gt;ItSecOps&lt;/strong&gt; (SecOps or Dev SecOps) - IT Security Operations&lt;br&gt;
&lt;strong&gt;IDS&lt;/strong&gt; - Intrusion Detection System&lt;br&gt;
&lt;strong&gt;IPS&lt;/strong&gt; - Intrusion Prevention System&lt;br&gt;
&lt;strong&gt;LDAP Injection&lt;/strong&gt; - Lightweight Directory Access Protocol Injection&lt;br&gt;
&lt;strong&gt;LFI&lt;/strong&gt; - Local file inclusion&lt;br&gt;
&lt;strong&gt;MFA&lt;/strong&gt; - Multi-factor authentication&lt;br&gt;
&lt;strong&gt;MSSP&lt;/strong&gt; - Managed Security Service Provider &lt;br&gt;
&lt;strong&gt;NGAV&lt;/strong&gt; - Next-generation antivirus&lt;br&gt;
&lt;strong&gt;SPOG&lt;/strong&gt; - Single pane of glass aka single pane view&lt;br&gt;
&lt;strong&gt;SSRF&lt;/strong&gt; - Server-side request forgery&lt;br&gt;
&lt;strong&gt;SSO&lt;/strong&gt; - Single sign-on protocols&lt;br&gt;
&lt;strong&gt;SNMP&lt;/strong&gt; - Simple Network Management Protocol&lt;br&gt;
&lt;strong&gt;SMB&lt;/strong&gt; - Server Message Block&lt;br&gt;
&lt;strong&gt;SOC&lt;/strong&gt; - Security Operations Center&lt;br&gt;
&lt;strong&gt;TCP&lt;/strong&gt; - Transmission Control Protocol&lt;br&gt;
&lt;strong&gt;TTP&lt;/strong&gt; - Tactics, Techniques, and Procedures&lt;br&gt;
&lt;strong&gt;RBAC&lt;/strong&gt; - Rule-based Access Control&lt;br&gt;
&lt;strong&gt;RTR&lt;/strong&gt; - Real Time Response&lt;br&gt;
&lt;strong&gt;RCE&lt;/strong&gt; - Remote Code Execution&lt;br&gt;
&lt;strong&gt;RFI&lt;/strong&gt; - Request for information&lt;br&gt;
&lt;strong&gt;WAPT&lt;/strong&gt; - Web Application Penetration Testing&lt;br&gt;
&lt;strong&gt;WoV&lt;/strong&gt; - Window of Vulnerability&lt;br&gt;
&lt;strong&gt;XSS&lt;/strong&gt; - Cross-site scripting&lt;br&gt;
&lt;strong&gt;XXE&lt;/strong&gt; - XML external entity injection&lt;/p&gt;

&lt;h3&gt;
  
  
  Part 2: CyberSecurity Dictionary
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Antiviruses&lt;/strong&gt; &lt;br&gt;
&lt;em&gt;AV software, anti-malware&lt;/em&gt; &lt;br&gt;
A computer program that protects your computer from various computer threats. See also NGAV.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSPM&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Cloud Security Posture Management&lt;/em&gt;&lt;br&gt;
Concerns itself with correctly configuring public cloud IAAS (Infrastructure as a Service) and PAAS (Platform as a Service) to address cloud risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Common Vulnerabilities and Exposures&lt;/em&gt; &lt;br&gt;
A reference-method for publicly known information-security vulnerabilities and exposures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CTF&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Capture the Flag&lt;/em&gt;&lt;br&gt;
"Flags" are secrets hidden in purposefully-vulnerable programs or websites. Competitors steal flags either from other competitors (attack/defense-style CTFs) or from the organizers (jeopardy-style challenges). Several variations exist, including hiding flags in hardware devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSRF&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Cross-site request forgery&lt;/em&gt;&lt;br&gt;
An attack that forces an end user to execute unwanted actions on a web application in which they’re currently authenticated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CNA&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;CVE Numbering Authority&lt;/em&gt;&lt;br&gt;
Organizations that are authorized to assign CVE IDs to vulnerabilities affecting products within their distinct, agreed-upon scope, for inclusion in first-time public announcements of new vulnerabilities. &lt;br&gt;
&lt;a href="https://cve.mitre.org/cve/cna.html#:~:text=CVE%20Numbering%20Authorities%20(CNAs)%20are,public%20announcements%20of%20new%20vulnerabilities." rel="noopener noreferrer"&gt;for more info&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MFA&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Multi factor authentication&lt;/em&gt; &lt;br&gt;
A security method where a user is granted access only after they provide two or more pieces of evidence that they are in fact the real user. Possibly the most popular method is how banks use questions such as 'your mother's maiden name', 'your first pet's name' etc&lt;/p&gt;

&lt;p&gt;The majority of online platforms have moved to 2FA or MFA, where after providing your name and password you receive a text/email with a number that you have to input to prove that you are you. Or using apps such as &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;amp;hl=en_GB" rel="noopener noreferrer"&gt;Google's Authenticator&lt;/a&gt; or &lt;a href="https://duo.com/" rel="noopener noreferrer"&gt;duo&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;If you ever rolled your eyes at 2FA its worth watching the leaked &lt;a href="https://thehackernews.com/2020/07/iranian-hacking-training-videos.html" rel="noopener noreferrer"&gt;Iranian hacker training video&lt;/a&gt; and then enabling 2FA EVERYWHERE. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NGAV&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Next-generation antivirus&lt;/em&gt;&lt;br&gt;
As the word next generation suggests this AV uses more advance techniques to protect your computer more specifically it uses AI. Usually behavior AI that learns the usual behavior on an endpoint aka your machine and is able to tell when behavior differs from an established pattern or if the user engages in risky behavior.&lt;/p&gt;

&lt;p&gt;Please do not be sceptical and just assume that NGAV is the same as the good old antivirus that some marketing department decided to glue AI to. New Gen should be able to protect you from intrusions that do not change your environment and/or do not introduce new files to your system. For example threats such as a remote login using an existing vulnerability.&lt;/p&gt;

&lt;p&gt;Unlike their predecessors NGAVs focus on events and analyze events and actions, they should be able to identify malicious intent behavior and activity not just files.  &lt;/p&gt;

&lt;p&gt;The aim of NGAV is to stop a breach before it occurs.&lt;/p&gt;

&lt;p&gt;Most resources on the topic are sales blogs from &lt;a href="https://www.crowdstrike.com/epp-101/next-generation-antivirus-ngav/" rel="noopener noreferrer"&gt;CrowdStrike&lt;/a&gt;, &lt;a href="https://cipher.com/blog/next-generation-antivirus-ngav-vs-traditional-subscription-antivirus/" rel="noopener noreferrer"&gt;Cipher&lt;/a&gt;, and &lt;a href="https://www.carbonblack.com/definitions/what-is-next-generation-antivirus-ngav/" rel="noopener noreferrer"&gt;CarbonBlack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WoV&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Window of Vulnerability&lt;/em&gt;&lt;br&gt;
The time from when a software exploit first becomes active to the time when the number of vulnerable systems shrinks to insignificance.&lt;/p&gt;

</description>
      <category>security</category>
      <category>codenewbie</category>
      <category>wecoded</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>How to build a chrome plugin</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Tue, 08 Sep 2020 22:42:56 +0000</pubDate>
      <link>https://dev.to/jennyjudova/how-to-build-a-chrome-plugin-4jg2</link>
      <guid>https://dev.to/jennyjudova/how-to-build-a-chrome-plugin-4jg2</guid>
      <description>&lt;p&gt;Chrome plugins are fun and can be a useful and personalised way to start your day. &lt;/p&gt;

&lt;p&gt;Best part is the are actually relatively simple to do. &lt;/p&gt;

&lt;p&gt;All you need is html, css, and js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Setup
&lt;/h2&gt;

&lt;p&gt;The basic setup is so basic I found myself staring at my computer saying what? &lt;/p&gt;

&lt;p&gt;Create manifest.json file &lt;a href="https://developer.chrome.com/extensions/manifest" rel="noopener noreferrer"&gt;chrome's documentation&lt;/a&gt; is actually great and in depth if you want to learn more but for this plug in the manifest will be bare bones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "manifest_version": 2,
  "name": "Chrome plugin template Devto",
  "description": "Chrome plugin template Devto",
  "version": "1",
  "author": "Jenny Judova",
  "browser_action": {
    "default_title": "Fun with Flags"
  },
  "chrome_url_overrides": {
    "newtab": "newtab.html"
  },
  "permissions": [
    "activeTab",
    "storage"
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Print Hello World
&lt;/h2&gt;

&lt;p&gt;Now let's do the thing and print 'Hello World.'&lt;/p&gt;

&lt;p&gt;In the manifest.json chrome_url_overrides we stated that the new tab override html file is called newtab.html so lets create that file. &lt;/p&gt;

&lt;p&gt;newtab.html&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en" dir="ltr"&amp;gt;

&amp;lt;head&amp;gt;
  &amp;lt;meta charset="utf-8"&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
  &amp;lt;h1&amp;gt;Hello World!&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is great but how do we check if it worked? We can't really go to localhost for this. Instead, do this: &lt;br&gt;
1 - go to chrome://extensions/&lt;br&gt;
2 - make sure that the developer mode toggle is on&lt;br&gt;
3 - click on load unpacked button&lt;br&gt;
4 - choose the folder with your project&lt;br&gt;
5 - click ‘select’ &lt;br&gt;
6 - open new tab&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%2Fldytbysdsf27f03fl3et.gif" 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%2Fldytbysdsf27f03fl3et.gif" alt="gif showing the step-by-step process of uploading the plugin to chrome"&gt;&lt;/a&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%2Fh3zp3yfiq9yb6f9xsrjd.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%2Fh3zp3yfiq9yb6f9xsrjd.png" alt="Hello World displayed in a new tab"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BOOM! &lt;/p&gt;

&lt;p&gt;Now let's make this extension do something like show flags and countries. Don't judge Fun with Flags I chose the flag API as it does not require a token. &lt;/p&gt;
&lt;h2&gt;
  
  
  How to make an API call
&lt;/h2&gt;

&lt;p&gt;Let's create a file called newtab.js and link it up in newtab.html by adding&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script type="text/javascript" src="newtab.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just before the closing the body tag. Let's do a sanity check and in newtab.js add&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function init() {

  console.log('HI')

}

window.addEventListener('DOMContentLoaded', init)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple .fetch should do the trick for the API call. Like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  function getAllFlags() {
    fetch('https://restcountries.eu/rest/v2/all?fields=name;flag;region;nativeName;')
      .then(response =&amp;gt; response.json())
      .then(response =&amp;gt; {
        flags = response
        chrome.storage.local.set({ data: flags });
      })
      .catch(err =&amp;gt; console.log(err))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have the information about flags now lets display them in the UI by adding a function to display them and some css, for this it's worth looking at the &lt;a href="https://github.com/JennyJudova/chrome-plugin-devto" rel="noopener noreferrer"&gt;project's github&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use chrome.storage.local
&lt;/h2&gt;

&lt;p&gt;The way the extension works at the moment is that every time you open a new tab a new api call takes place. Considering most of us open a dozen tabs every hour it might be more efficient to store the request response in &lt;strong&gt;chrome.storage.local&lt;/strong&gt; and to check if it has data before running the call to the api.&lt;/p&gt;

&lt;p&gt;To achieve this we have to use &lt;br&gt;
&lt;strong&gt;chrome.storage.local.set&lt;/strong&gt; and &lt;strong&gt;chrome.storage.local.get&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Also make sure to avoid this &lt;strong&gt;common pitfall&lt;/strong&gt; - check that your manifest.json has&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  "permissions": [
    "storage"
  ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To save something to local storage lets add this line to the fetch request&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chrome.storage.local.set({ data: flags });&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;so the whole thing will look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fetch('https://restcountries.eu/rest/v2/all?fields=name;flag;region;nativeName;')
        .then(response =&amp;gt; response.json())
        .then(response =&amp;gt; {
          console.log('empty')
          flags = response
          chrome.storage.local.set({ data: flags });
        })
        .catch(err =&amp;gt; console.log(err))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets add a function that will check local storage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  function checkLocalStorage() {
    chrome.storage.local.get('data', function (result) {
      result.data == undefined ? isLocalStorageFull = false : isLocalStorageFull = true
      getAllFlags(isLocalStorageFull)
    });
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's also update the getAllFlags function to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  function getAllFlags(isLocalStorageFull) {
    if (isLocalStorageFull) {
      chrome.storage.local.get('data', function (result) {
        flags = result.data
        displayFlags(flags)
      })
    } else {
      fetch('https://restcountries.eu/rest/v2/all?fields=name;flag;region;nativeName;')
        .then(response =&amp;gt; response.json())
        .then(response =&amp;gt; {
          flags = response
          chrome.storage.local.set({ data: flags });
          displayFlags(flags)
        })
        .catch(err =&amp;gt; console.log(err))
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essentially this is our plug in done. Feel free to add your own css or copy paste from the finished app &lt;a href="https://github.com/JennyJudova/chrome-plugin-devto" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;This is what we end up with. &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%2F0ne8b0ndc7iztp3y70xu.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%2F0ne8b0ndc7iztp3y70xu.png" alt="Fun with Flags plug in that has the title and underneath it a grid showing flags and their countries"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>javascript</category>
    </item>
    <item>
      <title>#Todo app tutorial in Ember Octane for those who know React</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Sun, 19 Apr 2020 11:31:12 +0000</pubDate>
      <link>https://dev.to/jennyjudova/todo-app-tutorial-in-ember-octane-for-those-who-know-react-1741</link>
      <guid>https://dev.to/jennyjudova/todo-app-tutorial-in-ember-octane-for-those-who-know-react-1741</guid>
      <description>&lt;p&gt;Like many Ember developers I came across it when I started working in my current job. &lt;/p&gt;

&lt;p&gt;Ember has been around since 2011 (React was released in 2013) and is used by some well known websites like Linkedin, Apple Music and Twitch. Unlike Vue, Gatsby or React Ember, never was the sexy new toy every developer spent the weekend learning. Which I think is a shame as the framework is scalable and I find that it offers itself to collaboration far better than some other frameworks. &lt;/p&gt;

&lt;p&gt;So to encourage others to explore Ember here is a tutorial of how to build a TODO app with CRUD functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why Am I comparing Ember and React?
&lt;/h4&gt;

&lt;p&gt;React is the lingua franca of front end development. And, I find that, it’s always easier to learn a new language when it's directly compared with something you already know, even if the comparisons are not perfect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bellow is my take on Ember and its community but feel free to skip to the tutorial below that.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  React vs Ember
&lt;/h2&gt;

&lt;p&gt;React is not a fussy framework you throw everything into one component: the DOM, a few functions, an API request, and the kitchen sink. And everything works. No matter how messy you are, React will figure it out. &lt;br&gt;
Ember likes tidiness. Ember likes order. In Ember everything has its place. One cannot be messy in Ember. &lt;br&gt;
React is awesome for solo weekend projects, Ember is great if you are working with others. &lt;/p&gt;
&lt;h3&gt;
  
  
  Quirks anyone new to Ember will face:
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Lack of resources 
&lt;/h4&gt;

&lt;p&gt;Google “How to do … in React?’ and you will get thousands of resources from official documentation, to Stack Overflow, to opinion pieces on Medium and educational ones on Dev.to. Learning React I can't recall many cases where a Google search would fail to answer my question. &lt;br&gt;
Ember has fewer resources. There is the official documentation (which is amazing), a few blogs, and the Ember discord channel. This is a great list of Ember &lt;a href="https://github.com/abhilashlr/emberjs2019-posts"&gt;resources&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  It’s hard to stay anonymous
&lt;/h4&gt;

&lt;p&gt;As React is known and used by so many developers I sometimes question if it can even be called a community. Ember is used by fewer developers and almost all developers that actively use it can be found on the Ember discord forum. The main event of the year is Ember Conf, and that gathers most of Ember devs. Another thing to flag up is that most developers who use Ember on a day-to-day basis work for a few dozen companies. Because of the size and the fact that the community is so centralised its hard to stay anonymous within it. &lt;/p&gt;
&lt;h4&gt;
  
  
  Community made of professionals
&lt;/h4&gt;

&lt;p&gt;I have yet to meet developers who took up Ember as a fun weekend thing to learn. So in most cases we all learn Ember because companies we work for use Ember. Ember is a community of professionals, which also makes it interesting because once you get past the initial intimidation, everyone within it is your current, past, or future colleague. &lt;/p&gt;
&lt;h2&gt;
  
  
  Tutorial
&lt;/h2&gt;

&lt;p&gt;As a reminder I am a newbie to Ember teaching others so this tutorial is very much a practical how to get stuff to work here and now rather than a birds eye view of how things work in Ember. For documentation, check out &lt;a href="https://emberjs.com/"&gt;https://emberjs.com/&lt;/a&gt;. &lt;/p&gt;
&lt;h3&gt;
  
  
  Getting started.
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Open your terminal&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 - Run &lt;em&gt;npm install -g ember-cli&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The version I am using now is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ember --version
ember-cli: 3.16.0
node: 12.16.0
os: linux x64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;2 - &lt;em&gt;ember new todo-app&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;3 - &lt;em&gt;cd todo-app&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;4 - open the app in your editor&lt;/li&gt;
&lt;li&gt;5 - back in the terminal run 
&lt;em&gt;ember serve&lt;/em&gt; or &lt;em&gt;npm start&lt;/em&gt;
This will start the app and you can view it in &lt;em&gt;&lt;a href="http://localhost:4200/"&gt;http://localhost:4200/&lt;/a&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first thing to flag up is the folder and file structure in Ember vs that of React. &lt;br&gt;
The most basic app in React will have&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index.html 
style.css
index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can throw everything into index.js (functions, api calls etc) never touching the html and the css files and it will work. &lt;/p&gt;

&lt;p&gt;In ember every new app will have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App
    Components
    Controllers
    Helpers
    Models
    Routes
Styles
Templates
    Application.hbs
App.js
Index.html
Router.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To get ‘Hello World’ printed on the screen go to &lt;strong&gt;application.hbs&lt;/strong&gt; delete&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{{outlet}}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;and paste in&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;now for our app change it back to&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{{outlet}}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Everything that would find its way into one component in React will be scattered between &lt;strong&gt;Route&lt;/strong&gt;, &lt;strong&gt;Component&lt;/strong&gt; and &lt;strong&gt;Template&lt;/strong&gt; in Ember. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Template&lt;/strong&gt; is your html. Hbs stands for handlebar. The main thing to know is that Handlebars are logic less so no mapping or filtering within your html.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Route&lt;/strong&gt;... the best way of thinking about it is that Route is your Component Will Mount (it's not really but for practical purposes of getting s*it done think of it that way). The data that you want to see on the screen when the page loads is fetched/axioed/requested in the Route.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Component&lt;/strong&gt; is where you put any functions that will react to any user input, button clicks, essentially any user interactions. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Helpers&lt;/strong&gt; is where little reusable helper functions go. For example if you are converting Fahrenheit into Celsius this is where the function that does that goes. &lt;/p&gt;

&lt;p&gt;As for &lt;strong&gt;Controllers&lt;/strong&gt; well to quote a question posed n Ember Guide ‘Should we use controllers in my application? I've heard they're going away!’&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 - Creating a route
&lt;/h3&gt;

&lt;p&gt;In terminal type&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ember g route todo&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;The output in your terminal will be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;installing route
  create app/routes/todo.js
  create app/templates/todo.hbs
updating router
  add route todo
installing route-test
  create tests/unit/routes/todo-test.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2 - Displaying the todo list in console
&lt;/h3&gt;

&lt;p&gt;Let's start by adding adding some existing to do's. &lt;br&gt;
Go to app/routes/todo.js the template should look something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Route from '@ember/routing/route';

export default class TodoRoute extends Route {
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To add the todo dataset add the model to the route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Route from "@ember/routing/route";

export default class TodoRoute extends Route {
  model() {
    return [
      {
        id: 1,
        todo: "todo 1"
      },
      {
        id: 2,
        todo: "todo 2"
      },
      {
        id: 3,
        todo: "todo 3"
      }
    ];
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now go to &lt;strong&gt;app/templates/todo.hbs&lt;/strong&gt; delete whatever is in it and add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1&amp;gt;TODO app&amp;lt;/h1&amp;gt;
{{log this.model}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your terminal run &lt;em&gt;ember serve&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Open your web browser go to &lt;strong&gt;&lt;a href="http://localhost:4200/todo"&gt;http://localhost:4200/todo&lt;/a&gt;&lt;/strong&gt; you should see 'TODO app' on the page. Open the Inspector -&amp;gt; Console. In the console you should see your model array.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 - Displaying the todo list on the screen
&lt;/h3&gt;

&lt;p&gt;So here I make a decision that I will build the whole app in one component. Feel free to refactor it to be in separate components. I would argue that the 'list of todos' and the ''add new todo button' should be two separate components but I will let you figure out how to refactor this.&lt;/p&gt;

&lt;h4&gt;
  
  
  Part 3.1
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;In Terminal run:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;ember g component todo-app&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You will see the following in your terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;installing component
  create app/components/todo-app.hbs
  skip app/components/todo-app.js
  tip to add a class, run `ember generate component-class todo-app`
installing component-test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go ahead and follow the 'tip' and run the command &lt;em&gt;ember generate component-class todo-app&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Now if you go to &lt;strong&gt;app/components&lt;/strong&gt; you will find &lt;strong&gt;todo-app.hbs&lt;/strong&gt; and &lt;strong&gt;todo-app.js&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Todo-app.hbs is your html, and todo-app.js is your logic and action handling part.&lt;/p&gt;

&lt;p&gt;Let's go to todo-app.hbs delete whatever is there and add&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;p&amp;gt;sanity check&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;If you now go to &lt;a href="http://localhost:4200/todo"&gt;http://localhost:4200/todo&lt;/a&gt; or &lt;a href="http://localhost:4200/"&gt;http://localhost:4200/&lt;/a&gt; you will not see sanity check on the screen. &lt;/p&gt;

&lt;p&gt;To get &lt;strong&gt;todo-app.hbs&lt;/strong&gt; displaying on the screen go to &lt;strong&gt;todo.hbs&lt;/strong&gt; and add &lt;strong&gt;&lt;/strong&gt; to the file so that you have&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h1&amp;gt;TODO app&amp;lt;/h1&amp;gt;
&amp;lt;TodoApp /&amp;gt;
{{log this.model}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now go to &lt;a href="http://localhost:4200/todo"&gt;http://localhost:4200/todo&lt;/a&gt; - viola! Sanity check is displaying.&lt;/p&gt;

&lt;h4&gt;
  
  
  Part 3.2
&lt;/h4&gt;

&lt;p&gt;So if you go to &lt;strong&gt;todo.hbs&lt;/strong&gt; and take out&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{{log this.model}}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;and go to  &lt;strong&gt;todo-app.hbs&lt;/strong&gt; and add it there&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;p&amp;gt;sanity check&amp;lt;/p&amp;gt;
{{log this.model}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will now get &lt;strong&gt;undefined&lt;/strong&gt; in your console rather than the model. &lt;/p&gt;

&lt;p&gt;So let's pass the model from todo to the component todo-app by changing&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;TodoApp /&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;to&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;TodoApp @model={{this.model}}/&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Despite this change you will still get &lt;strong&gt;undefined&lt;/strong&gt; because &lt;strong&gt;this.model&lt;/strong&gt; was passed as &lt;strong&gt;@model&lt;/strong&gt; to the component. &lt;/p&gt;

&lt;p&gt;So lets change&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{{log this.model}}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;to&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{{log @model}}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Viola! You are back to square 0 with the model showing in console. Now let's actually display it. &lt;/p&gt;

&lt;h4&gt;
  
  
  Part 3.3
&lt;/h4&gt;

&lt;p&gt;In React the most basic solution to displaying 3 todos would just be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;{this.state.model[0].todo}&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;{this.state.model[1].todo}&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;{this.state.model[2].todo}&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can try writing something along these lines in &lt;strong&gt;todo-app.hbs&lt;/strong&gt; but this will not work. So another option of displaying this in React is by using .map.&lt;/p&gt;

&lt;p&gt;So something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  {this.state.model.map(todo =&amp;gt; {
    return &amp;lt;li key={todo.id}&amp;gt;{todo.todo}&amp;lt;/li&amp;gt;;
  })}
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Templates are logic less and this means that the javascript .map will not work however templates have helpers that can bring some logic to the template. &lt;/p&gt;

&lt;p&gt;We will be doing something similar to .map by using a &lt;a href="https://guides.emberjs.com/v2.15.0/templates/displaying-a-list-of-items/"&gt;helper 'each'&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So let's go to &lt;strong&gt;todo-app.hbs&lt;/strong&gt; and add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  {{#each @model as |item|}}
  &amp;lt;li&amp;gt;{{item.todo}}&amp;lt;/li&amp;gt;
  {{/each}}
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nice! The todo list is displaying.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 - Adding actions
&lt;/h3&gt;

&lt;p&gt;Now lets add a textfield and a button so that you can add new todos to the list. &lt;/p&gt;

&lt;p&gt;On the html side the tags will be identical to the ones you would have used in a React component. So lets add this to &lt;strong&gt;todo-app.hbs&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  {{#each @model as |item|}}
  &amp;lt;li&amp;gt;{{item.todo}}&amp;lt;/li&amp;gt;
  {{/each}}
&amp;lt;/ul&amp;gt;
&amp;lt;form&amp;gt;
  &amp;lt;input placeholder='Add todo' type='text' /&amp;gt;
  &amp;lt;button type='submit'&amp;gt;Add&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will display an input field and a button but of course this will not do anything, so it's finally time to look at &lt;strong&gt;todo-app.js&lt;/strong&gt;. But before we do this let's see how this would have looked in React. &lt;/p&gt;

&lt;h4&gt;
  
  
  React view
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import ReactDOM from "react-dom";
import React, { Component } from "react";

class Todo extends Component {
  constructor(props) {
    super(props);
    this.state = {
      model: [
        {
          id: 1,
          todo: "todo 1"
        },
        {
          id: 2,
          todo: "todo 2"
        },
        {
          id: 3,
          todo: "todo 3"
        }
      ],
      text: ""
    };
    this.handleSubmit = this.handleSubmit.bind(this);
    this.handleChange = this.handleChange.bind(this);
  }

  handleSubmit(e) {
    e.preventDefault();
    const i = this.state.model[this.state.model.length - 1].id + 1;
    let newTodo = {
      todo: this.state.text,
      id: i
    };
    this.setState(prevState =&amp;gt; ({
      model: prevState.model.concat(newTodo),
      text: ""
    }));
  }

  handleChange(e) {
    this.setState({
      text: e.target.value
    });
  }

  render() {
    return (
      &amp;lt;div&amp;gt;
        &amp;lt;h1&amp;gt;TODO LIST&amp;lt;/h1&amp;gt;
        &amp;lt;ul&amp;gt;
          {this.state.model.map(todo =&amp;gt; {
            return &amp;lt;li key={todo.id}&amp;gt;{todo.todo}&amp;lt;/li&amp;gt;;
          })}
        &amp;lt;/ul&amp;gt;
        &amp;lt;form onSubmit={this.handleSubmit}&amp;gt;
          &amp;lt;input value={this.state.text} onChange={e =&amp;gt; this.handleChange(e)} /&amp;gt;
          &amp;lt;button&amp;gt;Add&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }
}

ReactDOM.render(&amp;lt;Todo /&amp;gt;, document.getElementById("root"));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Back to Ember
&lt;/h4&gt;

&lt;p&gt;Now lets write handleChange and handleSubmit in Ember. &lt;/p&gt;

&lt;p&gt;The React&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  handleChange(e) {
    this.setState({
      text: e.target.value
    });
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;barely changes as it becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  @tracked
  text = "";

  @action
  onChange(e) {
    this.text = e.target.value;
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;@tracked is your state but it's best you read about @tracker and @action in the &lt;a href="https://guides.emberjs.com/release/components/component-state-and-actions/"&gt;Ember guide&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;And handleSubmit goes from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  handleSubmit(e) {
    e.preventDefault();
    const i = this.state.model[this.state.model.length - 1].id + 1;
    let newTodo = {
      todo: this.state.text,
      id: i
    };
    this.setState(prevState =&amp;gt; ({
      model: prevState.model.concat(newTodo),
      text: ""
    }));
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  @action
  submit(model, e) {
    e.preventDefault();
    const i = model[model.length - 1].id + 1;
    const newTodo = {
      id: i,
      todo: this.text
    };
    model.pushObject(newTodo);
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So &lt;strong&gt;todo-app.js&lt;/strong&gt; ends up looking like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";

export default class TodoAppComponent extends Component {
  @tracked
  text = "";

  @action
  submit(model, event) {
    event.preventDefault();
    const i = model[model.length - 1].id + 1;
    const newTodo = {
      id: i,
      todo: this.text
    };
    model.pushObject(newTodo);
    console.log("add", model);
  }

  @action
  onChange(e) {
    this.text = e.target.value;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5 connecting .js with .hbs
&lt;/h3&gt;

&lt;p&gt;React render looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        &amp;lt;form onSubmit={this.handleSubmit}&amp;gt;
          &amp;lt;input value={this.state.text} onChange={e =&amp;gt; 
            this.handleChange(e)} /&amp;gt;
          &amp;lt;button&amp;gt;Add&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in Ember your &lt;strong&gt;todo-app.hbs&lt;/strong&gt; should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;form onsubmit={{fn this.submit @model}}&amp;gt;
  &amp;lt;input placeholder='Add todo' type='text' value={{this.text.todo}} 
    onchange={{fn this.onChange}} /&amp;gt;
  &amp;lt;button type='submit'&amp;gt;Add&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the full todo-app.hbs looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  {{#each @model as |item|}}
  &amp;lt;li&amp;gt;{{item.todo}}&amp;lt;/li&amp;gt;
  {{/each}}
&amp;lt;/ul&amp;gt;
&amp;lt;form onsubmit={{fn this.submit @model}}&amp;gt;
  &amp;lt;input placeholder='Add todo' type='text' value={{this.text.todo}} onchange={{fn this.onChange}} /&amp;gt;
  &amp;lt;button type='submit'&amp;gt;Add&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6 adding the Delete function
&lt;/h3&gt;

&lt;p&gt;I have to admit delete will not look pretty in React or Ember because we are dealing with an array of objects. If it was an array of strings life would have been easier. &lt;/p&gt;

&lt;p&gt;In React it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  removeItem(id) {
    let model = this.state.model;
    const index = model
    .map((file, index) =&amp;gt; {
      if (file.id === id) {
        return index;
      } else return undefined
    })
    .filter(id =&amp;gt; id !== undefined);
    model.splice(index, 1);
    this.setState([...model]);
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To a degree Ember follows the same general idea. You figure out the index, then you splice the array. &lt;/p&gt;

&lt;p&gt;There is a but. The HTML side will not re-render if you delete a 'todo’ from the array (I'm new to Ember, so send better solutions). So the work around that I have is: replace the item about to be deleted with an empty object and on the template add 'if empty don’t show’.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;todo-app.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  @action
  delete(model, item) {
    const index = model
      .map((file, index) =&amp;gt; {
        if (file.id === item.id) {
          set(item, "id", null);
          set(item, "todo", null);
          return index;
        }
      })
      .filter(id =&amp;gt; id !== undefined);
    model.splice(index[0], 1);
  }

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

&lt;/div&gt;



&lt;p&gt;and &lt;strong&gt;todo-hbs.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  {{#each @model as |item|}}
  {{#if item.id}}
  &amp;lt;li&amp;gt;{{item.todo}}&amp;lt;/li&amp;gt;
  &amp;lt;button onclick={{fn this.delete @model item}} type='button'&amp;gt;delete&amp;lt;/button&amp;gt;
  {{/if}}
  {{/each}}
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again I am new to Ember so any prettier ways of achieving this without using Ember data are welcome. &lt;/p&gt;

&lt;p&gt;And with that Viola! The Todo App is done. It is missing editing individual Todo's but I will let you figure that out if you can't here is a the github &lt;a href="https://github.com/JennyJudova/todo-app"&gt;repo&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;And the React to do using a constructor is &lt;a href="https://codesandbox.io/s/todo-app-react-84286"&gt;here&lt;/a&gt; the hooks version is &lt;a href="https://codesandbox.io/s/todo-app-react-hooks-305zu"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ember</category>
      <category>tutorial</category>
      <category>javascript</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>How to find a job as a Bootcamp grad</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Thu, 12 Mar 2020 22:33:33 +0000</pubDate>
      <link>https://dev.to/jennyjudova/how-to-find-a-job-as-a-bootcamp-grad-4fg8</link>
      <guid>https://dev.to/jennyjudova/how-to-find-a-job-as-a-bootcamp-grad-4fg8</guid>
      <description>&lt;p&gt;It took me 35 workdays (the actual job hunting period was between 02/12/19 to 17/01/20) to go from starting job hunting to getting an offer and putting a stop to job hunting.&lt;/p&gt;

&lt;p&gt;So what is the advice I can give for job hunting? Well, I wish I could say 'Be badass and don't compromise.' But that does not feel genuine enough or actionable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So my advice is: be humble and know what you want.&lt;/strong&gt; And if this is too unactionable as advice then skip to 'Actual actionable advice'.&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%2Fi.imgur.com%2Ff5Aj3M6.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%2Fi.imgur.com%2Ff5Aj3M6.png" alt="Merch from a career fair"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Be Humble 
&lt;/h3&gt;

&lt;p&gt;I am good at what I do. I am an excellent junior developer. I am also painfully aware that I am a junior developer and what I know is limited. In most cases what I do is not by choice but because that is how I know to do things rather than choosing the best way of doing. When I have to do things that I already know I work quickly. However, if I encounter something new it's a different story. It took me 30 minutes of googling to find out the correct term for when you need a variable to change within a variable name. Thankfully Google's algorithm figured out I was after 'Dynamic Variables', it took another 30 minutes to learn and implement 'eval'. So yes you are great and talented but an hour to figure out how to write a variable is a humbling experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Know what you want
&lt;/h3&gt;

&lt;p&gt;From the get-go, I knew what industries I was interested in: Fintech, Cyber Security, and compliance tech. There was another caveat I needed for the company to be tech first. &lt;/p&gt;

&lt;p&gt;By tech first I mean that technology had to be the main product they focus on. This realisation came after a conversation with an internal recruiter from one of the UK banks. They were incredibly candid in saying 'technology is important to us, but it's not the product that we sell.' This put traditional banks and financial service firms out of the running. &lt;/p&gt;

&lt;p&gt;Narrowing my focus meant that I was not trying to chase down EVERYONE. And at events like the GA Meet and Greet I had people from those industries making their way to me because I was likely to be interested in what their company did.&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%2Fi.imgur.com%2FWs3x61d.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%2Fi.imgur.com%2FWs3x61d.png" alt="GA meet and Greet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Actual actionable advice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The basics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Have an up to date CV. If you are a recent (bootcamp) grad consider bumping up your bootcamp experience from 'Education' to 'Work experience' but make sure to say that you were a student. Feel free to check out my &lt;a href="https://docsend.com/view/67vavp4" rel="noopener noreferrer"&gt;CV&lt;/a&gt; as an example. `its not perfect but it did land me interviews and a job.
&lt;/li&gt;
&lt;li&gt;Up to date Linkedin and any social media profiles that you use professionally. This now should include Github and Stackoverflow. &lt;/li&gt;
&lt;li&gt;Good &lt;a href="https://medium.com/@meakaakka/a-beginners-guide-to-writing-a-kickass-readme-7ac01da88ab3" rel="noopener noreferrer"&gt;Readmes&lt;/a&gt; on your Github, especially for take home coding challenges. I have to admit my github was a lovely place while I was job hunting. After I started my job my github turned into a graveyard of semi-completed projects. &lt;/li&gt;
&lt;li&gt;Personal website. I built &lt;a href="https://www.jennyjudova.com/" rel="noopener noreferrer"&gt;mine&lt;/a&gt; in Gatsby, its perfect for one pagers and just look how mobile friendly it is!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What worked?
&lt;/h3&gt;

&lt;p&gt;Junior roles are rarely advertised so it's worth getting pro active when it comes to reaching out to employers. Here are some things that I and my peers did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attend in person events (once COVID-19 is over that is). Meet up, and Eventbrite are awesome to do research. Don't focus just on recturetment meet ups but go to those focused on a framework or interest. The two events I am happy to recommend are &lt;a href="https://twitter.com/ggmUK" rel="noopener noreferrer"&gt;Geek Girl Meetup UK&lt;/a&gt; and &lt;a href="https://www.siliconmilkroundabout.com/" rel="noopener noreferrer"&gt;Silicon Milkroundabout&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Research companies that have previously hired bootcamp grads. &lt;/li&gt;
&lt;li&gt;Engage with the online dev community. Write about your experience, participate in conversations online.I did a daily standup on &lt;a href="https://www.linkedin.com/in/jennyjudova/detail/recent-activity/shares/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt; while job hunting. Partially to keep myself accountable ad partially to flag myself up to potential employers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What did not work?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cold email&lt;br&gt;
Although I am comfortable with cold emailing none of the cold emails and LinkedIn messages I sent paid off in any big way for me I do have friends who were very successful in cold emailing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recruiters. &lt;br&gt;
Definitely register on recruitment platforms, but when it comes to recruiters reaching out to me on Linkedin it felt more of a diversion. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A tip on reaching out
&lt;/h3&gt;

&lt;p&gt;Most Bootcamp grads I know want to help other Bootcamp grads. Yes, the alumni network is real even if you come from different Bootcamps it's a network similar to good schools or universities when alumni work to help each other not compete. If you see a Bootcamp grad working at a company you like - reach out and find out their experience. &lt;/p&gt;

&lt;p&gt;Moreover, companies that already hire Bootcamp grads are likelier to hire more and will have an interview process that is grad friendly.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Structure of the interview processes
&lt;/h3&gt;

&lt;p&gt;Most companies will have a variation of the following&lt;br&gt;
1 - culture fit check (this is also a chance for you to check them out)&lt;br&gt;
2 - technical interview&lt;br&gt;
3 - code test // pair programming // take-home challenge&lt;br&gt;
4 - demo of the code test&lt;br&gt;
5 - meet the founders and/or meet the team&lt;br&gt;
Not all companies will have all of these steps and in some cases, they will be bundled up. &lt;/p&gt;

&lt;h3&gt;
  
  
  Technical interview
&lt;/h3&gt;

&lt;p&gt;This is where I felt at a disadvantage as a Bootcamp grad. I spent 3 months doing and coding not learning theory, so my knowledge of theory was a bit non-existent. My favourite example of it is closure, I use them all the time but struggle to give a definition. &lt;br&gt;
Bootcamps are like learning a foreign language lets say French by moving to France, in 3 months you will have a good speaking fluency but if someone asks you 'What is the passé composé?' you have no idea what they mean.&lt;/p&gt;

&lt;p&gt;I found that the way a company runs a technical interview is a good indicator of how they work with junior devs and Bootcamp grads. Quite a few companies don't even bother having a technical interview for a junior and instead focus on the coding challenge.&lt;/p&gt;

&lt;p&gt;A company that is used to hiring Bootcamp grads will often rephrase the questions from 'explain this / what is this' to 'have you ever encountered this problem? What did you do to solve it?' This means that rather than sweating to remember the dictionary definition you get to talk about your coding experience.&lt;/p&gt;

&lt;p&gt;You do have to prepare for technical interviews. How you do it is up to you. I found listening to tech podcasts in the background useful as I started picking up the terminology without realising it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hardest part
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Getting your foot through the door&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Junior developer jobs are rarely advertised. Which means to get an interview you don't apply to jobs but proactively reach out to companies at events and via cold email. &lt;/p&gt;

&lt;h3&gt;
  
  
  Make yourself accountable
&lt;/h3&gt;

&lt;p&gt;It can be hard to stay motivated when job hunting. Let's face it you took a plunge and spent the last 3 months in an intense Bootcamp regime and now you can sleep until midday, you can go to bed at 6 pm or 6 am. You can binge on everything you wanted to binge. In other words, you can do whatever you want. and it's very easy to keep thinking 'I'll do it tomorrow' I can skip today and just send 10 applications tomorrow instead of 5. It's easy to be lazy.&lt;/p&gt;

&lt;p&gt;My way of keeping myself accountable was doing a daily stand up on social media. Every morning I would write what I did and what I was planning to do on Twitter and Linkedin. Also, this provided me with a list of things I've done over the week which kept me from spiralling into self-blame of 'you are not doing enough'.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't just job hunt
&lt;/h3&gt;

&lt;p&gt;Job hunting is important but don't forget about your coding skills. After I finished I started brushing up on the skills that the industry demands.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I set up my react boiler template to have Airbnb linter (an industry standard) and plugged in some other VS code tools&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I learnt Hooks. Because Hooks came out only a year ago GA is not teaching them. Arguably I think it's a great decision as the state is harder to learn than hooks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I learnt Gatsby.js - gatsby is great for portfolio building also its the hot new toy so when I mentioned it in interviews people knew that I was somewhat plugged into the industry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I started learning Ember.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I started a Dan Abramov course Just Javascript&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of my Bootcamp peers also did things like 100 days of JS and 30 days of JS.&lt;/p&gt;

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

&lt;p&gt;In conclusion, job hunting sucks. But job hunting as a junior developer sucks a bit less than job hunting as an art historian. And it's definitely faster to find a job as a junior developer than as an art history grad.&lt;/p&gt;

&lt;h3&gt;
  
  
  And in case you need motivation
&lt;/h3&gt;

&lt;p&gt;Let's face it when job hunting there are good days and then there are days when it's easy to spiral into a dark grim place. So when that happens and you stop believing that bootcamp grads ever get hired this is the breakdown of my class (based on the last time I saw them in late Feb).&lt;/p&gt;

&lt;p&gt;Also as a caveat although we finished in early December most of my class started job hunting only after the winter break in mid January. &lt;/p&gt;

&lt;p&gt;So out of 24 people (22 students + 2 teaching assistants)&lt;br&gt;
16 where job hunting, 11 are now employed, the 5 who are still looking have plenty of interviews lined up. &lt;br&gt;
Out of the 11 employed most are on a salary between 30 and 35k, 2 are on a salary higher than 35k. &lt;/p&gt;

&lt;p&gt;To finish off it's not all doom and gloom keep going. Job hunting feels like a never ending thing until it's done. &lt;/p&gt;

</description>
      <category>career</category>
      <category>codenewbie</category>
      <category>firstyearincode</category>
      <category>wecoded</category>
    </item>
    <item>
      <title>How I became a developer in 95 days or my journey into code</title>
      <dc:creator>JennyJudova (they/them)</dc:creator>
      <pubDate>Mon, 24 Feb 2020 23:35:23 +0000</pubDate>
      <link>https://dev.to/jennyjudova/how-i-became-a-developer-in-95-days-or-my-journey-into-code-5260</link>
      <guid>https://dev.to/jennyjudova/how-i-became-a-developer-in-95-days-or-my-journey-into-code-5260</guid>
      <description>&lt;p&gt;When does a journey begin? The moment you have an idea to do it? The moment you commit and buy tickets? Or with the first step, you take out of your house?&lt;/p&gt;

&lt;p&gt;In 2019 I started learning to code although it was an easy decision for me there were a few failed starts. I did not start with development but with Data Science. I did not check what os was needed for the online course - turns out the course was done for Windows, so installing everything on a Mac lead me to do a bit of Java and a lot of tinkering. Data Science did not stick but that did lead me to learn Python. And then to come across &lt;a href="https://www.freecodecamp.org/"&gt;free code camp&lt;/a&gt; and discover JavaScript. Of course, as 30% of the internet is WordPress and WordPress is PHP I also tinkered with PHP.&lt;/p&gt;

&lt;p&gt;My first GitHub commit happened on the 2nd of April 2019. Sometime in May-June, I realised that I am more excited about coding at home than my day job which I loved. So I started looking at BootCamps and if I could afford them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---f5_3ppC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/cMc9FPt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---f5_3ppC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/cMc9FPt.png" alt="GA pre-course work" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I applied for GA got in and handed in my 2 months notice. This lead to 40 days of waiting and working on the GA pre-course homework. Then on the 2nd of September came the course. The course lasted &lt;a href="https://medium.com/series/my-bootcamp-diary-software-engineering-course-at-ga-965f767db8d"&gt;60 workdays&lt;/a&gt; and it took me &lt;a href="https://medium.com/series/bootcamp-is-over-time-to-job-hunt-d06dfe64379a"&gt;35 days&lt;/a&gt; (35 days that I was actually job hunting) to receive a job offer.&lt;/p&gt;

&lt;p&gt;It took me 95 days to go from knowing some Python, JavaScript, CSS, HTML and PHP to be able to create a full-stack application to getting hired as an engineer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cpxTTZL---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/4kVH7co.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cpxTTZL---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/4kVH7co.png" alt="JJ laptop" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why a Bootcamp?
&lt;/h3&gt;

&lt;p&gt;I found it incredibly hard to carve out time to learn while working full-time. I needed to immerse myself into code an on-campus full-time course seemed like the best option. I choose to do it in person in class rather than online because education is never just about learning but also about the network and the peer group that educational facilities provide. For what it's worth being able to plug into a &lt;br&gt;
developer network from the get-go made my journey less lonely.&lt;/p&gt;

&lt;p&gt;The stack we learnt was impressive: JavaScript, React, Python, Django, CSS, Sass, HTML, SQL, NoSQL, PostgreSQL, MongoDB. &lt;/p&gt;

&lt;p&gt;And the people I met, well my cohort bonded :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y3dqz5LJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/20oloZe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y3dqz5LJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/20oloZe.png" alt="SEI 43 on a night out" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How much did it cost?
&lt;/h3&gt;

&lt;p&gt;The course together with 5 months of being unemployed cost me £12k. I will add two caveats here I am not including my flat and bills into this sum. The second is that I pretty much lived as I always did. I did not live as frugally as I could have, to give an example when I needed to splurge on 120-pound trail running shoes I did.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qm2l6orU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/tluWWoY.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qm2l6orU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/tluWWoY.jpg" alt="Trail running shoes" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What was the schedule like?
&lt;/h3&gt;

&lt;p&gt;I am militant when I study. I was this way in school, at university and Bootcamp. I took the idea of the Bootcamp a bit too far.&lt;/p&gt;

&lt;p&gt;I would come to GA between 8:30–9 am, I would do my life admin stuff until 9:30 am. Then we had a stand-up and then classes until 4–5 pm. Then I would either do homework with my class and stay until 7–9 pm or head home eat and do homework in solitude. On weekends it was more homework.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---hcwkD08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/Z6uT7ps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---hcwkD08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/Z6uT7ps.png" alt="Weekend coding" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before I started the course I promised to myself that I will make time to go to the gym at least 2 times a week and run 5k at least 2 times a week. I did find myself at the gym in some ridiculous hours like 10 pm. But I only had 1 or 2 weeks where I missed either a gym day or a running day.&lt;/p&gt;

&lt;p&gt;Friday was the only exception to most rules. We would go for a group lunch and after the class finished at 4 pm we would go to a pub. As weeks went by and we got more comfortable with each other our pub stays went from 'just one drink' to 'last orders'.&lt;/p&gt;

&lt;h3&gt;
  
  
  Did the Bootcamp help with job hunting?
&lt;/h3&gt;

&lt;p&gt;GA is very careful to promise only things that they can actually do and deliver on. I found the outcomes team incredibly supportive and useful. They by no means did the job hunt for me, but job-hunting would have been a lot harder without them. The most important guidance they offered was around putting together my CV (something I am bad at), creating opportunities to meet previous graduates, and organising Meet and Greet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Meet and Greet
&lt;/h3&gt;

&lt;p&gt;The truth is most Junior developer roles are not advertised. So your options are either to cold email people or to find opportunities where you can meet them in person. Meet and Greets are career/talent fairs organised my GA. When I had mine I got 5 interviews, and one company waivered the interview process and jumped straight to the coding challenge.&lt;br&gt;
Another career fair worth looking into is &lt;a href="https://www.siliconmilkroundabout.com/"&gt;Silicon Milkroundabout&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I9M8Tvsh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/qGgEbLg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I9M8Tvsh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/qGgEbLg.png" alt="Evening coding" width="800" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Was it scary changing careers?
&lt;/h3&gt;

&lt;p&gt;For me, the idea of not doing it was scarier. That said it was an adjustment. &lt;/p&gt;

&lt;p&gt;I had to get comfortable with learning again, with not knowing and with being out of my comfort zone. Getting over the fright of making an idiot out of myself by asking something dumb. And reminding myself that there is no such thing as a stupid question.&lt;/p&gt;

&lt;p&gt;I have to admit I enjoyed going back to school for a short time because for the first time in years I did not have to think about or worry what comes next my biggest worry was what to do for my final project.&lt;br&gt;
It was also great to discover new things about myself my likes and dislikes and explore my interests in industries such as finance, cybersecurity and compliance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N8nbBEfz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/OayMzGX.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N8nbBEfz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/OayMzGX.png" alt="Weekend projects" width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Would I recommend it?
&lt;/h3&gt;

&lt;p&gt;YES. But ask anyone of any profession if they would recommend others to join their profession and the answer is usually 'yes'.&lt;/p&gt;

&lt;p&gt;My one advice is - do some coding before you hand in your notice and decide to become a developer. A career as a developer is sometimes positioned as a 'silver bullet', a quick way to improve your life and gain access to the well-paid tech sector jobs. I am definitely one of the people who are happy to spread the word about the 'good news of being a developer'.&lt;/p&gt;

&lt;p&gt;But if you don't enjoy coding you will not become a developer. &lt;br&gt;
 &lt;br&gt;
Do some coding to figure out if you enjoy it or not. &lt;/p&gt;

&lt;p&gt;Coding is not that hard to pick up, you don't need to be a math wiz or the smartest kid in class. It also does not take that long to pick it up, but the learning curve at the beginning is very very steep. Make sure that you enjoy coding because if you do not you will find it impossible to learn. Spending 12 hour days unemployed and learning to code when you hate coding is an impossible task. And if you enjoy coding well these 12 hour days will be some of the happiest in your life.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b0-T38r8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/q94mvj1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b0-T38r8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/q94mvj1.jpg" alt="JJ laptop" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>tutorial</category>
      <category>wecoded</category>
      <category>firstyearincode</category>
    </item>
  </channel>
</rss>
