<?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: Elliot</title>
    <description>The latest articles on DEV Community by Elliot (@elliot).</description>
    <link>https://dev.to/elliot</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%2F144123%2Fd2454900-b2db-4ff2-ba07-f87035382620.jpg</url>
      <title>DEV Community: Elliot</title>
      <link>https://dev.to/elliot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elliot"/>
    <language>en</language>
    <item>
      <title>What is Dev Like at a Canadian Startup? 🤔</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Mon, 03 Jan 2022 18:58:02 +0000</pubDate>
      <link>https://dev.to/elliot/what-is-dev-like-at-a-canadian-startup-5hjg</link>
      <guid>https://dev.to/elliot/what-is-dev-like-at-a-canadian-startup-5hjg</guid>
      <description>&lt;p&gt;Hi, I’m &lt;a class="mentioned-user" href="https://dev.to/elliot"&gt;@elliot&lt;/a&gt; 👋. I’m a &lt;em&gt;Front End Developer&lt;/em&gt; on the &lt;em&gt;&lt;a href="https://opslock.com/"&gt;Opslock&lt;/a&gt; Engineering team&lt;/em&gt;. I joined the team just about a year ago now, and I want to reflect on what it is like to work here. I interviewed each of the Opslock Engineering team members (there are nine of us) and asked six questions in an attempt to collect some words and ways to think about what being an engineer here is about. Each of these six questions is a heading in the post below. Under each heading is a selection of a few of the most interesting responses from the engineers. With that being said, I’ve tried to fairly represent the perspectives of all the engineers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why am I writing this?&lt;/em&gt; I asked for some time to write this blog post by pitching it as a form of viral marketing that “will promote a positive view of Opslock’s technology to our existing and potential customers”, and “will be a resource for attracting new engineers”. Really though,  it’s just an excuse to spend work hours talking, journaling and contemplating my own career… Facetiousness aside, the team was supportive and encouraging during my writing of this post. If you are interested in working at Canadian startup, I have certainly tried to make this post useful to you.&lt;/p&gt;

&lt;p&gt;Alright, let’s get to the questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  How would you explain something you’ve worked on to someone outside of Opslock?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SHAWN&lt;/strong&gt;&lt;br&gt;
“So I think in general, you know, we’ve just had the mantra of ‘nothing on the front end is set in stone’ and […], you know, we encourage people to try new experiments. And then, I think that the whole team is pretty good about if they see someone doing something that is just a better way to do it; that knowledge spreads very quickly through the team and it just becomes the default way to do it. And then eventually we have to go back and do it for the old code, but that’s the downside of doing it this way. But I think it really allows us to sort of slowly find a workflow that works for us.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BEN&lt;/strong&gt;&lt;br&gt;
“So far. I’ve touched a little bit of everything, so less specialized, but I worked with Memento and Notify.”&lt;/p&gt;

&lt;p&gt;“Notify is our notification sending microservice and the purpose of it is to allow users to receive notifications whether they’re on premises, on an industrial work site and/or whether they’re working from the headquarters of a company somewhere in a major city.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Bgzs263_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bvliu88ii1euuzrovtr.png" class="article-body-image-wrapper"&gt;&lt;img alt="An illustration of a boat communicating with a building in a city" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Bgzs263_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bvliu88ii1euuzrovtr.png" width="880" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“So that was really the biggest challenge: being able to send notifications as […] someone goes in and out of a wireless internet connection while going across the ocean.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JOHNNIE&lt;/strong&gt;&lt;br&gt;
“Replicate? Okay. So yeah, replicate is an in-house replication system that copies data from multiple databases in a master-master fashion, or we call it active-active.”&lt;/p&gt;

&lt;p&gt;“We kind of know what kind of rules we want for when writes and reads occur between one site to another. And it’s one of those cases where the solution out of the box doesn’t provide all the customization you would like. And also if we want to do maintenance on a piece of work like this, we want to be able to understand what’s really happening under the hood. So for us it made more sense to write one in house and add the features we need as we need them.”&lt;/p&gt;

&lt;p&gt;“And also we wanted to be able to have the ability to control how much data goes over the wire and how big is the deliverable, because we’re pushing these changes to on-prem devices, IOT devices.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BJORN&lt;/strong&gt;&lt;br&gt;
“And the [Opslock] design system? I’ll say it would be like any other design system, the building blocks for whatever you see on the screen. And it helps developers to build things quickly and it kind of makes things more rigid and robust.”&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the most interesting part of your job?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AIDAN&lt;/strong&gt;&lt;br&gt;
“Well, the fact that we work in a startup also [means] that our responsibilities are a little more cross spread, like cross-pollination [of our] tasks.”&lt;/p&gt;

&lt;p&gt;“So I guess the most interesting fact is that our responsibilities are not stuck in stone. And, and if something really interests you kind of can go forward with it and go explore it a little.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BEN&lt;/strong&gt;&lt;br&gt;
“We have a strong bias towards building our own tech in Go instead of just including a bunch of technologies from all over the place. And we always try to find Go technologies first before including other programming languages into our stack. So instead of just adding some big Java-something that runs in the background, we try and find a Go alternative or we write a Go alternative. And that keeps things really light and slim, but it also gives us hands-on engineering experience, building simpler versions of those really complicated Java things. So we get to learn a lot of different stuff.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JOHNNIE&lt;/strong&gt;&lt;br&gt;
“I think the most interesting part of the job is designing the backend solutions to our problems, just because when we’re often thinking about solutions, we’re thinking about how they are solved twofold. One is online and one is on-prem.”&lt;/p&gt;

&lt;p&gt;“That’s kind of interesting to solve rather than working on a cloud-based product only. It’s kind of straightforward when you have access to using whatever SAAS tools you want. But when you do backend solutions that require on-prem, you have to think about if you can’t use a SAAS tool, most cases. It adds: ‘Okay, we have to build some.’”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MARC&lt;/strong&gt;&lt;br&gt;
“I would say, having to deal with on-prem devices that sync with the cloud, that allows customers to use the service even when their work-site is offline [and disconnected from the internet], as long as the app has a working local network. It’s the most interesting part because it’s the most difficult part [and] is the part that makes Opslock differentiate itself from other companies that might offer a similar product.”&lt;/p&gt;

&lt;p&gt;“It’s a bit mathematical in a way too.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SwWOQ3SL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7owm6zvzsc3pg5atot4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SwWOQ3SL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7owm6zvzsc3pg5atot4g.png" alt="An illustration with ON and OFF connected to 0 and 1 and a Svelte logo" width="880" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BJORN&lt;/strong&gt;&lt;br&gt;
“Because it’s the first time we [are] working [with Svelte] on an enterprise level and we are solving problems that not many company has solved before with a new framework. I’m pretty happy that we are discovering ways for it. We are paving the path forward for this new kind of framework we’re using.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LUCAS&lt;/strong&gt;&lt;br&gt;
“In general, I find the grooming process for new features is the most interesting part. It lets me imagine a blueprint for how to implement a feature. And then, when I implemented and finally got everything into one piece and I chain everything together. I feel it’s the most interesting part.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MICAH&lt;/strong&gt;&lt;br&gt;
“I love technology, but ultimately I view it as a tool to complete another goal. So it’s understanding how people will interact with something, it’s understanding how people could interact with something, how it could be broken, how they could expect something to behave and then finding thoughtful ways to implement it for future developers or myself.”&lt;/p&gt;

&lt;h2&gt;
  
  
  What is your day-to-day work like?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BEN&lt;/strong&gt;&lt;br&gt;
“​​I’m just doing a lot of reading and building microservices. I guess most of my day is just building and testing stuff, but I don’t really know how else to answer that.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JOHNNIE&lt;/strong&gt;&lt;br&gt;
“My day-to-day work, for me normally, begins with after I warm my brain up: going over some PRs and things like that, then I’m prepping to see what my team is working on. Cause I’m a technical lead for a squad. So understanding where my team members are at and understanding what can I do to help them, and what can I do to help facilitate them help them help each other? Because at the end of the day, I don’t see myself as like the boss or the leader, but I see myself as the facilitator to just kind of help get things done. I want to just make sure they have what they need.”&lt;/p&gt;

&lt;p&gt;“I think we’re all leaders here at the end of the day. We all have very strong thoughts and I like to have everyone really have ownership in what they’re doing. I think the goal is just making sure that there’s always alignment and having someone take control of that alignment, but everyone provides good thoughts on the engineering team. I like to be the facilitator to let those thoughts come to fruition.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MARC&lt;/strong&gt;&lt;br&gt;
“Fortunately, my day-to-day work does not involve too many meetings. I’d say maybe 20% meeting, 40-50% actual work, which is pretty good compared to past experience. Another fraction about helping others that might have technical issues with the product. And I also take the time to research and think about the future and what we could do best in the future.“&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s your take on the mission of Opslock?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SHAWN&lt;/strong&gt;&lt;br&gt;
“When we got our first customer [customer name removed]; Johnnie, Joe and I flew out to Newfoundland and set up the onsite server on their boat and they showed us around the boat and stuff. And this was a more modern boat, but they were still doing most stuff with pens and paper.”&lt;/p&gt;

&lt;p&gt;“They had binders they showed us: ‘yeah, here’s where we fill out the thing and we just check it off.’ and it’s this big bookcase of binders. And you know, it’s impossible, if you need to search for one work permit that happened three months ago. Good luck finding it, right?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AIDAN&lt;/strong&gt;&lt;br&gt;
“So there’s not lots of places where we can say that we’re actually […] trying to make the workplace a more secure place, like where we can actually have an impact on security [safety] and maybe even lives.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JOHNNIE&lt;/strong&gt;&lt;br&gt;
“I think my take is simply we’re building tools to make risky jobs easier to do or safer to do.”&lt;/p&gt;

&lt;p&gt;“There’s a lot of friction going on with those industries and we’re trying to solve that friction.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MARC&lt;/strong&gt;&lt;br&gt;
“My interpretation of the mission is that there’s a lot of friction right now in the industry when it comes to health and safety, a lot of forms and checkboxes to tick and things like that. When it comes to security, it’s ironic because too much security actually can decrease security.”&lt;/p&gt;

&lt;p&gt;“You don’t increase security by adding more stuff to do. You make it super easy. You use computers instead of [paper] forms, but you don’t, you don’t fit-in forms on your computers. It’s a bit better, but that’s not what you do. You want to automate. You don’t want to have anything to do, and [automation should] do the health and safety analysis for you. So, yeah, removing friction.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HkFryud6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wkkmpd7becz2bfslcm0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HkFryud6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wkkmpd7becz2bfslcm0k.png" alt="&amp;quot;If it's not simple, it's not safe&amp;quot;" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MICAH&lt;/strong&gt;&lt;br&gt;
“So coming from a background of mechanical engineering, I worked with industrial companies and I saw how they maintain their documentation and how they tracked work, let’s say, or how they try to ensure safety or how they even track systems. I worked with subsea departments, so looking at installed hydraulic equipment and seeing how that is monitored and tracked. And then I’ve worked with work departments where they’re talking about budgeting people’s hours for work. And one thing that really kind-of astonished me at the time as an undergraduate student and these co-op terms was how behind they were technologically at the time… And how Excel makes the world go round!&lt;br&gt;
And like someone in an office can run Excel and that’s fine, but nobody who is in a trades position or who in an implementation position is going to pull up Excel and log it? It doesn’t make sense! It’s so much friction. And it’s so non-intuitive, it’s a great tool, but the reason why people make paper documents, which tell you where to sign and what you’re signing, is because it makes so much more sense than giving a trades worker a pen and paper and say:  ‘why do you think this is safe at this given moment?’ Right? So the thing that I love about our mission is it lets people focus in real-time on what they are doing as far as dangerous work is concerned, as far as trying to talk about dangerous work.&lt;/p&gt;

&lt;p&gt;And it guides them along that path to be more effective communicators and more effective maintainers of the integrity of the safety around the work they’re doing. And then to implement it, right? Because the more we lower the friction for the paperwork that they have to do to ensure compliance, the better that they can focus on actually being safe Because we’re telling them exactly what they need to do. So, I just, I really like it because I know the friction exists and the reason why we do it is because the work is inherently dangerous. So it’s kind of fulfilling to be like ‘we get to take it off your plate,’ you know?“&lt;/p&gt;

&lt;h2&gt;
  
  
  What have you learned while working at Opslock?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BEN&lt;/strong&gt;&lt;br&gt;
“I learned a lot about how to keep architecture simple and how to not overcomplicate things.&lt;br&gt;
Johnnie and Marc are both very good at the ‘don’t prematurely optimize’ mentality. And that’s something that I’ve had trouble with in the past.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JOHNNIE&lt;/strong&gt;&lt;br&gt;
“You start to understand when you solve problems, you’re normally solving now for what doesn’t work rather than what does work; because there’s always multiple ways to solve the problem, but oftentimes we’re always like ‘what’s the first thing that works?’ But I think what I’ve been learning is [that] you want to remove ambiguity all the time. So you want to remove things that don’t work and then leave yourself with a set of options.“&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LUCAS&lt;/strong&gt;&lt;br&gt;
“I think the most important thing is there are many ways to solve a problem, and I learned how to find a solution, the best solution, for this issue. And just thinking in the long term, I think that’s the key.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MARC&lt;/strong&gt;&lt;br&gt;
“I’ve had the chance at Opslock, when building the backend, to actually be part of the discussion about the design, the architecture, and how to tackle problems.”&lt;/p&gt;

&lt;p&gt;“I have learned a lot about how to tackle the problem and what matters and what does not matter. Cause there’s plenty of stuff to fix all the time. I don’t run out of stuff to do, but you have to be able to know what needs your attention right now and what can wait. And it feels weird sometimes to say here’s a bug, but I won’t fix it. Even though I notice it, even though I know I have a good idea on how to fix it, I just won’t fix it now.”&lt;/p&gt;

&lt;p&gt;“So yeah, I learned to prioritize and also at Opslock, I’ve been allowed to fail. Like there are things that I’ve implemented and it turned out to be very bad, and I just propose another solution for my mistakes. I said, well, we should do it this way instead. And I was allowed to redo it. It was not like: ‘no, you had the chance and we’ll ask someone else’ or ‘we’ll just keep that crappy solution because it kind of works. It’s fine.’ If I know how to make something better, I’m allowed to do it. So that helps the learning experience.“&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MICAH&lt;/strong&gt;&lt;br&gt;
“For me as a developer, I learned a lot of new technologies because we’re very quick to, kind of, use new shiny things, which is a fun part of being a startup. If you want to implement a technology, you can fight to do it… If you think it’s going to give business value.”&lt;/p&gt;

&lt;p&gt;“I think being your own advocate too, is another thing that you have to be in a smaller team. Maybe in a larger team, you can kind of hide in the background a little bit more.”&lt;/p&gt;

&lt;p&gt;“This team loves to share excitement, and I think that’s a lot of fun. If you make a strong case for something then people will be like: ‘yes, we do need that. Let’s get it moving!’ Whereas in larger teams, I can imagine there’s just more, a little more bureaucracy to making those changes.”&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s your favourite part of Developer Experience (DX) at Opslock?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AIDAN&lt;/strong&gt;&lt;br&gt;
“So we’re slowly building the CI that we want. Bryan listens a lot to his engineers. Not that he’s like… sometimes he has his ideals and he may be stubborn sometimes. But I mean, if you have good arguments, he will listen to you. Like, He didn’t know nothing about Scaffold, about Memento and all that, but Marc-François presented those and said: ‘look, it could be useful’ and he said: ‘okay, I don’t know what it is, but it seems good. Let’s go ahead.` So slowly, our CI is getting better and better.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BEN&lt;/strong&gt;&lt;br&gt;
“Everyone is tech savvy. They are completely comfortable with just instantly hopping in on video calls or, or screen sharing, or using a Visual Studio live sharing. I think that’s the biggest… There’s the least amount of friction collaborating with people at this company that I’ve ever experienced so far.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fIuUaTJl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iplbf04pjvjm9jru40wo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fIuUaTJl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iplbf04pjvjm9jru40wo.png" alt='"New tech", "Good CI", "design system", "colab &amp;amp; lead"' width="880" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MARC&lt;/strong&gt;&lt;br&gt;
“I might be biased because, as someone who’s part of making the developer experience, I’m building the tools.”&lt;/p&gt;

&lt;p&gt;“My favorite part is that if you have a brand new computer and you’ve just got access to the GithHub repo to get the code, and you have Docker installed, it’s one line, pretty much one line, and you’ve got your backend running and you can open the app. You can add users, add companies, do tasks. Like the friction is pretty low. I know it’s not perfect, but it was worse in the past. And it just, it keeps getting better.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BJORN&lt;/strong&gt;&lt;br&gt;
“I feel glad that we have these, kind of, building blocks [from the Design System,] to speed up development. And yeah, sometimes I’m looking at files just full of Design System components and nothing else. It’s really cool to see.”&lt;/p&gt;

&lt;p&gt;“Another thing is we have very extensive tests. I mean, for CI. So every time we do some changes currently we have a big list of CI checks that we do. And the good thing is we always have them green these days and it’s really assuring as a developer that we’re not missing.“&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MICAH&lt;/strong&gt;&lt;br&gt;
“I think that the design system was a really smart move from the get-go. Just because previously we had used libraries, and there’s a lot of great libraries out there. It’s not to say that ours is the best. […] it just lets us have a level of control and customizability around the application that might be hard otherwise… and it ensures consistency.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LUCAS&lt;/strong&gt;&lt;br&gt;
“Yeah, many things! I really like [that] we are building a fantastic CI on every repository, and it’s cool DX. And then secondly, I really like the group discussion[s we have] to solve the problem, and anyone can propose a solution and then we figure out our best fit.”&lt;/p&gt;

&lt;p&gt;“Also I really liked the hackathon. And we can, besides the customer request[s], we also have the chance to propose our own requirement, which we think of, if we think there’s a chance we can help the customer in another way.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Anything else you’d like to say?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SHAWN&lt;/strong&gt;&lt;br&gt;
“I mean, besides, you know, working in an early stage startup and working on a good team, what I would say is… The mission of Opslock is more compelling than a lot of engineering jobs out there. You know, there’s so many tech companies where you’re like just creating AB tests for some ad or: ‘which user interface is going to get more clicks than this one.’ It just feels so soul-crushing to me. I was nearly hired at a company like that, and I’m so glad I ended up here instead, because at least I feel like, oh, it’s very clear. There’s a very clear goal here.”&lt;/p&gt;

&lt;p&gt;“I just feel like, look, whatever industry it is, people are losing hands and stuff, doing this, right? And hey, if we have software that, you know, reduces the number of hands lost per year, that seems like a positive outcome.”&lt;/p&gt;

&lt;p&gt;“You can feel proud and excited about that without any sort of moral qualms within yourself. And I think there’s a lot of technology companies, not all of them, but there is a good amount where I would feel somewhat morally conflicted about the success of my own company.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AIDAN&lt;/strong&gt;&lt;br&gt;
“When I get a little stressed and all that, and I’m like, oh, I just think of the team. And I like the colleagues I have.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MARC&lt;/strong&gt;&lt;br&gt;
“There’s no unnecessary pressure put on me. If I have good ideas, they will be listened to. The tech is also cool to play with, I think, if you like Go. I guess on the front end, I suppose so too, I don’t do front end that much, but Svelte seems pretty cool. There’s also a good culture… The tech culture is there. People are interested and passionate about the tools they use and the programming language, without being too much… What’s the word? Well, without being fan-boys in a way“&lt;/p&gt;

&lt;p&gt;“We like cool tech, but we like cool tech that gets things done.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BJORN&lt;/strong&gt;&lt;br&gt;
“I would say that if you’re working from anywhere else, not in Canada, then take a shot. The team has been really, really helpful in making you part of the team and making you feel included. Anyone, new hires, feel free, not just in Canada, if you’re anywhere else, it’s a good opportunity.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ME&lt;/strong&gt; &lt;em&gt;to&lt;/em&gt; &lt;strong&gt;LUCAS&lt;/strong&gt;&lt;br&gt;
“Other engineers call you the machine. Why is that?”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LUCAS&lt;/strong&gt;&lt;em&gt;'s response&lt;/em&gt;&lt;br&gt;
“I don’t understand when Joe called me that the first time, when I was in Opslock in my first year. I did some research actually. It’s like… just doing something like a robot and it’s never stop[ing] or some explanation like this. I find that it’s a positive compliment, so I accept it [laughs].”&lt;/p&gt;

&lt;p&gt;“So I think for any potential hires, I think I can say that we grow very fast, we are still young and we have a lot of things to learn. So we welcome everyone that wants to learn new things and wants to grow together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MICAH&lt;/strong&gt;&lt;br&gt;
“What’s exciting about working on a product like this is it’s not inherently super esoteric. It is in some ways, when you talk about predictive mitigation for instance, that could be seen as a little bit out there. But I think we’re making something for everyday people to use who have important roles in society. So I think that’s neat and fulfilling.”&lt;/p&gt;




&lt;p&gt;That concludes the responses from the team! Interviewing my co-workers was a fun, collaborative, and insightful way to reflect on my first year here at Opslock. I’m happy to be able to share that insight with you in this post. Thank you for reading. Thanks also to the engineers and to Melanie, Opslock's designer, for making the line-art illustration for the header image of this post! If you are interested in joining the team, please visit &lt;a href="https://opslock.com/careers/"&gt;Opslock's careers page here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>career</category>
      <category>startup</category>
    </item>
    <item>
      <title>9 Months Into Our Web Monetization Journey</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Tue, 02 Feb 2021 02:45:40 +0000</pubDate>
      <link>https://dev.to/esse-dev/where-we-re-at-with-akita-ehl</link>
      <guid>https://dev.to/esse-dev/where-we-re-at-with-akita-ehl</guid>
      <description>&lt;p&gt;Hi DEV! &lt;a class="comment-mentioned-user" href="https://dev.to/elliot"&gt;@elliot&lt;/a&gt;
 and &lt;a class="comment-mentioned-user" href="https://dev.to/sharon"&gt;@sharon&lt;/a&gt;
 here :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Update
&lt;/h2&gt;

&lt;p&gt;We're four months into our six month &lt;a href="https://www.grantfortheweb.org/"&gt;Grant for the Web&lt;/a&gt; project, Akita. What is Grant for the Web?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Grant for the Web is a $100M fund to boost open, fair, and inclusive standards and innovation in Web Monetization.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Check out our other &lt;a href="https://dev.to/esse-dev"&gt;articles under the esse-dev organization&lt;/a&gt; for context around the Akita project. You can also read our &lt;a href="https://community.webmonetization.org/akita/akita-grant-report-1-3c1n"&gt;full interim report posted on the Web Monetization Forem&lt;/a&gt;. Now, onto the updates!&lt;/p&gt;

&lt;p&gt;So far we've:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;created &lt;strong&gt;&lt;a href="https://esse-dev.github.io/a-web-monetization-story/"&gt;"A Web Monetization Story"&lt;/a&gt;&lt;/strong&gt; for helping creators on the web engage with and understand Web Monetization;
&lt;a href="https://esse-dev.github.io/a-web-monetization-story/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mNUCIpgh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://community.webmonetization.org/remoteimages/i/gq8zozqfipf3uvhchaxg.png" alt="A Web Monetization Story Screenshot" width="500"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;improved the &lt;strong&gt;&lt;a href="https://github.com/esse-dev/akita"&gt;Akita browser extension&lt;/a&gt;&lt;/strong&gt; and released it on the &lt;a href="https://chrome.google.com/webstore/detail/akita/phcipgphomfgkenfmjnbmajdiejnlmgg"&gt;Chrome Web Store&lt;/a&gt; (stay tuned for a post asking for feedback!); and
&lt;a href="https://github.com/esse-dev/akita"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rLNhAWeG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://community.webmonetization.org/remoteimages/i/3ipslo6j7shq9szwj29e.png" alt="Akita Screenshot" width="200"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;participated in: Creative Commons Global Summit 2020, Future of Micropayments Conference 2020 and hackathon communities to talk about Web Monetization!
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iM4c3GcN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://community.webmonetization.org/remoteimages/i/fhdpj464pn8qlep60q6h.png" alt="Elliot Future of Micropayments" width="300"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i1cCkP0z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://community.webmonetization.org/remoteimages/i/hgw61w7zngab8zpotuyh.png" alt="Sharon CC Summit" width="300"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We've been enjoying coding, designing, writing and chatting as part of the Web Monetization community. Some of our big wins have been placing 2nd🥈 in the &lt;a href="https://render.betaworks.com/here-are-the-top-projects-from-betahack-a-hackathon-to-fix-the-internet-c7bccf6f17aa"&gt;BetaHack "Fix the Internet" hackathon&lt;/a&gt; with &lt;a href="https://esse-dev.github.io/a-web-monetization-story/"&gt;"A Web Monetization Story"&lt;/a&gt;, having our projects and presentations featured on &lt;a href="https://developers.coil.com"&gt;developers.coil.com&lt;/a&gt; and receiving our first &lt;a href="https://github.com/esse-dev/akita/issues/82"&gt;issue reported by a community member on Akita&lt;/a&gt;. Our main struggle has been balancing development of the Akita extension, along with community outreach and development of our website "A Web Monetization Story".&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I support Akita
&lt;/h2&gt;

&lt;p&gt;If you have some spare time, check out &lt;a href="https://esse-dev.github.io/a-web-monetization-story/"&gt;"A Web Monetization Story"&lt;/a&gt; and fill out the survey at the end to let us know your thoughts! (If you’ve already checked out the website, but missed the survey, you can fill it out here: &lt;a href="https://esse-dev.typeform.com/to/H304mpsQ"&gt;"A Web Monetization Story" survey&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Finally, we’ve created a Twitter account for us to communicate updates on our progress going forward — we’d appreciate it if you gave us a follow: &lt;a href="https://twitter.com/esse_dev"&gt;@esse_dev&lt;/a&gt;. Not much going on there yet, but stay tuned! :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Over the course of the project we've learned about open content and open source licensing, incorporation in Canada, privacy policies and browser extension development, among other things. Elliot gave his first conference talk and Sharon published her first browser extension: Akita!&lt;/p&gt;

&lt;p&gt;Shout out to the Web Monetization community! We've appreciated all the support we've received since we started on Akita nine months ago. It's been awesome to speak at conferences, receive feedback from the community and meet so many cool people.&lt;/p&gt;

&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;&lt;em&gt;the &lt;a href="https://github.com/esse-dev"&gt;esse-dev&lt;/a&gt; team (Sharon and Elliot)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webmonetization</category>
      <category>internethealth</category>
      <category>grantfortheweb</category>
    </item>
    <item>
      <title> A Web Monetization Story</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Mon, 24 Aug 2020 05:38:38 +0000</pubDate>
      <link>https://dev.to/esse-dev/a-web-monetization-story-2e81</link>
      <guid>https://dev.to/esse-dev/a-web-monetization-story-2e81</guid>
      <description>&lt;p&gt;&lt;a class="comment-mentioned-user" href="https://dev.to/sharon"&gt;@sharon&lt;/a&gt;
 and I are creating &lt;a href="https://esse-dev.github.io/a-web-monetization-story/"&gt;&lt;em&gt;A Web Monetization Story&lt;/em&gt;&lt;/a&gt;, an interactive Web Monetization tutorial for online creators. The tutorial follows along with Auden, a blogger who is experimenting with Web Monetization on their site. If you are interested in setting up Web Monetization on your own site, or want to get others involved in Web Monetization, you may be interested in &lt;a href="https://esse-dev.github.io/a-web-monetization-story/"&gt;&lt;em&gt;A Web Monetization Story&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We are creating this project for the &lt;a href="https://betahack.devpost.com/"&gt;BetaHack ‘Fix The Internet’ virtual Hackathon&lt;/a&gt;. There are seven days remaining in the hackathon. We are posting here, on DEV, in order to ask for honest feedback on what we have created.&lt;/p&gt;

&lt;p&gt;We hope that you enjoy what we have created. We also hope to keep improving on it, so we want to hear from you! Thank you for reading and supporting us!&lt;/p&gt;

&lt;h1&gt;
  
  
  Excerpt
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;I run a blog about my adventures with Chicken — my dog!&lt;/p&gt;

&lt;p&gt;Recently, I came across something called Web Monetization. It’s a new way for online creators to monetize their sites and for website visitors to support creators. It seeks to promote a more flexible, inclusive and privacy-respecting way of transferring money.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;br&gt;&lt;br&gt;
&lt;em&gt;P.S. vote for &lt;a class="comment-mentioned-user" href="https://dev.to/sharon"&gt;@sharon&lt;/a&gt;
 in the &lt;a href="https://noonies.tech/award/best-web-monetization-innovator"&gt;2020 HackerNoon Noonies - Best Web Monetization Innovator Category&lt;/a&gt;!&lt;/em&gt;

</description>
      <category>webdev</category>
      <category>webmonetization</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Hackathon Update: Breaking Our Idea Down Into Dog-Treat-Sized Tasks</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Tue, 02 Jun 2020 05:36:26 +0000</pubDate>
      <link>https://dev.to/esse-dev/hackathon-update-breaking-our-idea-down-into-dog-treat-sized-tasks-50e3</link>
      <guid>https://dev.to/esse-dev/hackathon-update-breaking-our-idea-down-into-dog-treat-sized-tasks-50e3</guid>
      <description>&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/sharon"&gt;@sharon&lt;/a&gt; and I are continuing to work on our &lt;a href="https://dev.to/t/gftwhackathon"&gt;#GftWhackathon&lt;/a&gt; project. For our submission, we are making Akita! Akita is a browser extension that gives you insight into your involvement with Web Monetization. We have broken down our browser extension creation process into 8 tasks. We use GitHub to manage our tasks; you can see all our comments, related code, and progress on &lt;a href="https://github.com/esse-dev/akita/issues?q=is%3Aissue+label%3A%22GftW+x+DEV+Hackathon%22+" rel="noopener noreferrer"&gt;Akita's GitHub page&lt;/a&gt;. In this article I list our tasks and give a brief explanation of each of them. We have finished ✅ some already, and we are still working 🚧 on the others.&lt;/p&gt;

&lt;p&gt;For a backstory and explanation of the thinking behind Akita, check out the article &lt;a class="mentioned-user" href="https://dev.to/sharon"&gt;@sharon&lt;/a&gt; wrote:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/esse-dev" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F2455%2Fe40fd5cf-e0ff-452b-aea4-14304ff0b2cf.png" alt="esse-dev"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F373775%2F3a975b8b-37f8-4380-aeb0-5c8db19ea967.png" alt=""&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/esse-dev/how-can-you-support-websites-without-having-to-deal-with-annoying-ads-3lmb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;How can you support websites without having to deal with annoying ads?&lt;/h2&gt;
      &lt;h3&gt;Sharon for esse-dev ・ Jun 2 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#gftwhackathon&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webmonetization&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#browser&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Here are our 8 tasks for creating the Akita browser extension for the &lt;a href="https://dev.to/t/gftwhackathon"&gt;#GftWhackathon&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;✅&lt;br&gt;
&lt;strong&gt;1. Commit basic project structure&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a "hello world" browser extension. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅&lt;br&gt;
&lt;strong&gt;2. Check for monetization meta tag on a webpage&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check whether the "monetization" meta tag for a payment pointer exists on the site.&lt;/li&gt;
&lt;li&gt;Validate the payment pointer according to &lt;a href="https://paymentpointers.org/" rel="noopener noreferrer"&gt;https://paymentpointers.org/&lt;/a&gt; and &lt;a href="https://interledger.org/rfcs/0009-simple-payment-setup-protocol/#specification" rel="noopener noreferrer"&gt;https://interledger.org/rfcs/0009-simple-payment-setup-protocol/#specification&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚧&lt;br&gt;
&lt;strong&gt;3. Change extension icon dynamically from JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a user is on a monetized website, the Akita extension icon in the browser bar should visually change to make it clear that the site is monetized.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅&lt;br&gt;
&lt;strong&gt;4. Figure out how to store data without relying on browser search history&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store data using &lt;code&gt;browser.storage.local&lt;/code&gt;. Write helper functions to make sure data is stored in the expected structure, and data is not accidentally overwritten.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅&lt;br&gt;
&lt;strong&gt;5. Data collection: Track amount streamed to websites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the Web Monetization JavaScript API to listen to monetization events and collect data through the extension. The API is available to website developers through functions in the &lt;code&gt;document.monetization&lt;/code&gt; object. 
This ended up being a challenge because the &lt;code&gt;document.monetization&lt;/code&gt; object is not directly accessible in the browser extension JavaScript runtime environment, so a script must be injected into the webpage to access it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚧&lt;br&gt;
&lt;strong&gt;6. Data collection: Track # of visits to websites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track and store total number of visits to monetized sites vs. unmonetized sites.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚧&lt;br&gt;
&lt;strong&gt;7. Data collection: Track time spent on a webpage&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track and store total time spent on monetized sites vs. unmonetized sites.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🚧&lt;br&gt;
&lt;strong&gt;8. Load collected data and display it in the extension pop-up&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a user clicks on the Akita extension icon in the browser bar, a small window will pop up which visually displays all of the collected data, whether the current page is web monetized, and links to resources for getting involved with Web Monetization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading and following our progress in the hackathon! I've seen that some people have already posted some cool submissions. I'm excited to be getting involved in the growing Web Monetization community and can't wait for &lt;a class="mentioned-user" href="https://dev.to/sharon"&gt;@sharon&lt;/a&gt; and I to submit Akita :)&lt;/p&gt;

</description>
      <category>gftwhackathon</category>
      <category>webmonetization</category>
      <category>webdev</category>
      <category>browser</category>
    </item>
    <item>
      <title>Kickstarting a project idea: going from 0 to...0 - Part 2</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Tue, 26 May 2020 03:20:10 +0000</pubDate>
      <link>https://dev.to/esse-dev/kickstarting-a-project-idea-going-from-0-to-0-part-2-3bph</link>
      <guid>https://dev.to/esse-dev/kickstarting-a-project-idea-going-from-0-to-0-part-2-3bph</guid>
      <description>&lt;p&gt;For the past two weeks, &lt;a class="comment-mentioned-user" href="https://dev.to/sharon"&gt;@sharon&lt;/a&gt;
 and I have been working together (across the country!🇨🇦) on the &lt;a href="https://dev.to/devteam/announcing-the-grant-for-the-web-hackathon-on-dev-3kd1"&gt;Grant for the Web Hackathon&lt;/a&gt; &lt;a href="https://dev.to/t/gftwhackathon"&gt;#GftWHackathon&lt;/a&gt;. We've spent our time researching Web Monetization, learning how to effectively collaborate and organize our work, and coming up with ideas for our submission. &lt;/p&gt;

&lt;p&gt;In this post I will talk about the ideas we came up with, the problems we encountered, and the current state of our progress in the hackathon. To read about how we began our remote collaboration process check out &lt;a class="comment-mentioned-user" href="https://dev.to/sharon"&gt;@sharon&lt;/a&gt;
's article:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/sharon" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r9UOfRJq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--4xVo0oeH--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/373775/3a975b8b-37f8-4380-aeb0-5c8db19ea967.png" alt="sharon image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/esse-dev/kickstarting-a-project-idea-going-from-0-to-0-part-1-3o2e" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Kickstarting a project idea: going from 0 to...0 - Part 1&lt;/h2&gt;
      &lt;h3&gt;Sharon ・ May 26 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#gftwhackathon&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webmonetization&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ideation&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#collaboration&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
 

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
    &lt;th&gt;Top 3 Grant for the Web x DEV Community hackathon Ideas&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td&gt;
&lt;b&gt;Money stream visualization&lt;/b&gt; (Sharon's Idea)
&lt;br&gt;&lt;br&gt;
A Web Monetization enabled website could include a visualization of all the different streams of money being sent to the website. Each visitor could be represented by a colored shape. If a visitor is streaming money to the website using Web Monetization, $s could flow out of the shape representing the visitor. If there were a ton of people streaming, there would be a ton of $s flying across the screen! The speed at which the $s flow out could represent the payment stream rate, e.g. how much money is being sent per second.
&lt;br&gt;&lt;br&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zBchPwzu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ftdpdtkgrod58ep2tkap.gif"&gt;
&lt;br&gt;
It would be possible to implement this visualization by using the Web Monetization JavaScript API. On the frontend of a website, The JavaScript API would collect information about whether a user is streaming money or not. That information would then be sent to a backend server which can keep track of the money-streaming data of all users on the website. The backend would then send all the data to the frontend to be visualized.
&lt;br&gt;&lt;br&gt;
This idea would provide a visual way for website users to get excited about and engage with Web Monetization! When people see a cool visualization, they might be interested in learning more about what it is communicating. It would be important to provide links to resources and information about Web Monetization so interested people could learn more and become part of the Web Monetization community.
&lt;br&gt;&lt;br&gt;
Additionally, the idea of streaming money is new and may be a bit tricky for people to wrap their heads around (we thought it was tricky!). Seeing a visualization might help newcomers understand what it means to stream money over the web!
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;
&lt;b&gt;Live event platform&lt;/b&gt; (Elliot's Idea)
&lt;br&gt;&lt;br&gt;
Attending events in-person can be a lot of fun, but unfortunately most in-person events in the near future have been cancelled. An online event platform could fill this gap and enable people from across the world to attend events together. Charity and fundraiser events can be a great way to connect with a community of like-minded people, have a good time socializing, and contribute to something meaningful. 

&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GB2VgLEk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c3kbddsck2um6xzw0gmf.png" width="400"&gt;

With the power of Web Monetization, online charity and fundraiser events could easily be created. Just by attending and spending time at an event, a person using a Web Monetization provider would automatically be contributing to the cause supported by the event.

  &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;
&lt;b&gt;A website with a central fund which is distributed based on merit&lt;/b&gt; (Sharon's Idea)
&lt;br&gt;&lt;br&gt;
Here's the idea: website users stream payments to the website using Web Monetization. As they spend time on the website, the streamed payments are collected into a central fund. Then, the money is distributed to contributors based on some measurement of merit. This would help promote quality contributions by rewarding the contributors who put in the effort in a more tangible way...money!
&lt;br&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tt6UWsr7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hn3smfdgwnhljk056kif.png" width="400"&gt;
&lt;br&gt;
For example, StackOverflow.com could collect streamed payment from its users. All the money collected could be given back to the best-rated accepted answers on the platform. Bonus idea: What if every time you upvoted an answer on StackOverflow you sent a microdonation? This would allow you to give the answer’s author a small gesture of appreciation, with a bit more of a personal touch than an upvote on its own.
  &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;While discussing our top 3 ideas, we realized it might work to combine the &lt;b&gt;Live event platform&lt;/b&gt; and &lt;b&gt;Money stream visualization ideas&lt;/b&gt;. We thought it could be hype-inducing to attend a live fundraising event which gives you a visual understanding of the total amount of money being streamed during the event. We decided to combine Sharon's idea with my idea into one SUPER IDEA: &lt;b&gt;A live event platform with money stream visualization&lt;/b&gt;. This super idea could enable users to feel like they are part of the community, have fun, and contribute to a great cause!&lt;/p&gt;

&lt;p&gt;At this point we were feeling good about our new super idea, so we started moving ahead with it. The next steps were to define features and figure out how users would interact with the platform. We had done our research and we knew it would be possible to implement our ideas using Web Monetization tech, but we weren’t sure whether our idea would actually be useful or not. As we were getting into the details of our idea, we identified a few problems that seemed difficult to address within the scope of our idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  More money, more problems
&lt;/h2&gt;

&lt;p&gt;While thinking about how real users would interact with our SUPER IDEA, we asked ourselves the question: How many Coil users would have to attend an event in order for the event to raise a significant amount of money? Since Coil is currently the only way for users to stream money using Web Monetization, this was an important question. We checked Coil's documentation and found that &lt;a href="https://help.coil.com/accounts/membership-accounts#how-much-do-you-pay-out-to-creators"&gt;Coil streams money at a rate of $0.36 an hour&lt;/a&gt; to websites. Assuming, for simplicity's sake, that each user attends an event for an hour, our platform would need 1000 users to join an event in order to raise $360. &lt;/p&gt;

&lt;p&gt;That's not a very large amount of money, but it &lt;em&gt;is&lt;/em&gt; a very large amount of users, and a long time to spend at an online event. We felt that creating a platform for such an event sounded quite difficult: it is not easy to attract people to an event, and it is even harder to keep people engaged for an entire hour.&lt;/p&gt;

&lt;p&gt;In order to keep people engaged for the length of an hour long event, people would have to be actively engaging &lt;em&gt;with something&lt;/em&gt;. Combining our &lt;b&gt;Live event platform&lt;/b&gt; idea with the &lt;b&gt;Money stream visualization&lt;/b&gt; idea would give people an interesting visualization to look at for a minute or two, but certainly not a full hour! We started thinking about YouTube and Twitch. These platforms keep people engaged by hosting high-quality entertaining content. Making a great platform for content doesn't seem easy… &lt;/p&gt;

&lt;p&gt;With these considerations, making our (maybe not-so) SUPER IDEA useful sounded like a complex problem—too complex for a month-long hackathon. So we decided to pivot to our third idea: &lt;b&gt;A website with a central fund which is distributed based on merit&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;While we both agreed that this idea is cool, we quickly realized it would be more useful when added to an existing website. Creating an entirely new platform just to add the idea of rewarding contributors with money is a bit backwards. What kind of platform for contributors could we even establish when so many great ones already exist? We decided it would be great if existing platforms like Stack Overflow incorporated this idea into their community, but we didn't think this idea was the right fit for the hackathon.&lt;/p&gt;

&lt;p&gt;We had run out of ideas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feeling lost, sad, and hopeless is part of the process
&lt;/h2&gt;

&lt;p&gt;Now, at the time of finishing this article, I can add that writing has helped us step back and understand where we are at in this hackathon. While working through the details of our ideas, we encountered unexpected complexities. We ended up feeling stuck and we didn't know where to go next. So, we took some time to think, discuss and reflect on our frustrations, and write down our thoughts. This process allowed us to revisit what we valued in Web Monetization and what we valued in our ideas. After our feelings of frustration were resolved, we were able to move on. All the time spent, and knowledge gained from this frustrating process is exactly what we are using to come up with a new idea.&lt;/p&gt;

&lt;p&gt;We have come up with a new idea which takes what we valued from the previous ideas and combines it into not just a SUPER idea, but a MEGA idea. We've learned firsthand that it can be good to pivot and change ideas. Pivoting is like starting over again, but with way more understanding and knowledge than the last time you started over. In summary, failing can be great (even though it's difficult and frustrating)! &lt;/p&gt;

&lt;p&gt;Wish us luck as we get started with our new idea in the last two weeks of the hackathon. All the best to our fellow &lt;a href="https://dev.to/t/gftwhackathon"&gt;#GftWHackathon&lt;/a&gt; participants, and see you in our next update post!&lt;/p&gt;

</description>
      <category>gftwhackathon</category>
      <category>startup</category>
      <category>webmonetization</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My Google Technical Interview Cheat Sheet</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Sat, 06 Jul 2019 12:44:27 +0000</pubDate>
      <link>https://dev.to/elliot/my-google-technical-interview-cheat-sheet-1lbd</link>
      <guid>https://dev.to/elliot/my-google-technical-interview-cheat-sheet-1lbd</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the last couple of months of 2018, I spent most of my days preparing for my Google Internship technical interviews. I ended up getting the job, and had a great experience!&lt;/p&gt;

&lt;p&gt;Two months after my internship, I wanted to share the document I used and prepared in the weeks leading up to my interviews. For me, creating this cheat sheet was like creating a cheat sheet before an exam. The process of creating it and checking the steps over and over solidified the steps in my mind.&lt;/p&gt;

&lt;p&gt;I believe anyone can pass interviews at the big tech companies, you just have to spend time learning about the interview process and preparing. &lt;/p&gt;

&lt;p&gt;This document is high level enough that it should be applicable to any sort of technical interview, whether you are applying to Google, a startup, or your first internship. I hope it can help you feel more comfortable in your preparation and interview process!&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Interview Cheat Sheet
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.pramp.com/#/"&gt;https://www.pramp.com/#/&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;An interview practice tool. Take turns interviewing and being interviewed by someone with a shared code editor, and video and voice chat.&lt;br&gt;
The best resource. Interviews may be awkward or difficult at first, but the more you do, the more comfortable you will be, and the better you will do in a real interview.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://codesignal.com/"&gt;https://codesignal.com/&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Good questions from real interviews at Facebook, Google, Microsoft, etc. I recommend codesignal over alternative code practice websites, because most questions include a target space and time complexity.&lt;/p&gt;

&lt;h4&gt;
  
  
  (Cracking the Coding Interview)
&lt;/h4&gt;

&lt;p&gt;My favorite parts: Interview Preparation Grid (pg. 32), the whole behavioral questions section, and Interview Questions: Data Structures (pg. 88 - 107). If you haven't encountered space and time complexity before, this book has a good, quick, practical introduction to the concept.&lt;/p&gt;

&lt;h3&gt;
  
  
  Throughout the Interview:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Consistently communicate, with honesty. (Keep talking while you are thinking, communicate your thought process)&lt;/li&gt;
&lt;li&gt;Chat, joke around, have fun.&lt;/li&gt;
&lt;li&gt;Write down any important information.&lt;/li&gt;
&lt;li&gt;Ask questions, and adapt to what the interviewer gives you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step by Step:
&lt;/h3&gt;

&lt;p&gt;These are the steps I followed from the start of the technical interview to the end. Don't worry about getting through all of them, just get as far as you can, giving each step as much attention as it needs. (In one of my interviews I only just started on step 9 before I ran out of time). When I got off track I found these steps helped me reorient myself and keep going.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read Question&lt;/li&gt;
&lt;li&gt;Clarify understanding of inputs, outputs, and side effects&lt;/li&gt;
&lt;li&gt;Ask questions, and state any reasonable assumptions&lt;/li&gt;
&lt;li&gt;Go through an example to ensure understanding of problem

&lt;ul&gt;
&lt;li&gt;Spend as much time as you need just understanding the problem, this is important&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Think of an algorithm to solve the problem

&lt;ul&gt;
&lt;li&gt;Try a similar, but less complicated problem.&lt;/li&gt;
&lt;li&gt;Try paying attention to your process in manually working through an example.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Go through an example or three to make sure the algorithm works

&lt;ul&gt;
&lt;li&gt;State any edge cases and address them&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Discuss Time and Space complexity&lt;/li&gt;
&lt;li&gt;If you can think of a better algorithm, and you have time, go to step 4; otherwise ask if this is good, if it isn’t, go to step 4&lt;/li&gt;
&lt;li&gt;Implement

&lt;ul&gt;
&lt;li&gt;Break the problem down into several methods (if it is good to do so)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Look over code for errors.&lt;/li&gt;
&lt;li&gt;Think of edge cases arising from how your algorithm is implemented.&lt;/li&gt;
&lt;li&gt;Go through an example with the implementation, looking out for errors.&lt;/li&gt;
&lt;li&gt;Once you are sure your code is correct, clean it up.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What was your favorite song/album/artist to listen to while programming this week?</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Thu, 13 Jun 2019 21:35:50 +0000</pubDate>
      <link>https://dev.to/elliot/what-was-your-favorite-song-album-artist-to-listen-to-while-programming-this-week-2g5h</link>
      <guid>https://dev.to/elliot/what-was-your-favorite-song-album-artist-to-listen-to-while-programming-this-week-2g5h</guid>
      <description>&lt;p&gt;&lt;em&gt;Community highlight:&lt;/em&gt; Last week &lt;a href="https://dev.to/t4rzsan"&gt;t4rzsan&lt;/a&gt; shared some consequences of wearing headphones while working in the article: &lt;a href="https://dev.to/t4rzsan/please-don-t-use-headphones-when-working-261g"&gt;Why you shouldn't wear headphones while working&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Protip&lt;/em&gt; Spotify Embed:&lt;/strong&gt; Enter the Spotify URI of the Spotify track / playlist / album / artist / podcast episode you are trying to embed. &lt;br&gt;
&lt;code&gt;{% spotify spotify:episode:5V4XZWqZQJvbddd31n56mf %}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Whether you are quietly jamming to tunes in the office or blasting some beats at home, &lt;strong&gt;what was your favorite song/album/artist to listen to while programming this week?&lt;/strong&gt;
&lt;/h3&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>What are your favorite creative coding articles, tutorials, and content?</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Sat, 08 Jun 2019 22:42:39 +0000</pubDate>
      <link>https://dev.to/elliot/what-are-your-favorite-creative-coding-articles-tutorials-and-content-23c4</link>
      <guid>https://dev.to/elliot/what-are-your-favorite-creative-coding-articles-tutorials-and-content-23c4</guid>
      <description></description>
      <category>discuss</category>
      <category>creativecoding</category>
    </item>
    <item>
      <title>Visualizing Process with Javascript ES6 Generators</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Fri, 07 Jun 2019 13:33:38 +0000</pubDate>
      <link>https://dev.to/elliot/visualizing-process-with-javascript-es6-generators-31fo</link>
      <guid>https://dev.to/elliot/visualizing-process-with-javascript-es6-generators-31fo</guid>
      <description>&lt;p&gt;Countless hours are poured into designing functions that run in the fraction of a second. When functions execute so quickly, their ingenious implementations are not easily appreciated. Let’s slow them down, and take the necessary time to watch them work.&lt;/p&gt;

&lt;p&gt;In this article, I go over the basics of generator functions and how to use them to visualize a function’s process.&lt;/p&gt;

&lt;h1&gt;
  
  
  What's a Generator Function?
&lt;/h1&gt;

&lt;p&gt;Generator functions are new to JavaScript, and many people have been struggling to find real-world practical uses for them. I’m excited to show you a cool way to use them, but let’s go over the basics first. Here’s a simple Generator function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;myGeneratorFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks a lot like a normal function except for two differences: an asterisk (*) after &lt;code&gt;function&lt;/code&gt;, and the use of the &lt;code&gt;yield&lt;/code&gt; statement.&lt;/p&gt;

&lt;p&gt;Below is how myGeneratorFunction is used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;myGeneratorFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello world&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// logs out 1&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// logs out 'hello world'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calling a Generator Function does not execute it right away, instead it returns a Generator object. Calling &lt;code&gt;.next()&lt;/code&gt; on the Generator object causes myGeneratorFunction to execute up to the first yield statement, returning the value appearing after the yield keyword. Generators allow us to stop and start the execution of a function. Check out the the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*"&gt;MDN page on Generators for more information.&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Why visualize a function's process anyway?
&lt;/h1&gt;

&lt;p&gt;Visualizing a function’s process helps when trying to understand the implementation, and can result in fascinating animations and impressive effects. Take this video visualizing various sorting algorithms for example:&lt;/p&gt;

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

&lt;p&gt;This video illustrates why process visualization is awesome:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Watching the process of sorting is strangely captivating.&lt;/li&gt;
&lt;li&gt;The differences in how each sorting algorithm works are instantly obvious.&lt;/li&gt;
&lt;li&gt;What better way to interest someone in how something works, than to make how it works look cool?&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Let's visualize!
&lt;/h1&gt;

&lt;p&gt;Computers nowadays run ridiculously, faster-than-Usain-Bolt, mind-bogglingly fast. That means that functions run just as fast. With a Generator we can slow down the function process so that it operates at 60 steps per second. At this speed we can watch a function do what it does best, in real time as it does it. It will be like watching the world’s fastest sprinter in slow motion, seeing individual muscles contract and relax in a single step.&lt;/p&gt;

&lt;p&gt;For our example let's shamelessly copy the youtube video above and visualize the &lt;em&gt;insertion sort&lt;/em&gt; algorithm with a bar graph. Below are two pieces of code we will need. One for the basic algorithm, and one for drawing a bar graph. After these pieces of code, we'll see how to easily put them together.&lt;/p&gt;

&lt;p&gt;This is the basic &lt;em&gt;insertion sort&lt;/em&gt; algorithm implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;insertionSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And below we have a function that draws an array as a bar graph on a canvas. I use the 2d Canvas API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;canvasEl&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;drawGraphFromArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clearRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;barWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;barHeightScale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fillRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;barWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;barWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;barHeightScale&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;
    &lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
draws a bar graph where x axis: index in the array, y axis: value at index





&lt;p&gt;Now back to our regular programming. In order to slow down our insertion sort function we are going to rewrite it as a Generator function. Sounds tricky, right? It’s actually the opposite of tricky, it’s SUPER EASY. This is the rewritten insertion sort:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;insertionSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;inputArray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are only two changes. We add an &lt;code&gt;*&lt;/code&gt; after the function keyword and add a &lt;code&gt;yield&lt;/code&gt; statement whenever we want to draw a frame in the animation, yielding the array being sorted. With those simple changes, we’ve converted a function into a Generator function that is executed one step at a time, and yields the data we need to visualize its process. This rewrite is great because it’s unintrusive - there’s almost no chance the conversion will affect the logic of the function.&lt;/p&gt;

&lt;p&gt;Now let’s put &lt;code&gt;drawGraphFromArray&lt;/code&gt; and our new &lt;code&gt;insertionSort&lt;/code&gt; Generator function together in a &lt;code&gt;requestAnimationFrame&lt;/code&gt; render loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// code from above ...&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;randomArr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sortGenerator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;insertionSort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;randomArr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;renderLoop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;yieldedArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sortGenerator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;drawGraphFromArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;yieldedArray&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;renderLoop&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;renderLoop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;resulting in our finished animation:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/vez/embed/MdMxKN?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In the final animation above, we see the bar graph go from a jagged mess to a beautiful staircase. To achieve this, we ask our insertion sort to operate at one step per render loop with &lt;code&gt;.next()&lt;/code&gt;. &lt;code&gt;requestAnimationFrame&lt;/code&gt; makes sure our render loop runs at 60 frames per second, the perfect speed for a smooth animation.&lt;/p&gt;

&lt;p&gt;Insertion sort is a simple example of what we can do...&lt;/p&gt;

&lt;h3&gt;
  
  
  This article was originally published on &lt;a href="http://elliot.website/a/?Visualizing%20Process%20with%20ES6%20Generators"&gt;my blog http://elliot.website/a/?Visualizing%20Process%20with%20ES6%20Generators&lt;/a&gt;. Check it out to see some bonus content about creative coding using generators.
&lt;/h3&gt;

&lt;p&gt;Thanks for reading. What's a creative way you've used generator function? &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>creativecoding</category>
    </item>
  </channel>
</rss>
