<?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[Stories by Drew Powers on Medium]]></title>
        <description><![CDATA[Stories by Drew Powers on Medium]]></description>
        <link>https://medium.com/@drew_powers?source=rss-1c7ae9d3f01------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*B6kO9OAsPD2W_iWH.jpeg</url>
            <title>Stories by Drew Powers on Medium</title>
            <link>https://medium.com/@drew_powers?source=rss-1c7ae9d3f01------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 02:47:51 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@drew_powers/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[CSS Puzzles: a mentorship program for better styling]]></title>
            <link>https://medium.com/manifoldco/css-puzzles-a-mentorship-program-for-better-styling-d018e77de57c?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/d018e77de57c</guid>
            <category><![CDATA[css]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[mentorship]]></category>
            <category><![CDATA[startup]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Thu, 17 Jan 2019 13:31:26 GMT</pubDate>
            <atom:updated>2019-01-18T17:14:05.304Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-cp1cPUZacPMjnz_wViZCA.png" /></figure><h4>How a 12-week program resulted in open-source education</h4><p>Manifold’s internal mentorship program provides opportunities for coworkers to learn from one another over a three month period. The relationship doesn’t imply relative seniority between the mentor and mentee, but simply a desire to share and learn. We do this to foster continuous growth and to stay committed to our goal to raise up all employees to a senior-level regardless of where they started. But above all, it’s a way for us to connect with one another outside of pure work assignments.</p><p>For the summer 2018 session, <a href="https://medium.com/u/86162d52f41c">Nicole Tibaldi</a> and I paired up to dive into the finer points of CSS. We ended up splitting our time into a 2-track process: homework assignments to learn the concepts, and work projects for Nicole to apply the knowledge.</p><h3>CSS Puzzles</h3><p>It’s hard to identify difficult problems in CSS until you’re forced to recreate a design that—for some special reason—is just hard to pull off. Oftentimes the final result is subpar, merely because there was another clever approach that you didn’t know was an option. Thinking back to all the CSS I’ve written over the last 13 years or so, I tried to dig up some of the hardest problems I’ve encountered and extract an isolated example for each.</p><p>For each of the following exercises, you can find the code here: <a href="https://github.com/dangodev/css-exercises">https://github.com/dangodev/css-exercises</a></p><h4>Exercise 1: Markup &amp; Grid</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wxKx1cTeB3QmRDfkj4kWcQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JYa8E1OGCaJjVxU0n9OkmQ.png" /><figcaption>Exercise 1 screenshots</figcaption></figure><p>Sometimes you can control markup; sometimes you can’t. Exercise 1 forces you to use CSS Grid to realize you can rearrange and re-set layout without touching markup.</p><h4>Exercise 2: perfect design, imperfect content</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LjyDkKRWDOlVlFCujIM8Zg.png" /><figcaption>Exercise 2 screenshot</figcaption></figure><p>We’ve all gotten a design with a perfect layout… that only fits a very specific content length. This exercise is all about dealing with missing content, and different lengths, as elegantly as possible.</p><h4>Exercise 3: interactive CSS</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/880/1*qfyJOYAQbWd7yWGWDHeywQ.gif" /><figcaption>Exercise 3 screenshot</figcaption></figure><p>Bug, or feature? This exercise forces the user to abuse CSS to create interactivity most would only think is possible with JavaScript. Even though this may not be best practices, understanding what’s possible with CSS is the goal.</p><h4>Exercise 4: perceived performance</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*g4g6f8OloSMgiA2AIVAZpg.png" /><figcaption>Exercise 4 screenshot</figcaption></figure><p>This exercise forces you to load large assets over a slow connection, and figure out how HTML &amp; CSS can solve slow-loading fonts and images (hint: <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display">font-display</a> and fixing image heights can smooth the experience).</p><h4>Exercise 5: layering</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yZhouPp49G-CxIvMy0DdsQ.png" /><figcaption>Exercise 5 screenshot</figcaption></figure><p>Exercise 5 explores the nature of browser layering, and how to fix the “unexpected” scenario of layering by DOM order (in the photo above, notice how the blue glow tucks under the card to the right). Once you’ve figured out the layering part, you’ll have to figure out how to apply that to animations!</p><h4>Exercise 6: nth child selectors</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tg8wSBbrr2EwhOuhHbtptQ.gif" /><figcaption>Exercise 6 screenshot</figcaption></figure><p>Nth-child and sibling selectors in CSS are a classic examples of not using them because you don’t know they’re an option. They can be powerful tools in managing styling when used effectively.</p><h4>Exercise 7: CSS animation</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/760/1*mx1La0Fq2u5LjN5_3cY0RQ.gif" /><figcaption>Exercise 7 screenshot</figcaption></figure><p>This is where things start to get fun, and we add interactivity, animation, and 3D perspective with only a few lines of CSS</p><h4>Exercise 8: ratio resizing</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*qPtaYeYquIBQgeQRPi_AQw.gif" /></figure><p>There are many times where ratios need to be locked in, especially when media is present or design demands it. This exercise explores how to lock in ratios to responsive layout using only a sprinkle of CSS.</p><h3>Nicole’s projects</h3><p>After a few months of mentorship and working on projects together, Nicole threw the following together:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*C8A1SEhvVOy7P1d_kHjBWA.gif" /><figcaption>Cube animation by <a href="https://medium.com/u/86162d52f41c">Nicole Tibaldi</a></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*87X9pySpujY9lkAEs9rL4g.gif" /><figcaption><a href="https://www.manifold.co/pricing">SVG pricing animation</a> by <a href="https://medium.com/u/86162d52f41c">Nicole Tibaldi</a>, design by <a href="https://medium.com/u/5a7755145e53">Meg Smith</a></figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*P2rpH1MpUGcmkd3T-krokA.gif" /><figcaption>Manifold invoices concept by <a href="https://medium.com/u/86162d52f41c">Nicole Tibaldi</a> and me</figcaption></figure><p>Together we tackled CSS &amp; SVG animations, and even got into interactive dataviz with D3.js (which was a <em>little</em> sidetrack outside of styling, but who can say no to dataviz?).</p><h3>How to set up your own mentorship program</h3><p>Most would say mentorship is important for their own growth as well as their company’s, but few feel equipped to start it themselves. Here at Manifold we’ve found the following small steps help equip even hesitant mentors:</p><ol><li><strong>Set an end date, and meeting times</strong>. Set boundaries. Determine a duration of weeks (ideally 8–12 weeks) to run the program, and determine hourly commitment for the mentor and mentee each week. Set a regular meeting to stay on track. Be mindful of both mentor’s and mentee’s time and don’t overcommit!</li><li><strong>Ask the mentee to set goals.</strong> Ask the mentee what they would like to learn by the end of the program. The mentor should help with this. Aim for a real challenge that pushes comfort zones without being unrealistic. Shoot for ~90% of goals met—you set a real challenge that pushes limits but the mentee doesn’t feel like they’ve mostly failed.</li><li><strong>Check in each week on those goals</strong>. The mentor should constantly level-set, and make sure the mentee feels like they’re getting closer. Be wary of goal-shifting! As the mentee gains experience, minor details and focus may shift, but you should still stay roughly within the original parameters set.</li><li><strong>At the end, ask for improvement</strong>. After the program is over, get a third party to ask both the mentor and mentee how the program went. Was it too much work? Not enough? Did the mentee feel they leveled up? Was the mentor overworked? How was communication? Every organization has different dynamics, so running a “trial” mentorship program and gathering data will set up subsequent runs for success.</li></ol><p>How would your org benefit from such a program? How was ours? Please leave a comment with your thoughts &amp; experience with mentorship programs.</p><p>And if you’re looking to level up yourself on our team, <a href="http://manifold.co/careers">we’re also hiring</a>!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d018e77de57c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/manifoldco/css-puzzles-a-mentorship-program-for-better-styling-d018e77de57c">CSS Puzzles: a mentorship program for better styling</a> was originally published in <a href="https://medium.com/manifoldco">manifoldco</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Secure runtime variables in IronWorker with Manifold]]></title>
            <link>https://medium.com/manifoldco/secure-runtime-variables-in-ironworker-with-manifold-61a2cbc99753?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/61a2cbc99753</guid>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[cloud]]></category>
            <category><![CDATA[ironworkers]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Tue, 10 Jul 2018 17:01:17 GMT</pubDate>
            <atom:updated>2018-12-03T19:31:02.984Z</atom:updated>
            <content:encoded><![CDATA[<h4>Docker secrets with minimal code &amp; configuration</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2BCrhl0gjpHVeGYGOKROmg.png" /><figcaption>IronWorker visualization by <a href="https://medium.com/u/5a7755145e53">Meg Smith</a></figcaption></figure><p><a href="https://www.iron.io/worker">IronWorker</a> is a containerized background job manager that gives you incredibly fast, super-scalable architecture with almost no code. Because it handles tasks asynchronously, any web app can offload heavy lifting such as slow database operations or large data processing to IronWorker without slowing down your users’ experience.</p><p>But there’s one problem—if a background worker is talking to all of these services, <em>where do the secrets go?</em> Docker containers are fantastic packages for consistent code runtime, but it’s no place for secrets to live—cached and available to everyone that can access that Docker image.</p><p><a href="https://manifold.co/">Manifold</a> gives you <a href="https://manifold.co/iron">a 2-minute setup to IronWorker</a> (and many other cloud services) — and it can also solve the problem of secrets for you, completely free. As developers ourselves, we built the tools <em>we’d</em> like to exist. We’ve been using this internally for over a year, and think it’s a pretty great solution.</p><p>For extra fun—and to see how secrets work in practice—we’ll hook up IronWorker to another Manifold marketplace service, <a href="https://logdna.com/">LogDNA</a>, to enhance the experience with realtime logs. On IronWorker, you don’t get to view a single log until <em>after</em> a task is finished running (or erring 🙃). So taking advantage of a cloud-based logging service to give you realtime updates is a huge win, especially for large tasks.</p><h4>What can I use IronWorker for?</h4><p>IronWorker is just one piece of the <a href="https://www.iron.io/">Iron.io</a> devops suite of products. Using IronWorker, you can handle several incoming tasks at once from multiple sources, sort the queue by priority, and monitor the status of all of those concurrent tasks.</p><p>It takes care of big, slow, heavy stuff.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*ToDYSlX_9Rg1IW8GHBLUFA.gif" /><figcaption>IronWorker is basically like that “<em>I Love Lucy“ scene, but if Lucy operated at 100% efficiency at top conveyor belt speed and didn’t eat any chocolates</em></figcaption></figure><p>Iron.io’s post <a href="https://blog.iron.io/top-10-uses-of-ironworker/"><em>Top 10 Uses of a Worker System</em></a> explains why workers are simply <em>better</em> for heavy tasks like image processing, transactional emails, and data sifting. Give it a read to, as the author put it: “Change the way you think and program.”</p><h3>Setup</h3><p>You’ll need a few things to set up for this blog post:</p><ol><li>Sign up for an <a href="https://dashboard.manifold.co/register">account on Manifold</a> (it’s secure, free, and you can cancel at any time).</li><li>Install the <a href="https://docs.manifold.co/docs/install-77T6auwaaIQcgA4QGouO0">Manifold CLI</a>, and log in with manifold login</li><li>Install the <a href="http://dev.iron.io/worker/cli/">Iron.io CLI</a> (Manifold will log in for us!)</li><li>Install <a href="https://docs.docker.com/install/">Docker</a>, create a <a href="https://hub.docker.com/">Docker ID</a> if you haven’t already, and log in with docker login</li></ol><h3>1. Provisioning LogDNA and IronWorker</h3><p>From your Manifold account, create <a href="https://dashboard.manifold.co/projects/create">a new project</a>. We’ll call it <strong>iron-example</strong> in our post, but name it any kebab-case name you’d like!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/873/1*lIS7UwI9STjAHIJ6DwRylQ.png" /><figcaption>Creating a new project in Manifold</figcaption></figure><p>From there, provision <strong>LogDNA </strong>and <strong>IronWorker</strong> plans to the project.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/914/1*sthOlMScOxe391X7_ZqVtQ.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wk107m2jbYgnB6btuaUMQg.png" /><figcaption>Discover and manage cloud services in the Manifold Dashboard, most of which have free plans.</figcaption></figure><h4>Already have an existing IronWorker or LogDNA plan?</h4><p>If possible, we’d recommend signing up through our Dashboard to take advantage of single sign-on and aggregated billing, but you can still power your pre-Manifold account with our integrations.</p><p>To integrate your existing accounts, click the “Bring your own service” button and entering your credentials: IRON_TOKEN and IRON_WORKER_PROJECT_ID for IronWorker; KEY for LogDNA.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cEAzC0wHf3fYjIeS7_D1Cw.png" /><figcaption>Select “Bring your own service” when creating a new resource</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*w3GeZQ8Z93sPac1YYiVylA.png" /><figcaption>Enter your creds to your service here. You can control access to these if you create a Team, and make a Team project!</figcaption></figure><h4>Signing into LogDNA</h4><p>Back in our project, we can now see the new LogDNA and IronWorker services present. Click <strong>Open LogDNA Dashboard</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/959/1*u_ubWDKbtT5HDpKan7XDsA.png" /><figcaption>Hovering over LogDNA in our project shows us a one-click Dashboard sign-in button</figcaption></figure><p>With Manifold’s single sign-on we get to skip signup and go straight to our project’s LogDNA dashboard. Click the <strong>Everything</strong> tab to see our app’s logs.</p><p>It’s empty for now, but we’ll come back to this screen in just a moment to see our logs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/993/1*EruusW_4ypgQfwk_z4yPxw.png" /></figure><h3>2. Uniting the workers on Iron.io</h3><h4>Building a worker in Node.js</h4><p>Now that we have LogDNA and IronWorker accounts managed in Manifold, let’s get some worker code up.</p><p>We’re starting with a bare-bones <a href="https://github.com/manifoldco/iron-example-app">example Node.js app</a> that’s already configured for Manifold + IronWorker. To view this code locally, run the following in a terminal window:</p><pre>git clone git@github.com:manifoldco/iron-example-app.git<br>cd iron-example-app<br>npm i</pre><p>This is our entire app, minus config:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2d134bb926e6ee3700d6157baadf4059/href">https://medium.com/media/2d134bb926e6ee3700d6157baadf4059/href</a></iframe><p>So our app…</p><ol><li>…authenticates with LogDNA using Manifold CLI’s injected KEY</li><li>…doesn’t authenticate with IronWorker because that’s where our code will be running</li><li>…logs some simple text first,</li><li>…followed by our IronWorker payload with IronWorker.params() (we’ll get back to that)</li><li>…and a final log showing us the job’s complete.</li></ol><h4>🐳 Containerizing with Docker</h4><p>IronWorker runs off <a href="https://hub.docker.com/">Docker Hub</a>, which is great news for the many dev teams already using it. And if you’re new to containerization, Manifold can help make adoption relatively painless.</p><p>Our <a href="https://github.com/manifoldco/iron-example-app/blob/master/Dockerfile">app uses a custom </a><a href="https://github.com/manifoldco/iron-example-app/blob/master/Dockerfile">Dockerfile</a> (first letter uppercase, no extension) in the root folder of our application, configured for Manifold CLI within IronWorker.</p><p>Assuming Docker is running, and we’re logged in with docker login, we’ll build a new Docker container and <strong>tag</strong> with -t. You can think of tags like versions of your code, so every time you make a change, you should give it a new tag. A common format is DOCKER_USERNAME/APP_NAME:VERSION (e.g.: manifold/iron-example:0.0.1). In the following examples, replace USERNAME with your Docker username. After it’s built, we’ll send it to Docker Hub.</p><pre>docker build -t USERNAME/iron-example:0.0.1<br>docker push USERNAME/iron-example:0.0.1</pre><p>💁 <em>Tip: testing stuff, or pushing an unstable version? Append </em><em>-rc.0, </em><em>-rc.1, etc. to the end of your tag to keep your versions clean.</em></p><h4>🏋️‍ Pushing to Iron.io</h4><p>We’re letting Manifold handle our credentials, but IronWorker will need to authenticate into Manifold to pull secrets. Rather than give out our Manifold email &amp; password—<em>that’s not secure!</em>—we can create a special token just for this worker with <strong>read-credentials</strong> permissions just for this case:</p><pre>manifold tokens create</pre><p><strong>Keep it secret, keep it safe!</strong> You won’t be able to retrieve this later. But you can generate a new token, or deprecate an old token at any time with manifold tokens --help.</p><p>With that token, we can use Manifold to inject the IRON_TOKEN and IRON_PROJECT_ID secrets as runtime variables. To alert Iron.io to our image on Docker hub, run the following:</p><pre>manifold run -p iron-example -- iron register -e &quot;MANIFOLD_API_TOKEN=MY_MANIFOLD_TOKEN&quot; USERNAME/iron-example:0.0.1</pre><p>This is using manifold run to inject variables attached to our <strong>iron-example</strong> project (-p). It’s running the iron register command, injecting a single runtime variable (-e): our Manifold token from the previous step. Our final argument is the tag of the image we just pushed to Docker Hub.</p><p><em>Note: to improve security and performance, Manifold isn’t a proxy; it only injects the secrets. Your app connects directly to all these services with no middleman.</em></p><h4>Checking our work</h4><p>If we go back to our <strong>iron-project</strong> in the Manifold Dashboard, we can click the <strong>Open IronWorker Dashboard</strong> button to see our Dashboard:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/880/1*zjREoiSus9K6Sqmd-gZ_6g.png" /><figcaption>Sign into IronWorker straight from Manifold</figcaption></figure><p>Once signed in, we should see our Docker image on the home screen:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2I5szNnGMKqlqJcensGCrA.png" /><figcaption>Iron.io dashboard</figcaption></figure><p>🎉 Woo! 🎉 Iron.io is now running our worker code, ready to be assigned tasks.</p><h4>Recap for deployment</h4><p>Say we make a change in our app, and need to update IronWorker to USERNAME/iron-example:0.0.2. Here’s a recap of what to do:</p><pre>docker build -t USERNAME/iron-example:0.0.2 .<br>docker push USERNAME/iron-example:0.0.2<br>manifold run -- iron register -e &quot;MANIFOLD_API_TOKEN=MY_MANIFOLD_TOKEN&quot; USERNAME/iron-example:0.0.2</pre><ol><li>Re-build with docker build</li><li>Push to Docker Hub with docker push</li><li>Tell Iron.io about the new Docker Hub image with iron register (with manifold run logging in for us)</li></ol><p>You can add a deploy NPM Script in package.json to automate this, and save a little typing:</p><pre>TAG=&quot;USERNAME/iron-example:0.0.2&quot; MANIFOLD_TOKEN=&quot;MY_TOKEN&quot; npm run deploy</pre><p>This is what the script looks like in our <a href="http://(already present in our example, actually!):">package.json</a> (we’re also using <a href="https://docs.manifold.co/docs/config-38vPGWk1N6egqMwKEwcCAi">a </a><a href="https://docs.manifold.co/docs/config-38vPGWk1N6egqMwKEwcCAi">.manifold.yml file</a> to set the project &amp; team):</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/642f17f77464c0116958cb415aed83f5/href">https://medium.com/media/642f17f77464c0116958cb415aed83f5/href</a></iframe><p><em>Note: this was the shortest amount of typing I could think of without committing a sensitive secret to version control. If you can think of an even shorter way to run this, leave a comment!</em></p><h3>3. Queueing for everyone</h3><p>Now comes the good part: actually seeing our app run. Sign in to your LogDNA dashboard again from your Manifold project, and navigate to <strong>Everything</strong>. Also sign into your IronWorker dashboard, and click on the name of your image.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0KQVobBBXbEX8dvJVtirYA.png" /><figcaption>Clicking on an image in IronWorker shows you all your tasks, along with the version that ran them, logs, and other pertinent data.</figcaption></figure><p>You’ll see a screen that shows you all your queued tasks, and which tasks ran successfully and which erred (green and red in the screenshot). This will be blank if you haven’t queued any. From that screen, click the <strong>Queue Task</strong> button to test our code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-FjePu0EntAvfkSKYF2vjQ.png" /><figcaption>IronWorker’s Queue Task screen</figcaption></figure><p>For now, all you need to fill out is <strong>Payload</strong>, in JSON format. For our example, we’ll feed it the time-honored, classic dish:</p><pre>{<br>  &quot;foo&quot;: &quot;bar&quot;<br>}</pre><p>Click <strong>Queue Task</strong> and you’ll see it run. Now, if everything worked as intended, pop over to LogDNA to see:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bUzT-Ad3AN3Dotu19KI6xw.png" /></figure><p>We see the thing we typed! That’s a very good sign!</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FRrVzUOXldFe8M%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FRrVzUOXldFe8M%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2FRrVzUOXldFe8M%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="326" frameborder="0" scrolling="no"><a href="https://medium.com/media/c5ee627c67ff4ec3e4e0d897500ee961/href">https://medium.com/media/c5ee627c67ff4ec3e4e0d897500ee961/href</a></iframe><p>Our app now takes the payload received from IronWorker through IronWorker.params(), and logs it to LogDNA. This means that your code can be dynamic, accepting a wide range of inputs and tasks based on the data it’s given. IronWorker.params() will be your entrypoint to any kind of data needed for your super special task.</p><p>Your worker is basically now an endpoint, ready for any task large or small. The secure connections are handled thanks to Manifold, and the parallelism is handled for you thanks to Iron. ✨</p><h3>Next Steps</h3><p>Running tasks manually gets old real quick, especially because we’re developers and will automate anything we have to do three times 😎. Now that we have a worker with running code and able to handle payloads, we’re getting into serious territory. I’ll end the post here, showing how to schedule tasks from the IronWorker dashboard, as well as programmatically from another application.</p><h4>Scheduling Tasks from within IronWorker</h4><p>IronWorker has a handy dashboard to create and manage scheduled tasks just one tab away! Click <strong>scheduled tasks in </strong>the navigation, followed by the <strong>Schedule Task</strong> in the top-right to be met with a familiar screen:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Hj9ucUDM9OAzNzRTEmZfrQ.png" /><figcaption>IronWorker’s real power is in its scheduling</figcaption></figure><p>Here, we can also take a payload as with the manual task, but now we can schedule automatically recurring tasks, like a cron job on a server but with no server or cron jobs to manage.</p><p>If your app can run automatically, such as a newsletter or scraper, this is probably the best place to manage that schedule.</p><h4>Queueing tasks from outside of IronWorker</h4><p>Scheduled tasks are great, but most cases will usually involve some other application that needs to queue a job to our worker. Fortunately, the iron_worker NPM module we were using also comes with a .Client() built in:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e561c557853cd80e57a0114af851c843/href">https://medium.com/media/e561c557853cd80e57a0114af851c843/href</a></iframe><p><em>Note: remember we didn’t have to authenticate for our worker running on IronWorker, but we will have to for outside apps.</em></p><p>So for any large, arduous, async job, we can simply kick it to IronWorker from any app, and go about our business. In case your stack isn’t in Node.js, fret not: IronWorker client has first-class support for Golang, Ruby, Java, PHP, Python, and .NET too!</p><p>We can’t <strong>schedule</strong> from outside our app, because ideally scheduling should be self-managing! To recap: you can <strong>schedule</strong> from the IronWorker CLI or the Dashboard, or you can <strong>queue</strong> from anywhere using the IronWorker client. Consider a different approach if you’re trying to schedule a repeat event programatically.</p><p>To learn more about queueing, see the <a href="http://dev.iron.io/worker/libraries/">docs on IronWorker client</a>.</p><p>From here, <em>the sky’s the limit!</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/498/1*DbcxApmoaW_m2TR9c1Z15Q.gif" /><figcaption>Just keep on pressin’ on</figcaption></figure><h4>Further Reading</h4><ul><li><a href="https://medium.com/@rbnpercy/d20d91676463">Building a Scheduled Newsletter in Ruby with IronWorker and Mailgun</a> by Robin Percy</li><li><a href="https://blog.iron.io/top-10-uses-of-ironworker/">Top 10 uses of IronWorker</a> by Dylan Starnat</li><li><a href="http://dev.iron.io/worker/webhooks/">IronWorker webhooks</a> on the Iron.io docs</li><li><a href="https://blog.manifold.co/arguments-and-variables-in-docker-94746642f64b">Arguments and variables in Docker</a> by <a href="https://medium.com/u/2708b404ec81">Tim Speed</a></li></ul><figure><a href="https://dashboard.manifold.co/register"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yjQxpcurS6C8nHXJST-7Zw.png" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=61a2cbc99753" width="1" height="1" alt=""><hr><p><a href="https://medium.com/manifoldco/secure-runtime-variables-in-ironworker-with-manifold-61a2cbc99753">Secure runtime variables in IronWorker with Manifold</a> was originally published in <a href="https://medium.com/manifoldco">manifoldco</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[We migrated to Next.js to serve our home page 7.5× faster]]></title>
            <link>https://medium.com/manifoldco/we-migrated-to-next-js-to-serve-our-home-page-7-5-faster-559443219c84?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/559443219c84</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[web-performance]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[progressive-web-app]]></category>
            <category><![CDATA[nextjs]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Mon, 07 May 2018 13:07:55 GMT</pubDate>
            <atom:updated>2018-12-21T16:53:25.173Z</atom:updated>
            <content:encoded><![CDATA[<h4>Progressive Web Apps by the numbers</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pQBGo34dZ3IRdPeAu4JhNA.png" /></figure><p>We migrated <a href="https://manifold.co/">our home page</a> from a basic React boilerplate (<a href="https://github.com/react-boilerplate/react-boilerplate">React Boilerplate</a>) to <a href="https://github.com/zeit/next.js/">Next.js</a>, a progressive web app framework for React. We made no other changes, and the switch was basically invisible. The load times were better than we expected—it was basically free performance:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2b4060f0271e9b8ab628ae3076f199f4/href">https://medium.com/media/2b4060f0271e9b8ab628ae3076f199f4/href</a></iframe><p>On a fast connection, fast CPU, our site load time went from 1.5 seconds to 0.2 seconds — 7.5× faster! On an average connection and device, our site load time went from 7.5 seconds down to 1.3 seconds.</p><h3>Free performance, you say?</h3><p>To understand what a progressive web app (PWA) does, it’ll take a bit of understanding what happens in the time between a user visiting a URL (our website), and seeing something rendered on the page (in this case, our React app).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D8PNFy422av8nZlQVJpaMg.jpeg" /><figcaption>Timeline of the 5 stages of browser rendering (outlined below)</figcaption></figure><h4>The stages</h4><ol><li>Once a user hits a URL, the network request is a flat cost in resolving the DNS and requesting that path from the server. It’s pretty quick, usually happening in &lt; 100 milliseconds, but it’s mentioned because it does take <em>some</em> time.</li><li>From there, the server returns the HTML for the page, but the page will stay blank while every &lt;script&gt; and &lt;link&gt; tag inside &lt;head&gt; is downloaded (<a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#Notes">unless it’s marked </a><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#Notes">async</a>). There’s more going on in this step than the diagram shows, but for our purposes we’ll lump these processes together.</li><li>With the HTML and critical assets loaded, the browser starts to paint what it can, while downloading the rest (images, etc.) in the background. Ever wonder why images sometimes “pop” in or sometimes take a while to load? This is why! This lets you look at pages sooner.</li><li>JavaScript can only parse &amp; execute after it’s downloaded. Depending on how much JS there is (which can be a lot for a normal React app if it’s bundled into one file), this could take several seconds or more (<em>note: JS doesn’t have to wait until everything else downloads to begin executing, despite the diagram layout</em>).</li><li>In the case of a React app, it has to now modify the DOM, which will trigger another browser paint after it’s all done, and another cycle of asset downloads. The time this will take will depend on the complexity of the page.</li></ol><h4>Sooner is better!</h4><p>Because a progressive web app takes React and spits out static HTML and CSS, that means<strong> users are looking at your React app at Stage 3 rather than Stage 5.</strong> Which, in our tests, took anywhere from <strong>0.2–4 seconds </strong>depending on your connection and device speed, compared to 1.5–22 seconds.</p><p><em>…seriously—free performance? No catch?</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/267/1*8lUcPLHE-AUPsC7LSaKEEQ.gif" /><figcaption>Obligatory skeptical Steve Urkel</figcaption></figure><p>No catch! PWAs are a bulletproof way to serve your React app faster.</p><p>The reason why progressive web apps and PWA frameworks like Next.js are still catching on is because, traditionally, JS frameworks didn’t make it easy to generate static HTML. Today, the landscape is much different, with React, Vue, Angular, and the rest having first-class support for server-side-rendering. However, a deep understanding of bundlers and build tooling is still required to make it happen, and it’s not without its fair share of pain points. The recent appearance of PWA frameworks like Next.js and Gatsby (both late 2016/early 2017) have become a boon to PWA adoption by lowering the barrier to entry (and arguably making it <em>fun!</em>).</p><p>While not every application will fit into Next.js, for many React applications it boasts free performance and bandwidth boosts.</p><h3>How bad is the move?</h3><p>All-in-all, our migration of <a href="https://manifold.co/">manifold.co</a> wasn’t too bad, but we did run into the following pain points because of our unique setup:</p><h4>🏎 React Router gets left in the dust</h4><p>React Router had to go, because Next.js has its own built-in router that communicates better with its code splitting optimizations—<em>on top</em> of the PWA architecture I just described—to load pages much faster than any client-side router could do on its own.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*17oPXNxsT36rXTHptxURxQ.gif" /><figcaption>Next.js’ router is basically React Router + speed! …But it’s still not React Router.</figcaption></figure><p>In practice, because we weren’t doing a lot of complicated routing that React Router offers, for us it was as simple as replacing React Router’s standard &lt;Link /&gt; component with Next.js’s:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6ac4d3ea53615e19b365302007e10353/href">https://medium.com/media/6ac4d3ea53615e19b365302007e10353/href</a></iframe><p>Overall, not too bad! We basically renamed a prop and added an &lt;a&gt; tag for SSR. Because we’re using Styled Components as well, I also found adding the passHref prop was necessary in most instances to make sure the href always made it to the generated &lt;a&gt; tag.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RfsGwE-ktpixF7hhXJPgGQ.png" /><figcaption>Network requests for <a href="https://manifold.co/">manifold.co</a></figcaption></figure><p>To see Next.js’ fancy router optimizations in action, pop open your <strong>Network Tab </strong>on <a href="https://manifold.co/">manifold.co</a><strong> </strong>and click a link. In the image above, clicking a link to /services returns an XHR request for services.js rather than a normal 200 request for /services.</p><p>I’m not just talking about client-side routing—of course React Router exists for this—I’m talking about the actual .js chunk that was intelligently split out, and loaded on demand. That’s just a nice bundler feature Next.js does automatically for you out-of-the-box. This is <em>much</em> better than our old method of lobbing 1.7 MB of JavaScript at the client before they see anything. Although it’s not perfect, this is much closer to users’ only downloading code for pages they’re viewing than before.</p><h4>⬛️ Blackboxed Redux</h4><p>Continuing from the previous point, all that fancy Next.js optimization and code-splitting comes at a price: because it handles code-splitting at the page level, it won’t let you access the root React component or React DOM’s render method. If you’ve set up Redux yourself before, you’ll notice this poses a problem: where does the Redux &lt;Provider /&gt; sit?</p><p>In Next.js, they made a special <a href="https://github.com/zeit/next.js/tree/canary/examples/with-redux">withRedux HOC wrapper</a> you must wrap every top level component with, on every page:</p><pre>export default withRedux(HomePage);</pre><p>While that’s not too bad, if you need shimmed createStore() methods like in the case of <a href="https://github.com/GuillaumeCisco/redux-reducers-injector">redux-reducer-injectors</a>, plan on some extra time debugging their wrapper (sidenote: don’t use reducer injectors—ever).</p><p>Also because of its blackboxed nature, using <a href="https://facebook.github.io/immutable-js/">Immutable</a> with Redux becomes problematic. Although Immutable is supposed to work with this, I ran into problems with either the top-level state not being immutable (“get is not a function”), or the wrapper trying to use JS object dot notation rather than .get() (“Can’t get catalog of undefined”). And I had to dive into source code to debug this. After all, Next makes you use their provider for a reason.</p><p>In general, this highlights a key problem with Next.js:<strong> very little is documented</strong>. They have <a href="https://github.com/zeit/next.js/tree/canary/examples/">many examples to draw from</a>, but if your usecase isn’t there, good luck!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/324/1*jIPpDxpwCCD3yEx2NX9DWQ.gif" /><figcaption>If you do not have a relevant Next.js example to pull from, godspeed.</figcaption></figure><h4>🐶 Stop trying to make `fetch` happen</h4><p>We were using <a href="https://github.com/gilbarbara/react-inlinesvg">react-inlinesvg</a>, which offers the stylability of inline SVGs and the cacheability of remote requests. Only problem is: there’s no such thing as an XHR request when server-side rendering (at least, not in the sense of webpack URLs like it was expecting), so this blew up trying to SSR.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*-0-1ee1Oun7_WeJreOkgAQ.gif" /><figcaption>It’s not going to happen.</figcaption></figure><p>While there are some other inline SVG libraries that support SSR, I decided to drop it since most our SVGs were one-off illustrations anyway. I either swapped them out to an &lt;img&gt; tag if it didn’t need styling, or embedded them as React JSX. This might be a win-win, as the JSX illustrations are now delivered in the initial page load, and the client bundle had 1 library removed.</p><p>If you do need fetch in general (I did end up needing it for another library), you can configure that via next.config.js using whatwg-fetch and node-fetch:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7889dc7991fd15c5d8b3e495afb381d9/href">https://medium.com/media/7889dc7991fd15c5d8b3e495afb381d9/href</a></iframe><h4>👯‍ Client JS &amp; server JS: the dynamic duo</h4><p>The last confusing part of Next.js is it runs twice — once for server, and again for client. This blurs the lines a bit between client JS and Node JS in the same codebase, resulting in errors you’re not used to like fs is undefined when Node’s fs tool is trying to run in the client.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/660/1*Na1eBHKPPsnYGikdN0b6OQ.jpeg" /><figcaption>Client-side JS battles with server-side JS (2018, colorized)</figcaption></figure><p>As a result, you’ll have to engineer shims like this within next.js.config:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a93c811b2706773a38c11845d5c048ba/href">https://medium.com/media/a93c811b2706773a38c11845d5c048ba/href</a></iframe><p>The config.isServer flag within webpack becomes your best friend when the same code has to run in multiple environments.</p><p>You also have Next.js’ propretary getInitialProps() lifecycle addition to React, which only runs in server-mode, as well:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f10a07d8ecad4d5d453814e059bccbbd/href">https://medium.com/media/f10a07d8ecad4d5d453814e059bccbbd/href</a></iframe><p>Oh, and let’s not forget about our good friend window, needed for event listening, window measurement, and a plethora of useful functions, which is Node.js’ greatest weakness:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/92fb66fb29e54bbc01a742fdef19c2de/href">https://medium.com/media/92fb66fb29e54bbc01a742fdef19c2de/href</a></iframe><p>Wrapping your head around when the same JavaScript is either executing in Node.js or the client can be one tricky mindgame even Next.js can’t save you from. But using config.isServer and getInitialProps() to your advantage will serve you well.</p><h3>What’s next, after Next?</h3><p>For the short-term, Next.js more than meets our needs of server-side rendering for performance, delivering our site to non-JavaScript-enabled devices, and now allowing <a href="https://css-tricks.com/essential-meta-tags-social-media/">rich meta tags</a>.</p><p>We may, in the future, explore other options if and when our application needs server-side-rendering <em>and</em> has a more complicated server layer (we’ve talked about integrating single-sign-on between <a href="https://manifold.co/">manifold.co</a> and <a href="https://dashboard.manifold.co/">dashboard.manifold.co</a>). But until then, Next.js was a huge payoff for little time investment.</p><figure><a href="https://www.manifold.co/stratusupdate/issue/latest"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ykcw1iepXAGjSVSXQDPsdg.png" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=559443219c84" width="1" height="1" alt=""><hr><p><a href="https://medium.com/manifoldco/we-migrated-to-next-js-to-serve-our-home-page-7-5-faster-559443219c84">We migrated to Next.js to serve our home page 7.5× faster</a> was originally published in <a href="https://medium.com/manifoldco">manifoldco</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cloud-jumping: swap hosted services easily with Manifold]]></title>
            <link>https://medium.com/manifoldco/cloud-jumping-swap-hosted-services-easily-with-manifold-49d93a3d19f1?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/49d93a3d19f1</guid>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[serverless]]></category>
            <category><![CDATA[developer-tools]]></category>
            <category><![CDATA[manifold]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Tue, 03 Apr 2018 18:05:24 GMT</pubDate>
            <atom:updated>2018-10-29T19:04:05.644Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*twYXJ0AvFBD_V4yNKhud_A.png" /></figure><h4>How to take back full control of your cloud services in one afternoon</h4><p>Using some part of the cloud—whether AWS, Azure, Google Cloud, or others—has become a standard part of modern web development. RightScale’s <a href="http://www.rightscale.com/2018-cloud-report">2018 State of the Cloud</a> reported <strong>97% of respondents</strong> <strong>using at least one cloud service.</strong></p><p>In most instances, it’s easiest to buy into one cloud ecosystem so you have fewer things to manage. But when prices of a service increase, the platform changes, or you need to add an outside service to the mix, how do you handle switching <strong>one </strong>service from your vendor-locked cloud, let alone several?</p><p><a href="https://www.manifold.co/">Manifold</a>’s <strong>free developer tools</strong> provide everything you need to build-your-own cloud from existing providers. To see how, I’ll be taking an example application with authentication, hosting, and account email services, and moving the app off AWS and onto independent providers for all three parts.</p><h3>The App</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nRo2kUlkz1I7zK43KkdCCA.jpeg" /><figcaption>A basic cloud app using AWS Elastic Beanstalk, RDS Postgres, and Simple Email</figcaption></figure><p>Our <a href="https://github.com/manifoldco/manifold-sample-app">example app</a> is nothing more than a login with an authenticated page, and a password reset via email. So we’re using the following services:</p><ul><li>AWS Elastic Beanstalk (Node.js)</li><li>AWS RDS Postgres</li><li>AWS Simple Email</li></ul><p>You can see the code for the starting application <a href="https://github.com/manifoldco/manifold-sample-app">here, in the </a><a href="https://github.com/manifoldco/manifold-sample-app">master branch</a>.</p><p>The credentials for the services are all fed in via environment variables through a .env file. Though the values aren’t saved in the app, you can see all the variable names needed in the <a href="https://github.com/manifoldco/manifold-sample-app/blob/master/.env.example">.env.example file</a>.</p><h3>Moving to Manifold</h3><p>With <a href="https://www.manifold.co/">Manifold</a>, you can hook up any service you want—even those not listed on the <a href="https://www.manifold.co/services">Services page</a>! But for this example, our usecase is satisfied by the existing services of <a href="https://www.manifold.co/services/mailgun">Mailgun</a> and <a href="https://www.manifold.co/services/jawsdb-postgres">JawsDB Postgres</a>, so we’ll use those two. But again, once the application uses Manifold, those can be swapped out easily at any time.</p><p>To start, <a href="https://manifold.co/">sign up for a free manifold account</a> (only takes a few seconds if you authenticate with GitHub). Then, from our project window, we’ll run the following:</p><p><strong>Mac (via </strong><a href="https://brew.sh/"><strong>Homebrew</strong></a><strong>):</strong></p><pre>brew install manifoldco/brew/manifold-cli</pre><p><strong>Linux/Windows:</strong></p><pre>curl -o- https://raw.githubusercontent.com/manifoldco/manifold-cli/master/install.sh | sh</pre><p><em>Note: you can read more about this install script on the </em><a href="https://docs.manifold.co/docs/install-77T6auwaaIQcgA4QGouO0"><em>Manifold CLI Guide</em></a><em>.</em></p><p>Then, log in with manifold oauth -- github if you registered via GitHub, or manifold login if you signed up with email / password. Now comes the fun part!</p><h3>Swapping RDS with JawsDB</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*grs2mcpxe_p5PwuvpeCaLA.gif" /><figcaption>Adding resources with `manifold create` couldn’t be easier. If you like what you see, <a href="https://github.com/manifoldco/promptui">we’ve released promptui as OSS</a>!</figcaption></figure><p>Run the following to add a resource, and the friendly CLI will walk you through provisioning (it even gives you pricing and descriptions in-terminal!):</p><pre>manifold create</pre><p>For JawsDB, selectjawsdb as the service type, and kitefin for the lowest-cost plan (you can adjust the plan later from <a href="https://dashboard.manifold.co/">the Dashboard</a>).</p><p>Complete the remaining prompts like region and name with whatever you wish.</p><h4>Updating the creds</h4><p>Our app is still using the RDS creds in .env, so we’ll need to update those. Those can easily be grabbed from within the <a href="https://dashboard.manifold.co/">Dashboard UI</a>, but we’ll stick to the CLI for simplicity. Simply run:</p><pre>manifold export</pre><p>…and you’ll see the credentials exposed into your terminal session (if you need to output a project, run manifold export --project projectname). We already have an .env already, but for future reference, you can optionally specify an output file like so:</p><pre>manifold export &gt; .env</pre><p>What you should see from JawsDB is all the credentials rolled into one URL:</p><pre>JAWSDB_URL=postgres://$USER:$PASSWORD@$HOST:$PORT/$DATABASE</pre><p>Pluck apart those values from the URL into .env to swap your app.</p><h4>Migrating the data</h4><p>There’s no GUI for exporting your AWS Postgres database, but the standard <a href="https://www.postgresql.org/docs/current/static/app-pgdump.html">pg_dump</a> will work just fine. Assuming your RDS instance is <a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreatePostgreSQLInstance.html">publicly accessible</a>, run:</p><pre>pg_dump $AWS_DATABASE -h $AWS_HOST -U $AWS_USER -f development.dump</pre><p>You’ll be prompted for your password so it’s not saved in your shell history. To output a development.dump file from AWS. Then simply import into JawsDB:</p><pre>psql $JAWS_DATABASE &lt; development.dump -h $JAWS_HOST -U $JAWS_USER</pre><p>You’ll likely see some errors like ERROR: role does not exist because of username differences, but it should succeed nonetheless. You can verify by running psql $JAWS_DATABASE -h $JAWS_HOST -U $JAWS_USER and \dt to show a list of tables. You can follow up with a query to double-check the data made it (e.g.: SELECT * from users;).</p><h3>Swapping Simple Email (SES) with Mailgun</h3><p>Migrating our database was about as easy as it gets, but not all service-swapping is quite as rosy. To switch from Mailgun, we will have to modify app code a bit in addition to a simple .env update.</p><p>Add <a href="https://www.manifold.co/services/mailgun">Mailgun</a> to your Manifold account, either through running manifold create locally, or via the <a href="https://dashboard.manifold.co/">Dashboard</a>. Their free tier is perfect for testing.</p><p>Once you’ve added it, click the <strong>Open Mailgun Dashboard</strong> button at the top of the screen:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8_GdwZWxefR7qfMC78s9Pw.png" /><figcaption>You can jump to the Mailgun Dashboard straight from Manifold</figcaption></figure><p>From there, you’ll want to <strong>Add Custom Domain:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Uxzrw4TXAwRYwfdRedmLag.png" /><figcaption>Adding a custom domain in Mailgun</figcaption></figure><p>Follow the instructions that follow for adding Mailgun to your domain, which is necessary to avoid spam filters and whatnot. Back in our app, we’ll swap node-ses with mailgun-js:</p><pre>yarn remove node-ses<br>yarn add mailgun-js</pre><p>Then in our email config, we’ll make a few changes that swap out the SES client with Mailgun’s (you can see the diff on the <a href="https://github.com/manifoldco/manifold-sample-app/pull/2">Pull Request from the sample app</a>). Overall, not too bad! The API, fortunately for us, ended up being similar. We only renamed two env variables—so as to not be confusing later— and had to change message to text in our email call.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XP-f8SlyV-l6uFDJXnFtcg.png" /><figcaption><a href="https://github.com/manifoldco/manifold-sample-app/pull/2">https://github.com/manifoldco/manifold-sample-app/pull/2</a></figcaption></figure><p>Once some test emails are sent, we’re pretty much in business!</p><h3>Swapping Hosting</h3><p>Our app was originally hosted on Amazon Elastic Beanstalk, and moved to Zeit Now. I expected to glean some insight from migrating hosts, but came up short—the process was unremarkably quick and painless. The only lesson I learned is so glaringly obvious, it’s almost not even worth saying:</p><blockquote><em>If you use cloud services that work on any host, you can deploy to any host at any time.</em></blockquote><p><em>“Duh,” </em>you’d say. And you’re not wrong! But it’s not bad advice to keep in mind, either.</p><h3>💁 Tip: Projects and Teams save a ton of headache</h3><p><strong>Projects</strong> are the best way to associate related resources together, especially if you’re using several in the same application or suite of apps. You can create new projects with:</p><pre>manifold projects create</pre><p>Associate resources to that new project by running:</p><pre>manifold projects add</pre><p>The biggest advantage to projects, besides organization, is <strong>one-click </strong><strong>.env file downloads.</strong> Clicking either the “download .env” or “Show credentials” buttons will yield all values for all resources in a project. Huge time-saver when it comes to updating access tokens!</p><h4>🔐 Even more security</h4><p>If you want to make it even more secure and load secrets from memory, <a href="https://docs.manifold.co/docs/cli-quickstart-6JMEw1CD6wguwIYymUuAQ6#run-your-project">try using </a><a href="https://docs.manifold.co/docs/cli-quickstart-6JMEw1CD6wguwIYymUuAQ6#run-your-project">manifold run</a> to start your app—you can inject env vars directly from Manifold without any of them living in your file system! The sample app has an <a href="https://github.com/manifoldco/manifold-sample-app/blob/manifold/package.json#L9">example of how to do this in </a><a href="https://github.com/manifoldco/manifold-sample-app/blob/manifold/package.json#L9">package.json</a>.</p><h4>👯‍ Team projects</h4><p>Team projects are even more useful. With team projects, you can invite and uninvite other developers to access shared resources, and pay for it all with one set of billing info. To create a <strong>team project</strong> (assuming you’ve created a team with manifold team create), first switch to a new team:</p><pre>manifold switch</pre><p>And then you can run manifold projects create from that new team context to create a project for that team (currently, you can’t convert an individual project to a team project, but it’s not too bad to move existing resources from an old project to a new one—you don’t have to start from scratch again).</p><h3>Recap</h3><p>Still debating how much effort it’d be to migrate cloud services for your app? Here are some good and bad practices that should give some indication:</p><h4>Quick &amp; easy migrations</h4><ol><li>Environment variables used for all credentials</li><li>Open-source technology powers most of the app</li><li>Configurations are all abstracted into a central place</li></ol><h4>Painful migrations</h4><ol><li>Hard-coded credentials everywhere</li><li>“Blackboxed” or proprietary systems power most of the app</li><li>Configurations are written ad-hoc, wherever they’re needed</li></ol><p>Migrations may not ever be <em>fun</em>, but with tools like Manifold’s CLI it can come pretty darn close.</p><p>The best migration may be none at all, but when the time inevitably comes, Manifold makes it as painless as it possibly can be.</p><figure><a href="https://dashboard.manifold.co/register"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yjQxpcurS6C8nHXJST-7Zw.png" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=49d93a3d19f1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/manifoldco/cloud-jumping-swap-hosted-services-easily-with-manifold-49d93a3d19f1">Cloud-jumping: swap hosted services easily with Manifold</a> was originally published in <a href="https://medium.com/manifoldco">manifoldco</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[$ manifold add — human Drew]]></title>
            <link>https://medium.com/manifoldco/manifold-add-human-drew-d31049baa908?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/d31049baa908</guid>
            <category><![CDATA[manifold-add]]></category>
            <category><![CDATA[manifold]]></category>
            <category><![CDATA[startup-culture]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[developer]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Fri, 09 Feb 2018 13:45:16 GMT</pubDate>
            <atom:updated>2018-02-09T13:45:16.899Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Yv5YCpi150LFZu8mJ92tJQ.png" /></figure><p>👋 My name is…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/519/1*vP_JP-zPQ7vObw4uGS34Cg.jpeg" /><figcaption>Drew</figcaption></figure><p>💻 My job at Manifold is…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/546/1*ho-MevGC7lgS9udeTbcKyA.jpeg" /><figcaption>Frontend Engineer</figcaption></figure><p>💰 I’m going to donate $200 to…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/619/1*2uyC7mA385q7eUfIGeL6wg.jpeg" /><figcaption><a href="https://thelastmile.org/">https://thelastmile.org</a></figcaption></figure><p>🌱☀️🍂 ❄️ My favorite season is…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xEcE-rgjhD9_IGCQJqde3g.jpeg" /><figcaption>“Winter has come at last” / “All right, everyone! CHILL!”</figcaption></figure><p>⛵If I had a boat I would name it…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/787/1*5qDce7iX78-DNjhV_aWbGw.jpeg" /><figcaption>HMS Thalassophobia</figcaption></figure><p>✨ My favorite inspirational quote is…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/958/1*42cZ3feABA8fOBwp-28nOQ.jpeg" /><figcaption>“Nearly all individuals can stand adversity, but if you want to test a person’s character, give them power.” —Thomas Carlyle?</figcaption></figure><p>👩‍💻 🌎 👨‍💻 I work from…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/756/1*JhEtzaKUrku0-n7WjMhseQ.jpeg" /><figcaption>Colorado (depicted: brother-in-law with very large hat)</figcaption></figure><p>🙌 If I could have a dinner with someone who is alive or dead, I’d have dinner with…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/585/1*z7LSarkgATo_OTvnQInRYw.jpeg" /><figcaption>My Wife, Hillery ♥︎</figcaption></figure><p>🌎 My favorite place in the world is…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bmr9QUFRd1elEQy0dN_9IA.jpeg" /><figcaption>The climbing gym— specificially that climbing café in Halifax where you can climb AND drink coffee (depicted: climbing coffee mug)</figcaption></figure><p>🍦 My favorite dessert is…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/784/1*y-3bIeOg2UghVyxnhaPpeg.jpeg" /><figcaption>A negroni (with coffee-infused Campari! Yum!)</figcaption></figure><p>🎨 Draw a self-portrait</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/661/1*1_snW_oACLZlcuH3SctAcg.jpeg" /><figcaption>Self-portrait</figcaption></figure><figure><a href="https://dashboard.manifold.co/register"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nzs9X5qdiZ3VbKAbBBeGig.png" /></a></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d31049baa908" width="1" height="1" alt=""><hr><p><a href="https://medium.com/manifoldco/manifold-add-human-drew-d31049baa908">$ manifold add — human Drew</a> was originally published in <a href="https://medium.com/manifoldco">manifoldco</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Stylable: the good, the bad, the weird]]></title>
            <link>https://medium.com/written-with-envy/stylable-the-good-the-bad-the-weird-f1ee137311a4?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/f1ee137311a4</guid>
            <category><![CDATA[css-in-js]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[css]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Mon, 27 Nov 2017 18:23:57 GMT</pubDate>
            <atom:updated>2017-11-28T14:00:02.223Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Sb40yvgs-8Kx-fCyLCSXCQ.png" /></figure><p><a href="https://stylable.io/">Stylable</a> is a CSS preprocessor for modern web development. Although it’s a newcomer to the current CSS-in-JS’ <em>Looney Tunes</em>-style fight cloud, it’s not really <em>CSS-in-JS</em> so much as a thoughtful iteration of the new philosophy of <a href="https://github.com/css-modules/css-modules">CSS Modules</a>. If you’ve been screaming for all those CSS-in-JS kids to get off your CSS3 lawn, Stylable might be just the old tune that takes you back to the good ol’ days.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*jJ5CfRjUYLAbppibMQHIfw.gif" /><figcaption>Current CSS-in-JS solutions: an orderly graph</figcaption></figure><p>Everything is a JavaScript module in 2017 web development. To say CSS has had a tough time keeping up with this shift is an understatement. To name a few problems:</p><ol><li><strong>CSS is (still) global: </strong>JavaScript modules only expose their names via export &amp; import—otherwise everything is isolated. In CSS, every name is global. Of course the simple add-a-CSS-file-anywhere-to-access-it was an intentional design decision of CSS that made it simple to implement. But that simplicity introduces a lot of technical debt at large scale, and so front-end developers responded by inventing invisible rulesets such as <a href="https://smacss.com/">SMACSS</a> and <a href="http://getbem.com/">BEM</a>. While these are viable solutions, all of these exhaustive naming structures must be rigidly enforced on a team, otherwise it breaks down.</li><li><strong>CSS (still) doesn’t tree shake:</strong> If you wrote it somewhere, it’s being downloaded and inserted. CSS has no clue what styles you are / aren’t using. Better to leave it alone than risk breaking something, right? Welcome to the gigabytes and gigabytes of unused CSS that make up the web.</li><li><strong>CSS (still) doesn’t understand state:</strong> CSS is a brilliant tool for <em>styling</em> state, but it’s never had a built-in method for managing state. CSS can only apply styles based on class names; it can’t add or remove classes itself. For this reason, JavaScript or server-side rendering is required to show state, which means anything generating markup has to know about your CSS class names. Now there are invisible threads running all through your application, and when the CSS class names change, so must all of these external files. There must be a saner way to manage user-facing state that your application actually understands.</li></ol><p>Every new styling solution for modern JS frameworks must address these problems. <a href="https://github.com/styled-components/styled-components">Styled Components</a>, <a href="https://github.com/paypal/glamorous">Glamorous</a>, and <a href="https://github.com/Khan/aphrodite">Aphrodite</a> attempt to solve these problems using JS’s native language solutions to render CSS as it does HTML. But often, this re-imagining of CSS leaves features by the wayside in pursuit of these problems. For example, in most of these, it’s hard to write global styles, hard to add webfonts, hard to nest selectors, hard to use CSS3 animations, and—most dreaded of all—<a href="https://github.com/styled-components/styled-components/issues/142">the </a><a href="https://github.com/styled-components/styled-components/issues/142">:hover + child selector declaration</a> (a longstanding problem in CSS-in-JS that’s only been effectively addressed very recently).</p><p>Stylable, on the other hand, attacks this problem from the CSS end, and does a pretty good job of preserving CSS while pushing the language forward. There are pros and cons to both approaches, which we’ll cover, but Stylable offers some compelling new solutions that make it a worthwhile addition.</p><h3>The good</h3><h4>Stylable is 100% CSS, and then some</h4><p>In case I didn’t say it before, I’ll say it again: with Stylable, you get CSS, and every part of CSS. This seems like a “duh” observation, but this is significant if you’ve ever battled with a CSS-in-JS framework over a lost or “hacky” implementation of a basic CSS feature. If this is all you’re looking for, stop reading here and try it out!</p><h4>CSS in React has never been simpler</h4><p>Stylable has a <a href="https://github.com/wix/wix-react-tools">React helper</a> that wraps components, and gives you a hook for styling. Here’s the Header component from <a href="https://stylable.io/docs/getting-started/install-configure">Stylable’s create-react-app</a> example:</p><pre>import React from &#39;react&#39;;<br>import { properties, stylable } from &#39;wix-react-tools&#39;;<br>import style from &#39;./header.st.css&#39;;</pre><pre>…</pre><pre>const Header = stylable(style)(properties((props: HeaderProps) =&gt; (<br>  &lt;header&gt;<br>    &lt;img src={reactLogo} className=&quot;reactLogo&quot; alt=&quot;logo&quot; /&gt;<br>    &lt;img src={stylableLogo} className=&quot;stylableLogo&quot; alt=&quot;logo&quot; /&gt;<br>    &lt;h1 className=&quot;title&quot;&gt;{props.message}&lt;/h1&gt;<br>  &lt;/header&gt;<br>)));</pre><p>See the className=&quot;reactLogo&quot;? You can string together CSS classes just like the good-old days! Uh-oh—that means reactLogo is global, right? Nope! The final output class is .header1839991338--reactLogo. Not only is it scoped to this component only, but it’s also kept its human-readable name so we can easily debug our style tree if something goes awry.</p><p>Adding additional classes is exactly as you’d expect:</p><pre>&lt;div className=&quot;someClass otherClass&quot; /&gt;</pre><p>That’s it—simple, manageable, predictable.</p><h4>Stylable plays nicely with other systems</h4><p>Still using wix-react-tools, let’s add a .notInFile class that’s missing from the header.st.css Stylable file (the .st.css file extension connotes a Stylable CSS file):</p><pre>&lt;div className=&quot;fromFile1 fromFile2 notInFile&quot; /&gt;</pre><p>If you expected .notInFile to be namespaced, or if you expected it to be stripped out entirely, you’d be wrong! This is the output markup:</p><pre>&lt;div class=&quot;header1839991338--fromFile1 header1839991338--fromFile2 notInFile&quot;&gt;&lt;/div&gt;</pre><p>It didn’t namespace notInFile because it knows it’s not a part of your Stylable file. Not only is it flexible; Stylable plays nicely with other systems, too.</p><h4>CSS gets brilliant state management ✨</h4><p>So what about dynamic classes / props like Styled Components has? Getting to props is actually my favorite part of Stylable. For dynamic classes, of course you can use template literals if that’s your jam:</p><pre>&lt;div className={`defaultClass ${dynamicClass}`} /&gt;</pre><p>But Stylable has something far more powerful built-in: a tool they call <a href="https://stylable.io/docs/references/pseudo-classes">custom pseudo-classes</a>. It’s so smart I hope this actually becomes part of the CSS spec. Now you have things like this:</p><pre>.root {<br>  -st-states: toggled, loading;<br>  color: black;<br>}<br>.root:loading { color: green; }<br>.root:toggled { color: red; }<br>.root:loading:toggled { color: blue; }</pre><p>One glance at this, and you can tell exactly what every element’s styling should be! No boilerplate if / else operators or ternaries, or wondering if .loading is a state class or a standalone element.</p><p>The React side is every bit as clean thanks to the style-state prop helper:</p><pre>&lt;div style-state={{ loading: false, toggled: true }}&gt;</pre><p>Stylable uses CSS’s own syntax to encapsulate class names while exposing an API for JS. Your JS doesn’t have to manage CSS classes, and your CSS is completely free from logical if / else operators. Because Pseudo-classes are chainable, every state can be accounted for and styled, with the fallbacks evident as well. And chained classes are always applied with their higher specificity, to boot, no matter what order they appear in. Very clever!</p><h3>The bad</h3><h4>No nested styles</h4><p>This is a tough downgrade from Sass and the other libraries: no nesting. Even <a href="http://cssnext.io/features/#nesting">cssnext</a> has nesting, which allows you to do things like:</p><pre>.link {<br>  color: #0f0;<br>  transition: color 200ms;</pre><pre>  &amp;:hover {<br>    color: #080;<br>  }<br>}</pre><p>Which is so much more readable and composable. In this regard, Stylable throws you back to the stone-age, where you have to re-declare selectors over and over again for every single block, like some stone-age peasant.</p><h4>Doesn’t (totally) tree shake</h4><p>In Stylable, if I have the following:</p><pre>.unused-class {<br>  font-family: fantasy;<br>}</pre><p>That’s going to make it into production assuming its containing file is imported somewhere, whether or not I end up using that class. Compare that to Styled Components in a separate file:</p><pre>import styled from &#39;styled-components&#39;;</pre><pre>const UnusedClass = styled.div`<br>  font-family: fantasy;<br>`;</pre><pre>export { UnusedClass };</pre><p>If that UnusedClass wasn’t imported anywhere, or if it was imported but never called, it will be stripped from production. JS still holds the advantage here.</p><h3>The weird</h3><h4>Magical roots</h4><p>Consider the following Stylable CSS for one component:</p><pre>.root img {<br>  height: 100px;<br>}</pre><pre>.logo {<br>  height: 80px;<br>}</pre><p>You’d expect .root img to override .logo, right? Class selector + element selector &gt; class selector, right? Wrong! Stylable invisibly prefixes every non-.root. So even though it reads as .logo, it’s actually .root .logo. Even though we’d expect 100px to be the final value, the actual value is 80px.</p><p>Once you realize this, it’s a trivial detail, but this magic can be a real head-scratcher if you’re not anticipating it. You can avoid this altogether by trying to never use the .root class, but there are many scenarios where this is unavoidable.</p><h4>Modifiers using…pseudo-elements?</h4><p>For as much as I love Stylable’s use of custom pseudo-classes, I’m a bit puzzled as to how they handle component modifiers:</p><pre>:import {<br>  -st-from: &#39;./video-player.st.css&#39;;<br>  -st-default: VideoPlayer;<br>}<br>.mainVideo {<br>  -st-extends: VideoPlayer; /* define mainVideo as VideoPlayer */<br>}<br>.mainVideo::playButton { /* override mainVideo playButton */<br>  background: green;<br>  color: purple;<br>}</pre><p>The gist here is that you’re creating a new modifier of a base component, VideoPlayer, and overriding its .playButton child class. This implementation is curious not only because of how pseudo-elements are used in CSS, but also because this seems to break single-file dependency. While this file makes it clear it’s depending on VideoPlayer, the same can’t be said for the video-player.st.css file—it’s likely another developer could edit that file unaware it’s silently affecting other files. This is an anti-pattern, especially in the world of JS models.</p><p>On the other hand, I do see some potential in this, but perhaps only if you kept it to very, very low-level utility components. Overall, I’m just not sure what to think about this feature yet.</p><h4>The variables are okay</h4><p>Importing variables is very JS-like:</p><pre>:import {<br>  -st-from: &quot;./colors.css&quot;;<br>  -st-named: black, blue;<br>}</pre><pre>.root {<br>  color: value(black);<br>}</pre><pre>.link {<br>  color: value(blue);<br>}</pre><p>That’s basically the equivalent of writing import { black, blue } from &#39;./colors.css&#39;;. It becomes a bit tedious (and strange) manually importing/exporting named variables, but overall I respect the design decision behind it. I think this approach is a wash compared to the escaped template literals (color: ${black}) in Styled Components, et al.</p><h3>So, is Stylable worth using?</h3><p>There’s a lot to love about Stylable, and it brings a lot of new concepts to the table. In its current state, I think I still prefer Styled Components when it comes to styling in React. I’ve gotten used to composing CSS dynamically using JS, and I personally love the simplicity of having .js files that store all your styling constants like colors, typography, grid, and responsive settings—you never know when JS needs access to these values for animations and transitions.</p><p>That said, I do think the current generation of CSS-in-JS isn’t sustainable, at least for CSS. It’s currently a bastardization of many of CSS’ original design decisions, and I believe CSS will evolve and adapt in time. In that regard, I have very high hopes that Stylable will be a viable option and will grow and adapt with CSS. Stylable is very pro-CSS, which I think is the safest bet long-term. So while I may not be hopping on the Stylable bandwagon just yet, I think either a future version of Stylable or something born directly from it will someday be the new standard.</p><p>In short:</p><h4>Stylable is great for:</h4><ul><li>Developers that just miss plain-ol’ CSS</li><li>Legacy apps with lots of existing (non-Sass) CSS that are currently being upgraded to Reactlandia</li><li>Developers who want to invest long-term into a CSS system that will be around for years, and aren’t satisfied with the current CSS-in-JS landscape.</li></ul><h4>Stylable is not so great for:</h4><ul><li>Developers that have established a good workflow with Styled Components or similar CSS-in-JS libraries</li><li>Developers that prefer JS to CSS in general (disregarding the fact your animations should all happen in CSS whenever possible)</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f1ee137311a4" width="1" height="1" alt=""><hr><p><a href="https://medium.com/written-with-envy/stylable-the-good-the-bad-the-weird-f1ee137311a4">Stylable: the good, the bad, the weird</a> was originally published in <a href="https://medium.com/written-with-envy">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’ 2017 rebrand: discovering meaning]]></title>
            <link>https://medium.com/written-with-envy/envy-labs-2017-rebrand-discovering-meaning-e915a3d64e53?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/e915a3d64e53</guid>
            <category><![CDATA[design]]></category>
            <category><![CDATA[design-process]]></category>
            <category><![CDATA[design-thinking]]></category>
            <category><![CDATA[branding]]></category>
            <category><![CDATA[business-development]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Mon, 06 Nov 2017 19:21:06 GMT</pubDate>
            <atom:updated>2017-11-09T16:45:03.839Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iIbd4NbphwdXR2TDGFKx5w.gif" /><figcaption>The 2017 site is rife with meaning, with visualizations pulling from Envy Labs-generated data (the homepage’s visualization is based on data collected from our team’s annual Epcot Day photos).</figcaption></figure><h3>What’s a “brand?”</h3><p>Michael Beirut, Principle at Pentagram, spelled it out a few years ago: <a href="http://designobserver.com/feature/graphic-design-criticism-as-a-spectator-sport/37607/">graphic design criticism is a spectator sport</a>. But I’d argue since that 2013 essay, it’s risen past mere “spectator sport” to the realm of casual dinner conversation. Today, it’s not unusual to overhear a coffee shop conversation with someone talking about their “personal” or “lifestyle” brand on Instagram. And it’s only becoming more embedded in our culture. For the most part, we’re all aware of it, and fine with it.</p><p>A brand often starts with a logo. This we all know. It doesn’t have to end there—a brand in its pure form is, after all, an eternal idea or movement—but slapping symbols on everything is a habit we can’t kick. No matter how lofty or eternal your vision is, society still needs that symbol or wordmark to legitimize it. Technology isn’t helping us break our addiction, either. Starting a business? You’d better have a logo. Starting a Facebook group? You need an avatar and header graphic! Made a website? Upload a logo and favicon to get started! Working at a company that still has an ’80s logo? Adapt or die! Rebrand, refresh. Rebrand, refresh.</p><p>We fell into this trap with our last <em>Envy</em> logo update from 2013, when we updated an over-stylized logo that dated us. We “refreshed our brand” to feel more relevant. It worked. But when it came time for us to “refresh” again, we didn’t want to do it out of pure habit. We didn’t want to neglect the one central reason you even call it a “brand.” And that’s <em>meaning</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rl6z1UuCXfT2XEtFp_HHsA.jpeg" /><figcaption>Logos are like cheap tattoos, right? Just pick one out of a book and get it done? © <a href="https://www.amazon.com/Logo-Modernism-English-French-German/dp/3836545306">Logo Modernism</a></figcaption></figure><p>A brand consisting of a logo, and nothing more, is shallow and somewhat pointless. <a href="https://medium.com/u/8538498fa7a2">Grant McCracken</a> reminds us of this in an interview with Debbie Millman:</p><blockquote>When we create brands, we’re engaged in a process of “manufacturing” and “managing” meaning. … Sometimes I hear designers speaking in generalities such as, “We had to freshen the brand,” or, “We had to make it more dynamic,” and so forth. What I don’t hear designers say is, “We chose this brand, <em>this</em> particular meaning and <em>that </em>particular meaning, and we got rid of <em>that</em> meaning.” We can be much more particular — we <em>must</em> be much more particular — about the meanings that we think matter.</blockquote><blockquote>— <a href="https://medium.com/u/8538498fa7a2">Grant McCracken</a> <em>in </em>Brand Thinking and Other Noble Pursuits</blockquote><p>For most of Envy Labs’ history, we’ve been guilty of prioritizing our clients’ needs above our own. We’re not serial promoters; we neglect our “brand” almost by default. Enough time had passed since our last company orienteering, where we needed a reminder of what we stand for, and the big picture of what we’re accomplishing.</p><p>To rebrand is to revisit your values—the <em>raisons d’être—</em>organize them, and invite outsiders into what you’re setting out to accomplish. A brand is more than a mere company or a part of capitalism. A true brand is an idea or movement, something much grander and more important than money. It can take the form of a company, but it doesn’t have to. A brand is merely an idea that people can agree or disagree with.</p><p>We needed to rediscover our meaning.</p><h3>Started from the bottom, now we’re…where, exactly?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/900/1*LxiGN1-we7oeNC5EgviNnw.jpeg" /><figcaption>Envy Labs’ logo, ca. 2009</figcaption></figure><p>The name <em>Envy Labs</em> came about in 2008 when Gregg Pollack started a full-time web agency with three other developers after his popular <a href="http://jasonseifer.com/2010/04/08/rails-envy"><em>Rails Envy</em> podcast/blogging venture</a> with Jason Seifer. <em>Rails Envy</em> was a tongue-in-cheek reference to non-Rails developers’ being envious of Rails developers’ amazing experience building web software (which, in 2007, was mostly true based on what the rest of the landscape looked like).</p><p>Touching on that same vein, Gregg came up with the name <em>Envy Labs</em> because it sought to create the same culture that so many other agencies had achieved. Beautiful, downtown office spaces. Remote work. Unlimited vacation. Ridiculous benefits. Incredible company culture. Gregg wanted to start a company that took care of people well—one that others were <em>envious</em> of.</p><p>In a mere four-and-some-change short years, Envy Labs had grown, and now had a successful bootstrapped product on its hands: <a href="https://www.codeschool.com/"><em>Code School</em></a>. The combined number of employees were somewhere in the 40–50 range, and the company was able to provide some of the best salary, benefits, culture, and growth opportunities for a tech company in the state of Florida. It attracted some of the most passionate, driven, fun-loving individuals you could hope to find.</p><p>Everything was great. Magical, even.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*2uI2eSrPXqqa17t4egxRCg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*Xu6sQLi6LSL0_XBra8xeXA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*hDihYolR33rzfQayqNYMrg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*vz28qB4N5TOnRbpPUmj5jg.jpeg" /><figcaption>Envy Labs’ office (built 2013) in the GAI building, complete with ping-pong, whiskey walls, full-service coffee bars, and a gorgeous open-office plan overlooking Central Florida’s tree canopy. Photos © <a href="https://www.flickr.com/photos/excitoli/">Olivier Lacan</a>, saver and archiver of countless memories and moments</figcaption></figure><p>But how far can “be better than the rest” take you? Where do you go from there once you’ve achieved the success you’re going for?</p><p>Rather than take some time out for self-reflection, we pushed on, continuing to focus on making our company culture bigger and better. Often to the neglect of what we were achieving beyond our four walls.</p><h3>Where do we go from here?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IUq1Ahm9GXOXEkAzhsyazw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0MUMT_aGqQugYVAKQqsM4A.jpeg" /><figcaption>2016 brought with it a new office and outlook. It was a blank canvas, teeming with potential and pressure.</figcaption></figure><p>In early 2017, the design team—<a href="https://medium.com/u/5f97e18a107a">Nick Walsh</a>, <a href="https://medium.com/u/f4c77f65a050">John Wilson</a>, <a href="https://medium.com/u/ad8c2de57314">Ayana Campbell Smith</a>, and I—sat down to assess our current company vision. We had officially parted ways with Code School, cemented by the <a href="https://techcrunch.com/2015/01/26/online-learning-service-pluralsight-acquires-code-school-for-36-million/">sale in Jan 2015</a>. We left the shared office in May 2016, returning to our numbers to sub-twenty. In many ways, 2016 closed a seminal chapter in Envy’s history, giving way to a brand new one. What were we accomplishing? What were we targeting? If our company was a vessel, where were we sailing it?</p><p>The design team began by finding our brand positioning—our place in the (economic) universe. Where did we fit in? Did our name reflect that? Over the course of months, we explored <a href="https://www.zinzin.com/process/name-development/evocative-names/"><em>evocative names</em></a> that captured the spirit of what we were seeking after.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UUseCAjDstSDlfY4dKzWJw.jpeg" /><figcaption>To discover our brand positioning, we mapped out leaders in our industry as well as explored potential names for us to find our own niche. We may have re-discovered an IP or two in the process.</figcaption></figure><p>We needed to communicate several things:</p><ol><li>We liked solving impossible problems.</li><li>We moved fast, and could outpace many larger agencies in building scalable web apps in a matter of weeks.</li><li>We were small and nimble, able to spin up or down quickly, and able to fit into nearly any existing corporate structure.</li></ol><p>For the better part of our exploration, we felt we had outgrown the word “<em>Envy</em>.” We felt that word stood for something that was no longer part of who we were, or where we wanted to go.</p><p>After all, how can you build a vision for the future based on what somebody else has?</p><p>We explored many potential names, trying each out over the course of weeks. In the office, we even pretended we had already changed our name. Some company names were rejected in less than a day. Other names we <em>really</em> liked, and would have probably changed our name to had we not discovered a few similar trademarks after coming up with the name.</p><h3>A Return to Form</h3><p>Months of crumpled paper, erased whiteboards, and -final-final-v3.ai Illustrator documents turned up nothing but dead ends in the search for this new identity.</p><p>We were discouraged. After some soul-searching, we still couldn’t find the right words that captured who we needed to be. Unsure where to sail toward, we returned to our roots—that initial spark—that exploded into the vibrant culture and history we wanted to preserve.</p><p>But more than that: we couldn’t forge ahead marching to the beat of our own drum. We achieved success because we had solved others’ problems, and would continue to do so as long as the company existed. We didn’t exist without others. So, we took one step back in order to take two steps forward:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/611/1*CQtyJKwOLs66rcdcHprCCw.gif" /><figcaption>A throwback, and push forward: we returned to our old name, Envy Labs, but we added a long-missing taste of modernism that truly reflects us.</figcaption></figure><p>We returned to our old name—one with history, recognition, and a dash of fun. Us trying to get away from being “others-focused” (envy) only drew us right back in at the end.</p><p>Speaking to the pure design of it, our new lockup is a union of three shapes forming an abstract “e” that represent the developers, production team, and designers that make everything happen (can you guess which of the shapes represents the special snowflake designers?). Our typeface is a grotesque with notable geometric properties, evoking the forms and philosophies of mid-century modernism. We’re a modernist company, after all — we believe in the truth of forms, reduction of waste, and simplicity of execution. And of course, having “envy” in our name mandates we use some hue of green as a brand color; as designers we don’t waste any good metaphors that fall into our laps.</p><p>In terms of our brand it’s a mere symbol — a vehicle for a message. And that message is: <strong>we don’t exist without clients and their existing problems</strong>. We don’t exist without others. As soon as the world runs out of problems to solve, Envy Labs closes its doors (and that would be amazing!).</p><p>This might not be an <em>independent</em> identity—it can’t exist apart from other people. But for where Envy Labs is now, it’s perfect. And for the foreseeable future, we don’t want to imagine our purpose divorced from real-world problems.</p><h3>Breaking out of our bubble</h3><p>With this new identity, we aim to be deeply-rooted in culture. To take another page from <a href="https://medium.com/u/8538498fa7a2">Grant McCracken</a>’s metaphorical book:</p><blockquote>We pay dearly if we don’t respond to culture, and we pay dearly when we don’t respond to change.</blockquote><p>A reason why we lost sight of our purpose, for a short time, was we were so enamored with ourselves. We had a good thing going. But the world doesn’t revolve around us, and Envy Labs doesn’t exist without real problems to solve. And we’re aiming to fix that by breaking out of our bubbles.</p><p>Along with this rebrand, we’ve also invested time inventorying what matters most to us. That’s a separate conversation entirely, but here’s a short list of things we care about deeply right now:</p><ul><li>Healthcare</li><li>Education</li><li>Orlando</li><li>Open source software</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*zqmgJskx5SO0Db_43e5fGQ.jpeg" /><figcaption><a href="https://medium.com/u/5f97e18a107a">Nick Walsh</a> and me helping a packed room of students start their careers in May 2017. We’re getting back to what matters: people.</figcaption></figure><p>We’re not content to let the world—and culture—pass us by, and we’re going to be spending a lot less time focusing on what we are / are not, and instead spend more time focusing on others, and how we can or can not help them. We’ll help the ones we can, and do the best to refer the ones we can’t to the right place.</p><p>Envy Labs’ brand and meaning is solving others’ problems.</p><p>So, how can we help you?</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e915a3d64e53" width="1" height="1" alt=""><hr><p><a href="https://medium.com/written-with-envy/envy-labs-2017-rebrand-discovering-meaning-e915a3d64e53">Envy Labs’ 2017 rebrand: discovering meaning</a> was originally published in <a href="https://medium.com/written-with-envy">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[Anger is a powerful, misunderstood force for good]]></title>
            <link>https://medium.com/@drew_powers/why-angry-people-accomplish-the-most-844c437b720?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/844c437b720</guid>
            <category><![CDATA[anger]]></category>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[design-thinking]]></category>
            <category><![CDATA[emotional-intelligence]]></category>
            <category><![CDATA[social-change]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Sat, 28 Oct 2017 12:16:25 GMT</pubDate>
            <atom:updated>2018-01-06T14:08:23.445Z</atom:updated>
            <content:encoded><![CDATA[<h4>…if expressed right. And that’s a huge, ginormous “if.”</h4><p>I grew up in a household with lots of misdirected anger, mostly from my dad. He was generally an angry person. Frequently, that anger would be directed at me, usually in the form of abusive language. Sometimes it was yelling. Sometimes it was undue punishment. Sometimes anger came in a form it took me years to identify: absence (both emotional absence—distracting himself with TV, etc.—and physical absence—leaving the house and spending the whole day with himself).</p><p>Is anger just a blanket statement for “things this person does that I don’t like?” Of course not. In fact, anger—expressed correctly—can be the most powerful force for good (we’ll get to that in a second). But all too often, our experiences with anger are negative. Because it <em>is</em> volatile, and at times, uncontrollable. But again, it bears repeating: <strong>anger can be a powerful force for good when expressed correctly.</strong></p><h3>What is anger?</h3><p>If you asked most people to define anger, you’d get a lot a lot of answers like “the opposite of love.” A typical misunderstanding of anger as it relates to emotions like apathy and affection probably looks something like this graph. On one end, you have “anger” (bad). On the other end, you have “affection” or “love” (good). And somewhere in the middle, you have neutral—not caring. When you try and map this common misconception to good/bad/neutral, you wind up with a spectrum like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VpmWIORmajelHftUQJfafw.png" /><figcaption>Many of us incorrectly think anger and affection are on opposite ends of the same spectrum.</figcaption></figure><p>If we’re honest, a lot of us incorrectly think of anger like this. We all know dramatic people that can be elated one moment, furious the next, and content the next. Or how quickly do our feelings toward a fictional character go from affection to anger when it’s revealed they were a traitor? In those rapid, sudden mood shifts, are we to believe there was somehow an apathetic phase in there we just rushed past? When affection can turn so quickly to hate, and back again, is there a split second of complete apathy in between?</p><p>Unlikely.</p><p>Apathy might be misplaced, then. What happens if we bring two other concepts into the mix: <em>amount of caring</em>, and <em>expectations?</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gfkmhYb0eamuR97b7gAYbw.png" /><figcaption>A fuller picture: the opposite of anger isn’t affection, it’s apathy.</figcaption></figure><p>Affection and anger are both deeply-caring emotions. That’s why they can flip at the drop of a hat. On the extreme opposite end is apathy: simply not caring either way. What completes the picture for us are expectations: our wishes, desires, and opinions on how reality should be, and whether or not that is actually what’s transpiring.</p><p>We get angry at injustice. We get angry at people we love when they hurt themselves. We get angry <em>for</em> people we love when someone harms them. We get angry at ourselves when we fail. In all of those scenarios, <strong>anger is at the intersection of caring and unmet expectations.</strong> Something happened that we wished did not, and we cared deeply about it.</p><p>No one gets angry over something they don’t care about.</p><h4>Wait — aren’t you confusing “anger” and “disappointment?”</h4><p>Disappointment, like anger in this graph, indeed comes from failed expectations about something we care about. But I would postulate the difference between the two is <strong>acceptance</strong>. We’re disappointed by things we wish were different but accept them as they are. We’re angry about things we expected to happen differently, and we can’t accept the outcome.</p><h3>A force for good, you say?</h3><p>What took me a long time to realize—and it came from having conversations with my dad as an adult—was that he had a lot of failed expectations. For his life, for his marriage. His picture of what the world should be was very different than what it actually was. However, he did little to change it, other than find ways to numb his pain.</p><p>Revisiting the statement “anger can be a force for good when expressed correctly,” we can see that all the great social reforms of history came from a place of anger. Anger that the world isn’t as it should be. Anger over evil prospering. Anger over the downtrodden that should be lifted up. Great men and women that called for change in history cared deeply, and were not happy with the state of things.</p><p>They were angry.</p><p>However, that angry energy was often directed into fruitful things: protests, rallies, petitions, speaking engagements, etc. Social reform came from the pain of unmet expectations, but they did something about it, rather than beat their fists and lash out at anything and anyone possible.</p><p>Looking back, many of the people in my life—myself included—cared deeply for something and had expectations broken, but the response usually resulted in no change other than hurting everyone within range. The conditions were there for powerful change. In my dad’s case, I think it was largely self-directed anger at his own failed expectations for his life. But rather than use that as an energy to change himself, or help others not make the same mistakes he did, he chose to lash out and hurt those that didn’t deserve it.</p><p>Few people would describe me as “angry;” In person I’m generally deadpan, even-keel, and don’t raise my voice. But I get angry very frequently. I’m not intimidating. I don’t rage. I’m not seething on the inside. But several times throughout the week (my wife can attest to this), I get pretty angry about something about the world that isn’t right. While I’m nothing close to a social reformer, people would describe me as productive and driven. What I really seek is change within my household and my community, and that takes many forms.</p><p>Realizing when we’re upset about some part of reality—whether that’s the world around us, or something inside—the only response that benefits anybody is making steps to change it. It’s OK if you do this while angry. So long as you’re kind and dignifying (that’s the important part!) to everyone around you, anger can be the catalyst for immense good in this world.</p><p>Get angry. So you don’t have to be anymore.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=844c437b720" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[All the answers to the “Should designers code?” question]]></title>
            <link>https://medium.com/written-with-envy/all-the-answers-to-the-should-designers-code-question-e86a12fc3ed0?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/e86a12fc3ed0</guid>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[startup-lessons]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Wed, 11 Oct 2017 17:12:28 GMT</pubDate>
            <atom:updated>2017-10-11T17:16:08.215Z</atom:updated>
            <content:encoded><![CDATA[<h4>The eternal war rages on</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dNJZuxSBt-ofAXgGJYtRRQ.png" /></figure><p>Too lazy to compile a list of different opinions on the debate? Don’t worry! I’ve compiled them for you:</p><h3>Yes</h3><ol><li><a href="https://www.wired.com/2017/03/john-maeda-want-survive-design-better-learn-code/">John Maeda: if you want to survive in design, you better learn to code</a></li><li><a href="https://medium.com/learning-xcode-as-a-designer/designers-code-differently-e163a354d6cc">Designers Code Differently</a></li><li><a href="https://blog.central.team/design-code-e18dfc061517">Design ♡ Code</a></li><li><a href="https://medium.com/@l_lysakowski/design-is-lifelong-learning-f0ba801059d6">Design is Lifelong Learning</a></li><li><a href="https://medium.com/@sagishrieber/why-designers-should-not-code-anymore-5fc3f7d5510d-">Why designers should not code…anymore</a></li><li><a href="https://medium.com/coding-design/im-a-designer-should-i-code-4b8af9121b7f">I’m a designer. Should I code?</a></li><li><a href="https://blog.prototypr.io/designers-should-just-crap-something-out-and-expect-the-engineers-to-make-it-work-68228a7353f9">Should designers just put something out and expect the engineers to make it work?</a></li><li><a href="https://medium.com/seed-digital/designers-should-write-content-code-study-business-other-things-people-say-6cf34968bb5f">Designers should write content, code, study business &amp; other things people say</a></li><li><a href="https://uxdesign.cc/designers-who-code-for-real-learn-for-real-8c0efff7c474">Designers Who Code For Real Learn For Real</a></li><li><a href="https://uxdesign.cc/if-youre-not-a-software-designer-who-code-heres-why-you-should-start-now-e4a33af631b6">If you’re not a Software Designer who codes, here’s why you should start now</a></li><li><a href="https://blog.prototypr.io/should-designers-code-f3c5eea85841">Should Designers Code?</a></li><li><a href="https://medium.com/@AzraelGroup/should-designers-code-66f710fa6c7b">Should Designers Code?</a></li><li><a href="https://thenextweb.com/contributors/2017/09/23/designers-code-no-seriously-though/?ref=webdesignernews.com#.tnw_LiLiUpyR">Why designers should learn to code—or at least consider it</a></li><li><a href="https://spin.atomicobject.com/2017/09/26/should-ux-ui-designers-code/">Should UX/UI Designers Code? Finding a Balance Between Yes and No</a> (<em>editor’s note: counting it as a “yes” because it advocates understanding code)</em></li></ol><h3>No</h3><ol><li><a href="https://medium.muz.li/should-designers-code-or-should-developers-design-23e480c6700a">Should designers code… or should developers design?</a></li><li><a href="https://medium.com/@MrAlanCooper/should-designers-code-f7b745b8cd03">Should designers code?</a></li><li><a href="https://medium.com/@SethCoelen/should-designers-code-the-final-word-e7262031d3d6">“Should Designers Code?” — The final Word</a> (<em>editor’s note: it wasn’t)</em></li><li><a href="https://medium.com/@buzzusborne/the-intersection-ba071f99d9d4">The Intersection</a></li><li><a href="https://medium.com/@realscottmcleod/product-designers-should-say-fuck-you-to-being-forced-to-code-575990a248d9">Product designers should say f*ck you to being forced to code</a></li><li><a href="https://medium.com/@joshuantaylor/designers-shouldn-t-code-they-should-study-business-dc3e7e203d39">Designers shouldn’t code. They should study business.</a></li><li><a href="https://uxplanet.org/faq-do-ux-designers-need-to-know-programming-and-computer-science-48b1f2bd62f6">FAQ: Do UX Designers Need to Know Programming and Computer Science?</a></li><li><a href="https://www.uxpin.com/studio/blog/should-designers-code/">Should Designers Code?</a></li><li><a href="http://hackingui.com/design/why-designers-should-not-code/">Why designers should stop coding (written by a 🦄)</a></li></ol><h3>I smartly avoid the question don’t you feel silly now</h3><ol><li><a href="https://medium.com/@movito/https-mobile-twitter-com-cennydd-status-636788432229003264-71b6c2d7166">Breaking the “Should Designers Code” Deadlock</a></li><li><a href="https://medium.com/the-design-of-things/just-say-no-to-unicorns-e0af4a52fed8">Just Say No to </a><a href="http://hackingui.com/design/why-designers-should-not-code/">🦄</a><a href="https://medium.com/the-design-of-things/just-say-no-to-unicorns-e0af4a52fed8">s</a></li><li><a href="http://Death to the ‘designers should code’ argument.">Death to the ‘designers should code’ argument</a></li><li><a href="https://medium.com/@coderacademy/should-designers-learn-to-code-1553d23f6e00">Should designers learn to code?</a></li><li><a href="https://medium.com/@KayceeAcollins/should-designers-code-d9669bbc447c">Should designers code?</a></li><li><a href="https://medium.com/@ianbellomy/better-questions-to-ask-than-should-designers-code-7addb226ef8a">Better questions to ask than “should designers ‘code’?”</a> <em>(editor’s note: such as “why is ‘code’ in quotes?”?)</em></li><li><a href="https://www.thoughtworks.com/insights/blog/should-designers-code">Should Designers Code?</a></li></ol><h3>IDK give us money</h3><ol><li><a href="https://uxplanet.org/should-designers-code-the-definitive-answer-7564b92a066">Should designers code? The definitive answer.</a></li><li><a href="https://blog.animaapp.com/should-designers-code-efbbe84378a6">Should Designers Code?</a></li></ol><h3>You should learn Shaolin Kung Fu</h3><ol><li><a href="https://medium.com/hackingui/should-designers-learn-code-a-martial-artist-s-approach-b15ae9f1a695">Should Designers Learn Code? — a Martial Artist’s Approach</a></li></ol><p>Hopefully this has cleared things up and settled the debate once and for all: <em>designers should learn Shaolin Kung Fu</em>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e86a12fc3ed0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/written-with-envy/all-the-answers-to-the-should-designers-code-question-e86a12fc3ed0">All the answers to the “Should designers code?” question</a> was originally published in <a href="https://medium.com/written-with-envy">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[Dribbble is a painkiller, not a vitamin]]></title>
            <link>https://medium.com/written-with-envy/dribbble-is-a-painkiller-not-a-vitamin-68cc26f2fc71?source=rss-1c7ae9d3f01------2</link>
            <guid isPermaLink="false">https://medium.com/p/68cc26f2fc71</guid>
            <category><![CDATA[design]]></category>
            <category><![CDATA[digital-design]]></category>
            <category><![CDATA[design-thinking]]></category>
            <category><![CDATA[graphic-design]]></category>
            <category><![CDATA[inspiration]]></category>
            <dc:creator><![CDATA[Drew Powers]]></dc:creator>
            <pubDate>Mon, 07 Aug 2017 12:10:37 GMT</pubDate>
            <atom:updated>2017-08-11T12:04:00.546Z</atom:updated>
            <content:encoded><![CDATA[<h4>How instant gratification can curb growth</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*oS-G7aAlZ6Ot6lHGbGWk5g.gif" /></figure><p>This year, a major focus for me has been to grow as a designer, and I’m writing this to myself as much as to other designers I’ve interacted with and mentored.</p><p>Many of us within the design community (especially younger designers) have fooled ourselves into thinking we’re growing when we’re not. Though this behavior manifests itself in myriad ways, it’s most clearly manifested itself on <a href="https://dribbble.com/">Dribbble</a>, the popular designer showcase. And to be clear, it’s not Dribbble the platform that’s the problem, nor do I think its founders intended this. I love Dribbble, and think it’s a net gain for the design community at large. But for all of us it’s easy to get sucked into that false measure of quantitative growth Dribbble provides with likes and comments. We’ll this bad pattern of thinking “painkiller thinking.”</p><h3>On Painkillers</h3><p>The painkiller–vitamin metaphor has made the rounds in business circles, but I heard it the first time watching an episode of Apple’s app-themed game show <em>Planet of the Apps</em> (I know, I know—the show is super cheesy, but it has its moments). On one episode, one of the VC investors had the following to say about a product he was skeptical of:</p><blockquote>A vitamin is something you should be doing every day, and it has a diffused benefit over time. In our experience as Venture Capitalists, we’ve found it’s much, much harder for products that feel like vitamins to reach scale and be successful than products which are more like painkillers: where the user is grasping for any solution<strong>, right away</strong>, because they have a burning, pressing headache of some sort.</blockquote><p>Someone pitched a “vitamin” idea when he was gunning for a “painkiller” idea. Painkillers sell. Quick, effortless results sell. <strong>People want their problem solved instantly,</strong> and money follows desires.</p><p>Dribbble, for most people, is a five-minute experience. Pop it open, like some shots, close it. Maybe if you’re doing research, you’ll even spend <em>fifteen</em> minutes collecting shots into a bucket. But you can only use Dribbble for reference when you’re creating visuals solely for 30-and-unders that pull from popular design styles of the last few years. Oh, and make sure you steer clear of all the <a href="https://uxdesign.cc/dribbble-and-the-creation-of-the-useless-designer-3caf85805fa">useless designs that can exist nowhere else other than Dribbble itself</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BtE1a8kFQwKnSQpdTcqx4w.jpeg" /><figcaption>409 likes, almost 10,000 views, but this unusable “credit card UI” shot should probably NEVER be implemented into any sane website. It exists for Dribbble, and Dribbble only.</figcaption></figure><p>Essentially, relying on Dribbble is the same as eating Cheetos™ instead of veggies. Great as a snack; horrible for three meals a day. It makes the bad hungry feel go away, but doesn’t leave you with many nutrients.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Cv9Q3CbgOkC9zdBfB-QCVw.jpeg" /><figcaption>Dribbble, basically. © <a href="https://twitter.com/shenanigansen">Owlturd</a></figcaption></figure><p>Dribbble is designed to give you that instant relief: it tricks you into thinking you’re growing and becoming a better designer in five minutes. But really all it did was stave your appetite for growth.</p><p>If you’re carefully monitoring your own thoughts at this point, you’re probably thinking “Yeah, yeah, OK. I get it. Dribbble is bad. What’s ‘good’ so I can agree or disagree with you and move on?”</p><p>If you’re thinking this way, <em>you’re still looking for that painkiller—</em>that easy, quick solution. Stop seeking out painkillers, switch to everyday vitamins, and you’ll see great results <em>in six-to-twelve months</em>.</p><h3>On Vitamins</h3><p>So what does this “everyday” behavior look like? One example that came to my mind is Tobias Frere-Jones, designer of the <em>Gotham </em>typeface as well as many others you’ve probably used before (<em>Whitney</em>, <em>Archer</em>, <em>Interstate…</em>).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*RzUjDq4hNog3e4Nszc0rdA.png" /><figcaption>“Use Gotham.” It never fails! © Fuzzco, <a href="http://pocketartdirector.com/">http://pocketartdirector.com/</a></figcaption></figure><p>In 2015, Tobias gave a talk on bank note design. More specifically, the hundreds of minute security details printers hid in their banknotes to detect counterfeits (it goes way deeper than the “hold up to the light” trick):</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FdfbC_r76V1o%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DdfbC_r76V1o&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FdfbC_r76V1o%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/5cb29b85066ba0370dc12b20c41a2ee1/href">https://medium.com/media/5cb29b85066ba0370dc12b20c41a2ee1/href</a></iframe><p>Behind that talk was years and years of research, and along the way, Tobias collected sample after sample after sample, initially to scratch a personal itch. His collection isn’t available online other than the <a href="https://frerejones.com/blog?tag=Collections">samples he’s scanned for his blog</a>, and I’m not sure just how large it is, but judging from him describing himself as a “<a href="https://www.youtube.com/watch?v=TGVamkuQXl4">pack rat</a>,” and the obscene amount of niche references he drops on a regular basis, I’m going to guess <em>a lot</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*4QUWe6pfvfjfyJfe7wysOA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*LbU5q57EATz000RGxEuBMw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*I4veAdFW80cORKD1tSCe6g.jpeg" /><figcaption>Just a few examples of Tobias’ personal bank note collection that inspired the talk © Tobias Frere-Jones (<a href="https://frerejones.com/blog/from-the-collection-010">view more here</a>)</figcaption></figure><p>I want you to imagine the work it takes to build your own personal archive of design samples that have never been scanned and put online. Imagine traveling around the country to build your collection. Imagine the hours of digging through libraries’ flat files. Calling up historians on the phone. Calling someone <em>after</em> calling someone. Would you still do it if you got no immediate feedback? What if you couldn’t make a Dribbble shot, or viral tweet after every sample you found?</p><p>For Tobias, at least, the possibility of <em>not</em> hoarding all this ephemera wouldn’t even cross his mind. Because he’s not motivated by what will yield instant gratification, he’s seeking after what will yield slow, long-term growth. And he isn’t the only one building his own collection—this is a shared secret among many great designers, from <a href="http://lubalincenter.cooper.edu/">Herb Lubalin</a> and Paula Scher, to <a href="https://www.pinterest.com/TadCarpenter/retro-pop/">Tad Carpenter</a>, <a href="http://allanpeters.com/category/badge-hunting/">Allan Peters</a>, and Aaron Draplin—all have their own personal collections they’ve amassed, in secret, to no other end than their personal growth.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FzOPA0NaeTBk%3Fstart%3D40%26feature%3Doembed%26start%3D40&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DzOPA0NaeTBk&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FzOPA0NaeTBk%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/6b490b2359551e404156abc0a8120b76/href">https://medium.com/media/6b490b2359551e404156abc0a8120b76/href</a></iframe><blockquote>I am surrounded by tons and tons of things. And I’ve had to go dig it up in the deadest, weirdest places. Places where you have to talk to people, and other sketchy stuff like that.</blockquote><blockquote>— Aaron Draplin</blockquote><p>For all these designers, they know the true value in digging deep for obscure references yields the strongest, most informed work they can possibly produce. They don’t limit themselves to simply rehashing other designers and what’s popular; they pull from anything they can get their hands on. There’s a chasm of difference between the two.</p><p>That daily investment for long-term growth doesn’t always have to take the form of amassing a personal collection (though that never hurts)! Reading, studying, going to conferences, and finding a mentor yield the same effect so long as you are investing <a href="http://www.businessinsider.com/new-study-destroys-malcolm-gladwells-10000-rule-2014-7">quality time</a> into something, daily.</p><h3>Next Steps: Experiment, fail. Repeat.</h3><p>If you’re already doing most of these things, then this article wasn’t written for you. But if you’re lured by the temptation of measuring your growth with likes, you’re looking for painkillers to ease the pain of growth. Dribbble is like a cookie: a wonderful snack but awful as your only sustenance. Imagine this is your design mom talking: <em>eat some veggies for once, and quit eating those pink heart cookies three meals a day</em>.</p><p>So what does that look like? Here are some starting suggestions:</p><ul><li>Reading <a href="https://www.amazon.com/Meggs-History-Graphic-Design-Philip/dp/1118772059/ref=sr_1_1?ie=UTF8&amp;qid=1501169587&amp;sr=8-1&amp;keywords=meggs+history+of+graphic+design"><em>Meggs’ History of Graphic Design</em></a>. Yes it’s $60, and yes, it’ll be the best $60 you ever spent. How can you justify what you’re doing in 20XX if you have no clue what led up until now?</li><li>Reading books from your design heroes. <a href="https://www.amazon.com/Thoughts-Design-Paul-Rand/dp/081187544X/"><em>Thoughts on Design</em></a> by Paul Rand. <a href="https://www.amazon.com/Make-Bigger-Paula-Scher/dp/1568985487/"><em>Make it Bigger</em></a> by Paula Scher. <a href="https://www.amazon.com/Things-have-learned-life-Updated/dp/141970964X/"><em>Things I Have Learned in My Life So Far</em></a> by Stefan Sagmeister.</li><li><a href="https://www.youtube.com/watch?v=S7l0mIlzx_I"><strong>Learning. To. Draw.</strong></a></li><li>Making a spreadsheet of <em>every typeface from independent foundries</em> (I believe what you heard was “a lot of typefaces.” I said “every typeface from independent foundries”), like <a href="https://twitter.com/kupfers/status/170652173435285504">Indra Kupferschmidt</a>, a professional typographer, does. Pull from <a href="http://typographica.org/category/typeface-reviews/">Typographica</a>, <a href="https://fontsinuse.com/">Fonts In Use</a>, and <a href="https://blog.madewithenvy.com/check-out-these-foundries-for-new-fonts-75c0b9c07945">my personal foundry shortlist</a>, if you don’t know where to start.</li><li>Collecting items from archive sites like <a href="http://archive.org/">Archive.org</a> and <a href="https://fontsinuse.com/">Fonts In Use</a>. Both are ephemera goldmines from everything from <a href="https://fontsinuse.com/tags/401/1980s">’80s imagery</a> to <a href="https://archive.org/details/studebaker_owners_manual_1956">mid-century car manuals</a> (hint: you can use Archive.org’s <a href="https://archive.org/advancedsearch.php">advanced search</a> to narrow by date, and on Fonts In Use you can search for “1980s,” etc.).</li><li>Study <a href="https://www.youtube.com/watch?v=jGc-K7giqKM">film</a>, <a href="https://ridwankhan.com/the-ui-and-ux-of-persona-5-183180eb7cce">game</a> <a href="https://www.youtube.com/watch?v=8FpigqfcvlM">design</a>, or <a href="https://www.amazon.com/Street-Journal-Guide-Information-Graphics/dp/0393347281">data visualization</a>.</li></ul><p>This should open the pathway to something like Tobias Frere-Jones’ bank notes collecting habit mentioned earlier. Start your own habit! The very thing you might need most for your personal growth looking is probably lurking in some place nobody could have ever pointed you to (not even a Medium article)—<strong>some place deep, and dark, and remote; a place only aimless wandering could have reached</strong>. Somewhere “likes” can never reach you.</p><p>To get to that place involves failure<strong>.</strong> <em>Daily </em>failure. But it’s when you’re most uncertain about your current experiment that you find exactly where you needed to be all along.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fdx2cI-2FJRs%3Fstart%3D169%26feature%3Doembed%26start%3D169&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Ddx2cI-2FJRs&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fdx2cI-2FJRs%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/a8fb8c8ab6fafe5b330f25ddf829c925/href">https://medium.com/media/a8fb8c8ab6fafe5b330f25ddf829c925/href</a></iframe><blockquote>Failure is a big part of success. … You’re gonna run a lot of stuff, and it’s going to go nowhere. And you should be happy about that. If you’re doing that, you’re doing it right. If you’re not failing all the time, you’re not creating a situation where you can get super lucky. … You don’t want to be making mediocre stuff. That’s not why anybody wants to get into this.</blockquote><blockquote>— Ira Glass</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=68cc26f2fc71" width="1" height="1" alt=""><hr><p><a href="https://medium.com/written-with-envy/dribbble-is-a-painkiller-not-a-vitamin-68cc26f2fc71">Dribbble is a painkiller, not a vitamin</a> was originally published in <a href="https://medium.com/written-with-envy">Insightful Software</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>