<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ray Courtney on Medium]]></title>
        <description><![CDATA[Stories by Ray Courtney on Medium]]></description>
        <link>https://medium.com/@RAYRAY?source=rss-55055cec8f9c------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*Dof0fQMSbEA0HAoMzUdOEg.jpeg</url>
            <title>Stories by Ray Courtney on Medium</title>
            <link>https://medium.com/@RAYRAY?source=rss-55055cec8f9c------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 10:20:33 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@RAYRAY/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Building a Remote First Team]]></title>
            <link>https://medium.com/cionic-blog/building-a-remote-first-team-e270a45c6d5?source=rss-55055cec8f9c------2</link>
            <guid isPermaLink="false">https://medium.com/p/e270a45c6d5</guid>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[medtech]]></category>
            <category><![CDATA[work-from-home]]></category>
            <category><![CDATA[startup]]></category>
            <category><![CDATA[remote-work]]></category>
            <dc:creator><![CDATA[Ray Courtney]]></dc:creator>
            <pubDate>Tue, 03 Nov 2020 15:32:57 GMT</pubDate>
            <atom:updated>2020-11-03T15:32:57.838Z</atom:updated>
            <content:encoded><![CDATA[<h4>There’s no I in telecommute</h4><p>Two years ago, I became employee four at <a href="https://cionic.com/">Cionic</a>. At that point, the team was split between the Bay Area and two remote employees (I was the second). Telecommuting has been part of my career for the past two decades, but the remote experience has not always been great.</p><p>However, another long-running aspect of my career has been the desire to help people: starting out building internal tools at Oracle and Google, then choosing a smaller company focused on improving people’s health and lifestyle at Jawbone, and even becoming an elected public servant in my spare time. To me, Cionic was the ideal next step in my career evolution. Our technology has the potential to change our users’ physical abilities — this is more than improving health, this is life altering.</p><p>In choosing to join Cionic, the question for me was can I be effective on a team if I’m 3000 miles away. How can we build working relationships if we’re not in the same room every day? Cionic’s mission in our product is to transform the human experience, and our mission in our company is to transform the startup experience by taking a remote-first approach. I’m excited that I get to work on both.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TygFYvd4lpY4RiMVz8VFVQ.jpeg" /><figcaption>The team Google Meet is an ever present fixture of my home office (along with some homemade art).</figcaption></figure><h3>Identifying Your Strengths and Using Them</h3><p>A mentor once described the key to success in straightforward supply and demand terms: focus on improving the skills you possess that most of the people around you lack. In other words, find a high demand skill that is in short supply and corner the market.</p><p>I’m a good software engineer, and the cloud services available today make me exponentially better than I was at the beginning of my career. On any given day, I’m performing devops, database upgrades, API improvements, and modifying user interface. When I was fresh out of college, this work required at least four different engineers and usually they weren’t on the same team.</p><p>As effective as I have become at delivering software, I would not consider that my best skill. I am an extrovert, and I like to build relationships with my coworkers. If you’re gonna spend that much time with people, it’s better if you like each other, and that means getting to know one another. Focusing on these communication and relationship building skills while honing my craft as a software developer, I have gravitated to leadership and management roles. It’s why, as a software architect, I still spend a lot of my time focused on team dynamics.</p><blockquote><strong><em>Software engineering is successfully moving data from one machine to another.<br>Team building is successfully moving ideas from one person to another.</em></strong></blockquote><h3>The Future is Remote Work</h3><p><em>We give ourselves great flexibility with the expectation of high availability.</em></p><p>A few months ago, I added that line to one of our job descriptions, and I can think of three inspirations for it:</p><ol><li>Our remote first work culture has us spread across multiple time zones</li><li>All of our collaboration tools have apps that I regularly use on my phone</li><li>The Covid-19 pandemic has wreaked havoc on all of our schedules</li></ol><p>At first glance, this may sound like the destruction of work life harmony. However, it really reflects an agreement we have made with each other around balancing the requirements of a fast-paced startup and the distractions many of us must now face in our working lives.</p><p>When the Covid-19 shelter-in-place orders first came down, the transition for our team at Cionic was pretty seamless. Our communication was largely already happening in Slack or on Google Meet. Initially, the only difference was an increase in the size of the grid of faces on screen as all of the San Francisco-based team started using Google Meet from their home offices. Over time though, our coordinated efforts started to diverge. With the need to spend time accounting for new safety concerns or managing additional child care burdens on top of being geographically distributed, we could no longer expect normal working patterns.</p><p>Our solution wasn’t in a new application or piece of technology, but in creating meetings. Not meeting more, but meeting smarter in order to create synchronous time together:</p><ul><li>Working sessions instead of status updates</li><li>Prioritize recurring 1–1s to build stronger relationships</li><li>Virtual demo time/game nights/happy hours</li></ul><p>However, this Covid-era communication is still a work in progress. Videoconference fatigue is definitely a real thing, and being on camera full time brings a unique exhaustion. Our team tries to find ways to do more than just interact with a grid of faces. Here are some of the tools I recommend:</p><ul><li><a href="https://workspace.google.com/">GSuite/Google Workspace</a>: docs/sheets/slides to me are the best-in-class collaboration tools. If it’s not code, it’s going in one of these, and I’m inviting comments and suggested edits as soon as I have something worth looking at. I make a doc for every meeting and keep a running log of agenda items and notes that all attendees can see in real time.</li><li><a href="https://slack.com/">Slack</a>: email is dead; Slack killed it (the only emails I get now are from machines and vendors). Not only is Slack great for communication when a video chat is not feasible, it also integrates well with every other tool we use.</li><li><a href="https://www.mmhmm.app/">mmhmm</a>: converts my background from a static image to a dynamic presentation tool. I use it during meetings to collaborate on the same document without taking over the video with screenshare. I even use it during my heads down time by displaying my editor to invite collaboration with anyone who might be interested in the code I’m writing.</li><li><a href="https://www.mentimeter.com/">Mentimeter</a>: create interactive presentations, including quizzes, polls and word clouds. I’ve used this to passively engage with my colleagues on everything from Labor Day plans to quizzes on required training.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d9oE0tgVsV1DN2yn7WytFg.png" /><figcaption>Using Google Meet, mmhmm, and Mentimeter to generate the team’s Labor Day word cloud (and a quick safety PSA).</figcaption></figure><p>Employers are realizing they can save costs and expand their talent pool through remote work. As hybrid in-office and remote work models become the norm, we need to embrace new modes of collaboration and create alternatives for in-person communication and team building. At Cionic, I’m just as excited to break down the virtual barriers to communication as I am to break through the health barriers that prevent physical interaction for so many people.</p><p>If you have cool new communication and collaboration tools your team has adopted, I’d love to hear more in the comments.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e270a45c6d5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/cionic-blog/building-a-remote-first-team-e270a45c6d5">Building a Remote First Team</a> was originally published in <a href="https://medium.com/cionic-blog">CIONIC Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Commissioners, New Approach to Development]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-snippet">(Full disclosure: I worked on Andy Gavrin&#x2019;s 2017 campaign.)</p><p class="medium-feed-link"><a href="https://medium.com/@RAYRAY/new-commissioners-new-approach-to-development-2bd341f19508?source=rss-55055cec8f9c------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@RAYRAY/new-commissioners-new-approach-to-development-2bd341f19508?source=rss-55055cec8f9c------2</link>
            <guid isPermaLink="false">https://medium.com/p/2bd341f19508</guid>
            <category><![CDATA[urban-planning]]></category>
            <category><![CDATA[taxes]]></category>
            <category><![CDATA[local-government]]></category>
            <category><![CDATA[suburbs]]></category>
            <category><![CDATA[civic-engagement]]></category>
            <dc:creator><![CDATA[Ray Courtney]]></dc:creator>
            <pubDate>Thu, 03 May 2018 17:20:53 GMT</pubDate>
            <atom:updated>2018-05-03T17:55:24.346Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[CH3 — 8/24/2014]]></title>
            <link>https://medium.com/@RAYRAY/ch3-8-24-2014-e5d37fa4379b?source=rss-55055cec8f9c------2</link>
            <guid isPermaLink="false">https://medium.com/p/e5d37fa4379b</guid>
            <dc:creator><![CDATA[Ray Courtney]]></dc:creator>
            <pubDate>Mon, 25 Aug 2014 01:44:37 GMT</pubDate>
            <atom:updated>2014-08-25T01:44:37.253Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DFVRYQa7W450CR_7l_C9aA.jpeg" /><figcaption>Extreme Caz</figcaption></figure><p>$99 for PyCharm. Sold.</p><p>I’m all ready to start cranking on another fine day of CazHaxing, soI fire up my new favorite IDE, and it demands that I give it money. Sigh. I knew this day would come, and honestly PyCharm is totally worth $99. It’s just that well, I’m kind of cheap, so this is pretty momentous.</p><p>Little did I know that PyCharm would become essential in “solving” my how do I create the Flask app and SQLAlchemy db so that I’m not running unit tests in the live DB.</p><p>First off, I gotta thank <a href="https://github.com/ornj">Hurwitz</a> for pointing me to Flask’s <a href="http://flask.pocoo.org/docs/0.10/config/#configuring-from-files">config.from_object</a> usage pattern. That was the first step, which allowed me to sanely define my various configurations for dev and test.</p><p>Awesome, except I still can’t figure out how to specify the different configs import. There’s the obvious solution of just use a test Flask app for the unit tests except (EXCEPT!) how do I import the models and also tell them about the SQLAlchemy db object?</p><p>I banged my head against that wall until lunch, and it took about 30 seconds of our walk to get <a href="http://trulymedsf.com/">falafel</a> for Peacock to solve this for me. “Just use an environment variable to specify theconfig.”</p><p>Facepalm. It seems so easy now.</p><p>Now this is where PyCharm earns its license fee. At CH2, I figured out how to run unit tests in PyCharm but decided that I liked nose from the terminal better because the PyCharm UI wasn’t adding much. The RAY of three weeks ago was so naive. PyCharm lets me specify environment variables in my test configuration, so now I don’t have to deal with specifying in my shell (or through nose in some fashion which I couldn’t find).</p><p>This made my day, especially when PyCharm complained about the unittest module breaking PEP8. Hah. Maybe I should go back to my old ethos that style guides are pointless.</p><p>Here’s some code for future reference.</p><ol><li>Declaring the app and db in my top-level app:</li></ol><blockquote>app = flask.Flask(__name__, template_folder=’web/templates’)<br>app.config.from_object(os.getenv(‘FLASKCONFIG’, ‘config.default.Config’))<br>db = flask.ext.sqlalchemy.SQLAlchemy(app)</blockquote><p>2. Defining configs in config/default.py:</p><blockquote>class Config(object): …<br>class DevelopmentConfig(Config):<br>…<br>class TestConfig(Config):<br>…</blockquote><p>3. Grab the db from the app whenever you need it.</p><blockquote>import app<br>db = app.db</blockquote><p>I was also able to solve another mystery that had been plaguing me since CH1: how to create a unique index using the SQLAlchemy declarative syntax. No big aha moment here; just a shit-ton of googling until I finally figured out the right way to use __table_args__:</p><blockquote>__table_args__ = (db.UniqueConstraint(‘type’, ‘from_pid’, ‘to_pid’),)</blockquote><p>So simple and yet another reason to not always default to dunders = magic (i.e., don’t touch).</p><p>Alright, next time, I might actually build that UI (by which I mean an actual product to run on top of this wonderful infrastructure).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e5d37fa4379b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CazHax 2 — 8/3/2014]]></title>
            <link>https://medium.com/@RAYRAY/cazhax-2-8-3-2014-5f615db862a5?source=rss-55055cec8f9c------2</link>
            <guid isPermaLink="false">https://medium.com/p/5f615db862a5</guid>
            <dc:creator><![CDATA[Ray Courtney]]></dc:creator>
            <pubDate>Sun, 24 Aug 2014 18:46:36 GMT</pubDate>
            <atom:updated>2014-08-24T18:46:36.603Z</atom:updated>
            <content:encoded><![CDATA[<p>It wouldn’t be CazHax if we started on time.</p><p>In true CazHax form, we got rolling at roughly 11:30 and followed that up with a leisurely two hour lunch. There’s a reason the Caz comes before the Hax (that reason is grammar but the point still stands). Also, in true RAY form, I’m finishing this post at the beginning of CH3.</p><p>I dedicated myself to a bit of yak shaving for this CH:</p><ol><li>PyDocs — If you actually make the docstrings, trivially easy. Who knew? Except that the way I have set up Flask and SQLAlchemy causes a circular import that breaks PyDocs, which was really just foreshadowing for my later pains.</li><li>Sprint.ly and Github integration — Again trivially easy and pretty awesome. I’m a huge fan of sprint.ly. Every other agile tracker I’ve played with is either way too complicated (and thus painfully slow) or just ugly. There’s a lot to be said for making a tool pretty so that you actually want to use it.</li><li>Unit Tests and Nose—Now for something useful. Got unit tests running in PyCharm as well but decided that wasn’t all that great. Maybe when I need a debugger during the tests but for now, I much prefer nose from the command line. And hey, my tests always pass anyway. Always. Pass. Anyway.</li><li>User Creation UI — Oh yeah, I’m actually building something. Sweet all ready to go and fuuuuuu. My unit tests are actually running in the dev DB and not the test DB. Well, let me change around how I’m defining app and db and voila, still running in the wrong place. I don’t know if it’s just me, but this has now come up every time I’ve used Flask and SQLAlchemy together. The documentation (at least the quickstart) is way unclear on how to define these things. I also don’t really get the global context, which is probably why I keep screwing this up. So I mucked about for an hour and have made my app completely unuseable. Oh well, gotta have something to do for CH3.</li></ol><p>We finished off the day in our usual style. Destroyed Tokyo with 7d6 and drank about a gallon of Propel. Super Caz. Super Hax.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5f615db862a5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CazHax 1 — 7/13/2014]]></title>
            <link>https://medium.com/@RAYRAY/cazhax-1-7-13-2014-977f7abec133?source=rss-55055cec8f9c------2</link>
            <guid isPermaLink="false">https://medium.com/p/977f7abec133</guid>
            <dc:creator><![CDATA[Ray Courtney]]></dc:creator>
            <pubDate>Mon, 14 Jul 2014 00:38:04 GMT</pubDate>
            <atom:updated>2014-07-14T00:40:19.620Z</atom:updated>
            <content:encoded><![CDATA[<h4>First day of minimally-enforced, peer pressured programming</h4><p>I work in software, but I don’t get to write code very often. Basically, if I want to hack, it’s gotta be on my own time. My problem is that I lack the discipline to dedicate a day, an hour, even 15 minutes, to hacking on something when I’m on my own. I decided I should enlist my friends to provide a forcing function, and thus CazHax (Casual Hacking) was born.</p><p>We don’t have to work on the same thing. We don’t even have to write code. It’s just a commitment to working on something and it’s a mild commitment at that (today the World Cup trumped productivity somewhat).</p><p>I’m calling today a success because I actually wrote code on a project I’ve been thinking about for months now. It was nothing major, but it exists now.</p><p>Since I wanted to make a day of it, I decided I would also force myself to learn some new tools along the way:</p><ol><li>Pycharm instead of emacs</li><li>postgres instead of mysql</li><li>SQLAlchemy instead of hand-crafted SQL</li><li>Git operations in Pycharm instead of the command line</li></ol><p>Considering I worked within those 4 constraints, I’m not so bothered that it took me 6 hours to create a table and then another hour to write the methods to insert rows.</p><p>And what the hell, why not throw in a new blogging tool too? Checking “First Medium Post” off my to-do list.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=977f7abec133" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>