<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Digital Digressions by Stuart Sierra</title>
	<atom:link href="http://stuartsierra.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://stuartsierra.com</link>
	<description></description>
	<lastBuildDate>Sun, 05 Jun 2022 20:26:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Redirecting …</title>
		<link>https://stuartsierra.com/2022/06/05/redirecting/</link>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Sun, 05 Jun 2022 20:26:50 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1454</guid>

					<description><![CDATA[Hello, world! (lambdasierra.com)]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.lambdasierra.com/2022/hello">Hello, world!</a> (lambdasierra.com)</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Repository Filesystem</title>
		<link>https://stuartsierra.com/2020/09/28/repository-filesystem/</link>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Mon, 28 Sep 2020 13:13:25 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1377</guid>

					<description><![CDATA[When it comes to organizing source code repositories, there are broad similarities —&#160;source code in src/, tests in test/ — but no universal standards. Recently I was thinking about this and wondered “What about UNIX?&#8221; Most Linux distributions follow the Filesystem Hierarchy Standard to some extent. The directory names are short and familiar. The structure&#8230; <p><a class="moretag" href="https://stuartsierra.com/2020/09/28/repository-filesystem/">Read the full article</a></p>]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-large is-resized"><img fetchpriority="high" decoding="async" src="https://stuartsierra.com/wp-content/uploads/2020/09/jeremy-bishop-EwKXn5CapA4-unsplash.jpg" alt="" class="wp-image-1384" width="203" height="304"/><figcaption>Photo by <a href="https://unsplash.com/@jeremybishop?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Jeremy Bishop</a> on <a href="https://unsplash.com/s/photos/tree?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure></div>



<p>When it comes to organizing source code repositories, there are broad similarities —&nbsp;source code in <code>src/</code>, tests in <code>test/</code> — but no universal standards. Recently I was thinking about this and wondered “What about UNIX?&#8221;</p>



<p>Most Linux distributions follow the <a href="https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard">Filesystem Hierarchy Standard</a> to some extent. The directory names are short and familiar. The structure was even organized around <em>how files change</em>.</p>



<span id="more-1377"></span>



<p>What would this look like applied to a project repository? Starting with the usual <code>src/</code>, <code>test/</code>, and <code>doc/</code> directories, we could add UNIX-like paths:</p>



<ul class="wp-block-list"><li><code>bin/</code> for executable commands (binaries and scripts)</li><li><code>lib/</code> for shared libraries, such as shared functions for scripts</li><li><code>share/</code> for architecture-independent shared data, such as images</li><li><code>etc/</code> for local configuration</li><li><code>var/</code> for anything that changes<ul><li><code>var/lib/</code> for data that persists over multiple executions</li><li><code>var/run/</code> for runtime data like PID files</li><li><code>var/log/</code> for log files</li><li><code>var/tmp/</code> for temporary files and cache</li></ul></li><li><code>opt/</code> for self-contained directory hierarchies, such as Git submodules or embedded dependencies</li></ul>



<p>This structure has some interesting and potentially useful consequences for how repositories are structured. Everything except <code>var/</code> should be tracked by version control, and everything in <code>var/</code> should be excluded from version control.</p>



<p>Since <code>var/</code> is the only non-version-controlled directory, it is effectively the only “writable&#8221; destination for compilation. This means the files in <code>bin/</code> and <code>lib/</code> might be merely symlinks or scripts that point to generated files in <code>var/lib/</code>.</p>



<p>In a cloud or container environment, <code>var/</code> or its subdirectories could be mounted from a separate filesystem.</p>



<p>The <code>etc/</code> directory is tricky since a project may require temporary configuration files during development that should not be checked in. My thinking is that <code>etc/</code> should be restricted to things that are normally “checked in&#8221; like default configuration values. Local-only config should be under <code>var/</code>. It’s not unheard of for *nix systems to have a <code>var/etc/</code>, so that could work.</p>



<p>Of course, there is no universal standard for *nix filesystems, and no universal agreement on how to implement the standards we have. But as with a lot of things in software, <em>you could do worse</em> than to follow in the footsteps of UNIX.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sequential Consequences</title>
		<link>https://stuartsierra.com/2020/08/19/sequential-consequences/</link>
					<comments>https://stuartsierra.com/2020/08/19/sequential-consequences/#comments</comments>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Wed, 19 Aug 2020 20:40:52 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1357</guid>

					<description><![CDATA[There comes a point in a programming career — at least one as peripatetic as mine —at which learning a new programming language barely registers as an obstacle. I’m not talking about mind-meltingly different languages like APL, just your run-of-the-mainstream object/imperative mishmash. Grab a syntax cheat-sheet, skim the standard library docs, and off you go. Recently,&#8230; <p><a class="moretag" href="https://stuartsierra.com/2020/08/19/sequential-consequences/">Read the full article</a></p>]]></description>
										<content:encoded><![CDATA[
<p>There comes a point in a programming career — at least one as peripatetic as mine —at which learning a new programming language barely registers as an obstacle. I’m not talking about mind-meltingly different languages like APL, just your run-of-the-mainstream object/imperative mishmash. Grab a syntax cheat-sheet, skim the standard library docs, and off you go.</p>



<span id="more-1357"></span>



<p>Recently, my <a href="https://stuartsierra.com/consulting">personal consulting business</a> led me into a nest of Python, a language I had somehow managed to avoid for the past 15 years. I found, somewhat to my surprise, that I rather liked it. I wouldn’t call it great, but it’s easy to pick up and gets the job done. Packaging and namespacing is a mess, but no worse than any other language of its era.</p>



<p>I found that Python has <em>just enough</em> functional paradigms to keep me from tossing it out the window. Nothing compared to Clojure, of course, but enough.</p>



<p>Then I hit a stumbling block. I was writing an API which needed to receive a collection of things. I needed to use the <strong>first</strong> item of the collection for some initial setup, then iterate over the <strong>whole</strong> collection. It seemed straightforward enough:</p>



<pre class="wp-block-preformatted">def do_work(things):
<strong>    first_thing = things[0]
</strong>    print("Initial setup with %r" % first_thing)
    <strong>for thing in things:</strong>
        print("Doing something useful with %r" % thing)</pre>



<p>I tested it with a list of <code>things</code> and it worked fine.</p>



<pre class="wp-block-preformatted">do_work([1, 2, 3])

Initial setup with 1
Doing something useful with 1
Doing something useful with 2
Doing something useful with 3</pre>



<p>Then, in another piece of code, I decided to push my growing confidence in Python and try one of these new-fangled <em>generators</em> I’ve heard so much about:</p>



<pre class="wp-block-preformatted">def <strong>generate(n):</strong>
    for i in range(n):
        <strong>yield</strong> "generated value %d" % i</pre>



<p>I eagerly tested it and …</p>



<pre class="wp-block-preformatted">do_work(generate(3))
<strong>TypeError: </strong>'generator' object is not subscriptable</pre>



<p>Oh, poo.</p>



<p>OK, you caught me, I made the cardinal mistake when learning a new language: treating it like another language I already knew. In this case, I was trying to use a Python <em>generator</em> the same way I would use a Clojure <em>sequence</em>.</p>



<p>Clojure <em>sequences</em> are immutable and automatically cache generated values as long as they are reachable. In Clojure, I would have written something like this:</p>



<pre class="wp-block-preformatted">(defn do-work [things]
  <strong>(let [first-thing (first things)]</strong>
    (println "Initial setup with" first-thing)
    <strong>(doseq [thing things]</strong>
      (println "Doing something useful with" thing))))</pre>



<p>Immutability makes things simpler: just because I did <code>(first things)</code> doesn’t change the value of <code>things</code>.</p>



<p>Python <em>generators</em> are more like suspended computations; once they <code>yield</code> a value there’s no way to get it back. So Python will not let me “subscript&#8221; a generator — as in <code>things[0]</code> — because a generator cannot fulfill the expected behavior of a list, <em>i.e., </em>that the elements stay put after you look at them.</p>



<p>I understood the Python error message pretty quickly. Then I spent several minutes banging around the internet looking for a Python equivalent to Clojure’s immutable sequences. There probably is such a beast, but I didn’t find it.</p>



<p>There are plenty of workarounds, of course, the easiest being to coerce the generator into a list:</p>



<pre class="wp-block-preformatted">do_work(<strong>list(</strong>generate(3)<strong>)</strong>)

Initial setup with 'generated value 0'
Doing something useful with 'generated value 0'
Doing something useful with 'generated value 1'
Doing something useful with 'generated value 2'</pre>



<p>I could have stopped there and been just fine. But that <code>list()</code> stuck in my Clojurist’s craw. Forcing the entire generator to be realized in memory just so I could hang on to the first element felt wasteful. Who knows, maybe it would even break one day when handed a generator that produces thousands of items.</p>



<p>After a bit of tinkering, I came up with:</p>



<pre class="wp-block-preformatted">from itertools import chain

def do_work(things):
<strong>    iterator = iter(things)
    first_thing = next(iterator)
    iterator = chain([first_thing], iterator)</strong>

    print("Initial setup with %r" % first_thing)
<strong>    for thing in iterator:
</strong>        print("Doing something useful with %r" % thing)</pre>



<p>It’s not what I would call elegant. But it works, and it’s flexible: <code>things</code> can be <em>any</em> iterable type, including a generator or a regular list.</p>



<p>(For the Clojurists in the room, <code>chain()</code> is analagous to Clojure’s <code>concat</code>: it creates a new iterator out of two iterable things.)</p>



<p>After I finished the requisite rant about silly languages that don’t embrace immutable values as a pervasive default, I got to thinking: Clojure’s immutable sequences are elegant and powerful, but their design has some subtle consequences that regularly trip people up.</p>



<p>Almost everyone learning Clojure has stumbled over the <a href="https://stackoverflow.com/questions/2214258/holding-onto-the-head-of-a-sequence">holding onto the head</a> bug, which is a direct consequence of sequence caching. Keep at it long enough and you will eventually hit the <a href="https://stuartsierra.com/2015/04/26/clojure-donts-concat">stacked sequences problem</a>. These bugs may not show up during development; they only come back to bite you when they hit a sufficiently large sequence in production.</p>



<p>Furthermore, it takes knowledge of what’s going on behind the scenes — how Clojure sequences actually work, as opposed to the surface API — to understand the problem. Recognizing memory leaks <em>before</em> they cause problems is usually a matter of experience and pattern-recognition. For someone who just grabbed a syntax cheat-sheet and skimmed the standard library docs, there’s a good chance of writing that bug but not much chance of knowing how to fix it.</p>



<p>By contrast, Python’s generators and iterators are a little more … mechanical. You can see how things work, because most of the parts are exposed for you to see. While I’m sure there are ways to write memory leaks in Python, I’m guessing iterators are not a common source.</p>



<p>This is not to make a point about one approach being better than the other. I’m not going to rehash <a href="http://www.dreamsongs.com/WorseIsBetter.html">worse is better</a> for the <em>n</em>th time, nor the <a href="https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/">law of leaky abstractions</a>. I merely note that there are trade-offs either way. A more “elegant&#8221; abstraction can produce shorter, more expressive programs, at the cost of hidden complexity. Exposed mechanisms are easier to observe, but force you to spend attention on mechanical details.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stuartsierra.com/2020/08/19/sequential-consequences/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Remote 202: How to Join a Meeting</title>
		<link>https://stuartsierra.com/2020/07/20/remote-202-how-to-join-a-meeting/</link>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Mon, 20 Jul 2020 12:53:30 +0000</pubDate>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[Office Technology]]></category>
		<category><![CDATA[remote]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1343</guid>

					<description><![CDATA[“What do you mean, How to join a meeting’?! You click a button, doofus!&#8221; Yes, dear friends, and that is exactly the problem. If you’re not accustomed to remote work, you may not dwell much on the mechanical processes of remote interaction. It’s just always awkward, isn’t it? Every meeting starts with several minutes of&#8230; <p><a class="moretag" href="https://stuartsierra.com/2020/07/20/remote-202-how-to-join-a-meeting/">Read the full article</a></p>]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignright size-large is-resized"><img decoding="async" src="https://stuartsierra.com/wp-content/uploads/2020/07/jordan-epperson-fWU2Pr-0pjk-unsplash-edited-1024x772.jpg" alt="" class="wp-image-1348" width="308" height="232"/><figcaption>Photo by <a href="https://unsplash.com/@jordan_epperson?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Jordan Epperson</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a> (edited)</figcaption></figure></div>



<p><em>“What do you mean, How to join a meeting’?! You click a button, doofus!&#8221;</em></p>



<p>Yes, dear friends, and that is exactly the problem. If you’re not accustomed to remote work, you may not dwell much on the <em>mechanical</em> processes of remote interaction. It’s just always awkward, isn’t it? Every meeting starts with several minutes of fumbling with microphones and cameras and “Can you hear me now?&#8221; With each new person who arrives, the whole dance starts over again.</p>



<p>But what if I told you <em>it doesn’t have to be like this?</em> That it is, in fact, possible to have a remote meeting start on time, with everyone present and audible and ready to work? All it takes is a little preparation and a few organizational adjustments.</p>



<span id="more-1343"></span>



<h2 class="wp-block-heading">Take a Break</h2>



<p>First and foremost, don’t schedule meetings back-to-back. Even the most plugged-in manager needs time to breath, stretch, use the bathroom, drink some water, and check their email. Ten minutes is not enough, especially since most meetings run ten minutes late anyway. A half-hour break is the minimum you can realistically get away with. An hour is better.</p>



<p><em>“But with half-hour breaks in between, how will I have time for six meetings per day?&#8221;</em> You won’t. That’s the point. No one can sustain that many context-switches and still make meaningful contributions. With half as many meetings, and time to reset and gather your thoughts in between, you will be twice as productive.</p>



<h2 class="wp-block-heading">Start Early</h2>



<p>Secondly, start meetings <em>early.</em> That doesn’t mean the <em>work</em> of the meeting should start before its scheduled time, but that people should begin interacting in a virtual space <em>before</em> the scheduled start time.</p>



<p>My pre-meeting ritual looks something like this:</p>



<p>At <em>T</em>-minus-10 minutes, I get a notification from my calendar that the meeting is coming. I take a few minutes to wrap up whatever I’m working on and make a note of what I was planning to do next, so I can pick up where I left off.</p>



<p>Next, I check that my computer is ready for a meeting: <a href="https://stuartsierra.com/2020/03/06/remote-102-headsets">headset</a> plugged in, <a href="https://stuartsierra.com/2020/03/03/remote-101-cables">wired network</a> connection in place, camera cover open. I turn on more lights so the camera image is clear. If you have a <a href="https://www.nytimes.com/2020/06/29/business/zoom-shirt.html">Zoom shirt</a>, this is the time to put it on as well.</p>



<p>At <em>T</em>-minus-5 minutes, I join the video call. This means I have plenty of time to open the correct app, find the meeting link or access code, and restart that app or even my whole computer as many times as needed until it works. If the app offers a way to do it, I will test that my headset is working correctly.</p>



<p>Once I know I can connect to the meeting, I leave my desk. That’s right, I walk away and leave the camera pointed at my empty chair. Why do I do this? Well, I still want to take care of any physical needs before the meeting starts: use the bathroom, get a drink of water, eat a snack, etc. The video feed of my empty chair is there to assure <em>other</em> people that I will be participating in the meeting.</p>



<p>It’s disconcerting to join a videoconference and see no one else there. Doubts creep in: Do I have the right “room,&#8221; did everyone get the invitation, are they going to be here? Having everyone visible before the scheduled start — even just an empty chair — puts those fears to rest before they start.</p>



<p>Do not join the meeting without turning on your camera. That leaves everyone else in doubt —&nbsp;are you really there, or just your <a href="https://stuartsierra.com/2020/06/20/remote-201-profile-pictures">avatar</a>? If I say hello, will they hear? The empty chair is a clear indication, “I <em>will</em> be here, but I am not yet here.&#8221;</p>



<p>By <em>T</em>-minus-2 minutes, I’m back at my desk. The meeting should <em>not</em> start early, even if everyone is present. Instead, use this time as you would in an actual office — chat with your coworkers, talk about the weather, share stories of your kids/pets or your progress in <em>Animal Crossing</em>. This gives an opportunity to sort out any audio/video issues with less stress. It’s also acceptable to use this time to make some last-minute notes on the work you left before the meeting.</p>



<p>By time <em>T,</em> the scheduled start time of the meeting, everyone should be present, connected, visible, audible, and ready to begin. The meeting organizer should announce the start, briefly state the goals of the meeting, and move forward with the agenda. You <em>do</em> have an agenda, don’t you?</p>



<h2 class="wp-block-heading">The Elephant in the Zoom</h2>



<p>I should acknowledge, of course, that all these recommendations imply certain lifestyle advantages. As a solo consultant and software developer, I rarely have more than one meeting per day. I almost always have the least calendar-pressure of anyone in that meeting. “Start thinking about a meeting 10 minutes early&#8221; is easy for me to say, much harder for others to do.</p>



<p>But I remain convinced that organizations which encourage a back-to-back meeting schedule are chasing a mirage of productivity they will never reach. Their employees are constantly distracted, stressed, and operating at less than half their potential. They don’t have enough <a href="https://stuartsierra.com/2020/06/23/attention-bandwidth">attention bandwidth</a> for the number of topics thrown at them daily.</p>



<p>“Go faster&#8221; has been the default in business for decades. But sometimes the only way to really get somewhere is to <em>slow down.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Attention Bandwidth</title>
		<link>https://stuartsierra.com/2020/06/23/attention-bandwidth/</link>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Tue, 23 Jun 2020 14:48:20 +0000</pubDate>
				<category><![CDATA[Process]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[Office Technology]]></category>
		<category><![CDATA[remote]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1333</guid>

					<description><![CDATA[Why do we have meetings? Our computers and phones are loaded with dozens of communication apps. I’m far from the first to ask this question. I believe it’s well-established that different modes of communication have different information bandwidth. More information is conveyed by a face-to-face conversation than an email, for example. The conventional explanations for&#8230; <p><a class="moretag" href="https://stuartsierra.com/2020/06/23/attention-bandwidth/">Read the full article</a></p>]]></description>
										<content:encoded><![CDATA[
<p>Why do we have meetings?</p>



<p>Our computers and phones are loaded with dozens of communication apps.</p>



<div class="wp-block-image"><figure class="alignright size-large is-resized"><img decoding="async" src="https://stuartsierra.com/wp-content/uploads/2020/06/bernard-hermant-k4mEY-KBDnM-unsplash-1024x683.jpg" alt="" class="wp-image-1334" width="310" height="206"/><figcaption>Photo by <a href="https://unsplash.com/@bernardhermant?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Bernard Hermant</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure></div>



<p>I’m far from the first to ask this question. I believe it’s well-established that different modes of communication have different <em>information bandwidth</em>. More information is conveyed by a face-to-face conversation than an email, for example.</p>



<p>The conventional explanations for this are that A) text cannot convey tone, body language, or facial expressions; and B) people generally suck at writing.</p>



<p>But what if it’s less about how much information the speaker can convey, and more about how much the listener can <em>receive?</em> In other words, what if the bottleneck is not information bandwidth but rather <em>attention bandwidth?</em></p>



<p>As of this writing, my email inbox contains 61 messages. (Down from 14,000 after a recent archiving spree.) My chat app has 36 channels open across 8 organizations. My podcasts app has 5.5 hours of content queued. And I won’t even try to count the hundreds of notifications across social media, YouTube, and the <a href="https://www.merriam-webster.com/words-at-play/doomsurfing-doomscrolling-words-were-watching">infinite doom-scroll</a> of world news.</p>



<p>The only way to manage this information flood while retaining a semblance of sanity is to ration my attention. Email and chat, for example, get about 15 minutes every couple of hours. Social media gets a few minutes in the bathroom (which also sets an appropriate mental context).</p>



<p>So yes, that monthly all-hands meeting <em>could</em> be an email. That daily stand-up <em>could</em> be a chat message. But if it were, it would be competing with a hundred other attention-seeking missiles in the limited blocks of time I allocate to those channels. I would give it less attention, less time, less thought. I might ignore it completely.</p>



<p>I know I do better work when I can focus my full attention, uninterrupted, for several hours at a time. I expect this is true for most people, especially those doing any kind of creative work.</p>



<p>The purpose of a meeting, then, is not to convey information efficiently. It is to force an audience to pay <em>exclusive attention to one thing</em>, to get that creative focus pointed in a particular direction.</p>



<p>In the same physical space, our attention is constrained by social norms: It’s considered rude to look at your phone during a conversation or surf the web in a meeting. Remote-video meetings are challenging, in part, because the social norms of physical space conflict with the <a href="https://lindastone.net/about/continuous-partial-attention/">continuous partial attention</a> habits of virtual space.</p>



<p>Regrettably, in many organizations, a meeting is the <em>only</em> way to obtain someone’s full attention, especially managers or people with responsibilities to multiple groups. I don’t have a prescription to fix that: It’s a deep problem in organizations of all types.</p>



<p>Hopefully, though, it helps just to acknowledge the problem. Ask yourself “Why have this meeting?&#8221; Acknowledge that the answer might be “To force people to listen to what I have to say.&#8221; But perhaps, in time, we can develop ways to ask others for their full attention — and give our full attention in return — without having to stake a claim to hour-long blocks of time.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Remote 201: Profile Pictures</title>
		<link>https://stuartsierra.com/2020/06/20/remote-201-profile-pictures/</link>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Sat, 20 Jun 2020 21:27:29 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Office Technology]]></category>
		<category><![CDATA[remote]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1322</guid>

					<description><![CDATA[Now that we’ve covered the basics of remote work — headsets, cables, and software — it’s time to think about some of the smaller, more subtle things we can do to ensure a good remote experience for everyone. Today, that’s profile pictures. Profiles are something I don’t think about often, if at all. Maybe I&#8230; <p><a class="moretag" href="https://stuartsierra.com/2020/06/20/remote-201-profile-pictures/">Read the full article</a></p>]]></description>
										<content:encoded><![CDATA[
<p>Now that we’ve covered the basics of remote work — <a href="https://stuartsierra.com/2020/03/06/remote-102-headsets">headsets</a>, <a href="https://stuartsierra.com/2020/03/03/remote-101-cables">cables</a>, and <a href="https://stuartsierra.com/2020/03/09/remote-103-software-real-time-collaboration">software</a> — it’s time to think about some of the smaller, more subtle things we can do to ensure a good remote experience for everyone. Today, that’s <strong>profile pictures</strong>.</p>



<span id="more-1322"></span>



<p>Profiles are something I don’t think about often, if at all. Maybe I enter a few details when I sign up for a new service, but then I rarely think about it again. I have one or two photos of myself that I don’t hate, and I use them for every account.</p>



<p>Most of my remote jobs have involved at least <em>some</em> in-person interaction, usually at the start of a new project. But recently, given <a href="https://www.cdc.gov/coronavirus/2019-nCoV/index.html">circumstances</a>, I’ve had gigs where I <em>never</em> meet my colleagues in-person.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" src="https://stuartsierra.com/wp-content/uploads/2020/06/chris-montgomery-smgTvepind4-unsplash-1024x768.jpg" alt="" class="wp-image-1324"/><figcaption>Photo by <a href="https://unsplash.com/@cwmonty?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Chris Montgomery</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure></div>



<p>This has changed how I think about profile pictures. For my colleagues on recent projects, my photo on various apps — chat, email, project-tracking — is the <em>way they see me most frequently.</em> There are still video calls, for sure, but that’s typically only a few hours per week, far less than the time we spend interacting in other apps.</p>



<p>In light of this, I’ve started taking more regular snapshots and updating my profile picture every couple of weeks. I shoot close up so that my face fills most of the frame, knowing it will be displayed at thumbnail size. I make a couple of tries for a decent angle, but I don’t sweat it too much because I know I’ll be replacing it soon.</p>



<p>Note that I’m only talking about <em>private</em> communication apps here. It’s perfectly reasonable to curate photos on your public or semi-public social media accounts. But the colleagues you work with every day deserve to see you as you are, just as they would if you worked together in a physical office.</p>



<p>If you are someone who, like me, has trouble identifying faces from still photographs, it is especially helpful when those photographs resemble their subjects as closely as possible. As a kindness to us facial-recognition-challenged folks, please update your picture any time you get a haircut, change your hair color, or otherwise alter your appearance.</p>



<p>Related notes: Don’t include anyone else in your profile photo, such as your spouse or children. We want to see your work self, not your anniversary-vacation-at-Disney self. Don’t use a photo of your pet. Don’t wear a Halloween mask (you know who you are). And absolutely do not use an image that isn’t a photograph of you.</p>



<p>Why so much concern over something as tiny as a thumbnail picture? Because it’s <em>all about the tiny things.</em> Remote communication is hard. Anything we can do to make our coworkers feel even 1% more connected is worth the effort.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Podcast Updates</title>
		<link>https://stuartsierra.com/2020/05/22/podcast-updates/</link>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Fri, 22 May 2020 13:27:40 +0000</pubDate>
				<category><![CDATA[Podcast]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1312</guid>

					<description><![CDATA[No Manifestos is still “on the air&#8221;! If you haven’t been following, here are some recent episodes to check out: Russ Olsen, author of Getting Clojure and Eloquent Ruby Jen Myers, software educator and public speaker Aisha Blake, founder of the musical tech conference &#60;title of conf> Or get the whole series in your podcasting&#8230; <p><a class="moretag" href="https://stuartsierra.com/2020/05/22/podcast-updates/">Read the full article</a></p>]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.nomanifestos.com/">No Manifestos</a> is still “on the air&#8221;!</p>



<p>If you haven’t been following, here are some recent episodes to check out:</p>



<ul class="wp-block-list"><li><a href="https://www.nomanifestos.com/episodes/8">Russ Olsen</a>, author of <em>Getting Clojure</em> and <em>Eloquent Ruby</em></li><li><a href="https://www.nomanifestos.com/episodes/12">Jen Myers</a>, software educator and public speaker</li><li><a href="http://Episode 10: Aisha Blake">Aisha Blake</a>, founder of the musical tech conference <em>&lt;title of conf></em></li></ul>



<p>Or get the whole series in your <a href="https://www.nomanifestos.com/subscribe">podcasting app of choice</a>.</p>



<p>I also announce new episodes on Twitter as <a href="https://twitter.com/nomanifestos">@nomanifestos</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Remote 103: Software</title>
		<link>https://stuartsierra.com/2020/03/09/remote-103-software-real-time-collaboration/</link>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Mon, 09 Mar 2020 13:22:32 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Office Technology]]></category>
		<category><![CDATA[remote]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1292</guid>

					<description><![CDATA[In the first two posts in this series, I talked about hardware: networking and headsets. I’ll come back to hardware eventually, but the next thing on the checklist is software. Again, I’m not going to recommend specific products here. What I will do is provide you with a set of criteria by which to evaluate&#8230; <p><a class="moretag" href="https://stuartsierra.com/2020/03/09/remote-103-software-real-time-collaboration/">Read the full article</a></p>]]></description>
										<content:encoded><![CDATA[
<p>In the first two posts in this series, I talked about hardware: <a href="https://stuartsierra.com/2020/03/03/remote-101-cables">networking</a> and <a href="https://stuartsierra.com/2020/03/06/remote-102-headsets">headsets</a>. I’ll come back to hardware eventually, but the next thing on the checklist is software.</p>



<span id="more-1292"></span>



<p>Again, I’m not going to recommend specific products here. What I will do is provide you with a set of criteria by which to evaluate products.</p>



<h2 class="wp-block-heading">Real-time Collaboration</h2>



<p>For pairs and small groups, the best remote approximation of an in-person meeting is a combination of <strong>real-time videoconferencing</strong> and a <strong>shared editable workspace</strong> to simulate a whiteboard. You will probably need multiple products, one for videoconferencing and several for different kinds of shared workspace.</p>



<p>For small groups to collaborate effectively, they need a shared workspace that all members can edit simultaneously. It is <strong>critical</strong> that all participants have <strong>equal access</strong> to the shared workspace, taking into account technical limitations such as screen size and network lag. This is where “screen sharing&#8221; tools break down, even if they support remote control: The owner of the “shared&#8221; screen has privileged access versus the other participants.</p>



<p>The ideal workspace will be located on a server roughly equidistant from all parties. There are a variety of solutions suitable for different audiences, from <a href="https://blog.cognitect.com/2010/09/02/remote-pairing.html">shared terminal sessions</a> to document-collaboration products, so the choice depends on the people involved and the type of thing they want to collaborate on.</p>



<p>The optimal <strong>size</strong> for a remote meeting, in my experience, is <strong>3 participants or fewer.</strong> It’s just too hard to have a productive discussion with a larger group when facial expressions and body language are filtered through the limited quality of typical videoconferencing setups. Communication styles that work when everyone is in the same room, subconsciously aware of subtle changes in body language or breathing, break down when those cues are missing or muffled.</p>



<p>Even in an era where consumer-grade webcams can record video at 4K resolution, bandwidth and latency are still wildly inconsistent across the internet. It’s highly unlikely that <strong>any</strong> service will be able to stream the same video quality to everyone, and it only gets harder as you add more connections. The conduciveness to collaboration is constrained by the <strong>worst</strong> connection. Even if 8 out of 10 people have a great connection to a meeting, the poor experience had by the remaining 2 will drag down the overall quality.</p>



<p>This doesn’t mean that collaboration within larger groups is impossible to do remotely, it just requires different tools and approaches that I’ll cover in future posts. Stay tuned.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Remote 102: Headsets</title>
		<link>https://stuartsierra.com/2020/03/06/remote-102-headsets/</link>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Fri, 06 Mar 2020 18:53:31 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[remote]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1285</guid>

					<description><![CDATA[If you saw my last post, you’ve got your computer wired up. Time to get yourself wired up too. The next piece of hardware you need to be a successful remote worker is a headset with an adjustable microphone boom. Everyone has different preferences —&#160;weight, fit, padding, shape — so I’m not going to recommend&#8230; <p><a class="moretag" href="https://stuartsierra.com/2020/03/06/remote-102-headsets/">Read the full article</a></p>]]></description>
										<content:encoded><![CDATA[
<p>If you saw my last post, you’ve got your <a href="https://stuartsierra.com/2020/03/03/remote-101-cables">computer wired</a> up. Time to get yourself wired up too. The next piece of hardware you need to be a successful remote worker is a <strong>headset with an adjustable microphone boom</strong>.</p>



<span id="more-1285"></span>



<p>Everyone has different preferences —&nbsp;weight, fit, padding, shape — so I’m not going to recommend any specific brand or model, only suggest that you invest in a good-quality product. You don’t need to spend hundreds of dollars, but I wouldn’t bother with anything under US$ 60. Try to find one with some built-in noise-cancellation. Comfort is a factor too, since you may be wearing this for hours at a time. I had to try several different sets before settling on one I liked.</p>



<p>The following are <strong>not</strong> adequate substitutes:</p>



<ul class="wp-block-list"><li>Airpod-style earbuds: the microphone is too far away to pick up speech clearly without background noise, and the batteries die at inconvenient times</li><li>Headphones with a microphone hanging from the cable: the microphone is poorly-positioned for good voice pickup and often creates noise when it brushes against clothing</li><li>Bluetooth anything: Bluetooth itself is unreliable, and the audio quality on most Bluetooth microphones is poor</li></ul>



<p>Microphones built in to monitors or webcams are the <strong>worst</strong>. They pick up all the noise in the room: typing, tapping pencils, squeaky chairs, your cat.</p>



<p>Finally, laptop built-ins are the worst of all, because the speakers and microphone are, by necessity, near one another. The sound from the speakers gets picked up by the microphone, creating a distracting echo. If you don’t have access to a headset, at least put on headphones to spare your interlocutors the sound of their own voice on a half-second delay.</p>



<p><strong>[Added] </strong>Dedicated “conference call&#8221; units combining a microphone and speaker may be slightly better at avoiding speaker-to-mic echo, but the sound quality they deliver is just as bad as built-ins. Anything designed to pick up multiple voices in a room will, by design, pick up <strong>all</strong> the sound in the room. That includes ventilation, voices echoing off hard surfaces, and vibrations in the table itself. You don’t realize how loud these things are until you’re on the other end of a conference call in a noisy room. You might as well hold your meeting during a thunderstorm.</p>



<h2 class="wp-block-heading">How to Use a Headset</h2>



<p>Now you have a decent headset with an adjustable microphone. How do you adjust it?</p>



<p>A common mistake is to position the microphone directly in front of your mouth. That creates unpleasant “breathing noise&#8221; and distorts the sound of your voice.</p>



<p>The ideal position for a microphone is <strong>close</strong> to your mouth, but not so close that it is affected by the stream of air coming out when you speak. To feel what I mean, hold a finger in front of your mouth while you speak the sentence, “Podcast performance provides poor perennial profits.&#8221; Feel that? If your microphone is in that stream, every <em>p</em> sound is like the thump of a helicopter’s rotors to your listeners.</p>



<p>The most common recommendation I’ve seen is this: Place the microphone head about 1 inch (2.5 cm) from the <strong>corner</strong> of your mouth, slightly <strong>below</strong> your bottom lip.</p>



<p>I tried to draw this, but given my (lack of) drawing skills the results were more disturbing than helpful. </p>



<p>Once you have your microphone in place, don’t touch it! Make sure it is not in contact with your skin or facial hair. Keep it clear of your clothing, hair, and jewelry as you move around. The tiniest brush against a zipper or collar sounds like an avalanche for the listener.</p>



<p>If you read this and the <a href="https://stuartsierra.com/2020/03/03/remote-101-cables">previous article</a> (and acted on them) then congratulations! You’re already ahead of most other organizations trying to “do remote.&#8221; I hope to continue this series with more recommendations based on my 15 years of experience as a part- or full-time remote employee, so stay tuned.</p>



<p><strong>[Added March 11]</strong> The one exception to my headsets-only rule is if you’re willing to shell out several hundred dollars for a studio-grade microphone with a pop filter. Even then, you should be wearing headphones to prevent echo from other participants.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Remote 101: Cables</title>
		<link>https://stuartsierra.com/2020/03/03/remote-101-cables/</link>
		
		<dc:creator><![CDATA[Stuart Sierra]]></dc:creator>
		<pubDate>Tue, 03 Mar 2020 23:04:36 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[remote]]></category>
		<guid isPermaLink="false">https://stuartsierra.com/?p=1282</guid>

					<description><![CDATA[So you want to work remote. Or you want other people to be remote. You want space. Perspective. Distance. Escape the corporate cubicle farm and work in your pajamas. First, you need to get some network cables. Wi-Fi is terrible. No, really, it is. “But my super-duper Wi-Fi router can do 200 zottabits per second!&#8221;&#8230; <p><a class="moretag" href="https://stuartsierra.com/2020/03/03/remote-101-cables/">Read the full article</a></p>]]></description>
										<content:encoded><![CDATA[
<p>So you want to work remote. Or you want other people to be remote. You want space. Perspective. Distance. Escape the corporate cubicle farm and work in your pajamas.</p>



<p>First, you need to get some network cables.</p>



<span id="more-1282"></span>



<p>Wi-Fi is terrible. No, really, it is. “But my super-duper Wi-Fi router can do 200 zottabits per second!&#8221; you say. Nope, that’s <a href="https://en.wikipedia.org/wiki/Bandwidth_(computing)">bandwidth</a>, and while you need at least a <a href="https://support.skype.com/en/faq/FA1417/how-much-bandwidth-does-skype-need">minimum threshold</a> for audio/video, anything above that doesn’t matter. What matters are <a href="https://en.wikipedia.org/wiki/Latency_(engineering)#Packet-switched_networks">latency</a>, <a href="https://en.wikipedia.org/wiki/Packet_loss#Wireless_networks">packet loss</a>, and <a href="https://en.wikipedia.org/wiki/Jitter#Packet_jitter_in_computer_networks">jitter</a>. In less-technical terms, it’s about how quickly and reliably a network can deliver a single piece of data.</p>



<p>Wi-Fi, like nearly all wireless communication technology, sends electromagnetic waves through the air, where anything and everything can interfere with them — walls, furniture, appliances, you, your cat — not to mention every other Wi-Fi-capable device nearby.</p>



<p>As Wi-Fi has become more popular, the situation has gotten worse. Even if you live alone in a cabin in the woods, you probably have at least half a dozen devices connecting to your Wi-Fi network — computer, phone, media players, “smart&#8221; devices, <a href="https://www.wired.com/2014/08/how-to-use-your-cat-to-hack-your-neighbors-wi-fi/">your cat</a>. An apartment building or office might contain hundreds of devices, all <a href="https://en.wikipedia.org/wiki/Wi-Fi#Interference">interfering</a> with one another.</p>



<p>Modern Wi-Fi networks are designed to keep working in the presence of interference, and they do a pretty remarkable job of it. That’s why you can watch YouTube in one room while your spouse is surfing Reddit in another and neither of you notices anything wrong (other than the content on Reddit and YouTube).</p>



<p>But videoconferencing, unlike most web surfing, is “live&#8221; and in real time. Human senses can detect delays as short as a tenth of a second, sometimes much less. The brain adapts, which is why <a href="https://en.wikipedia.org/wiki/Latency_%28audio%29#Telephone_calls">telephones</a> work, but only up to a point. Beyond that point, conversation becomes difficult or impossible.</p>



<p>Gamers have known this for a while. A few milliseconds could mean the difference between life and (virtual) death. Steam’s <a href="https://support.steampowered.com/kb_article.php?ref=4950-EBNM-7843">first recommendation</a> for networking is wired. <em>PC Gamer</em> magazine <a href="https://www.pcgamer.com/heres-how-playing-on-wi-fi-hurts-your-game/">agrees</a>.</p>



<p>So get yourself some Ethernet cable (and adapter, if needed) and connect your computer directly to your home or office router. This is the single most effective thing you can do to improve your remote experience, especially if you’re in an apartment complex or office.</p>



<p>The next most effective thing you can do is get a headset, which I’ll cover in a future post.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
