es

✚ Tornado Lines – Useful or Not? (The Process 088)

It looks like a tornado. It's messy. It's circular. It almost looks intentionally confusing. But how bad is it really?

Tags: ,




es

Famous Hope Quotes as Charts

I thought we (i.e. me) could use a break, so I made these abstract charts to represent the most popular quotes about hope.

Tags: ,




es

How to Foster Real-Time Client Engagement During Moderated Research

When we conduct moderated research, like user interviews or usability tests, for our clients, we encourage them to observe as many sessions as possible. We find when clients see us interview their users, and get real-time responses, they’re able to learn about the needs of their users in real-time and be more active participants in the process. One way we help clients feel engaged with the process during remote sessions is to establish a real-time communication backchannel that empowers clients to flag responses they’d like to dig into further and to share their ideas for follow-up questions.

There are several benefits to establishing a communication backchannel for moderated sessions:

  • Everyone on the team, including both internal and client team members, can be actively involved throughout the data collection process rather than waiting to passively consume findings.
  • Team members can identify follow-up questions in real-time which allows the moderator to incorporate those questions during the current session, rather than just considering them for future sessions.
  • Subject matter experts can identify more detailed and specific follow-up questions that the moderator may not think to ask.
  • Even though the whole team is engaged, a single moderator still maintains control over the conversation which creates a consistent experience for the participant.

If you’re interested in creating your own backchannel, here are some tips to make the process work smoothly:

  • Use the chat tool that is already being used on the project. In most cases, we use a joint Slack workspace for the session backchannel but we’ve also used Microsoft Teams.
  • Create a dedicated channel like #moderated-sessions. Conversation in this channel should be limited to backchannel discussions during sessions. This keeps the communication consolidated and makes it easier for the moderator to stay focused during the session.
  • Keep communication limited. Channel participants should ask basic questions that are easy to consume quickly. Supplemental commentary and analysis should not take place in the dedicated channel.
  • Use emoji responses. The moderator can add a quick thumbs up to indicate that they’ve seen a question.

Introducing backchannels for communication during remote moderated sessions has been a beneficial change to our research process. It not only provides an easy way for clients to stay engaged during the data collection process but also increases the moderator’s ability to focus on the most important topics and to ask the most useful follow-up questions.




es

Markdown Comes Alive! Part 1, Basic Editor

In my last post, I covered what LiveView is at a high level. In this series, we’re going to dive deeper and implement a LiveView powered Markdown editor called Frampton. This series assumes you have some familiarity with Phoenix and Elixir, including having them set up locally. Check out Elizabeth’s three-part series on getting started with Phoenix for a refresher.

This series has a companion repository published on GitHub. Get started by cloning it down and switching to the starter branch. You can see the completed application on master. Our goal today is to make a Markdown editor, which allows a user to enter Markdown text on a page and see it rendered as HTML next to it in real-time. We’ll make use of LiveView for the interaction and the Earmark package for rendering Markdown. The starter branch provides some styles and installs LiveView.

Rendering Markdown

Let’s set aside the LiveView portion and start with our data structures and the functions that operate on them. To begin, a Post will have a body, which holds the rendered HTML string, and title. A string of markdown can be turned into HTML by calling Post.render(post, markdown). I think that just about covers it!

First, let’s define our struct in lib/frampton/post.ex:

defmodule Frampton.Post do
  defstruct body: "", title: ""

  def render(%__MODULE{} = post, markdown) do
    # Fill me in!
  end
end

Now the failing test (in test/frampton/post_test.exs):

describe "render/2" do
  test "returns our post with the body set" do
    markdown = "# Hello world!"                                                                                                                 
    assert Post.render(%Post{}, markdown) == {:ok, %Post{body: "<h1>Hello World</h1>
"}}
  end
end

Our render method will just be a wrapper around Earmark.as_html!/2 that puts the result into the body of the post. Add {:earmark, "~> 1.4.3"} to your deps in mix.exs, run mix deps.get and fill out render function:

def render(%__MODULE{} = post, markdown) do
  html = Earmark.as_html!(markdown)
  {:ok, Map.put(post, :body, html)}
end

Our test should now pass, and we can render posts! [Note: we’re using the as_html! method, which prints error messages instead of passing them back to the user. A smarter version of this would handle any errors and show them to the user. I leave that as an exercise for the reader…] Time to play around with this in an IEx prompt (run iex -S mix in your terminal):

iex(1)> alias Frampton.Post
Frampton.Post
iex(2)> post = %Post{}
%Frampton.Post{body: "", title: ""}
iex(3)> {:ok, updated_post} = Post.render(post, "# Hello world!")
{:ok, %Frampton.Post{body: "<h1>Hello world!</h1>
", title: ""}}
iex(4)> updated_post
%Frampton.Post{body: "<h1>Hello world!</h1>
", title: ""}

Great! That’s exactly what we’d expect. You can find the final code for this in the render_post branch.

LiveView Editor

Now for the fun part: Editing this live!

First, we’ll need a route for the editor to live at: /editor sounds good to me. LiveViews can be rendered from a controller, or directly in the router. We don’t have any initial state, so let's go straight from a router.

First, let's put up a minimal test. In test/frampton_web/live/editor_live_test.exs:

defmodule FramptonWeb.EditorLiveTest do
  use FramptonWeb.ConnCase
  import Phoenix.LiveViewTest

  test "the editor renders" do
    conn = get(build_conn(), "/editor")
    assert html_response(conn, 200) =~ "data-test="editor""
  end
end

This test doesn’t do much yet, but notice that it isn’t live view specific. Our first render is just the same as any other controller test we’d write. The page’s content is there right from the beginning, without the need to parse JavaScript or make API calls back to the server. Nice.

To make that test pass, add a route to lib/frampton_web/router.ex. First, we import the LiveView code, then we render our Editor:

import Phoenix.LiveView.Router
# … Code skipped ...
# Inside of `scope "/"`:
live "/editor", EditorLive

Now place a minimal EditorLive module, in lib/frampton_web/live/editor_live.ex:

defmodule FramptonWeb.EditorLive do
  use Phoenix.LiveView

  def render(assigns) do
    ~L"""
      <div data-test=”editor”>
        <h1>Hello world!</h1>
      </div>
      """
  end

  def mount(_params, _session, socket) do
    {:ok, socket}
  end
end

And we have a passing test suite! The ~L sigil designates that LiveView should track changes to the content inside. We could keep all of our markup in this render/1 method, but let’s break it out into its own template for demonstration purposes.

Move the contents of render into lib/frampton_web/templates/editor/show.html.leex, and replace EditorLive.render/1 with this one liner: def render(assigns), do: FramptonWeb.EditorView.render("show.html", assigns). And finally, make an EditorView module in lib/frampton_web/views/editor_view.ex:

defmodule FramptonWeb.EditorView do
  use FramptonWeb, :view
  import Phoenix.LiveView
end

Our test should now be passing, and we’ve got a nicely separated out template, view and “live” server. We can keep markup in the template, helper functions in the view, and reactive code on the server. Now let’s move forward to actually render some posts!

Handling User Input

We’ve got four tasks to accomplish before we are done:

  1. Take markdown input from the textarea
  2. Send that input to the LiveServer
  3. Turn that raw markdown into HTML
  4. Return the rendered HTML to the page.

Event binding

To start with, we need to annotate our textarea with an event binding. This tells the liveview.js framework to forward DOM events to the server, using our liveview channel. Open up lib/frampton_web/templates/editor/show.html.leex and annotate our textarea:

<textarea phx-keyup="render_post"></textarea>

This names the event (render_post) and sends it on each keyup. Let’s crack open our web inspector and look at the web socket traffic. Using Chrome, open the developer tools, navigate to the network tab and click WS. In development you’ll see two socket connections: one is Phoenix LiveReload, which polls your filesystem and reloads pages appropriately. The second one is our LiveView connection. If you let it sit for a while, you’ll see that it's emitting a “heartbeat” call. If your server is running, you’ll see that it responds with an “ok” message. This lets LiveView clients know when they've lost connection to the server and respond appropriately.

Now, type some text and watch as it sends down each keystroke. However, you’ll also notice that the server responds with a “phx_error” message and wipes out our entered text. That's because our server doesn’t know how to handle the event yet and is throwing an error. Let's fix that next.

Event handling

We’ll catch the event in our EditorLive module. The LiveView behavior defines a handle_event/3 callback that we need to implement. Open up lib/frampton_web/live/editor_live.ex and key in a basic implementation that lets us catch events:

def handle_event("render_post", params, socket) do
  IO.inspect(params)

  {:noreply, socket}
end

The first argument is the name we gave to our event in the template, the second is the data from that event, and finally the socket we’re currently talking through. Give it a try, typing in a few characters. Look at your running server and you should see a stream of events that look something like this:

There’s our keystrokes! Next, let’s pull out that value and use it to render HTML.

Rendering Markdown

Lets adjust our handle_event to pattern match out the value of the textarea:

def handle_event("render_post", %{"value" => raw}, socket) do

Now that we’ve got the raw markdown string, turning it into HTML is easy thanks to the work we did earlier in our Post module. Fill out the body of the function like this:

{:ok, post} = Post.render(%Post{}, raw)
IO.inspect(post)

If you type into the textarea you should see output that looks something like this:

Perfect! Lastly, it’s time to send that rendered html back to the page.

Returning HTML to the page

In a LiveView template, we can identify bits of dynamic data that will change over time. When they change, LiveView will compare what has changed and send over a diff. In our case, the dynamic content is the post body.

Open up show.html.leex again and modify it like so:

<div class="rendered-output">
  <%= @post.body %>
</div>

Refresh the page and see:

Whoops!

The @post variable will only be available after we put it into the socket’s assigns. Let’s initialize it with a blank post. Open editor_live.ex and modify our mount/3 function:

def mount(_params, _session, socket) do
  post = %Post{}
  {:ok, assign(socket, post: post)}
end

In the future, we could retrieve this from some kind of storage, but for now, let's just create a new one each time the page refreshes. Finally, we need to update the Post struct with user input. Update our event handler like this:

def handle_event("render_post", %{"value" => raw}, %{assigns: %{post: post}} = socket) do
  {:ok, post} = Post.render(post, raw)
  {:noreply, assign(socket, post: post)
end

Let's load up http://localhost:4000/editor and see it in action.

Nope, that's not quite right! Phoenix won’t render this as HTML because it’s unsafe user input. We can get around this (very good and useful) security feature by wrapping our content in a raw/1 call. We don’t have a database and user processes are isolated from each other by Elixir. The worst thing a malicious user could do would be crash their own session, which doesn’t bother me one bit.

Check the edit_posts branch for the final version.

Conclusion

That’s a good place to stop for today. We’ve accomplished a lot! We’ve got a dynamically rendering editor that takes user input, processes it and updates the page. And we haven’t written any JavaScript, which means we don’t have to maintain or update any JavaScript. Our server code is built on the rock-solid foundation of the BEAM virtual machine, giving us a great deal of confidence in its reliability and resilience.

In the next post, we’ll tackle making a shared editor, allowing multiple users to edit the same post. This project will highlight Elixir’s concurrency capabilities and demonstrate how LiveView builds on them to enable some incredible user experiences.



  • Code
  • Back-end Engineering

es

Committed to the wrong branch? -, @{upstream}, and @{-1} to the rescue

I get into this situation sometimes. Maybe you do too. I merge feature work into a branch used to collect features, and then continue development but on that branch instead of back on the feature branch

git checkout feature
# ... bunch of feature commits ...
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# deploy qa-environment to the QA remote environment
# ... more feature commits ...
# oh. I'm not committing in the feature branch like I should be

and have to move those commits to the feature branch they belong in and take them out of the throwaway accumulator branch

git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

Maybe you prefer

git branch -D qa-environment
git checkout qa-environment

over

git checkout qa-environment
git reset --hard origin/qa-environment

Either way, that works. But it'd be nicer if we didn't have to type or even remember the branches' names and the remote's name. They are what is keeping this from being a context-independent string of commands you run any time this mistake happens. That's what we're going to solve here.

Shorthands for longevity

I like to use all possible natively supported shorthands. There are two broad motivations for that.

  1. Fingers have a limited number of movements in them. Save as many as possible left late in life.
  2. Current research suggests that multitasking has detrimental effects on memory. Development tends to be very heavy on multitasking. Maybe relieving some of the pressure on quick-access short term memory (like knowing all relevant branch names) add up to leave a healthier memory down the line.

First up for our scenario: the - shorthand, which refers to the previously checked out branch. There are a few places we can't use it, but it helps a lot:

Bash
# USING -

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit -        # ????
git push
# hack hack hack
# whoops
git checkout -        # now on feature ???? 
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout - # now on qa-environment ????
git reset --hard origin/qa-environment
git merge --no-ff --no-edit -        # ????
git checkout -                       # ????
# on feature and ready for more feature commits
Bash
# ORIGINAL

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# hack hack hack
# whoops
git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

We cannot use - when cherry-picking a range

> git cherry-pick origin/-..-
fatal: bad revision 'origin/-..-'

> git cherry-pick origin/qa-environment..-
fatal: bad revision 'origin/qa-environment..-'

and even if we could we'd still have provide the remote's name (here, origin).

That shorthand doesn't apply in the later reset --hard command, and we cannot use it in the branch -D && checkout approach either. branch -D does not support the - shorthand and once the branch is deleted checkout can't reach it with -:

# assuming that branch-a has an upstream origin/branch-a
> git checkout branch-a
> git checkout branch-b
> git checkout -
> git branch -D -
error: branch '-' not found.
> git branch -D branch-a
> git checkout -
error: pathspec '-' did not match any file(s) known to git

So we have to remember the remote's name (we know it's origin because we are devoting memory space to knowing that this isn't one of those times it's something else), the remote tracking branch's name, the local branch's name, and we're typing those all out. No good! Let's figure out some shorthands.

@{-<n>} is hard to say but easy to fall in love with

We can do a little better by using @{-<n>} (you'll also sometimes see it referred to be the older @{-N}). It is a special construct for referring to the nth previously checked out ref.

> git checkout branch-a
> git checkout branch-b
> git rev-parse --abbrev-rev @{-1} # the name of the previously checked out branch
branch-a
> git checkout branch-c
> git rev-parse --abbrev-rev @{-2} # the name of branch checked out before the previously checked out one
branch-a

Back in our scenario, we're on qa-environment, we switch to feature, and then want to refer to qa-environment. That's @{-1}! So instead of

git cherry-pick origin/qa-environment..qa-environment

We can do

git cherry-pick origin/qa-environment..@{-1}

Here's where we are (🎉 marks wins from -, 💥 marks the win from @{-1})

Bash
# USING - AND @{-1}

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit -                # ????
git push
# hack hack hack
# whoops
git checkout -                               # ????
git cherry-pick origin/qa-environment..@{-1} # ????
git push
git checkout -                               # ????
git reset --hard origin/qa-environment
git merge --no-ff --no-edit -                # ????
git checkout -                               # ????
# ready for more feature commits
Bash
# ORIGINAL

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# hack hack hack
# whoops
git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

One down, two to go: we're still relying on memory for the remote's name and the remote branch's name and we're still typing both out in full. Can we replace those with generic shorthands?

@{-1} is the ref itself, not the ref's name, we can't do

> git cherry-pick origin/@{-1}..@{-1}
origin/@{-1}
fatal: ambiguous argument 'origin/@{-1}': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

because there is no branch origin/@{-1}. For the same reason, @{-1} does not give us a generalized shorthand for the scenario's later git reset --hard origin/qa-environment command.

But good news!

Do @{u} @{push}

@{upstream} or its shorthand @{u} is the remote branch a that would be pulled from if git pull were run. @{push} is the remote branch that would be pushed to if git push was run.

> git checkout branch-a
Switched to branch 'branch-a'
Your branch is ahead of 'origin/branch-a' by 3 commits.
  (use "git push" to publish your local commits)
> git reset --hard origin/branch-a
HEAD is now at <the SHA origin/branch-a is at>

we can

> git checkout branch-a
Switched to branch 'branch-a'
Your branch is ahead of 'origin/branch-a' by 3 commits.
  (use "git push" to publish your local commits)
> git reset --hard @{u}                                # <-- So Cool!
HEAD is now at <the SHA origin/branch-a is at>

Tacking either onto a branch name will give that branch's @{upstream} or @{push}. For example

git checkout branch-a@{u}

is the branch branch-a pulls from.

In the common workflow where a branch pulls from and pushes to the same branch, @{upstream} and @{push} will be the same, leaving @{u} as preferable for its terseness. @{push} shines in triangular workflows where you pull from one remote and push to another (see the external links below).

Going back to our scenario, it means short, portable commands with a minimum human memory footprint. (🎉 marks wins from -, 💥 marks the win from @{-1}, 😎 marks the wins from @{u}.)

Bash
# USING - AND @{-1} AND @{u}

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit -    # ????
git push
# hack hack hack
# whoops
git checkout -                   # ????
git cherry-pick @{-1}@{u}..@{-1} # ????????
git push
git checkout -                   # ????
git reset --hard @{u}            # ????
git merge --no-ff --no-edit -    # ????
git checkout -                   # ????
# ready for more feature commits
Bash
# ORIGINAL

git checkout feature
# hack hack hack
git push
git checkout qa-environment
git merge --no-ff --no-edit feature
git push
# hack hack hack
# whoops
git checkout feature
git cherry-pick origin/qa-environment..qa-environment
git push
git checkout qa-environment
git reset --hard origin/qa-environment
git merge --no-ff --no-edit feature
git checkout feature
# ready for more feature commits

Make the things you repeat the easiest to do

Because these commands are generalized, we can run some series of them once, maybe

git checkout - && git reset --hard @{u} && git checkout -

or

git checkout - && git cherry-pick @{-1}@{u}.. @{-1} && git checkout - && git reset --hard @{u} && git checkout -

and then those will be in the shell history just waiting to be retrieved and run again the next time, whether with CtrlR incremental search or history substring searching bound to the up arrow or however your interactive shell is configured. Or make it an alias, or even better an abbreviation if your interactive shell supports them. Save the body wear and tear, give memory a break, and level up in Git.

And keep going

The GitHub blog has a good primer on triangular workflows and how they can polish your process of contributing to external projects.

The FreeBSD Wiki has a more in-depth article on triangular workflow process (though it doesn't know about @{push} and @{upstream}).

The construct @{-<n>} and the suffixes @{push} and @{upstream} are all part of the gitrevisions spec. Direct links to each:



    • Code
    • Front-end Engineering
    • Back-end Engineering

    es

    Setting New Project Managers Up for Success

    At Viget, we’ve brought on more than a few new Project Managers over the past couple of years, as we continue to grow. The awesome new people we’ve hired have ranged in their levels of experience, but some of them are earlier in their careers and need support from more experienced PMs to develop their skills and flourish.

    We have different levels of training and support for new PMs. These broadly fall into four categories:

    • Onboarding: Learning about Viget tools and processes
    • Shadowing: Learning by watching others
    • Pairing: Learning by doing collaboratively
    • Leading: Learning by doing solo

    Onboarding

    In addition to conducting intro sessions to each discipline at Viget, new Viget PMs go through a lengthy set of training sessions that are specific to the PM lab. These include intros to:

    PM tools and resourcesProject processes
    Project typesProject checklists
    Project taskingProject planning
    Budgets, schedules, and resourcingRetrospectives
    Working with remote teamsProject kickoffs
    Thinking about developmentGithub and development workflow
    Tickets, definition, and documentationQA testing
    Account management

    Shadowing

    After PMs complete the onboarding process, they start shadowing other PMs’ projects to get exposure to the different types of projects we run (since the variety is large). We cater length and depth of shadowing based on how much experience a PM has coming in. We also try to expose PMs to multiple project managers, so they can see how PM style differs person-to-person.

    We’ve found that it can be most effective to have PMs shadow activities that are more difficult to teach in theory, such as shadowing a PM having a difficult conversation with a client, or shadowing a front-end build-out demo to see how the PM positions the meeting and our process to the client. More straightforward tasks like setting up a Harvest project could be done via pairing, since it’s easy to get the hang of with a little guidance.

    Pairing

    While shadowing is certainly helpful, we try to get PMs into pairing mode pretty quickly, since we’ve found that most folks learn better by doing than by watching. Sometimes this might mean having a new PM setting up an invoice or budget sheet for a client while a more experienced PM sits next to them, talking them through the process. We’ve found that having a newer PM lead straightforward activities with guidance tends to be more effective than the newer PM merely watching the more experienced PM do that activity.

    Another tactic we take is to have both PMs complete a task independently, and then meet and talk through their work, with the more experienced PM giving the less experienced PM feedback. That helps the newer PM think through a task on their own, and gain experience, but still have the chance to see how someone else would have approached the task and get meaningful feedback.

    Leading

    Once new PMs are ready to be in the driver’s seat, they are staffed as the lead on projects. The timing of when someone shifts into a lead role depends on how much prior experience that person has, as well as what types of projects are actively ready to be worked on.

    Most early-career project managers have a behind-the-scenes project mentor (another PM) on at least their first couple projects, so they have a dedicated person to ask questions and get advice from who also has more detailed context than that person’s manager would. For example, mentors often shadow key client and internal meetings and have more frequent check-ins with mentees. This might be less necessary at a company where all the projects are fairly similar, but at Viget, our projects vary widely in scale and services provided, as well as client needs. Because of this, there’s no “one size fits all” process and we have a significant amount of customization per project, which can be daunting to new PMs who are still getting the hang of things.

    For these mentorship pairings, we use a mentorship plan document (template here) to help the mentor and mentee work together to define goals, mentorship focuses, and touchpoints. Sometimes the mentee’s manager will take a first stab at filling out the plan, other times, the mentor will start that process.

    Management Touchpoints

    Along the way, we make sure new PMs have touchpoints with their managers to get the level of support they need to grow and succeed. Managers have regular 1:1s with PMs that are referred to as “project 1:1s”, and are used for the managee to talk through and get advice on challenges or questions related to the projects they’re working on—though really, they can be used for whatever topics are on the managee’s mind. PMs typically have 1:1s with managers daily the first week, two to three times per week after that for the first month or so, then scale down to once per week, and then scale down to bi-weekly after the first six months.

    In addition to project 1:1s, we also have monthly 1:1s that are more bigger-picture and focused on goal-setting and progress, project feedback from that person’s peers, reflection on how satisfied and fulfilled they’re feeling in their role, and talking through project/industry interests which informs what projects we should advocate for them to be staffed on. We have a progress log template that we customize per PM to keep track of goals and progress.

    We try to foster a supportive environment that encourages growth, feedback, and experiential learning, but also that lets folks have the autonomy to get in the driver’s seat as soon as they’re comfortable. Interested in learning more about what it’s like to work at Viget? Check out our open positions here.




    es

    Our WFH Best Practices

    Our first remote office opened in 2007 when a designer and a developer left our HQ office and moved to Durham. Ever since we've been fine-tuning our ability to collaborate across locations. Today, we have team members across the country in our four offices, and we have fully remote employees in Charleston, Kansas City, New York City, Dallas, and Charlottesville.

    Because of the coronavirus outbreak, a lot of people recently started working from their homes across the world, the country, and Viget. We wanted to share some of our best practices for being great teammates and doing great work, regardless of locale, and we’d love to hear yours in the comments.

    Communicate Often and Write It Down

    We want every person at Viget to be informed and connected. We do this in a few ways. We have a company Knowledge Base, which contains critical information including HR policies, office processes, brand guidelines, project resources, etc. We also have a well-organized Google Drive that everyone can access.

    My favorite communication tool we use, however, is our Internal Lab Report. Every week, we create a Google Doc with HR updates, birthdays, upcoming events we’re attending, relevant publicity we or a client received, and timely updates on projects, sales, and recruiting. This report allows the entire team to have the same information, regardless of PTO schedules, and it provides a record that can be referenced weeks, months, or years later.

    I have also found our Slack habits really helpful. We try to make our availability easily known, mostly via a passive Slack status. We each update our status daily, sometimes multiple times, so people can see if we’re working from home, out of the office for an appointment, in a meeting, or offline for a personal phone call. We also have a few Slack Channels we use very specifically to announce PTO, important announcements, and recently, one that is specific to the updating coronavirus situation.

    My work from home station.

    Figure Out Your Boundaries

    This looks different for everyone and can be an ever-changing target. Understanding your boundaries requires you to be honest with yourself – Are you easily distracted? Can you successfully work in pajama pants? Will your dog actually allow you to get work done? Does working from the couch result in good work, or do you need a designated work spot? For some, working from home requires setting boundaries to ensure the work gets done. For others, working from home requires setting a start and stop times to ensure you don’t overwork yourself.

    Viget has a flexible work policy, so many of us work from home fairly often and have gotten our routines set up. As such, we have written about this before! Check out Trevor’s article about working remotely.

    Show Your Face

    When I first started at Viget, I’d never worked anywhere that used a Google Hangout for nearly every meeting. At first, I was tempted to call into meetings and leave the camera off because I found it exposing. Now, I can’t imagine not using it, and I’ve even embraced it in my personal life with friends and family. I realized the value in face-to-face conversations even in virtual form, the ability to see body language, and the connection you establish when you see each other's faces — even if your hair isn't perfect or you haven't arranged your plants just-so in the view behind you. Whenever possible, use your camera during a meeting. It increases trust, communication, and in my personal-not-backed-by-science-opinion, lightness, which frankly, I think we can all use a bit more of right now.

    Here's a screen shot from our Saint Patrick's Day Happy Hour.

    Create Shared Experiences

    As a company with project teams often distributed across our four locations, cross-office experiences are vital to our culture, and we’ve spent years working to keep our remote offices in sync. A few of our ongoing group activities include a monthly virtual Book Club, our weekly full-team Free Lunch Friday tradition, Donut for Slack, and, of course, our Pointless Weekends.

    The current global health crisis now requires almost all of the company to work remote, so we’ve gotten creative with our attempts to increase non-project time together, in order to keep up the vibes we’ve worked hard to create.

    What we’ve recently started:

      • Last Weekend this Morning - Monday mornings, we have an optional virtual coffee, where anyone who’d like to chat can join and share the latest gardening lesson or bingeable tv show. It lets us start our week off as we would when we’re all in the office — saying hello to each other.
      • Virtual Happy Hours - We are a company that likes to socialize, and a bit of distance doesn’t stop us. This week, we set up an after-hours Happy Hour for St. Patrick’s Day.
      • Daily Lunch Table- If you’ve ever visited our HQ office in Falls Church, you’ll notice our large kitchen table. We have an informal tradition of gathering around noon to eat together, whether it’s just a couple folks or the whole team. We now do this lunch virtually. So far, we’re mostly taking turns discussing who is eating what, and of course, sharing said recipes.

    I crowdsourced some ideas from the Viget team, and here are some noteworthy takeaways:

    "In remote meetings, minimize all your other windows and be fully present. It’s easy to allow your attention to accidentally drift if you see a new Slack channel light up, especially if you’re in a larger meeting. Suddenly, you find yourself multitasking. Treat the meeting as if you were there in person: unless you’re taking notes, minimize your other tabs, and give the conversation your full attention."
    - Paul Koch

    “I try to reach out to more folks I don’t consistently work with. Since there’s less interaction in general, I want to be more intentional about staying connected.”
    - Laura Sweltz

    “Good habits are hard to form and bad habits are hard to break, and it’s often hard to find the right time to make a change. Most of us are experiencing a disruption to our usual behaviors right now, but that doesn’t have to be entirely bad. Be deliberate now and when this is over, we might all end up with some new work habits worth keeping.”
    - Emily Bloom

    “I’ve found it helpful to create a physical space similar to the one I had at work. While this isn’t exactly possible, small things like setting up a laptop stand and second screen make it so I’m less likely to get distracted and wander to the couch or kitchen (aka the snack danger zone.).”
    - Aubrey Lear

    “It’s easy to get stuck in one spot all day, so be proactive about moving around, or creating excuses to do so. Whether that’s making yourself a cup of coffee, eating lunch away from your computer, or going for a quick walk outside for some fresh air. This will help reduce the risk of going stir crazy.”
    -Zach Robbins

    True to Viget form, our remote work is all about “Progress, Not Perfection.” While remote collaboration is ingrained in our company, we’re looking for opportunities to fine-tune our approach and improve our habits.

    We’d love to hear from you: What are your best practices? Lessons learned?




    es

    Pursuing A Professional Certification In Scrum

    Professional certifications have become increasingly popular in this age of career switchers and the freelance gig economy. A certification can be a useful way to advance your skill set quickly or make your resume stand out, which can be especially important for those trying to break into a new industry or attract business while self-employed. Whatever your reason may be for pursuing a professional certificate, there is one question only you can answer for yourself: is it worth it?

    Finding first-hand experiences from professionals with similar career goals and passions was the most helpful research I used to answer that question for myself. So, here’s mine; why I decided to get Scrum certified, how I evaluated my options, and if it was really worth it.

    A shift in mindset

    My background originates in brand strategy where it’s typical for work to follow a predictable order, each step informing the next. This made linear techniques like water-fall timelines, completing one phase of work in its entirety before moving onto the next, and documenting granular tasks weeks in advance helpful and easy to implement. When I made the move to more digitally focused work, tasks followed a much looser set of ‘typical’ milestones. While the general outline remained the same (strategy, design, development, launch) there was a lot more overlap with how tasks informed each other, and would keep informing and re-informing as an iterative workflow would encourage.

    Trying to fit a very fluid process into my very stiff linear approach to project planning didn’t work so well. I didn’t have the right strategies to manage risks in a productive way without feeling like the whole project was off track; with the habit of account for granular details all the time, I struggled to lean on others to help define what we should work on and when, and being okay if that changed once, or twice, or three times. Everything I learned about the process of product development came from learning on the job and making a ton of mistakes—and I knew I wanted to get better.

    Photo by Christin Hume on Unsplash

    I was fortunate enough to work with a group of developers who were looking to make a change, too. Being ‘agile’-enthusiasts, this group of developers were desperately looking for ways to infuse our approach to product work with agile-minded principles (the broad definition of ‘agile’ comes from ‘The Agile Manifesto’, which has influenced frameworks for organizing people and information, often applied in product development). This not only applied to how I worked with them, but how they worked with each other, and the way we all onboarded clients to these new expectations. This was a huge eye opener to me. Soon enough, I started applying these agile strategies to my day-to-day— running stand-ups, setting up backlogs, and reorganizing the way I thought about work output. It’s from this experience that I decided it may be worth learning these principles more formally.

    The choice to get certified

    There is a lot of literature out there about agile methodologies and a lot to be learned from casual research. This benefitted me for a while until I started to work on more complicated projects, or projects with more ambitious feature requests. My decision to ultimately pursue a formal agile certification really came down to three things:

    1. An increased use of agile methods across my team. Within my day-to-day I would encounter more team members who were familiar with these tactics and wanted to use them to structure the projects they worked on.
    2. The need for a clear definition of what processes to follow. I needed to grasp a real understanding of how to implement agile processes and stay consistent with using them to be an effective champion of these principles.
    3. Being able to diversify my experience. Finding ways to differentiate my resume from others with similar experience would be an added benefit to getting a certification. If nothing else, it would demonstrate that I’m curious-minded and proactive about my career.

    To achieve these things, I gravitated towards a more foundational education in a specific agile-methodology. This made Scrum the most logical choice given it’s the basis for many of the agile strategies out there and its dominance in the field.

    Evaluating all the options

    For Scrum education and certification, there are really two major players to consider.

    1. Scrum Alliance - Probably the most well known Scrum organization is Scrum Alliance. They are a highly recognizable organization that does a lot to further the broader understanding of Scrum as a practice.
    2. Scrum.org - Led by the original co-founder of Scrum, Ken Schwaber, Scrum.org is well-respected and touted for its authority in the industry.

    Each has their own approach to teaching and awarding certifications as well as differences in price point and course style that are important to be aware of.

    SCRUM ALLIANCE

    Pros

    • Strong name recognition and leaders in the Scrum field
    • Offers both in-person and online courses
    • Hosts in-person events, webinars, and global conferences
    • Provides robust amounts of educational resources for its members
    • Has specialization tracks for folks looking to apply Scrum to their specific discipline
    • Members are required to keep their skills up to date by earning educational credits throughout the year to retain their certification
    • Consistent information across all course administrators ensuring you'll be set up to succeed when taking your certification test.

    Cons

    • High cost creates a significant barrier to entry (we’re talking in the thousands of dollars here)
    • Courses are required to take the certification test
    • Certification expires after two years, requiring additional investment in time and/or money to retain credentials
    • Difficult to find sample course material ahead of committing to a course
    • Courses are several days long which may mean taking time away from a day job to complete them

    SCRUM.ORG

    Pros

    • Strong clout due to its founder, Ken Schwaber, who is the originator of Scrum
    • Offers in-person classes and self-paced options
    • Hosts in-person events and meetups around the world
    • Provides free resources and materials to the public, including practice tests
    • Has specialization tracks for folks looking to apply Scrum to their specific discipline
    • Minimum score on certification test required to pass; certification lasts for life
    • Lower cost for certification when compared to peers

    Cons

    • Much lesser known to the general public, as compared to its counterpart
    • Less sophisticated educational resources (mostly confined to PDFs or online forums) making digesting the material challenging
    • Practice tests are slightly out of date making them less effective as a study tool
    • Self-paced education is not structured and therefore can’t ensure you’re learning everything you need to know for the test
    • Lack of active and engaging community will leave something to be desired

    Before coming to a decision, it was helpful to me to weigh these pros and cons against a set of criteria. Here’s a helpful scorecard I used to compare the two institutions.

    Scrum Alliance Scrum.org
    Affordability ⚪⚪⚪
    Rigor⚪⚪⚪⚪⚪
    Reputation⚪⚪⚪⚪⚪
    Recognition⚪⚪⚪
    Community⚪⚪⚪
    Access⚪⚪⚪⚪⚪
    Flexibility⚪⚪⚪
    Specialization⚪⚪⚪⚪⚪⚪
    Requirements⚪⚪⚪
    Longevity⚪⚪⚪

    For me, the four areas that were most important to me were:

    • Affordability - I’d be self-funding this certificate so the investment of cost would need to be manageable.
    • Self-paced - Not having a lot of time to devote in one sitting, the ability to chip away at coursework was appealing to me.
    • Reputation - Having a certificate backed by a well-respected institution was important to me if I was going to put in the time to achieve this credential.
    • Access - Because I wanted to be a champion for this framework for others in my organization, having access to resources and materials would help me do that more effectively.

    Ultimately, I decided upon a Professional Scrum Master certification from Scrum.org! The price and flexibility of learning course content were most important to me. I found a ton of free materials on Scrum.org that I could study myself and their practice tests gave me a good idea of how well I was progressing before I committed to the cost of actually taking the test. And, the pedigree of certification felt comparable to that of Scrum Alliance, especially considering that the founder of Scrum himself ran the organization.

    Putting a certificate to good use

    I don’t work in a formal Agile company, and not everyone I work with knows the ins and outs of Scrum. I didn’t use my certification to leverage a career change or new job title. So after all that time, money, and energy, was it worth it?

    I think so. I feel like I use my certification every day and employ many of the principles of Scrum in my day-to-day management of projects and people.

    • Self-organizing teams is really important when fostering trust and collaboration among project members. This means leaning on each other’s past experiences and lessons learned to inform our own approach to work. It also means taking a step back as a project manager to recognize the strengths on your team and trust their lead.
    • Approaching things in bite size pieces is also a best practice I use every day. Even when there isn't a mandated sprint rhythm, breaking things down into effort level, goals, and requirements is an excellent way to approach work confidently and avoid getting too overwhelmed.
    • Retrospectives and stand ups are also absolute musts for Scrum practices, and these can be modified to work for companies and project teams of all shapes and sizes. Keeping a practice of collective communication and reflection will keep a team humming and provides a safe space to vent and improve.
    Photo by Gautam Lakum on Unsplash

    Parting advice

    I think furthering your understanding of industry standards and keeping yourself open to new ways of working will always benefit you as a professional. Professional certifications are readily available and may be more relevant than ever.

    If you’re on this path, good luck! And here are some things to consider:

    • Do your research – With so many educational institutions out there, you can definitely find the right one for you, with the level of rigor you’re looking for.
    • Look for company credits or incentives – some companies cover part or all of the cost for continuing education.
    • Get started ASAP – You don’t need a full certification to start implementing small tactics to your workflows. Implementing learnings gradually will help you determine if it’s really something you want to pursue more formally.




    es

    Unsolved Zoom Mysteries: Why We Have to Say “You’re Muted” So Much

    Video conference tools are an indispensable part of the Plague Times. Google Meet, Microsoft Teams, Zoom, and their compatriots are keeping us close and connected in a physically distanced world.

    As tech-savvy folks with years of cross-office collaboration, we’ve laughed at the sketches and memes about vidconf mishaps. We practice good Zoomiquette, including muting ourselves when we’re not talking.

    Yet even we can’t escape one vidconf pitfall. (There but for the grace of Zoom go I.) On nearly every vidconf, someone starts to talk, and then someone else says: “Oop, you’re muted.” And, inevitably: “Oop, you’re still muted.”

    That’s right: we’re trying to follow Zoomiquette by muting, but then we forget or struggle to unmute when we do want to talk.

    In this post, I’ll share my theories for why the You’re Muted Problems are so pervasive, using Google Meet, Microsoft Teams, and Zoom as examples. Spoiler alert: While I hope this will help you be more mindful of the problem, I can’t offer a good solution. It still happens to me. All. The. Time.

    Skip the why and go straight to the vidconf app keyboard shortcuts you should memorize right now.

    Why we don't realize we’re muted before talking

    Why does this keep happening?!?

    Simply put: UX and design decisions make it harder to remember that you’re muted before you start to talk.

    Here’s a common scenario: You haven’t talked for a bit, so you haven’t interacted with the Zoom screen for a few seconds. Then you start to talk — and that’s when someone tells you, “You’re muted.”

    We forget so easily in these scenarios because when our mouse has been idle for a few seconds, the apps hide or downplay the UI elements that tell us we’re muted.

    Zoom and Teams are the worst offenders:

    • Zoom hides both the toolbar with the main in-app controls (the big mute button) and the mute status indicator on your video pane thumbnail.
    • Teams hides the toolbar, and doesn't show a mute status indicator on your video thumbnail in the first place.

    Meet is only slightly better:

    • Meet hides the toolbar, and shows only a small mute status icon in your video thumbnail.

    Even when our mouse is active, the apps’ subtle approach to muted state UI can make it easy to forget that we’re muted:

    Teams is the worst offender:

    • The mute button is an icon rather than words.
    • The muted-state icon's styling could be confused with unmuted state: Teams does not follow the common pattern of using red to denote muted state.
    • The mute button is not differentiated in visual hierarchy from all the other controls.
    • As mentioned above, Teams never shows a secondary mute status indicator.

    Zoom is a bit better, but still makes it pretty easy to forget that you’re muted:

    • Pros:
      • Zoom is the only app to use words on the mute button, in this case to denote the button action (rather than the muted state).
      • The muted-state icon’s styling (red line) is less likely to be confused with the unmuted-state icon.
    • Cons:
      • The mute button’s placement (bottom left corner of the page) is easy to overlook.
      • The mute button is not differentiated in visual hierarchy from the other toolbar buttons — and Zoom has a lot of toolbar buttons, especially when logged in as host.
      • The secondary mute status indicator is a small icon.
      • The mute button’s muted-state icon is styled slightly differently from the secondary mute status indicator.
    • Potential Cons:
      • While words denote the button action, only an icon denotes the muted state.

    Meet is probably the clearest of the three apps, but still has pitfalls:

    • Pros:
      • The mute button is visually prominent in the UI: It’s clearly differentiated in the visual hierarchy relative to other controls (styled as a primary button); is a large button; and is placed closer to the center of the controls bar.
      • The muted-state icon’s styling (red fill) is less likely to be confused with the unmuted-state icon.
    • Cons:
      • Uses only an icon rather than words to denote the muted state.
    • Unrelated Con:
      • While the mute button is visually prominent, it’s also placed next to the hang-up button. So in Meet’s active state you might be less likely to forget you’re muted … but more likely to accidentally hang up when trying to unmute. 😬

    I know modern app design leans toward minimalism. There’s often good rationale to use icons rather than words, or to de-emphasize controls and indicators when not in use.

    But again: This happens on basically every call! Often multiple times per call!! And we’re supposed to be tech-savvy!!! Imagine what it’s like for the tens of millions of vidconf newbs.

    I would argue that “knowing your muted state” has turned out to be a major vidconf user need. At this point, it’s certainly worth rethinking UX patterns for.

    Why we keep unsuccessfully unmuting once we realize we’re muted

    So we can blame the You’re Muted Problem on UX and design. But what causes the You’re Still Muted Problem? Once we know we’re muted, why do we sometimes fail to unmute before talking again?

    This one is more complicated — and definitely more speculative. To start making sense of this scenario, here’s the sequence I’m guessing most commonly plays out (I did this a couple times before I became aware of it):

    The crucial part is when the person tries to unmute by pressing the keyboard Volume On/Off key.

    If that’s in fact what’s happening (again, this is just a hypothesis), I’m guessing they did that because when someone says “You’re muted” or “I can’t hear you,” our subconscious thought process is: “Oh, Audio is Off. Press the keyboard key that I usually press when I want to change Audio Off to Audio On.”

    There are two traps in this reflexive thought process:

    First, the keyboard volume keys control the speaker volume, not the microphone volume. (More specifically, they control the system sound output settings, rather than the system sound input settings or the vidconf app’s sound input settings.)

    In fact, there isn’t a keyboard key to control the microphone volume. You can’t unmute your mic via a dedicated keyboard key, the way that you can turn the speaker volume on/off via a keyboard key while watching a movie or listening to music.

    Second, I think we reflexively press the keyboard key anyway because our mental model of the keyboard audio keys is just: Audio. Not microphone vs. speaker.

    This fuzzy mental model makes sense: There’s only one set of keyboard keys related to audio, so why would I think to distinguish between microphone and speaker? 

    So my best guess is hardware design causes the You’re Still Muted Problem. After all, keyboard designs are from a pre-Zoom era, when the average person rarely used the computer’s microphone.

    If that is the cause, one potential solution is for hardware manufacturers to start including dedicated keys to control microphone volume:

    Video conference keyboard shortcuts you should memorize right now

    Let me know if you have other theories for the You’re Still Muted Problem!

    In the meantime, the best alternative is to learn all of the vidconf app keyboard shortcuts for muting/unmuting:

    • Meet
      • Mac: Command(⌘) + D
      • Windows: Control + D
    • Teams
      • Mac: Command(⌘) + Shift + M
      • Windows: Ctrl + Shift + M
    • Zoom
      • Mac: Command(⌘) + Shift + A
      • Windows: Alt + A
      • Hold Spacebar: Temporarily unmute

    Other vidconf apps not included in my analysis:

    • Cisco Webex Meetings
      • Mac: Ctrl + Alt + M
      • Windows: Ctrl + Shift + M
    • GoToMeeting

    Bonus protip from Jackson Fox: If you use multiple vidconf apps, pick a keyboard shortcut that you like and manually change each app’s mute/unmute shortcut to that. Then you only have to remember one shortcut!




    es

    So You've Written a Bad Design Take

    So you’ve just written a blog post or tweet about why wireframes are becoming obsolete, the dangers of “too accessible” design, or how a certain style of icon creates “cognitive fatigue.”

    Your post went viral, but now you’re getting ratioed by rude people on the Internet. That sucks! You were just trying to start a conversation and you probably didn’t deserve all that negativity (except for you, “too accessible” guy).

    Most likely, you made one of these common mistakes:

    1. You made generalizations about “design”

    You, a good user-centered designer, know that you are not your user. Nor are you every designer.

    First of all, let's acknowledge that there is no universal definition of design. Even if we narrow it down to software design, it’s still hard to make generalizations. Agency, in-house, product, startup, enterprise, non-profit, website, app, connected hardware, etc. – there are a lot of different work contexts and cultures for people with “designer” in their titles.

    "The Design Industry" is not a thing, but even if it were, you don't speak for it. Don’t assume that the kind of design work you do is the universal default.

    2. You didn’t share enough context

    There are many great design books and few great design blog posts. (There are, to my knowledge, no great design tweets, but I am open to your suggestions.) Writing about design is not well suited to short formats, because context plays such an important role and there’s always a lot of it to cover.

    Writing about your work should include as much context as you would include if you were presenting your portfolio for a job interview. What kind of organization did you work for? Who was your client and/or your stakeholders? What was the goal of the project? Your timeline? What was the makeup of your team? What were the notable business rules and constraints? How are you defining effectiveness and success?

    Without these kinds of details, it’s not possible for other designers to know if what you’ve written is credible or applicable to them.

    3. You were too certain

    A blog post doesn’t need to be a dissertation. It’s okay to share hunches and anecdotes, but give the necessary caveats. And if you're making claims about science, bruh, you gotta cite your sources.

    Be humble in your takes. Your account of what worked for you and why is more valuable to your peers than making sweeping claims and reheating the same old arguments. Be prepared to be told you’re wrong, and have the humility to realize that your perspective is just your perspective. Real conversations, like good design, are built on feedback and diverse viewpoints.

    Together, we can improve the discourse in our information ecosystems. Don't generalize. Give context. Be humble.




    es

    Global Gitignore Files Are Cool and So Are You

    Setting it up

    First, here's the config setup you need to even allow for such a radical concept.

    1. Define the global gitignore file as a global Git configuration:

      git config --global core.excludesfile ~/.gitignore
      

      If you're on OSX, this command will add the following config lines in your ~/.gitconfig file.

      [core]
        excludesfile = /Users/triplegirldad/.gitignore
      
    2. Load that ~/.gitignore file up with whatever you want. It probably doesn't exist as a file yet so you might have to create it first.

    Harnessing its incredible power

    There are only two lines in my global gitignore file and they are both fairly useful pretty much all the time.

    $ cat ~/.gitignore
    TODO.md
    playground
    

    This 2 line file means that no matter where I am, what project I'm working on, where in the project I'm doing so, I have an easy space to stash notes, thoughts, in progress ideas, spikes, etc.

    TODO.md

    More often than not, I'm fiddling around with a TODO.md file. Something about writing markdown in your familiar text editor speaks to my soul. It's quick, it's easy, you have all the text editing tricks available to you, and it never does anything you wouldn't expect (looking at you auto-markdown-formatting editors). I use one or two # for headings, I use nested lists, and I ask for nothing more. Nothing more than more TODO.md files that is!

    In practice I tend to just have one TODO.md file per project, right at the top, ready to pull up in a few keystrokes. Which I do often. I pull this doc up if:

    • I'm in a meeting and I just said "oh yeah that's a small thing, I'll knock it out this afternoon".
    • I'm halfway through some feature development and realize I want to make a sweeping refactor elsewhere. Toss some thoughts in the doc, and then get back to the task at hand.
    • It's the end of the day and I have to switch my brain into "feed small children" mode, thus obliterating everything work-related from my short term memory. When I open things up the next day and know exactly what the next thing to dive into was.
    • I'm preparing for a big enough refactor and I can't hold it all in my brain at once. What I'd give to have an interactive 3D playground for brain thoughts, but in the meantime a 2D text file isn't a terrible way to plan out dev work.

    playground

    Sometimes you need more than some human words in a markdown file to move an idea along. This is where my playground directory comes in. I can load this directory up with code that's related to a given project and keep it out of the git history. Because who doesn't like a place to play around.

    I find that this directory is more useful for long running maintenance projects over fast moving greenfield ones. On the maintenance projects, I tend to find myself assembling a pile of scripts and experiments for various situations:

    • The client requests a one-time obscure data export. Whip up some CSV generation code and save that code in the playground directory.
    • The client requests a different obscure data export. Pull up the last time you did something vaguely similar and save yourself the startup time.
    • A batch of data needs to be imported just once. Might as well stash that in the chance that "just once" is actually "just a few times".
    • Kicking the tires on an integration with a third party service.

    Some of these playground files end up being useful more times than I can count (eg: the ever-changing user_export.rb script). Some items get promoted into application code, which is always fun. But most files here serve their purpose and then wither away. And that's fine. It's a playground, anything goes.

    Wrapping up

    Having a personal space for project-specific notes and code has been helpful to me over the years as a developer on multiple projects. If you have your own organizational trick, or just want to brag about how you memorize everything without any markdown files, let me know in the comments below!




    es

    "What is deceptive, especially in the West, is our assumption that repetitive and mindless jobs are..."

    What is deceptive, especially in the West, is our assumption that repetitive and mindless jobs are dehumanizing. On the other hand, the jobs that require us to use the abilities that are uniquely human, we assume to be humanizing. This is not necessarily true. The determining factor is not so much the nature of our jobs, but for whom they serve.

    ‘Burnout’ is a result of consuming yourself for something other than yourself. You could be burnt out for an abstract concept, ideal, or even nothing (predicament). You end up burning yourself as fuel for something or someone else. This is what feels dehumanizing. In repetitive physical jobs, you could burn out your body for something other than yourself. In creative jobs, you could burn out your soul. Either way, it would be dehumanizing. Completely mindless jobs and incessantly mindful jobs could both be harmful to us.



    - Dsyke Suematsu from his white paper discussed at Why Ad People Burn Out.




    es

    "In conceptual art the idea or concept is the most important aspect of the work. When an artist uses..."

    “In conceptual art the idea or concept is the most important aspect of the work. When an artist uses a conceptual form of art, it means that all of the planning and decisions are made beforehand and the execution is a perfunctory affair. The idea becomes a machine that makes the art. This kind of art is not theoretical or illustrative of theories; it is intuitive, it is involved with all types of mental processes and it is purposeless. It is usually free from the dependence on the skill of the artist as a craftsman.”

    - Artist Sol Lewitt on conceptual art.




    es

    5 Essentials To Create Your Own Website Presence

    Only a website that has a well-established presence can stand out on the internet. Business owners and individuals hire web designers like yourself to create website presences for them. In order to prove yourself, you need to establish your own presence online first. Get to the point where you can showcase your own website during […]

    The post 5 Essentials To Create Your Own Website Presence appeared first on Bittbox.




    es

    Adobe to forgo Flash plug-in for mobile devices

    Earlier this week, Adobe VP and General Manager Danny Winokur disclosed that the company has concluded that HTML5 is ”the best solution for creating and deploying content in the browser across mobile platforms.” The company said it would stop building Flash to run on mobile browsers. In a blog post on the new focus of Read the rest...




    es

    Shim uses node.js to test sites on multiple browsers

    Shim was developed within the Boston Globe’s media lab as a way to study how Web sites look on various devices and browsers. A laptop intercepts all wifi traffic – this is redirected to a custom node.js server – which inserts a javascript, or “shim,” at the head of each web page that is visited. Read the rest...




    es

    Here comes Traversty traversing the DOM

    The Traversty DOM utility has as its purpose to allow you to traverse the DOM and manage collections of DOM elements. Proponents admit core Traversty traversal methods are inspired by Prototype’s DOM Traversal toolkit, but now in a multi-element environment that is more like jQuery and less like Prototype’s single element implementation.




    es

    Mobile Proxies: A New Era Dawns

    This week, Chrome For Android M26 was announced. It has the literally-awesome ability to record video via `getUserMedia()`, but enough about making Skype irrelevant. What’s even more interesting is the new data compression feature. Which, to be clear, is experimental, has to be switched on, doesn’t apply to secure (SSL) sites, and it’s only running Read the rest...













    es

    Squared Circle Pit #54 - AVATAR Frontman Johannes Eckerström Talks Wrestling Unlocking His Love of Metal Frontmen

    We're back and this week, we're talking to Avatar's colorful frontman Johannes Eckerström. If you've ever seen the band live,...

    The post Squared Circle Pit #54 - AVATAR Frontman Johannes Eckerström Talks Wrestling Unlocking His Love of Metal Frontmen appeared first on Metal Injection.







    es

    The Internet is an Essential Service

    “You can consult canada.ca/coronavirus to get the best updated information about the spread of the virus.” – Justin Trudeau, April 3rd, 2020 A daily mantra rings out from government officials around the world: The call to visit official websites to get the latest information on the COVID-19 pandemic and to access essential services. Yet to many constituents accessing […]

    The post The Internet is an Essential Service appeared first on MOR10.




    es

    The Best Free Zoom Backgrounds to Make Your Video Conferencing More Fun

    If you’re a remote worker, you may have plenty of experience with video conferencing as a way to communicate with clients, team members, or other colleagues. But with millions of additional...

    Click through to read the rest of the story on the Vandelay Design Blog.




    es

    9 Convincing Reasons Why Designers Should Pursue Personal Projects

    Web designers have skills and expertise that open up a whole world of possibilities. Many designers and developers choose to pursue personal projects in their own time, which can be a nice change of...

    Click through to read the rest of the story on the Vandelay Design Blog.




    es

    15 Digital Products That Web Designers Can Create and Sell

    There are a number of different ways to make money as a web designer aside from simply creating websites for clients. Many freelancers choose to supplement their income from client work by doing some...

    Click through to read the rest of the story on the Vandelay Design Blog.




    es

    What Does Big Tech Know About You? Basically Everything

    Big tech companies have been spying on us for years. This knowledge isn’t new information, but what could be surprising is exactly to what extent each company does it. Security Baron categories what data six of the biggest tech companies collect from you in The Data Big Companies Have On You infographic, and these are just the ones they admit to collecting on their own privacy pages!

    The seemingly endless stream of Facebook privacy scandals of late—including the latest involving users as young as 13 years old—may have you questioning how much the social network and other tech giants actually know about you.

    The folks at Security Baron examined the privacy policies of Facebook, Google, Apple, Twitter, Amazon, and Microsoft and put together a handy infographic showing the types of data each company admits to collecting. For Facebook and others, data is money. But just how much these tech giants actually know about you might be surprising.

    As you can see in the infographic below, Facebook is particularly data-hungry, even gathering information about your work, income level, race, religion, political views, and the ads you click in addition to more commonly collected data points such as your phone number, email address, location, and the type of devices you use.

    "Facebook is unusually aggressive," Security Baron pointed out. "This data can be exploited by advertisers and (hopefully not nefarious) others."

    Twitter, in comparison, is "comparatively hands-off," the site notes. The microblogging service, for instance, doesn't collect your name, gender, or birthday (Facebook, Google, and Microsoft all do), but Twitter does know your phone number, email address, time zone, what videos you watch, and more.

    Google and Microsoft, meanwhile, are the other big players when it comes to collecting data.

    "With Cortana listening in and Gmail seeing all of your emails, the ubiquitous nature of Google and Microsoft gives them access to an uncomfortably large amount of your information," Security Baron wrote.

    Check out the full infographic below to see what Facebook, Google, Apple, Twitter, Amazon, and Microsoft may know about you. For tips on securing your digital privacy, check our story, "Online Data Protection 101: Don't Let Big Tech Get Rich Off Your Info.

    This is a fairly simple infographic design using a comparison table. I think the use of the icons is particularly effective showing which of Google’s or Microsoft’s apps are collecting the data.

    Although the types of data are identified down the left side, I wish there was a way to identify the more sensitive types of data.

    Original article can be found at https://www.pcmag.com/




    es

    How Does Impeachment Work?

    With Impeachment in the news every day lately, Curtis Newbold (The Visual Communication Guy) put together a handy explanation infographic, How Does Impeachment Work? A FREE downloadable PDF is also available from his website.

    Considering the recent news of the House launching an official impeachment inquiry against President Donald Trump, it seemed worthwhile to create an infographic that describes the impeachment process.

    Many Americans falsely assume that the term “impeachment” means automatic removal from office. That isn’t the case. The term “impeachment” simply means that someone in a high-ranking federal position has been found to have committed a crime or act of treason or bribery that seems serious enough to send that person through trial. If impeachment occurs, only then will the Senate conduct a trial and vote on conviction and removal from office.

    As you can see in the graphic, “impeachment” simply means officially charging someone in public office of misconduct or legal wrongdoing. The term and process can be used for many different federal officials, not just the President of the United States. Impeachment does not mean that the person is necessarily guilty. But it does mean that they have been officially accused of some wrongdoing and that the House of Representatives feels there is enough evidence to at least do an investigation.

    Here is a quick review of how the process works:

    This is a great use of infographics. Take a complicated subject, and try to make it understandable to your audience. Notice that I said “understandable” not “simple”. The main goal of data visualization and infographics is to clarify information, but it is often mis-characterized as simplifying information.

    This design still has too much text explanation for my taste. He goes into more details in the blog post that accompanies the infographic, so I think the infographic design could remove more of the explanatory text and draw people to the full article.




    es

    How Much Does It Really Cost To Produce Your Favorite TV Show?

    How Much Does It Really Cost To Produce Your Favorite TV Show? infographic compares the cost to make the show to their ratings on IMDb. Cashnetusa.com comes to the conclusion that, while Game of Thrones paid out the big bucks and received the huge ratings, it isn’t always necessary. Peaky blinders received great reviews and spent 10 million less per episode!

    Our new guide to the cost of producing the best and worst rated shows on TV in 2019 reiterates this sense that it’s not always the size of your production budget that counts, but what you do with it. The costly robots of Westworld are rivalled in ratings by the non-union zombies of The Walking Dead for a third of the price; Lost In Space was just as mediocre as the decidedly more earthbound NCIS: New Orleans.

    And in the short-term, with the complete series rating hovering around 9.5 on IMDb, Game of Thrones still manages to top our new table as both the highest rated and highest costing show. But when you consider the bitter taste on the tongues of millions of disappointed HBO subscribers, would a more thought-through finale have been a better investment than all that extra cash? Or are GoT fans just sour because (as experts suggest) they’re going through an end-of-show ‘break-up’?

    This infographic design does a lot of things right:

    • Good scatterplot data visualization to illustrate their data

    • Data points are clearly identified with data titles using proximity, not connecting lines necessary. This can often be a design challenge!

    • Sources clearly identified with links so anyone can look into the data

    • Use of Creative Commons to protect the infographic and encourage sharing

    • The text on the infographic landing page includes the clickable data source links and a methodology description.

    Found on Geekologie.com




    es

    DataViz Community COVID-19 Resources

    Not an infographic today.

    Free online classes, discounts on software, extended trial periods, free online data sources, etc. as a result of the COVID-19 pandemic.

    As the Organizer for the DFW Data Visualization Meetup Group, I've started this publicly viewable Google Sheet for the local DataViz community listing various resources that companies are making available during the pandemic. Turns out, these are valuable to DataViz designers everywhere, not just DFW, so I'm sharing the link with all of you.

    I’ll continue to update this list as I learn about new resources during the pandemic. Please use the submission link in the spreadsheet if you know of any DataViz-related offers or deals I should add!

    -Randy




    es

    Santa Fe National Forest Spared From Fracking

    WildEarth Guardians Press Release Federal Court Overturns Leasing of Lands to Oil and Gas Industry SANTA FE, NM — In a victory for New Mexico’s air, climate, and water, the U.S. District Court for the District of New Mexico today … Continue reading




    es

    California Study: Four Widely Used Neonicotinoid Pesticides Harm Bees

    Center for Biological Diversity Press Release WASHINGTON – Four commonly used neonicotinoid pesticides can harm bees and other pollinators, according to a new analysis by California’s Department of Pesticide Regulation. The study found that current approved uses of the “neonics” … Continue reading




    es

    Urging Multi-Pronged Effort to Halt Climate Crisis, Scientists Say Protecting World’s Forests as Vital as Cutting Emissions

    By Julia  Conley Common Dreams “Our message as scientists is simple: Our planet’s future climate is inextricably tied to the future of its forest.” With a new statement rejecting the notion that drastically curbing emissions alone is enough to curb … Continue reading




    es

    ‘Coming Mass Extinction’ Caused by Human Destruction Could Wipe Out 1 Million Species, Warns UN Draft Report

    By Jessica Corbett Common Dreams Far-reaching global assessment details how humanity is undermining the very foundations of the natural world     On the heels of an Earth Day that featured calls for radical action to address the current “age … Continue reading




    es

    Insects Are ‘Glue in Nature’ and Must Be Rescued to Save Humanity, Says Top Scientist

    By Jake Johnson Common Dreams Rapidly falling insect populations, said Anne Sverdrup-Thygeson, “will make it even more difficult than today to get enough food for the human population of the planet, to get good health and freshwater for everybody.” A … Continue reading




    es

    Tour de Frites

    Andrew Rickmann posted a photo:

    Le Chips: Food of the sportsman.




    es

    Roses and Rabbit

    Andrew Rickmann posted a photo:

    The Rose house with a Sophie Ryder rabbit.






    es

    New EPA Web Portal Helps Communities Prepare for Climate Change

    By The EPA The U.S. Environmental Protection Agency (EPA) today launched a new online portal that will provide local leaders in the nation’s 40,000 communities with information and tools to increase resilience to climate change. Using a self-guided format, the … Continue reading




    es

    Understanding Climate Change Means Reading Beyond Headlines

    By David Suzuki The David Suzuki Foundation Seeing terms like “post-truth” and “alternative facts” gain traction in the news convinces me that politicians, media workers and readers could benefit from a refresher course in how science helps us understand the … Continue reading