<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Insightful Software - Medium]]></title>
        <description><![CDATA[Thoughts on data, training, and consulting from Envy Labs - Medium]]></description>
        <link>https://blog.envylabs.com?source=rss----c0af7b3d4c8c---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Insightful Software - Medium</title>
            <link>https://blog.envylabs.com?source=rss----c0af7b3d4c8c---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 09 Jun 2026 20:58:47 GMT</lastBuildDate>
        <atom:link href="https://blog.envylabs.com/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[SVG Export Settings for Custom CSS Animations | Adobe Illustrator]]></title>
            <link>https://blog.envylabs.com/svg-export-settings-for-custom-css-animations-adobe-illustrator-e106f77c6cb5?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/e106f77c6cb5</guid>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[svg]]></category>
            <category><![CDATA[adobe-illustrator]]></category>
            <category><![CDATA[css]]></category>
            <category><![CDATA[animation]]></category>
            <dc:creator><![CDATA[Casey Ocampo]]></dc:creator>
            <pubDate>Mon, 25 Feb 2019 22:22:34 GMT</pubDate>
            <atom:updated>2022-01-20T21:14:50.320Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Mycg7xtgCBqY-2FoSlefZw.gif" /></figure><p>Knowing the right way to export an SVG (<a href="https://developer.mozilla.org/en-US/docs/Web/SVG">scalable vector graphics</a>) file can be tricky, especially if your goal is to animate it later. When doing my own research on the subject, I quickly realized there weren’t a lot of resources to pull information from.</p><p>Cue the process of trial and error that totally <em>doesn’t</em> make you want to throw your laptop out the window.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FzIDj8BXPfKn5e%2Ftwitter%2Fiframe&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FzIDj8BXPfKn5e%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2FzIDj8BXPfKn5e%2F200.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="244" frameborder="0" scrolling="no"><a href="https://medium.com/media/0b4ed076033b2c30e897b2f6c48318a1/href">https://medium.com/media/0b4ed076033b2c30e897b2f6c48318a1/href</a></iframe><p>After several attempts at getting Illustrator to generate the most optimally structured code for custom CSS animations, I finally found the settings that work best. Since information on this topic is scarce, I’m sharing what I’ve learned via a handy 13-step guide.</p><h3>Heads Up!</h3><p>This step-by-step guide is current with Adobe Illustrator Version 23.</p><p>To view which version of Illustrator you have, open your program and click the ‘Illustrator CC’ tab located in the top navigation menu. Then, click the ‘About Illustrator…’ option.</p><p>A window with some information should pop up. I’ve included a screenshot of what is displayed on mine and have circled the version number in red.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*7jgB9nyg7Al5b2zf" /></figure><p>If you’re running the same version as me, great — you should be able to follow these steps with no problems! Going forward, this method should be compatible with most versions of Illustrator (unless Adobe releases changes that alter settings used here). If you’re running an older version and this guide works, let us know in the response section below.</p><p>Alright, now that we’ve got that squared away, let’s take a look at the steps!</p><h3>The Step-By-Step Roadmap</h3><p><em>When following this guide, pay extra attention to Step 8. There are two options available that are dependent on your preferences.</em></p><p><strong>Step 1</strong>: Select all graphics on the artboard [shortcut keys: command ⌘ + a<em> </em>on Mac/ctrl + a on a PC]. To achieve this without using shortcut keys, find the ‘Select’ tab in the top navigation and choose the ‘All’ option.</p><p><strong>Step 2</strong>: Click the ‘Object’ tab in the top navigation menu.</p><p><strong>Step 3</strong>: Click ‘Expand Appearance’. This converts design elements like paths, lines, etc. into editable vector shapes. If this step is skipped, you may see some transparent gray lines or shapes in your image that are caused by a number of design elements that were made in Illustrator.</p><p><strong>Step 4</strong>: Click the ‘File’ tab in the top navigation menu.</p><p><strong>Step 5</strong>: Hover over the ‘Export’ option and click the ‘Export As’ option.</p><p>The following window will be displayed. Steps 6 through 9 are to be done in this window.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*O8xgK187voyzfgPZ" /></figure><p><strong>Step 6</strong>: Name your file and choose where you’d like to export the file.</p><p><strong>Step 7</strong>: Find the ‘Format’ dropdown menu at the bottom of the window and select SVG (svg).</p><p><strong>*Step 8</strong>: Check the ‘Use Artboard’ option below the Format dropdown menu if you wish to include only the graphics <em>inside</em> your artboard. If you wish to include graphics that extend <em>outside</em> of the artboard, leave this unchecked.</p><p><strong>Step 9</strong>: Click the ‘Export’ button to continue.</p><p>The following window will be displayed. Steps 11 and 12 are to be done in this window.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/0*2qW5_LtQ4THiVN2q" /></figure><p><strong>Step 10</strong>: Adjust the settings as follows:</p><ul><li>Styling: Internal CSS</li><li>Font: SVG</li><li>Images: Embed</li><li>Object IDs: Layer Names</li><li>Decimal: 2</li><li>Leave the ‘Minify’ and ‘Responsive’ checkboxes <strong>unchecked.<br></strong>If checked, Illustrator would compress your code by removing any unnecessary characters like white spaces or new lines. This is not an ideal code structure to work with as you would have to separate the code yourself.</li></ul><p><strong>Step 11</strong>: Click the ‘OK’ button at the bottom right of the window.</p><p><strong>Step 12</strong>: Locate the file from wherever you saved it. This was done in step 6. In my example screenshot you can see that my <em>awesome.svg </em>file was saved to my desktop.</p><p><strong>Step 13</strong>: Right click the file and open it in your text editor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/0*bBQPRFHwblIo_tsK" /></figure><p>And BAM, you now have the most optimal SVG code ready for custom CSS animations!</p><h3>Achievement Unlocked</h3><p>Now you can begin sifting through the code blocks to identify what is what.</p><p>To bring this article full circle, here are three workflow options for finding which part of the graphic belongs to which particular block of code:</p><h4>Option 1</h4><p>If your designer named their layers, then this process will be easy. With the file opened up in your editor, search for the layer name and then write a comment above it to label what it is for future reference.</p><h4>Option 2</h4><p>If your designer didn’t name their layers, you can name them yourself in Illustrator, save the file and then export. From here, you can follow through with the above paragraph’s comment/label workflow.</p><h4>Option 3</h4><p>If for whatever reason you’re working with unnamed layers, the labelling process will be a bit longer, but still doable. You can begin by commenting out code blocks and seeing which element was removed from the image. Once identified, uncomment the code block and label it with a comment above it. Do this for the rest of the file until everything is labeled.</p><p>After all of the code is labelled, identify which graphics you want to animate. Then, remove the commented labels for graphics that you will not be animating to reduce file size.</p><p>From there, you can start to write the custom CSS animations in between the style tags and add their respective class to the code as you test the animation and move along to the other graphics you want to animate.</p><h3>Finished Animated SVG Example</h3><p>Below I’ve included an example of a finished animated SVG that I did for a recent project at <a href="https://envylabs.com/">Envy Labs</a>. Feel free to look at how it’s structured and play around with the different animated elements!</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2Fconnorocampo%2Fembed%2Fpreview%2FJxxoOd%3Fheight%3D600%26slug-hash%3DJxxoOd%26default-tabs%3Dhtml%2Cresult%26host%3Dhttps%3A%2F%2Fcodepen.io&amp;url=https%3A%2F%2Fcodepen.io%2Fconnorocampo%2Fpen%2FJxxoOd%3Feditors%3D1000&amp;image=https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fm.cdpn.io%2Fscreenshot-coming-soon-small.png&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/382d548f1370355998c9d7a050a2ce1b/href">https://medium.com/media/382d548f1370355998c9d7a050a2ce1b/href</a></iframe><p>Did this article help solve a problem you were experiencing? Did you create a really awesome animated SVG? Let me know in the response section below!</p><p>Also, if you have any questions about something mentioned in this article that you want me to go more in-depth on, share them below! There may be other readers who have the same question and would benefit from having that dialogue documented here.</p><h3>About the Author</h3><p>Casey Ocampo is a Front-end Developer at <a href="https://envylabs.com/">Envy Labs</a>, a data-driven web application consultancy with a focus on interactive training and visualization.</p><p>If you’re interested in hiring us or want to have a chat about your project, you can reach us by email at <a href="mailto:hello@envylabs.com?subject=Hey%20Envy%20Labs!">hello@envylabs.com</a>. We’re happy to get acquainted and talk about your idea!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e106f77c6cb5" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/svg-export-settings-for-custom-css-animations-adobe-illustrator-e106f77c6cb5">SVG Export Settings for Custom CSS Animations | Adobe Illustrator</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Envy Labs: 2018 in Review]]></title>
            <link>https://blog.envylabs.com/envy-labs-2018-in-review-11a231c73f13?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/11a231c73f13</guid>
            <category><![CDATA[2018-review]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[data-visualization]]></category>
            <category><![CDATA[web-design]]></category>
            <category><![CDATA[envy-labs]]></category>
            <dc:creator><![CDATA[Olivia Howard]]></dc:creator>
            <pubDate>Tue, 29 Jan 2019 18:57:10 GMT</pubDate>
            <atom:updated>2019-01-29T18:57:10.864Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Gfx5oSKX3V85Bp9-7hcppQ.gif" /></figure><p>2018 was a great year for us at Envy Labs! We hired some talented people, worked with clients new and old, traveled all across the country to attend conferences, got new office plants (and they’re still alive), wrote things on our blog, and, of course, had some fun along the way!</p><p>Here’s a quick video we put together to commemorate our year:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FEt-VbX3VpfQ%3Fstart%3D7%26feature%3Doembed%26start%3D7&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DEt-VbX3VpfQ&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FEt-VbX3VpfQ%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="640" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/27a2eb89e63042d35d9a289e3207fe22/href">https://medium.com/media/27a2eb89e63042d35d9a289e3207fe22/href</a></iframe><p>Thanks for watching!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=11a231c73f13" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/envy-labs-2018-in-review-11a231c73f13">Envy Labs: 2018 in Review</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[UI Design for the Graphic Designer]]></title>
            <link>https://blog.envylabs.com/ui-design-for-the-graphic-designer-f8d099097b29?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/f8d099097b29</guid>
            <category><![CDATA[graphic-design]]></category>
            <category><![CDATA[career-change]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[ui-design]]></category>
            <category><![CDATA[ui]]></category>
            <dc:creator><![CDATA[Olivia Howard]]></dc:creator>
            <pubDate>Wed, 12 Dec 2018 17:42:02 GMT</pubDate>
            <atom:updated>2018-12-12T17:42:01.895Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eMF4CaPOPoMZsKhlvGTAvg.png" /><figcaption>Thanks to <a href="https://medium.com/u/5f97e18a107a">Nick Walsh</a> for the illustration assist. You’ve finally found your calling here.</figcaption></figure><p>When I was in college, studying User Interface (UI) Design wasn’t an option (or at least not one that I was aware of), and that was only 7 years ago. I went to school for Studio Art and Graphic Design, which is a fancy way of saying <em>print design</em>. We only had one web design class available, and it consisted of <a href="https://www.w3schools.com/">W3Schools</a> tutorials. I’ve forgotten everything covered except &lt;&gt; and &lt;/&gt; (if my professor happens to read this… sorry).</p><p>Now, UI design in all its various forms (UX design, interactive design, product design, etc.) seems to be the “it” design job. It’s safe to say the Internet and all devices that use it are here to stay, which means that companies are increasingly interested in hiring people who can design for an optimal digital experience. Graphic designers have found the transition to marketing site design relatively straightforward, but styling for an application is a different beast.</p><p>Here’s a collection of pain points and helpful resources I’ve collected during my (short) journey from print to interface.</p><h3>Back to Basics</h3><h4>Examples of graphic design:</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rm-FzF5BFxKUEa5CUKPAhg.png" /><figcaption>1. Typography by <a href="https://dribbble.com/shots/3939220-AFE-Poster">Steve Wolf</a> | 2. Illustration by <a href="https://dribbble.com/shots/3994676-sutro-baths-initial-exploration">Chris Reath</a> | 3. Packaging by <a href="https://dribbble.com/shots/5317533-Turbo-Bag">Ryan Prudhomme</a> | 4. Annual report design by <a href="https://dribbble.com/shots/2947840-Leading-The-Way-2016-Report">Forefathers</a></figcaption></figure><h4>Examples of UI design:</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oDrthBiHejbBNA0xzsDxsA.png" /><figcaption>1. Responsive design by <a href="https://dribbble.com/shots/3660004-Captico-Animation">Divan Raj</a> | 2. Modal windows by <a href="https://dribbble.com/shots/3768074-Modal-windows">Jakub Antalík</a> | 3. Wireframes by <a href="https://dribbble.com/shots/3013062-Udacity-Wireframes">Focus Lab</a> | 4. Style guide by <a href="https://dribbble.com/shots/3892022-Design-System">Adam Kalin</a></figcaption></figure><p>Design is design, right? I was confident the transition would be pretty straightforward (spoiler: it wasn’t). Having a solid foundation of typography, color, and composition (basically the <a href="https://www.thoughtco.com/principles-of-art-and-design-2578740">seven elements and principles of design</a>), is important, but not enough to make it a perfectly seamless switch. Though both disciplines start from a place of visual appeal, the intent of graphic design is to cause an action or feeling, while UI focuses more on the intuitiveness of a design and efficiently completing a task. Even the way you choose fonts is different (oh hey, web font licensing and delivery).</p><p>Understanding this has been the biggest challenge for me. Where once I judged websites based on how they looked, I now have to think about how they work, too — buttons, transitions, animations, icons, navigation, etc. It’s honestly a bit overwhelming at first.</p><h3>Where to start?</h3><h4><strong>Sketch It Out</strong></h4><p><a href="https://www.sketchapp.com/">Sketch</a> is an industry favorite in UI design, and a great place to start. Think Adobe Illustrator, but tailored for web interfaces.</p><p>The biggest hurdle is mastering <a href="https://www.sketchapp.com/docs/symbols/creating-symbols/">symbol creation</a> and <a href="https://www.sketchapp.com/docs/symbols/nested-symbols/">nested symbols</a>. Fortunately, we’ve got you covered: <a href="https://dribbble.com/_ayanacampbell">Ayana</a>, Envy’s Creative Director, wrote an <a href="https://blog.envylabs.com/symbol-in-a-symbol-building-design-systems-in-sketch-30b8d167506e">article</a> on precisely that.</p><p>Efficiency is key in design software, and Sketch definitely isn’t lacking: <a href="https://www.sketchapp.com/docs/shortcuts/">shortcuts</a>, <a href="https://www.sketchapp.com/docs/styling/shared-styles/">shared styles</a>, and <a href="https://www.sketchapp.com/docs/text/text-styles/">text styles</a> are all invaluable for a foray into interface design. Knowing how to use them will smooth out common problems during the design process and design-to-developer handoff.</p><h4><strong>Wireframes</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*i1xhZ6W09THwQcpC8BxsGA.jpeg" /><figcaption><a href="https://dribbble.com/shots/5618704-Lo-fi-to-Hi-fi">By Shabnam Gideon for Focus Lab</a></figcaption></figure><p>Initial design sketches are handy in the print realm, but my introduction to wireframes revealed how much weight they carry in the interface and experience process. Styling an entire application is a time-consuming process, and providing the means to solidify functionality and content is very helpful. Getting the team’s input in this stage is also important, as they’ll be able to steer you away from any ideas that are too time-consuming, fall short of goals, and/or are generally unnecessary.</p><p>Wireframes should be kept simple — big changes are easier to make with low fidelity compositions. Being a very detail-oriented person that isn’t used to designing in phases, this has been difficult for me because I want to design everything all in one go.</p><h4><strong>Style Guides</strong></h4><p>Brand books are a relatively standard asset in the world of graphic design, and applications have a similar concept in <em>style guides</em>. Style guides should be started early on in the design process and continued as you go. Teams that collaboratively work on a style guide begin on the same page with stylistic choices, and have a proper base to build on as the application and brand mature.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*dGXT2GHXaqEvg6PEC_5W6Q.jpeg" /><figcaption><a href="https://dribbble.com/shots/4630320-Client-Dashboard-Style-Guide">By Ayana Campbell Smith</a></figcaption></figure><p>Before creating the style guide, it’s a good idea to design 3–4 of the website’s pages: the homepage, a page that includes forms, and an interior page (at least). By the time you’re done with those, you should have a decent idea of where the overall design is heading and what’s working vs. not working. Additionally, the start of your style guide is a good point to begin creating those Sketch symbols I was talking about earlier.</p><h3>Learning is Hard</h3><h4><strong>Functionality</strong></h4><p>Functionality is the chasm between graphic and interface design. Print takes something with a fixed size, focuses on appealing visuals, and seeks to compel the viewer towards a specific goal. Interfaces need the same sort of attractiveness, but provide users with the means to fulfill a number of (potentially complex) goals. Why is this button here and how is the user going to interact with it? Are there any new insights on hamburger menus, or should we stick with a traditional horizontal navigation? Where is the user taken when they click this link?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*DjwLBE2QKzE_tU3xi8pkLg.gif" /><figcaption><a href="https://dribbble.com/shots/4932443-">By 00.032 for Green Chameleon</a></figcaption></figure><p>Application functionality is a series of patterns — and building your own personal library of preferred patterns through research, trial-and-error, and exploration is a time-consuming process. No, you can’t learn all of this in one day no matter how hard you try. It helps to find someone who’s willing to teach you in-person (like co-workers in my case), and there are plenty of online options, too, like <a href="https://trydesignlab.com/">Designlab</a>, <a href="https://generalassemb.ly/">General Assembly</a> (with a UX lean), good ol’ <a href="https://www.youtube.com/">YouTube</a>, and here on <a href="https://medium.com/search?q=UI%20design">Medium</a>, too.</p><h4><strong>Responsive Design</strong></h4><p>Interface design lacks any guarantees around the device size users will use to interact with your finished product. Considering all shapes and sizes (and environments — hello direct sunlight) is another fundamental shift that carries throughout your efforts. Sketch has some great tools to help with this, like the <a href="https://www.sketchapp.com/docs/layer-basics/constraints/">resizing constraints</a> feature.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HSs4pNbXAjzhopM6" /><figcaption>From Sebastian Müller’s blog post: <a href="https://medium.com/sketch-app-sources/how-to-make-your-ui-design-fully-responsive-with-sketch-part-2-42cedd291f94">How to Make Your UI Design Fully Responsive With Sketch — Part 2</a></figcaption></figure><h3>Perseverance</h3><p>Failure happens. You’re probably not going to get it right on the first, second, or maybe even third try. This hit me right in the ego; I’m a perfectionist and used to being good at my job and knowing (mostly) what I’m doing. Feeling relatively comfortable and jumping back in the deep end is a tough transition.</p><p>I have to keep reminding myself that this is normal when learning something new and, with time and perseverance, that feeling will pass. It’s important to ask for feedback from teammates or mentors as much as possible in the learning phase in order to continue fine-tuning your new skills and knowledge.</p><p>Remember that no one on the team has all the answers, so feedback isn’t necessarily a matter of being <em>wrong</em>, just a way to explore different perspectives and approaches.</p><h3>Final Thoughts</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*YPZDwaX54yMT9st-EcPrRw.gif" /></figure><p>Transitioning from print to interfaces was much trickier than I expected, but bridging the gap is totally doable and rewarding with time and dedication. UI design is a valuable skill to explore at least once, even if you don’t plan on trading in ink and paper.</p><p>Had I known about UI from the get-go would it have changed my career path? Possibly, but I’m glad I have the foundation that I do. And I love print design way too much to give it up. That being said, I definitely plan on continuing to learn UI moving forward and am thankful for teammates who are patient and willing to help.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f8d099097b29" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/ui-design-for-the-graphic-designer-f8d099097b29">UI Design for the Graphic Designer</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sending a Client Deliverable]]></title>
            <link>https://blog.envylabs.com/sending-a-client-deliverable-868042980c2e?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/868042980c2e</guid>
            <category><![CDATA[screencast]]></category>
            <category><![CDATA[consulting]]></category>
            <dc:creator><![CDATA[Nick Walsh]]></dc:creator>
            <pubDate>Wed, 05 Dec 2018 18:33:48 GMT</pubDate>
            <atom:updated>2018-12-05T18:33:48.466Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*isYm7WKTbFA7HZWVav0sMw.png" /></figure><p>You’ve spent all week gathering ingredients. Testing combinations, cooking techniques, and presentations. Satisfied with the result, you shuffle your new roommate into the kitchen, stick a spoon in their mouth, and… stare until they give a response.</p><p>Reactions range from <em>shrug</em> to “mmm” plus a nod. Not helpful, (typically) not genuine, and not what you’re looking for to drive the recipe forward — but the fault lies with the chef.</p><p>Asking for live feedback from a deliverable is the same as shoving a spoon in someone’s face. The right sort of critique takes consideration, and it should start in an environment separate from the creator.</p><p>The <strong>delivery</strong> is a bit of process that’s remained largely unchanged since Envy Labs began its foray into software consulting. We follow four steps:</p><ul><li>Start with a screencast.</li><li>Follow up with a call, especially for the first delivery.</li><li>Provide a means for in-place comments.</li><li>Transfer to the source of truth.</li></ul><h3>Start With a Screencast</h3><p>Crab is pretty great, but handing someone a crab leg for the first time may not leave them with your appreciation (or knowledge) of the meat inside.</p><p>While images <em>can</em> tell a story, we anchor our deliveries with a screencast — whether it’s for wireframes, design, or code, the format conveys reasoning without the creator being present. The first line of decision-making defense.</p><p>If you’re aiming for the client to actually watch the video, commit to a set of guidelines and a base level of production value. Our tenets include:</p><ul><li><strong>Length</strong>: it shouldn’t rival an episode of a television show in length. At the very least, keep it information dense.</li><li><strong>Script</strong>: varies by the individual — it should sound natural, but with as few tangents, corrections, and <em>ums</em> as possible. I usually skip a script and record the second take.</li><li><strong>Streaming</strong>: upload the video somewhere that makes it easy to consume.</li><li><strong>Walkthrough</strong>: provide a quick demonstration of any applications you’ll be asking the client to use in the review process. Don’t assume they’ve used InVision, Marvel, or something similar in the past.</li></ul><h4>Bonuses</h4><p>Screencasts bring a few handy bonuses in the software world. Many development tasks — tests, performance, refactoring — aren’t immediately visible in a staging environment, but can be highlighted as part of a video.</p><p>For longer projects, they serve as a library of decisions, checkpoints, and visualization of effort.</p><p>For designers, screencasts are a good way to reveal bits of unused or outdated work. Clients can be walked through the process, without offering up reviewable versions of old designs.</p><h4>Best Paired With</h4><p>Sending a video on its own can be counterproductive. We aim to include:</p><ul><li>Linked project documentation for decisions referenced.</li><li>A separate list of all questions asked in the video.</li><li>Expectation for review deadlines.</li></ul><h3>Follow With a Call</h3><p>Assuming everyone taking part in the follow-up has seen the video (which is a useful check to kick the meeting off), we’ve shifted from a presentation to a <strong>discussion</strong>. Instead of taking time to introduce a solution and the inevitable pause for processing that follows, the focus is on clarification and feedback.</p><p>Timing the call after delivery will vary from client to client — everyone needs time to review what you’ve sent beforehand, but waiting too long means the information may not be fresh. We’ve had the most success in setting it within a week.</p><p><em>Taking</em> critique is a separate post unto itself, but comments should be collated. Bonus points if you use the application you’re expecting the client to leave notes in as a method of reinforcement.</p><h3>Collecting Comments</h3><p>Two guidelines reign supreme in collecting feedback during and after the follow-up call:</p><ul><li>Have the client appoint a final decision maker to avoid competing critique.</li><li>Seek to limit prescriptive comments (also a topic for a separate post). “This should stand out more” is more useful than “this should be purple.”</li></ul><p>Reviewers need the means to convey two types of critique: contextual within the designs or wireframes (InVision, Marvel, etc.), and higher-order notes for the direction as a whole (we usually use Basecamp).</p><h3>The Source of Truth</h3><p>As decisions are made or changed, a single source of facts should be updated — the cookbook, if you will, to continue the random food analogies.</p><p>Sorting through old prototypes, videos, notes, and emails is a painful process for rediscovering a final feature choice. Whether it’s a ticket-based application, an issue tracker, or a wiki, ensure the responsibility is assigned for translating truth over.</p><h3>Wrap Up</h3><p>Screencasts are a great starting point for deliveries — everyone begins on a similar foundation for feedback and questions. Putting the effort in to create one, though, isn’t enough. Additional bits of process, including follow-ups, directed feedback, and a single source of truth are necessary.</p><p>This many food metaphors means it’s probably time for lunch.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=868042980c2e" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/sending-a-client-deliverable-868042980c2e">Sending a Client Deliverable</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Secure Authentication for JavaScript Apps]]></title>
            <link>https://blog.envylabs.com/secure-authentication-for-javascript-apps-6c2bfa4926a3?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/6c2bfa4926a3</guid>
            <category><![CDATA[security]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[authentication]]></category>
            <dc:creator><![CDATA[Tyler Hunt]]></dc:creator>
            <pubDate>Mon, 26 Nov 2018 16:17:06 GMT</pubDate>
            <atom:updated>2018-11-26T16:17:06.142Z</atom:updated>
            <content:encoded><![CDATA[<h4>How to avoid being the subject of the next big data breach.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ft2t4P8GuQAlBz0R0fi9uA.png" /></figure><h3>SPA and JWT Sitting in a Tree</h3><p>In recent years, as web development has moved towards a more JavaScript-heavy front end, and SPAs and PWAs have become as commonplace as APIs, another TLA has popped up: <a href="https://jwt.io/introduction/">JWTs</a>. Our tried-and-true server-side authentication schemes tend to fall down when placed into the context of a client-side web app, since pushing a global API key to the client would present some serious security concerns. In light of this, JSON Web Tokens are often presented as the solution.</p><p>JWTs attempt to fulfill the authentication requirement by sending a token to the client that provides some assurance via a signature that the data within it hasn’t been tampered with. The token can then be passed back to the server with each API request, acting as the keys to the kingdom, while also allowing “claims” to be included within the token for profile info, user roles, or anything else you like. In this way, the JWT often acts as the session store for the application.</p><p>There are lots of reasons to like this approach: it’s simple to understand (“Look, it’s JSON!”), easy to implement (“Oh, there’s a library for this…”), based on an <a href="https://tools.ietf.org/html/rfc7519">industry standard</a>, and designed for the Web. Combined with <a href="https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage">localStorage</a>, which is about the easiest API you could ask for to store data like JWTs, it all makes for a very convenient package for developers. And, to back it up, there are <em>many</em> blog posts documenting this strategy.</p><p>Given all this, it’s clear why so many reach for JWTs for API authentication. Their sexiness is hard to resist. However, <a href="https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid">much</a> <a href="http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/">has</a> <a href="https://developer.okta.com/blog/2017/08/17/why-jwts-suck-as-session-tokens">been</a> <a href="https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/">written</a> about their shortcomings, especially when used as a session store. They give the illusion of security while ignoring decades of research and practical advice. There <em>is</em> a time and place where using a JWT makes sense, but it’s <em>not</em> as an API key and it’s <em>not</em> as a session store.</p><p>Let’s look at some of these issues in more detail.</p><h3>The Problems with JWTs</h3><p>One of JWT’s core flaws is that the token itself specifies which algorithm to use for verification. Early on, there were <a href="https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/">critical vulnerabilities</a> in many JWT libraries allowing an attacker to specify the none algorithm, effectively bypassing the signature verification step entirely. Even if those flaws have been fixed, specifying the algorithm in the token header is still problematic, as it results in an additional attack vector.</p><p>Another issue comes with using JWTs as a session store: you can’t invalidate sessions. For example, you may want to invalidate all existing sessions after a user changes his password. This is possible if the session is stored on the server, since you have access to that data, but a JWT will live on until its expiration. You can’t invalidate JWT sessions without resorting to tracking them on the server, which defeats the point of using them in the first place.</p><p>Some argue that pushing the session storage to the client facilitates horizontal scaling. In reality, for all but the largest of sites, <a href="https://paragonie.com/blog/2017/03/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid#what-to-use-instead">this is a non-issue</a>:</p><blockquote>It is overwhelmingly likely that you do not [need] crazy horizontal scaling schemes at all, and that a single server-side session management system is sufficient for your use case.</blockquote><p>Basically, you’re not Google or Facebook or even Reddit, so YAGNI.</p><p>And, despite what the standard says about JWTs being “intended for space constrained environments such as HTTP Authorization headers and URI query parameters”, their Base64 encoding can make them too large to be stored in a cookie or transmitted in a URL. As a result, many people resort to shoving them into localStorage. For something as sensitive as an API token, this is a fairly ridiculous thing to do, as we’ll see next.</p><h3>The Problem with localStorage</h3><p>The gist of the issue here is that localStorage has next to no security. While its access <em>is</em> limited to code running on the domain for which the data was stored, there are no restricitions in place that would prevent external scripts running on your domain from accessing it. This opens you up to XSS attacks. If a third-party script is compromised, it could result in anything stored in localStorage being stollen. If a JWT is among the data in that storage, you could have a serious breach on your hands.</p><p>Unlike cookies, which provide mechanisms to prevent XSS attacks, localStorage currently provides no such solution. Any script executing on your site will have <a href="https://www.whitehatsec.com/blog/web-storage-security/">access to all the data in the store</a>:</p><blockquote>Web Storage is not secure storage. It is not “more secure” than cookies because it isn’t transmitted over the wire. It is not encrypted. [This] is not a place to keep session or other security tokens.</blockquote><p>It <em>really</em> shouldn’t be used for anything but caching publicly accessible data or storing other non-sensitive data like site preferences.</p><h3>A Better Solution</h3><p>So what should we use instead? They may not be newfangled or come with their own acronyms or initialisms, but cookies are currently your best bet. Most web frameworks provide a session store based on cookies right out of the box. In some cases, the cookie will contain the session itself in an encrypted form, and in others the cookie will merely store an identifier that’s used to look up the session on the server.</p><p>Web framework session stores have long relied on these cookies for identifying users. While they’ve had their own share of security flaws over the years, at this point cookie implementations are well-tested and hardended from a security standpoint. Additionally, because support is already built-in at the library and framework level, there’s no need to figure out your own implementation.</p><p>Cookies allow for <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#Directives">a variety of flags</a> to be set that limit their accessibility. The Secure flag prevents cookies from being sent to the server unless the connection is encrypted, and HttpOnly prohibits the contents of the cookie from being read through JavaScript at all, eliminating the possibility of XSS attacks. When using a session based on a properly-secured cookie, the flaws and vulnerabilities outlined above become non-issues.</p><p>And for server-side sessions, their centralized nature means they can be invalidated as needed to support new features or handle security incidents. They also enable features to be developed that would allow users to review their recent logins and invalidate sessions themselves should the need arise.</p><p>While it’s tempting to go with the flow and take the widespread advice to use JWTs in localStorage for your client-side apps, don’t do it. It’s not worth the risk to your users, it’s not simpler to implement, and it won’t make you cool no matter how many Medium posts you write about it.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6c2bfa4926a3" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/secure-authentication-for-javascript-apps-6c2bfa4926a3">Secure Authentication for JavaScript Apps</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Updating a Visualization of Likert Scale Results]]></title>
            <link>https://blog.envylabs.com/updating-a-visualization-of-likert-scale-results-437f68f1e940?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/437f68f1e940</guid>
            <category><![CDATA[canvas]]></category>
            <category><![CDATA[web-performance]]></category>
            <category><![CDATA[data-visualization]]></category>
            <dc:creator><![CDATA[Nick Walsh]]></dc:creator>
            <pubDate>Tue, 13 Nov 2018 12:18:09 GMT</pubDate>
            <atom:updated>2018-11-13T12:21:46.751Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4LcHFTiQeQj7ZRTuW-SRiQ.gif" /></figure><p>Last month, we launched the 2018 edition of <a href="https://thestateoftheology.com/data-explorer">The State of Theology</a> alongside Ligonier Ministries. The microsite, updated every two years, allows users to examine survey data centered around religious beliefs. Each response is paired with demographic data, opening the door for an exploratory visualization (aptly named <em>Data Explorer</em>).</p><p>Having also built the 2016 edition, this year’s run offered a chance to iterate, introduce features, and revisit some assumptions. Visualizing data requires a series of choices (<em>tradeoffs</em> may be the better word) to present the results appropriately, which we’ll explore here in a bit more detail.</p><h3>2016 Approach</h3><p>Each version of the survey uses a five-point <a href="https://en.wikipedia.org/wiki/Likert_scale">Likert scale</a> — participants are given a statement, then asked to indicate whether they:</p><ul><li>Strongly Agree</li><li>Somewhat Agree</li><li>Neither Agree nor Disagree</li><li>Somewhat Disagree</li><li>Strongly Disagree</li></ul><p>Following along with their corresponding whitepaper, our first take emphasized relative areas for the two extremes: agree or disagree. A tweaked area chart (extending out from a vertically centered axis) was picked as the clearest representation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dVHf_eOFg50ccngbLY30wA.gif" /></figure><h4>The Good</h4><p>The approach passed the at-a-glance test: relative weightings of each response were clear, and the design itself was attractive. Demographic filters were simple to mix-and-match, and the resulting subset was easy to compare to the full population.</p><h4>Pain Points</h4><p>We sought to avoid <em>different for different’s sake</em>, but there were a few areas to improve on:</p><ul><li>The actual percentage for each response required an interaction to reveal, which felt a bit overkill for 5–10 numbers.</li><li>Each area was smoothed via D3 interpolation, reducing the accuracy a bit.</li><li>Filtering demographic data didn’t clearly visualize the subset size compared to the full population.</li><li>The Data Explorer was mostly unusable at narrow screen widths.</li></ul><h4>Things to Explore</h4><p>In addition to iterating on previous decisions, we added a new goal: using <a href="https://medium.com/@EvanSinar/use-animation-to-supercharge-data-visualization-cd905a882ad4">animation</a> as a source of information. Individual responses are great, but the realization hit that a filtered group’s movement from question to question could be surfaced as well.</p><h3>Plots, Sans Scatter</h3><p>We tried a few options, new and old — revisiting the cutting room floor from 2016 didn’t yield any additional insights. Try as we might, radar charts are pretty much never the answer.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XxIyx8Qx3iqIT8F0Vz5hfQ.png" /><figcaption>Attempting to bin D3 force-directed bars</figcaption></figure><p>Bar charts did the trick (and made it into other portions of the microsite), but lacked some intrigue in showing movement of groups between statements.</p><h4>Binned Beeswarm</h4><p>After a some exploration via CodePen and D3, we landed on a beeswarm-esque visual that bins individuals into a bar for each answer. Benefits include:</p><ul><li>Bar chart-style simplicity in comparing columns.</li><li>The ability to see how filtered demographics compare to the total population (both in proportion <em>and</em> size).</li><li>The means to follow respondents from question to question.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*O5GWlV7bZUed50MdjvKv9A.gif" /></figure><h4>Implementation</h4><p>Putting our choice into production yielded another set of choices. 3,000 data points in motion was just weighty enough to need performance tuning.</p><p>The first build continued with the D3 and SVG stack of 2016. It <em>worked</em>, but switching between questions introduced a lot of <a href="http://jankfree.org/">jank</a>. Paired with the usual headaches in making D3 and React coexist, we scrapped this early.</p><p>Using D3 to handle data joins in memory and output to canvas worked much better… until we tried it manually and saw 4–5x improvements in JavaScript processing time. Since the math was relatively simple, we stuck with the <em>from scratch</em> approach.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1022/1*3Newf4COl1_85E_mscA0Nw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1022/1*nx_wqhvs4M-dMCjApZzGlQ.png" /><figcaption>Take two, manually handling the data and math</figcaption></figure><h3>Lessons</h3><p>As mentioned at the outset, choices in visualization don’t really boil down to right or wrong. The exploration phase serves as an opportunity to figure out which features of your data should be highlighted.</p><p>With a new set of goals in mind, we were able to revisit past decisions around rating scales and shift what held the spotlight.</p><p>The same sorts of tradeoffs are in play during implementation, too—we yielded some extra time to manual positioning math, but it offered a solid performance boost.</p><p>The most important lesson, though, is that it’s really tricky to make decently-sized GIFs for demonstrating moving particles in an article.</p><p>To see it in action, visit <a href="https://thestateoftheology.com/data-explorer">The State of Theology Data Explorer</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=437f68f1e940" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/updating-a-visualization-of-likert-scale-results-437f68f1e940">Updating a Visualization of Likert Scale Results</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Taming Asynchronous UIs with React “Suspense”]]></title>
            <link>https://blog.envylabs.com/taming-asynchronous-uis-with-react-suspense-609d8b20f0e9?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/609d8b20f0e9</guid>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[code]]></category>
            <category><![CDATA[react-suspense]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Matt Schultz]]></dc:creator>
            <pubDate>Thu, 08 Nov 2018 16:18:25 GMT</pubDate>
            <atom:updated>2018-11-08T16:18:25.217Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OdOSLbCK6eR5DqrRyjscew.gif" /></figure><p>In a simpler time, when a website was requested, the server fetched some data and rendered the entire HTML document. If it took a long time to fetch the data, the visitor simply had to wait before seeing anything. As AJAX became more easily accessible with the likes of Prototype and jQuery, fetching data could be deferred until after an initial document was loaded into the browser. Parts of the UI could be delivered very quickly, then the remainder could be loaded in as it became available. With the advent of modern JavaScript frameworks, this pattern is now second nature.</p><h3>The Problem</h3><p>While it’s great that a fast initial page load is now common practice, unfortunately, so is an overabundance of loading indicators. On fast connections, those loading indicators can appear and disappear so quickly that they create a flickering effect in our UI. This isn’t what designers typically have in mind when crafting a user experience, and fine-tuning this behavior can be very complicated. Fortunately, the React team has recognized this problem and is introducing a new API to help us tackle that complexity.</p><h3>Suspense: Deferred Rendering</h3><p>This new API, called Suspense, aims to simplify how we build asynchronous UIs. It gives us the ability to defer the rendering of a component until its data has finished loading, as well as control the behavior of our loading indicators. Before we get started, keep in mind that while Suspense has been merged into master as of May, it is still under active development and will likely change before its official release in React 17. In other words, don’t use this in production.</p><h3><strong>Using Suspense</strong></h3><p>First, import the createCache and createResource functions from the simple-cache-provider package.</p><pre>import { createCache, createResource } from ‘simple-cache-provider’;</pre><p>To create a cache, simply call the createCache function:</p><pre>let cache = createCache();</pre><p>Next, define a resource using createResource, which accepts a function that returns a promise:</p><pre>let PostResource = createResource((id) =&gt; {<br>  return fetch(`http://example.com/posts/${id}`).then(response =&gt; {<br>    return response.json();                        <br>  });<br>});</pre><p>Now that we have our cache and resource, we can create a component that utilizes Suspense:</p><pre>let Post = ({ postId }) =&gt; {<br>  let post = PostResource.read(cache, postId);</pre><pre>  return &lt;h1&gt;{post.title}&lt;/h1&gt;;<br>}</pre><p>And use it like so:</p><pre>&lt;React.Placeholder<br>  delayMs={50}<br>  fallback={&lt;div class=&quot;spinner&quot;&gt;&lt;/div&gt;}<br>&gt;<br>  &lt;Post postId={1} /&gt;<br>&lt;/React.Placeholder&gt;</pre><p>While the API is fairly simple, there’s a bit to digest here, so let’s break it down. When we render our Post component, PostResource.read is called and our cache checks to see if it has data for the provided postId. The first time it checks, however, the cache will be empty, so it <em>throws</em> our promise. React then <em>suspends</em> rendering until that promise is resolved. It seems a little weird, but this is done by utilizing a concept called <a href="https://reactjs.org/docs/error-boundaries.html">error boundaries</a>, which was first introduced in React 16.</p><h4>Placeholders Made Easy</h4><p>You’ll notice we also wrapped our Post component with a React.Placeholder component:</p><pre>&lt;React.Placeholder <br>  delayMs={50} <br>  fallback={&lt;div class=&quot;spinner&quot;&gt;&lt;/div&gt;}<br>&gt;<br>  &lt;Post postId={1} /&gt;<br>&lt;/React.Placeholder&gt;</pre><p>This placeholder component is what ties this all together and makes Suspense so awesome. While React is waiting for our data to be fetched, it renders the fallback specified in our placeholder, which is typically some sort of loading indicator. After the fetch has been completed, it removes the fallback and resumes rendering our Post component. We can even put multiple Suspense-enabled components inside a single placeholder, effectively grouping multiple data fetches in a single loading indicator.</p><h4>Setting a Threshold</h4><p>Last, but not least, you may have noticed the delayMs prop on our placeholder. This specifies the threshold at which our fallback is displayed. In this example, the placeholder will wait 50ms before displaying a loading indicator. This is important because it allows us to forgo that brief, but unnecessary, flicker of our loading indicator when our fetch is effectively instantaneous, but still show one if it takes longer.</p><h3><strong>Final Thoughts</strong></h3><p>While Suspense isn’t quite ready for production, it’s certainly worth getting excited about. It gives us a simple, yet powerful, API for creating asynchronous components that scale to our users’ network and computer speeds, allowing us to provide the optimal user experience with minimal code.</p><p>To try it out yourself, check out Jared Palmer’s <a href="https://github.com/palmerhq/react-suspense-starter">react-suspense-starter</a> project on Github.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=609d8b20f0e9" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/taming-asynchronous-uis-with-react-suspense-609d8b20f0e9">Taming Asynchronous UIs with React “Suspense”</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[We Stopped Marketing the Toolbox]]></title>
            <link>https://blog.envylabs.com/we-stopped-marketing-the-toolbox-ccaab83cd7c7?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/ccaab83cd7c7</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[consulting]]></category>
            <category><![CDATA[positioning]]></category>
            <dc:creator><![CDATA[Nick Walsh]]></dc:creator>
            <pubDate>Thu, 01 Nov 2018 13:11:59 GMT</pubDate>
            <atom:updated>2018-11-01T13:11:58.808Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KlPlLe5G6WrosMrrd1e1dQ.gif" /></figure><p>We’d probably pass on homebuilders whose outreach efforts detailed their favorite hammers. For years, though, new business in software development fixated on tools.</p><p>Nine years ago, Envy Labs opened with a simple position: <em>we’re good at Ruby on Rails</em>. It’d be tough to make that work today, but our early foothold hinged on that position’s subtext: we know how to use the hot technology, and prospective clients know that technology by name. Demand outpaced supply, especially as similar shops opted to walk the acquihire path.</p><p>In the decade that followed, specialized agencies sprung forth to capture the hype of each new framework or development approach. Even as Envy shifted towards other tech stacks, most work came in by way of Rails-based reputation.</p><p>Somewhere along the way, however, project inquiries stopped asking for tools by name.</p><h3>Contributing Factors</h3><p>Though unannounced, the ripple had speed. Résumé-like lists of specific technologies were once gospel for agency portfolios; now, they’re tougher to find, especially amongst smaller shops.</p><p>What changed? The shift has likely been brought on by a combination of (related) causes:</p><ul><li><strong>Narrower tradeoffs.</strong> You may <em>prefer</em> a certain language, or have a better time implementing specific features with a certain framework, but the gaps between options have narrowed. Can anyone objectively say React is <em>better</em> than Vue?</li><li><strong>An ocean of choice.</strong> The number of viable options makes it nearly impossible for <em>anyone</em> to keep up, much less those outside the day-to-day of development.</li><li><strong>A slower march forward.</strong> This could likely fill a post of its own. Whether it’s due to the backing of large companies or a higher base-level complexity of the applications we build, the introduction of <em>new</em> frameworks and languages has seemingly slowed. As the <em>cutting edge</em> dulls a bit, the number of viable options increases.</li><li><strong>In-house talent.</strong> The pervasiveness of software today makes it more common for organizations to employ their own developers. This changes the nature of consulting work: companies look outside when they lack specialization or aren’t sure what they need.</li></ul><h3>Outlook</h3><p>For a time, we had to sell prospects on the benefits of making their application responsive. Later, we had to reassure them that Envy Labs had the ability to make things responsive. Now, it’s an unwritten expectation.</p><p><strong>Results</strong> reign, and they’ve been promoted ahead of technology lists in company portfolios.</p><p>Clients seek a solution to their problem, rather than prescribing their technology of choice — a welcome shift for consultants everywhere. In the absence of preselection, there’s a greater reliance on our ability to recommend and defend the right approach for the problem at hand.</p><p>As the <em>how</em> of software development fades as a differentiator, firms are left to focus on <em>what</em> and <em>who</em> for positioning.</p><p>Envy Labs was fortunate to weather the transition through Code School and a focus on technical training. Since, we’ve further refined that position to focus on helping consultants bring their expertise to web applications.</p><p>Marketing with a tool focus is still in the realm of possibility for niche technologies. If you’re hoping to be known as the best React shop around, though, you’ll be swimming upstream against a lot of competition and clients that may not be familiar with the framework.</p><h3>Caveats</h3><p>There’s been one recurring exception to this discussion in that prospects <em>do</em> bring up React Native regularly. I suspect it’s due to that request’s subtext: we’d really like a cross-platform application quickly.</p><p>There’s also an important discussion to be had regarding maintenance and deployment during project discovery. As consultants, we’re expected to solve the problem <em>and</em> leave software the client is comfortable with.</p><h3>You’re Not What You Eat</h3><p>Differentiation is far from an exact science, but the industry shift has been unmistakable: problem solving (and perspective) is valued more than the ability to swing a certain hammer.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ccaab83cd7c7" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/we-stopped-marketing-the-toolbox-ccaab83cd7c7">We Stopped Marketing the Toolbox</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Rally Recap]]></title>
            <link>https://blog.envylabs.com/react-rally-recap-d0e7cb40116e?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/d0e7cb40116e</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[front-end-development]]></category>
            <dc:creator><![CDATA[Matt Schultz]]></dc:creator>
            <pubDate>Wed, 26 Sep 2018 20:26:50 GMT</pubDate>
            <atom:updated>2018-09-26T20:26:49.850Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*viNi78z3vjr7bwz_pHdVZQ.png" /></figure><p>Last month, I had the privilege of attending <a href="http://www.reactrally.com/">React Rally</a>, a two-day, single-track conference in Salt Lake City. Held annually since 2015, the conference covers a range of topics across the React ecosystem. This year’s conference played host to an excellent lineup of speakers, and while every talk delivered, some really resonated with me.</p><h3>D3 and React: Unlikely Partners in Data Visualization</h3><p>At Envy Labs, we’ve long been proponents of D3, and we’ve used it to create <a href="https://envylabs.com/work/shipyard/">some</a><a href="https://envylabs.com/work/ligonier"> powerful</a> <a href="https://envylabs.com/work/mapmeum/">data</a> <a href="https://envylabs.com/work/explore-data-science/">visualizations</a>. While D3 and React handle completely different use-cases — D3 being a visualization and data manipulation library, and React being a component library — they have one annoying thing in common: they both want control of the DOM. It’s a struggle many developers have dealt with (and<a href="https://blog.envylabs.com/d3-and-react-cant-we-all-just-be-friends-72075ab1d5ee"> written about</a>), so it should come as no surprise that we had a talk on this topic batting leadoff for the conference.</p><p>In her talk, <em>D3 &amp; React</em>, <a href="https://twitter.com/sxywu">Shirley Wu</a> taught us how to leverage the strengths of each library (D3 for math, React for rendering) to work with each other, rather than against, to create some really powerful visualizations with minimal code. Shirley walked us through step-by-step as she outlined her strategy for building D3-powered React components, as well as best practices she discovered along the way. Whether you’re new to D3, or a seasoned user, you’re bound to pick up something new here.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FladXdJ3KKd4%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DladXdJ3KKd4&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FladXdJ3KKd4%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/570a8d2d4b7c77dd1d26cfd6dd65dc73/href">https://medium.com/media/570a8d2d4b7c77dd1d26cfd6dd65dc73/href</a></iframe><h3>Shipped Code &gt; Clean Code</h3><p>As consultants, we have to temper our perfectionist tendencies to meet tight timelines. Yes, the client is able to realize the benefits of a maintainable codebase, but do they really care if you’ve written the JavaScript equivalent of Shakespeare’s <em>Hamlet</em>?</p><p>As we go down the rabbit hole of best practices, optimizations, and perfectly abstracted code, it’s easy to lose sight of what really matters most: <strong>does it work and was it delivered on time?</strong> In his talk, <em>Hot Garbage: Clean Code is Dead</em>, <a href="https://twitter.com/chantastic">Michael Chan</a> gave us the reality check we needed (in a nice way) and reminded us that code is simply a means to an end, not the end itself.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F-NP_upexPFg%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D-NP_upexPFg&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F-NP_upexPFg%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/5bc5bfef882baf8ac92505633af71f6a/href">https://medium.com/media/5bc5bfef882baf8ac92505633af71f6a/href</a></iframe><h3><strong>Life as an Open Source Developer</strong></h3><p>In one of the most impactful talks of the conference, <em>Through the (Open Source) Looking Glass,</em> <a href="https://twitter.com/left_pad">Henry Zhu</a> (of <a href="https://babeljs.io/">Babel</a> notoriety) reflected on the challenges he’s faced since leaving his job and working full-time in open source. Henry detailed the challenges of balancing work with fundraising — and the “catch-22ness” of it all — as well the unrelenting fear of not living up to the community’s expectations.</p><p>This talk resonated with me because I’ve always pictured a career in open source as one of freedom, but the picture Henry painted was anything but. It was a stark reminder that open source is often thankless work.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fh0sfFX7WH1c%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dh0sfFX7WH1c&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fh0sfFX7WH1c%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/433cec0fe99e2bd94216562517f8f8fb/href">https://medium.com/media/433cec0fe99e2bd94216562517f8f8fb/href</a></iframe><h3><strong>Check out the Rest</strong></h3><p>While I’ve detailed a select few, there really wasn’t a bad talk at the conference, and I highly recommend watching them all on the<a href="https://www.youtube.com/channel/UCXBhQ05nu3L1abBUGeQ0ahw"> React Rally YouTube channel</a>. And whatever you do, don’t miss <a href="https://twitter.com/eveporcello">Eve Porcello’s</a> <a href="https://www.youtube.com/watch?v=F_M8v6MK0Sc"><em>Everything You Need to Know About GraphQL in 3 Components</em></a>. It’s probably the most hilarious introduction to GraphQL you will ever see.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d0e7cb40116e" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/react-rally-recap-d0e7cb40116e">React Rally Recap</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Starting a Career in Web Development]]></title>
            <link>https://blog.envylabs.com/starting-a-career-in-web-development-c03c972195ca?source=rss----c0af7b3d4c8c---4</link>
            <guid isPermaLink="false">https://medium.com/p/c03c972195ca</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[web-design]]></category>
            <category><![CDATA[job-hunting]]></category>
            <category><![CDATA[learning-to-code]]></category>
            <dc:creator><![CDATA[Ben Stankich]]></dc:creator>
            <pubDate>Tue, 04 Sep 2018 18:27:08 GMT</pubDate>
            <atom:updated>2018-09-04T18:27:07.707Z</atom:updated>
            <content:encoded><![CDATA[<h4>A Map from a Recent Traveler</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BeOy9byOedLw-trOQpMwVA.png" /></figure><p>Entering the web industry can feel daunting. There’s a lot to consider: What’s the best way to learn the skills I need to know? How can I prove those skills to the world? Do I need to go to college? How do I separate myself from other applicants to companies I want to work at?</p><p>For the past several years, I had been asking these same questions. What started as a young teenager’s hobby turned into a quest to make websites as a career. Six months in to my role at Envy Labs, I’m revisiting decisions I made and advice I received that helped lead me here.</p><h3>Welcome to the party</h3><p>As a young industry with diverse roles, it’s hard to find two people with matching journeys to their professional gig. Even age is no clear indicator of in-field experience, as jumping into the web business has become a popular mid-career switch. And while generalists are still in need, growth and increased complexity have continued to create new roles for specialization.</p><p>Our field is growing, outpacing projected nationwide growth in new jobs with an estimated <a href="https://www.bls.gov/ooh/computer-and-information-technology/web-developers.htm">15% increase in web development jobs</a> over 10 years. If you’ve just started exploring the industry, you’re not too late; we’re just getting started.</p><h4>You don’t need a college degree</h4><p>Don’t take my word for it. Even tech heavyweights like Google, Apple, and IBM <a href="https://www.glassdoor.com/blog/no-degree-required/">no longer require employees to have a degree</a>. Many smaller software companies have been this way for years: they care more about the skills you have than where you learned them. It’s an increasingly large talent pool: 24% of professional developers who took Stack Overflow’s 2018 survey said that they <a href="https://insights.stackoverflow.com/survey/2018#developer-profile-educational-attainment">don’t have a college degree</a>.</p><p>Colleges have long struggled to teach up-to-date practices in web design and development. Their curriculum approval process simply can’t keep up with the rate of change. If you’re researching a program to attend, the best focus on technology-independent principles, but use current and upcoming approaches to teach it.</p><p>Ours is probably the most open industry in terms of the number and availability of learning options. There are countless quality learning platforms to learn coding and design that are either free or radically cheaper than a “formal” education. For me, studying Computer Science was interesting and helpful, but these learning sites are where I really learned the fundamentals and practical skills for web development.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vvCpqCVr8CHODPwh3gGD5A.png" /><figcaption>These are a few of my favorite things</figcaption></figure><p><a href="https://css-tricks.com/">CSS-Tricks</a> was (and still is) an invaluable resource for all things web development, not just CSS. <a href="https://www.codecademy.com/">Codecademy</a> gave me a great introduction into JavaScript. <a href="https://alistapart.com/">A List Apart</a>’s great long-form articles introduced me to new key topics like responsive design. Even <a href="https://www.w3schools.com/">w3schools.com</a> was a good starting place back in the day.</p><p>Though degree requirements are fading from job postings, college remains a valid option; it can be a great place for directed learning, community, personal growth, and exposure to other interesting subjects. Those leaning towards the technically-heavy or visual sides of web development may especially benefit from a degree. College is still worth consideration, but doesn’t have to be the default choice anymore.</p><h4>Bootcamps</h4><p>Bootcamps have recently become popular as an alternative to traditional four-year colleges. These programs tend to hone in on specific disciplines within design and web development, and generally take place over a few months. By focusing heavily on current skills, they—in theory—condense base learning time significantly and reduce costs from a traditional college route.</p><p>Because they aim to replace a degree, they also cost a big chunk of change (<a href="https://www.coursereport.com/coding-bootcamp-ultimate-guide">$11,450 on average</a>); so you’ll want to find the track best suited to you before diving in. No matter the quality, high tuition bills for a few months of training can be a hard sell. This has caused many unprofitable bootcamps to <a href="http://hackeducation.com/2017/07/22/bootcamp-bust">shut down</a>, leaving larger brands that have figured out the business model, as well as college-affiliated bootcamps.</p><p>I’ve heard mixed reviews on bootcamps — some say they are a great shortcut, others posit that they don’t do enough to prepare you for jobs. Ultimately it’s up to the bootcamp you choose and how much you supplement your learning with real-world experience. Do your due diligence and ask around to make sure the one you’re considering is a good choice.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5rInJLQQ6z6mX3Zev8Eq-g.png" /></figure><h3>Get cozy with self-directed learning</h3><p>A web that is constantly evolving will always hold something new to learn. So whether you choose to go to college, a bootcamp, or turn to the web for learning opportunities, acquiring the ability to learn on your own will be a necessary part of your career.</p><p>Good design and development principles stay the same, but learning the best way to implement those principles with current tools and technologies are a huge part of the job. Thankfully, the web excels at making this process open. With a <a href="https://learntocodewith.me/posts/code-for-free/">plethora of options</a> for learning everything from fundamentals to advanced topics, there’s something for every skill and skill-level.</p><p>Though online courses are often very inexpensive (if not free), they often put out some of the best curriculum. It’s one of those rare cases where you get much more than you pay for. They also tend to add new content at a faster pace than in-person courses, so you’re likely to find more up-to-date topics.</p><h4>Meetups and online communities</h4><p>Wouldn’t it be nice if you could gain access to a group of people who do the type of work that you want to be doing, meet up regularly to discuss their work, happily answer questions, and offer advice? Enter the hugely beneficial meetup. Each month, there are likely <a href="https://www.meetup.com/topics/web-development/">many of these</a> going on in a reasonably-sized city near you. (If there aren’t, you should start one!).</p><p>In addition to the talks given, it’s the exploration of ideas and connecting with peers that makes meetups really valuable for someone starting out. They are also low commitment (usually free and just one night a month) and can be incredibly beneficial if you’re intentional with your conversations.</p><p>Dev/design communities don’t just meet monthly in their city — they meet daily on the Internet. There are tons of online spaces where industry workers congregate to have discussions. Join those communities, listen to the conversations and ideas being shared, and start contributing.</p><p><a href="https://codepen.io/">CodePen</a> and <a href="https://dribbble.com/">Dribbble</a> are great places to find inspiration. Here on Medium you’re bound to find case studies, walkthroughs on interesting experiments, and articles on bleeding edge topics. There are question-oriented communities like<a href="https://askplaybook.com/"> Playbook</a> and <a href="https://stackoverflow.com/">Stack Overflow</a> that allow you to read answers to common questions or ask new ones. Even Twitter is a good platform to follow and pose questions to professionals.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xH5sp-kb_1h0wdEG8gPe3g.png" /><figcaption>A few of the many great podcasts out there: <a href="https://www.heavybit.com/library/podcasts/jamstack-radio/">[1]</a>, <a href="https://spec.fm/podcasts/developer-tea">[2]</a>, <a href="http://shoptalkshow.com/">[3]</a>, <a href="https://blog.codepen.io/radio/">[4]</a>, <a href="https://responsivewebdesign.com/podcast/">[5]</a></figcaption></figure><p>Podcasts are another great medium to dive deeper into topics that you’ll want to know more about. They let you listen in on expert conversations and gain clarity on topics at a more foundational level. Pair it with your commute or some other time you’re away from screens and they can be a really useful time to learn without distractions.</p><h3>Build experience by…building things</h3><p>There’s a lot of learning that comes only through doing, which is convenient because building experience through real-world projects turns out to be pretty necessary. You can’t waltz in to a job interview claiming to know X, Y, and Z without the work to show it. Just <em>knowing</em> the fundamentals doesn’t cut it — so what does?</p><p>As <a href="https://twitter.com/chriscoyier">Chris Coyier</a> of <a href="https://css-tricks.com/">CSS-Tricks</a> famously says: “Just build websites.” There really is no better way to get good at web design/development. Building something real gives you the opportunity to put what you’ve learned to use, pick up new concepts, and seek out creative solutions on the fly.</p><p>Don’t know what to build? Take a look at your passions and interests — there’s bound to be a few crappy websites in that area that could use a redesign. Some groups are notorious for having bad websites. Find a niche that’s neglected and get building! Here are some ideas:</p><ul><li>School clubs, local interest groups, meetups</li><li>Local businesses</li><li>Religious organizations</li><li>Family and friends who want to blog, sell goods online, etc.</li><li>Weddings</li><li>Open source projects</li></ul><p>Don’t be afraid to create your own opportunities. If you have a hobby or unique interest, make a neat site around it! In my early days, I made custom sites for blogs, a single-page site showcasing playlists, my brother’s wedding, many portfolio iterations, and countless random experiments that never saw the light of day (<em>I’ll finish you someday, Star Wars fan-site</em>).</p><p>You don’t need to do crazy promotion for these sites; throw them onto your portfolio or share them around your design community. When you’re using a site to practice skills or learn something new, the content isn’t all that important. The point is to gain experience by making something.</p><h4>A note on getting paid</h4><p>There’s often a gray time period in learning to build websites when you start to wonder if you should get paid for the work you do. Don’t get too caught up on this. If your ultimate goal is to land an internship, apprenticeship, or job (you need to work, right?), then it doesn’t hurt to volunteer your skills in order to gain experience on real projects.</p><p>If it’s, say, your third project for someone else, you can think about charging. But your first project outside the classroom? Maybe not. Opt for a project that’s <strong>small in scope</strong>; don’t undertake something you don’t have the time, desire, or ability to see through. Other good fits are projects that you can <strong>self-direct</strong>. Having lots of freedom with a site gives you the opportunity to try something new instead of feeling the burden not to fail.</p><h4>Internships</h4><p>Self-directed projects are a great way to gain experience and stand out from others, especially as you look to get hired. Another valuable asset (perhaps the next step) is an internship. If you’re in college, you’ll have a lot of encouragement to do an internship, but companies aren’t interested solely in students.</p><p>Each story I’ve heard is different, but the biggest indicator of a good internship experience is not the position itself, but the company offering it. When applying, do a bit a research to see how they operate and see if you can find other interns at the organization to hear their take. Additionally, companies should be paying you at this stage, so don’t trust unpaid internships (these might actually be illegal unless they meet some <a href="https://www.dol.gov/whd/regs/compliance/whdfs71.htm">narrow criteria</a>).</p><h4>Apprenticeships</h4><p>Apprenticeships harken back (all the way to the Middle Ages) to a once-common approach where a professional in a particular discipline would closely train a young person in his or her craft. Today, <a href="https://apprentice.at/">apprenticeships in web development</a> are paid on-the-job training that all but guarantees you a job at that company if it goes well. As such, these are much harder to get into than a traditional internship, but the return is much higher.</p><p>Another great benefit of an apprenticeship is that you know you’ll be getting good experience (whereas internships can be a toss-up), yet you’re still not expected to know everything coming in. Plus, you get to contribute to real work on a real team, all-the-while experiencing the company’s culture before you start on a more permanent basis.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SUX2TPbekVT9n2vREJ8Zgg.png" /></figure><h3>Show initiative in your job hunt</h3><p>Preparing for your first job is a journey that begins well before you start applying. Having the end in mind will help you be effective in your work and show others you’re serious when the time comes. Whether <a href="https://blog.envylabs.com/applying-to-a-small-digital-agency-edd52ffce1b0">applying to a small digital agency</a>, a Silicon Valley software giant, or a technical position in another industry, you can make a big impact by following a few tips.</p><p><strong>Make a better portfolio.</strong> You need to make it incredibly easy for reviewers to see your work and your process behind it. Writing short case studies is a great way to make your portfolio more compelling to those initiated with the project. They want to hear the story behind the work and see the design/software decisions you had to make. Don’t just show the final product, show how you got to there.</p><p><strong>Regularly attend local meetups</strong> and make your intentions known. If you’re looking for a job, say so. If you’re trying to get into a certain subfield or new interest, mention as much. Be obvious about the things you’re pursuing so people will know and keep you in mind as they hear of new opportunities. Local communities are probably the best way to create connections that lead to you getting hired.</p><p><strong>Reach out</strong> to companies you like. Even before I was formally looking to get hired, I sent emails to about ten different companies and heard back from a few I really admired. Ask to tour their office or to meet someone on their team with a role similar to what you want to be doing. Most people love meeting newcomers to the industry and offering up guidance.</p><p>You can even throw out the idea of doing an internship or apprenticeship with them. They may say “no” or “not right now,” but showing initiative could spark helpful conversations and make you a contender for future hiring. Ask them to look at your portfolio and give you feedback on steps you can take to make it where you want to be.</p><h3>Walking the Road</h3><p>Hopefully this post has shown a light on the various paths towards a career making websites. Everyone’s journey looks a little different — and if I’ve learned anything, it’s to be yourself as your work your way there. And when you do reach your goals, pass on what you’ve learned to people who are just starting theirs.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c03c972195ca" width="1" height="1" alt=""><hr><p><a href="https://blog.envylabs.com/starting-a-career-in-web-development-c03c972195ca">Starting a Career in Web Development</a> was originally published in <a href="https://blog.envylabs.com">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>